Skip to content

Unit consistency issue with Pyomo DAE #1790

Open
@andrewlee94

Description

@andrewlee94

When using pyomo.dae in a model with units, there is a potential issue with unit consistency as the ContinuousSet does not have units. Consider the following case:

from pyomo.environ import ConcreteModel, Var, TransformationFactory, units
from pyomo.dae import ContinuousSet, DerivativeVar
from pyomo.util.check_units import assert_units_consistent

m = ConcreteModel()

m.time = ContinuousSet(initialize=[0, 100])  # Implicit units of seconds

m.disp = Var(m.time, initialize=10, units=units.m, doc="Displacement")
m.vel = DerivativeVar(m.disp, wrt=m.time, units=units.m/units.s, initialize=1, doc="Velocity")

discretizer = TransformationFactory("dae.finite_difference")
discretizer.apply_to(m,  wrt=m.time, nfe=200, scheme="BACKWARD")

assert_units_consistent(m)

>>> InconsistentUnitsError: Error in units found in expression: vel[0.5] - 2.0*(disp[0.5] - disp[0]): meter / second not compatible with meter.

If the DerivativeVar is defined such that it has the correct units (m/s), there ends up being a unit consistency issue in the discretization equations as Pyomo does not realize that the time domain has units, thus the "delta_t" term in the discretization is unitless.

Whilst there are ways around this (e.g. using normalized domains), I think it would make more sense (and be more obvious to the user) if the ContinuousSet were to have units and the numerical discretization to account for this.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions