| name | unit-converter |
| description | Convert flow rates, pressures, viscosities, and other engineering units |
| category | helpers |
| domain | general |
| complexity | basic |
| dependencies | ["pint"] |
Unit Converter Skill
A comprehensive unit conversion tool for engineering work using the Pint library. This skill handles common engineering unit conversions with dimensional analysis and consistency checking.
Overview of Pint Library
Pint is a Python library for working with physical quantities. It provides:
- Unit Registry: Central registry of units and their relationships
- Quantity Objects: Combines numerical values with units
- Automatic Conversion: Converts between compatible units
- Dimensional Analysis: Verifies dimensional consistency
- Custom Units: Allows definition of domain-specific units
- Context Management: Handles different unit systems (SI, Imperial, etc.)
Installation
pip install pint
Basic Usage
import pint
ureg = pint.UnitRegistry()
flow = 100 * ureg.liter / ureg.minute
flow_gpm = flow.to('gallon/minute')
print(f"{flow_gpm:.2f}")
Common Engineering Unit Conversions
Flow Rate Conversions
Flow rates are fundamental in fluid mechanics and process engineering.
Common Units:
- m³/s (cubic meters per second): SI standard
- m³/h (cubic meters per hour): Common in HVAC
- L/min (liters per minute): Small flow applications
- gpm (gallons per minute): US standard for liquid flow
- cfm (cubic feet per minute): US standard for gas flow
Conversion Examples:
flow = 500 * ureg.liter / ureg.minute
print(f"Flow: {flow.to('m^3/s'):.4f}")
print(f"Flow: {flow.to('m^3/hour'):.2f}")
print(f"Flow: {flow.to('gallon/minute'):.2f}")
air_flow = 1000 * ureg.cfm
print(f"Air flow: {air_flow.to('m^3/s'):.3f}")
print(f"Air flow: {air_flow.to('L/s'):.1f}")
Pressure Conversions
Pressure measurements vary widely across industries and regions.
Common Units:
- Pa (Pascal): SI base unit (N/m²)
- kPa (kiloPascal): Common engineering unit
- bar: Metric unit (100 kPa)
- psi (pounds per square inch): US standard
- mmHg (millimeters of mercury): Medical, vacuum
- atm (atmosphere): Standard atmospheric pressure
Conversion Examples:
pressure = 150 * ureg.bar
print(f"Pressure: {pressure.to('Pa'):.0f}")
print(f"Pressure: {pressure.to('kPa'):.0f}")
print(f"Pressure: {pressure.to('psi'):.1f}")
print(f"Pressure: {pressure.to('atm'):.1f}")
vacuum = 500 * ureg.mmHg
print(f"Vacuum: {vacuum.to('Pa'):.0f}")
print(f"Vacuum: {vacuum.to('kPa'):.2f}")
print(f"Vacuum: {vacuum.to('psi'):.2f}")
tire = 32 * ureg.psi
print(f"Tire: {tire.to('kPa'):.1f}")
print(f"Tire: {tire.to('bar'):.2f}")
Viscosity Conversions
Viscosity can be expressed as dynamic or kinematic viscosity.
Dynamic Viscosity:
- Pa·s (Pascal-second): SI unit
- cP (centipoise): Common in industry (1 cP = 1 mPa·s)
- P (Poise): CGS unit (1 P = 0.1 Pa·s)
Kinematic Viscosity:
- m²/s: SI unit
- cSt (centistokes): Common in industry
- St (Stokes): CGS unit
Conversion Examples:
viscosity_dynamic = 1.002 * ureg.centipoise
print(f"Dynamic: {viscosity_dynamic.to('Pa*s'):.6f}")
print(f"Dynamic: {viscosity_dynamic.to('poise'):.5f}")
oil_dynamic = 250 * ureg.centipoise
print(f"Oil: {oil_dynamic.to('Pa*s'):.3f}")
viscosity_kinematic = 1.004 * ureg.centistokes
print(f"Kinematic: {viscosity_kinematic.to('m^2/s'):.9f}")
print(f"Kinematic: {viscosity_kinematic.to('stokes'):.5f}")
oil_kinematic = 100 * ureg.centistokes
print(f"Oil SAE 30: {oil_kinematic.to('m^2/s'):.7f}")
Note on Viscosity Conversion:
To convert between dynamic and kinematic viscosity:
Kinematic Viscosity = Dynamic Viscosity / Density
ν (m²/s) = μ (Pa·s) / ρ (kg/m³)
Length Conversions
Common Units:
- m (meter): SI base unit
- mm (millimeter): Engineering drawings
- cm (centimeter): General measurements
- ft (foot): US standard
- in (inch): US manufacturing
Conversion Examples:
diameter = 4 * ureg.inch
print(f"Diameter: {diameter.to('mm'):.1f}")
print(f"Diameter: {diameter.to('m'):.4f}")
print(f"Diameter: {diameter.to('ft'):.3f}")
length = 15.5 * ureg.meter
print(f"Length: {length.to('ft'):.2f}")
print(f"Length: {length.to('inch'):.1f}")
thickness = 0.5 * ureg.mm
print(f"Thickness: {thickness.to('inch'):.4f}")
print(f"Thickness: {thickness.to('m'):.6f}")
Power Conversions
Common Units:
- W (Watt): SI unit
- kW (kilowatt): Common engineering unit
- HP (horsepower): Mechanical power (1 HP = 745.7 W)
- MW (megawatt): Large power systems
Conversion Examples:
motor = 50 * ureg.horsepower
print(f"Motor: {motor.to('kW'):.2f}")
print(f"Motor: {motor.to('W'):.0f}")
pump = 15 * ureg.kW
print(f"Pump: {pump.to('hp'):.2f}")
print(f"Pump: {pump.to('W'):.0f}")
generator = 2.5 * ureg.MW
print(f"Generator: {generator.to('kW'):.0f}")
print(f"Generator: {generator.to('hp'):.1f}")
Temperature Conversions
Common Units:
- K (Kelvin): SI base unit, absolute scale
- °C (Celsius): Metric, water freezes at 0°C
- °F (Fahrenheit): US standard, water freezes at 32°F
Conversion Examples:
temp_c = 85 * ureg.degC
print(f"Temperature: {temp_c.to('degF'):.1f}")
print(f"Temperature: {temp_c.to('kelvin'):.2f}")
temp_k = 77 * ureg.kelvin
print(f"LN2: {temp_k.to('degC'):.2f}")
print(f"LN2: {temp_k.to('degF'):.2f}")
temp_f = 72 * ureg.degF
print(f"Room: {temp_f.to('degC'):.1f}")
print(f"Room: {temp_f.to('kelvin'):.2f}")
Additional Engineering Units
Area:
area = 500 * ureg.meter**2
print(f"Area: {area.to('ft^2'):.1f}")
print(f"Area: {area.to('hectare'):.2f}")
pipe_area = 3.14 * ureg.inch**2
print(f"Pipe area: {pipe_area.to('cm^2'):.2f}")
Volume:
tank = 5000 * ureg.liter
print(f"Tank: {tank.to('m^3'):.1f}")
print(f"Tank: {tank.to('gallon'):.1f}")
print(f"Tank: {tank.to('ft^3'):.2f}")
Velocity:
velocity = 2.5 * ureg.meter / ureg.second
print(f"Velocity: {velocity.to('ft/s'):.2f}")
print(f"Velocity: {velocity.to('km/h'):.1f}")
print(f"Velocity: {velocity.to('mph'):.2f}")
Mass Flow:
mass_flow = 100 * ureg.kg / ureg.hour
print(f"Mass flow: {mass_flow.to('kg/s'):.5f}")
print(f"Mass flow: {mass_flow.to('lb/min'):.3f}")
Density:
density = 1000 * ureg.kg / ureg.meter**3
print(f"Density: {density.to('g/cm^3'):.1f}")
print(f"Density: {density.to('lb/ft^3'):.2f}")
Energy:
energy = 1000 * ureg.joule
print(f"Energy: {energy.to('kJ'):.1f}")
print(f"Energy: {energy.to('BTU'):.3f}")
print(f"Energy: {energy.to('kWh'):.6f}")
print(f"Energy: {energy.to('cal'):.1f}")
Dimensional Analysis
Dimensional analysis ensures that equations are dimensionally consistent.
Checking Dimensional Consistency
rho = 1000 * ureg.kg / ureg.m**3
v = 2 * ureg.m / ureg.s
D = 0.1 * ureg.m
mu = 0.001 * ureg.Pa * ureg.s
Re = (rho * v * D / mu).to_base_units()
print(f"Reynolds number: {Re:.0f}")
print(f"Dimensionality: {Re.dimensionality}")
Common Dimensional Relationships
mass = 10 * ureg.kg
accel = 9.81 * ureg.m / ureg.s**2
force = mass * accel
print(f"Force: {force.to('N'):.1f}")
print(f"Dimensionality: {force.dimensionality}")
force = 1000 * ureg.newton
area = 0.01 * ureg.m**2
pressure = force / area
print(f"Pressure: {pressure.to('kPa'):.0f}")
print(f"Dimensionality: {pressure.dimensionality}")
force = 500 * ureg.N
velocity = 10 * ureg.m / ureg.s
power = force * velocity
print(f"Power: {power.to('kW'):.1f}")
print(f"Dimensionality: {power.dimensionality}")
Unit Consistency Checking
Pint automatically checks unit consistency and raises errors for invalid operations.
Valid Operations
length1 = 10 * ureg.meter
length2 = 5 * ureg.feet
total_length = length1 + length2.to('meter')
print(f"Total: {total_length:.3f}")
area = (5 * ureg.meter) * (3 * ureg.meter)
print(f"Area: {area:.0f}")
velocity = (100 * ureg.meter) / (10 * ureg.second)
print(f"Velocity: {velocity:.0f}")
Invalid Operations (Will Raise Errors)
try:
result = (10 * ureg.meter) + (5 * ureg.second)
except pint.errors.DimensionalityError as e:
print(f"Error: Cannot add length and time")
try:
result = (10 * ureg.meter) > (5 * ureg.kg)
except pint.errors.DimensionalityError as e:
print(f"Error: Cannot compare length and mass")
Best Practices
-
Always specify units explicitly:
pressure = 150 * ureg.psi
pressure = 150
-
Use base units for calculations:
result = calculation().to_base_units()
-
Check dimensionality:
if result.dimensionality == ureg.pascal.dimensionality:
print("Result is a pressure")
-
Handle unit strings carefully:
try:
quantity = ureg.Quantity(value, unit_string)
except pint.errors.UndefinedUnitError:
print(f"Unknown unit: {unit_string}")
Using the converter.py Module
The included converter.py module provides convenient functions for common conversions:
from converter import (
convert_flow,
convert_pressure,
convert_viscosity_dynamic,
convert_length,
convert_power,
convert_temperature,
check_dimensional_consistency,
ureg
)
flow_gpm = convert_flow(100, 'L/min', 'gal/min')
print(f"Flow: {flow_gpm:.2f} gpm")
pressure_bar = convert_pressure(150, 'psi', 'bar')
print(f"Pressure: {pressure_bar:.2f} bar")
is_valid = check_dimensional_consistency('m/s', 'ft/min')
print(f"Can convert velocity: {is_valid}")
is_valid = check_dimensional_consistency('m', 'kg')
print(f"Can convert length to mass: {is_valid}")
Quick Reference
See the included quick reference table for common conversion factors and formulas.
Error Handling
Always wrap conversions in try-except blocks for production code:
try:
result = convert_pressure(150, 'psi', 'bar')
print(f"Pressure: {result:.2f} bar")
except pint.errors.UndefinedUnitError:
print("Unknown unit specified")
except pint.errors.DimensionalityError:
print("Units are not compatible")
except Exception as e:
print(f"Conversion error: {e}")
Tips for Engineering Applications
- Always document units in comments and variable names
- Use consistent unit systems within calculations
- Verify dimensional analysis for derived quantities
- Store values with units throughout calculations
- Only convert to display units at the end
- Use Pint's formatting for clear output
Resources