BioCMAMC-ST
scalar_simulation.hpp
1#ifndef __SCALAR_SIMULATION_HPP__
2#define __SCALAR_SIMULATION_HPP__
3
4#include "common/traits.hpp"
5#include "mc/alias.hpp"
6#include <common/eigen_diag.hpp>
7EIGEN_DIAG_PUSH
8#include <Eigen/Core>
9#include <Eigen/Dense>
10#include <Eigen/Sparse>
11#include <kokkos_eigen.hpp>
13
14#include <Kokkos_Core.hpp>
15#include <common/common.hpp>
16#include <cstddef>
17#include <cstdint>
18#include <mc/traits.hpp>
19#include <simulation/mass_transfer.hpp>
20#include <span>
21#include <vector>
22
23namespace Simulation
24{
25 template <FloatingPointType ftype>
26 using FlowMatrixType = Eigen::SparseMatrix<ftype>;
29 {
32 Kokkos::LayoutLeft,
33 Kokkos::DefaultExecutionSpace>;
34
35 public:
37 using concentration_float_type = concentration_view_t::value_type;
38
39 ScalarSimulation(size_t n_compartments,
40 size_t n_species,
41 std::span<mass_balance_float_type> volume);
43 ScalarSimulation(ScalarSimulation&& other) noexcept = delete;
44 ScalarSimulation(const ScalarSimulation& other) noexcept = delete;
47 ~ScalarSimulation() = default;
48
49 bool
50 deep_copy_concentration(const std::vector<concentration_float_type>& data);
51
52 // void reduce_contribs(std::span<const mass_balance_float_type> data);
53
55
56 void performStepGL(
57 double d_t,
59 mtr,
61
62 void performStep(double d_t);
63
64 void synchro_sources();
65
66 // Getters
67
68 [[nodiscard]] std::size_t n_row() const noexcept;
69 [[nodiscard]] std::size_t n_col() const noexcept;
70
71 // Concentrations
72 [[nodiscard]] concentration_view_t get_concentration() noexcept;
73 [[nodiscard]] MC::KernelConcentrationType get_device_concentration() const;
74
75 [[nodiscard]] std::span<concentration_float_type> getConcentrationData();
76
77 [[nodiscard]] std::span<const concentration_float_type>
79
80 [[nodiscard]] auto getConcentrationArray() const;
81
82 //
83
84 [[nodiscard]] const KokkosEigen::Alias::DiagonalType<
86 getVolume() const noexcept;
87
88 [[deprecated]] [[nodiscard]] std::span<double const> volume_span() const;
89
90 double volume_at(std::size_t) const;
91
92 [[nodiscard]] std::span<const double> contribution_span() const;
93
94 [[nodiscard]] std::span<double> contribution_span_mut();
95
96 [[nodiscard]] MC::kernelContribution get_kernel_contribution() const;
97
98 // Setters
99
100 void set_mass();
101 // void set_kernel_contribs_to_host();
102 void set_feed(std::uint64_t i_r, std::uint64_t i_c, double val);
103 void set_sink(std::uint64_t i_compartment, double val);
104 void set_zero_contribs();
105 void setVolumes(std::span<const double> volumes,
106 std::span<const double> inv_volumes);
107
108 void clearNegs();
109
110 private:
111 std::size_t n_r;
112 std::size_t n_c;
114 KokkosEigen::Alias::ColMajorMatrixtype<mass_balance_float_type> total_mass;
115
117 Kokkos::LayoutLeft,
118 Kokkos::DefaultExecutionSpace>
120
121 // FIXME: Sources does not need to available on device because this is
122 // contribs which is scattered
124 Kokkos::LayoutRight,
125 Kokkos::DefaultExecutionSpace>
126 sources;
128 MC::kernelContribution contribs;
133 KokkosEigen::Alias::DiagonalType<mass_balance_float_type> sink;
134
135 // RowMajorEigenKokkos<double> sources;
136 //
137
138 // Kokkos::View<float**, ComputeSpace::array_layout, ComputeSpace> kc;
139 };
140
141 inline double
142 ScalarSimulation::volume_at(std::size_t index) const
143 {
144 KOKKOS_ASSERT(index < n_c);
145 return m_volumes.diagonal().coeff(EIGEN_INDEX(index));
146 }
147
148 inline auto
150 {
151 // return alloc_concentrations.array();
152 return concentrations.as_array();
153 }
154
157 {
158 // return sources.compute;
159 return contribs;
160 }
161
162 inline void
164 {
165
166 sources.eigen().setZero();
167 this->sink.setZero();
168 sources.host_to_device_sync();
169 Kokkos::deep_copy(contribs, 0);
170 }
171
172 // inline void
173 // ScalarSimulation::set_kernel_contribs_to_host()
174 // {
175 // // sources.update_compute_to_host();
176 // sources.device_to_host_sync();
177 // }
178
179 inline void
180 ScalarSimulation::set_feed(uint64_t i_r, uint64_t i_c, double val)
181 {
182 this->sources.eigen().coeffRef(EIGEN_INDEX(i_r), EIGEN_INDEX(i_c)) += val;
183 }
184
185 inline void
186 ScalarSimulation::set_sink(uint64_t i_compartment, double val)
187 {
188 this->sink.diagonal().coeffRef(EIGEN_INDEX(i_compartment)) += val;
189 }
190
193 {
194 return m_volumes;
195 }
196
197 inline std::span<double>
199 {
200 return this->concentrations.get_span();
201 }
202
203 inline std::span<const double>
205 {
206 return this->concentrations.get_span();
207 }
208
209 inline std::span<const double>
211 {
212 return this->sources.get_span();
213 }
214
215 inline std::span<double>
217 {
218 return this->sources.get_span();
219 }
220
221 [[deprecated]] inline std::span<double const>
223 {
224 return { m_volumes.diagonal().data(),
225 static_cast<size_t>(m_volumes.rows()) };
226 }
227
228 inline void
229 ScalarSimulation::setVolumes(std::span<const double> volumes,
230 std::span<const double> inv_volumes)
231 {
232 KOKKOS_ASSERT(volumes.size() == inv_volumes.size()
233 && volumes.size() == n_col() && "scalar:setvolume")
234 // SIGFAULT ?
235 this->m_volumes.diagonal() = Eigen::Map<const Eigen::VectorXd>(
236 volumes.data(), static_cast<int>(volumes.size()));
237
238 this->volumes_inverse.diagonal() = Eigen::Map<const Eigen::VectorXd>(
239 inv_volumes.data(), static_cast<int>(inv_volumes.size()));
240 }
241
242 inline ScalarSimulation*
243 makeScalarSimulation(size_t n_compartments,
244 size_t n_species,
245 std::span<double> volumes)
246 {
247 return new ScalarSimulation(n_compartments, n_species, volumes); // NOLINT
248 }
249
250} // namespace Simulation
251
252#endif //__SCALAR_SIMULATION_HPP__
Wraps a Kokkos 2D View as an Eigen matrix map.
Definition kokkos_eigen.hpp:52
Definition scalar_simulation.hpp:29
FlowMatrixType< mass_balance_float_type > m_transition
Definition scalar_simulation.hpp:128
bool deep_copy_concentration(const std::vector< concentration_float_type > &data)
Definition implScalar.cpp:293
concentration_view_t get_concentration() noexcept
Definition implScalar.cpp:176
concentration_t::host_view_type concentration_view_t
Definition scalar_simulation.hpp:35
ScalarSimulation operator=(const ScalarSimulation &other)=delete
MC::kernelContribution contribs
Definition scalar_simulation.hpp:127
KokkosEigen::Alias::DiagonalType< mass_balance_float_type > sink
Definition scalar_simulation.hpp:132
void performStep(double d_t)
Definition implScalar.cpp:251
void set_sink(std::uint64_t i_compartment, double val)
Definition scalar_simulation.hpp:186
void setVolumes(std::span< const double > volumes, std::span< const double > inv_volumes)
Definition scalar_simulation.hpp:229
MC::kernelContribution get_kernel_contribution() const
Definition scalar_simulation.hpp:156
ScalarSimulation(const ScalarSimulation &other) noexcept=delete
void set_feed(std::uint64_t i_r, std::uint64_t i_c, double val)
Definition scalar_simulation.hpp:180
std::size_t n_col() const noexcept
Definition implScalar.cpp:182
KokkosEigen::Alias::DiagonalType< mass_balance_float_type > volumes_inverse
Definition scalar_simulation.hpp:131
void set_zero_contribs()
Definition scalar_simulation.hpp:163
KokkosEigen::KokkosEigen2D< double, Kokkos::LayoutLeft, Kokkos::DefaultExecutionSpace > concentration_t
Definition scalar_simulation.hpp:30
KokkosEigen::Alias::ColMajorMatrixtype< mass_balance_float_type > total_mass
Definition scalar_simulation.hpp:113
double volume_at(std::size_t) const
Definition scalar_simulation.hpp:142
std::span< double > contribution_span_mut()
Definition scalar_simulation.hpp:216
void set_transition(CmaUtils::StateCooMatrixType &&transition)
Definition implScalar.cpp:316
std::size_t n_r
Definition scalar_simulation.hpp:110
MC::KernelConcentrationType get_device_concentration() const
Definition implScalar.cpp:208
KokkosEigen::KokkosEigen2D< mass_balance_float_type, Kokkos::LayoutRight, Kokkos::DefaultExecutionSpace > sources
Definition scalar_simulation.hpp:125
concentration_view_t::value_type concentration_float_type
Definition scalar_simulation.hpp:36
KokkosEigen::Alias::DiagonalType< mass_balance_float_type > m_volumes
Definition scalar_simulation.hpp:130
std::size_t n_row() const noexcept
Definition implScalar.cpp:188
std::span< const double > contribution_span() const
Definition scalar_simulation.hpp:210
void performStepGL(double d_t, const KokkosEigen::Alias::ColMajorMatrixtype< mass_balance_float_type > &mtr, MassTransfer::Sign sign)
Definition implScalar.cpp:229
void clearNegs()
Definition implScalar.cpp:267
KokkosEigen::KokkosEigen2D< mass_balance_float_type, Kokkos::LayoutLeft, Kokkos::DefaultExecutionSpace > concentrations
Definition scalar_simulation.hpp:118
const KokkosEigen::Alias::DiagonalType< mass_balance_float_type > & getVolume() const noexcept
Definition scalar_simulation.hpp:192
ScalarSimulation(size_t n_compartments, size_t n_species, std::span< mass_balance_float_type > volume)
Definition implScalar.cpp:142
std::span< double const > volume_span() const
Definition scalar_simulation.hpp:222
ScalarSimulation operator=(ScalarSimulation &&other)=delete
auto getConcentrationArray() const
Definition scalar_simulation.hpp:149
void synchro_sources()
Definition implScalar.cpp:194
void set_mass()
Definition implScalar.cpp:310
std::size_t n_c
Definition scalar_simulation.hpp:111
std::span< concentration_float_type > getConcentrationData()
Definition scalar_simulation.hpp:198
::rust::Box<::CooMatrixWrap > StateCooMatrixType
Opaque type for Naive COO matrix.
Definition alias.hpp:26
Definition impl_mtr.cpp:16
Eigen::DiagonalMatrix< ftype, CompileMatrixSizeEigen > DiagonalType
Template type for eigen diagonal object.
Definition kokkos_eigen.hpp:225
MatrixType< Kokkos::LayoutLeft, ftype > ColMajorMatrixtype
Template type for colmajor eigen matrix object.
Definition kokkos_eigen.hpp:245
Definition kokkos_eigen.hpp:11
Namespace that contains classes and structures related to Monte Carlo (MC) simulations.
Definition alias.hpp:16
Kokkos::View< float **, Kokkos::LayoutLeft, MC::ComputeSpace, kernelMT > kernelContribution
Definition alias.hpp:160
Sign
Definition mass_transfer.hpp:44
Namespace that contains classes and structures related to simulation handling.
Definition host_specific.hpp:12
Eigen::SparseMatrix< ftype > FlowMatrixType
Definition scalar_simulation.hpp:26
double mass_balance_float_type
Definition scalar_simulation.hpp:27
ScalarSimulation * makeScalarSimulation(size_t n_compartments, size_t n_species, std::span< double > volumes)
Definition scalar_simulation.hpp:243