BioCMAMC-ST
scalar_simulation.hpp
1#ifndef __SCALAR_SIMULATION_HPP__
2#define __SCALAR_SIMULATION_HPP__
3
4#ifndef NDEBUG
5# pragma GCC diagnostic push
6# pragma GCC diagnostic ignored "-Wunused-but-set-variable"
7# pragma GCC diagnostic ignored "-Wnan-infinity-disabled"
8#endif
9#include <Eigen/Core>
10#include <Eigen/Dense>
11#include <Eigen/Sparse>
12#ifndef NDEBUG
13# pragma GCC diagnostic pop
14#endif
15#include <Kokkos_Core.hpp>
16#include <common/common.hpp>
17#include <cstddef>
18#include <cstdint>
19#include <eigen_kokkos.hpp>
20#include <mc/traits.hpp>
21#include <simulation/alias.hpp>
22#include <simulation/mass_transfer.hpp>
23#include <span>
24#include <vector>
25
26using FlowMatrixType = Eigen::SparseMatrix<double>;
27
28namespace Simulation
29{
30
32 {
33 public:
34 ScalarSimulation(size_t n_compartments,
35 size_t n_species,
36 std::span<double> volume);
37
38 ScalarSimulation(ScalarSimulation&& other) noexcept = delete;
39 ScalarSimulation(const ScalarSimulation& other) noexcept = delete;
42 ~ScalarSimulation() = default;
43
44 bool deep_copy_concentration(const std::vector<double>& data);
45
46 void reduce_contribs(std::span<const double> data);
47
49
50 void performStepGL(double d_t,
51 const ColMajorMatrixtype<double>& mtr,
53
54 void performStep(double d_t);
55
56 void synchro_sources();
57
58 // void performStep(double d_t, const FlowMatrixType& m_transition);
59
60 // Getters
61 [[nodiscard]] ColMajorMatrixtype<double>& get_concentration();
62 [[nodiscard]] ColMajorKokkosScalarMatrix<double>
64
65 [[nodiscard]] std::span<double const> volume_span() const;
66
67 [[nodiscard]] std::span<double> contribution_span() const;
68
69 [[nodiscard]] std::span<double> contribution_span_mut();
70 [[nodiscard]] const DiagonalType& getVolume() const;
71 [[nodiscard]] auto getConcentrationArray() const;
72 [[nodiscard]] kernelContribution get_kernel_contribution() const;
73 [[nodiscard]] const ColMajorMatrixtype<double>& get_mass_transfer() const;
74 [[nodiscard]] std::span<double> getConcentrationData();
75
76 [[nodiscard]] std::size_t n_row() const noexcept;
77 [[nodiscard]] std::size_t n_col() const noexcept;
78
79 // Setters
80
81 void set_mass();
82 void set_kernel_contribs_to_host() const;
83 void set_feed(std::uint64_t i_r, std::uint64_t i_c, double val);
84 void set_sink(std::uint64_t i_compartment, double val);
85 void set_zero_contribs();
86 void setVolumes(std::span<const double> volumes,
87 std::span<const double> inv_volumes);
88
89 private:
90 std::size_t n_r;
91 std::size_t n_c;
92 ColMajorMatrixtype<double> total_mass;
93 kernelContribution contribs;
94
95 FlowMatrixType m_transition;
96
97 DiagonalType volumes_inverse;
98 DiagonalType m_volumes;
99 DiagonalType sink;
100 EigenKokkos<double> concentrations;
101 RowMajorEigenKokkos<double> sources;
102 };
103
105 {
106 // return alloc_concentrations.array();
107 return concentrations.eigen_data.array();
108 }
109
110 inline kernelContribution ScalarSimulation::get_kernel_contribution() const
111 {
112 // return sources.compute;
113 return contribs;
114 }
115
117 {
118 sources.eigen_data.setZero();
119 Kokkos::deep_copy(contribs, 0);
120 Kokkos::deep_copy(sources.compute, 0);
121 this->sink.setZero();
122 }
123
125 {
126 sources.update_compute_to_host();
127 }
128
129 inline void ScalarSimulation::set_feed(uint64_t i_r, uint64_t i_c, double val)
130 {
131 this->sources.eigen_data.coeffRef(EIGEN_INDEX(i_r), EIGEN_INDEX(i_c)) +=
132 val;
133 }
134
135 inline void ScalarSimulation::set_sink(uint64_t i_compartment, double val)
136 {
137 this->sink.diagonal().coeffRef(EIGEN_INDEX(i_compartment)) += val;
138 }
139
140 inline const DiagonalType& ScalarSimulation::getVolume() const
141 {
142 return m_volumes;
143 }
144
145 inline std::span<double> ScalarSimulation::getConcentrationData()
146 {
147 return this->concentrations.get_span();
148 }
149
150 inline std::span<double> ScalarSimulation::contribution_span() const
151 {
152 return {this->sources.host.data(),
153 static_cast<size_t>(this->sources.host.size())};
154 }
155
157 {
158 return {this->sources.host.data(),
159 static_cast<size_t>(this->sources.host.size())};
160 }
161
162 inline std::span<double const> ScalarSimulation::volume_span() const
163 {
164 return {m_volumes.diagonal().data(), static_cast<size_t>(m_volumes.rows())};
165 }
166
167 inline void ScalarSimulation::setVolumes(std::span<const double> volumes,
168 std::span<const double> inv_volumes)
169 {
170 KOKKOS_ASSERT(volumes.size() == inv_volumes.size() &&
171 volumes.size() == n_col() && "scalar:setvolume")
172 // SIGFAULT ?
173 this->m_volumes.diagonal() = Eigen::Map<const Eigen::VectorXd>(
174 volumes.data(), static_cast<int>(volumes.size()));
175
176 this->volumes_inverse.diagonal() = Eigen::Map<const Eigen::VectorXd>(
177 inv_volumes.data(), static_cast<int>(inv_volumes.size()));
178 }
179
180 inline ScalarSimulation* makeScalarSimulation(size_t n_compartments,
181 size_t n_species,
182 std::span<double> volumes)
183 {
184 return new ScalarSimulation(n_compartments, n_species, volumes); // NOLINT
185 }
186
187} // namespace Simulation
188
189#endif //__SCALAR_SIMULATION_HPP__
Definition scalar_simulation.hpp:32
ScalarSimulation(ScalarSimulation &&other) noexcept=delete
ScalarSimulation operator=(const ScalarSimulation &other)=delete
void performStepGL(double d_t, const ColMajorMatrixtype< double > &mtr, MassTransfer::Sign sign)
Definition implScalar.cpp:169
void performStep(double d_t)
Definition implScalar.cpp:185
void set_sink(std::uint64_t i_compartment, double val)
Definition scalar_simulation.hpp:135
void setVolumes(std::span< const double > volumes, std::span< const double > inv_volumes)
Definition scalar_simulation.hpp:167
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:129
std::size_t n_col() const noexcept
Definition implScalar.cpp:151
EigenKokkos< double > concentrations
Definition scalar_simulation.hpp:100
std::span< double > contribution_span() const
Definition scalar_simulation.hpp:150
void set_zero_contribs()
Definition scalar_simulation.hpp:116
kernelContribution contribs
Definition scalar_simulation.hpp:93
const DiagonalType & getVolume() const
Definition scalar_simulation.hpp:140
std::span< double > contribution_span_mut()
Definition scalar_simulation.hpp:156
void set_transition(CmaUtils::StateCooMatrixType &&transition)
Definition implScalar.cpp:218
DiagonalType volumes_inverse
Definition scalar_simulation.hpp:97
std::size_t n_r
Definition scalar_simulation.hpp:90
bool deep_copy_concentration(const std::vector< double > &data)
Definition implScalar.cpp:199
ColMajorMatrixtype< double > & get_concentration()
Definition implScalar.cpp:140
ScalarSimulation(size_t n_compartments, size_t n_species, std::span< double > volume)
Definition implScalar.cpp:102
void reduce_contribs(std::span< const double > data)
Definition implScalar.cpp:161
std::size_t n_row() const noexcept
Definition implScalar.cpp:156
const ColMajorMatrixtype< double > & get_mass_transfer() const
FlowMatrixType m_transition
Definition scalar_simulation.hpp:95
kernelContribution get_kernel_contribution() const
Definition scalar_simulation.hpp:110
std::span< double const > volume_span() const
Definition scalar_simulation.hpp:162
ColMajorKokkosScalarMatrix< double > get_device_concentration() const
Definition implScalar.cpp:146
ScalarSimulation operator=(ScalarSimulation &&other)=delete
auto getConcentrationArray() const
Definition scalar_simulation.hpp:104
void synchro_sources()
Definition implScalar.cpp:134
void set_mass()
Definition implScalar.cpp:212
RowMajorEigenKokkos< double > sources
Definition scalar_simulation.hpp:101
ColMajorMatrixtype< double > total_mass
Definition scalar_simulation.hpp:92
std::size_t n_c
Definition scalar_simulation.hpp:91
void set_kernel_contribs_to_host() const
Definition scalar_simulation.hpp:124
std::span< double > getConcentrationData()
Definition scalar_simulation.hpp:145
DiagonalType m_volumes
Definition scalar_simulation.hpp:98
DiagonalType sink
Definition scalar_simulation.hpp:99
::rust::Box<::CooMatrixWrap > StateCooMatrixType
Opaque type for Naive COO matrix.
Definition alias.hpp:26
Sign
Definition mass_transfer.hpp:44
Namespace that contains classes and structures related to simulation handling.
Definition host_specific.hpp:14
ScalarSimulation * makeScalarSimulation(size_t n_compartments, size_t n_species, std::span< double > volumes)
Definition scalar_simulation.hpp:180