MoCSI API Reference
Loading...
Searching...
No Matches
HeliocentricDistanceVariableSpice.h
Go to the documentation of this file.
1#ifndef HELIOCENTRIC_DISTANCE_VARIABLE_SPICE_H
2#define HELIOCENTRIC_DISTANCE_VARIABLE_SPICE_H
3
4#define HELIOCENTRIC_DISTANCE_VARIABLE_SPICE_VERSION "8"
5
6#ifdef SPICE_PRESENT
7
8extern "C"
9{
10#include "SpiceUsr.h"
11}
12
13#include <iostream>
14#include <memory>
15#include <string>
16#include <valarray>
17
18#include "../../src/GenericSubmodule.h"
19#include "../../src/ModuleFactory.h"
20#include "../../src/PhysicalConstants.h"
21
42template <typename T>
43class HeliocentricDistanceVariableSpice : public GenericSubmodule<T>
44{
45 private:
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;
51 std::string m_abcorr;
52 ConstSpiceChar* m_target = "SUN";
53 SpiceDouble m_et;
54 SpiceDouble m_start_time_et;
55 SpiceDouble m_body_center_to_sun_vector[3];
56 SpiceDouble m_light_time;
57 T m_au{};
58
59 public:
60 HeliocentricDistanceVariableSpice(SimulationClassBase<T>* sim);
61 bool setup(std::vector<std::shared_ptr<GenericSubmodule<T>>> all_submodules)
62 override; // loads module into necessary module chains (auto load for calculation
63 // chains)
64 bool exec(std::string_view param) override; // main functionality of the module
65
66 bool init() override;
67 bool preTimeStep() override;
68 bool postTimeStep() override { return true; };
69 bool output() override { return true; };
70
71 void calculateHeliocentricDistance();
72
73 void setFieldPtr(std::shared_ptr<std::valarray<T>> field_ptr) override
74 {
75 this->module_field = field_ptr;
76 }
77
78 static std::shared_ptr<GenericSubmodule<T>> createMethode(SimulationClassBase<T>* sim)
79 {
80 return std::make_shared<HeliocentricDistanceVariableSpice<T>>(sim);
81 }
82 static std::string getName() { return "HeliocentricDistanceVariableSpice"; }
83 std::string_view getNameLocal() const override
84 {
85 return "HeliocentricDistanceVariableSpice";
86 };
87 std::vector<std::string> getDependencies() const override
88 {
89 return this->ini_file_data.getStringVectorParameters("dependencies");
90 };
91};
92
93// ================= Implementation =================
94
95template <typename T>
96HeliocentricDistanceVariableSpice<T>::HeliocentricDistanceVariableSpice(SimulationClassBase<T>* sim)
97 : GenericSubmodule<T>(sim)
98{
99 try
100 {
101 std::string ini_folder_path{
102 this->sim->m_simulation_config.getStringParameters("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");
105 }
106 catch (const BadInput& e)
107 {
108 std::cerr << "[HeliocentricDistanceVariableSpice]: " << e.what() << '\n';
109 throw BadInput(static_cast<std::string>("[HeliocentricDistanceVariableSpice]: ")
110 + static_cast<std::string>(e.what()));
111 }
112}
113
114template <typename T>
115bool HeliocentricDistanceVariableSpice<T>::setup(
116 std::vector<std::shared_ptr<GenericSubmodule<T>>> all_submodules)
117{
119
120 return true;
121}
122
123template <typename T>
124bool HeliocentricDistanceVariableSpice<T>::exec(std::string_view param)
125{
126 if (param == "InitChain")
127 {
128 return init();
129 }
130 if (param == "PreTimeStepChain")
131 {
132 return preTimeStep();
133 }
134 if (param == "PostTimeStepChain")
135 {
136 return postTimeStep();
137 }
138 if (param == "OutputChain")
139 {
140 return output();
141 }
142 return false;
143}
144
145template <typename T>
146void HeliocentricDistanceVariableSpice<T>::calculateHeliocentricDistance()
147{
148 // Calculate current ephemerides times from current timestep
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);
152 // Again this module_field has length 1 (only one parameter)
153 (*this->module_field)[0] = vnorm_c(this->m_body_center_to_sun_vector) * 1000 / m_au;
154}
155
156template <typename T>
157bool HeliocentricDistanceVariableSpice<T>::preTimeStep()
158{
159 calculateHeliocentricDistance();
160 return true;
161}
162
163template <typename T>
164bool HeliocentricDistanceVariableSpice<T>::init()
165{
166 // Load metadata kernel (can be done multiple times for different modules)
167 if (this->sim->my_rank == 0)
168 {
169 std::cout << "[HeliocentricDistanceVariableSpice]: Loading SPICE kernels.\n";
170 }
171 try
172 {
173 furnsh_c(this->ini_file_data.getStringParameters("spice_metakernel_path").c_str());
174 }
175 catch (const BadInput& e)
176 {
177 std::cerr << "[HeliocentricDistanceVariableSpice] :" << e.what() << '\n';
178 throw BadInput(static_cast<std::string>("[HeliocentricDistanceVariableSpice]: ")
179 + static_cast<std::string>(e.what()));
180 }
181 if (this->sim->my_rank == 0)
182 {
183 std::cout << "[HeliocentricDistanceVariableSpice]: Done.\n";
184 }
185
186 // Read ini file for correct IDs
187 try
188 {
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");
195 }
196 catch (const BadInput& e)
197 {
198 std::cerr << "[HeliocentricDistanceVariableSpice]: " << e.what() << '\n';
199 throw BadInput(static_cast<std::string>("[HeliocentricDistanceVariableSpice]: ")
200 + static_cast<std::string>(e.what()));
201 }
202 if (this->sim->my_rank == 0)
203 {
204 std::cout << "[HeliocentricDistanceVariableSpice]: Loaded parameters.\n";
205 }
206
207 calculateHeliocentricDistance();
208 return true;
209}
210
211template <typename T>
212bool HeliocentricDistanceVariableSpice<T>::m_registered =
213 ModuleFactory<T>::registerModule(getName(), createMethode);
214
215#endif // SPICE_PRESENT
216
217#endif // HELIOCENTRIC_DISTANCE_VARIABLE_SPICE_H
This error class inherits from std::exception and marks faulty parameter or CL inputs....
Definition IniParser.h:71
const char * what() const noexcept override
Definition IniParser.h:78
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
std::string getStringParameters(const std::string &key) const
Getter function to access the m_parameters map and returns a string. Throws a BadInput error,...
Definition InputManager.cpp:498
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:31
int my_rank
Definition SimulationClassBase.h:36
constexpr double au
Definition PhysicalConstants.h:9