Flattening models to BaseModelica

BaseModelica

BaseModelica is an intermediate format to describe hybrid (continuous and discrete) systems with emphasis on defining the dynamic behavior of systems, rather than their structure. It is meant to become part of the Modelica standard, as a subset of the Modelica language that does not include object-oriented features such as lookup, instantiation, inheritance, connections, but rather gives a flat representation of a Modelica model which only contains variable declarations, function declarations, record declarations, equations, and initial equations.

The main aim of BaseModelica is to provide a much lower barrier of entry to the Modelica world, since writing a BaseModelica compiler or interpreter will be a much easier task than writing a full-fledged Modelica compiler.

BaseModelica is currently described by the MCP 0031 draft , and will eventually be incorporated in a future version of the Modelica Language Specification.

Converting Modelica models in BaseModelica with OpenModelica

The OpenModelica compiler front-end can flatten virtually 100% of Modelica models that are fully compliant with the Modelica Language Specification, converting them into a BaseModelica output. This provides a unique opportunity for organizations that want to enter the Modelica ecosystem, as they can delegate the heavy-lifting of flattening a Modelica model to the OpenModelica compiler (OMC), developing tools that only need to be able to parse and compile (or interpret) BaseModelica input.

Assume you have a package MyPackage contained in a file MyPackage.mo and you want to get the BaseModelica flattened code of model MyPackage.Examples.MyModel in the MyModel.mo file. From the command line, this is accomplished by typing

omc --BaseModelica -i=MyPackage.Examples.MyModel MyPackage.mo > MyModel.mo

If the package MyPackage is installed with the Package Manager, you can type

omc --BaseModelica -i=MyPackage.Examples.MyModel MyPackage > MyModel.mo

If you want to use OMEdit for that, you can load MyPackage, go to Tools | Options | Simulation, add --BaseModelica to the Additional Translation Flags input field, open MyModel and click on the Instantiate Model button, to get the BaseModelica flattened model in a separate window. Don't forget to remove --BaseModelica from the simulation options when you are done, otherwise regular simulations will be broken.

Array-preserving BaseModelica output

The OMC front-end can flatten models without scalarizing them, i.e., keeping arrays of variables together as first-class citizens and keeping array equations together via for loops. This feature is essential to manage models with large arrays efficiently.

From the command line, you can get array-preserving BaseModelica flat output by adding some extra debug flags to the previous command line, e.g.,

omc --BaseModelica -d=nonfScalarize,arrayConnect,combineSubscripts,evaluateAllParameters,vectorizeBindings -i=MyPackage.Examples.MyModel MyPackage > MyModel.mo

or by adding them to the Additional Translation Flags option in OMEdit.

Last, but not least, if you have a model with a large number of instances of the same class with the same modifier structure, the OMC front-end can automatically collect them into a single array, which can then be flattened efficiently without scalarization. To get that, replace the debug flags of the previous command line with

-d=nonfScalarize,mergeComponents,combineSubscripts,evaluateAllParameters,vectorizeBindings

In this case, you also get a MyModel_merged_table.json file in the working directory, which lists the correspondences between the original scalar component names and the elements of the automatically created arrays.