ryujin 2.5.0 revision 3a6c8d57210175dea14d8116e1fe878f349f8c1c
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{
38 template <typename HD, typename PD, int dim, typename Number = double>
39 requires Concept::HyperbolicDescription<HD, dim, Number> &&
40 Concept::ParabolicDescription<PD, HD, dim, Number>
41 class Simulation final : public Interface::Simulation<dim, Number>
42 {
43 public:
48
49 using HyperbolicSystem = typename HD::HyperbolicSystem;
50 using ParabolicSystem = typename PD::ParabolicSystem;
52 typename PD::template ParabolicModule<HD, dim, Number>;
53
55
59
64 Simulation(const MPI_Comm &mpi_comm)
65 {
66 int n_ensembles = 1;
67 if constexpr (has_n_mpi_ensembles_v<HD>)
68 n_ensembles = HD::n_mpi_ensembles();
69
70 this->mpi_ensemble_ =
71 std::make_unique<MPIEnsemble>(mpi_comm, n_ensembles);
72 const auto &mpi_ensemble = *this->mpi_ensemble_;
73
74 hyperbolic_system_container_ =
75 std::make_unique<MPIEnsembleContainer<HyperbolicSystem>>(
76 mpi_ensemble, "/B - Equation");
77 const HyperbolicSystem &hyperbolic_system =
78 hyperbolic_system_container_->get();
79 this->hyperbolic_system_ = &hyperbolic_system;
80
81 parabolic_system_container_ =
82 std::make_unique<MPIEnsembleContainer<ParabolicSystem>>(
83 mpi_ensemble, "/B - Equation");
84 const ParabolicSystem &parabolic_system =
85 parabolic_system_container_->get();
86 this->parabolic_system_ = &parabolic_system;
87
88 this->discretization_ = std::make_unique<Discretization<dim>>(
89 mpi_ensemble, "/C - Discretization");
90
91 this->offline_data_ = std::make_unique<OfflineData<dim, Number>>(
92 mpi_ensemble, *this->discretization_, "/D - OfflineData");
93 const auto &offline_data = *this->offline_data_;
94
95 initial_values_container_ = std::make_unique<
97 mpi_ensemble,
98 "/E - InitialValues",
99 mpi_ensemble,
100 offline_data,
101 hyperbolic_system,
102 parabolic_system);
103 const InitialValues<HD, dim, Number> &initial_values =
104 initial_values_container_->get();
105 this->initial_values_ = &initial_values;
106
107 auto hyperbolic_module =
108 std::make_unique<HyperbolicModule<HD, dim, Number>>(
109 mpi_ensemble,
110 offline_data,
111 hyperbolic_system,
112 initial_values,
113 "/F - HyperbolicModule");
114 const auto &initial_precomputed =
115 hyperbolic_module->initial_precomputed();
116 this->hyperbolic_module_ = std::move(hyperbolic_module);
117
118 this->parabolic_module_ =
119 std::make_unique<ParabolicModule>(mpi_ensemble,
120 offline_data,
121 hyperbolic_system,
122 parabolic_system,
123 initial_values,
124 "/G - ParabolicModule");
125
126 this->time_integrator_ = std::make_unique<TimeIntegrator<dim, Number>>(
127 mpi_ensemble,
128 hyperbolic_system,
129 parabolic_system,
130 *this->hyperbolic_module_,
131 *this->parabolic_module_,
132 "/H - TimeIntegrator");
133
134 postprocessor_ =
135 std::make_unique<Postprocessor<HD, dim, Number>>(offline_data,
136 hyperbolic_system,
137 parabolic_system,
138 initial_precomputed);
139
140 this->mesh_adaptor_ = std::make_unique<MeshAdaptor<dim, Number>>(
141 mpi_ensemble, offline_data, *postprocessor_, "/I - MeshAdaptor");
142
143 this->solution_transfer_ =
144 std::make_unique<SolutionTransfer<HD, dim, Number>>(
145 mpi_ensemble,
146 *this->discretization_,
147 offline_data,
148 hyperbolic_system,
149 parabolic_system,
150 "/I - MeshAdaptor");
151
152 this->vtu_output_ =
153 std::make_unique<VTUOutput<dim, Number>>(mpi_ensemble,
154 offline_data,
155 hyperbolic_system,
156 *postprocessor_,
157 "/J - VTUOutput");
158
159 this->quantities_ =
160 std::make_unique<Quantities<dim, Number>>(mpi_ensemble,
161 offline_data,
162 hyperbolic_system,
163 *postprocessor_,
164 "/K - Quantities");
165
166 this->error_evaluation_ = std::make_unique<ErrorEvaluation<dim, Number>>(
167 mpi_ensemble,
168 offline_data,
169 hyperbolic_system,
170 *postprocessor_,
171 "/L - ErrorEvaluation");
172 }
173
178 ~Simulation() override
179 {
180 this->error_evaluation_.reset();
181 this->quantities_.reset();
182 this->vtu_output_.reset();
183 this->solution_transfer_.reset();
184 this->mesh_adaptor_.reset();
185 postprocessor_.reset();
186 this->time_integrator_.reset();
187 this->parabolic_module_.reset();
188 this->hyperbolic_module_.reset();
189 this->initial_values_ = nullptr;
190 initial_values_container_.reset();
191 this->offline_data_.reset();
192 this->discretization_.reset();
193 this->parabolic_system_ = nullptr;
194 parabolic_system_container_.reset();
195 this->hyperbolic_system_ = nullptr;
196 hyperbolic_system_container_.reset();
197 this->mpi_ensemble_.reset();
198 }
199
201
202 private:
207
208 std::unique_ptr<MPIEnsembleContainer<HyperbolicSystem>>
209 hyperbolic_system_container_;
210 std::unique_ptr<MPIEnsembleContainer<ParabolicSystem>>
211 parabolic_system_container_;
212 std::unique_ptr<MPIEnsembleContainer<InitialValues<HD, dim, Number>>>
213 initial_values_container_;
214 std::unique_ptr<Postprocessor<HD, dim, Number>> postprocessor_;
215
217 };
218} // namespace ryujin
std::unique_ptr< Quantities< dim, Number > > quantities_
Definition simulation.h:110
std::unique_ptr< ParabolicModule< dim, Number > > parabolic_module_
Definition simulation.h:105
std::unique_ptr< MPIEnsemble > mpi_ensemble_
Definition simulation.h:91
std::unique_ptr< Discretization< dim > > discretization_
Definition simulation.h:92
std::unique_ptr< MeshAdaptor< dim, Number > > mesh_adaptor_
Definition simulation.h:107
std::unique_ptr< TimeIntegrator< dim, Number > > time_integrator_
Definition simulation.h:106
const ParabolicSystem * parabolic_system_
Definition simulation.h:101
const InitialValues< dim, Number > * initial_values_
Definition simulation.h:102
std::unique_ptr< VTUOutput< dim, Number > > vtu_output_
Definition simulation.h:109
std::unique_ptr< OfflineData< dim, Number > > offline_data_
Definition simulation.h:93
std::unique_ptr< SolutionTransfer< dim, Number > > solution_transfer_
Definition simulation.h:108
std::unique_ptr< HyperbolicModule< dim, Number > > hyperbolic_module_
Definition simulation.h:104
std::unique_ptr< ErrorEvaluation< dim, Number > > error_evaluation_
Definition simulation.h:111
const HyperbolicSystem * hyperbolic_system_
Definition simulation.h:100
typename HD::HyperbolicSystem HyperbolicSystem
Definition simulation.h:49
typename PD::template ParabolicModule< HD, dim, Number > ParabolicModule
Definition simulation.h:52
~Simulation() override
Definition simulation.h:178
Simulation(const MPI_Comm &mpi_comm)
Definition simulation.h:64
typename PD::ParabolicSystem ParabolicSystem
Definition simulation.h:50