OMSimulatorLib
The OMSimulator project is a FMI-based co-simulation environment.
Loading...
Searching...
No Matches
SystemSC.h
Go to the documentation of this file.
1/*
2 * This file is part of OpenModelica.
3 *
4 * Copyright (c) 1998-2026, Open Source Modelica Consortium (OSMC),
5 * c/o Linköpings universitet, Department of Computer and Information Science,
6 * SE-58183 Linköping, Sweden.
7 *
8 * All rights reserved.
9 *
10 * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR
11 * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8.
12 * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES
13 * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL
14 * VERSION 3, ACCORDING TO RECIPIENTS CHOICE.
15 *
16 * The OpenModelica software and the OSMC (Open Source Modelica Consortium)
17 * Public License (OSMC-PL) are obtained from OSMC, either from the above
18 * address, from the URLs:
19 * http://www.openmodelica.org or
20 * https://github.com/OpenModelica/ or
21 * http://www.ida.liu.se/projects/OpenModelica,
22 * and in the OpenModelica distribution.
23 *
24 * GNU AGPL version 3 is obtained from:
25 * https://www.gnu.org/licenses/licenses.html#GPL
26 *
27 * This program is distributed WITHOUT ANY WARRANTY; without
28 * even the implied warranty of MERCHANTABILITY or FITNESS
29 * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH
30 * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL.
31 *
32 * See the full OSMC Public License conditions for more details.
33 *
34 */
35
36#ifndef _OMS_SYSTEM_SC_H_
37#define _OMS_SYSTEM_SC_H_
38
39#include "ComRef.h"
40#include "System.h"
41#include "OMSimulator/Types.h"
42
43#include <memory>
44
45#include <sundials/sundials_context.h> /* SUNContext */
46#include <sundials/sundials_logger.h> /* SUNLogger */
47#include <cvode/cvode.h> /* prototypes for CVODE fcts., consts. */
48#include <nvector/nvector_serial.h> /* serial N_Vector types, fcts., macros */
49#include <sunlinsol/sunlinsol_dense.h> /* Default dense linear solver */
50
51namespace oms
52{
53 class Model;
54 class ComponentFMUME;
55 class Component;
56 int cvode_rhs(sunrealtype t, N_Vector y, N_Vector ydot, void* user_data);
57 int cvode_rhs_algebraic(sunrealtype t, N_Vector y, N_Vector ydot, void* user_data);
58 int cvode_roots(sunrealtype t, N_Vector y, sunrealtype *gout, void* user_data);
59
60 class SystemSC : public System
61 {
62 public:
63 ~SystemSC();
64
66 oms_status_enu_t exportToSSD_SimulationInformation(pugi::xml_node& node) const;
67 oms_status_enu_t importFromSSD_SimulationInformation(const pugi::xml_node& node, const std::string& sspVersion);
68
69 oms_status_enu_t instantiate();
70 oms_status_enu_t initialize();
71 oms_status_enu_t terminate();
72 oms_status_enu_t reset();
73 oms_status_enu_t doStep();
74 oms_status_enu_t stepUntil(double stopTime);
75
76 oms_status_enu_t updateInputs(DirectedGraph& graph);
77
78 std::string getSolverName() const;
79 oms_status_enu_t setSolverMethod(std::string);
80
81 oms_status_enu_t setSolver(oms_solver_enu_t solver) {if (solver > oms_solver_sc_min && solver < oms_solver_sc_max) {solverMethod=solver; return oms_status_ok;} return oms_status_error;}
82
83 private:
84 oms_status_enu_t doStepEuler();
85 oms_status_enu_t doStepCVODE();
86
87 protected:
89
90 // stop the compiler generating methods copying the object
91 SystemSC(SystemSC const& copy);
92 SystemSC& operator=(SystemSC const& copy);
93
94 private:
95 std::vector<Component*> fmus; // use Component Base class to support FMI 2 ME and FMI 3 ME
96
97 // One entry per FMU, allocated by initialize() once fmus is filled.
98 std::unique_ptr<bool[]> callEventUpdate; //initialized with false
99 std::unique_ptr<bool[]> terminateSimulation; //initialized with false
100
101 std::vector<size_t> nStates;
102 std::vector<size_t> nEventIndicators;
103
104 std::vector<double*> states;
105 std::vector<double*> states_der;
106 std::vector<double*> states_nominal;
107 std::vector<double*> event_indicators;
108 std::vector<double*> event_indicators_prev;
109
110 bool algebraic = false;
111
113 {
114 };
115
117 {
118 SUNContext sunctx; /* SUNDIALS simulation context */
119 void *mem;
120 N_Vector y;
121 SUNLinearSolver linSol; /* linear solver object */
122 SUNMatrix J; /* Matrix used by linear solver */
123 N_Vector liny; /* Vector used by linear solver */
124 N_Vector abstol;
125 };
126
132
133 friend int oms::cvode_rhs(sunrealtype t, N_Vector y, N_Vector ydot, void* user_data);
134 friend int oms::cvode_rhs_algebraic(sunrealtype t, N_Vector y, N_Vector ydot, void* user_data);
135 friend int oms::cvode_roots(sunrealtype t, N_Vector y, sunrealtype *gout, void* user_data);
136 };
137}
138
139#endif
ComRef - component reference.
Definition ComRef.h:51
Definition DirectedGraph.h:71
Definition Model.h:57
Definition SystemSC.h:61
std::unique_ptr< bool[]> callEventUpdate
Definition SystemSC.h:98
oms_status_enu_t importFromSSD_SimulationInformation(const pugi::xml_node &node, const std::string &sspVersion)
Definition SystemSC.cpp:228
oms_status_enu_t setSolverMethod(std::string)
Definition SystemSC.cpp:195
oms_status_enu_t doStepEuler()
Definition SystemSC.cpp:632
std::vector< double * > event_indicators
Definition SystemSC.h:107
bool algebraic
Definition SystemSC.h:110
std::string getSolverName() const
Definition SystemSC.cpp:182
oms_status_enu_t terminate()
Definition SystemSC.cpp:482
static System * NewSystem(const oms::ComRef &cref, Model *parentModel, System *parentSystem)
Definition SystemSC.cpp:164
oms_status_enu_t reset()
Definition SystemSC.cpp:548
oms_status_enu_t setSolver(oms_solver_enu_t solver)
Definition SystemSC.h:81
oms_status_enu_t exportToSSD_SimulationInformation(pugi::xml_node &node) const
Definition SystemSC.cpp:207
union oms::SystemSC::SolverData_t solverData
~SystemSC()
Definition SystemSC.cpp:160
std::vector< double * > event_indicators_prev
Definition SystemSC.h:108
std::vector< size_t > nStates
Definition SystemSC.h:101
std::vector< Component * > fmus
Definition SystemSC.h:95
std::vector< double * > states
Definition SystemSC.h:104
SystemSC(SystemSC const &copy)
not implemented
SystemSC & operator=(SystemSC const &copy)
not implemented
std::unique_ptr< bool[]> terminateSimulation
Definition SystemSC.h:99
oms_status_enu_t doStepCVODE()
Definition SystemSC.cpp:855
oms_status_enu_t initialize()
Definition SystemSC.cpp:278
oms_status_enu_t instantiate()
Definition SystemSC.cpp:255
std::vector< double * > states_nominal
Definition SystemSC.h:106
oms_status_enu_t updateInputs(DirectedGraph &graph)
Definition SystemSC.cpp:1046
oms_status_enu_t stepUntil(double stopTime)
Definition SystemSC.cpp:1020
std::vector< double * > states_der
Definition SystemSC.h:105
oms_status_enu_t doStep()
Definition SystemSC.cpp:617
std::vector< size_t > nEventIndicators
Definition SystemSC.h:102
Definition System.h:66
ComRef cref
Definition System.h:232
oms_solver_enu_t solverMethod
Definition System.h:221
System * parentSystem
Definition System.h:235
Model * parentModel
Definition System.h:234
Definition AlgLoop.h:52
int cvode_rhs_algebraic(sunrealtype t, N_Vector y, N_Vector ydot, void *user_data)
Definition SystemSC.cpp:113
int cvode_rhs(sunrealtype t, N_Vector y, N_Vector ydot, void *user_data)
Definition SystemSC.cpp:65
int cvode_roots(sunrealtype t, N_Vector y, sunrealtype *gout, void *user_data)
Definition SystemSC.cpp:125
Definition SystemSC.h:117
SUNContext sunctx
Definition SystemSC.h:118
SUNMatrix J
Definition SystemSC.h:122
SUNLinearSolver linSol
Definition SystemSC.h:121
N_Vector y
Definition SystemSC.h:120
N_Vector abstol
Definition SystemSC.h:124
void * mem
Definition SystemSC.h:119
N_Vector liny
Definition SystemSC.h:123
Definition SystemSC.h:113
Definition SystemSC.h:128
SolverDataEuler_t euler
Definition SystemSC.h:129
SolverDataCVODE_t cvode
Definition SystemSC.h:130