1#ifndef HELIOCENTRIC_DISTANCE_VARIABLE_SPICE_H
2#define HELIOCENTRIC_DISTANCE_VARIABLE_SPICE_H
4#define HELIOCENTRIC_DISTANCE_VARIABLE_SPICE_VERSION "8"
18#include "../../src/GenericSubmodule.h"
19#include "../../src/ModuleFactory.h"
20#include "../../src/PhysicalConstants.h"
46 static bool m_registered;
47 std::string m_ini_filepath{
"heliocentric_distance/HeliocentricDistanceVariableSpice.ini"};
48 std::string m_start_time_utc;
49 std::string m_observer_id;
50 std::string m_reference_frame_id;
52 ConstSpiceChar* m_target =
"SUN";
54 SpiceDouble m_start_time_et;
55 SpiceDouble m_body_center_to_sun_vector[3];
56 SpiceDouble m_light_time;
64 bool exec(std::string_view param)
override;
69 bool output()
override {
return true; };
71 void calculateHeliocentricDistance();
73 void setFieldPtr(std::shared_ptr<std::valarray<T>> field_ptr)
override
75 this->module_field = field_ptr;
80 return std::make_shared<HeliocentricDistanceVariableSpice<T>>(
sim);
82 static std::string getName() {
return "HeliocentricDistanceVariableSpice"; }
85 return "HeliocentricDistanceVariableSpice";
89 return this->ini_file_data.getStringVectorParameters(
"dependencies");
101 std::string ini_folder_path{
103 this->ini_file_data.loadUserInput(ini_folder_path + m_ini_filepath);
104 this->m_generic_submodules = this->ini_file_data.getStringVectorParameters(
"submodules");
108 std::cerr <<
"[HeliocentricDistanceVariableSpice]: " << e.
what() <<
'\n';
109 throw BadInput(
static_cast<std::string
>(
"[HeliocentricDistanceVariableSpice]: ")
110 +
static_cast<std::string
>(e.
what()));
115bool HeliocentricDistanceVariableSpice<T>::setup(
124bool HeliocentricDistanceVariableSpice<T>::exec(std::string_view param)
126 if (param ==
"InitChain")
130 if (param ==
"PreTimeStepChain")
132 return preTimeStep();
134 if (param ==
"PostTimeStepChain")
136 return postTimeStep();
138 if (param ==
"OutputChain")
146void HeliocentricDistanceVariableSpice<T>::calculateHeliocentricDistance()
149 this->m_et = this->m_start_time_et + this->sim->
elapsed_time;
150 spkpos_c(this->m_target, this->m_et, this->m_reference_frame_id.c_str(), this->m_abcorr.c_str(),
151 this->m_observer_id.c_str(), this->m_body_center_to_sun_vector, &this->m_light_time);
153 (*this->module_field)[0] = vnorm_c(this->m_body_center_to_sun_vector) * 1000 / m_au;
157bool HeliocentricDistanceVariableSpice<T>::preTimeStep()
159 calculateHeliocentricDistance();
164bool HeliocentricDistanceVariableSpice<T>::init()
169 std::cout <<
"[HeliocentricDistanceVariableSpice]: Loading SPICE kernels.\n";
173 furnsh_c(this->ini_file_data.getStringParameters(
"spice_metakernel_path").c_str());
177 std::cerr <<
"[HeliocentricDistanceVariableSpice] :" << e.
what() <<
'\n';
178 throw BadInput(
static_cast<std::string
>(
"[HeliocentricDistanceVariableSpice]: ")
179 +
static_cast<std::string
>(e.
what()));
183 std::cout <<
"[HeliocentricDistanceVariableSpice]: Done.\n";
189 this->m_start_time_utc = this->ini_file_data.getStringParameters(
"start_time_utc");
190 str2et_c(this->m_start_time_utc.c_str(), &this->m_start_time_et);
191 this->m_et = this->m_start_time_et;
192 this->m_observer_id = this->ini_file_data.getStringParameters(
"object_id");
193 this->m_reference_frame_id = this->ini_file_data.getStringParameters(
"reference_frame_id");
194 this->m_abcorr = this->ini_file_data.getStringParameters(
"abcorr");
198 std::cerr <<
"[HeliocentricDistanceVariableSpice]: " << e.
what() <<
'\n';
199 throw BadInput(
static_cast<std::string
>(
"[HeliocentricDistanceVariableSpice]: ")
200 +
static_cast<std::string
>(e.
what()));
204 std::cout <<
"[HeliocentricDistanceVariableSpice]: Loaded parameters.\n";
207 calculateHeliocentricDistance();
212bool HeliocentricDistanceVariableSpice<T>::m_registered =
Abstract base class for the submodules. Submodules are below managing modules and will only be run by...
Definition GenericSubmodule.h:25
virtual void setFieldPtr(std::shared_ptr< std::valarray< T > > field_ptr)
Definition GenericSubmodule.h:85
virtual std::vector< std::string > getDependencies() const
Definition GenericSubmodule.h:73
virtual bool setup(std::vector< std::shared_ptr< GenericSubmodule< T > > > all_submodules)
Definition GenericSubmodule.h:60
virtual std::string_view getNameLocal() const =0
virtual bool postTimeStep()
Definition GenericSubmodule.h:69
virtual bool exec(std::string_view param)=0
virtual bool init()
Definition GenericSubmodule.h:67
const SimulationClassBase< T > * sim
Definition GenericSubmodule.h:32
virtual bool output()
Definition GenericSubmodule.h:71
virtual bool preTimeStep()
Definition GenericSubmodule.h:68
static constexpr bool registerModule(std::string name, creation_method module) noexcept
Function that adds a module to the module registry map.
Definition ModuleFactory.h:75
Definition SimulationClassBase.h:19
InputManager m_simulation_config
Definition SimulationClassBase.h:29
T elapsed_time
Definition SimulationClassBase.h:32
int my_rank
Definition SimulationClassBase.h:37
constexpr double au
Definition PhysicalConstants.h:9