MoCSI API Reference
Loading...
Searching...
No Matches
SimulationClassUnitTesting.h
Go to the documentation of this file.
1#ifndef SIMULATION_CLASS_UNIT_TESTING_H
2#define SIMULATION_CLASS_UNIT_TESTING_H
3
4#include <filesystem>
5#include <fstream>
6#include <iostream>
7#include <map>
8#include <memory>
9#include <string>
10#include <valarray>
11#include <vector>
12
13#include "ChainManager.h"
14#include "GridFactory.h"
15#include "ModuleFactory.h"
16#include "SetupRunner.h"
17#include "ShapeFactory.h"
18#include "SimulationClassBase.h"
19
20template <typename T>
22{
23 public:
25 SimulationClassUnitTesting(const std::string& user_ini);
26
28 void setUserIni(const std::string& user_ini) override;
29
30 int run() override;
31 int runInitChain();
32 bool runModuleCheck(const std::vector<std::string>& managing_modules,
33 const std::vector<std::string>& submodules);
34
35 ~SimulationClassUnitTesting() override = default;
36
37 private:
38 std::string m_init_str{"InitChain"};
39 std::string m_preTs_str{"PreTimeStepChain"};
40 std::string m_postTs_str{"PostTimeStepChain"};
41 std::string m_postNonLinIter_str{"PostNonLinIterChain"};
42 std::string m_output_str{"OutputChain"};
43 ChainManager<GenericManagingModule<double>> m_global_chain{"global"};
44
45 std::vector<std::shared_ptr<GenericManagingModule<T>>> m_all_modules{};
46 std::vector<std::shared_ptr<GenericSubmodule<T>>> m_all_submodules{};
47};
48
49template <typename T>
51{
52 // Set absolute paths and load ini file
53 std::filesystem::path ini_folder_path =
54 (std::filesystem::path(PROJECT_ROOT) / "build/tests/ini_files/");
55 std::string default_ini_path =
56 std::filesystem::absolute(ini_folder_path / "default.ini").string();
57
58 std::vector<std::string> lines;
59 std::ifstream infile(default_ini_path);
60 std::string line;
61
62 while (std::getline(infile, line))
63 {
64 if (line.rfind("ini_folder_path =", 0) == 0)
65 {
66 line = "ini_folder_path = \"" + ini_folder_path.string() + "\"";
67 }
68 lines.push_back(line);
69 }
70 infile.close();
71
72 std::ofstream outfile(default_ini_path, std::ios::trunc);
73 for (const auto& l : lines)
74 {
75 outfile << l << "\n";
76 }
77 outfile.close();
78
79 std::cout << "PATH: " << default_ini_path << "\n";
80
81 this->m_simulation_config = InputManager(default_ini_path);
82}
83
84template <typename T>
86{
87 this->m_simulation_config.loadUserInput(
88 this->m_simulation_config.getStringParameters("ini_folder_path") + user_ini);
89}
90
91template <typename T>
93{
94 this->setAbsoluteDefaultIniPath();
95}
96
97template <typename T>
100{
101 // Do not use when working with absolute paths since base constructor will always run first
102}
103
104template <typename T>
106{
107 // Loading of the shape model so that all the mesh info is available at grid creation.
108 std::unique_ptr<ShapeFactory<T>> shape_creator{std::make_unique<ShapeFactory<T>>(
109 this, this->m_simulation_config.getBoolParameters("use_shape_file"),
110 this->m_simulation_config.getStringParameters("spatial_dimension"))};
111 std::shared_ptr<ShapeBase<T>> simulation_shape = shape_creator->getShapePtr();
112 std::unique_ptr<GridFactory<T>> grid_creator{std::make_unique<GridFactory<T>>(
113 this, simulation_shape,
114 this->m_simulation_config.getStringParameters("spatial_dimension"))};
115 std::shared_ptr<GridBase<T>> simulation_grid = grid_creator->getGridPtr();
116
117 this->m_field_map.insert(
118 {"Temperature", std::valarray<double>(
119 this->m_simulation_config.getDoubleParameters("initial_temperature"),
120 this->m_simulation_config.getIntParameters("numerical_layers")
121 * this->m_simulation_config.getIntParameters("number_of_facets"))});
122
123 try
124 {
126 this, this->m_simulation_config.getStringVectorParameters("managing_modules"));
127 }
128 catch (const BadInput&)
129 {
130 m_all_modules = ModuleFactory<T>::createAllManagingModules(this);
131 }
132 m_all_submodules = ModuleFactory<T>::createAllSelectedSubmodules(this, m_all_modules);
133 try
134 {
135 // If a user supplied managing module list is present, use this
136 m_global_chain.autoLoader(
137 m_all_modules, this->m_simulation_config.getStringVectorParameters("managing_modules"));
138 }
139 catch (const std::exception& e)
140 {
141 std::cerr << "[Warning] Failed to load managing modules from config: " << e.what() << "\n"
142 << "Falling back to loading all modules.\n";
143 m_global_chain.autoLoader(m_all_modules);
144 }
145
146 runSetup<T>(m_all_modules, m_all_submodules, m_global_chain.getManagingModuleNames());
147 return 0;
148}
149
150template <typename T>
152 const std::vector<std::string>& submodules)
153{
154 // Loading of the shape model so that all the mesh info is available at grid creation.
155 std::unique_ptr<ShapeFactory<T>> shape_creator{std::make_unique<ShapeFactory<T>>(
156 this, this->m_simulation_config.getBoolParameters("use_shape_file"),
157 this->m_simulation_config.getStringParameters("spatial_dimension"))};
158 std::shared_ptr<ShapeBase<T>> simulation_shape = shape_creator->getShapePtr();
159 std::unique_ptr<GridFactory<T>> grid_creator{std::make_unique<GridFactory<T>>(
160 this, simulation_shape,
161 this->m_simulation_config.getStringParameters("spatial_dimension"))};
162 std::shared_ptr<GridBase<T>> simulation_grid = grid_creator->getGridPtr();
163
164 this->m_field_map.insert(
165 {"Temperature", std::valarray<double>(
166 this->m_simulation_config.getDoubleParameters("initial_temperature"),
167 this->m_simulation_config.getIntParameters("numerical_layers")
168 * this->m_simulation_config.getIntParameters("number_of_facets"))});
169
170 try
171 {
173 this, this->m_simulation_config.getStringVectorParameters("managing_modules"));
174 }
175 catch (const BadInput&)
176 {
177 m_all_modules = ModuleFactory<T>::createAllManagingModules(this);
178 }
179 m_all_submodules = ModuleFactory<T>::createAllSelectedSubmodules(this, m_all_modules);
180 try
181 {
182 // If a user supplied managing module list is present, use this
183 m_global_chain.autoLoader(
184 m_all_modules, this->m_simulation_config.getStringVectorParameters("managing_modules"));
185 }
186 catch (const std::exception& e)
187 {
188 std::cerr << "[Warning] Failed to load managing modules from config: " << e.what() << "\n"
189 << "Falling back to loading all modules.\n";
190 m_global_chain.autoLoader(m_all_modules);
191 }
192
193 runSetup<T>(m_all_modules, m_all_submodules, m_global_chain.getManagingModuleNames());
194
195 bool result{true};
196 std::unordered_set<std::string> set_mm(managing_modules.begin(), managing_modules.end());
197 for (const auto& module_pointer : m_all_modules)
198 {
199 std::string module_name{module_pointer->getNameLocal()};
200 if (!(set_mm.contains(module_name)))
201 {
202 result = false;
203 }
204 }
205 std::unordered_set<std::string> set_sm(submodules.begin(), submodules.end());
206 for (const auto& submodule_pointer : m_all_submodules)
207 {
208 std::string submodule_name{submodule_pointer->getNameLocal()};
209 if (!(set_sm.contains(submodule_name)))
210 {
211 result = false;
212 }
213 }
214 if ((m_all_modules.size() != managing_modules.size())
215 || (m_all_submodules.size() != submodules.size()))
216 {
217 result = false;
218 }
219 return result;
220}
221
222template <typename T>
224{
225 this->setInitChainStr();
226 m_global_chain.runChain(this->m_current_position);
227 return 0;
228}
229#endif
This error class inherits from std::exception and marks faulty parameter or CL inputs....
Definition IniParser.h:71
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
std::pair< int, int > size() const
Function that returns the size of the matrix as a pair in (rows, columns) format.
Definition GenericMatrix.h:118
This class that manages parameter input through the default ini and user supplied ini files + CLI....
Definition InputManager.h:26
static std::vector< std::shared_ptr< GenericManagingModule< T > > > createAllSelectedManagingModules(SimulationClassBase< T > *sim_pointer, const std::vector< std::string > &list_of_mananging_modules_to_load)
Only creates instances of managing modules that have been specified by the user. (This allows only ha...
Definition ModuleFactory.h:195
static std::vector< std::shared_ptr< GenericSubmodule< T > > > createAllSelectedSubmodules(SimulationClassBase< T > *sim_pointer, const std::vector< std::shared_ptr< GenericManagingModule< T > > > &loaded_managing_modules)
Only creates submodules that are used within the simulation. Iteratively requests the submodule list ...
Definition ModuleFactory.h:225
static std::vector< std::shared_ptr< GenericManagingModule< T > > > createAllManagingModules(SimulationClassBase< T > *sim_pointer)
Creates every module in the module registry.
Definition ModuleFactory.h:153
Definition SimulationClassBase.h:19
Definition SimulationClassUnitTesting.h:22
bool runModuleCheck(const std::vector< std::string > &managing_modules, const std::vector< std::string > &submodules)
Definition SimulationClassUnitTesting.h:151
SimulationClassUnitTesting()
Definition SimulationClassUnitTesting.h:92
int runInitChain()
Definition SimulationClassUnitTesting.h:223
void setAbsoluteDefaultIniPath()
Definition SimulationClassUnitTesting.h:50
void setUserIni(const std::string &user_ini) override
Definition SimulationClassUnitTesting.h:85
int run() override
Definition SimulationClassUnitTesting.h:105
~SimulationClassUnitTesting() override=default