DPsim
Simulation.h
1 // SPDX-License-Identifier: Apache-2.0
2 
3 #pragma once
4 
5 #include "dpsim/MNASolverFactory.h"
6 #include <vector>
7 
8 #include <dpsim-models/Attribute.h>
9 #include <dpsim-models/Definitions.h>
10 #include <dpsim-models/Logger.h>
11 #include <dpsim-models/SimNode.h>
12 #include <dpsim-models/SystemTopology.h>
13 #include <dpsim/Config.h>
14 #include <dpsim/DataLogger.h>
15 #include <dpsim/Event.h>
16 #include <dpsim/Interface.h>
17 #include <dpsim/Scheduler.h>
18 #include <dpsim/Solver.h>
19 #include <nlohmann/json.hpp>
20 
21 #ifdef WITH_GRAPHVIZ
22 #include <dpsim-models/Graph.h>
23 #endif
24 
25 using json = nlohmann::json;
26 
27 namespace DPsim {
29 class CommandLineArgs;
30 
35 public:
36  typedef std::shared_ptr<Simulation> Ptr;
37 
46 
52 
57 
58 protected:
60  Real mTime = 0;
62  Int mTimeStepCount = 0;
67 
69  std::chrono::time_point<std::chrono::steady_clock> mSimulationStartTimePoint;
71  std::chrono::time_point<std::chrono::steady_clock> mSimulationEndTimePoint;
73  std::chrono::duration<double> mSimulationCalculationTime;
74 
75  // #### Logging ####
77  CPS::Logger::Level mLogLevel;
79  std::vector<Real> mStepTimes;
81  Bool mLogStepTimes = true;
82 
83  // #### Solver Settings ####
85  CPS::Domain mDomain = CPS::Domain::DP;
87  Solver::Type mSolverType = Solver::Type::MNA;
89  Solver::Behaviour mSolverBehaviour = Solver::Behaviour::Simulation;
91  Solver::List mSolvers;
93  DirectLinearSolverImpl mDirectImpl = DirectLinearSolverImpl::Undef;
95  DirectLinearSolverConfiguration mDirectLinearSolverConfiguration;
97  Bool mInitFromNodesAndTerminals = true;
100 
103  CPS::IdentifiedObject::List mTearComponents = CPS::IdentifiedObject::List();
109  Bool mFreqParallel = false;
111  Bool mInitialized = false;
112 
113  // #### Initialization ####
117  Real mSteadStIniAccLimit = 0.0001;
118 
119  // #### Task dependencies und scheduling ####
121  std::shared_ptr<Scheduler> mScheduler;
123  CPS::Task::List mTasks;
126 
128  std::vector<Interface::Ptr> mInterfaces;
129 
130  struct LoggerMapping {
132  DataLogger::Ptr logger;
135  };
136 
138  DataLoggerInterface::List mLoggers;
139 
141  void create();
143  template <typename VarType> void createSolvers();
145  template <typename VarType> void createMNASolver();
147  void prepSchedule();
148 
150  int mMaxIterations = 10;
151 
152 public:
154  CPS::Logger::Log mLog;
155 
157  Simulation(String name, CommandLineArgs &args);
158 
160  Simulation(String name,
161  CPS::Logger::Level logLevel = CPS::Logger::Level::info);
162 
164  virtual ~Simulation() {}
165 
166  // #### Simulation Settings ####
168  void setSystem(const CPS::SystemTopology &system) { mSystem = system; }
170  void setTimeStep(Real timeStep) { **mTimeStep = timeStep; }
172  void setFinalTime(Real finalTime) { **mFinalTime = finalTime; }
174  void setDomain(CPS::Domain domain = CPS::Domain::DP) { mDomain = domain; }
176  void setSolverType(Solver::Type solverType = Solver::Type::MNA) {
177  mSolverType = solverType;
178  }
180  void setSolverAndComponentBehaviour(Solver::Behaviour behaviour) {
181  mSolverBehaviour = behaviour;
182  }
184  void setDirectLinearSolverImplementation(DirectLinearSolverImpl directImpl) {
185  mDirectImpl = directImpl;
186  }
188  void setDirectLinearSolverConfiguration(
189  const DirectLinearSolverConfiguration &configuration) {
190  mDirectLinearSolverConfiguration = configuration;
191  }
193  void setMaxNumberOfIterations(int maxIterations) {
194  mMaxIterations = maxIterations;
195  }
197  void doInitFromNodesAndTerminals(Bool f = true) {
198  mInitFromNodesAndTerminals = f;
199  }
201  void doSplitSubnets(Bool splitSubnets = true) {
202  **mSplitSubnets = splitSubnets;
203  }
205  void setTearingComponents(CPS::IdentifiedObject::List tearComponents =
206  CPS::IdentifiedObject::List()) {
207  mTearComponents = tearComponents;
208  }
210  void setScheduler(const std::shared_ptr<Scheduler> &scheduler) {
211  mScheduler = scheduler;
212  }
214  void doFrequencyParallelization(Bool value) { mFreqParallel = value; }
216  void doSystemMatrixRecomputation(Bool value) {
218  }
221  void setLogStepTimes(Bool f) { mLogStepTimes = f; }
222 
223  // #### Initialization ####
225  void doSteadyStateInit(Bool f) { **mSteadyStateInit = f; }
230 
231  // #### Simulation Control ####
233  void initialize();
235  void start();
237  void stop();
239  Real next();
241  void run();
243  virtual Real step();
245  void sync() const;
247  void schedule();
248 
250  void addEvent(Event::Ptr e) { mEvents.addEvent(e); }
252  void addLogger(DataLoggerInterface::Ptr logger) { mLoggers.push_back(logger); }
254  void logStepTimes(String logName);
256  void checkForOverruns(String logName);
257 
259  void logLUTimes();
260 
262  void addInterface(Interface::Ptr eint) {
263  eint->setLogger(mLog);
264  mInterfaces.push_back(eint);
265  }
266 
267 #ifdef WITH_GRAPHVIZ
269  CPS::Graph::Graph dependencyGraph();
270 #endif
271 
272  // #### Getter ####
273  String name() const { return **mName; }
274  Real time() const { return mTime; }
275  Real finalTime() const { return **mFinalTime; }
276  Int timeStepCount() const { return mTimeStepCount; }
277  Real timeStep() const { return **mTimeStep; }
278  DataLogger::List &loggers() { return mLoggers; }
279  std::shared_ptr<Scheduler> scheduler() { return mScheduler; }
280  std::vector<Real> &stepTimes() { return mStepTimes; }
281 
282  // #### Set component attributes during simulation ####
284  // void setIdObjAttr(const String &comp, const String &attr, Real value);
285  // void setIdObjAttr(const String &comp, const String &attr, Complex value);
286 
287  // #### Get component attributes during simulation ####
288  CPS::AttributeBase::Ptr getIdObjAttribute(const String &comp,
289  const String &attr);
290 
291  void logIdObjAttribute(const String &comp, const String &attr);
293  void logAttribute(String name, CPS::AttributeBase::Ptr attr);
294 };
295 } // namespace DPsim
Base class of objects having attributes to access member variables.
Definition: AttributeList.h:20
std::unordered_map< CPS::Task::Ptr, std::deque< CPS::Task::Ptr > > Edges
Definition: Scheduler.h:31
The Simulation holds a SystemTopology and a Solver.
Definition: Simulation.h:34
void doFrequencyParallelization(Bool value)
Compute phasors of different frequencies in parallel.
Definition: Simulation.h:214
void setSteadStIniAccLimit(Real v)
set steady state initialization accuracy limit
Definition: Simulation.h:229
std::chrono::duration< double > mSimulationCalculationTime
Measured calculation time for simulation.
Definition: Simulation.h:73
void logLUTimes()
Write LU decomposition times measurements to log file.
Definition: Simulation.cpp:462
void sync() const
Synchronize simulation with remotes by exchanging intial state over interfaces.
Definition: Simulation.cpp:174
CPS::IdentifiedObject::List mTearComponents
Definition: Simulation.h:103
CPS::Logger::Level mLogLevel
Simulation log level.
Definition: Simulation.h:77
virtual Real step()
Solve system A * x = z for x and current time.
Definition: Simulation.cpp:409
Scheduler::Edges mTaskInEdges
Task dependencies as incoming / outgoing edges.
Definition: Simulation.h:125
const CPS::Attribute< Real >::Ptr mTimeStep
Simulation timestep.
Definition: Simulation.h:45
void setSteadStIniTimeLimit(Real v)
set steady state initialization time limit
Definition: Simulation.h:227
const CPS::Attribute< Bool >::Ptr mSteadyStateInit
Definition: Simulation.h:56
Real next()
Run until next time step.
Definition: Simulation.cpp:390
void logStepTimes(String logName)
Write step time measurements to log file.
Definition: Simulation.cpp:429
void addLogger(DataLoggerInterface::Ptr logger)
Add a new data logger.
Definition: Simulation.h:252
String mSolverPluginName
If there we use a solver plugin, this specifies its name (excluding .so)
Definition: Simulation.h:41
void initialize()
Create solver instances etc.
Definition: Simulation.cpp:63
void setScheduler(const std::shared_ptr< Scheduler > &scheduler)
Set the scheduling method.
Definition: Simulation.h:210
std::vector< Real > mStepTimes
(Real) time needed for the timesteps
Definition: Simulation.h:79
const CPS::Attribute< Real >::Ptr mFinalTime
Final time of the simulation.
Definition: Simulation.h:43
void prepSchedule()
Prepare schedule for simulation.
Definition: Simulation.cpp:186
void setSolverAndComponentBehaviour(Solver::Behaviour behaviour)
set solver and component to initialization or simulation behaviour
Definition: Simulation.h:180
Int mTimeStepCount
Number of step which have been executed for this simulation.
Definition: Simulation.h:62
Real mSteadStIniTimeLimit
steady state initialization time limit
Definition: Simulation.h:115
virtual ~Simulation()
Desctructor.
Definition: Simulation.h:164
CPS::Task::List mTasks
List of all tasks to be scheduled.
Definition: Simulation.h:123
const CPS::Attribute< Bool >::Ptr mSplitSubnets
Definition: Simulation.h:51
std::shared_ptr< Scheduler > mScheduler
Scheduler used for task scheduling.
Definition: Simulation.h:121
void setLogStepTimes(Bool f)
Definition: Simulation.h:221
std::vector< Interface::Ptr > mInterfaces
Vector of Interfaces.
Definition: Simulation.h:128
Bool mLogStepTimes
activate collection of step times
Definition: Simulation.h:81
void create()
Helper function for constructors.
Definition: Simulation.cpp:53
CPS::SystemTopology mSystem
System list.
Definition: Simulation.h:66
void checkForOverruns(String logName)
Check for overruns.
Definition: Simulation.cpp:447
Simulation(String name, CommandLineArgs &args)
Creates simulation with name and CommandLineArgs.
Definition: Simulation.cpp:41
CPS::AttributeBase::Ptr getIdObjAttribute(const String &comp, const String &attr)
CHECK: Can these be deleted? getIdObjAttribute + "**attr =" should suffice.
Definition: Simulation.cpp:468
void start()
Start simulation without advancing in time.
Definition: Simulation.cpp:338
EventQueue mEvents
The simulation event queue.
Definition: Simulation.h:64
void doSteadyStateInit(Bool f)
activate steady state initialization
Definition: Simulation.h:225
void addEvent(Event::Ptr e)
Schedule an event in the simulation.
Definition: Simulation.h:250
void schedule()
Create the schedule for the independent tasks.
Definition: Simulation.cpp:211
std::chrono::time_point< std::chrono::steady_clock > mSimulationStartTimePoint
Start time point to measure calculation time.
Definition: Simulation.h:69
Real mTime
Time variable that is incremented at every step.
Definition: Simulation.h:60
Bool mSystemMatrixRecomputation
Enable recomputation of system matrix during simulation.
Definition: Simulation.h:99
Real mSteadStIniAccLimit
steady state initialization accuracy limit
Definition: Simulation.h:117
void createMNASolver()
Subroutine for MNA only because there are many MNA options.
Definition: Simulation.cpp:129
void run()
Run simulation until total time is elapsed.
Definition: Simulation.cpp:399
void logAttribute(String name, CPS::AttributeBase::Ptr attr)
CHECK: Can we store the attribute name / UID intrinsically inside the attribute?
Definition: Simulation.cpp:496
DataLoggerInterface::List mLoggers
The data loggers.
Definition: Simulation.h:138
void createSolvers()
Create solvers depending on simulation settings.
Definition: Simulation.cpp:88
const CPS::Attribute< String >::Ptr mName
Simulation name.
Definition: Simulation.h:39
CPS::Logger::Log mLog
Simulation logger.
Definition: Simulation.h:154
void stop()
Stop simulation including scheduler and interfaces.
Definition: Simulation.cpp:370
std::chrono::time_point< std::chrono::steady_clock > mSimulationEndTimePoint
End time point to measure calculation time.
Definition: Simulation.h:71
UInt downsampling
Downsampling.
Definition: Simulation.h:134
DataLogger::Ptr logger
Simulation data logger.
Definition: Simulation.h:132