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