22#ifndef EXADG_FLUID_STRUCTURE_INTERACTION_SINGLE_FIELD_SOLVERS_FLUID_H_
23#define EXADG_FLUID_STRUCTURE_INTERACTION_SINGLE_FIELD_SOLVERS_FLUID_H_
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>
44template<
int dim,
typename Number>
48 using VectorType = dealii::LinearAlgebra::distributed::Vector<Number>;
52 timer_tree = std::make_shared<TimerTree>();
57 MPI_Comm
const mpi_comm,
63 std::shared_ptr<TimerTree>
64 get_timings_ale()
const;
67 std::shared_ptr<Grid<dim>> grid;
68 std::shared_ptr<dealii::Mapping<dim>> mapping;
70 std::shared_ptr<MultigridMappings<dim, Number>> multigrid_mappings;
73 std::shared_ptr<IncNS::SpatialOperatorBase<dim, Number>> pde_operator;
76 std::shared_ptr<IncNS::TimeIntBDF<dim, Number>> time_integrator;
79 std::shared_ptr<IncNS::PostProcessorBase<dim, Number>> postprocessor;
82 std::shared_ptr<DeformedMappingBase<dim, Number>> ale_mapping;
84 std::shared_ptr<MultigridMappings<dim, Number>> ale_multigrid_mappings;
87 std::shared_ptr<HelpersALE<dim, Number>> helpers_ale;
92 std::shared_ptr<TimerTree> timer_tree;
95template<
int dim,
typename Number>
98 MPI_Comm
const mpi_comm,
102 application->setup(grid, mapping, multigrid_mappings);
105 if(application->get_parameters().mesh_movement_type == IncNS::MeshMovementType::Poisson)
107 ale_mapping = std::make_shared<Poisson::DeformedMapping<dim, Number>>(
111 application->get_boundary_descriptor_ale_poisson(),
112 application->get_field_functions_ale_poisson(),
113 application->get_parameters_ale_poisson(),
117 else if(application->get_parameters().mesh_movement_type == IncNS::MeshMovementType::Elasticity)
119 ale_mapping = std::make_shared<Structure::DeformedMapping<dim, Number>>(
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(),
133 AssertThrow(
false, dealii::ExcMessage(
"not implemented."));
136 ale_multigrid_mappings = std::make_shared<MultigridMappings<dim, Number>>(
137 ale_mapping, application->get_parameters().mapping_degree_coarse_grids);
140 pde_operator = IncNS::create_operator<dim, Number>(grid,
141 ale_mapping->get_mapping(),
142 ale_multigrid_mappings,
143 application->get_boundary_descriptor(),
144 application->get_field_functions(),
145 application->get_parameters(),
150 pde_operator->setup();
153 postprocessor = application->create_postprocessor();
154 postprocessor->setup(*pde_operator);
158 AssertThrow(application->get_parameters().solver_type == IncNS::SolverType::Unsteady,
159 dealii::ExcMessage(
"Invalid parameter in context of fluid-structure interaction."));
162 helpers_ale = std::make_shared<HelpersALE<dim, Number>>();
164 helpers_ale->move_grid = [&](
double const & time) {
165 ale_mapping->update(time,
166 time_integrator->print_solver_info(),
167 this->time_integrator->get_number_of_time_steps());
170 helpers_ale->update_pde_operator_after_grid_motion = [&]() {
171 pde_operator->update_after_grid_motion(
true );
174 helpers_ale->fill_grid_coordinates_vector = [&](VectorType & grid_coordinates,
175 dealii::DoFHandler<dim>
const & dof_handler) {
176 ale_mapping->fill_grid_coordinates_vector(grid_coordinates, dof_handler);
179 time_integrator = IncNS::create_time_integrator<dim, Number>(
180 pde_operator, helpers_ale, postprocessor, application->get_parameters(), mpi_comm, is_test);
182 time_integrator->setup(application->get_parameters().restarted_simulation);
185template<
int dim,
typename Number>
187SolverFluid<dim, Number>::solve_ale()
const
192 dealii::Timer sub_timer;
195 helpers_ale->move_grid(time_integrator->get_next_time());
196 timer_tree->insert({
"ALE",
"Solve and reinit mapping"}, sub_timer.wall_time());
199 helpers_ale->update_pde_operator_after_grid_motion();
200 timer_tree->insert({
"ALE",
"Update matrix-free / PDE operator"}, sub_timer.wall_time());
203 time_integrator->ale_update();
204 timer_tree->insert({
"ALE",
"Update time integrator"}, sub_timer.wall_time());
206 timer_tree->insert({
"ALE"}, timer.wall_time());
209template<
int dim,
typename Number>
210std::shared_ptr<TimerTree>
211SolverFluid<dim, Number>::get_timings_ale()
const
Definition application_base.h:197