Event handling: Difference between revisions

From ASCEND
Jump to navigation Jump to search
 
(11 intermediate revisions by 2 users not shown)
Line 24: Line 24:
* 'events': things that are executed exactly once, when first arriving at or on a boundary.
* 'events': things that are executed exactly once, when first arriving at or on a boundary.
* initial condition problems: there is no control over the equations used to reinitialise after a boundary. We just the the IDACalcIC built-in method.
* initial condition problems: there is no control over the equations used to reinitialise after a boundary. We just the the IDACalcIC built-in method.
* convenient derivative syntax, eg "der(x) = -x".
* [[improved DAE syntax|convenient derivative syntax]], eg "der(x) = -x".
* any means to convey boolean states back from an [[external relation]], meaning that it is difficult to trigger events based on the state of external code.


Instead, ASCEND allows only equations to be turned off and turned as the solver moves across the boundary. There is no way to trigger and special behaviour or action '''''at''''' the boundary. This means that currently, we can not implement a 'true' bouncing ball model, nor a thermostat model.
Instead, ASCEND allows only equations to be turned off and turned as the solver moves across the boundary. There is no way to trigger and special behaviour or action '''''at''''' the boundary. This means that currently, we can not implement a 'true' bouncing ball model, nor a thermostat model.
Line 30: Line 31:
=== Modelica implementation ===
=== Modelica implementation ===


The [http://www.modelica.org Modelica language] has some solutions to these problems that are worth consideration:
The [http://www.modelica.org Modelica language] has some solutions in their syntax documentation<ref>Modelica 3.2 Language Specification, 2010, http://modelica.org/documents/ModelicaSpec32.pdf</ref> to these problems that are worth consideration:


* ''when-clauses'' are executed at a boundary
* ''when-equations'' are executed at a boundary
** when-equation are not free-form equations, they are only allowed to be ''x = expr'' assignment statements
** <tt>when..elsewhen</tt> allows queuing/prioritisation of event handlers (queued cases are only allowed when the variables (x) being assigned match in all the nested when-equations
* ''initial equations'' are used to provide a initial condition problem to the solver (but we need to clarify if that only happens at the start of simulation, or at every boundary)
* ''initial equations'' are used to provide a initial condition problem to the solver (but we need to clarify if that only happens at the start of simulation, or at every boundary)
* ''pre(x)'' inside a when-clause returns the value of a simulation variable before the current boundary.
* ''pre(x)'' inside a when-clause returns the value of a simulation variable before the current boundary.
* ''reinit(x, expr)'' re-initialises a variable to a new value upon crossing a boundary
* ''reinit(x, expr)'' re-initialises a variable to a new value upon crossing a boundary
** using ''reinit'' forces Modelica to check that the variable 'x' is a ''state variable'' in the DAE simulation.
** ''reinit'' has the effect of setting variable 'x' to be unknown, and adding a new equation 'x = expr'.
**  a standard ''when-equation'' has the effect of simply adding a new ewquation 'x = expr', but not setting 'x' as unknown.
* various sub-expressions trigger boundaries to be 'emitted' from a relation, and added the the solver's boundary list.
* various sub-expressions trigger boundaries to be 'emitted' from a relation, and added the the solver's boundary list.
* ''noevent(...)'' allows suppression of triggered boundaries
* ''noevent(...)'' allows suppression of triggered boundaries
* ''smooth(...)'' forces the solver to treat expressions as continuously differentiable. we assume this is related to boundary suppression.
* ''smooth(...)'' forces the solver to treat expressions as continuously differentiable. we assume this is related to boundary suppression.
=== gPROMS solution ===
The thesis by Paul Barton<ref>P Barton, 1992. ''[http://yoric.mit.edu/sites/default/files/BartonThesis.pdf Modelling and simulation of combined discrete/continuous processes]'', PhD thesis, MIT.</ref> also has a solution for this problem.
=== Other implementations? ===
Some other possible implementations/solutions worth researching:
* MOSILAB webpage<ref>MOSILAB webpage, http://mosim.swt.tu-berlin.de/wiki/doku.php?id=projects:mosilab:home</ref> and paper<ref>J Bastian, C Clauß, O Enge-Rosenblatt and P Schneider, 2010. [http://publica.fraunhofer.de/eprints/urn:nbn:de:0011-n-1355711.pdf MOSILAB - a Modelica solver for multiphysics problems with structural variability], Proceedings of 1st Conference on Multiphysics Simulation - Advanced Methods for Industrial Engineering 2010.</ref>.
* A [http://en.wikipedia.org/wiki/List_of_discrete_event_simulation_software#Open_Source list of discrete event simulation software]


== Proposed solution ==
== Proposed solution ==


We don't know how we'll do it. Please give your thoughts on the '''discussion''' page.
We don't know how we'll do it. Please give your thoughts on the '''discussion''' page.
A decent explanation of the full design space is in Fishwick<ref>http://www.cee.mtu.edu/~amlan/ce5710/Readings/tax_sim.pdf</ref>
== References ==
<references/>
There are further references in [[integration of conditional models]]

Latest revision as of 16:30, 16 May 2012

This article is about planned development or proposed functionality. Comments welcome.

Please add discussion/feedback on the 'discussion' page, restrict this page to description of the problem or a proposed solution/implementation.

To successfully implement integration of conditional models is quickly becomes apparent that simple boundary detection is only a small part of the whole problem. In general, we need to allow for 'events' to occur when a boundary is encountered, for variables to be re-set using abitrary equations and/or expressions, and potentially for difficult initial condition problems to be solved before integration (DAE/ODE) simulation can proceed.

Use cases

Some use cases that we would like to be able to support. These are all continuous-time simulations. We're not looking at adding pure discrete-event simulation at this stage.

  • a bouncing ball that *instantly* reverses its velocity (or v(+) = -v(-) * 0.9, perhaps) when hitting the ground. Note that Leon's approach uses a springy floor, instead of the instant velocity reversal approach. Sometimes we don't want to have to add this extra physics to our simulation.
  • thermostat controller: a house has thermal losses, but a heat is attached. Heater turns on when temperature below 18 °C, and turns off when temperature rises above 20 °C. Plot the room temperature as a function of time.
  • solar house: in extension to above, add solar energy gain to the thermostat model. on some days, less heating input will be required.
  • a tank becoming full and starting to overflow
  • a flow rate controller that increments flow in fixed steps when certain thresholds are passed.
  • a vessel with an inlet in the side, and an outlet protruding into the pipe from above; if the level is above the outlet, liquid comes out; if the level is below, gas (or nothing) comes out. 'sliding mode' is when a system like this gets stuck on the boundary or oscilates rapidly across it. how do we deal with that? User:Kannan is our expert on this kind of system.
  • annual performance of a solar power plant, including rules like "wait half and hour after sunrise before starting the turbine" and "when storage is full, start dumping heat", using external weather data and demand data to drive the control-system part of the simulation.
  • reporting of model 'state' (boolean variables) alongside real variable outputs.

Implementation issues

ASCEND currently supports WHEN and CONDITIONAL statements, allowing for models with boundaries and boundary switching behaviour of a specific limited type. ASCEND lacks support for the following:

  • 'boundary equations', eg "when temperature = 20 °C, increase flowrate by 1 L/s", or "Vdot(+) = Vdot(-) + 1 {L/s}".
  • 'events': things that are executed exactly once, when first arriving at or on a boundary.
  • initial condition problems: there is no control over the equations used to reinitialise after a boundary. We just the the IDACalcIC built-in method.
  • convenient derivative syntax, eg "der(x) = -x".
  • any means to convey boolean states back from an external relation, meaning that it is difficult to trigger events based on the state of external code.

Instead, ASCEND allows only equations to be turned off and turned as the solver moves across the boundary. There is no way to trigger and special behaviour or action at the boundary. This means that currently, we can not implement a 'true' bouncing ball model, nor a thermostat model.

Modelica implementation

The Modelica language has some solutions in their syntax documentation[1] to these problems that are worth consideration:

  • when-equations are executed at a boundary
    • when-equation are not free-form equations, they are only allowed to be x = expr assignment statements
    • when..elsewhen allows queuing/prioritisation of event handlers (queued cases are only allowed when the variables (x) being assigned match in all the nested when-equations
  • initial equations are used to provide a initial condition problem to the solver (but we need to clarify if that only happens at the start of simulation, or at every boundary)
  • pre(x) inside a when-clause returns the value of a simulation variable before the current boundary.
  • reinit(x, expr) re-initialises a variable to a new value upon crossing a boundary
    • using reinit forces Modelica to check that the variable 'x' is a state variable in the DAE simulation.
    • reinit has the effect of setting variable 'x' to be unknown, and adding a new equation 'x = expr'.
    • a standard when-equation has the effect of simply adding a new ewquation 'x = expr', but not setting 'x' as unknown.
  • various sub-expressions trigger boundaries to be 'emitted' from a relation, and added the the solver's boundary list.
  • noevent(...) allows suppression of triggered boundaries
  • smooth(...) forces the solver to treat expressions as continuously differentiable. we assume this is related to boundary suppression.

gPROMS solution

The thesis by Paul Barton[2] also has a solution for this problem.

Other implementations?

Some other possible implementations/solutions worth researching:

Proposed solution

We don't know how we'll do it. Please give your thoughts on the discussion page.

A decent explanation of the full design space is in Fishwick[5]

References

  1. Modelica 3.2 Language Specification, 2010, http://modelica.org/documents/ModelicaSpec32.pdf
  2. P Barton, 1992. Modelling and simulation of combined discrete/continuous processes, PhD thesis, MIT.
  3. MOSILAB webpage, http://mosim.swt.tu-berlin.de/wiki/doku.php?id=projects:mosilab:home
  4. J Bastian, C Clauß, O Enge-Rosenblatt and P Schneider, 2010. MOSILAB - a Modelica solver for multiphysics problems with structural variability, Proceedings of 1st Conference on Multiphysics Simulation - Advanced Methods for Industrial Engineering 2010.
  5. http://www.cee.mtu.edu/~amlan/ce5710/Readings/tax_sim.pdf

There are further references in integration of conditional models