Skip to content

The Unit System

quantia uses a string-based unit expression parser that understands standard mathematical notation.

Writing unit expressions

import quantia as qu

qu.Q(9.81,  'm/s^2')          # acceleration
qu.Q(1.0,   'kg·m/s^2')       # newton (· or * for multiplication)
qu.Q(4.0,   'm^(1/2)')        # rational exponents
qu.Q(1.0,   'kg/m^2/s')       # chained division
qu.Q(100.0, 'psia')           # registered atomic symbol
qu.Q(1.0,   'm3')             # atomic alias for m^3

Unit compatibility

Two units are compatible when they reduce to the same SI base dimensions. quantia checks this automatically:

# Compatible — both reduce to m·s⁻¹
qu.Q(60.0, 'mph').to('m/s')
# UnitFloat(26.8224, 'm/s')

# Incompatible — pressure vs length
qu.Q(1.0, 'Pa') + qu.Q(1.0, 'm')   # → IncompatibleUnitsError
# IncompatibleUnitsError: Incompatible units: 'Pa' and 'm'

Compound units

Arithmetic between UnitFloat instances builds compound units:

force  = qu.Q(10.0, 'N')
area   = qu.Q(2.0,  'm^2')
stress = force / area           # UnitFloat(5.0, 'Pa')
                                # N/m² → Pa via alias

Registering custom units

from quantia import register
from quantia._registry import Unit

register('furlong', Unit('furlong', 'length', 'm', 201.168, 'furlong'))
qu.Q(8.0, 'furlong').to('km')   # UnitFloat(1.609344, 'km')

Registering custom tagged units

from quantia import register_tagged

register_tagged('Sm3_inj', 'm3', 'injection')   # injection water volumes
register_tagged('Sm3_prod', 'm3', 'produced')   # produced water volumes

inj  = qu.Q(1000.0, 'Sm3_inj')
prod = qu.Q(800.0,  'Sm3_prod')
net  = inj - prod   # → IncompatibleUnitsError — injection ≠ produced
net  = inj.to_si() - prod.to_si()   # UnitFloat(200.0, 'm^3')