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 INCLUDE_EXADG_FLUID_STRUCTURE_INTERACTION_USER_INTERFACE_APPLICATION_BASE_H_
23#define INCLUDE_EXADG_FLUID_STRUCTURE_INTERACTION_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// Structure (and ALE elasticity)
45#include <exadg/structure/material/library/st_venant_kirchhoff.h>
46#include <exadg/structure/postprocessor/postprocessor.h>
47#include <exadg/structure/user_interface/boundary_descriptor.h>
48#include <exadg/structure/user_interface/field_functions.h>
49#include <exadg/structure/user_interface/material_descriptor.h>
50#include <exadg/structure/user_interface/parameters.h>
51
52// ALE Poisson
53#include <exadg/poisson/user_interface/analytical_solution.h>
54#include <exadg/poisson/user_interface/boundary_descriptor.h>
55#include <exadg/poisson/user_interface/field_functions.h>
56#include <exadg/poisson/user_interface/parameters.h>
57
58namespace ExaDG
59{
60namespace StructureFSI
61{
62template<int dim, typename Number>
64{
65public:
66 ApplicationBase(std::string parameter_file, MPI_Comm const & comm)
67 : mpi_comm(comm),
68 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0),
69 parameter_file(parameter_file)
70 {
71 }
72
73 virtual ~ApplicationBase()
74 {
75 }
76
77 virtual void
78 add_parameters(dealii::ParameterHandler & prm)
79 {
80 resolution.add_parameters(prm, "SpatialResolutionStructure");
81 output_parameters.add_parameters(prm, "Output");
82 }
83
84 void
85 parse_parameters()
86 {
87 dealii::ParameterHandler prm;
88 this->add_parameters(prm);
89 prm.parse_input(parameter_file, "", true, true);
90 }
91
92 void
93 setup(std::shared_ptr<Grid<dim>> & grid,
94 std::shared_ptr<dealii::Mapping<dim>> & mapping,
95 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings)
96 {
97 parse_parameters();
98
99 set_resolution_parameters();
100
101 // parameters
102 set_parameters();
103 param.check();
104 // Some FSI specific Asserts
105 AssertThrow(param.pull_back_traction == true,
106 dealii::ExcMessage("Invalid parameter in context of fluid-structure interaction."));
107 param.print(pcout, "List of parameters for structure:");
108
109 // grid
110 grid = std::make_shared<Grid<dim>>();
111 create_grid(*grid, mapping, multigrid_mappings);
112 print_grid_info(pcout, *grid);
113
114 // boundary conditions
115 boundary_descriptor = std::make_shared<Structure::BoundaryDescriptor<dim>>();
116 set_boundary_descriptor();
117 verify_boundary_conditions(*boundary_descriptor, *grid);
118
119 // material_descriptor
120 material_descriptor = std::make_shared<Structure::MaterialDescriptor>();
121 set_material_descriptor();
122
123 // field functions
124 field_functions = std::make_shared<Structure::FieldFunctions<dim>>();
125 set_field_functions();
126 }
127
129 get_parameters() const
130 {
131 return param;
132 }
133
134 std::shared_ptr<Structure::BoundaryDescriptor<dim> const>
135 get_boundary_descriptor() const
136 {
137 return boundary_descriptor;
138 }
139
140 std::shared_ptr<Structure::MaterialDescriptor const>
141 get_material_descriptor() const
142 {
143 return material_descriptor;
144 }
145
146 std::shared_ptr<Structure::FieldFunctions<dim> const>
147 get_field_functions() const
148 {
149 return field_functions;
150 }
151
152 virtual std::shared_ptr<Structure::PostProcessor<dim, Number>>
153 create_postprocessor() = 0;
154
155protected:
156 MPI_Comm const mpi_comm;
157
158 dealii::ConditionalOStream pcout;
159
161 std::shared_ptr<Structure::MaterialDescriptor> material_descriptor;
162 std::shared_ptr<Structure::BoundaryDescriptor<dim>> boundary_descriptor;
163 std::shared_ptr<Structure::FieldFunctions<dim>> field_functions;
164
165 std::string parameter_file;
166
167 OutputParameters output_parameters;
168
169private:
170 void
171 set_resolution_parameters()
172 {
173 param.degree = resolution.degree;
174 param.grid.n_refine_global = resolution.refine_space;
175 }
176
177 virtual void
178 set_parameters() = 0;
179
180 virtual void
181 create_grid(Grid<dim> & grid,
182 std::shared_ptr<dealii::Mapping<dim>> & mapping,
183 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings) = 0;
184
185 virtual void
186 set_boundary_descriptor() = 0;
187
188 virtual void
189 set_material_descriptor() = 0;
190
191 virtual void
192 set_field_functions() = 0;
193
195};
196
197} // namespace StructureFSI
198
199namespace FluidFSI
200{
201template<int dim, typename Number>
203{
204public:
205 ApplicationBase(std::string parameter_file, MPI_Comm const & comm)
206 : mpi_comm(comm),
207 pcout(std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_comm) == 0),
208 parameter_file(parameter_file)
209 {
210 }
211
212 virtual ~ApplicationBase()
213 {
214 }
215
216 virtual void
217 add_parameters(dealii::ParameterHandler & prm)
218 {
219 resolution.add_parameters(prm, "SpatialResolutionFluid");
220 output_parameters.add_parameters(prm, "Output");
221 }
222
223 void
224 parse_parameters()
225 {
226 dealii::ParameterHandler prm;
227 this->add_parameters(prm);
228 prm.parse_input(parameter_file, "", true, true);
229 }
230
231 void
232 setup(std::shared_ptr<Grid<dim>> & grid,
233 std::shared_ptr<dealii::Mapping<dim>> & mapping,
234 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings)
235 {
236 parse_parameters();
237
238 set_resolution_parameters();
239
240 // parameters
241 set_parameters();
242 param.check(pcout);
243 param.print(pcout, "List of parameters for incompressible flow solver:");
244
245 // Some FSI specific Asserts
246 AssertThrow(param.problem_type == IncNS::ProblemType::Unsteady,
247 dealii::ExcMessage("Invalid parameter in context of fluid-structure interaction."));
248 AssertThrow(param.ale_formulation == true,
249 dealii::ExcMessage("Invalid parameter in context of fluid-structure interaction."));
250
251 // grid
252 grid = std::make_shared<Grid<dim>>();
253 create_grid(*grid, mapping, multigrid_mappings);
254 print_grid_info(pcout, *grid);
255
256 // boundary conditions
257 boundary_descriptor = std::make_shared<IncNS::BoundaryDescriptor<dim>>();
258 set_boundary_descriptor();
259 IncNS::verify_boundary_conditions<dim>(*boundary_descriptor, *grid);
260
261 // field functions
262 field_functions = std::make_shared<IncNS::FieldFunctions<dim>>();
263 set_field_functions();
264
265 /*
266 * ALE
267 */
268 if(param.mesh_movement_type == IncNS::MeshMovementType::Poisson)
269 {
270 // parameters
271 set_parameters_ale_poisson();
272 ale_poisson_param.check();
273 AssertThrow(ale_poisson_param.right_hand_side == false,
274 dealii::ExcMessage("Parameter does not make sense in context of FSI."));
275 AssertThrow(
276 ale_poisson_param.grid.create_coarse_triangulations ==
277 param.grid.create_coarse_triangulations,
278 dealii::ExcMessage(
279 "ALE and fluid use the same Grid, requiring the same settings in terms of multigrid coarsening."));
280
281 ale_poisson_param.print(pcout, "List of parameters for ALE solver (Poisson):");
282
283 // boundary conditions
284 ale_poisson_boundary_descriptor = std::make_shared<Poisson::BoundaryDescriptor<1, dim>>();
285 set_boundary_descriptor_ale_poisson();
286 verify_boundary_conditions(*ale_poisson_boundary_descriptor, *grid);
287
288 // field functions
289 ale_poisson_field_functions = std::make_shared<Poisson::FieldFunctions<dim>>();
290 set_field_functions_ale_poisson();
291 }
292 else if(param.mesh_movement_type == IncNS::MeshMovementType::Elasticity)
293 {
294 // parameters
295 set_parameters_ale_elasticity();
296 ale_elasticity_param.check();
297 AssertThrow(ale_elasticity_param.body_force == false,
298 dealii::ExcMessage("Parameter does not make sense in context of FSI."));
299 AssertThrow(
300 ale_poisson_param.grid.create_coarse_triangulations ==
301 param.grid.create_coarse_triangulations,
302 dealii::ExcMessage(
303 "ALE and fluid use the same Grid, requiring the same settings in terms of multigrid coarsening."));
304
305 ale_elasticity_param.print(pcout, "List of parameters for ALE solver (elasticity):");
306
307 // boundary conditions
308 ale_elasticity_boundary_descriptor = std::make_shared<Structure::BoundaryDescriptor<dim>>();
309 set_boundary_descriptor_ale_elasticity();
310 verify_boundary_conditions(*ale_elasticity_boundary_descriptor, *grid);
311
312 // material_descriptor
313 ale_elasticity_material_descriptor = std::make_shared<Structure::MaterialDescriptor>();
314 set_material_descriptor_ale_elasticity();
315
316 // field functions
317 ale_elasticity_field_functions = std::make_shared<Structure::FieldFunctions<dim>>();
318 set_field_functions_ale_elasticity();
319 }
320 else
321 {
322 AssertThrow(false, dealii::ExcMessage("not implemented."));
323 }
324 }
325
326 IncNS::Parameters const &
327 get_parameters() const
328 {
329 return param;
330 }
331
332 std::shared_ptr<IncNS::BoundaryDescriptor<dim> const>
333 get_boundary_descriptor() const
334 {
335 return boundary_descriptor;
336 }
337
338 std::shared_ptr<IncNS::FieldFunctions<dim> const>
339 get_field_functions() const
340 {
341 return field_functions;
342 }
343
344 virtual std::shared_ptr<IncNS::PostProcessorBase<dim, Number>>
345 create_postprocessor() = 0;
346
347 Poisson::Parameters const &
348 get_parameters_ale_poisson() const
349 {
350 return ale_poisson_param;
351 }
352
353 std::shared_ptr<Poisson::BoundaryDescriptor<1, dim> const>
354 get_boundary_descriptor_ale_poisson() const
355 {
356 return ale_poisson_boundary_descriptor;
357 }
358
359 std::shared_ptr<Poisson::FieldFunctions<dim> const>
360 get_field_functions_ale_poisson() const
361 {
362 return ale_poisson_field_functions;
363 }
364
366 get_parameters_ale_elasticity() const
367 {
368 return ale_elasticity_param;
369 }
370
371 std::shared_ptr<Structure::BoundaryDescriptor<dim> const>
372 get_boundary_descriptor_ale_elasticity() const
373 {
374 return ale_elasticity_boundary_descriptor;
375 }
376
377 std::shared_ptr<Structure::MaterialDescriptor const>
378 get_material_descriptor_ale_elasticity() const
379 {
380 return ale_elasticity_material_descriptor;
381 }
382
383 std::shared_ptr<Structure::FieldFunctions<dim> const>
384 get_field_functions_ale_elasticity() const
385 {
386 return ale_elasticity_field_functions;
387 }
388
389protected:
390 MPI_Comm const mpi_comm;
391
392 dealii::ConditionalOStream pcout;
393
394 // fluid
395 IncNS::Parameters param;
396 std::shared_ptr<IncNS::FieldFunctions<dim>> field_functions;
397 std::shared_ptr<IncNS::BoundaryDescriptor<dim>> boundary_descriptor;
398
399 // ALE mesh motion
400
401 // Poisson-type mesh motion
402 Poisson::Parameters ale_poisson_param;
403 std::shared_ptr<Poisson::FieldFunctions<dim>> ale_poisson_field_functions;
404 std::shared_ptr<Poisson::BoundaryDescriptor<1, dim>> ale_poisson_boundary_descriptor;
405
406 // elasticity-type mesh motion
407 Structure::Parameters ale_elasticity_param;
408 std::shared_ptr<Structure::FieldFunctions<dim>> ale_elasticity_field_functions;
409 std::shared_ptr<Structure::BoundaryDescriptor<dim>> ale_elasticity_boundary_descriptor;
410 std::shared_ptr<Structure::MaterialDescriptor> ale_elasticity_material_descriptor;
411
412 std::string parameter_file;
413
414 OutputParameters output_parameters;
415
416private:
417 void
418 set_resolution_parameters()
419 {
420 param.degree_u = resolution.degree;
421 param.grid.n_refine_global = resolution.refine_space;
422 }
423
424 // fluid
425 virtual void
426 set_parameters() = 0;
427
428 virtual void
429 create_grid(Grid<dim> & grid,
430 std::shared_ptr<dealii::Mapping<dim>> & mapping,
431 std::shared_ptr<MultigridMappings<dim, Number>> & multigrid_mappings) = 0;
432
433 virtual void
434 set_boundary_descriptor() = 0;
435
436 virtual void
437 set_field_functions() = 0;
438
439 // ALE
440
441 // Poisson type mesh motion
442 virtual void
443 set_parameters_ale_poisson() = 0;
444
445 virtual void
446 set_boundary_descriptor_ale_poisson() = 0;
447
448 virtual void
449 set_field_functions_ale_poisson() = 0;
450
451 // elasticity type mesh motion
452 virtual void
453 set_parameters_ale_elasticity() = 0;
454
455 virtual void
456 set_boundary_descriptor_ale_elasticity() = 0;
457
458 virtual void
459 set_material_descriptor_ale_elasticity() = 0;
460
461 virtual void
462 set_field_functions_ale_elasticity() = 0;
463
465};
466} // namespace FluidFSI
467
468namespace FSI
469{
470template<int dim, typename Number>
472{
473public:
474 virtual void
475 add_parameters(dealii::ParameterHandler & prm) final
476 {
477 structure->add_parameters(prm);
478 fluid->add_parameters(prm);
479 }
480
481 virtual ~ApplicationBase()
482 {
483 }
484
485 std::shared_ptr<StructureFSI::ApplicationBase<dim, Number>> structure;
486 std::shared_ptr<FluidFSI::ApplicationBase<dim, Number>> fluid;
487};
488
489} // namespace FSI
490} // namespace ExaDG
491
492#endif /* INCLUDE_EXADG_FLUID_STRUCTURE_INTERACTION_USER_INTERFACE_APPLICATION_BASE_H_ */
Definition application_base.h:472
Definition application_base.h:203
Definition grid.h:40
Definition parameters.h:46
Definition grid.h:84
Definition parameters.h:36
Definition application_base.h:64
Definition parameters.h:40
Definition driver.cpp:33
Definition output_parameters.h:32
Definition resolution_parameters.h:81