DPsim
RealTimeSimulation.cpp
1 /* Copyright 2017-2021 Institute for Automation of Complex Power Systems,
2  * EONERC, RWTH Aachen University
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
7  *********************************************************************************/
8 
9 #include <chrono>
10 #include <ctime>
11 #include <dpsim/RealTimeSimulation.h>
12 #include <iomanip>
13 
14 using namespace CPS;
15 using namespace DPsim;
16 
17 RealTimeSimulation::RealTimeSimulation(String name, CommandLineArgs &args)
18  : Simulation(name, args), mTimer(){};
19 
20 RealTimeSimulation::RealTimeSimulation(String name, Logger::Level logLevel)
21  : Simulation(name, logLevel), mTimer() {
22 
23  //addAttribute<Int >("overruns", nullptr, [=](){ return mTimer.overruns(); }, Flags::read);
24  //addAttribute<Int >("overruns", nullptr, nullptr, Flags::read);
25 }
26 
27 void RealTimeSimulation::run(const Timer::StartClock::duration &startIn) {
28  run(Timer::StartClock::now() + startIn);
29 }
30 
31 void RealTimeSimulation::run(const Timer::StartClock::time_point &startAt) {
32  if (!mInitialized)
33  initialize();
34 
35  for (auto lg : mLoggers)
36  lg->start();
37 
38  SPDLOG_LOGGER_INFO(mLog, "Opening interfaces.");
39 
40  for (auto intf : mInterfaces)
41  intf->open();
42 
43  sync();
44 
45  auto now_time = std::chrono::system_clock::to_time_t(startAt);
46  SPDLOG_LOGGER_INFO(mLog, "Starting simulation at {} (delta_T = {} seconds)",
47  std::put_time(std::localtime(&now_time), "%F %T"),
48  std::chrono::duration_cast<std::chrono::seconds>(
49  startAt - Timer::StartClock::now())
50  .count());
51 
52  mTimer.setStartTime(startAt);
53  mTimer.setInterval(**mTimeStep);
54  mTimer.start();
55 
56  // main loop
57  do {
58  mTimer.sleep();
59  step();
60 
61  if (mTimer.ticks() == 1)
62  SPDLOG_LOGGER_INFO(mLog, "Simulation started.");
63  } while (mTime < **mFinalTime);
64 
65  SPDLOG_LOGGER_INFO(mLog, "Simulation finished.");
66 
67  mScheduler->stop();
68 
69  for (auto intf : mInterfaces)
70  intf->close();
71 
72  for (auto lg : mLoggers)
73  lg->stop();
74 
75  mTimer.stop();
76 }
The Simulation holds a SystemTopology and a Solver.
Definition: Simulation.h:34
void sync() const
Synchronize simulation with remotes by exchanging intial state over interfaces.
Definition: Simulation.cpp:174
virtual Real step()
Solve system A * x = z for x and current time.
Definition: Simulation.cpp:409
const CPS::Attribute< Real >::Ptr mTimeStep
Simulation timestep.
Definition: Simulation.h:45
void initialize()
Create solver instances etc.
Definition: Simulation.cpp:63
const CPS::Attribute< Real >::Ptr mFinalTime
Final time of the simulation.
Definition: Simulation.h:43
std::shared_ptr< Scheduler > mScheduler
Scheduler used for task scheduling.
Definition: Simulation.h:121
std::vector< Interface::Ptr > mInterfaces
Vector of Interfaces.
Definition: Simulation.h:128
Real mTime
Time variable that is incremented at every step.
Definition: Simulation.h:60
void run()
Run simulation until total time is elapsed.
Definition: Simulation.cpp:399
DataLoggerInterface::List mLoggers
The data loggers.
Definition: Simulation.h:138
CPS::Logger::Log mLog
Simulation logger.
Definition: Simulation.h:154
void stop()
Stop real-time timer.
Definition: Timer.cpp:111
void sleep()
Suspend thread execution until next tick.
Definition: Timer.cpp:45