BioCMAMC-ST
domain.hpp
1#ifndef __MC_REACTORDOMAIN_HPP__
2#define __MC_REACTORDOMAIN_HPP__
3
4#include <Kokkos_Core.hpp>
5#include <cassert>
6#include <common/common.hpp>
7#include <cstddef>
8#include <cstdint>
9#include <mc/alias.hpp>
10#include <mc/traits.hpp>
11#include <span>
12#include <type_traits>
13
14namespace MC
15{
16
18 {
19 std::size_t index;
20 double flow;
21 };
22
23 template <typename ExecSpace, bool is_const = true> struct MoveInfo
24 {
25 // Kokkos::View<std::size_t**, Kokkos::LayoutRight, ExecSpace> neighbors;
31
32 // template <bool B = is_const>
33 // requires(!B)
34 // explicit MoveInfo() : MoveInfo(0, 0)
35 // {
36 // }
37
38 // template <bool B = is_const>
39 // requires(B)
40 // explicit MoveInfo()
41 // {
42 // }
43
44 // template <bool B = is_const>
45 // requires(!B)
46 // explicit MoveInfo(const std::size_t n_compartments, const std::size_t
47 // n_flows)
48 // : neighbors("neighbors", 0, 0),
49 // diag_transition("diag_transition", n_compartments),
50 // leaving_flow("leaving_flow", n_flows),
51 // liquid_volume("liquid_volume", n_compartments)
52
53 // {
54 // }
55 };
56
76 {
77 public:
78 using n_cells_view_type = Kokkos::View<uint64_t*, ComputeSpace>;
79 ReactorDomain(const ReactorDomain&) = delete;
81
87
91 ReactorDomain(ReactorDomain&& other) noexcept = default;
92
96 explicit ReactorDomain(std::span<double> volumes);
97
98 ReactorDomain(double total_volume, std::size_t size);
99
104 ~ReactorDomain() = default;
105
110 ReactorDomain& operator=(ReactorDomain&& other) noexcept;
111
112 void update(std::span<const double> newliquid_volume,
113 std::span<const std::size_t> neighors_flat,
114 std::span<const double> out_flows,
115 std::span<const double> proba_flat);
116
117 void set_leaving_flow(std::size_t i, std::size_t i_flow, double flow) const;
118
119 void init_inner(const std::size_t n_flows);
120
122 {
123 return {inner.neighbors,
124 inner.diag_transition,
125 inner.cumulative_probability,
126 inner.leaving_flow,
127 inner.liquid_volume};
128 }
129
133 [[nodiscard]] size_t getNumberCompartments() const noexcept;
134
138 [[nodiscard]] double getTotalVolume() const noexcept;
139
143 // [[nodiscard]] NeighborsView<ComputeSpace, true> getNeighbors() const;
144
145 template <class Archive> void save(Archive& ar) const
146 {
147
148 ar(id, size, _total_volume);
149 }
150
151 template <class Archive> void load(Archive& ar)
152 {
153 ar(id, size, _total_volume);
154 }
156
157 private:
158 double _total_volume = 0.;
159 size_t id = 0;
160 size_t size = 0;
161
165 void setVolumes(std::span<double const> volumes_liq);
166
170
171 void setLiquidNeighbors(std::size_t e1,
172 std::size_t e2,
173 std::span<const size_t> flat_data);
174 };
175
176 // inline NeighborsView<ComputeSpace, true> ReactorDomain::getNeighbors() const
177 // {
178 // return this->inner.neighbors;
179 // }
180
181 inline size_t ReactorDomain::getNumberCompartments() const noexcept
182 {
183 return size;
184 }
185
186 inline double ReactorDomain::getTotalVolume() const noexcept
187 {
188 return this->_total_volume;
189 }
190
191} // namespace MC
192
193#endif //__MC_REACTORDOMAIN_HPP__
void update(std::span< const double > newliquid_volume, std::span< const std::size_t > neighors_flat, std::span< const double > out_flows, std::span< const double > proba_flat)
Definition domain.cpp:45
double _total_volume
Domain total volume.
Definition domain.hpp:158
void set_leaving_flow(std::size_t i, std::size_t i_flow, double flow) const
Definition domain.cpp:96
ReactorDomain & operator=(const ReactorDomain &)=delete
~ReactorDomain()=default
Default destructor.
Kokkos::View< uint64_t *, ComputeSpace > n_cells_view_type
Definition domain.hpp:78
void load(Archive &ar)
Definition domain.hpp:151
MoveInfo< ComputeSpace, true > get_const_inner()
Definition domain.hpp:121
double getTotalVolume() const noexcept
Return total volume of domain.
Definition domain.hpp:186
ReactorDomain()
Default constructor.
Definition domain.cpp:30
void setLiquidNeighbors(std::size_t e1, std::size_t e2, std::span< const size_t > flat_data)
Update neigbors of compartments.
Definition domain.cpp:79
size_t size
Number of compartment.
Definition domain.hpp:160
void save(Archive &ar) const
Return a const reference to neighbors.
Definition domain.hpp:145
MoveInfo< ComputeSpace, false > inner
Definition domain.hpp:155
void setVolumes(std::span< double const > volumes_liq)
Set volume of liquid and gas of each compartment.
Definition domain.cpp:12
ReactorDomain(const ReactorDomain &)=delete
size_t getNumberCompartments() const noexcept
Return the number of compartment in the domain.
Definition domain.hpp:181
void init_inner(const std::size_t n_flows)
Definition domain.cpp:114
ReactorDomain(ReactorDomain &&other) noexcept=default
Move constructor.
Namespace that contains classes and structures related to Monte Carlo (MC) simulations.
Definition alias.hpp:15
std::conditional_t< is_const, Kokkos::View< const std::size_t **, Kokkos::LayoutRight, ExecSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > >, Kokkos::View< std::size_t **, Kokkos::LayoutRight, ExecSpace > > NeighborsView
Definition alias.hpp:142
std::conditional_t< is_const, Kokkos::View< const double *, ExecSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > >, Kokkos::View< double *, ExecSpace > > VolumeView
Definition alias.hpp:110
std::conditional_t< is_const, Kokkos::View< const LeavingFlow *, Kokkos::SharedHostPinnedSpace >, Kokkos::View< LeavingFlow *, Kokkos::SharedHostPinnedSpace > > LeavingFlowView
Definition alias.hpp:127
std::conditional_t< is_const, Kokkos::View< const double **, Kokkos::LayoutRight, ExecSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > >, Kokkos::View< double **, Kokkos::LayoutRight, ExecSpace > > CumulativeProbabilityView
Definition alias.hpp:133
std::conditional_t< is_const, Kokkos::View< const double *, Kokkos::LayoutLeft, ExecSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > >, Kokkos::View< double *, Kokkos::LayoutLeft, ExecSpace > > DiagonalView
Definition alias.hpp:118
Definition domain.hpp:18
std::size_t index
Definition domain.hpp:19
double flow
Definition domain.hpp:20
Definition domain.hpp:24
DiagonalView< ExecSpace, is_const > diag_transition
Definition domain.hpp:27
VolumeView< ExecSpace, is_const > liquid_volume
Definition domain.hpp:30
MC::NeighborsView< ExecSpace, is_const > neighbors
Definition domain.hpp:26
CumulativeProbabilityView< ExecSpace, is_const > cumulative_probability
Definition domain.hpp:28
LeavingFlowView< is_const > leaving_flow
Definition domain.hpp:29