Pyomo / pyomo

An object-oriented algebraic modeling language in Python for structured optimization problems.
https://www.pyomo.org
Other
1.95k stars 504 forks source link

Unit consistency issue with Pyomo DAE #1790

Open andrewlee94 opened 3 years ago

andrewlee94 commented 3 years ago

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.

bpaul4 commented 2 years ago

@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!

dallan-keylogic commented 4 months ago

Unfortunately, I have once again rediscovered this issue.

adam-a-a commented 3 weeks ago

We are started to incorporate dynamics in WaterTAP and this issue occurs while attempting to make our reverse osmosis model. In our tests, I threw in an assert_units_consistent before and after transformation, and this issue arises after transformation.

Here is the PR on WaterTAP: https://github.com/watertap-org/watertap/pull/1471