7#include "dpsim-models/Attribute.h"
10#include <dpsim-models/Logger.h>
11#include <dpsim/RealTimeDataLogger.h>
16RealTimeDataLogger::RealTimeDataLogger(std::filesystem::path &filename,
19 mCurrentRow(0), mCurrentAttribute(0), mAttributeData() {}
21RealTimeDataLogger::RealTimeDataLogger(std::filesystem::path &filename,
22 Real finalTime, Real timeStep)
24 mRowNumber((finalTime / timeStep + 0.5)), mCurrentRow(0),
25 mCurrentAttribute(0), mAttributeData() {}
27void RealTimeDataLogger::start() {
29 static_cast<double>(mRowNumber) * (mAttributes.size() + 1) *
sizeof(Real);
30 auto log = CPS::Logger::get(
"RealTimeDataLogger", CPS::Logger::Level::off,
31 CPS::Logger::Level::info);
32 log->info(
"Preallocating memory for real-time data logger: {} rows for {} "
34 mRowNumber, mAttributes.size(), mb_size / (1024 * 1024));
36 mAttributeData.resize(mRowNumber);
37 for (
auto &it : mAttributeData) {
39 it.resize(mAttributes.size() + 1);
43void RealTimeDataLogger::stop() {
45 std::ofstream(mFilename, std::ios_base::out | std::ios_base::trunc);
46 if (!mLogFile.is_open()) {
47 throw std::runtime_error(
"Cannot open log file " + mFilename.string());
50 mLogFile << std::right << std::setw(14) <<
"time";
51 for (
auto it : mAttributes)
52 mLogFile <<
", " << std::right << std::setw(13) << it.first;
55 for (
auto row : mAttributeData) {
56 mLogFile << std::scientific << std::right << std::setw(14) << row[0];
57 for (
size_t i = 1; i < row.size(); ++i)
58 mLogFile <<
", " << std::right << std::setw(13) << row[i];
64void RealTimeDataLogger::log(Real time, Int timeStepCount) {
65 mCurrentRow = timeStepCount;
66 if (timeStepCount < 0 ||
static_cast<size_t>(timeStepCount) >= mRowNumber) {
67 throw std::runtime_error(
68 "RealTimeDataLogger: timeStepCount out of bounds. Please verify the "
69 "logger was initialized correctly.");
71 if (mAttributeData.size() != mRowNumber ||
72 mAttributeData[mCurrentRow].size() != mAttributes.size() + 1) {
73 throw std::runtime_error(
74 "RealTimeDataLogger: Attribute data size mismatch");
76 mAttributeData[mCurrentRow][0] = time;
77 mCurrentAttribute = 1;
79 for (
auto it : mAttributes) {
80 if (it.second->getType() ==
typeid(Real)) {
81 mAttributeData[mCurrentRow][mCurrentAttribute++] =
82 **std::dynamic_pointer_cast<std::shared_ptr<CPS::Attribute<Real>>>(
84 }
else if (it.second->getType() ==
typeid(Int)) {
85 mAttributeData[mCurrentRow][mCurrentAttribute++] =
86 **std::dynamic_pointer_cast<std::shared_ptr<CPS::Attribute<Int>>>(
92void RealTimeDataLogger::Step::execute(Real time, Int timeStepCount) {
93 mLogger.log(time, timeStepCount);
96CPS::Task::Ptr RealTimeDataLogger::getTask() {
97 return std::make_shared<RealTimeDataLogger::Step>(*
this);