ExaDG
Loading...
Searching...
No Matches
application_base.h
1/* ______________________________________________________________________
2 *
3 * ExaDG - High-Order Discontinuous Galerkin for the Exa-Scale
4 *
5 * Copyright (C) 2021 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 EXADG_INCOMPRESSIBLE_FLOW_WITH_TRANSPORT_USER_INTERFACE_APPLICATION_BASE_H_
23#define EXADG_INCOMPRESSIBLE_FLOW_WITH_TRANSPORT_USER_INTERFACE_APPLICATION_BASE_H_
24
25// deal.II
26#include <deal.II/grid/grid_generator.h>
27#include <deal.II/grid/manifold_lib.h>
28#include <deal.II/grid/tria_description.h>
29
30// ExaDG
31#include <exadg/convection_diffusion/postprocessor/postprocessor.h>
32#include <exadg/convection_diffusion/user_interface/boundary_descriptor.h>
33#include <exadg/convection_diffusion/user_interface/field_functions.h>
34#include <exadg/convection_diffusion/user_interface/parameters.h>
35#include <exadg/grid/grid.h>
36#include <exadg/grid/grid_utilities.h>
37#include <exadg/incompressible_navier_stokes/postprocessor/postprocessor.h>
38#include <exadg/incompressible_navier_stokes/user_interface/boundary_descriptor.h>
39#include <exadg/incompressible_navier_stokes/user_interface/field_functions.h>
40#include <exadg/incompressible_navier_stokes/user_interface/parameters.h>
41#include <exadg/operators/resolution_parameters.h>
42#include <exadg/postprocessor/output_parameters.h>
43
44namespace ExaDG
45{
46namespace FTI
47{
48template<int dim, typename Number>
49class FluidBase
50{
51public:
52 virtual void
53 add_parameters(dealii::ParameterHandler & prm, std::vector<std::string> const & subsection_names)
54 {
55 for(auto & name : subsection_names)
56 {
57 prm.enter_subsection(name);
58 }
59
60 resolution.add_parameters(prm);
61
62 output_parameters.add_parameters(prm);
63
64 for(auto & name : subsection_names)
65 {
66 (void)name;
67 prm.leave_subsection();
68 }
69 }
70
71 FluidBase(std::string parameter_file, MPI_Comm const & comm)
72 : mpi_comm(comm),
73 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0),
74 parameter_file(parameter_file)
75 {
76 }
77
78 virtual ~FluidBase()
79 {
80 }
81
82 virtual void
83 setup(std::shared_ptr<Grid<dim>> & grid,
84 std::shared_ptr<dealii::Mapping<dim>> & mapping,
85 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings,
86 std::vector<std::string> const & subsection_names)
87 {
88 parse_parameters(subsection_names);
89
90 // set resolution parameters
91 param.degree_u = resolution.degree;
92 param.grid.n_refine_global = resolution.refine_space;
93
94 set_parameters();
95 param.check(pcout);
96 param.print(pcout, "List of parameters:");
97
98 // grid
99 grid = std::make_shared<Grid<dim>>();
100 create_grid(*grid, mapping, multigrid_mappings);
101 print_grid_info(pcout, *grid);
102
103 // boundary conditions
104 boundary_descriptor = std::make_shared<IncNS::BoundaryDescriptor<dim>>();
105 set_boundary_descriptor();
106 verify_boundary_conditions<dim>(*boundary_descriptor, *grid);
107
108 // field functions
109 field_functions = std::make_shared<IncNS::FieldFunctions<dim>>();
110 set_field_functions();
111 }
112
113 virtual std::shared_ptr<IncNS::PostProcessorBase<dim, Number>>
114 create_postprocessor() = 0;
115
116 IncNS::Parameters const &
117 get_parameters() const
118 {
119 return param;
120 }
121
122 std::shared_ptr<IncNS::BoundaryDescriptor<dim> const>
123 get_boundary_descriptor() const
124 {
125 return boundary_descriptor;
126 }
127
128 std::shared_ptr<IncNS::FieldFunctions<dim> const>
129 get_field_functions() const
130 {
131 return field_functions;
132 }
133
134 // Analytical mesh motion
135 virtual std::shared_ptr<dealii::Function<dim>>
136 create_mesh_movement_function()
137 {
138 std::shared_ptr<dealii::Function<dim>> mesh_motion =
139 std::make_shared<dealii::Functions::ZeroFunction<dim>>(dim);
140
141 return mesh_motion;
142 }
143
144protected:
145 virtual void
146 parse_parameters(std::vector<std::string> const & subsection_names)
147 {
148 dealii::ParameterHandler prm;
149 this->add_parameters(prm, subsection_names);
150 prm.parse_input(parameter_file, "", true, true);
151 }
152
153 MPI_Comm const mpi_comm;
154
155 dealii::ConditionalOStream pcout;
156
157 IncNS::Parameters param;
158
159 std::shared_ptr<IncNS::FieldFunctions<dim>> field_functions;
160 std::shared_ptr<IncNS::BoundaryDescriptor<dim>> boundary_descriptor;
161
162 std::string parameter_file;
163
164 OutputParameters output_parameters;
165
166private:
167 virtual void
168 set_parameters() = 0;
169
170 virtual void
171 create_grid(Grid<dim> & grid,
172 std::shared_ptr<dealii::Mapping<dim>> & mapping,
173 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings) = 0;
174
175 virtual void
176 set_boundary_descriptor() = 0;
177
178 virtual void
179 set_field_functions() = 0;
180
182};
183
184template<int dim, typename Number>
185class ScalarBase
186{
187public:
188 virtual void
189 add_parameters(dealii::ParameterHandler & prm, std::vector<std::string> const & subsection_names)
190 {
191 for(auto & name : subsection_names)
192 {
193 prm.enter_subsection(name);
194 }
195
196 prm.enter_subsection("SpatialResolution");
197 {
198 prm.add_parameter("Degree",
199 degree,
200 "Polynomial degree of shape functions.",
201 dealii::Patterns::Integer(1),
202 true);
203 }
204 prm.leave_subsection();
205
206 output_parameters.add_parameters(prm);
207
208 for(auto & name : subsection_names)
209 {
210 (void)name;
211 prm.leave_subsection();
212 }
213 }
214
215 ScalarBase(std::string parameter_file, MPI_Comm const & comm)
216 : mpi_comm(comm),
217 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(comm) == 0),
218 parameter_file(parameter_file),
219 degree(1)
220 {
221 }
222
223 virtual ~ScalarBase()
224 {
225 }
226
227 void
228 setup(std::vector<std::string> const & subsection_names, Grid<dim> const & grid)
229 {
230 parse_parameters(subsection_names);
231
232 // set degree of shape functions (note that the refinement level is identical to fluid domain)
233 param.degree = degree;
234
235 set_parameters();
236 param.check();
237
238 param.print(this->pcout, "List of parameters for quantity " + subsection_names.back() + ":");
239
240 // boundary conditions
241 boundary_descriptor = std::make_shared<ConvDiff::BoundaryDescriptor<dim>>();
242 set_boundary_descriptor();
243 verify_boundary_conditions(*boundary_descriptor, grid);
244
245 // field functions
246 field_functions = std::make_shared<ConvDiff::FieldFunctions<dim>>();
247 set_field_functions();
248 }
249
250 virtual std::shared_ptr<ConvDiff::PostProcessorBase<dim, Number>>
251 create_postprocessor() = 0;
252
254 get_parameters() const
255 {
256 return param;
257 }
258
259 std::shared_ptr<ConvDiff::BoundaryDescriptor<dim> const>
260 get_boundary_descriptor() const
261 {
262 return boundary_descriptor;
263 }
264
265 std::shared_ptr<ConvDiff::FieldFunctions<dim> const>
266 get_field_functions() const
267 {
268 return field_functions;
269 }
270
271protected:
272 virtual void
273 parse_parameters(std::vector<std::string> const & subsection_names)
274 {
275 dealii::ParameterHandler prm;
276 this->add_parameters(prm, subsection_names);
277 prm.parse_input(parameter_file, "", true, true);
278 }
279
280 MPI_Comm const mpi_comm;
281
282 dealii::ConditionalOStream pcout;
283
285 std::shared_ptr<ConvDiff::FieldFunctions<dim>> field_functions;
286 std::shared_ptr<ConvDiff::BoundaryDescriptor<dim>> boundary_descriptor;
287
288 std::string parameter_file;
289
290 OutputParameters output_parameters;
291
292private:
293 virtual void
294 set_parameters() = 0;
295
296 virtual void
297 set_boundary_descriptor() = 0;
298
299 virtual void
300 set_field_functions() = 0;
301
302 unsigned int degree;
303};
304
305template<int dim, typename Number>
306class ApplicationBase
307{
308public:
309 void
310 add_parameters(dealii::ParameterHandler & prm)
311 {
312 AssertThrow(fluid.get(), dealii::ExcMessage("fluid has not been initialized."));
313
314 fluid->add_parameters(prm, {"Fluid"});
315
316 for(unsigned int i = 0; i < scalars.size(); ++i)
317 {
318 AssertThrow(scalars[i].get(),
319 dealii::ExcMessage("scalar[" + std::to_string(i) +
320 "] has not been initialized."));
321
322 scalars[i]->add_parameters(prm, {"Scalar" + std::to_string(i)});
323 }
324 }
325
326 ApplicationBase(std::string parameter_file, MPI_Comm const & comm)
327 : mpi_comm(comm),
328 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(comm) == 0),
329 parameter_file(parameter_file)
330 {
331 }
332
333 virtual ~ApplicationBase()
334 {
335 }
336
337 void
338 setup(std::shared_ptr<Grid<dim>> & grid,
339 std::shared_ptr<dealii::Mapping<dim>> & mapping,
340 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings)
341 {
342 AssertThrow(fluid.get(), dealii::ExcMessage("fluid has not been initialized."));
343
344 // The fluid field is defined as the field that creates the grid and the mapping, while all
345 // scalar fields use the same grid/mapping
346 fluid->setup(grid, mapping, multigrid_mappings, {"Fluid"});
347
348 for(unsigned int i = 0; i < scalars.size(); ++i)
349 {
350 AssertThrow(scalars[i].get(),
351 dealii::ExcMessage("scalar[" + std::to_string(i) +
352 "] has not been initialized."));
353
354 scalars[i]->setup({"Scalar" + std::to_string(i)}, *grid);
355
356 // do additional parameter checks
357 AssertThrow(scalars[i]->get_parameters().ale_formulation ==
358 fluid->get_parameters().ale_formulation,
359 dealii::ExcMessage(
360 "Parameter ale_formulation is different for fluid field and scalar field"));
361
362 AssertThrow(
363 scalars[i]->get_parameters().adaptive_time_stepping ==
364 fluid->get_parameters().adaptive_time_stepping,
365 dealii::ExcMessage(
366 "The option adaptive_time_stepping has to be consistent for fluid and scalar transport solvers."));
367 }
368 }
369
370 std::shared_ptr<FluidBase<dim, Number>> fluid;
371 std::vector<std::shared_ptr<ScalarBase<dim, Number>>> scalars;
372
373protected:
374 MPI_Comm const mpi_comm;
375
376 dealii::ConditionalOStream pcout;
377
378private:
379 std::string parameter_file;
380};
381
382} // namespace FTI
383} // namespace ExaDG
384
385#endif /* EXADG_INCOMPRESSIBLE_FLOW_WITH_TRANSPORT_USER_INTERFACE_APPLICATION_BASE_H_ */
Definition parameters.h:46
Definition grid.h:40
Definition parameters.h:46
Definition grid.h:84
Definition driver.cpp:33
Definition output_parameters.h:34
Definition resolution_parameters.h:83