MoCSI API Reference
Loading...
Searching...
No Matches
SolarFluxVariablePotter2023Radiosity.h
Go to the documentation of this file.
1#ifndef SOLAR_FLUX_VARIABLE_POTTER_2023_RADIOSITY_H
2#define SOLAR_FLUX_VARIABLE_POTTER_2023_RADIOSITY_H
3
4#define VERSION "5"
5
6#ifdef VTK_PRESENT
7#include <cmath>
8#include <iostream>
9#include <memory>
10#include <numbers>
11#include <string>
12#include <valarray>
13
14#include "../../src/CsrMatrix.h"
15#include "../../src/GenericSubmodule.h"
16#include "../../src/ModuleFactory.h"
17#include "../../src/PhysicalConstants.h"
18#include "../../src/VtkRayCasting.h"
19
40template <typename T>
41class SolarFluxVariablePotter2023Radiosity : public GenericSubmodule<T>
42{
43 private:
44 static bool m_registered;
45 std::string m_ini_filepath{"solar_flux/SolarFluxVariablePotter2023Radiosity.ini"};
46
47 std::unique_ptr<VtkRayCasting> m_ray_caster;
48 int m_num_facets;
49 int m_numerical_layers;
50 int m_check_timestep{0};
51 std::string m_shape_model_path;
52 // std::vector<std::vector<double>> m_viewfactor_matrix;
53 CsrSparseMatrix<double> m_viewfactor_matrix;
54 std::valarray<T> m_flux_sol;
55 std::valarray<T> m_albedo;
56 std::valarray<T> m_emissivity;
57 std::valarray<T> m_flux_radiative;
58 std::valarray<T> m_flux_reflected;
59 std::valarray<T> m_flux_infrared;
60 std::valarray<T> m_flux_reflected_temp;
61 std::valarray<T> m_flux_infrared_temp;
62 std::valarray<T> m_heat_conduction_flux;
63 T m_stefan_boltzmann_const;
64 T m_solar_const;
65 void calculateViewfactorMatrix();
66 void calculateFluxTotal(const std::valarray<T>& sol_vec, T initial_flux);
67 void radiosityCalcFirstTimeStep(const std::vector<T>& direct_solar_flux);
68 void radiosityCalc(const std::vector<T>& direct_solar_flux);
69
70 public:
71 SolarFluxVariablePotter2023Radiosity(SimulationClassBase<T>* sim);
72 bool setup(std::vector<std::shared_ptr<GenericSubmodule<T>>> all_submodules)
73 override; // loads module into necessary module chains (auto load for calculation
74 // chains)
75 bool exec(std::string_view param) override; // main functionality of the module
76
77 bool init() override;
78 bool preTimeStep() override;
79 bool postTimeStep() override { return true; };
80 bool output() override { return true; };
81
82 void setFieldPtr(std::shared_ptr<std::valarray<T>> field_ptr) override
83 {
84 this->module_field = field_ptr;
85 }
86
87 static std::shared_ptr<GenericSubmodule<T>> createMethode(SimulationClassBase<T>* sim)
88 {
89 return std::make_shared<SolarFluxVariablePotter2023Radiosity<T>>(sim);
90 }
91 static std::string getName() { return "SolarFluxVariablePotter2023Radiosity"; }
92 std::string_view getNameLocal() const override
93 {
94 return "SolarFluxVariablePotter2023Radiosity";
95 };
96 std::vector<std::string> getDependencies() const override
97 {
98 return this->ini_file_data.getStringVectorParameters("dependencies");
99 };
100};
101
102// ================= Implementation =================
103
104template <typename T>
105SolarFluxVariablePotter2023Radiosity<T>::SolarFluxVariablePotter2023Radiosity(
107 : GenericSubmodule<T>(sim)
108{
109 try
110 {
111 std::string ini_folder_path{
112 this->sim->m_simulation_config.getStringParameters("ini_folder_path")};
113 this->ini_file_data.loadUserInput(ini_folder_path + m_ini_filepath);
114 this->m_generic_submodules = this->ini_file_data.getStringVectorParameters("submodules");
115 }
116 catch (const BadInput& e)
117 {
118 std::cerr << e.what() << '\n';
119 }
120}
121
122template <typename T>
123bool SolarFluxVariablePotter2023Radiosity<T>::setup(
124 std::vector<std::shared_ptr<GenericSubmodule<T>>> all_submodules)
125{
126 m_shape_model_path = this->sim->m_simulation_config.getStringParameters("shape_model_path");
127 m_ray_caster = std::make_unique<VtkRayCasting>(m_shape_model_path.c_str());
128 m_num_facets = m_ray_caster->getFacetNumber();
129 if (m_num_facets != this->sim->m_simulation_config.getIntParameters("number_of_facets"))
130 {
131 throw std::runtime_error(
132 "Number of facets does not match the number of facets on the shape model!\n The "
133 "supplied number of facets is "
134 + std::to_string(this->sim->m_simulation_config.getIntParameters("number_of_facets"))
135 + ", while the number of facets on the shape model is " + std::to_string(m_num_facets)
136 + ".\n");
137 }
138 m_numerical_layers = this->sim->m_simulation_config.getIntParameters("numerical_layers");
139 m_flux_sol.resize(m_num_facets);
140 m_albedo.resize(m_num_facets);
141 m_emissivity.resize(m_num_facets);
142 m_flux_radiative.resize(m_num_facets);
143 m_flux_reflected.resize(m_num_facets);
144 m_flux_infrared.resize(m_num_facets);
145 m_flux_reflected_temp.resize(m_num_facets);
146 m_flux_infrared_temp.resize(m_num_facets);
147 m_heat_conduction_flux.resize(m_num_facets);
148 m_solar_const = PhysicalConstants::solar_const;
149 m_stefan_boltzmann_const = PhysicalConstants::stefan_boltzmann_const;
150 return true;
151}
152
153template <typename T>
154bool SolarFluxVariablePotter2023Radiosity<T>::exec(std::string_view param)
155{
156 if (param == "InitChain")
157 {
158 return init();
159 }
160 if (param == "PreTimeStepChain")
161 {
162 return preTimeStep();
163 }
164 if (param == "PostTimeStepChain")
165 {
166 return postTimeStep();
167 }
168 if (param == "OutputChain")
169 {
170 return output();
171 }
172 return false;
173}
174
181template <typename T>
182void SolarFluxVariablePotter2023Radiosity<T>::radiosityCalcFirstTimeStep(
183 const std::vector<T>& direct_solar_flux)
184{
185 for (int i{0}; i < m_num_facets; i++)
186 {
187 m_flux_sol[i] = (1 - m_albedo[i]) * direct_solar_flux[i] + m_heat_conduction_flux[i];
188 m_flux_infrared[i] = 0;
189 m_flux_reflected[i] = 0;
190 }
191}
192
199template <typename T>
200void SolarFluxVariablePotter2023Radiosity<T>::radiosityCalc(const std::vector<T>& direct_solar_flux)
201{
202 for (int i{0}; i < m_num_facets; i++)
203 {
204 m_flux_reflected_temp[i] = direct_solar_flux[i] + m_flux_reflected[i];
205 m_flux_infrared_temp[i] = m_flux_radiative[i] + (1 - m_emissivity[i]) * m_flux_infrared[i];
206 m_flux_reflected[i] = 0;
207 m_flux_infrared[i] = 0;
208 }
209 m_flux_reflected =
210 m_viewfactor_matrix.matrixVectorMultiplication(m_flux_reflected_temp) * m_albedo;
211 m_flux_infrared = m_viewfactor_matrix.matrixVectorMultiplication(m_flux_infrared_temp);
212 for (int i{0}; i < m_num_facets; i++)
213 {
214 m_flux_sol[i] = (1 - m_albedo[i]) * (direct_solar_flux[i] + m_flux_reflected[i])
215 + m_emissivity[i] * m_flux_infrared[i];
216 }
217}
218
224template <typename T>
225void SolarFluxVariablePotter2023Radiosity<T>::calculateFluxTotal(const std::valarray<T>& sol_vec,
226 T initial_flux)
227{
228 double sol_vec_c[3] = {sol_vec[0], sol_vec[1], sol_vec[2]};
229 std::vector<double> direct_solar_flux =
230 m_ray_caster->getSolarIrradiation(sol_vec_c, initial_flux);
231 const std::valarray<T>& temperature_field{this->sim->getField("Temperature")};
232 const std::valarray<T>& heat_conductivity_field{this->sim->getField("HeatConductivity")};
233 T top_cell_length{this->sim->getFieldValue("CellLength", 0)};
234 for (int i{0}; i < m_num_facets; i++)
235 {
236 m_flux_radiative[i] = m_emissivity[i] * m_stefan_boltzmann_const
237 * pow(temperature_field[i * m_numerical_layers], 4);
238 }
239 if (this->sim->time_step == 1)
240 {
241 for (int i{0}; i < m_num_facets; i++)
242 {
243 m_heat_conduction_flux[i] = heat_conductivity_field[i * m_numerical_layers]
244 * (temperature_field[i * m_numerical_layers]
245 - temperature_field[i * m_numerical_layers + 1])
246 / top_cell_length;
247 }
248 radiosityCalcFirstTimeStep(direct_solar_flux);
249 }
250 else
251 {
252 radiosityCalc(direct_solar_flux);
253 }
254}
255
259template <typename T>
260void SolarFluxVariablePotter2023Radiosity<T>::calculateViewfactorMatrix()
261{
262 m_viewfactor_matrix = m_ray_caster->getViewfactorMatrix();
263}
264
265template <typename T>
266bool SolarFluxVariablePotter2023Radiosity<T>::init()
267{
268 calculateViewfactorMatrix();
269 m_albedo = this->sim->getField("Albedo");
270 m_emissivity = this->sim->getField("Emissivity");
271 return true;
272}
273
274template <typename T>
275bool SolarFluxVariablePotter2023Radiosity<T>::preTimeStep()
276{
277 if (this->sim->time_step > m_check_timestep)
278 {
279 m_check_timestep = this->sim->time_step;
280 const std::valarray<T>& sol_vec{this->sim->getField("SolarVector")};
281 const std::valarray<T>& heliocentric_distance{this->sim->getField("HeliocentricDistance")};
282 T initial_flux{m_solar_const / std::pow(heliocentric_distance[0], 2)};
283
284 calculateFluxTotal(sol_vec, initial_flux);
285 }
286 (*this->module_field) = m_flux_sol;
287 return true;
288}
289
290template <typename T>
291bool SolarFluxVariablePotter2023Radiosity<T>::m_registered =
292 ModuleFactory<T>::registerModule(getName(), createMethode);
293
294#endif // VTK_PRESENT
295
296#endif // SOLAR_FLUX_VARIABLE_POTTER_2023_RADIOSITY_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
Concrete implementation of a matrix class representing a Compressed Sparse Rows (CSR) matrix....
Definition CsrMatrix.h:35
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
int getIntParameters(const std::string &key) const
Getter function to access the m_intParameters map and returns an int.
Definition InputManager.cpp:461
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
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