35class DriverFluid :
public Driver<dim, Number>
38 using VectorType =
typename dealii::LinearAlgebra::distributed::Vector<Number>;
41 DriverFluid(std::string
const & input_file,
42 MPI_Comm
const & comm,
45 : Driver<dim, Number>(input_file, comm, app, is_test)
47 fluid = std::make_shared<SolverFluid<dim, Number>>();
54 dealii::Timer timer_local;
56 fluid->setup(this->application->fluid, this->mpi_comm, this->is_test);
58 this->timer_tree.insert({
"FSI",
"Setup",
"Fluid"}, timer_local.wall_time());
63 setup_interface_coupling()
66 std::make_shared<ExaDG::preCICE::Adapter<dim, dim, VectorType>>(this->precice_parameters,
72 this->precice->add_write_surface(
73 *this->application->fluid->get_boundary_descriptor()->velocity->dirichlet_cached_bc.begin(),
74 this->precice_parameters.write_mesh_name,
75 {this->precice_parameters.stress_data_name},
76 this->precice_parameters.write_data_type,
77 fluid->pde_operator->get_matrix_free(),
78 fluid->pde_operator->get_dof_index_velocity(),
79 fluid->pde_operator->get_quad_index_velocity_standard());
85 if(this->application->fluid->get_parameters().mesh_movement_type ==
86 IncNS::MeshMovementType::Poisson)
88 std::shared_ptr<Poisson::DeformedMapping<dim, Number>> poisson_ale_mapping =
89 std::dynamic_pointer_cast<Poisson::DeformedMapping<dim, Number>>(fluid->ale_mapping);
91 this->precice->add_read_surface(
92 poisson_ale_mapping->get_matrix_free(),
93 poisson_ale_mapping->get_pde_operator()->get_container_interface_data(),
94 this->precice_parameters.ale_mesh_name,
95 {this->precice_parameters.displacement_data_name});
98 else if(this->application->fluid->get_parameters().mesh_movement_type ==
99 IncNS::MeshMovementType::Elasticity)
101 std::shared_ptr<Structure::DeformedMapping<dim, Number>> structure_ale_mapping =
102 std::dynamic_pointer_cast<Structure::DeformedMapping<dim, Number>>(fluid->ale_mapping);
104 this->precice->add_read_surface(
105 structure_ale_mapping->get_matrix_free(),
106 structure_ale_mapping->get_pde_operator()->get_container_interface_data_dirichlet(),
107 this->precice_parameters.ale_mesh_name,
108 {this->precice_parameters.displacement_data_name});
112 AssertThrow(
false, dealii::ExcNotImplemented());
118 this->precice->add_read_surface(fluid->pde_operator->get_matrix_free(),
119 fluid->pde_operator->get_container_interface_data(),
120 this->precice_parameters.read_mesh_name,
121 {this->precice_parameters.velocity_data_name});
125 VectorType initial_stress;
126 fluid->pde_operator->initialize_vector_velocity(initial_stress);
127 this->precice->initialize_precice(initial_stress);
138 this->pcout << std::endl <<
"Setting up fluid-structure interaction solver:" << std::endl;
140 setup_fluid_and_ale();
142 setup_interface_coupling();
144 this->timer_tree.insert({
"FSI",
"Setup"}, timer.wall_time());
152 Assert(this->application->fluid->get_parameters().adaptive_time_stepping ==
false,
153 dealii::ExcNotImplemented());
155 bool is_new_time_window =
true;
157 while(this->precice->is_coupling_ongoing())
160 fluid->time_integrator->advance_one_timestep_pre_solve(is_new_time_window);
162 this->precice->save_current_state_if_required([&]() {});
165 coupling_structure_to_ale();
171 coupling_structure_to_fluid();
174 fluid->time_integrator->advance_one_timestep_partitioned_solve(is_new_time_window);
177 coupling_fluid_to_structure();
181 dealii::Timer precice_timer;
182 this->precice->advance(fluid->time_integrator->get_time_step_size());
183 is_new_time_window = this->precice->is_time_window_complete();
184 this->timer_tree.insert({
"FSI",
"preCICE"}, precice_timer.wall_time());
188 this->precice->reload_old_state_if_required([&]() {});
191 if(is_new_time_window)
192 fluid->time_integrator->advance_one_timestep_post_solve();
197 print_performance_results(
double const total_time)
const override
201 <<
"_________________________________________________________________________________"
205 this->pcout <<
"Performance results for fluid-structure interaction solver:" << std::endl;
207 this->pcout << std::endl <<
"Fluid:" << std::endl;
208 fluid->time_integrator->print_iterations();
210 this->pcout << std::endl <<
"ALE:" << std::endl;
211 fluid->ale_mapping->print_iterations();
214 this->pcout << std::endl <<
"Wall times:" << std::endl;
216 this->timer_tree.insert({
"FSI"}, total_time);
218 this->timer_tree.insert({
"FSI"}, fluid->time_integrator->get_timings(),
"Fluid");
220 this->pcout << std::endl <<
"Timings for level 1:" << std::endl;
221 this->timer_tree.print_level(this->pcout, 1);
223 this->pcout << std::endl <<
"Timings for level 2:" << std::endl;
224 this->timer_tree.print_level(this->pcout, 2);
227 dealii::types::global_dof_index DoFs = fluid->pde_operator->get_number_of_dofs();
229 if(this->application->fluid->get_parameters().mesh_movement_type ==
230 IncNS::MeshMovementType::Poisson)
232 std::shared_ptr<Poisson::DeformedMapping<dim, Number>> poisson_ale_mapping =
233 std::dynamic_pointer_cast<Poisson::DeformedMapping<dim, Number>>(fluid->ale_mapping);
235 DoFs += poisson_ale_mapping->get_pde_operator()->get_number_of_dofs();
237 else if(this->application->fluid->get_parameters().mesh_movement_type ==
238 IncNS::MeshMovementType::Elasticity)
240 std::shared_ptr<Structure::DeformedMapping<dim, Number>> elasticity_ale_mapping =
241 std::dynamic_pointer_cast<Structure::DeformedMapping<dim, Number>>(fluid->ale_mapping);
243 DoFs += elasticity_ale_mapping->get_pde_operator()->get_number_of_dofs();
247 AssertThrow(
false, dealii::ExcMessage(
"not implemented."));
250 unsigned int const N_mpi_processes = dealii::Utilities::MPI::n_mpi_processes(this->mpi_comm);
252 dealii::Utilities::MPI::MinMaxAvg total_time_data =
253 dealii::Utilities::MPI::min_max_avg(total_time, this->mpi_comm);
254 double const total_time_avg = total_time_data.avg;
256 unsigned int N_time_steps = fluid->time_integrator->get_number_of_time_steps();
258 print_throughput_unsteady(this->pcout, DoFs, total_time_avg, N_time_steps, N_mpi_processes);
261 print_costs(this->pcout, total_time_avg, N_mpi_processes);
264 <<
"_________________________________________________________________________________"
271 coupling_structure_to_ale()
const
274 this->precice->read_block_data(this->precice_parameters.ale_mesh_name,
275 this->precice_parameters.displacement_data_name);
279 coupling_structure_to_fluid()
const
282 this->precice->read_block_data(this->precice_parameters.read_mesh_name,
283 this->precice_parameters.velocity_data_name);
287 coupling_fluid_to_structure()
const
289 VectorType stress_fluid;
290 fluid->pde_operator->initialize_vector_velocity(stress_fluid);
292 fluid->pde_operator->interpolate_stress_bc(stress_fluid,
293 fluid->time_integrator->get_velocity_np(),
294 fluid->time_integrator->get_pressure_np());
295 stress_fluid *= -1.0;
296 this->precice->write_data(this->precice_parameters.write_mesh_name,
297 this->precice_parameters.stress_data_name,
299 fluid->time_integrator->get_time_step_size());
303 std::shared_ptr<SolverFluid<dim, Number>> fluid;