ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
Loading...
Searching...
No Matches
simulation.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <ryujin/base/compile_time_options.h>
21
22#include <memory>
23
24namespace ryujin
25{
40 template <typename HD, typename PD, int dim, typename Number = double>
41 requires Concept::HyperbolicDescription<HD, dim, Number> &&
42 Concept::ParabolicDescription<PD, HD, dim, Number>
43 class Simulation final : public Interface::Simulation<dim, Number>
44 {
45 public:
50
51 using HyperbolicSystem = typename HD::HyperbolicSystem;
52 using ParabolicSystem = typename PD::ParabolicSystem;
54 typename HD::template HyperbolicModule<dim, Number>;
56 typename PD::template ParabolicModule<HD, dim, Number>;
57
59
63
67 Simulation(const MPI_Comm &mpi_comm)
68 {
70
71 int n_ensembles = 1;
72 if constexpr (has_n_mpi_ensembles_v<HD>)
73 n_ensembles = HD::n_mpi_ensembles();
74
75 this->mpi_ensemble_ =
76 std::make_unique<MPIEnsemble>(mpi_comm, n_ensembles);
77 const auto &mpi_ensemble = *this->mpi_ensemble_;
78
79 hyperbolic_system_container_ =
80 std::make_unique<MPIEnsembleContainer<HyperbolicSystem>>(
81 mpi_ensemble, "/B - Equation");
82 const HyperbolicSystem &hyperbolic_system =
83 hyperbolic_system_container_->get();
84 this->hyperbolic_system_ = &hyperbolic_system;
85
86 parabolic_system_container_ =
87 std::make_unique<MPIEnsembleContainer<ParabolicSystem>>(
88 mpi_ensemble, "/B - Equation");
89 const ParabolicSystem &parabolic_system =
90 parabolic_system_container_->get();
91 this->parabolic_system_ = &parabolic_system;
92
93 this->discretization_ = std::make_unique<Discretization<dim>>(
94 mpi_ensemble, "/C - Discretization");
95
96 this->offline_data_ = std::make_unique<OfflineData<dim, Number>>(
97 mpi_ensemble, *this->discretization_, "/D - OfflineData");
98 const auto &offline_data = *this->offline_data_;
99
100 initial_values_container_ = std::make_unique<
102 mpi_ensemble,
103 "/E - InitialValues",
104 mpi_ensemble,
105 offline_data,
106 hyperbolic_system,
107 parabolic_system);
108 const InitialValues<HD, dim, Number> &initial_values =
109 initial_values_container_->get();
110 this->initial_values_ = &initial_values;
111
112 auto hyperbolic_module =
113 std::make_unique<HyperbolicModule>(mpi_ensemble,
114 offline_data,
115 hyperbolic_system,
116 initial_values,
117 "/F - HyperbolicModule");
118 const auto &initial_precomputed =
119 hyperbolic_module->initial_precomputed();
120 this->hyperbolic_module_ = std::move(hyperbolic_module);
121
122 this->parabolic_module_ =
123 std::make_unique<ParabolicModule>(mpi_ensemble,
124 offline_data,
125 hyperbolic_system,
126 parabolic_system,
127 initial_values,
128 "/G - ParabolicModule");
129
130 this->time_integrator_ = std::make_unique<TimeIntegrator<dim, Number>>(
131 mpi_ensemble,
132 hyperbolic_system,
133 parabolic_system,
134 *this->hyperbolic_module_,
135 *this->parabolic_module_,
136 "/H - TimeIntegrator");
137
138 this->postprocessor_ =
139 std::make_unique<Postprocessor<HD, dim, Number>>(offline_data,
140 hyperbolic_system,
141 parabolic_system,
142 initial_precomputed);
143
144 this->solution_transfer_ =
145 std::make_unique<SolutionTransfer<HD, dim, Number>>(
146 mpi_ensemble,
147 *this->discretization_,
148 offline_data,
149 hyperbolic_system,
150 parabolic_system,
151 "/F - HyperbolicModule");
152 }
153
158 ~Simulation() override
159 {
161 this->solution_transfer_.reset();
162 this->postprocessor_.reset();
163 this->time_integrator_.reset();
164 this->parabolic_module_.reset();
165 this->hyperbolic_module_.reset();
166 this->initial_values_ = nullptr;
167 initial_values_container_.reset();
168 this->offline_data_.reset();
169 this->discretization_.reset();
170 this->parabolic_system_ = nullptr;
171 parabolic_system_container_.reset();
172 this->hyperbolic_system_ = nullptr;
173 hyperbolic_system_container_.reset();
174 this->mpi_ensemble_.reset();
175 }
176
178
182
192 void prepare(TaskContext<Number> &context) override
193 {
194 auto &mpi_ensemble = *this->mpi_ensemble_;
195 auto &discretization = *this->discretization_;
196 auto &state_vector = this->state_vector_;
197
198 if (!discretization.has_triangulation()) {
199 if (mpi_ensemble.n_ensembles() > 1)
200 context.info("setting up MPI ensemble");
201 context.info("creating mesh and interpolating initial values");
202 discretization.prepare(mpi_ensemble.base_name(context.base_name));
203 }
204
205 context.info("preparing compute kernels");
206 discretization.update_mapping();
207 this->offline_data_->prepare(
208 this->hyperbolic_module_->problem_dimension(),
209 this->hyperbolic_module_->n_precomputed_values());
210 this->hyperbolic_module_->prepare();
211 this->parabolic_module_->prepare();
212 this->time_integrator_->prepare();
213
214 this->hyperbolic_module_->reinit_state_vector(state_vector);
215 this->parabolic_module_->reinit_state_vector(state_vector);
216
217 auto &solution_transfer = *this->solution_transfer_;
218
219 if (solution_transfer.has_handle()) {
220 /* project the state vector if solution_transfer contains a handle: */
221 solution_transfer.project(state_vector);
222 solution_transfer.reset_handle();
223
224 } else {
225 /* Otherwise interpolate initial values: */
227 "time step [X] - interpolate data vectors");
228 state_vector.state =
229 this->initial_values_->interpolate_hyperbolic_vector();
230 }
231
232 debug_poison_invalid_values(state_vector, *this->offline_data_);
233
234 /* Prepare the state vector for time stepping. */
235 this->time_integrator_->prepare_state_vector(state_vector, context.t);
236 }
237
242 void execute(TaskContext<Number> &context) override
243 {
244 auto &state_vector = this->state_vector_;
245
246 context.tau = this->time_integrator_->step(
247 state_vector, context.t, Number(0.), context.t_max - context.t);
248
249 this->time_integrator_->prepare_state_vector(state_vector,
250 context.t + context.tau);
251 }
252
254
255 private:
260
261 std::unique_ptr<MPIEnsembleContainer<HyperbolicSystem>>
262 hyperbolic_system_container_;
263 std::unique_ptr<MPIEnsembleContainer<ParabolicSystem>>
264 parabolic_system_container_;
265 std::unique_ptr<MPIEnsembleContainer<InitialValues<HD, dim, Number>>>
266 initial_values_container_;
267
269 };
270} // namespace ryujin
std::unique_ptr< ParabolicModule< dim, Number > > parabolic_module_
Definition simulation.h:139
std::unique_ptr< MPIEnsemble > mpi_ensemble_
Definition simulation.h:125
std::unique_ptr< Discretization< dim > > discretization_
Definition simulation.h:126
std::unique_ptr< TimeIntegrator< dim, Number > > time_integrator_
Definition simulation.h:140
const ParabolicSystem * parabolic_system_
Definition simulation.h:135
std::unique_ptr< Postprocessor< dim, Number > > postprocessor_
Definition simulation.h:141
const InitialValues< dim, Number > * initial_values_
Definition simulation.h:136
std::unique_ptr< OfflineData< dim, Number > > offline_data_
Definition simulation.h:127
std::unique_ptr< SolutionTransfer< dim, Number > > solution_transfer_
Definition simulation.h:142
std::unique_ptr< HyperbolicModule< dim, Number > > hyperbolic_module_
Definition simulation.h:138
StateVector< Number > state_vector_
Definition simulation.h:144
const HyperbolicSystem * hyperbolic_system_
Definition simulation.h:134
typename HD::template HyperbolicModule< dim, Number > HyperbolicModule
Definition simulation.h:54
typename HD::HyperbolicSystem HyperbolicSystem
Definition simulation.h:51
typename PD::template ParabolicModule< HD, dim, Number > ParabolicModule
Definition simulation.h:56
void prepare(TaskContext< Number > &context) override
Definition simulation.h:192
~Simulation() override
Definition simulation.h:158
Simulation(const MPI_Comm &mpi_comm)
Definition simulation.h:67
typename PD::ParabolicSystem ParabolicSystem
Definition simulation.h:52
void execute(TaskContext< Number > &context) override
Definition simulation.h:242
void debug_poison_invalid_values(StateVector< Number > &state_vector, const OfflineData &offline_data)
std::function< void(const std::string &)> info
Definition task.h:201
std::string base_name
Definition task.h:184