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 SOLAR_FLUX_VARIABLE_POTTER_2023_RADIOSITY_VERSION "10"
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#ifdef MPI_PRESENT
15#include <mpi.h>
16
17#include "../../src/MpiCommunicationPatterns.h"
18#endif
19
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"
25
46template <typename T>
47class SolarFluxVariablePotter2023Radiosity : public GenericSubmodule<T>
48{
49 private:
50 static bool m_registered;
51 std::string m_ini_filepath{"solar_flux/SolarFluxVariablePotter2023Radiosity.ini"};
52
53 std::unique_ptr<VtkRayCasting> m_ray_caster;
54 int m_num_facets;
55 int m_numerical_layers;
56 int m_check_timestep{0};
57 std::string m_shape_model_path;
58 // // std::vector<std::vector<double>> m_viewfactor_matrix;
59 std::vector<double> direct_solar_flux;
60 CsrSparseMatrix<double> m_viewfactor_matrix;
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;
71 int id_start{0};
72 int id_end;
73 T m_stefan_boltzmann_const;
74 T m_solar_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);
79
80#ifdef MPI_PRESENT
81 std::valarray<T> m_global_temperature_array;
82 void calculateFluxTotalMPI(const std::valarray<T>& sol_vec, T initial_flux);
83#endif
84
85 public:
86 SolarFluxVariablePotter2023Radiosity(SimulationClassBase<T>* sim);
87 bool setup(std::vector<std::shared_ptr<GenericSubmodule<T>>> all_submodules)
88 override; // loads module into necessary module chains (auto load for calculation
89 // chains)
90 bool exec(std::string_view param) override; // main functionality of the module
91
92 bool init() override;
93 bool preTimeStep() override;
94 bool postTimeStep() override { return true; };
95 bool output() override { return true; };
96
97 void setFieldPtr(std::shared_ptr<std::valarray<T>> field_ptr) override
98 {
99 this->module_field = field_ptr;
100 }
101
102 static std::shared_ptr<GenericSubmodule<T>> createMethode(SimulationClassBase<T>* sim)
103 {
104 return std::make_shared<SolarFluxVariablePotter2023Radiosity<T>>(sim);
105 }
106 static std::string getName() { return "SolarFluxVariablePotter2023Radiosity"; }
107 std::string_view getNameLocal() const override
108 {
109 return "SolarFluxVariablePotter2023Radiosity";
110 };
111 std::vector<std::string> getDependencies() const override
112 {
113 return this->ini_file_data.getStringVectorParameters("dependencies");
114 };
115};
116
117// ================= Implementation =================
118
119template <typename T>
120SolarFluxVariablePotter2023Radiosity<T>::SolarFluxVariablePotter2023Radiosity(
122 : GenericSubmodule<T>(sim)
123{
124 try
125 {
126 std::string ini_folder_path{
127 this->sim->m_simulation_config.getStringParameters("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");
130 }
131 catch (const BadInput& e)
132 {
133 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: " << e.what() << '\n';
134 throw BadInput(static_cast<std::string>("[SolarFluxVariablePotter2023Radiosity]: ")
135 + static_cast<std::string>(e.what()));
136 }
137}
138
139template <typename T>
140bool SolarFluxVariablePotter2023Radiosity<T>::setup(
141 std::vector<std::shared_ptr<GenericSubmodule<T>>> all_submodules)
142{
143 try
144 {
145 m_shape_model_path = this->sim->m_simulation_config.getStringParameters("shape_model_path");
146 }
147 catch (const BadInput& e)
148 {
149 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: " << e.what() << '\n';
150 throw BadInput(static_cast<std::string>("[SolarFluxVariablePotter2023Radiosity]: ")
151 + static_cast<std::string>(e.what()));
152 }
153 bool calculate_viewfactor_matrix{true};
154#ifdef MPI_PRESENT
155 try
156 {
157 id_start = this->sim->m_simulation_config.getIntParameters("global_starting_facet_number");
158 id_end = (this->sim->m_simulation_config.getIntParameters("global_starting_facet_number")
159 + this->sim->m_simulation_config.getIntParameters("number_of_facets"));
160 }
161 catch (const BadInput& e)
162 {
163 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: " << e.what() << '\n';
164 throw BadInput(static_cast<std::string>("[SolarFluxVariablePotter2023Radiosity]: ")
165 + static_cast<std::string>(e.what()));
166 }
167 if (this->sim->world_size > 1)
168 {
169 if (this->sim->my_rank == 0)
170 {
171 // Calculate the Viewfactormatrix only once and broadcast it to all threads
172 // to minimize VTK calls. (Will later be updated to using shared memory)
173 m_ray_caster =
174 std::make_unique<VtkRayCasting>(m_shape_model_path.c_str(), id_start,
175 id_end - id_start, calculate_viewfactor_matrix);
176 m_num_facets = m_ray_caster->getFacetNumber();
177 m_number_non_zero_elements = m_ray_caster->getMatrixElementNumber();
178 }
179 else
180 {
181 calculate_viewfactor_matrix = false;
182 m_ray_caster =
183 std::make_unique<VtkRayCasting>(m_shape_model_path.c_str(), id_start,
184 id_end - id_start, calculate_viewfactor_matrix);
185 }
186 }
187 else
188 {
189 m_ray_caster = std::make_unique<VtkRayCasting>(m_shape_model_path.c_str(),
190 calculate_viewfactor_matrix);
191 m_num_facets = m_ray_caster->getFacetNumber();
192 }
193#else
194 m_ray_caster =
195 std::make_unique<VtkRayCasting>(m_shape_model_path.c_str(), calculate_viewfactor_matrix);
196 m_num_facets = m_ray_caster->getFacetNumber();
197#endif
198 try
199 {
200 m_numerical_layers = this->sim->m_simulation_config.getIntParameters("numerical_layers");
201 }
202 catch (const BadInput& e)
203 {
204 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: " << e.what() << '\n';
205 throw BadInput(static_cast<std::string>("[SolarFluxVariablePotter2023Radiosity]: ")
206 + static_cast<std::string>(e.what()));
207 }
208#ifdef MPI_PRESENT
209 int number_of_facets_sim;
210 try
211 {
212 number_of_facets_sim =
213 this->sim->m_simulation_config.getIntParameters("global_number_of_facets");
214 }
215 catch (const BadInput& e)
216 {
217 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: " << e.what() << '\n';
218 throw BadInput(static_cast<std::string>("[SolarFluxVariablePotter2023Radiosity]: ")
219 + static_cast<std::string>(e.what()));
220 }
221 m_global_temperature_array.resize(number_of_facets_sim * m_numerical_layers);
222 if (this->sim->world_size > 1 && this->sim->my_rank > 0)
223 {
224 m_num_facets = number_of_facets_sim;
225 }
226 MPI_Bcast(&m_number_non_zero_elements, 1, MPI_INT, 0, MPI_COMM_WORLD);
227#else
228 int number_of_facets_sim{0};
229 try
230 {
231 number_of_facets_sim = this->sim->m_simulation_config.getIntParameters("number_of_facets");
232 }
233 catch (const BadInput& e)
234 {
235 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: " << e.what() << '\n';
236 throw BadInput(static_cast<std::string>("[SolarFluxVariablePotter2023Radiosity]: ")
237 + static_cast<std::string>(e.what()));
238 }
239 id_end = m_num_facets;
240#endif
241 if (m_num_facets != number_of_facets_sim)
242 {
243 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: Number of facets does not match the "
244 "number of facets on the shape model!\n The "
245 "supplied number of facets is "
246 << std::to_string(
247 this->sim->m_simulation_config.getIntParameters("number_of_facets"))
248 << ", while the number of facets on the shape model is "
249 + std::to_string(m_num_facets)
250 << ".\n";
251 throw std::runtime_error(
252 static_cast<std::string>("[SolarFluxVariablePotter2023Radiosity]: Number of facets "
253 "does not match the number of "
254 "facets on the shape model!\n The "
255 "supplied number of facets is ")
256 + std::to_string(this->sim->m_simulation_config.getIntParameters("number_of_facets"))
257 + static_cast<std::string>(", while the number of facets on the shape model is ")
258 + std::to_string(m_num_facets));
259 }
260 direct_solar_flux = std::vector<double>(m_num_facets);
261 m_flux_sol.resize(m_num_facets);
262 m_albedo.resize(m_num_facets);
263 m_emissivity.resize(m_num_facets);
264 m_flux_radiative.resize(m_num_facets);
265 m_flux_reflected.resize(m_num_facets);
266 m_flux_infrared.resize(m_num_facets);
267 m_flux_reflected_temp.resize(m_num_facets);
268 m_flux_infrared_temp.resize(m_num_facets);
269 m_heat_conduction_flux.resize(m_num_facets);
270 m_solar_const = PhysicalConstants::solar_const;
271 m_stefan_boltzmann_const = PhysicalConstants::stefan_boltzmann_const;
272 return true;
273}
274
275template <typename T>
276bool SolarFluxVariablePotter2023Radiosity<T>::exec(std::string_view param)
277{
278 if (param == "InitChain")
279 {
280 return init();
281 }
282 if (param == "PreTimeStepChain")
283 {
284 return preTimeStep();
285 }
286 if (param == "PostTimeStepChain")
287 {
288 return postTimeStep();
289 }
290 if (param == "OutputChain")
291 {
292 return output();
293 }
294 return false;
295}
296
305template <typename T>
306void SolarFluxVariablePotter2023Radiosity<T>::radiosityCalcFirstTimeStep(
307 const std::vector<T>& direct_solar_flux)
308{
309 for (int i{id_start}; i < id_end; i++)
310 {
311 m_flux_sol[i] = (1 - m_albedo[i]) * direct_solar_flux[i] + m_heat_conduction_flux[i];
312 m_flux_infrared[i] = 0;
313 m_flux_reflected[i] = 0;
314 }
315}
316
325template <typename T>
326void SolarFluxVariablePotter2023Radiosity<T>::radiosityCalc(const std::vector<T>& direct_solar_flux)
327{
328 for (int i{0}; i < m_num_facets; i++)
329 {
330 m_flux_reflected_temp[i] = direct_solar_flux[i] + m_flux_reflected[i];
331 m_flux_infrared_temp[i] = m_flux_radiative[i] + (1 - m_emissivity[i]) * m_flux_infrared[i];
332 m_flux_reflected[i] = 0;
333 m_flux_infrared[i] = 0;
334 }
335 m_flux_reflected =
336 m_viewfactor_matrix.matrixVectorMultiplication(m_flux_reflected_temp) * m_albedo;
337 m_flux_infrared = m_viewfactor_matrix.matrixVectorMultiplication(m_flux_infrared_temp);
338 for (int i{id_start}; i < id_end; i++)
339 {
340 m_flux_sol[i] = (1 - m_albedo[i]) * (direct_solar_flux[i] + m_flux_reflected[i])
341 + m_emissivity[i] * m_flux_infrared[i];
342 }
343}
344
354template <typename T>
355void SolarFluxVariablePotter2023Radiosity<T>::calculateFluxTotal(const std::valarray<T>& sol_vec,
356 T initial_flux)
357{
358 double sol_vec_c[3] = {sol_vec[0], sol_vec[1], sol_vec[2]};
359 direct_solar_flux = m_ray_caster->getSolarIrradiation(sol_vec_c, initial_flux);
360 const std::valarray<T>& temperature_field{this->sim->getField("Temperature")};
361 try
362 {
363 const std::valarray<T>& heat_conductivity_field{this->sim->getField("HeatConductivity")};
364 // While this is a map access, this value was set by the code internally
365 T top_cell_length{this->sim->getFieldValue("CellLength", 0)};
366 for (int i{0}; i < m_num_facets; i++)
367 {
368 m_flux_radiative[i] = m_emissivity[i] * m_stefan_boltzmann_const
369 * pow(temperature_field[i * m_numerical_layers], 4);
370 }
371 if (this->sim->time_step == 1)
372 {
373 for (int i{0}; i < m_num_facets; i++)
374 {
375 m_heat_conduction_flux[i] = heat_conductivity_field[i * m_numerical_layers]
376 * (temperature_field[i * m_numerical_layers]
377 - temperature_field[i * m_numerical_layers + 1])
378 / top_cell_length;
379 }
380 radiosityCalcFirstTimeStep(direct_solar_flux);
381 }
382 else
383 {
384 radiosityCalc(direct_solar_flux);
385 }
386 }
387 catch (const BadInput& e)
388 {
389 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: HeatConductivity "
390 "module not "
391 "loaded or accessable!\n "
392 "[SolarFluxVariablePotter2023Radiosity]:"
393 << e.what() << '\n';
394 throw BadInput(static_cast<std::string>(
395 "[SolarFluxVariablePotter2023Radiosity]: HeatConductivity module "
396 "not loaded or "
397 "accessable!\n [SolarFluxVariablePotter2023Radiosity]:")
398 + static_cast<std::string>(e.what()));
399 }
400}
401
402#ifdef MPI_PRESENT
417template <typename T>
418void SolarFluxVariablePotter2023Radiosity<T>::calculateFluxTotalMPI(const std::valarray<T>& sol_vec,
419 T initial_flux)
420{
421 double sol_vec_c[3] = {sol_vec[0], sol_vec[1], sol_vec[2]};
422 /*if (this->sim->my_rank == 0)
423 {
424 direct_solar_flux = m_ray_caster->getSolarIrradiation(sol_vec_c, initial_flux);
425 }
426 // This Bcast will be replaced by shared memory.
427 MPI_Bcast(&direct_solar_flux[0], direct_solar_flux.size(), MPI_DOUBLE, 0, MPI_COMM_WORLD);*/
428 direct_solar_flux = m_ray_caster->getSolarIrradiation(sol_vec_c, initial_flux);
429 commPatternAllDataToAllInPlace(direct_solar_flux, id_end - id_start, this->sim);
430 const std::valarray<T>& temperature_field{this->sim->getField("Temperature")};
431 T top_cell_length{this->sim->getFieldValue("CellLength", 0)};
432 m_flux_radiative = 0;
433 for (int i{id_start}; i < id_end; i++)
434 {
435 m_flux_radiative[i] = m_emissivity[i] * m_stefan_boltzmann_const
436 * pow(temperature_field[(i - id_start) * m_numerical_layers], 4);
437 }
438 commPatternAllDataToAllInPlace(m_flux_radiative, id_end - id_start, this->sim);
439 if (this->sim->time_step == 1)
440 {
441 std::valarray<T> heat_conductivity_field(m_numerical_layers * m_num_facets);
442 try
443 {
444 commPatternAllDataToAll(heat_conductivity_field,
445 this->sim->getField("HeatConductivity"), this->sim);
446 }
447 catch (const BadInput& e)
448 {
449 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: HeatConductivity "
450 "module not "
451 "loaded or accessable!\n "
452 "[SolarFluxVariablePotter2023Radiosity]:"
453 << e.what() << '\n';
454 throw BadInput(static_cast<std::string>(
455 "[SolarFluxVariablePotter2023Radiosity]: HeatConductivity module "
456 "not loaded or "
457 "accessable!\n [SolarFluxVariablePotter2023Radiosity]:")
458 + static_cast<std::string>(e.what()));
459 }
460 for (int i{0}; i < m_num_facets; i++)
461 {
462 m_heat_conduction_flux[i] = heat_conductivity_field[i * m_numerical_layers]
463 * (m_global_temperature_array[i * m_numerical_layers]
464 - m_global_temperature_array[i * m_numerical_layers + 1])
465 / top_cell_length;
466 }
467 radiosityCalcFirstTimeStep(direct_solar_flux);
468 }
469 else
470 {
471 radiosityCalc(direct_solar_flux);
472 commPatternAllDataToAllInPlace(m_flux_reflected, id_end - id_start, this->sim);
473 commPatternAllDataToAllInPlace(m_flux_infrared, id_end - id_start, this->sim);
474 }
475}
476
477#endif // MPI_PRESENT
478
484template <typename T>
485void SolarFluxVariablePotter2023Radiosity<T>::calculateViewfactorMatrix()
486{
487 m_viewfactor_matrix = m_ray_caster->getViewfactorMatrix();
488}
489
490template <typename T>
491bool SolarFluxVariablePotter2023Radiosity<T>::init()
492{
493#ifdef MPI_PRESENT
494 if (this->sim->world_size > 1)
495 {
496 std::valarray<T> temp_viewfactor_matrix_values;
497 std::valarray<int> temp_viewfactor_column_indices;
498 std::valarray<int> temp_viewfactor_row_pointers;
499 int number_of_facets_sim;
500 try
501 {
502 number_of_facets_sim =
503 this->sim->m_simulation_config.getIntParameters("global_number_of_facets");
504 }
505 catch (const BadInput& e)
506 {
507 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: " << e.what() << '\n';
508 throw BadInput(static_cast<std::string>("[SolarFluxVariablePotter2023Radiosity]: ")
509 + static_cast<std::string>(e.what()));
510 }
511 if (this->sim->my_rank == 0)
512 {
513 calculateViewfactorMatrix();
514 temp_viewfactor_matrix_values = m_viewfactor_matrix.getMatrixElements();
515 temp_viewfactor_column_indices = m_viewfactor_matrix.getColumnIndices();
516 temp_viewfactor_row_pointers = m_viewfactor_matrix.getRowPointers();
517 }
518 if (this->sim->world_size > 1 && this->sim->my_rank > 0)
519 {
520 temp_viewfactor_matrix_values.resize(m_number_non_zero_elements);
521 temp_viewfactor_column_indices.resize(m_number_non_zero_elements);
522 // One more, since row pointers always needs a end of matrix marker.
523 temp_viewfactor_row_pointers.resize(number_of_facets_sim + 1);
524 }
525 // Broadcast the matrix values and element positions from rank 0 to all
526 MPI_Request request_handles[3];
527 MPI_Ibcast(&temp_viewfactor_matrix_values[0],
528 static_cast<int>(temp_viewfactor_matrix_values.size()), MPI_DOUBLE, 0,
529 MPI_COMM_WORLD, &request_handles[0]);
530 MPI_Ibcast(&temp_viewfactor_column_indices[0],
531 static_cast<int>(temp_viewfactor_column_indices.size()), MPI_INT, 0,
532 MPI_COMM_WORLD, &request_handles[1]);
533 MPI_Ibcast(&temp_viewfactor_row_pointers[0],
534 static_cast<int>(temp_viewfactor_row_pointers.size()), MPI_INT, 0,
535 MPI_COMM_WORLD, &request_handles[2]);
536 MPI_Waitall(3, request_handles, MPI_STATUSES_IGNORE);
537 // Use the creatiom routine from filled matrices in rank > 0 to get everyone to have the
538 // viewfactor matrix.
539 if (this->sim->world_size > 1 && this->sim->my_rank > 0)
540 {
541 m_viewfactor_matrix = CsrSparseMatrix<T>(
544 }
545 try
546 {
547 commPatternAllDataToAll(m_emissivity, this->sim->getField("Emissivity"), this->sim);
548 commPatternAllDataToAll(m_albedo, this->sim->getField("Albedo"), this->sim);
549 }
550 catch (const BadInput& e)
551 {
552 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: Emissivity and/or Albedo "
553 "module not "
554 "loaded or accessable!\n "
555 "[SolarFluxVariablePotter2023Radiosity]: "
556 << e.what() << '\n';
557 throw BadInput(
558 static_cast<std::string>(
559 "[SolarFluxVariablePotter2023Radiosity]: Emissivity and/or Albedo module "
560 "not loaded or "
561 "accessable!\n [SolarFluxVariablePotter2023Radiosity]: ")
562 + static_cast<std::string>(e.what()));
563 }
564 }
565 else
566 {
568 try
569 {
570 m_emissivity = this->sim->getField("Emissivity");
571 m_albedo = this->sim->getField("Albedo");
572 }
573 catch (const BadInput& e)
574 {
575 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: Emissivity and/or Albedo "
576 "module not "
577 "loaded or accessable!\n "
578 "[SolarFluxVariablePotter2023Radiosity]:"
579 << e.what() << '\n';
580 throw BadInput(
581 static_cast<std::string>(
582 "[SolarFluxVariablePotter2023Radiosity]: Emissivity and/or Albedo module "
583 "not loaded or "
584 "accessable!\n [SolarFluxVariablePotter2023Radiosity]:")
585 + static_cast<std::string>(e.what()));
586 }
587 }
588#else
590 try
591 {
592 m_emissivity = this->sim->getField("Emissivity");
593 m_albedo = this->sim->getField("Albedo");
594 }
595 catch (const BadInput& e)
596 {
597 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: Emissivity and/or Albedo "
598 "module not "
599 "loaded or accessable!\n "
600 "[SolarFluxVariablePotter2023Radiosity]:"
601 << e.what() << '\n';
602 throw BadInput(
603 static_cast<std::string>(
604 "[SolarFluxVariablePotter2023Radiosity]: Emissivity and/or Albedo module "
605 "not loaded or "
606 "accessable!\n [SolarFluxVariablePotter2023Radiosity]:")
607 + static_cast<std::string>(e.what()));
608 }
609#endif
610 return true;
611}
612
613template <typename T>
615{
616 if (this->sim->time_step > m_check_timestep)
617 {
618 m_check_timestep = this->sim->time_step;
619 try
620 {
621 const std::valarray<T>& sol_vec{this->sim->getField("SolarVector")};
622 const std::valarray<T>& heliocentric_distance{
623 this->sim->getField("HeliocentricDistance")};
624 T initial_flux{m_solar_const / std::pow(heliocentric_distance[0], 2)};
625#ifdef MPI_PRESENT
626 if (this->sim->world_size > 1)
627 {
629 }
630 else
631 {
633 }
634#else
636#endif
637 }
638 catch (const BadInput& e)
639 {
640 std::cerr << "[SolarFluxVariablePotter2023Radiosity]: SolarVector and/or "
641 "HeliocentricDistance "
642 "module not "
643 "loaded or accessable!\n "
644 "[SolarFluxVariablePotter2023Radiosity]:"
645 << e.what() << '\n';
646 throw BadInput(
647 static_cast<std::string>("[SolarFluxVariablePotter2023Radiosity]: SolarVector "
648 "and/or HeliocentricDistance "
649 "module "
650 "not loaded or "
651 "accessable!\n [SolarFluxVariablePotter2023Radiosity]:")
652 + static_cast<std::string>(e.what()));
653 }
654 }
655 (*this->module_field) = m_flux_sol[std::slice(id_start, id_end - id_start, 1)];
656 return true;
657}
658
659template <typename T>
661 ModuleFactory<T>::registerModule(getName(), createMethode);
662
663#endif // VTK_PRESENT
664
665#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:37
CsrSparseMatrix()
Constructor for an empty CsrSparseMatrix object. Leaves all storage arrays empty but sets the flag to...
Definition CsrMatrix.h:94
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:466
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:498
static constexpr bool registerModule(std::string name, creation_method module) noexcept
Function that adds a module to the module registry map.
Definition ModuleFactory.h:75
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