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