BioCMAMC-ST
mcinit.hpp
1#ifndef __MC_INIT_HPP__
2#define __MC_INIT_HPP__
3
4#include "mc/prng/prng.hpp"
5#include <biocma_cst_config.hpp>
6#include <cassert>
7#include <common/execinfo.hpp>
8#include <common/logger.hpp>
9#include <cstdint>
10#include <mc/domain.hpp>
11#include <mc/particles_container.hpp>
12#include <mc/traits.hpp>
13#include <mc/unit.hpp>
14#include <memory>
15#include <span>
16#include <stdexcept>
17#include <utility>
18
19namespace
20{
21 template <ModelType Model>
22 void
23 log_model_info(const std::shared_ptr<IO::Logger>& _logger)
24 {
25 if constexpr (ConstWeightModelType<Model>)
26 {
27 if (_logger)
28 {
29 if constexpr (has_name<Model>)
30 {
31 _logger->print("Model", IO::format(Model::name, " Const Weights"));
32 }
33 else
34 {
35 _logger->print("Model", "Const Weights");
36 }
37 }
38 }
39 }
40} // namespace
41
42namespace MC
43{
44
45 void impl_init(const ExecInfo& info,
46
47 double& total_mass,
48 uint64_t n_particles,
49 MonteCarloUnit& unit,
50 AutoGenerated::ContainerVariant&& container,
51 bool uniform_init);
52
53 void post_init_weight(std::unique_ptr<MonteCarloUnit>& unit,
54 double x0,
55 double total_mass);
70 template <ModelType Model>
71 std::unique_ptr<MonteCarloUnit>
72 init(const std::shared_ptr<IO::Logger>& _logger,
73 const ExecInfo& info,
74 uint64_t n_particles,
75 std::size_t seed,
76 std::span<double> volumes,
77 std::span<const size_t> _neighbors,
78 bool uniform_mc_init,
79 double& total_mass)
80 {
81 (void)_neighbors; // TODO remove
82 log_model_info<Model>(_logger);
83
84 auto unit = std::make_unique<MonteCarloUnit>();
85 unit->domain = ReactorDomain(volumes);
86 unit->rng = KPRNG(seed);
87
88 ParticlesContainer<Model> container(load_tuning_constant(), n_particles);
89 try
90 {
91 impl_init(info,
92 total_mass,
93 n_particles,
94 *unit,
95 std::move(container),
96 uniform_mc_init);
97 }
98 catch (const std::runtime_error& e)
99 {
100
101 if (_logger)
102 {
103 _logger->error(e.what());
104 }
105
106 return nullptr;
107 }
108
109 return unit;
110 }
111
112} // namespace MC
113
114#endif //__MC_INIT_HPP__
Utilities and wrap around kokkos random generator.
Definition prng.hpp:76
Main owning object for Monte-Carlo particles.
Definition particles_container.hpp:57
Represents the spatial domain where Monte Carlo particles can exist.
Definition domain.hpp:56
Concept to check if a model type has uniform_weight
Definition traits.hpp:203
Definition traits.hpp:53
std::string format(MsgType &&... msgs)
Definition logger.hpp:160
Namespace that contains classes and structures related to Monte Carlo (MC) simulations.
Definition alias.hpp:16
void impl_init(const ExecInfo &info, double &total_mass, uint64_t n_particles, MonteCarloUnit &unit, AutoGenerated::ContainerVariant &&container, bool uniform_init)
Definition unit.cpp:261
RuntimeParameters load_tuning_constant()
Definition unit.cpp:312
std::unique_ptr< MonteCarloUnit > init(const std::shared_ptr< IO::Logger > &_logger, const ExecInfo &info, uint64_t n_particles, std::size_t seed, std::span< double > volumes, std::span< const size_t > _neighbors, bool uniform_mc_init, double &total_mass)
Helper function to initialize a MonteCarloUnit.
Definition mcinit.hpp:72
void post_init_weight(std::unique_ptr< MonteCarloUnit > &unit, double x0, double total_mass)
Definition unit.cpp:234
Definition execinfo.hpp:21
General-purpose Monte Carlo unit to carry out simulations.
Definition unit.hpp:34