ModiaLang Documentation
ModiaLang is an environment in form of a Julia package to model and simulate physical systems (electrical, mechanical, thermo-dynamical, etc.) described by differential and algebraic equations. A user defines a model on a high level with model components (like a mechanical body, an electrical resistance, or a pipe) that are physically connected together. A model component is constructed by "expression = expression" equations. The defined model is symbolically processed (for example, equations might be analytically differentiated) with algorithms from package ModiaBase.jl. From the transformed model a Julia function is generated that is used to simulate the model with integrators from DifferentialEquations.jl. The basic type of the floating point variables is usually Float64
, but can be set to any type FloatType<:AbstractFloat
via @instantiateModel(..., FloatType = xxx)
, for example it can be set to Float32, DoubleFloat, Measurement{Float64}, StaticParticles{Float64,100}
.
Installation
ModiaLang is included in Modia and is available, when Modia was installed.
A standalone ModiaLang version is installed with:
julia> ]add ModiaLang
Furthermore, one or more of the following packages should be installed in order to be able to generate plots:
julia> ]add ModiaPlot_PyPlot # if plotting with PyPlot desired
add ModiaPlot_GLMakie # if plotting with GLMakie desired
add ModiaPlot_WGLMakie # if plotting with WGLMakie desired
add ModiaPlot_CairoMakie # if plotting with CairoMakie desired
Release Notes
Version 0.11.3
- @instantiateModel(..):
Var(hideResult=true)
is no longer ignored if present in a sub-component.
- simulate!(..): Unnecessary evaluation of the parameters dictionary is avoided (if merge = missing, nothing or has no elements).
Version 0.11.2
- Minor (efficiency) improvement if states are SVectors.
- Require ModiaBase 0.9.2 (to get rid of performance issues in Modia3D).
- Replace ustrip(..) with ustrip.(..) at some places to get rid of warnings.
Version 0.11.1
- Update of Manifest.toml file
- Require ModiaBase 0.9.1 (with updated Manifest.toml file)
Version 0.11.0
Non-backwards compatible changes
- Equations can only be defined with key
equations
and no other key.
- Parameter values in the code are now type cast to the type of the parameter value from the
@instantiatedModel(..)
call. The benefit is that access of parameter values in the code is type stable and operations with the parameter value are more efficient and at run-time no memory is allocated. Existing models can no longer be simulated, if parameter values provided viasimulate!(.., merge=xx)
are not type compatible to their definition. For example, an error is thrown if the @instantedModel(..) uses a Float64 value and thesimulate!(.., merge=xx)
uses aMeasurement{Float64}
value for the same parameter
Other changes
- Hierarchical names in function calls supported (e.g.
a.b.c.fc(..)
).
- Functions can return multiple values, e.g.
(tau1,tau2) = generalizedForces(derw1, derw2)
.
- Support for StaticArrays variables (the StaticArrays feature is kept in the generated AST). For an example, see
ModiaLang/test/TestArrays.jl
. - Support for Array variables (especially of state and tearing variables) where the dimension can change after
@instantiateModel(..)
. For examples, seeModiaLang/test/TestArrays.jl
andTestMultiReturningFunction10.jl
. - New keyword
Var(hideResult=true)
removes variable from the result (has no effect on states, derivative of states and parameters). For an example, seeModiaLang/test/TestMultiReturningFunction10.jl
- New feature of @instantiatedModel(..): If a Model(..) has key
:_buildFunction
, call this function to merge additional code to the model. For details see the docu of function buildSubModels! in ModiaLang.jl. For examples, seeModiaLang/test/TestMultiReturningFunction10.jl
and constructorModel3D(..)
inModia3D/src/ModiaInterface/model3D.jl
andModia3D/src/ModiaInterface/buildModia3D.jl
.
- Generalized connection semantics.
- Functions converting model to/from JSON:
modelToJSON(model)
,JSONtoModel(json_string)
simulate!(..):
- New option
logProgress=false
in functionsimulate!(..)
to print current simulation time every 5s (cpu-time). - If tolerance is too small, a warning is prented and it is automatically enlarged to a meaningful value (e.g. tolerance = 1e-8 is not useful if
FloatType=Float32
) - Logging improved: If log=true or logTiming=true, then timing, memory allocation and compilation time is reported for initialization (ths includes compilation of the generated getDerivatives(..) function). The remaining log shows cpu-time and memory allocation without initialization (and without the resources needed to compile getDerivatives(..)).
- Prefix messages of the timers with "ModiaLang" or "DifferentialEquations" to more clearly see the origin of a message in the timer log.
- New option
- Large speedup of symbolic transformation, if function depends on many input (and output) arguments (includes new operator
implicitDependency(..)
).
- Included DAE-Mode in solution of linear equation system (if DAE integrator is used and all unknowns of a linear equation system are part of the DAE states, solve the linear equation system during continuous integration via DAE solver (= usually large simulation speed-up, for larger linear equation systems)
Bug fixes
- If unitless=true, units in instantiatedModel.evaluatedParameters are removed.
- The unit macro is kept in the generated code and is no longer expanded. For example,
u"N"
, is kept in the code that is displayed withlogCode=true
(previously, this was expanded and the unit was displayed in the code asN
which is not correct Julia code). - Function
ModiaLang.firstInitialOfAllSegments(..)
now correctly returns true for the first call of the getDerivatives function during the simulation.
Version 0.10.2
- Minor (efficiency) improvement if states are SVectors.
- Require ModiaBase 0.9.2 (to get rid of performance issues in Modia3D).
- Replace ustrip(..) with ustrip.(..) at some places to get rid of warnings.
Version 0.10.1
- Update of Manifest.toml file
- Require ModiaBase 0.9.1 (with updated Manifest.toml file).
Version 0.10.0
- Require DifferentialEquations.jl version 7.
- Cleanup of using/export
- Cleanup of Project.toml/Manifest.toml.´
- @reexport using Unitful
- @reexport using DifferentialEquations
- Cleanup of test files (besides ModiaLang, no other package needed in the environment to run the tests).
- Change
SimulationModel{FloatType,ParType,EvaluatedParType,TimeType}
toSimulationModel{FloatType,TimeType}
Version 0.9.1
- New function plotPath to plot a PTP_path
- Replace ustrip(..) with ustrip.(..) at some places to get rid of warnings.
- Include time in error message, if simulation failed
Version 0.9.0
- Require Julia 1.7
- Upgrade Manifest.toml to version 2.0
- Update Project.toml/Manifest.toml
Version 0.8.7
- Packages used in test models, prefixed with ModiaLang. to avoid missing package errors.
- Deactivating test with DoubleFloats, since not in Project.toml
- Version/date updated
Version 0.8.6
- Require ModiaResult, version 0.3.9
- Project.toml/Manifest.toml updated
Version 0.8.5
- simulate!(..):
- Trigger an error, if simulation is not successful (retcode is neither :Default nor :Success nor :Terminate)
- Use RightRootFind for zero crossings (improves state events based on new DifferentialEquations option)
- New keyword argument requiredFinalStates_atol=0.0.
- Improve docu (e.g. add return argument solution).
- Show correct integrator name QBDF in simulation log (instead of QNDF)
- Raise an error, if (relative) tolerance is too small for FloatType
- Use FloatType for zero crossing hysteresis, instead of Float64
- If log=true print info about end of initialization.
- Support of MonteCarloMeasurements with units + new test model TestLinearEquationSystemWithUnitsAndMonteCarlo.jl
- Fixing and activating the deactivated test TestTwoInertiasAndIdealGearWithUnitsAndMonteCarlo.jl.
Version 0.8.4
- FloatType is included in the name space of Core.eval when evaluating parameters.
- Version and Date updated
- Included Version in printout of runtests.jl and runtests_withPlot.jl
- Print difference of finalStates and requiredFinalStates in case they do not match with the given tolerance.
Version 0.8.3
- Project.toml, Manifest.toml updated: Require newest version 0.7.7 of ModiaBase (containing a bug fix)
- Minor correction of simulate!(log=true) output
Version 0.8.2
- Issue with tearing fixed: Variables are only explicitly solved, if linear factor is a non-zero literal number (previously a division by zero could occur, if the linear factor became zero during simulation).
- Issue with unit of tearing variable fixed, if it is a derivative of a variable (previously, the generated code for unitless=false was wrong, if the tearing variable was a derivative, since the unit was not taken into account).
- simulate!(..):
- Support DAE integrators, especially IDA() from Sundials.
- New keyword
useRecursiveFactorizationUptoSize=0
: Linear equation systems A*v=b are solved with RecursiveFactorization.jl instead of the defaultlu!(..)
andldiv!(..)
, iflength(v) <= useRecursiveFactorizationUptoSize
. According toRecursiveFactorization.jl
docu, it is faster aslu!(..)
with OpenBLAS, forlength(v) <= 500
(typically, more as a factor of two). Since there had been some cases wherelu!(..)!
was successful, butRecursiveFactorization.jl
failed due to a singular system, the default is to uselu!(..)!
. - If log=true, sizes of linear equation systems are listed, as well as whether RecursiveFactorization.jl is used for the respective system.
- Test for RecursiveFactorization.jl added in TestTwoInertiasAndIdealGear.jl
- Some test models corrected (since leading to errors with the above changes).
- Updated Project.toml and Manifest.toml with newest versions of packages (including MonteCarloMeasurements, version >= 1) and improved Project.toml file to reduce issues with package constraints
Version 0.8.1
- Added a minimal documentation, including release notes.
- No message anymore, when ModiaLang is started.
- Fixed bug that
using ModiaResult
is needed, when calling@usingModiaPlot
.
Version 0.8.0
- Improved scalability by using OrderedDicts instead of named tuples for models, variables and parameter modifications.
- Speed improvements for structural and symbolic algorithms.
- Added support for state events, time events and synchronous operators.
- Added support for mixed linear equation systems having Real and Boolean unknowns.
- Added support for user-defined components defined by structs and functions (multibody modeling with Modia3D is based on this feature). This makes it possible to utilize algorithms specialized for a component.
- Added support for numerical and analytic linearization.
- Added support for propagation of parameters (e.g. deep in a model, the value of a parameter can be defined as a function of some top level parameter and this parameter is changed before simulation starts).
- New small model libraries Translational.jl and PathPlanning.jl added.
- Result storage changed:
sol = simulate!(...)
calls internallysol = solve(..)
from DifferentialEquations.jl.sol
contains time and the states at the communication time grid and at events. This is now kept in simulate(..), so the return value of simulate!(..) can be exactly used as ifsolve(..)
would have been used directly. - The plot(..) command now supports the following underlying plot packages: PyPlot, GLMakie, WGLMakie, and CairoMakie. It is also possible to select
NoPlot
, to ignoreplot(..)
calls orSilenNoPlot
to ignoreplot(..)
calls silently. The latter is useful forruntests.jl
. Note, often PyPlot is the best choice.
Changes that are not backwards compatible to version 0.7.x:
- Models are OrderedDicts and no longer NamedTuples.
- simulate!(..):
- If FloatType=Float64 and no algorithm is defined, then Sundials.CVODE_BDF() is used instead of the default algorithm of DifferentialEquations as in 0.7. The reason is that Modia models are usually large and expensive to evaluate and have often stiff parts, so that multi-step methods are often by far the best choice. CVODE_BDF() seems to be a good choice in many applications (another algorithm should be used, if there are many events, highly oscillatory vibrations, or if all states are non-stiff).
- The default value of
stopTime
is equal tostartTime
(which has a default value of 0.0 s), and is no longer 1.0 s.
- Plotting is defined slightly differently (
@useModiaPlot
, instead ofusing ModiaPlot
).
Version 0.7.3
- Evaluation and propagation of parameter expressions (also in simulate!(..., merge=Map(...))). Propagation of start/init values of states is not yet supported.
- State events supported.
Version 0.7.2
- Missing dependency of Test package added.
Version 0.7.1
- Variable constructor
Var(...)
introduced. For example:v = input | Var(init = 1.2u"m")
.
- Functions are called in the scope where macro
@instantiateModel
is called.
- New arguments of function
simulate!
:- Parameter and init/start values can be changed with argument
merge
. - A simulation can be checked with argument
requiredFinalStates
. - Argument
logParameters
lists the parameter and init/start values used for the simulation. - Argument
logStates
lists the states, init, and nominal values used for the simulation.
- Parameter and init/start values can be changed with argument
end
in array ranges is supported, for examplev[2:end]
.
- New (small) model library
Modia/models/HeatTransfer.jl
.
- Modia Tutorial improved.
- Functions docu improved.
Version 0.7.0
- Initial version, based on code developed for Modia 0.6 and ModiaMath 0.6.