Chi-Tech
chi_runtime.cc
Go to the documentation of this file.
1/** @file Runtime file*/
2#include "chi_runtime.h"
3#include "chi_configuration.h"
4
6#include "math/chi_math.h"
8
10
12
15#include "event_system/Event.h"
16
17#include "ChiObjectFactory.h"
18
19#include "chi_mpi.h"
20#include "chi_log.h"
21#include "utils/chi_timer.h"
22
23#include <iostream>
24
25#ifndef NDEBUG
26#include <unistd.h>
27#endif
28
29//=============================================== Global variables
34
35/** Global stack of handlers */
36std::vector<chi_mesh::MeshHandlerPtr> Chi::meshhandler_stack;
38
39std::vector<chi_mesh::SurfaceMeshPtr> Chi::surface_mesh_stack;
40std::vector<chi_mesh::FFInterpPtr> Chi::field_func_interpolation_stack;
41std::vector<chi_mesh::UnpartMeshPtr> Chi::unpartitionedmesh_stack;
42
43std::vector<chi_physics::MaterialPtr> Chi::material_stack;
44std::vector<chi_physics::MultiGroupXSPtr> Chi::multigroup_xs_stack;
45std::vector<chi_physics::FieldFunctionPtr> Chi::field_function_stack;
46
47std::vector<chi_math::AngularQuadraturePtr> Chi::angular_quadrature_stack;
48
49std::vector<ChiObjectPtr> Chi::object_stack;
50std::vector<chi_math::SpatialDiscretizationPtr> Chi::sdm_stack;
51std::vector<chi::PostProcessorPtr> Chi::postprocessor_stack;
52
53//================================ run_time quantities
61
63 "\nUsage: exe inputfile [options values]\n"
64 "\n"
65 " -v Level of verbosity. Default 0.\n"
66 " Can be either 0, 1 or 2.\n"
67 " a=b Executes argument as a lua string. "
68 "i.e. x=2 or y=[[\"string\"]]\n"
69 " --allow_petsc_error_handler Allow petsc error handler.\n"
70 " --supress_beg_end_timelog Suppress time logs at the \n"
71 " beginning and end of execution.\n"
72 " --suppress_color Suppresses the printing of color.\n"
73 " useful for unit tests requiring a diff.\n"
74 " --dump-object-registry Dumps the object registry.\n"
75 "\n\n\n";
76
77// ############################################### Argument parser
78/**Parses input arguments.
79\param argc int Number of arguments supplied.
80\param argv char** Array of strings representing each argument.
81 */
82void Chi::run_time::ParseArguments(int argc, char** argv)
83{
84 bool input_file_found = false;
85 for (int i = 1; i < argc; i++)
86 {
87 std::string argument(argv[i]);
88
89 Chi::log.Log() << "Parsing argument " << i << " " << argument;
90
91 if (argument.find("-h") != std::string::npos or
92 argument.find("--help") != std::string::npos)
93 {
96 }
97 else if (argument.find("--supress_beg_end_timelog") != std::string::npos)
98 {
100 }
101 else if (argument.find("--allow_petsc_error_handler") != std::string::npos)
102 {
104 }
105 else if (argument.find("--suppress_color") != std::string::npos)
106 {
108 }
109 else if (argument.find("--dump-object-registry") != std::string::npos)
110 {
113 }
114 //================================================ No-graphics option
115 else if (argument.find("-b") != std::string::npos)
116 {
118 } //-b
119 //================================================ Verbosity
120 else if (argument.find("-v") != std::string::npos)
121 {
122 if ((i + 1) >= argc)
123 {
124 std::cerr << "Invalid option used with command line argument "
125 "-v. Options are 0,1 or 2."
126 << std::endl;
127 Chi::Exit(EXIT_FAILURE);
128 }
129 else
130 {
131 std::string v_option(argv[i + 1]);
132 try
133 {
134 int level = std::stoi(v_option);
135 Chi::log.SetVerbosity(level);
136 }
137 catch (const std::invalid_argument& e)
138 {
139 std::cerr << "Invalid option used with command line argument "
140 "-v. Options are 0,1 or 2."
141 << std::endl;
142 Chi::Exit(EXIT_FAILURE);
143 }
144 }
145
146 } //-v
147 else if ((argument.find('=') == std::string::npos) and (!input_file_found))
148 {
150 input_file_found = true;
152 } // no =
153 else if (argument.find('=') != std::string::npos)
154 {
155 Chi::console.GetCommandBuffer().push_back(argument);
156 } //=
157
158 } // for argument
159
161 {
164 }
165}
166
167// ############################################### Initialize ChiTech
168/**Initializes all necessary items for ChiTech.
169\param argc int Number of arguments supplied.
170\param argv char** Array of strings representing each argument.
171\param communicator MPI_Comm The main communicator, used system wide.
172 */
173int Chi::Initialize(int argc, char** argv, MPI_Comm communicator)
174{
175 int location_id = 0, number_processes = 1;
176
177 MPI_Init(&argc, &argv); /* starts MPI */
178 MPI_Comm_rank(communicator, &location_id); /* get cur process id */
179 MPI_Comm_size(communicator, &number_processes); /* get num of processes */
180
181 mpi.SetCommunicator(communicator);
182 mpi.SetLocationID(location_id);
183 mpi.SetProcessCount(number_processes);
184
186 Chi::console.PostMPIInfo(location_id, number_processes);
187
188 run_time::ParseArguments(argc, argv);
189
190 run_time::InitPetSc(argc, argv);
191
192 auto& t_main = Chi::log.CreateTimingBlock("ChiTech");
193 t_main.TimeSectionBegin();
195 "ProgramStart", chi::GetStandardEventCode("ProgramStart")));
196
197 return 0;
198}
199
200/**Initializes PetSc for use by all entities.*/
201int Chi::run_time::InitPetSc(int argc, char** argv)
202{
203 PETSC_COMM_WORLD = mpi.comm;
204 PetscOptionsInsertString(nullptr, "-error_output_stderr");
206 PetscOptionsInsertString(nullptr, "-no_signal_handler");
207
208 PetscCall(PetscInitialize(&argc, &argv, nullptr, nullptr));
209
210 return 0;
211}
212
213// ############################################### Finalize ChiTech
214/**Finalizes ChiTech.
215 * */
217{
218 auto& t_main = Chi::log.GetTimingBlock("ChiTech");
219 t_main.TimeSectionEnd();
221 "ProgramExecuted", chi::GetStandardEventCode("ProgramExecuted")));
222 meshhandler_stack.clear();
223
224 surface_mesh_stack.clear();
225 object_stack.clear();
228
229 object_stack.clear();
230 material_stack.clear();
231 multigroup_xs_stack.clear();
232
233 PetscFinalize();
234 MPI_Finalize();
235}
236
237// ############################################### Interactive interface
238/**Runs the interactive chitech engine*/
239int Chi::RunInteractive(int argc, char** argv)
240{
242 {
244 << " Running ChiTech in interactive-mode with "
245 << Chi::mpi.process_count << " processes.";
246
247 Chi::log.Log() << "ChiTech version " << GetVersionStr();
248 }
249
250 Chi::log.Log() << "ChiTech number of arguments supplied: " << argc - 1;
251
253
255
256 const auto& input_fname = Chi::run_time::input_file_name_;
257
258 if (not input_fname.empty())
259 {
260 try
261 {
262 Chi::console.ExecuteFile(input_fname, argc, argv);
263 }
264 catch (const std::exception& excp)
265 {
266 Chi::log.LogAllError() << excp.what();
267 // No quitting if file execution fails
268 }
269 }
270
272
274 {
275 Chi::log.Log() << "Final program time " << program_timer.GetTimeString();
277 << " ChiTech finished execution.";
278 }
279
280 return 0;
281}
282
283// ############################################### Batch interface
284/**Runs ChiTech in pure batch mode. Start then finish.*/
285int Chi::RunBatch(int argc, char** argv)
286{
288 {
290 << " Running ChiTech in batch-mode with "
291 << Chi::mpi.process_count << " processes.";
292
293 Chi::log.Log() << "ChiTech version " << GetVersionStr();
294 }
295
296 Chi::log.Log() << "ChiTech number of arguments supplied: " << argc - 1;
297
300
301#ifndef NDEBUG
302 Chi::log.Log() << "Waiting...";
303 if (Chi::mpi.location_id == 0)
304 for (int k = 0; k < 2; ++k)
305 {
306 usleep(1000000);
307 Chi::log.Log() << k;
308 }
309
310 mpi.Barrier();
311#endif
312
313 const auto& input_fname = Chi::run_time::input_file_name_;
314 int error_code = 0;
315
316 if ((not input_fname.empty()) and (not Chi::run_time::termination_posted_))
317 {
318 try
319 {
320 error_code = Chi::console.ExecuteFile(input_fname, argc, argv);
321 }
322 catch (const std::exception& excp)
323 {
324 Chi::log.LogAllError() << excp.what();
325 Chi::Exit(EXIT_FAILURE);
326 }
327 }
328
330 {
331 Chi::log.Log() << "\nFinal program time " << program_timer.GetTimeString();
333 << " ChiTech finished execution of "
335 }
336
337 return error_code;
338}
339
340// ###################################################################
341/** Exits the program appropriately.*/
342void Chi::Exit(int error_code) { MPI_Abort(mpi.comm, error_code); }
343
344// ###################################################################
345/** Gets the ChiTech-version string.*/
346std::string Chi::GetVersionStr() { return PROJECT_VERSION; }
347
348// ###################################################################
349/**Builds a `RegistryStatuses` structure*/
351{
353
354 const auto& object_factory = ChiObjectFactory::GetInstance();
355 for (const auto& [key, _] : object_factory.Registry())
356 stats.objfactory_keys_.push_back(key);
357
358 for (const auto& [key, _] : console.GetLuaFunctionRegistry())
359 stats.console_lua_func_keys_.push_back(key);
360
361 for (const auto& [key, _] : console.GetFunctionWrapperRegistry())
362 stats.console_lua_wrapper_keys_.push_back(key);
363
364 return stats;
365}
#define PROJECT_VERSION
static bool termination_posted_
Definition: chi_runtime.h:107
static void ParseArguments(int argc, char **argv)
Definition: chi_runtime.cc:82
static bool supress_beg_end_timelog_
Definition: chi_runtime.h:111
static bool sim_option_interactive_
Definition: chi_runtime.h:109
static bool dump_registry_
Definition: chi_runtime.h:113
static const std::string command_line_help_string_
Definition: chi_runtime.h:115
static bool allow_petsc_error_handler_
Definition: chi_runtime.h:110
static int InitPetSc(int argc, char **argv)
Definition: chi_runtime.cc:201
static std::string input_file_name_
Definition: chi_runtime.h:108
static bool suppress_color_
Definition: chi_runtime.h:112
static int RunBatch(int argc, char **argv)
Definition: chi_runtime.cc:285
static std::vector< chi_mesh::FFInterpPtr > field_func_interpolation_stack
Definition: chi_runtime.h:87
static std::vector< chi_physics::MaterialPtr > material_stack
Definition: chi_runtime.h:90
static std::vector< chi_physics::FieldFunctionPtr > field_function_stack
Definition: chi_runtime.h:92
static chi::Timer program_timer
Definition: chi_runtime.h:79
static std::vector< chi_physics::MultiGroupXSPtr > multigroup_xs_stack
Definition: chi_runtime.h:91
static std::vector< chi_mesh::MeshHandlerPtr > meshhandler_stack
Definition: chi_runtime.h:83
static std::vector< chi_math::AngularQuadraturePtr > angular_quadrature_stack
Definition: chi_runtime.h:94
static std::vector< chi_mesh::UnpartMeshPtr > unpartitionedmesh_stack
Definition: chi_runtime.h:88
static void Exit(int error_code)
Definition: chi_runtime.cc:342
static std::vector< ChiObjectPtr > object_stack
Definition: chi_runtime.h:96
static int RunInteractive(int argc, char **argv)
Definition: chi_runtime.cc:239
static chi::RegistryStatuses GetStatusOfRegistries()
Definition: chi_runtime.cc:350
static chi::ChiLog & log
Definition: chi_runtime.h:81
static std::vector< chi_mesh::SurfaceMeshPtr > surface_mesh_stack
Definition: chi_runtime.h:86
static std::string GetVersionStr()
Definition: chi_runtime.cc:346
static int Initialize(int argc, char **argv, MPI_Comm communicator)
Definition: chi_runtime.cc:173
static int current_mesh_handler
Definition: chi_runtime.h:84
static void Finalize()
Definition: chi_runtime.cc:216
static std::vector< chi_math::SpatialDiscretizationPtr > sdm_stack
Definition: chi_runtime.h:97
static chi::MPI_Info & mpi
Definition: chi_runtime.h:78
static chi::Console & console
Definition: chi_runtime.h:80
static std::vector< chi::PostProcessorPtr > postprocessor_stack
Definition: chi_runtime.h:98
void DumpRegister() const
Dumps the object registry to stdout.
static ChiObjectFactory & GetInstance() noexcept
LogStream LogAllError()
Definition: chi_log.h:239
void SetVerbosity(int int_level)
Definition: chi_log.cc:165
static ChiLog & GetInstance() noexcept
Definition: chi_log.cc:12
LogStream LogAll()
Definition: chi_log.h:237
LogStream Log(LOG_LVL level=LOG_0)
Definition: chi_log.cc:35
int ExecuteFile(const std::string &fileName, int argc, char **argv) const
std::vector< std::string > & GetCommandBuffer()
Definition: chi_console.h:131
void PostMPIInfo(int location_id, int number_of_processes) const
static Console & GetInstance() noexcept
void FlushConsole()
Flushes any commands in the command buffer.
const std::map< std::string, LuaFunctionRegistryEntry > & GetLuaFunctionRegistry() const
Definition: chi_console.h:134
void DumpRegister() const
Dumps the object registry to stdout.
void RunConsoleLoop(char *fileName=nullptr) const
const std::map< std::string, LuaFunctionRegistryEntry > & GetFunctionWrapperRegistry() const
Definition: chi_console.h:140
const MPI_Comm & comm
MPI communicator.
Definition: mpi_info.h:28
void Barrier() const
Definition: mpi_info.cc:38
static MPI_Info & GetInstance() noexcept
Definition: mpi_info.cc:10
void SetProcessCount(int in_process_count)
Definition: mpi_info.cc:31
void SetLocationID(int in_location_id)
Definition: mpi_info.cc:23
void SetCommunicator(MPI_Comm new_communicator)
Definition: mpi_info.cc:17
const int & process_count
Total number of processes.
Definition: mpi_info.h:27
static SystemWideEventPublisher & GetInstance()
void PublishEvent(const chi::Event &event) override
static std::string GetLocalDateTimeString()
Definition: chi_timer.cc:55
std::string GetTimeString() const
Definition: chi_timer.cc:38
void TimeSectionEnd()
Definition: TimingLog.cc:83
void TimeSectionBegin()
Definition: TimingLog.cc:78
TimingBlock & CreateTimingBlock(const std::string &name, const std::string &parent_name="")
Definition: TimingLog.cc:15
TimingBlock & GetTimingBlock(const std::string &name)
Definition: TimingLog.cc:63
int GetStandardEventCode(const std::string &event_name)
Definition: EventCodes.cc:7
std::vector< std::string > console_lua_func_keys_
Definition: chi_runtime.h:64
std::vector< std::string > objfactory_keys_
Definition: chi_runtime.h:63
std::vector< std::string > console_lua_wrapper_keys_
Definition: chi_runtime.h:65