Program Listing for File PointMassGravity.cc

Program Listing for File PointMassGravity.cc#

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

#include"Karana/GeneralKModels/PointMassGravity.h"
#include"Karana/Frame/ChainedFrameToFrame.h"
#include"Karana/KCore/Allocator.h"
#include"Karana/SOADyn/Multibody.h"


namespaceKarana::Models{

namespacekd=Karana::Dynamics;
namespacekf=Karana::Frame;

PointMassGravity::PointMassGravity(std::string_viewname,
constkc::ks_ptr<kd::StatePropagator>&sp,
constkc::ks_ptr<kd::SubTree>&st,
constkc::ks_ptr<kf::Frame>&central_body)
:KModel<PointMassGravity,PointMassGravityParams>(name,sp)
,_st(st)
,_cb(central_body){
params=std::allocate_shared<PointMassGravityParams>(
kc::Allocator<PointMassGravityParams>{},std::format("{}_params",name));
};

kc::ks_ptr<PointMassGravity>
PointMassGravity::create(std::string_viewname,
constkc::ks_ptr<kd::StatePropagator>&sp,
constkc::ks_ptr<kd::SubTree>&st,
constkc::ks_ptr<kf::Frame>&central_body){
kc::ks_ptr<PointMassGravity>pmg=std::allocate_shared<PointMassGravity>(
kc::Allocator<PointMassGravity>{},name,sp,st,central_body);
sp->registerModel(pmg);
returnpmg;
}

voidPointMassGravity::preDeriv(constkm::Ktime&,constkm::Vec&){
//VectorfromthemultibodyCOMtothecentralbody,expressedintheinertialframe.
km::Vec3vec=_st->multibody()
->getNewtonianFrame()
->frameToFrame(_st->cmFrame())
->relTransform()
.getUnitQuaternion()*
_st->cmFrame()->frameToFrame(_cb)->relTransform().getTranslation();
doubledistance=vec.norm();
if(distance<1e-6){
throwstd::runtime_error("Gotadistance<1e-6betweenthemultibodycenterofmass"
"andcentralbodyofthegravitymodel.");
}
km::Vec3g=(params->mu/std::pow(distance,3))*vec;

//Accumulatethegravity.Expectsthevaluetobeintheinertialframe,sincenoref_frame
//isspecified.
_st->accumUniformGravAccel(g);
}

std::vector<kc::id_t>PointMassGravity::getObjIds(){
returnstd::vector<kc::id_t>{_st->id(),_cb->id()};
}

PointMassGravityParams::PointMassGravityParams(std::string_viewname)
:KModelParams(name){
mu=km::uninitializedNaN;
}

boolPointMassGravityParams::isFinalized()const{
boolflag=true;
if(km::isUninitializedNaN(mu)){
kc::warn("Parametermuisuninitialized.");
flag=false;
}
returnflag;
}

//DestructorincludedforMacOSbuilds.Musthaveakey-functionout-of-linetoavoiddulpicate
//symbols.
PointMassGravity::~PointMassGravity(){};

}//namespaceKarana::Models