22#ifndef EXADG_FLUID_STRUCTURE_INTERACTION_PRECICE_QUAD_COUPLING_H_
23#define EXADG_FLUID_STRUCTURE_INTERACTION_PRECICE_QUAD_COUPLING_H_
26#include <deal.II/matrix_free/fe_evaluation.h>
29#include <exadg/fluid_structure_interaction/precice/coupling_base.h>
42template<
int dim,
int data_dim,
typename VectorizedArrayType>
43class QuadCoupling :
public CouplingBase<dim, data_dim, VectorizedArrayType>
46 QuadCoupling(dealii::MatrixFree<dim, double, VectorizedArrayType>
const & data,
47#ifdef EXADG_WITH_PRECICE
48 std::shared_ptr<precice::SolverInterface> precice,
51 dealii::types::boundary_id
const surface_id,
52 int const mf_dof_index,
53 int const mf_quad_index);
58 using value_type =
typename CouplingBase<dim, data_dim, VectorizedArrayType>::value_type;
80 write_data(dealii::LinearAlgebra::distributed::Vector<double>
const & data_vector,
81 std::string
const & data_name)
override;
95 dealii::LinearAlgebra::distributed::Vector<double>
const & data_vector,
96 int const write_data_id,
97 dealii::EvaluationFlags::EvaluationFlags
const flags,
98 std::function<value_type(
FEFaceIntegrator &,
unsigned int)>
const & get_write_value);
101 std::vector<std::array<int, VectorizedArrayType::size()>> coupling_nodes_ids;
105 int const mf_dof_index;
106 int const mf_quad_index;
109 get_surface_type()
const override;
114template<
int dim,
int data_dim,
typename VectorizedArrayType>
115QuadCoupling<dim, data_dim, VectorizedArrayType>::QuadCoupling(
116 dealii::MatrixFree<dim, double, VectorizedArrayType>
const & data,
117#ifdef EXADG_WITH_PRECICE
118 std::shared_ptr<precice::SolverInterface> precice,
120 std::string
const mesh_name,
121 dealii::types::boundary_id
const surface_id,
122 int const mf_dof_index_,
123 int const mf_quad_index_)
124 :
CouplingBase<dim, data_dim, VectorizedArrayType>(data,
125#ifdef EXADG_WITH_PRECICE
130 mf_dof_index(mf_dof_index_),
131 mf_quad_index(mf_quad_index_)
137template<
int dim,
int data_dim,
typename VectorizedArrayType>
141 Assert(this->mesh_id != -1, dealii::ExcNotInitialized());
145 if(coupling_nodes_ids.size() > 0)
149 coupling_nodes_ids.reserve(this->
matrix_free.n_boundary_face_batches() / 2);
153 std::array<double, dim * VectorizedArrayType::size()> unrolled_vertices;
154 std::array<int, VectorizedArrayType::size()> node_ids;
155 unsigned int size = 0;
157 for(
unsigned int face = this->
matrix_free.n_inner_face_batches();
158 face < this->
matrix_free.n_boundary_face_batches() + this->matrix_free.n_inner_face_batches();
161 auto const boundary_id = this->
matrix_free.get_boundary_id(face);
164 if(boundary_id != this->dealii_boundary_surface_id)
168 int const active_faces = this->
matrix_free.n_active_entries_per_face_batch(face);
171 for(
unsigned int q = 0; q < phi.n_q_points; ++q)
173 auto const local_vertex = phi.quadrature_point(q);
179 for(
int d = 0; d < dim; ++d)
180 for(
unsigned int v = 0; v < VectorizedArrayType::size(); ++v)
181 unrolled_vertices[d + dim * v] = local_vertex[d][v];
183#ifdef EXADG_WITH_PRECICE
184 this->precice->setMeshVertices(this->mesh_id,
186 unrolled_vertices.data(),
191 coupling_nodes_ids.emplace_back(node_ids);
197 coupling_nodes_ids.resize(size);
199#ifdef EXADG_WITH_PRECICE
202 Assert(size * VectorizedArrayType::size() >=
203 static_cast<unsigned int>(this->precice->getMeshVertexSize(this->mesh_id)),
204 dealii::ExcInternalError());
206 if(this->read_data_map.size() > 0)
207 this->
print_info(
true, this->precice->getMeshVertexSize(this->mesh_id));
208 if(this->write_data_map.size() > 0)
209 this->
print_info(
false, this->precice->getMeshVertexSize(this->mesh_id));
214template<
int dim,
int data_dim,
typename VectorizedArrayType>
217 dealii::LinearAlgebra::distributed::Vector<double>
const & data_vector,
218 std::string
const & data_name)
220 int const write_data_id = this->write_data_map.at(data_name);
222 switch(this->write_data_type)
224 case WriteDataType::values_on_q_points:
225 write_data_factory(data_vector,
227 dealii::EvaluationFlags::values,
228 [](
auto & phi,
auto q_point) {
return phi.get_value(q_point); });
230 case WriteDataType::normal_gradients_on_q_points:
231 write_data_factory(data_vector,
233 dealii::EvaluationFlags::gradients,
234 [](
auto & phi,
auto q_point) {
235 return phi.get_normal_derivative(q_point);
239 AssertThrow(
false, dealii::ExcNotImplemented());
245template<
int dim,
int data_dim,
typename VectorizedArrayType>
247QuadCoupling<dim, data_dim, VectorizedArrayType>::write_data_factory(
248 dealii::LinearAlgebra::distributed::Vector<double>
const & data_vector,
249 int const write_data_id,
250 dealii::EvaluationFlags::EvaluationFlags
const flags,
251 std::function<value_type(FEFaceIntegrator &,
unsigned int)>
const & get_write_value)
253 Assert(write_data_id != -1, dealii::ExcNotInitialized());
254 Assert(coupling_nodes_ids.size() > 0, dealii::ExcNotInitialized());
256 FEFaceIntegrator phi(this->matrix_free,
true, mf_dof_index, mf_quad_index);
259 std::array<double, data_dim * VectorizedArrayType::size()> unrolled_local_data;
260 (void)unrolled_local_data;
262 auto index = coupling_nodes_ids.begin();
265 for(
unsigned int face = this->matrix_free.n_inner_face_batches();
266 face < this->matrix_free.n_boundary_face_batches() + this->matrix_free.n_inner_face_batches();
269 auto const boundary_id = this->matrix_free.get_boundary_id(face);
272 if(boundary_id != this->dealii_boundary_surface_id)
277 phi.read_dof_values_plain(data_vector);
279 int const active_faces = this->matrix_free.n_active_entries_per_face_batch(face);
281 for(
unsigned int q = 0; q < phi.n_q_points; ++q, ++index)
283 Assert(index != coupling_nodes_ids.end(), dealii::ExcInternalError());
284 auto const local_data = get_write_value(phi, q);
288 if constexpr(data_dim > 1)
292 for(
int d = 0; d < data_dim; ++d)
293 for(
unsigned int v = 0; v < VectorizedArrayType::size(); ++v)
294 unrolled_local_data[d + data_dim * v] = local_data[d][v];
296#ifdef EXADG_WITH_PRECICE
297 this->precice->writeBlockVectorData(write_data_id,
300 unrolled_local_data.data());
308#ifdef EXADG_WITH_PRECICE
309 this->precice->writeBlockScalarData(write_data_id,
321template<
int dim,
int data_dim,
typename VectorizedArrayType>
323QuadCoupling<dim, data_dim, VectorizedArrayType>::get_surface_type()
const
325 return "quadrature points using matrix-free quad index " +
326 dealii::Utilities::to_string(mf_quad_index);
Definition coupling_base.h:65
std::string const mesh_name
public precice solverinterface
Definition coupling_base.h:151
FaceIntegrator< dim, data_dim, double, VectorizedArrayType > FEFaceIntegrator
Alias for the face integrator.
Definition coupling_base.h:77
dealii::MatrixFree< dim, double, VectorizedArrayType > const & matrix_free
The dealii::MatrixFree object (preCICE can only handle double precision)
Definition coupling_base.h:143
void print_info(bool const reader, unsigned int const local_size) const
Print information of the current setup.
Definition coupling_base.h:255
virtual void define_coupling_mesh() override
define_mesh_vertices Define a vertex coupling mesh for preCICE coupling the classical preCICE way
Definition quad_coupling.h:139
typename CouplingBase< dim, data_dim, VectorizedArrayType >::FEFaceIntegrator FEFaceIntegrator
Alias as defined in the base class.
Definition quad_coupling.h:56
virtual void write_data(dealii::LinearAlgebra::distributed::Vector< double > const &data_vector, std::string const &data_name) override
write_data Evaluates the given
Definition quad_coupling.h:216