1#ifndef SOLAR_FLUX_CUSTOM_SINUSOIDAL_H
2#define SOLAR_FLUX_CUSTOM_SINUSOIDAL_H
13#include "../../src/GenericSubmodule.h"
14#include "../../src/ModuleFactory.h"
15#include "../../src/PhysicalConstants.h"
44 static bool m_registered;
45 std::string m_ini_filepath{
"solar_flux/SolarFluxVariableCustomSinusoidal.ini"};
47 T m_heliocentric_distance{};
51 T m_azimuth_topo_grad{};
55 T calculateIncidenceAngle();
62 bool exec(std::string_view param)
override;
67 bool output()
override {
return true; };
71 void setFieldPtr(std::shared_ptr<std::valarray<T>> field_ptr)
override
78 return std::make_shared<SolarFluxVariableCustomSinusoidal<T>>(
sim);
80 static std::string
getName() {
return "SolarFluxVariableCustomSinusoidal"; }
83 return "SolarFluxVariableCustomSinusoidal";
99 std::string ini_folder_path{
106 std::cerr << e.
what() <<
'\n';
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;
127 if (param ==
"InitChain")
131 if (param ==
"PreTimeStepChain")
133 return preTimeStep();
135 if (param ==
"PostTimeStepChain")
137 return postTimeStep();
139 if (param ==
"OutputChain")
149 T hour_angle{2 * std::numbers::pi * std::fmod(this->sim->elapsed_time / m_period, 1.0)};
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)};
158 if (cos_az_sun > 1.0)
162 else if (cos_az_sun < -1.0)
166 T azSun{std::acos(cos_az_sun)};
167 if (std::sin(hour_angle) >= 0)
169 azSun = 2 * std::numbers::pi - azSun;
173 T sintheta = std::cos(m_slope_angle) * sinbeta
174 - std::sin(m_slope_angle) * cosbeta * std::cos(azSun - m_azimuth_topo_grad);
177 sintheta = std::cos(m_slope_angle) * sinbeta;
180 if (sintheta < 0.0 || sinbeta < 0.0)
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)
195 (*this->module_field)[i] =
196 (1 - albedo[i]) * sintheta * m_solar_const / std::pow(m_heliocentric_distance, 2);
203 calculateSolarFlux();
210 calculateSolarFlux();
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
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