unit-converter

star 25

Convert flow rates, pressures, viscosities, and other engineering units

Soljourner By Soljourner schedule Updated 11/7/2025

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()

# Create a quantity
flow = 100 * ureg.liter / ureg.minute

# Convert to another unit
flow_gpm = flow.to('gallon/minute')
print(f"{flow_gpm:.2f}")  # Output: 26.42 gallon / minute

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:

# Water flow in a pipe
flow = 500 * ureg.liter / ureg.minute
print(f"Flow: {flow.to('m^3/s'):.4f}")        # 0.0083 m³/s
print(f"Flow: {flow.to('m^3/hour'):.2f}")     # 30.00 m³/h
print(f"Flow: {flow.to('gallon/minute'):.2f}") # 132.09 gpm

# Air flow in ventilation
air_flow = 1000 * ureg.cfm
print(f"Air flow: {air_flow.to('m^3/s'):.3f}") # 0.472 m³/s
print(f"Air flow: {air_flow.to('L/s'):.1f}")   # 471.9 L/s

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:

# Hydraulic system pressure
pressure = 150 * ureg.bar
print(f"Pressure: {pressure.to('Pa'):.0f}")     # 15000000 Pa
print(f"Pressure: {pressure.to('kPa'):.0f}")    # 15000 kPa
print(f"Pressure: {pressure.to('psi'):.1f}")    # 2176.0 psi
print(f"Pressure: {pressure.to('atm'):.1f}")    # 147.9 atm

# Vacuum measurement
vacuum = 500 * ureg.mmHg
print(f"Vacuum: {vacuum.to('Pa'):.0f}")         # 66661 Pa
print(f"Vacuum: {vacuum.to('kPa'):.2f}")        # 66.66 kPa
print(f"Vacuum: {vacuum.to('psi'):.2f}")        # 9.67 psi

# Tire pressure
tire = 32 * ureg.psi
print(f"Tire: {tire.to('kPa'):.1f}")            # 220.6 kPa
print(f"Tire: {tire.to('bar'):.2f}")            # 2.21 bar

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:

# Dynamic viscosity - Water at 20°C
viscosity_dynamic = 1.002 * ureg.centipoise
print(f"Dynamic: {viscosity_dynamic.to('Pa*s'):.6f}")  # 0.001002 Pa·s
print(f"Dynamic: {viscosity_dynamic.to('poise'):.5f}") # 0.01002 P

# Dynamic viscosity - Motor oil
oil_dynamic = 250 * ureg.centipoise
print(f"Oil: {oil_dynamic.to('Pa*s'):.3f}")            # 0.250 Pa·s

# Kinematic viscosity - Water at 20°C
viscosity_kinematic = 1.004 * ureg.centistokes
print(f"Kinematic: {viscosity_kinematic.to('m^2/s'):.9f}") # 0.000001004 m²/s
print(f"Kinematic: {viscosity_kinematic.to('stokes'):.5f}") # 0.01004 St

# Kinematic viscosity - Motor oil SAE 30
oil_kinematic = 100 * ureg.centistokes
print(f"Oil SAE 30: {oil_kinematic.to('m^2/s'):.7f}")  # 0.0000100 m²/s

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:

# Pipe diameter
diameter = 4 * ureg.inch
print(f"Diameter: {diameter.to('mm'):.1f}")     # 101.6 mm
print(f"Diameter: {diameter.to('m'):.4f}")      # 0.1016 m
print(f"Diameter: {diameter.to('ft'):.3f}")     # 0.333 ft

# Building dimensions
length = 15.5 * ureg.meter
print(f"Length: {length.to('ft'):.2f}")         # 50.85 ft
print(f"Length: {length.to('inch'):.1f}")       # 610.2 in

# Sheet thickness
thickness = 0.5 * ureg.mm
print(f"Thickness: {thickness.to('inch'):.4f}") # 0.0197 in
print(f"Thickness: {thickness.to('m'):.6f}")    # 0.000500 m

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 power
motor = 50 * ureg.horsepower
print(f"Motor: {motor.to('kW'):.2f}")           # 37.28 kW
print(f"Motor: {motor.to('W'):.0f}")            # 37285 W

# Pump power
pump = 15 * ureg.kW
print(f"Pump: {pump.to('hp'):.2f}")             # 20.11 hp
print(f"Pump: {pump.to('W'):.0f}")              # 15000 W

# Generator output
generator = 2.5 * ureg.MW
print(f"Generator: {generator.to('kW'):.0f}")   # 2500 kW
print(f"Generator: {generator.to('hp'):.1f}")   # 3352.0 hp

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:

# Process temperature
temp_c = 85 * ureg.degC
print(f"Temperature: {temp_c.to('degF'):.1f}")  # 185.0 °F
print(f"Temperature: {temp_c.to('kelvin'):.2f}") # 358.15 K

# Cryogenic temperature
temp_k = 77 * ureg.kelvin  # Liquid nitrogen
print(f"LN2: {temp_k.to('degC'):.2f}")          # -196.15 °C
print(f"LN2: {temp_k.to('degF'):.2f}")          # -321.07 °F

# Ambient temperature
temp_f = 72 * ureg.degF
print(f"Room: {temp_f.to('degC'):.1f}")         # 22.2 °C
print(f"Room: {temp_f.to('kelvin'):.2f}")       # 295.37 K

Additional Engineering Units

Area:

area = 500 * ureg.meter**2
print(f"Area: {area.to('ft^2'):.1f}")           # 5381.9 ft²
print(f"Area: {area.to('hectare'):.2f}")        # 0.05 ha

# Pipe cross-section
pipe_area = 3.14 * ureg.inch**2
print(f"Pipe area: {pipe_area.to('cm^2'):.2f}") # 20.26 cm²

Volume:

tank = 5000 * ureg.liter
print(f"Tank: {tank.to('m^3'):.1f}")            # 5.0 m³
print(f"Tank: {tank.to('gallon'):.1f}")         # 1320.9 gal
print(f"Tank: {tank.to('ft^3'):.2f}")           # 176.57 ft³

Velocity:

velocity = 2.5 * ureg.meter / ureg.second
print(f"Velocity: {velocity.to('ft/s'):.2f}")   # 8.20 ft/s
print(f"Velocity: {velocity.to('km/h'):.1f}")   # 9.0 km/h
print(f"Velocity: {velocity.to('mph'):.2f}")    # 5.59 mph

Mass Flow:

mass_flow = 100 * ureg.kg / ureg.hour
print(f"Mass flow: {mass_flow.to('kg/s'):.5f}") # 0.02778 kg/s
print(f"Mass flow: {mass_flow.to('lb/min'):.3f}") # 3.667 lb/min

Density:

density = 1000 * ureg.kg / ureg.meter**3
print(f"Density: {density.to('g/cm^3'):.1f}")   # 1.0 g/cm³
print(f"Density: {density.to('lb/ft^3'):.2f}")  # 62.43 lb/ft³

Energy:

energy = 1000 * ureg.joule
print(f"Energy: {energy.to('kJ'):.1f}")         # 1.0 kJ
print(f"Energy: {energy.to('BTU'):.3f}")        # 0.948 BTU
print(f"Energy: {energy.to('kWh'):.6f}")        # 0.000278 kWh
print(f"Energy: {energy.to('cal'):.1f}")        # 239.0 cal

Dimensional Analysis

Dimensional analysis ensures that equations are dimensionally consistent.

Checking Dimensional Consistency

# Reynolds number (dimensionless)
rho = 1000 * ureg.kg / ureg.m**3      # Density
v = 2 * ureg.m / ureg.s               # Velocity
D = 0.1 * ureg.m                       # Diameter
mu = 0.001 * ureg.Pa * ureg.s         # Dynamic viscosity

Re = (rho * v * D / mu).to_base_units()
print(f"Reynolds number: {Re:.0f}")    # Dimensionless: 200000

# Verify it's dimensionless
print(f"Dimensionality: {Re.dimensionality}")  # dimensionless

Common Dimensional Relationships

# Verify force = mass × acceleration
mass = 10 * ureg.kg
accel = 9.81 * ureg.m / ureg.s**2
force = mass * accel
print(f"Force: {force.to('N'):.1f}")   # 98.1 N
print(f"Dimensionality: {force.dimensionality}")  # [length] * [mass] / [time]^2

# Verify pressure = force / area
force = 1000 * ureg.newton
area = 0.01 * ureg.m**2
pressure = force / area
print(f"Pressure: {pressure.to('kPa'):.0f}")  # 100 kPa
print(f"Dimensionality: {pressure.dimensionality}")  # [mass] / ([length] * [time]^2)

# Verify power = force × velocity
force = 500 * ureg.N
velocity = 10 * ureg.m / ureg.s
power = force * velocity
print(f"Power: {power.to('kW'):.1f}")  # 5.0 kW
print(f"Dimensionality: {power.dimensionality}")  # [length]^2 * [mass] / [time]^3

Unit Consistency Checking

Pint automatically checks unit consistency and raises errors for invalid operations.

Valid Operations

# Adding compatible units
length1 = 10 * ureg.meter
length2 = 5 * ureg.feet
total_length = length1 + length2.to('meter')
print(f"Total: {total_length:.3f}")    # 11.524 m

# Multiplying different units
area = (5 * ureg.meter) * (3 * ureg.meter)
print(f"Area: {area:.0f}")             # 15 m²

# Dividing units
velocity = (100 * ureg.meter) / (10 * ureg.second)
print(f"Velocity: {velocity:.0f}")     # 10 m/s

Invalid Operations (Will Raise Errors)

# Cannot add incompatible units
try:
    result = (10 * ureg.meter) + (5 * ureg.second)
except pint.errors.DimensionalityError as e:
    print(f"Error: Cannot add length and time")

# Cannot compare incompatible units
try:
    result = (10 * ureg.meter) > (5 * ureg.kg)
except pint.errors.DimensionalityError as e:
    print(f"Error: Cannot compare length and mass")

Best Practices

  1. Always specify units explicitly:

    # Good
    pressure = 150 * ureg.psi
    
    # Bad - units unclear
    pressure = 150
    
  2. Use base units for calculations:

    # Convert to base units for complex calculations
    result = calculation().to_base_units()
    
  3. Check dimensionality:

    # Verify result is what you expect
    if result.dimensionality == ureg.pascal.dimensionality:
        print("Result is a pressure")
    
  4. Handle unit strings carefully:

    # Parse unit strings safely
    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
)

# Simple conversions
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")

# Check if operation is dimensionally valid
is_valid = check_dimensional_consistency('m/s', 'ft/min')
print(f"Can convert velocity: {is_valid}")  # True

is_valid = check_dimensional_consistency('m', 'kg')
print(f"Can convert length to mass: {is_valid}")  # False

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

  1. Always document units in comments and variable names
  2. Use consistent unit systems within calculations
  3. Verify dimensional analysis for derived quantities
  4. Store values with units throughout calculations
  5. Only convert to display units at the end
  6. Use Pint's formatting for clear output

Resources

Install via CLI
npx skills add https://github.com/Soljourner/claude-engineering-skills --skill unit-converter
Repository Details
star Stars 25
call_split Forks 8
navigation Branch main
article Path SKILL.md
More from Creator