1#ifndef SOLAR_FLUX_VARIABLE_POTTER_2023_RADIOSITY_H
2#define SOLAR_FLUX_VARIABLE_POTTER_2023_RADIOSITY_H
14#include "../../src/GenericSubmodule.h"
15#include "../../src/ModuleFactory.h"
16#include "../../src/PhysicalConstants.h"
17#include "../../src/VtkRayCasting.h"
43 static bool m_registered;
44 std::string m_ini_filepath{
"solar_flux/SolarFluxVariablePotter2023Radiosity.ini"};
46 std::unique_ptr<VtkRayCasting> m_ray_caster;
48 int m_numerical_layers;
49 int m_check_timestep{0};
50 std::string m_shape_model_path;
51 std::vector<std::vector<double>> m_viewfactor_matrix;
52 std::valarray<T> m_flux_sol;
53 std::valarray<T> m_albedo;
54 std::valarray<T> m_emissivity;
55 std::valarray<T> m_flux_radiative;
56 std::valarray<T> m_flux_reflected;
57 std::valarray<T> m_flux_infrared;
58 std::valarray<T> m_flux_reflected_temp;
59 std::valarray<T> m_flux_infrared_temp;
60 std::valarray<T> m_heat_conduction_flux;
61 T m_stefan_boltzmann_const;
63 void calculateViewfactorMatrix();
64 void calculateFluxTotal(
const std::valarray<T>& sol_vec, T initial_flux);
65 void radiosityCalcFirstTimeStep(
const std::vector<T>& direct_solar_flux);
66 void radiosityCalc(
const std::vector<T>& direct_solar_flux);
73 bool exec(std::string_view param)
override;
78 bool output()
override {
return true; };
80 void setFieldPtr(std::shared_ptr<std::valarray<T>> field_ptr)
override
82 this->module_field = field_ptr;
87 return std::make_shared<SolarFluxVariablePotter2023Radiosity<T>>(
sim);
89 static std::string getName() {
return "SolarFluxVariablePotter2023Radiosity"; }
92 return "SolarFluxVariablePotter2023Radiosity";
96 return this->ini_file_data.getStringVectorParameters(
"dependencies");
103SolarFluxVariablePotter2023Radiosity<T>::SolarFluxVariablePotter2023Radiosity(
109 std::string ini_folder_path{
111 this->ini_file_data.loadUserInput(ini_folder_path + m_ini_filepath);
112 this->m_generic_submodules = this->ini_file_data.getStringVectorParameters(
"submodules");
116 std::cerr << e.
what() <<
'\n';
121bool SolarFluxVariablePotter2023Radiosity<T>::setup(
125 m_ray_caster = std::make_unique<VtkRayCasting>(m_shape_model_path.c_str());
126 m_num_facets = m_ray_caster->getFacetNumber();
129 throw std::runtime_error(
130 "Number of facets does not match the number of facets on the shape model!\n The "
131 "supplied number of facets is "
133 +
", while the number of facets on the shape model is " + std::to_string(m_num_facets)
137 m_flux_sol.resize(m_num_facets);
138 m_albedo.resize(m_num_facets);
139 m_emissivity.resize(m_num_facets);
140 m_flux_radiative.resize(m_num_facets);
141 m_flux_reflected.resize(m_num_facets);
142 m_flux_infrared.resize(m_num_facets);
143 m_flux_reflected_temp.resize(m_num_facets);
144 m_flux_infrared_temp.resize(m_num_facets);
145 m_heat_conduction_flux.resize(m_num_facets);
152bool SolarFluxVariablePotter2023Radiosity<T>::exec(std::string_view param)
154 if (param ==
"InitChain")
158 if (param ==
"PreTimeStepChain")
160 return preTimeStep();
162 if (param ==
"PostTimeStepChain")
164 return postTimeStep();
166 if (param ==
"OutputChain")
180void SolarFluxVariablePotter2023Radiosity<T>::radiosityCalcFirstTimeStep(
181 const std::vector<T>& direct_solar_flux)
183 for (
int i{0}; i < m_num_facets; i++)
185 m_flux_sol[i] = (1 - m_albedo[i]) * direct_solar_flux[i] + m_heat_conduction_flux[i];
186 m_flux_infrared[i] = 0;
187 m_flux_reflected[i] = 0;
198void SolarFluxVariablePotter2023Radiosity<T>::radiosityCalc(
const std::vector<T>& direct_solar_flux)
200 for (
int i{0}; i < m_num_facets; i++)
202 m_flux_reflected_temp[i] = direct_solar_flux[i] + m_flux_reflected[i];
203 m_flux_infrared_temp[i] = m_flux_radiative[i] + (1 - m_emissivity[i]) * m_flux_infrared[i];
204 m_flux_reflected[i] = 0;
205 m_flux_infrared[i] = 0;
207 for (
int i{0}; i < m_num_facets; i++)
209 for (
int j{0}; j < m_num_facets; j++)
211 m_flux_reflected[i] +=
212 m_viewfactor_matrix[i][j] * m_albedo[i] * m_flux_reflected_temp[j];
213 m_flux_infrared[i] += m_viewfactor_matrix[i][j] * m_flux_infrared_temp[j];
216 m_flux_sol[i] = (1 - m_albedo[i]) * (direct_solar_flux[i] + m_flux_reflected[i])
217 + m_emissivity[i] * m_flux_infrared[i];
227void SolarFluxVariablePotter2023Radiosity<T>::calculateFluxTotal(
const std::valarray<T>& sol_vec,
230 double sol_vec_c[3] = {sol_vec[0], sol_vec[1], sol_vec[2]};
231 std::vector<double> direct_solar_flux =
232 m_ray_caster->getSolarIrradiation(sol_vec_c, initial_flux);
233 const std::valarray<T>& temperature_field{this->sim->
getField(
"Temperature")};
234 const std::valarray<T>& heat_conductivity_field{this->sim->
getField(
"HeatConductivity")};
235 T top_cell_length{this->sim->
getFieldValue(
"CellLength", 0)};
236 for (
int i{0}; i < m_num_facets; i++)
238 m_flux_radiative[i] = m_emissivity[i] * m_stefan_boltzmann_const
239 * pow(temperature_field[i * m_numerical_layers], 4);
243 for (
int i{0}; i < m_num_facets; i++)
245 m_heat_conduction_flux[i] = heat_conductivity_field[i * m_numerical_layers]
246 * (temperature_field[i * m_numerical_layers]
247 - temperature_field[i * m_numerical_layers + 1])
250 radiosityCalcFirstTimeStep(direct_solar_flux);
254 radiosityCalc(direct_solar_flux);
262void SolarFluxVariablePotter2023Radiosity<T>::calculateViewfactorMatrix()
264 m_viewfactor_matrix = m_ray_caster->getViewfactorMatrix();
268bool SolarFluxVariablePotter2023Radiosity<T>::init()
270 calculateViewfactorMatrix();
271 m_albedo = this->sim->
getField(
"Albedo");
272 m_emissivity = this->sim->
getField(
"Emissivity");
277bool SolarFluxVariablePotter2023Radiosity<T>::preTimeStep()
279 if (this->sim->
time_step > m_check_timestep)
282 const std::valarray<T>& sol_vec{this->sim->
getField(
"SolarVector")};
283 const std::valarray<T>& heliocentric_distance{this->sim->
getField(
"HeliocentricDistance")};
284 T initial_flux{m_solar_const / std::pow(heliocentric_distance[0], 2)};
286 calculateFluxTotal(sol_vec, initial_flux);
288 (*this->module_field) = m_flux_sol;
293bool SolarFluxVariablePotter2023Radiosity<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:68
Definition SimulationClassBase.h:15
const std::valarray< T > & getField(const std::string &key) const
Definition SimulationClassBase.h:114
const T & getFieldValue(const std::string &key, int pos) const
Definition SimulationClassBase.h:120
InputManager m_simulation_config
Definition SimulationClassBase.h:24
int time_step
Definition SimulationClassBase.h:29
constexpr double solar_const
Definition PhysicalConstants.h:10
constexpr double stefan_boltzmann_const
Definition PhysicalConstants.h:6