R3BROOT
R3B analysis software
Loading...
Searching...
No Matches
neuland_cli.cxx
Go to the documentation of this file.
1#include "R3BException.h"
3#include "R3BNeulandAppOptionJson.h" // NOLINT
5#include "R3BNeulandSimApp.h"
6#include <CLI/CLI.hpp>
7#include <cstddef>
8#include <cstdlib>
9#include <exception>
10#include <fairlogger/Logger.h>
11#include <fmt/core.h>
12#include <memory>
13#ifdef HAS_MPI
14#include <mpi.h>
15#endif
16
17auto main(int argc, char** argv) -> int
18{
19 auto is_failed = false;
20 auto num_proc = 0;
21 auto num_rank = 0;
22
23#ifdef HAS_MPI
24 MPI_Init(&argc, &argv);
25 MPI_Comm_size(MPI_COMM_WORLD, &num_proc);
26 MPI_Comm_rank(MPI_COMM_WORLD, &num_rank);
27#endif
28
29 auto app = std::unique_ptr<R3B::Neuland::CLIAbstract>{};
30 try
31 {
32 auto program_options = CLI::App{ "Neuland command line interface" };
33
34 auto instantiate_app = [&app, &program_options](std::size_t)
35 {
36 if (program_options.got_subcommand("sim"))
37 {
38 app = std::make_unique<R3B::Neuland::SimulationApplication>();
39 app->setup_options(*program_options.get_subcommand("sim"));
40 return;
41 }
42 if (program_options.got_subcommand("ana"))
43 {
44 app = std::make_unique<R3B::Neuland::AnalysisApplication>();
45 app->setup_options(*program_options.get_subcommand("ana"));
46 return;
47 }
48 };
49
50 program_options.require_subcommand(1, 1);
51 program_options.add_subcommand("sim", "Run simulation application.")->preparse_callback(instantiate_app);
52 program_options.add_subcommand("ana", "Run analysis application.")->preparse_callback(instantiate_app);
53
54 CLI11_PARSE(program_options, argc, argv);
55
56 if (app == nullptr)
57 {
58 throw R3B::runtime_error("Application is not instantiated!");
59 }
60
61 app->post_parse();
62
63 if (app->has_print_default_options())
64 {
65 app->print_options();
66 return EXIT_SUCCESS;
67 }
68 if (app->has_dump())
69 {
70 app->dump_options();
71 return EXIT_SUCCESS;
72 }
73
74 app->set_rank_num(num_rank);
75 app->set_num_of_procs(num_proc);
76 app->init();
77 app->run();
78 }
79 catch (const std::exception& ex)
80 {
81 fmt::println("");
82 LOGP(error, "Exception ocurred: \n\n{}\n", ex.what());
83
84 if (app == nullptr)
85 {
86 return EXIT_FAILURE;
87 }
88
89 is_failed = true;
90 app->set_fail(is_failed);
91 }
92
93#ifdef HAS_MPI
94 MPI_Finalize();
95#endif
96
97 if (is_failed)
98 {
99 return EXIT_FAILURE;
100 }
101 return EXIT_SUCCESS;
102}
auto main(int argc, char **argv) -> int