Managing Physical Units

Managing Physical Units#

  • In GDM, all physical quantities are wrapped in pint objects (https://pypi.org/project/Pint/).

  • Users import physical quantities when building new models or updating model parameters.

    • Units are validated for all physical quantities.

    • All quantities are imported from gdm.quantities.

Creating Quantities#

from gdm.quantities import ReactivePower

power = ReactivePower(800, "kilovar")
print(power)
800 kilovar

The to method can be used for unit conversion

print(power.to("var"))
800000.0 var

The quantitiy models can be used with list and numpy arrays

powers = ReactivePower([400, 200, 100], "kilovar")
print(powers)
print(powers.to("var"))
[400 200 100] kilovar
[400000.0 200000.0 100000.0] var

Validation Limitations#

Warning

Unit validation does not occur until the quantity is added to a data model. In the example below, the rated_voltage object is built with incorrect units. It is only validated when we instantiate the DistributionBus component.

from gdm.distribution.enums import LimitType, Phase, VoltageTypes
from gdm.distribution.components import DistributionSubstation
from gdm.distribution.common.limitset import VoltageLimitSet
from gdm.distribution.components import DistributionFeeder
from gdm.distribution.components import DistributionBus
from gdm.quantities import Voltage
from infrasys import Location

rated_voltage = Voltage(400, "ampere")
try:
    bus = DistributionBus(
        voltage_type=VoltageTypes.LINE_TO_LINE,
        phases=[Phase.A, Phase.B, Phase.C],
        rated_voltage=rated_voltage,
        name="DistBus1",
        substation=DistributionSubstation.example(),
        feeder=DistributionFeeder.example(),
        voltagelimits=[
            VoltageLimitSet(limit_type=LimitType.MIN, value=Voltage(400 * 0.9, "volt")),
            VoltageLimitSet(limit_type=LimitType.MAX, value=Voltage(400 * 1.1, "volt")),
        ],
        coordinate=Location(x=20.0, y=30.0),
    )
except Exception as e:
    print(e)
1 validation error for DistributionBus
rated_voltage
  Assertion failed, Unit must be compatible with volt [type=assertion_error, input_value=<Quantity(400, 'ampere')>, input_type=Voltage]
    For further information visit https://errors.pydantic.dev/2.12/v/assertion_error