BioCMAMC-ST
mcinit.hpp
1#ifndef __MC_INIT_HPP__
2#define __MC_INIT_HPP__
3
4#include <biocma_cst_config.hpp>
5#include <cassert>
6#include <common/execinfo.hpp>
7#include <common/logger.hpp>
8#include <cstdint>
9#include <mc/domain.hpp>
10#include <mc/particles_container.hpp>
11#include <mc/traits.hpp>
12#include <mc/unit.hpp>
13#include <memory>
14#include <span>
15#include <stdexcept>
16#include <utility>
17
18namespace MC
19{
20
21 void impl_init(double& total_mass,
22 uint64_t n_particles,
23 MonteCarloUnit& unit,
24 AutoGenerated::ContainerVariant&& container,
25 bool uniform_init);
40 template <ModelType Model>
41 std::unique_ptr<MonteCarloUnit>
42 init(const std::shared_ptr<IO::Logger>& _logger,
43 uint64_t n_particles,
44 std::span<double> volumes,
45 const NeighborsView<HostSpace>& neighbors,
46 bool uniform_mc_init,
47 double& total_mass)
48 {
49 if constexpr (ConstWeightModelType<Model>)
50 {
51 if (_logger)
52 {
53 _logger->print(
54 "Model",
55 "Const Weights"); // TODO Add model's name to trait (optional)
56 }
57 }
58
59 auto unit = std::make_unique<MonteCarloUnit>();
60 unit->domain = ReactorDomain(volumes, neighbors);
61 // bool flag_virtual = unit->domain.getNumberCompartments() == 1;
62 auto container = ParticlesContainer<Model>(n_particles);
63 try
64 {
65 impl_init(total_mass,
66 n_particles,
67 *unit,
68 std::move(container),
69 uniform_mc_init);
70 }
71 catch (const std::runtime_error& e)
72 {
73 return nullptr;
74 }
75
76 return unit;
77 }
78
79 void post_init_weight(std::unique_ptr<MonteCarloUnit>& unit,
80 double x0,
81 double total_mass);
82
83} // namespace MC
84
85#endif //__MC_INIT_HPP__
Main owning object for Monte-Carlo particles.
Definition particles_container.hpp:26
Represents the spatial domain where Monte Carlo particles can exist.
Definition domain.hpp:40
Concept to check if a model type has uniform_weight
Definition traits.hpp:196
Namespace that contains classes and structures related to Monte Carlo (MC) simulations.
Definition alias.hpp:9
std::unique_ptr< MonteCarloUnit > init(const std::shared_ptr< IO::Logger > &_logger, uint64_t n_particles, std::span< double > volumes, const NeighborsView< HostSpace > &neighbors, bool uniform_mc_init, double &total_mass)
Helper function to initialize a MonteCarloUnit.
Definition mcinit.hpp:42
void impl_init(double &total_mass, uint64_t n_particles, MonteCarloUnit &unit, AutoGenerated::ContainerVariant &&container, bool uniform_init)
Definition unit.cpp:229
void post_init_weight(std::unique_ptr< MonteCarloUnit > &unit, double x0, double total_mass)
Definition unit.cpp:194
Kokkos::View< std::size_t **, Kokkos::LayoutRight, Space, Kokkos::MemoryTraits< Kokkos::RandomAccess > > NeighborsView
Definition domain.hpp:15
General-purpose Monte Carlo unit to carry out simulations.
Definition unit.hpp:83