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(),
132 AssertThrow(
false, dealii::ExcMessage(
"not implemented."));
135 ale_multigrid_mappings = std::make_shared<MultigridMappings<dim, Number>>(
136 ale_mapping, application->get_parameters().mapping_degree_coarse_grids);
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(),
149 pde_operator->setup();
152 postprocessor = application->create_postprocessor();
153 postprocessor->setup(*pde_operator);
157 AssertThrow(application->get_parameters().solver_type == IncNS::SolverType::Unsteady,
158 dealii::ExcMessage(
"Invalid parameter in context of fluid-structure interaction."));
161 helpers_ale = std::make_shared<HelpersALE<dim, Number>>();
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());
169 helpers_ale->update_pde_operator_after_grid_motion = [&]() {
170 pde_operator->update_after_grid_motion(
true );
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);
178 time_integrator = IncNS::create_time_integrator<dim, Number>(
179 pde_operator, helpers_ale, postprocessor, application->get_parameters(), mpi_comm, is_test);
181 time_integrator->setup(application->get_parameters().restarted_simulation);
184template<
int dim,
typename Number>
186SolverFluid<dim, Number>::solve_ale()
const
191 dealii::Timer sub_timer;
194 helpers_ale->move_grid(time_integrator->get_next_time());
195 timer_tree->insert({
"ALE",
"Solve and reinit mapping"}, sub_timer.wall_time());
198 helpers_ale->update_pde_operator_after_grid_motion();
199 timer_tree->insert({
"ALE",
"Update matrix-free / PDE operator"}, sub_timer.wall_time());
202 time_integrator->ale_update();
203 timer_tree->insert({
"ALE",
"Update time integrator"}, sub_timer.wall_time());
205 timer_tree->insert({
"ALE"}, timer.wall_time());
208template<
int dim,
typename Number>
209std::shared_ptr<TimerTree>
210SolverFluid<dim, Number>::get_timings_ale()
const
Definition application_base.h:197