Solver — OpenModelica User's Guide v1.28.0-dev-323-g499f02e61cf documentation

# Solver

OMSimulator supports different solver methods depending on the FMI kind of the components in the system. Solvers are configured by name in the Simulation Setup dialog and assigned to individual FMU components.

## Available Solvers

Co-Simulation (CS) Solvers

Co-simulation solvers act as masters that drive the co-simulation protocol. They are used for FMUs that implement the co-simulation interface (CS FMUs).

Method | Description
--- | ---
`oms_ma` | Master Algorithm — fixed-step co-simulation master. The step size is controlled by the `fixedStepSize` setting.
`oms_mav` | Master Algorithm with Variable Step — variable-step co-simulation master. Uses `initialStepSize`, `minimumStepSize`, and `maximumStepSize` to control the step size, and `relativeTolerance` for error control.
`oms_mav2` | Master Algorithm with Variable Step (v2) — an improved variable-step co-simulation master with enhanced error estimation. Supports the same settings as `oms_mav`.

Model-Exchange (ME) Solvers

Model-exchange solvers are ODE integrators used for FMUs that implement the model-exchange interface (ME FMUs). They integrate the continuous-time equations provided by the FMU.

Method | Description
--- | ---
`cvode` | CVODE — variable-step, variable-order ODE solver from the SUNDIALS suite. Suitable for stiff and non-stiff systems. Supports `initialStepSize`, `minimumStepSize`, `maximumStepSize`, and `relativeTolerance`.
`euler` | Explicit Euler — simple fixed-step explicit Euler integrator. Suitable for non-stiff systems. Controlled by `fixedStepSize`.

## Solver Settings

The following settings can be configured for each named solver:

Setting | Applies to | Description
--- | --- | ---
`relativeTolerance` | `oms_mav`, `oms_mav2`, `cvode` | Relative error tolerance used for step-size control.
`fixedStepSize` | `oms_ma`, `euler` | The fixed communication / integration step size.
`initialStepSize` | `oms_mav`, `oms_mav2`, `cvode` | The initial step size at the start of simulation.
`minimumStepSize` | `oms_mav`, `oms_mav2`, `cvode` | The minimum allowed step size.
`maximumStepSize` | `oms_mav`, `oms_mav2`, `cvode` | The maximum allowed step size.

## Solver Assignment

Each FMU component in a system can be assigned one named solver configuration. The available solvers are filtered based on the FMI kind of the component:

- CS FMUs — only co-simulation solvers (`oms_ma`, `oms_mav`, `oms_mav2`) are available.

- ME FMUs — only model-exchange solvers (`cvode`, `euler`) are available.

- me+cs FMUs — all solvers are available.

If no solver is assigned to a component, the system default `oms_ma` is applied.

Example

The following example creates two named solver configurations — one using the fixed-step Euler method and one using the variable-step CVODE solver — and assigns them to individual components.

    from OMSimulator import SSP, CRef, Settings

    Settings.suppressPath = True

    model = SSP()

    # Add FMU resources
    model.addResource('../resources/Modelica.Blocks.Math.Add.fmu', new_name='resources/Add.fmu')
    model.addResource('../resources/Modelica.Blocks.Math.Gain.fmu', new_name='resources/Gain.fmu')

    # Instantiate components
    model.addComponent(CRef('default', 'Add1'), 'resources/Add.fmu')
    model.addComponent(CRef('default', 'Add2'), 'resources/Add.fmu')
    model.addComponent(CRef('default', 'Gain1'), 'resources/Gain.fmu')
    model.addComponent(CRef('default', 'Gain2'), 'resources/Gain.fmu')

    # Define solver configurations
    solver1 = {'name': 'solver1', 'method': 'euler', 'fixedStepSize': 1e-3}
    model.newSolver(solver1)

    solver2 = {'name': 'solver2', 'method': 'cvode', 'relativeTolerance': 1e-4,
               'initialStepSize': 1e-6, 'minimumStepSize': 1e-12, 'maximumStepSize': 0.001}
    model.newSolver(solver2)

    # Assign solvers to components
    model.setSolver(CRef('default', 'Add1'), 'solver1')
    model.setSolver(CRef('default', 'Add2'), 'solver2')
    model.setSolver(CRef('default', 'Gain1'), 'solver1')
    model.setSolver(CRef('default', 'Gain2'), 'solver2')