22#ifndef EXADG_FLUID_STRUCTURE_INTERACTION_PRECICE_PRECICE_ADAPTER_H_
23#define EXADG_FLUID_STRUCTURE_INTERACTION_PRECICE_PRECICE_ADAPTER_H_
26#include <deal.II/base/exceptions.h>
27#include <deal.II/base/mpi.h>
28#include <deal.II/base/utilities.h>
29#include <deal.II/fe/fe.h>
30#include <deal.II/fe/mapping_q_generic.h>
31#include <deal.II/matrix_free/matrix_free.h>
34#include <exadg/fluid_structure_interaction/precice/dof_coupling.h>
35#include <exadg/fluid_structure_interaction/precice/exadg_coupling.h>
36#include <exadg/fluid_structure_interaction/precice/quad_coupling.h>
37#include <exadg/utilities/tensor_utilities.h>
40#ifdef EXADG_WITH_PRECICE
41# include <precice/SolverInterface.hpp>
59 typename VectorizedArrayType = dealii::VectorizedArray<double>>
63 static unsigned int const rank = n_components_to_rank<data_dim, dim>();
65 using value_type =
typename CouplingBase<dim, data_dim, VectorizedArrayType>::value_type;
87 template<
typename ParameterClass>
88 Adapter(ParameterClass
const & parameters, MPI_Comm mpi_comm);
105 add_write_surface(dealii::types::boundary_id
const surface_id,
106 std::string
const & mesh_name,
107 std::vector<std::string>
const & write_data_names,
108 WriteDataType
const write_data_type,
109 dealii::MatrixFree<dim, double, VectorizedArrayType>
const & data,
110 unsigned int const dof_index,
111 unsigned int const write_quad_index);
115 add_read_surface(dealii::MatrixFree<dim, double, VectorizedArrayType>
const & data,
117 std::string
const & mesh_name,
118 std::vector<std::string>
const & read_data_name);
124 advance(
double const computed_timestep_length);
160 write_data(std::string
const & write_mesh_name,
161 std::string
const & write_data_name,
163 double const computed_timestep_length);
166 read_block_data(std::string
const & mesh_name,
const std::string & data_name)
const;
189#ifdef EXADG_WITH_PRECICE
190 std::shared_ptr<precice::SolverInterface> precice;
194 std::map<std::string, std::shared_ptr<CouplingBase<dim, data_dim, VectorizedArrayType>>> writer;
198 std::map<std::string, std::shared_ptr<ExaDGCoupling<dim, data_dim, VectorizedArrayType>>> reader;
201 std::vector<VectorType> old_state_data;
206template<
int dim,
int data_dim,
typename VectorType,
typename VectorizedArrayType>
207template<
typename ParameterClass>
212#ifdef EXADG_WITH_PRECICE
214 std::make_shared<precice::SolverInterface>(parameters.participant_name,
215 parameters.config_file,
216 dealii::Utilities::MPI::this_mpi_process(mpi_comm),
217 dealii::Utilities::MPI::n_mpi_processes(mpi_comm));
219 AssertThrow(dim == precice->getDimensions(), dealii::ExcInternalError());
224 dealii::ExcMessage(
"EXADG_WITH_PRECICE has to be activated to use this code."));
227 AssertThrow(dim > 1, dealii::ExcNotImplemented());
232template<
int dim,
int data_dim,
typename VectorType,
typename VectorizedArrayType>
234Adapter<dim, data_dim, VectorType, VectorizedArrayType>::add_write_surface(
235 dealii::types::boundary_id
const dealii_boundary_surface_id,
236 std::string
const & mesh_name,
237 std::vector<std::string>
const & write_data_names,
238 WriteDataType
const write_data_type,
239 dealii::MatrixFree<dim, double, VectorizedArrayType>
const & data,
240 unsigned int const dof_index,
241 unsigned int const quad_index)
244 auto const found_reader = reader.find(mesh_name);
246 if(found_reader != reader.end())
249 writer.insert({mesh_name, found_reader->second});
251 else if(write_data_type == WriteDataType::values_on_dofs)
255 std::make_shared<DoFCoupling<dim, data_dim, VectorizedArrayType>>(data,
256#ifdef EXADG_WITH_PRECICE
260 dealii_boundary_surface_id,
265 Assert(write_data_type == WriteDataType::values_on_q_points or
266 write_data_type == WriteDataType::normal_gradients_on_q_points,
267 dealii::ExcNotImplemented());
268 writer.insert({mesh_name,
269 std::make_shared<QuadCoupling<dim, data_dim, VectorizedArrayType>>(
271#ifdef EXADG_WITH_PRECICE
275 dealii_boundary_surface_id,
281 std::vector<dealii::Point<dim>>
const points;
282 for(
auto const & data_name : write_data_names)
283 writer.at(mesh_name)->add_write_data(data_name);
285 writer.at(mesh_name)->set_write_data_type(write_data_type);
287 writer.at(mesh_name)->define_coupling_mesh();
292template<
int dim,
int data_dim,
typename VectorType,
typename VectorizedArrayType>
294Adapter<dim, data_dim, VectorType, VectorizedArrayType>::add_read_surface(
295 dealii::MatrixFree<dim, double, VectorizedArrayType>
const & data,
296 std::shared_ptr<ContainerInterfaceData<rank, dim, double>> interface_data,
297 std::string
const & mesh_name,
298 std::vector<std::string>
const & read_data_names)
302 std::make_shared<ExaDGCoupling<dim, data_dim, VectorizedArrayType>>(data,
303#ifdef EXADG_WITH_PRECICE
309 for(
auto const & data_name : read_data_names)
310 reader.at(mesh_name)->add_read_data(data_name);
311 reader.at(mesh_name)->define_coupling_mesh();
316template<
int dim,
int data_dim,
typename VectorType,
typename VectorizedArrayType>
321#ifdef EXADG_WITH_PRECICE
326 precice->initialize();
333 if(precice->isActionRequired(precice::constants::actionWriteInitialData()))
335 writer[0]->write_data(dealii_to_precice,
"");
337 precice->markActionFulfilled(precice::constants::actionWriteInitialData());
339 precice->initializeData();
349 (void)dealii_to_precice;
353template<
int dim,
int data_dim,
typename VectorType,
typename VectorizedArrayType>
355Adapter<dim, data_dim, VectorType, VectorizedArrayType>::write_data(
356 std::string
const & write_mesh_name,
357 std::string
const & write_data_name,
359 double const computed_timestep_length)
361#ifdef EXADG_WITH_PRECICE
362 if(precice->isWriteDataRequired(computed_timestep_length))
363 writer.at(write_mesh_name)->write_data(dealii_to_precice, write_data_name);
365 (void)write_mesh_name;
366 (void)write_data_name;
367 (void)dealii_to_precice;
368 (void)computed_timestep_length;
372template<
int dim,
int data_dim,
typename VectorType,
typename VectorizedArrayType>
375 double const computed_timestep_length)
377#ifdef EXADG_WITH_PRECICE
381 precice->advance(computed_timestep_length);
383 (void)computed_timestep_length;
389template<
int dim,
int data_dim,
typename VectorType,
typename VectorizedArrayType>
391Adapter<dim, data_dim, VectorType, VectorizedArrayType>::read_block_data(
392 std::string
const & mesh_name,
393 std::string
const & data_name)
const
395 reader.at(mesh_name)->read_block_data(data_name);
400template<
int dim,
int data_dim,
typename VectorType,
typename VectorizedArrayType>
403 std::function<
void()>
const & save_state)
405#ifdef EXADG_WITH_PRECICE
408 if(precice->isActionRequired(precice::constants::actionWriteIterationCheckpoint()))
411 precice->markActionFulfilled(precice::constants::actionWriteIterationCheckpoint());
420template<
int dim,
int data_dim,
typename VectorType,
typename VectorizedArrayType>
423 std::function<
void()>
const & reload_old_state)
425#ifdef EXADG_WITH_PRECICE
428 if(precice->isActionRequired(precice::constants::actionReadIterationCheckpoint()))
431 precice->markActionFulfilled(precice::constants::actionReadIterationCheckpoint());
434 (void)reload_old_state;
440template<
int dim,
int data_dim,
typename VectorType,
typename VectorizedArrayType>
444#ifdef EXADG_WITH_PRECICE
445 return precice->isCouplingOngoing();
453template<
int dim,
int data_dim,
typename VectorType,
typename VectorizedArrayType>
457#ifdef EXADG_WITH_PRECICE
458 return precice->isTimeWindowComplete();
Definition container_interface_data.h:46
void reload_old_state_if_required(std::function< void()> const &reload_old_state)
Reloads the previously stored variables in case of an implicit coupling. The current implementation s...
Definition precice_adapter.h:422
void initialize_precice(VectorType const &dealii_to_precice)
Initializes preCICE and passes all relevant data to preCICE.
Definition precice_adapter.h:318
Adapter(ParameterClass const ¶meters, MPI_Comm mpi_comm)
Constructor, which sets up the precice Solverinterface.
Definition precice_adapter.h:208
void save_current_state_if_required(std::function< void()> const &save_state)
Saves current state of time dependent variables in case of an implicit coupling.
Definition precice_adapter.h:402
bool is_coupling_ongoing() const
is_coupling_ongoing Calls the preCICE API function isCouplingOnGoing
Definition precice_adapter.h:442
void advance(double const computed_timestep_length)
Advances preCICE after every timestep.
Definition precice_adapter.h:374
bool is_time_window_complete() const
is_time_window_complete Calls the preCICE API function isTimeWindowComplete
Definition precice_adapter.h:455