Program Listing for File DataLogger.cc

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