FMU based workflow
This tutorial covers setting up an experiment with the FMU based workflow.
This workflow requires the user to compile the model to a model executable before setting up an experiment for it. This workflow is useful when the user intends to do all the computations with the FMUs in a notebook environment(i.e., no experimentation/computation in the Modelon Impact server).
Note: Since the user works with the compiled FMUs in the workflow, modifiers added during the experimentation step should contain only non-structural parameter modifiers. Any structural parameter change would require a recompilation of the model.
Workflow
1.1 Compiling the model
The model can be compiled to an FMU for further analysis by calling the compile() method on the model.
The compile() method takes one mandatory argument (compiler_options) and seven optional ones (runtime_options, compiler_options, compiler_log_level,
fmi_target, fmi_version, platform, force_compilation).
We can fetch the default values for the mandatory compiler_options argument and the optional runtime_options from the
dynamic custom functions.:
compiler_options = dynamic.get_compiler_options()
runtime_options = dynamic.get_runtime_options()
To view the default compiler options, the dict() method can be called on it:
dict(compiler_options)
It is also possible to append/modify the default options either by calling the with_values() method on the
compiler_options class object:
compiler_options_modified = compiler_options.with_values(c_compiler='gcc')
or creating a dictionary of the options:
compiler_options_modified = {'c_compiler':'gcc'}
With the options now defined, we can pass them to the compile() method:
fmu = model.compile(compiler_options=compiler_options_modified,runtime_options=runtime_options).wait()
Note:
We have called the wait() method after the compile() method to ensure that the compilation process reaches completion.
If wait() is not called on the model an Operation object is returned and is_complete() can be used to check the status of the
compilation. Calling the wait() method returns a ModelExecutable object which represents the now compiled model.
1.2 Setting up an experiment
With the model now compiled as an FMU, we could use it to set up an experiment by defining a SimpleFMUExperimentDefinition
class with our analysis specific parametrization.
This could be done by either creating a SimpleFMUExperimentDefinition class by passing the FMU and the dynamic custom
function object:
from modelon.impact.client import SimpleFMUExperimentDefinition
experiment_definition = SimpleFMUExperimentDefinition(fmu, dynamic)
or in an even simpler way by calling the new_experiment_definition() method on the FMU with the dynamic custom function
object as an argument:
experiment_definition = fmu.new_experiment_definition(dynamic)
This would again return a SimpleFMUExperimentDefinition class object.
To override the default parameters for the dynamic simulation workflow, call the with_parameters()
method on the dynamic custom function class:
experiment_definition = fmu.new_experiment_definition(dynamic.with_parameters(start_time=0.0, final_time=2.0))
The default set of parameters available for the custom function can be viewed by calling the property parameter_values:
dynamic.parameter_values
The new_experiment_definition() method takes the optional arguments solver_options, simulation_options and
simulation_log_level. If the solver_options and simulation_options are not explicitly defined, they default to the dynamic
custom function defaults.
They can be set in a way similar to the compiler_options:
solver_options = {'atol':1e-8}
simulation_options = dynamic.get_simulation_options().with_values(ncp=500)
experiment_definition = fmu.new_experiment_definition(dynamic.with_parameters(start_time=0.0, final_time=2.0),
solver_options, simulation_options)