ExaDG
Loading...
Searching...
No Matches
application_base.h
1/* ______________________________________________________________________
2 *
3 * ExaDG - High-Order Discontinuous Galerkin for the Exa-Scale
4 *
5 * Copyright (C) 2023 by the ExaDG authors
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 * ______________________________________________________________________
20 */
21
22#ifndef INCLUDE_EXADG_AERO_ACOUSTIC_USER_INTERFACE_APPLICATION_BASE_H_
23#define INCLUDE_EXADG_AERO_ACOUSTIC_USER_INTERFACE_APPLICATION_BASE_H_
24
25// deal.II
26#include <deal.II/distributed/fully_distributed_tria.h>
27#include <deal.II/distributed/tria.h>
28#include <deal.II/grid/grid_generator.h>
29#include <deal.II/grid/grid_tools.h>
30#include <deal.II/grid/manifold_lib.h>
31
32// ExaDG
33#include <exadg/grid/grid.h>
34#include <exadg/grid/grid_utilities.h>
35#include <exadg/operators/resolution_parameters.h>
36#include <exadg/postprocessor/output_parameters.h>
37
38// Fluid
39#include <exadg/incompressible_navier_stokes/postprocessor/postprocessor.h>
40#include <exadg/incompressible_navier_stokes/user_interface/boundary_descriptor.h>
41#include <exadg/incompressible_navier_stokes/user_interface/field_functions.h>
42#include <exadg/incompressible_navier_stokes/user_interface/parameters.h>
43
44// Acoustic
45#include <exadg/acoustic_conservation_equations/postprocessor/postprocessor.h>
46#include <exadg/acoustic_conservation_equations/user_interface/boundary_descriptor.h>
47#include <exadg/acoustic_conservation_equations/user_interface/field_functions.h>
48#include <exadg/acoustic_conservation_equations/user_interface/parameters.h>
49
50// AeroAcoustic
51#include <exadg/aero_acoustic/user_interface/field_functions.h>
52#include <exadg/aero_acoustic/user_interface/parameters.h>
53
54namespace ExaDG
55{
56namespace AcousticsAeroAcoustic
57{
58template<int dim, typename Number>
60{
61public:
62 ApplicationBase(std::string parameter_file, MPI_Comm const & comm)
63 : mpi_comm(comm),
64 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0),
65 parameter_file(parameter_file)
66 {
67 }
68
69 virtual ~ApplicationBase() = default;
70
71 virtual void
72 add_parameters(dealii::ParameterHandler & prm)
73 {
74 resolution.add_parameters(prm, "SpatialResolutionAcoustics");
75 output_parameters.add_parameters(prm, "Output");
76 }
77
78 void
79 parse_parameters()
80 {
81 dealii::ParameterHandler prm;
82 this->add_parameters(prm);
83 prm.parse_input(parameter_file, "", true, true);
84 }
85
86 void
87 setup(std::shared_ptr<Grid<dim>> & grid, std::shared_ptr<dealii::Mapping<dim>> & mapping)
88 {
89 parse_parameters();
90
91 set_resolution_parameters();
92
93 // parameters
94 set_parameters();
95 param.check();
96
97 // Some AeroAcoustic specific Asserts
98 AssertThrow(param.adaptive_time_stepping == true,
99 dealii::ExcMessage("Adaptive timestepping has to be enabled for aero-acoustics."));
100
101 AssertThrow(param.aero_acoustic_source_term,
102 dealii::ExcMessage(
103 "aero_acoustic_source_term has to be set true for aero-acoustic computations."));
104
105 param.print(pcout, "List of parameters for acoustic conservation equations:");
106
107 // grid
108 grid = std::make_shared<Grid<dim>>();
109 create_grid(*grid, mapping);
110 print_grid_info(pcout, *grid);
111
112 // boundary conditions
113 boundary_descriptor = std::make_shared<Acoustics::BoundaryDescriptor<dim>>();
114 set_boundary_descriptor();
115 ExaDG::verify_boundary_conditions(*boundary_descriptor, *grid);
116
117 // field functions
118 field_functions = std::make_shared<Acoustics::FieldFunctions<dim>>();
119 set_field_functions();
120 }
121
123 get_parameters() const
124 {
125 return param;
126 }
127
128 std::shared_ptr<Acoustics::BoundaryDescriptor<dim> const>
129 get_boundary_descriptor() const
130 {
131 return boundary_descriptor;
132 }
133
134 std::shared_ptr<Acoustics::FieldFunctions<dim> const>
135 get_field_functions() const
136 {
137 return field_functions;
138 }
139
140 virtual std::shared_ptr<Acoustics::PostProcessorBase<dim, Number>>
141 create_postprocessor() = 0;
142
143protected:
144 MPI_Comm const mpi_comm;
145
146 dealii::ConditionalOStream pcout;
147
149
150 std::shared_ptr<Acoustics::FieldFunctions<dim>> field_functions;
151 std::shared_ptr<Acoustics::BoundaryDescriptor<dim>> boundary_descriptor;
152
153 std::string parameter_file;
154
155 OutputParameters output_parameters;
156
157private:
158 void
159 set_resolution_parameters()
160 {
161 param.degree_u = resolution.degree;
162 param.grid.n_refine_global = resolution.refine_space;
163 }
164
165 virtual void
166 set_parameters() = 0;
167
168 virtual void
169 create_grid(Grid<dim> & grid, std::shared_ptr<dealii::Mapping<dim>> & mapping) = 0;
170
171 virtual void
172 set_boundary_descriptor() = 0;
173
174 virtual void
175 set_field_functions() = 0;
176
178};
179
180} // namespace AcousticsAeroAcoustic
181
182namespace FluidAeroAcoustic
183{
184template<int dim, typename Number>
186{
187public:
188 ApplicationBase(std::string parameter_file, MPI_Comm const & comm)
189 : mpi_comm(comm),
190 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0),
191 parameter_file(parameter_file)
192 {
193 }
194
195 virtual ~ApplicationBase() = default;
196
197 virtual void
198 add_parameters(dealii::ParameterHandler & prm)
199 {
200 resolution.add_parameters(prm, "SpatialResolutionFluid");
201 output_parameters.add_parameters(prm, "Output");
202 }
203
204 void
205 parse_parameters()
206 {
207 dealii::ParameterHandler prm;
208 this->add_parameters(prm);
209 prm.parse_input(parameter_file, "", true, true);
210 }
211
212 void
213 setup(std::shared_ptr<Grid<dim>> & grid,
214 std::shared_ptr<dealii::Mapping<dim>> & mapping,
215 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings)
216 {
217 parse_parameters();
218
219 set_resolution_parameters();
220
221 // parameters
222 set_parameters();
223 param.check(pcout);
224 param.print(pcout, "List of parameters for incompressible flow solver:");
225
226 // Some AeroAcoustic specific Asserts
227 AssertThrow(param.problem_type == IncNS::ProblemType::Unsteady,
228 dealii::ExcMessage("Invalid parameter in context of aero-acoustic."));
229 AssertThrow(param.ale_formulation == false,
230 dealii::ExcMessage("ALE not yet implemented for aero-acoustic."));
231
232 // grid
233 grid = std::make_shared<Grid<dim>>();
234 create_grid(*grid, mapping, multigrid_mappings);
235 print_grid_info(pcout, *grid);
236
237 // boundary conditions
238 boundary_descriptor = std::make_shared<IncNS::BoundaryDescriptor<dim>>();
239 set_boundary_descriptor();
240 IncNS::verify_boundary_conditions<dim>(*boundary_descriptor, *grid);
241
242 // field functions
243 field_functions = std::make_shared<IncNS::FieldFunctions<dim>>();
244 set_field_functions();
245 }
246
247 IncNS::Parameters const &
248 get_parameters() const
249 {
250 return param;
251 }
252
253 std::shared_ptr<IncNS::BoundaryDescriptor<dim> const>
254 get_boundary_descriptor() const
255 {
256 return boundary_descriptor;
257 }
258
259 std::shared_ptr<IncNS::FieldFunctions<dim> const>
260 get_field_functions() const
261 {
262 return field_functions;
263 }
264
265 virtual std::shared_ptr<IncNS::PostProcessorBase<dim, Number>>
266 create_postprocessor() = 0;
267
268protected:
269 MPI_Comm const mpi_comm;
270
271 dealii::ConditionalOStream pcout;
272
273 // fluid
274 IncNS::Parameters param;
275 std::shared_ptr<IncNS::FieldFunctions<dim>> field_functions;
276 std::shared_ptr<IncNS::BoundaryDescriptor<dim>> boundary_descriptor;
277
278 std::string parameter_file;
279
280 OutputParameters output_parameters;
281
282private:
283 void
284 set_resolution_parameters()
285 {
286 param.degree_u = resolution.degree;
287 param.grid.n_refine_global = resolution.refine_space;
288 }
289
290 // fluid
291 virtual void
292 set_parameters() = 0;
293
294 virtual void
295 create_grid(Grid<dim> & grid,
296 std::shared_ptr<dealii::Mapping<dim>> & mapping,
297 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings) = 0;
298
299 virtual void
300 set_boundary_descriptor() = 0;
301
302 virtual void
303 set_field_functions() = 0;
304
306};
307} // namespace FluidAeroAcoustic
308
309namespace AeroAcoustic
310{
311template<int dim, typename Number>
313{
314public:
315 ApplicationBase(std::string const & input_file, MPI_Comm const & comm)
316 : parameter_file(input_file),
317 mpi_comm(comm),
318 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0)
319 {
320 }
321
322 virtual ~ApplicationBase() = default;
323
324 void
325 setup()
326 {
327 set_single_field_solvers(parameter_file, mpi_comm);
328
329 parse_parameters();
330 parameters.check();
331 parameters.print(pcout, "List of parameters for aero-acoustic solver");
332
333 field_functions = std::make_shared<FieldFunctions<dim>>();
334 set_field_functions();
335 }
336
337 virtual void
338 add_parameters(dealii::ParameterHandler & prm)
339 {
340 parameters.add_parameters(prm, "AeroAcoustic");
341
342 acoustic->add_parameters(prm);
343 fluid->add_parameters(prm);
344 }
345
346 Parameters parameters;
347
348 std::shared_ptr<AcousticsAeroAcoustic::ApplicationBase<dim, Number>> acoustic;
349 std::shared_ptr<FluidAeroAcoustic::ApplicationBase<dim, Number>> fluid;
350
351 std::shared_ptr<FieldFunctions<dim>> field_functions;
352
353private:
354 void
355 parse_parameters()
356 {
357 dealii::ParameterHandler prm;
358 add_parameters(prm);
359 prm.parse_input(parameter_file, "", true, true);
360 }
361
362 virtual void
363 set_single_field_solvers(std::string input_file, MPI_Comm const & comm) = 0;
364
365 virtual void
366 set_field_functions() = 0;
367
368 std::string const parameter_file;
369 MPI_Comm const mpi_comm;
370 dealii::ConditionalOStream pcout;
371};
372
373} // namespace AeroAcoustic
374} // namespace ExaDG
375
376#endif /* INCLUDE_EXADG_AERO_ACOUSTIC_USER_INTERFACE_APPLICATION_BASE_H_ */
Definition application_base.h:60
Definition parameters.h:41
Definition application_base.h:313
Definition parameters.h:40
Definition application_base.h:186
Definition grid.h:40
Definition parameters.h:46
Definition grid.h:84
Definition driver.cpp:33
Definition output_parameters.h:32
Definition resolution_parameters.h:81