Program Listing for File DataLogger.cc#
↰ Return to documentation for file (doxygen_docs/GeneralKModels/DataLogger.cc)
#include "Karana/GeneralKModels/DataLogger.h"
#include "Karana/KCore/Allocator.h"
/**
* @file
* @brief DataLogger implementation.
*/
namespace Karana::Models {
namespace ku = Karana::KUtils;
namespace km = Karana::Math;
DataLogger::DataLogger(std::string_view name,
const kc::ks_ptr<kd::ModelManager> &mm,
const kc::ks_ptr<ku::H5Writer> &h5_writer)
: KModel<DataLogger, DataLoggerParams>(name, mm)
, _h5_writer(h5_writer) {
params = std::allocate_shared<DataLoggerParams>(kc::Allocator<DataLoggerParams>{},
std::format("{}_params", name));
};
kc::ks_ptr<DataLogger> DataLogger::create(std::string_view name,
const kc::ks_ptr<kd::ModelManager> &mm,
const kc::ks_ptr<ku::H5Writer> &h5_writer) {
kc::ks_ptr<DataLogger> dl =
std::allocate_shared<DataLogger>(kc::Allocator<DataLogger>{}, name, mm, h5_writer);
mm->registerModel(dl);
return dl;
}
void DataLogger::postModelStep(const km::Ktime &, const km::Vec &) { _h5_writer->log(); }
DataLoggerParams::DataLoggerParams(std::string_view name)
: KModelParams(name) {}
bool DataLoggerParams::isReady() const { return true; }
kc::ks_ptr<ku::H5Writer> DataLogger::getH5Writer() { return _h5_writer; }
void DataLogger::_registerModel() {
// Call the parent. This will do the normal registration.
KModel<DataLogger, DataLoggerParams>::_registerModel();
kc::ks_ptr<Base> dark = shared_from_this();
auto t = kc::static_pointer_cast<DataLogger>(dark);
// Also register a timed event now if we should log the first step.
kc::ks_ptr<kd::StatePropagator> sp =
kc::dynamic_pointer_cast<kd::StatePropagator>(model_manager);
if (sp and params->log_first_step) {
auto te = kd::TimedEvent::create(
std::format("{}_first_step", name()),
model_manager->getTime(),
[t](const km::Ktime &) { t->_h5_writer->log(); },
true);
sp->registerTimedEvent(te);
}
}
void DataLogger::_unregisterModel() {
// Call the parent. This will do the normal unregistration.
KModel<DataLogger, DataLoggerParams>::_unregisterModel();
// Try and unregister this event regardless of the parameter setting.
// It's possible the parameter has been changed since the last registration.
kc::ks_ptr<kd::StatePropagator> sp =
kc::dynamic_pointer_cast<kd::StatePropagator>(model_manager);
if (sp) {
sp->unregisterTimedEvent(std::format("{}_first_step", name()), true, true);
}
}
// Destructor included for MacOS builds. Must have a key-function out-of-line to avoid dulpicate
// symbols.
DataLogger::~DataLogger(){};
} // namespace Karana::Models