1#ifndef SOLAR_FLUX_CUSTOM_SINUSOIDAL_H
2#define SOLAR_FLUX_CUSTOM_SINUSOIDAL_H
4#define SOLAR_FLUX_CUSTOM_SINUSOIDAL_VERSION "8"
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 <<
"[SolarFluxVariableCustomSinusoidal]: " << e.
what() <<
'\n';
107 throw BadInput(
static_cast<std::string
>(
"[SolarFluxVariableCustomSinusoidal]: ")
108 +
static_cast<std::string
>(e.
what()));
118 m_period = this->ini_file_data.getDoubleParameters(
"period");
120 this->ini_file_data.getDoubleParameters(
"declination") * std::numbers::pi / 180;
121 m_latitude = this->ini_file_data.getDoubleParameters(
"latitude") * std::numbers::pi / 180;
123 this->ini_file_data.getDoubleParameters(
"slope_angle") * std::numbers::pi / 180;
124 m_azimuth_topo_grad =
125 this->ini_file_data.getDoubleParameters(
"azimuth_topo_grad") * std::numbers::pi / 180;
130 std::cerr <<
"[SolarFluxVariableCustomSinusoidal]: " << e.
what() <<
'\n';
131 throw BadInput(
static_cast<std::string
>(
"[SolarFluxVariableCustomSinusoidal]: ")
132 +
static_cast<std::string
>(e.
what()));
140 if (param ==
"InitChain")
144 if (param ==
"PreTimeStepChain")
146 return preTimeStep();
148 if (param ==
"PostTimeStepChain")
150 return postTimeStep();
152 if (param ==
"OutputChain")
162 T hour_angle{2 * std::numbers::pi * std::fmod(this->sim->elapsed_time / m_period, 1.0)};
165 T sinbeta{std::cos(m_latitude) * std::cos(m_declination) * std::cos(hour_angle)
166 + std::sin(m_latitude) * std::sin(m_declination)};
167 T cosbeta{std::sqrt(1 - std::pow(sinbeta, 2))};
168 T cos_az_sun{(std::sin(m_declination) - std::sin(m_latitude) * sinbeta)
169 / (std::cos(m_latitude) * cosbeta)};
171 if (cos_az_sun > 1.0)
175 else if (cos_az_sun < -1.0)
179 T azSun{std::acos(cos_az_sun)};
180 if (std::sin(hour_angle) >= 0)
182 azSun = 2 * std::numbers::pi - azSun;
186 T sintheta = std::cos(m_slope_angle) * sinbeta
187 - std::sin(m_slope_angle) * cosbeta * std::cos(azSun - m_azimuth_topo_grad);
190 sintheta = std::cos(m_slope_angle) * sinbeta;
193 if (sintheta < 0.0 || sinbeta < 0.0)
205 m_heliocentric_distance = this->sim->getField(
"HeliocentricDistance")[0];
206 const std::valarray<T>& albedo{this->sim->getField(
"Albedo")};
207 T sintheta{calculateIncidenceAngle()};
208 for (
int i = 0; i < albedo.size(); ++i)
210 (*this->module_field)[i] =
211 (1 - albedo[i]) * sintheta * m_solar_const / std::pow(m_heliocentric_distance, 2);
216 std::cerr <<
"[SolarFluxVariableCustomSinusoidal]: HeliocentricDistance and/or Albedo "
218 "loaded or accessable!\n "
219 "[SolarFluxVariableCustomSinusoidal]:"
222 static_cast<std::string
>(
223 "[SolarFluxVariableCustomSinusoidal]: HeliocentricDistance and/or Albedo module "
225 "accessable!\n [SolarFluxVariableCustomSinusoidal]:")
226 +
static_cast<std::string
>(e.
what()));
233 calculateSolarFlux();
240 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:76
Definition SimulationClassBase.h:19
InputManager m_simulation_config
Definition SimulationClassBase.h:29
Definition SolarFluxVariableCustomSinusoidal.h:42
bool exec(std::string_view param) override
Definition SolarFluxVariableCustomSinusoidal.h:138
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:113
bool preTimeStep() override
Definition SolarFluxVariableCustomSinusoidal.h:238
void calculateSolarFlux()
Definition SolarFluxVariableCustomSinusoidal.h:201
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:231
constexpr double solar_const
Definition PhysicalConstants.h:10