pyomo icon indicating copy to clipboard operation
pyomo copied to clipboard

Unit consistency issue with Pyomo DAE

Open andrewlee94 opened this issue 4 years ago • 4 comments

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.

andrewlee94 avatar Jan 15 '21 14:01 andrewlee94

@blnicho have there been any updates regarding this issue? For flowsheets where units are assigned to both the DerivativeVar and the differentiated variable, the ContinuousSet can be assigned appropriate units in the discretization method. Thanks!

bpaul4 avatar Dec 07 '21 20:12 bpaul4

Unfortunately, I have once again rediscovered this issue.

dallan-keylogic avatar Apr 23 '24 19:04 dallan-keylogic