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