Open
Description
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.