22#ifndef INCLUDE_EXADG_FLUID_STRUCTURE_INTERACTION_SINGLE_FIELD_SOLVERS_FLUID_H_
23#define INCLUDE_EXADG_FLUID_STRUCTURE_INTERACTION_SINGLE_FIELD_SOLVERS_FLUID_H_
26#include <exadg/grid/mapping_deformation_poisson.h>
27#include <exadg/grid/mapping_deformation_structure.h>
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>
41#include <exadg/utilities/timer_tree.h>
44#include <exadg/fluid_structure_interaction/user_interface/application_base.h>
50template<
int dim,
typename Number>
54 using VectorType = dealii::LinearAlgebra::distributed::Vector<Number>;
58 timer_tree = std::make_shared<TimerTree>();
63 MPI_Comm
const mpi_comm,
69 std::shared_ptr<TimerTree>
70 get_timings_ale()
const;
73 std::shared_ptr<Grid<dim>> grid;
74 std::shared_ptr<dealii::Mapping<dim>> mapping;
76 std::shared_ptr<MultigridMappings<dim, Number>> multigrid_mappings;
79 std::shared_ptr<IncNS::SpatialOperatorBase<dim, Number>> pde_operator;
82 std::shared_ptr<IncNS::TimeIntBDF<dim, Number>> time_integrator;
85 std::shared_ptr<IncNS::PostProcessorBase<dim, Number>> postprocessor;
88 std::shared_ptr<DeformedMappingBase<dim, Number>> ale_mapping;
90 std::shared_ptr<MultigridMappings<dim, Number>> ale_multigrid_mappings;
93 std::shared_ptr<HelpersALE<dim, Number>> helpers_ale;
98 std::shared_ptr<TimerTree> timer_tree;
101template<
int dim,
typename Number>
104 MPI_Comm
const mpi_comm,
108 application->setup(grid, mapping, multigrid_mappings);
111 if(application->get_parameters().mesh_movement_type == IncNS::MeshMovementType::Poisson)
113 ale_mapping = std::make_shared<Poisson::DeformedMapping<dim, Number>>(
117 application->get_boundary_descriptor_ale_poisson(),
118 application->get_field_functions_ale_poisson(),
119 application->get_parameters_ale_poisson(),
123 else if(application->get_parameters().mesh_movement_type == IncNS::MeshMovementType::Elasticity)
125 ale_mapping = std::make_shared<Structure::DeformedMapping<dim, Number>>(
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(),
138 AssertThrow(
false, dealii::ExcMessage(
"not implemented."));
141 ale_multigrid_mappings = std::make_shared<MultigridMappings<dim, Number>>(
142 ale_mapping, application->get_parameters().mapping_degree_coarse_grids);
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(),
155 pde_operator->setup();
158 postprocessor = application->create_postprocessor();
159 postprocessor->setup(*pde_operator);
163 AssertThrow(application->get_parameters().solver_type == IncNS::SolverType::Unsteady,
164 dealii::ExcMessage(
"Invalid parameter in context of fluid-structure interaction."));
167 helpers_ale = std::make_shared<HelpersALE<dim, Number>>();
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());
175 helpers_ale->update_pde_operator_after_grid_motion = [&]() {
176 pde_operator->update_after_grid_motion(
true );
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);
184 time_integrator = IncNS::create_time_integrator<dim, Number>(
185 pde_operator, helpers_ale, postprocessor, application->get_parameters(), mpi_comm, is_test);
187 time_integrator->setup(application->get_parameters().restarted_simulation);
190template<
int dim,
typename Number>
192SolverFluid<dim, Number>::solve_ale()
const
197 dealii::Timer sub_timer;
200 helpers_ale->move_grid(time_integrator->get_next_time());
201 timer_tree->insert({
"ALE",
"Solve and reinit mapping"}, sub_timer.wall_time());
204 helpers_ale->update_pde_operator_after_grid_motion();
205 timer_tree->insert({
"ALE",
"Update matrix-free / PDE operator"}, sub_timer.wall_time());
208 time_integrator->ale_update();
209 timer_tree->insert({
"ALE",
"Update time integrator"}, sub_timer.wall_time());
211 timer_tree->insert({
"ALE"}, timer.wall_time());
214template<
int dim,
typename Number>
215std::shared_ptr<TimerTree>
216SolverFluid<dim, Number>::get_timings_ale()
const
Definition application_base.h:203