11 #include <dpsim-models/Logger.h>
12 #include <dpsim/DataLogger.h>
14 using namespace DPsim;
16 DataLogger::DataLogger(Bool enabled) :
DataLoggerInterface(), mLogFile(), mEnabled(enabled), mDownsampling(1) { mLogFile.setstate(std::ios_base::badbit); }
18 DataLogger::DataLogger(String name, Bool enabled, UInt downsampling) :
DataLoggerInterface(), mName(name), mEnabled(enabled), mDownsampling(downsampling) {
22 mFilename = CPS::Logger::logDir() +
"/" + name +
".csv";
24 if (mFilename.has_parent_path() && !fs::exists(mFilename.parent_path()))
25 fs::create_directory(mFilename.parent_path());
28 void DataLogger::start() {
33 std::ofstream(mFilename, std::ios_base::out | std::ios_base::trunc);
34 if (!mLogFile.is_open()) {
36 std::cerr <<
"Cannot open log file " << mFilename << std::endl;
41 void DataLogger::stop() { mLogFile.close(); }
43 void DataLogger::setColumnNames(std::vector<String> names) {
44 if (mLogFile.tellp() == std::ofstream::pos_type(0)) {
45 mLogFile << std::right << std::setw(14) <<
"time";
46 for (
auto name : names) {
47 mLogFile <<
", " << std::right << std::setw(13) << name;
53 void DataLogger::logDataLine(Real time, Real data) {
57 mLogFile << std::scientific << std::right << std::setw(14) << time;
58 mLogFile <<
", " << std::right << std::setw(13) << data;
62 void DataLogger::logDataLine(Real time,
const Matrix &data) {
66 mLogFile << std::scientific << std::right << std::setw(14) << time;
67 for (Int i = 0; i < data.rows(); ++i) {
68 mLogFile <<
", " << std::right << std::setw(13) << data(i, 0);
73 void DataLogger::logDataLine(Real time,
const MatrixComp &data) {
76 mLogFile << std::scientific << std::right << std::setw(14) << time;
77 for (Int i = 0; i < data.rows(); ++i) {
78 mLogFile <<
", " << std::right << std::setw(13) << data(i, 0);
83 void DataLogger::logPhasorNodeValues(Real time,
const Matrix &data,
85 if (mLogFile.tellp() == std::ofstream::pos_type(0)) {
86 std::vector<String> names;
88 Int harmonicOffset = data.rows() / freqNum;
89 Int complexOffset = harmonicOffset / 2;
91 for (Int freq = 0; freq < freqNum; ++freq) {
92 for (Int node = 0; node < complexOffset; ++node) {
93 std::stringstream name;
94 name <<
"n" << std::setfill(
'0') << std::setw(5) << node <<
"f"
95 << std::setfill(
'0') << std::setw(2) << freq <<
".re";
96 names.push_back(name.str());
98 for (Int node = 0; node < complexOffset; ++node) {
99 std::stringstream name;
100 name <<
"n" << std::setfill(
'0') << std::setw(5) << node <<
"f"
101 << std::setfill(
'0') << std::setw(2) << freq <<
".im";
102 names.push_back(name.str());
105 setColumnNames(names);
107 logDataLine(time, data);
110 void DataLogger::logEMTNodeValues(Real time,
const Matrix &data) {
111 if (mLogFile.tellp() == std::ofstream::pos_type(0)) {
112 std::vector<String> names;
113 for (Int i = 0; i < data.rows(); ++i) {
114 std::stringstream name;
115 name <<
"node" << std::setfill(
'0') << std::setw(5) << i;
116 names.push_back(name.str());
118 setColumnNames(names);
120 logDataLine(time, data);
123 void DataLogger::log(Real time, Int timeStepCount) {
124 if (!mEnabled || !(timeStepCount % mDownsampling == 0))
127 if (mLogFile.tellp() == std::ofstream::pos_type(0)) {
128 mLogFile << std::right << std::setw(14) <<
"time";
129 for (
auto it : mAttributes)
130 mLogFile <<
", " << std::right << std::setw(13) << it.first;
134 mLogFile << std::scientific << std::right << std::setw(14) << time;
135 for (
auto it : mAttributes)
136 mLogFile <<
", " << std::right << std::setw(13) << it.second->toString();
140 void DataLogger::Step::execute(Real time, Int timeStepCount) { mLogger.log(time, timeStepCount); }
142 CPS::Task::Ptr DataLogger::getTask() {
143 return std::make_shared<DataLogger::Step>(*
this);