1#ifndef SOLAR_FLUX_VARIABLE_POTTER_2023_RADIOSITY_H
2#define SOLAR_FLUX_VARIABLE_POTTER_2023_RADIOSITY_H
17#include "../../src/MpiCommunicationPatterns.h"
20#include "../../src/CsrMatrix.h"
21#include "../../src/GenericSubmodule.h"
22#include "../../src/ModuleFactory.h"
23#include "../../src/PhysicalConstants.h"
24#include "../../src/VtkRayCasting.h"
50 static bool m_registered;
51 std::string m_ini_filepath{
"solar_flux/SolarFluxVariablePotter2023Radiosity.ini"};
53 std::unique_ptr<VtkRayCasting> m_ray_caster;
55 int m_numerical_layers;
56 int m_check_timestep{0};
57 std::string m_shape_model_path;
59 std::vector<double> direct_solar_flux;
61 int m_number_non_zero_elements{};
62 std::valarray<T> m_flux_sol;
63 std::valarray<T> m_albedo;
64 std::valarray<T> m_emissivity;
65 std::valarray<T> m_flux_radiative;
66 std::valarray<T> m_flux_reflected;
67 std::valarray<T> m_flux_infrared;
68 std::valarray<T> m_flux_reflected_temp;
69 std::valarray<T> m_flux_infrared_temp;
70 std::valarray<T> m_heat_conduction_flux;
73 T m_stefan_boltzmann_const;
75 void calculateViewfactorMatrix();
76 void calculateFluxTotal(
const std::valarray<T>& sol_vec, T initial_flux);
77 void radiosityCalcFirstTimeStep(
const std::vector<T>& direct_solar_flux);
78 void radiosityCalc(
const std::vector<T>& direct_solar_flux);
81 std::valarray<T> m_global_temperature_array;
82 void calculateFluxTotalMPI(
const std::valarray<T>& sol_vec, T initial_flux);
90 bool exec(std::string_view param)
override;
95 bool output()
override {
return true; };
97 void setFieldPtr(std::shared_ptr<std::valarray<T>> field_ptr)
override
99 this->module_field = field_ptr;
104 return std::make_shared<SolarFluxVariablePotter2023Radiosity<T>>(
sim);
106 static std::string getName() {
return "SolarFluxVariablePotter2023Radiosity"; }
109 return "SolarFluxVariablePotter2023Radiosity";
113 return this->ini_file_data.getStringVectorParameters(
"dependencies");
120SolarFluxVariablePotter2023Radiosity<T>::SolarFluxVariablePotter2023Radiosity(
126 std::string ini_folder_path{
128 this->ini_file_data.loadUserInput(ini_folder_path + m_ini_filepath);
129 this->m_generic_submodules = this->ini_file_data.getStringVectorParameters(
"submodules");
133 std::cerr << e.
what() <<
'\n';
138bool SolarFluxVariablePotter2023Radiosity<T>::setup(
142 bool calculate_viewfactor_matrix{
true};
154 std::make_unique<VtkRayCasting>(m_shape_model_path.c_str(), id_start,
155 id_end - id_start, calculate_viewfactor_matrix);
156 m_num_facets = m_ray_caster->getFacetNumber();
157 m_number_non_zero_elements = m_ray_caster->getMatrixElementNumber();
161 calculate_viewfactor_matrix =
false;
163 std::make_unique<VtkRayCasting>(m_shape_model_path.c_str(), id_start,
164 id_end - id_start, calculate_viewfactor_matrix);
169 m_ray_caster = std::make_unique<VtkRayCasting>(m_shape_model_path.c_str(),
170 calculate_viewfactor_matrix);
171 m_num_facets = m_ray_caster->getFacetNumber();
175 std::make_unique<VtkRayCasting>(m_shape_model_path.c_str(), calculate_viewfactor_matrix);
176 m_num_facets = m_ray_caster->getFacetNumber();
180 int number_of_facets_sim{
182 m_global_temperature_array.resize(number_of_facets_sim * m_numerical_layers);
183 if (this->sim->
world_size > 1 && this->sim->my_rank > 0)
185 m_num_facets = number_of_facets_sim;
187 MPI_Bcast(&m_number_non_zero_elements, 1, MPI_INT, 0, MPI_COMM_WORLD);
190 id_end = m_num_facets;
192 if (m_num_facets != number_of_facets_sim)
194 throw std::runtime_error(
195 "Number of facets does not match the number of facets on the shape model!\n The "
196 "supplied number of facets is "
198 +
", while the number of facets on the shape model is " + std::to_string(m_num_facets)
201 direct_solar_flux = std::vector<double>(m_num_facets);
202 m_flux_sol.resize(m_num_facets);
203 m_albedo.resize(m_num_facets);
204 m_emissivity.resize(m_num_facets);
205 m_flux_radiative.resize(m_num_facets);
206 m_flux_reflected.resize(m_num_facets);
207 m_flux_infrared.resize(m_num_facets);
208 m_flux_reflected_temp.resize(m_num_facets);
209 m_flux_infrared_temp.resize(m_num_facets);
210 m_heat_conduction_flux.resize(m_num_facets);
217bool SolarFluxVariablePotter2023Radiosity<T>::exec(std::string_view param)
219 if (param ==
"InitChain")
223 if (param ==
"PreTimeStepChain")
225 return preTimeStep();
227 if (param ==
"PostTimeStepChain")
229 return postTimeStep();
231 if (param ==
"OutputChain")
247void SolarFluxVariablePotter2023Radiosity<T>::radiosityCalcFirstTimeStep(
248 const std::vector<T>& direct_solar_flux)
250 for (
int i{id_start}; i < id_end; i++)
252 m_flux_sol[i] = (1 - m_albedo[i]) * direct_solar_flux[i] + m_heat_conduction_flux[i];
253 m_flux_infrared[i] = 0;
254 m_flux_reflected[i] = 0;
267void SolarFluxVariablePotter2023Radiosity<T>::radiosityCalc(
const std::vector<T>& direct_solar_flux)
269 for (
int i{0}; i < m_num_facets; i++)
271 m_flux_reflected_temp[i] = direct_solar_flux[i] + m_flux_reflected[i];
272 m_flux_infrared_temp[i] = m_flux_radiative[i] + (1 - m_emissivity[i]) * m_flux_infrared[i];
273 m_flux_reflected[i] = 0;
274 m_flux_infrared[i] = 0;
277 m_viewfactor_matrix.matrixVectorMultiplication(m_flux_reflected_temp) * m_albedo;
278 m_flux_infrared = m_viewfactor_matrix.matrixVectorMultiplication(m_flux_infrared_temp);
279 for (
int i{id_start}; i < id_end; i++)
281 m_flux_sol[i] = (1 - m_albedo[i]) * (direct_solar_flux[i] + m_flux_reflected[i])
282 + m_emissivity[i] * m_flux_infrared[i];
296void SolarFluxVariablePotter2023Radiosity<T>::calculateFluxTotal(
const std::valarray<T>& sol_vec,
299 double sol_vec_c[3] = {sol_vec[0], sol_vec[1], sol_vec[2]};
300 direct_solar_flux = m_ray_caster->getSolarIrradiation(sol_vec_c, initial_flux);
301 const std::valarray<T>& temperature_field{this->sim->
getField(
"Temperature")};
302 const std::valarray<T>& heat_conductivity_field{this->sim->
getField(
"HeatConductivity")};
303 T top_cell_length{this->sim->
getFieldValue(
"CellLength", 0)};
304 for (
int i{0}; i < m_num_facets; i++)
306 m_flux_radiative[i] = m_emissivity[i] * m_stefan_boltzmann_const
307 * pow(temperature_field[i * m_numerical_layers], 4);
311 for (
int i{0}; i < m_num_facets; i++)
313 m_heat_conduction_flux[i] = heat_conductivity_field[i * m_numerical_layers]
314 * (temperature_field[i * m_numerical_layers]
315 - temperature_field[i * m_numerical_layers + 1])
318 radiosityCalcFirstTimeStep(direct_solar_flux);
322 radiosityCalc(direct_solar_flux);
342void SolarFluxVariablePotter2023Radiosity<T>::calculateFluxTotalMPI(
const std::valarray<T>& sol_vec,
345 double sol_vec_c[3] = {sol_vec[0], sol_vec[1], sol_vec[2]};
352 direct_solar_flux = m_ray_caster->getSolarIrradiation(sol_vec_c, initial_flux);
353 commPatternAllDataToAllInPlace(direct_solar_flux, id_end - id_start, this->sim);
354 const std::valarray<T>& temperature_field{this->sim->
getField(
"Temperature")};
355 T top_cell_length{this->sim->
getFieldValue(
"CellLength", 0)};
356 m_flux_radiative = 0;
357 for (
int i{id_start}; i < id_end; i++)
359 m_flux_radiative[i] = m_emissivity[i] * m_stefan_boltzmann_const
360 * pow(temperature_field[(i - id_start) * m_numerical_layers], 4);
362 commPatternAllDataToAllInPlace(m_flux_radiative, id_end - id_start, this->sim);
365 std::valarray<T> heat_conductivity_field(m_numerical_layers * m_num_facets);
366 commPatternAllDataToAll(heat_conductivity_field, this->sim->
getField(
"HeatConductivity"),
368 for (
int i{0}; i < m_num_facets; i++)
370 m_heat_conduction_flux[i] = heat_conductivity_field[i * m_numerical_layers]
371 * (m_global_temperature_array[i * m_numerical_layers]
372 - m_global_temperature_array[i * m_numerical_layers + 1])
375 radiosityCalcFirstTimeStep(direct_solar_flux);
379 radiosityCalc(direct_solar_flux);
380 commPatternAllDataToAllInPlace(m_flux_reflected, id_end - id_start, this->sim);
381 commPatternAllDataToAllInPlace(m_flux_infrared, id_end - id_start, this->sim);
393void SolarFluxVariablePotter2023Radiosity<T>::calculateViewfactorMatrix()
395 m_viewfactor_matrix = m_ray_caster->getViewfactorMatrix();
399bool SolarFluxVariablePotter2023Radiosity<T>::init()
404 std::valarray<T> temp_viewfactor_matrix_values;
405 std::valarray<int> temp_viewfactor_column_indices;
406 std::valarray<int> temp_viewfactor_row_pointers;
407 int number_of_facets_sim{
411 calculateViewfactorMatrix();
412 temp_viewfactor_matrix_values = m_viewfactor_matrix.getMatrixElements();
413 temp_viewfactor_column_indices = m_viewfactor_matrix.getColumnIndices();
414 temp_viewfactor_row_pointers = m_viewfactor_matrix.getRowPointers();
416 if (this->sim->
world_size > 1 && this->sim->my_rank > 0)
418 temp_viewfactor_matrix_values.resize(m_number_non_zero_elements);
419 temp_viewfactor_column_indices.resize(m_number_non_zero_elements);
421 temp_viewfactor_row_pointers.resize(number_of_facets_sim + 1);
424 MPI_Request request_handles[3];
425 MPI_Ibcast(&temp_viewfactor_matrix_values[0], temp_viewfactor_matrix_values.size(),
426 MPI_DOUBLE, 0, MPI_COMM_WORLD, &request_handles[0]);
427 MPI_Ibcast(&temp_viewfactor_column_indices[0], temp_viewfactor_column_indices.size(),
428 MPI_INT, 0, MPI_COMM_WORLD, &request_handles[1]);
429 MPI_Ibcast(&temp_viewfactor_row_pointers[0], temp_viewfactor_row_pointers.size(), MPI_INT,
430 0, MPI_COMM_WORLD, &request_handles[2]);
431 MPI_Waitall(3, request_handles, MPI_STATUSES_IGNORE);
434 if (this->sim->
world_size > 1 && this->sim->my_rank > 0)
446 m_emissivity = this->sim->
getField(
"Emissivity");
452 m_emissivity = this->sim->
getField(
"Emissivity");
Concrete implementation of a matrix class representing a Compressed Sparse Rows (CSR) matrix....
Definition CsrMatrix.h:35
CsrSparseMatrix()
Constructor for an empty CsrSparseMatrix object. Leaves all storage arrays empty but sets the flag to...
Definition CsrMatrix.h:92
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:19
const std::valarray< T > & getField(const std::string &key) const
Definition SimulationClassBase.h:133
const T & getFieldValue(const std::string &key, int pos) const
Definition SimulationClassBase.h:139
InputManager m_simulation_config
Definition SimulationClassBase.h:29
int time_step
Definition SimulationClassBase.h:34
int my_rank
Definition SimulationClassBase.h:36
int world_size
Definition SimulationClassBase.h:37
constexpr double solar_const
Definition PhysicalConstants.h:10
constexpr double stefan_boltzmann_const
Definition PhysicalConstants.h:6