ExaDG
Loading...
Searching...
No Matches
fluid.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_SINGLE_FIELD_SOLVERS_FLUID_H_
23#define INCLUDE_EXADG_FLUID_STRUCTURE_INTERACTION_SINGLE_FIELD_SOLVERS_FLUID_H_
24
25// grid
26#include <exadg/grid/mapping_deformation_poisson.h>
27#include <exadg/grid/mapping_deformation_structure.h>
28
29// IncNS
30#include <exadg/incompressible_navier_stokes/postprocessor/postprocessor.h>
31#include <exadg/incompressible_navier_stokes/spatial_discretization/create_operator.h>
32#include <exadg/incompressible_navier_stokes/spatial_discretization/operator_coupled.h>
33#include <exadg/incompressible_navier_stokes/spatial_discretization/operator_dual_splitting.h>
34#include <exadg/incompressible_navier_stokes/spatial_discretization/operator_pressure_correction.h>
35#include <exadg/incompressible_navier_stokes/time_integration/create_time_integrator.h>
36#include <exadg/incompressible_navier_stokes/time_integration/time_int_bdf_coupled_solver.h>
37#include <exadg/incompressible_navier_stokes/time_integration/time_int_bdf_dual_splitting.h>
38#include <exadg/incompressible_navier_stokes/time_integration/time_int_bdf_pressure_correction.h>
39
40// utilities
41#include <exadg/utilities/timer_tree.h>
42
43// application
44#include <exadg/fluid_structure_interaction/user_interface/application_base.h>
45
46namespace ExaDG
47{
48namespace FSI
49{
50template<int dim, typename Number>
52{
53public:
54 using VectorType = dealii::LinearAlgebra::distributed::Vector<Number>;
55
57 {
58 timer_tree = std::make_shared<TimerTree>();
59 }
60
61 void
62 setup(std::shared_ptr<FluidFSI::ApplicationBase<dim, Number>> application,
63 MPI_Comm const mpi_comm,
64 bool const is_test);
65
66 void
67 solve_ale() const;
68
69 std::shared_ptr<TimerTree>
70 get_timings_ale() const;
71
72 // grid and mapping
73 std::shared_ptr<Grid<dim>> grid;
74 std::shared_ptr<dealii::Mapping<dim>> mapping;
75
76 std::shared_ptr<MultigridMappings<dim, Number>> multigrid_mappings;
77
78 // spatial discretization
79 std::shared_ptr<IncNS::SpatialOperatorBase<dim, Number>> pde_operator;
80
81 // temporal discretization
82 std::shared_ptr<IncNS::TimeIntBDF<dim, Number>> time_integrator;
83
84 // Postprocessor
85 std::shared_ptr<IncNS::PostProcessorBase<dim, Number>> postprocessor;
86
87 // ALE mapping
88 std::shared_ptr<DeformedMappingBase<dim, Number>> ale_mapping;
89
90 std::shared_ptr<MultigridMappings<dim, Number>> ale_multigrid_mappings;
91
92 // ALE helper functions required by fluid time integrator
93 std::shared_ptr<HelpersALE<dim, Number>> helpers_ale;
94
95 /*
96 * Computation time (wall clock time).
97 */
98 std::shared_ptr<TimerTree> timer_tree;
99};
100
101template<int dim, typename Number>
102void
104 MPI_Comm const mpi_comm,
105 bool const is_test)
106{
107 // setup application
108 application->setup(grid, mapping, multigrid_mappings);
109
110 // ALE: create grid motion object
111 if(application->get_parameters().mesh_movement_type == IncNS::MeshMovementType::Poisson)
112 {
113 ale_mapping = std::make_shared<Poisson::DeformedMapping<dim, Number>>(
114 grid,
115 mapping,
116 multigrid_mappings,
117 application->get_boundary_descriptor_ale_poisson(),
118 application->get_field_functions_ale_poisson(),
119 application->get_parameters_ale_poisson(),
120 "Poisson",
121 mpi_comm);
122 }
123 else if(application->get_parameters().mesh_movement_type == IncNS::MeshMovementType::Elasticity)
124 {
125 ale_mapping = std::make_shared<Structure::DeformedMapping<dim, Number>>(
126 grid,
127 mapping,
128 multigrid_mappings,
129 application->get_boundary_descriptor_ale_elasticity(),
130 application->get_field_functions_ale_elasticity(),
131 application->get_material_descriptor_ale_elasticity(),
132 application->get_parameters_ale_elasticity(),
133 "ale_elasticity",
134 mpi_comm);
135 }
136 else
137 {
138 AssertThrow(false, dealii::ExcMessage("not implemented."));
139 }
140
141 ale_multigrid_mappings = std::make_shared<MultigridMappings<dim, Number>>(
142 ale_mapping, application->get_parameters().mapping_degree_coarse_grids);
143
144 // initialize pde_operator
145 pde_operator = IncNS::create_operator<dim, Number>(grid,
146 ale_mapping->get_mapping(),
147 ale_multigrid_mappings,
148 application->get_boundary_descriptor(),
149 application->get_field_functions(),
150 application->get_parameters(),
151 "fluid",
152 mpi_comm);
153
154 // setup Navier-Stokes operator
155 pde_operator->setup();
156
157 // setup postprocessor
158 postprocessor = application->create_postprocessor();
159 postprocessor->setup(*pde_operator);
160
161 // setup time integrator before calling setup_solvers (this is necessary since the setup
162 // of the solvers depends on quantities such as the time_step_size or gamma0!)
163 AssertThrow(application->get_parameters().solver_type == IncNS::SolverType::Unsteady,
164 dealii::ExcMessage("Invalid parameter in context of fluid-structure interaction."));
165
166 // initialize time_integrator
167 helpers_ale = std::make_shared<HelpersALE<dim, Number>>();
168
169 helpers_ale->move_grid = [&](double const & time) {
170 ale_mapping->update(time,
171 time_integrator->print_solver_info(),
172 this->time_integrator->get_number_of_time_steps());
173 };
174
175 helpers_ale->update_pde_operator_after_grid_motion = [&]() {
176 pde_operator->update_after_grid_motion(true /* update_matrix_free */);
177 };
178
179 helpers_ale->fill_grid_coordinates_vector = [&](VectorType & grid_coordinates,
180 dealii::DoFHandler<dim> const & dof_handler) {
181 ale_mapping->fill_grid_coordinates_vector(grid_coordinates, dof_handler);
182 };
183
184 time_integrator = IncNS::create_time_integrator<dim, Number>(
185 pde_operator, helpers_ale, postprocessor, application->get_parameters(), mpi_comm, is_test);
186
187 time_integrator->setup(application->get_parameters().restarted_simulation);
188}
189
190template<int dim, typename Number>
191void
192SolverFluid<dim, Number>::solve_ale() const
193{
194 dealii::Timer timer;
195 timer.restart();
196
197 dealii::Timer sub_timer;
198
199 sub_timer.restart();
200 helpers_ale->move_grid(time_integrator->get_next_time());
201 timer_tree->insert({"ALE", "Solve and reinit mapping"}, sub_timer.wall_time());
202
203 sub_timer.restart();
204 helpers_ale->update_pde_operator_after_grid_motion();
205 timer_tree->insert({"ALE", "Update matrix-free / PDE operator"}, sub_timer.wall_time());
206
207 sub_timer.restart();
208 time_integrator->ale_update();
209 timer_tree->insert({"ALE", "Update time integrator"}, sub_timer.wall_time());
210
211 timer_tree->insert({"ALE"}, timer.wall_time());
212}
213
214template<int dim, typename Number>
215std::shared_ptr<TimerTree>
216SolverFluid<dim, Number>::get_timings_ale() const
217{
218 return timer_tree;
219}
220
221} // namespace FSI
222} // namespace ExaDG
223
224
225
226#endif /* INCLUDE_EXADG_FLUID_STRUCTURE_INTERACTION_SINGLE_FIELD_SOLVERS_FLUID_H_ */
Definition fluid.h:52
Definition application_base.h:203
Definition driver.cpp:33