MoCSI API Reference
Loading...
Searching...
No Matches
SolarFluxVariableCustomSinusoidal.h
Go to the documentation of this file.
1#ifndef SOLAR_FLUX_CUSTOM_SINUSOIDAL_H
2#define SOLAR_FLUX_CUSTOM_SINUSOIDAL_H
3
4#define VERSION "6"
5
6#include <cmath>
7#include <iostream>
8#include <memory>
9#include <numbers>
10#include <string>
11#include <valarray>
12
13#include "../../src/GenericSubmodule.h"
14#include "../../src/ModuleFactory.h"
15#include "../../src/PhysicalConstants.h"
16
40template <typename T>
42{
43 private:
44 static bool m_registered;
45 std::string m_ini_filepath{"solar_flux/SolarFluxVariableCustomSinusoidal.ini"};
46 T m_period{}; // Period of the day-night-cycle in s
47 T m_heliocentric_distance{}; // Distance between body and sun in AU
48 T m_declination{}; // Declination of body in radians
49 T m_latitude{}; // Latitude of the point on body in radians
50 T m_slope_angle{}; // Angle of the plane against the surface normal in radians
51 T m_azimuth_topo_grad{}; // Azimuth of the topographic gradient, where the zero meridian is
52 // South.
53 T m_solar_const{}; // Solar constant
54
55 T calculateIncidenceAngle();
56
57 public:
59 bool setup(std::vector<std::shared_ptr<GenericSubmodule<T>>> all_submodules)
60 override; // loads module into necessary module chains (auto load for calculation
61 // chains)
62 bool exec(std::string_view param) override; // main functionality of the module
63
64 bool init() override;
65 bool preTimeStep() override;
66 bool postTimeStep() override { return true; };
67 bool output() override { return true; };
68
69 void calculateSolarFlux();
70
71 void setFieldPtr(std::shared_ptr<std::valarray<T>> field_ptr) override
72 {
73 this->module_field = field_ptr;
74 }
75
76 static std::shared_ptr<GenericSubmodule<T>> createMethode(SimulationClassBase<T>* sim)
77 {
78 return std::make_shared<SolarFluxVariableCustomSinusoidal<T>>(sim);
79 }
80 static std::string getName() { return "SolarFluxVariableCustomSinusoidal"; }
81 std::string_view getNameLocal() const override
82 {
83 return "SolarFluxVariableCustomSinusoidal";
84 };
85 std::vector<std::string> getDependencies() const override
86 {
87 return this->ini_file_data.getStringVectorParameters("dependencies");
88 };
89};
90
91// ================= Implementation =================
92
93template <typename T>
95 : GenericSubmodule<T>(sim)
96{
97 try
98 {
99 std::string ini_folder_path{
100 this->sim->m_simulation_config.getStringParameters("ini_folder_path")};
101 this->ini_file_data.loadUserInput(ini_folder_path + m_ini_filepath);
103 }
104 catch (const BadInput& e)
105 {
106 std::cerr << e.what() << '\n';
107 }
108}
109
110template <typename T>
112 std::vector<std::shared_ptr<GenericSubmodule<T>>> all_submodules)
113{
114 m_period = this->ini_file_data.getDoubleParameters("period");
115 m_declination = this->ini_file_data.getDoubleParameters("declination") * std::numbers::pi / 180;
116 m_latitude = this->ini_file_data.getDoubleParameters("latitude") * std::numbers::pi / 180;
117 m_slope_angle = this->ini_file_data.getDoubleParameters("slope_angle") * std::numbers::pi / 180;
118 m_azimuth_topo_grad =
119 this->ini_file_data.getDoubleParameters("azimuth_topo_grad") * std::numbers::pi / 180;
120 m_solar_const = PhysicalConstants::solar_const;
121 return true;
122}
123
124template <typename T>
126{
127 if (param == "InitChain")
128 {
129 return init();
130 }
131 if (param == "PreTimeStepChain")
132 {
133 return preTimeStep();
134 }
135 if (param == "PostTimeStepChain")
136 {
137 return postTimeStep();
138 }
139 if (param == "OutputChain")
140 {
141 return output();
142 }
143 return false;
144}
145
146template <typename T>
148{
149 T hour_angle{2 * std::numbers::pi * std::fmod(this->sim->elapsed_time / m_period, 1.0)};
150 // beta is the angle of 90 minus incidence angle for horizontal surfaces. Equation 2.1 in
151 // Schörghofer N. (2025). Planetary Code Collection User Guide.
152 T sinbeta{std::cos(m_latitude) * std::cos(m_declination) * std::cos(hour_angle)
153 + std::sin(m_latitude) * std::sin(m_declination)};
154 T cosbeta{std::sqrt(1 - std::pow(sinbeta, 2))};
155 T cos_az_sun{(std::sin(m_declination) - std::sin(m_latitude) * sinbeta)
156 / (std::cos(m_latitude) * cosbeta)};
157 // roundoff in both directions
158 if (cos_az_sun > 1.0)
159 {
160 cos_az_sun = 1.0;
161 }
162 else if (cos_az_sun < -1.0)
163 {
164 cos_az_sun = -1.0;
165 }
166 T azSun{std::acos(cos_az_sun)};
167 if (std::sin(hour_angle) >= 0)
168 {
169 azSun = 2 * std::numbers::pi - azSun;
170 }
171 // Equation 2.2 in Schörghofer N. (2025). Planetary Code Collection User Guide. theta = 90 minus
172 // incidence angle for sloped surface
173 T sintheta = std::cos(m_slope_angle) * sinbeta
174 - std::sin(m_slope_angle) * cosbeta * std::cos(azSun - m_azimuth_topo_grad);
175 if (cosbeta == 0)
176 {
177 sintheta = std::cos(m_slope_angle) * sinbeta;
178 }
179 // sintheta < 0 = sun below local horizon, sinbeta < 0 = sun below horizon at infinity
180 if (sintheta < 0.0 || sinbeta < 0.0)
181 {
182 sintheta = 0.0;
183 }
184 return sintheta;
185}
186
187template <typename T>
189{
190 m_heliocentric_distance = this->sim->getField("HeliocentricDistance")[0];
191 T sintheta{calculateIncidenceAngle()};
192 const std::valarray<T>& albedo{this->sim->getField("Albedo")};
193 for (int i = 0; i < albedo.size(); ++i)
194 {
195 (*this->module_field)[i] =
196 (1 - albedo[i]) * sintheta * m_solar_const / std::pow(m_heliocentric_distance, 2);
197 }
198}
199
200template <typename T>
202{
203 calculateSolarFlux();
204 return true;
205}
206
207template <typename T>
209{
210 calculateSolarFlux();
211 return true;
212}
213
214template <typename T>
216 ModuleFactory<T>::registerModule(getName(), createMethode);
217
218#endif // SOLAR_FLUX_CUSTOM_SINUSOIDAL_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
InputManager ini_file_data
Definition GenericSubmodule.h:36
std::vector< std::string > m_generic_submodules
Definition GenericSubmodule.h:34
const SimulationClassBase< T > * sim
Definition GenericSubmodule.h:32
std::shared_ptr< std::valarray< T > > module_field
Definition GenericSubmodule.h:29
std::vector< std::string > getStringVectorParameters(const std::string &key) const
Definition InputManager.cpp:503
void loadUserInput(const std::string &user_ini_file_path)
Public function to load and merge user supplied ini files with the already stored data.
Definition InputManager.cpp:42
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:493
static constexpr bool registerModule(std::string name, creation_method module) noexcept
Function that adds a module to the module registry map.
Definition ModuleFactory.h:68
Definition SimulationClassBase.h:15
InputManager m_simulation_config
Definition SimulationClassBase.h:24
Definition SolarFluxVariableCustomSinusoidal.h:42
bool exec(std::string_view param) override
Definition SolarFluxVariableCustomSinusoidal.h:125
std::vector< std::string > getDependencies() const override
Definition SolarFluxVariableCustomSinusoidal.h:85
SolarFluxVariableCustomSinusoidal(SimulationClassBase< T > *sim)
Definition SolarFluxVariableCustomSinusoidal.h:94
void setFieldPtr(std::shared_ptr< std::valarray< T > > field_ptr) override
Definition SolarFluxVariableCustomSinusoidal.h:71
bool postTimeStep() override
Definition SolarFluxVariableCustomSinusoidal.h:66
bool setup(std::vector< std::shared_ptr< GenericSubmodule< T > > > all_submodules) override
Definition SolarFluxVariableCustomSinusoidal.h:111
bool preTimeStep() override
Definition SolarFluxVariableCustomSinusoidal.h:208
void calculateSolarFlux()
Definition SolarFluxVariableCustomSinusoidal.h:188
bool output() override
Definition SolarFluxVariableCustomSinusoidal.h:67
static std::shared_ptr< GenericSubmodule< T > > createMethode(SimulationClassBase< T > *sim)
Definition SolarFluxVariableCustomSinusoidal.h:76
std::string_view getNameLocal() const override
Definition SolarFluxVariableCustomSinusoidal.h:81
static std::string getName()
Definition SolarFluxVariableCustomSinusoidal.h:80
bool init() override
Definition SolarFluxVariableCustomSinusoidal.h:201
constexpr double solar_const
Definition PhysicalConstants.h:10