Program Listing for File SubhingeSpringDamper.cc

Program Listing for File SubhingeSpringDamper.cc#

Return to documentation for file (doxygen_docs/GeneralKModels/SubhingeSpringDamper.cc)

#include "Karana/GeneralKModels/SubhingeSpringDamper.h"
#include "Karana/KCore/Allocator.h"

/**
 * @file
 * @brief SubhingeSpringDamper implementation.
 */

namespace Karana::Models {

    namespace kd = Karana::Dynamics;

    SubhingeSpringDamper::SubhingeSpringDamper(std::string_view name,
                                               const kc::ks_ptr<kd::ModelManager> &mm,
                                               const kc::ks_ptr<kd::PhysicalSubhinge> &sh)
        : KModel<SubhingeSpringDamper, SubhingeSpringDamperParams>(name, mm)
        , _sh(sh) {
        params = std::allocate_shared<SubhingeSpringDamperParams>(
            kc::Allocator<SubhingeSpringDamperParams>{}, std::format("{}_params", name));
    };

    kc::ks_ptr<SubhingeSpringDamper>
    SubhingeSpringDamper::create(std::string_view name,
                                 const kc::ks_ptr<kd::ModelManager> &mm,
                                 const kc::ks_ptr<kd::PhysicalSubhinge> &sh) {
        kc::ks_ptr<SubhingeSpringDamper> ssd = std::allocate_shared<SubhingeSpringDamper>(
            kc::Allocator<SubhingeSpringDamper>{}, name, mm, sh);
        mm->registerModel(ssd);
        return ssd;
    }

    void SubhingeSpringDamper::preDeriv(const km::Ktime &, const km::Vec &) {
        _sh->setT(params->k * (params->setpoint - _sh->getQ()) - params->d * _sh->getU());
    }

    SubhingeSpringDamperParams::SubhingeSpringDamperParams(std::string_view name)
        : KModelParams(name) {
        setpoint.resize(1);
        km::makeNotReady(setpoint);
        k = km::notReadyNaN;
        d = km::notReadyNaN;
    }

    bool SubhingeSpringDamperParams::isReady() const {
        bool flag = true;
        if (km::isNotReadyNaN(k)) {
            kc::warn("Parameter k is not ready.");
            flag = false;
        }
        if (km::isNotReadyNaN(d)) {
            kc::warn("Parameter d is not ready.");
            flag = false;
        }
        if (not km::isReady(setpoint)) {
            kc::warn("Parameter setpoint is not ready.");
            flag = false;
        }
        return flag;
    }

    bool SubhingeSpringDamper::isReady() const {
        bool flag = true;
        if (_sh->nQ() != size_t(params->setpoint.size())) {
            kc::warn("The subhinge size {} is not equal to the setpoint size {}.",
                     _sh->nQ(),
                     params->setpoint.size());
            flag = false;
        }
        return flag;
    };

    // Destructor included for MacOS builds. Must have a key-function out-of-line to avoid dulpicate
    // symbols.
    SubhingeSpringDamper::~SubhingeSpringDamper(){};

} // namespace Karana::Models