43class DoFCoupling :
public CouplingBase<dim, data_dim, VectorizedArrayType>
46 DoFCoupling(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);
69 write_data(dealii::LinearAlgebra::distributed::Vector<double>
const & data_vector,
70 std::string
const & data_name)
override;
75 std::vector<int> coupling_nodes_ids;
77 std::vector<std::array<dealii::types::global_dof_index, data_dim>> global_indices;
81 int const mf_dof_index;
84 get_surface_type()
const override;
114 Assert(this->mesh_id != -1, dealii::ExcNotInitialized());
118 if(coupling_nodes_ids.size() > 0)
122 auto const get_component_dofs = [&](
int const component) {
124 dealii::ComponentMask component_mask(data_dim,
false);
125 component_mask.set(component,
true);
131 dealii::IndexSet
const indices =
132 (dealii::DoFTools::extract_boundary_dofs(this->
matrix_free.get_dof_handler(mf_dof_index),
134 std::set<dealii::types::boundary_id>{
135 this->dealii_boundary_surface_id}) &
136 this->
matrix_free.get_dof_handler(mf_dof_index).locally_owned_dofs());
138 Assert(indices.n_elements() * data_dim ==
139 this->matrix_free.get_dof_handler(mf_dof_index)
141 std::set<dealii::types::boundary_id>{this->dealii_boundary_surface_id}),
142 dealii::ExcInternalError());
146 global_indices.resize(indices.n_elements());
148 dealii::types::global_dof_index iterator = 0;
149 for(
auto const dof : indices)
151 global_indices[iterator][component] = dof;
157 for(
int d = 0; d < data_dim; ++d)
158 get_component_dofs(d);
161 std::map<dealii::types::global_dof_index, dealii::Point<dim>> support_points;
162 dealii::ComponentMask component_mask(data_dim,
false);
163 component_mask.set(0,
true);
165 dealii::DoFTools::map_boundary_dofs_to_support_points(
167 this->matrix_free.get_dof_handler(mf_dof_index),
170 this->dealii_boundary_surface_id);
174 coupling_nodes_ids.reserve(global_indices.size());
175 std::array<double, dim> nodes_position;
176 for(std::size_t i = 0; i < global_indices.size(); ++i)
179 auto const element = global_indices[i][0];
180 for(
int d = 0; d < dim; ++d)
181 nodes_position[d] = support_points[element][d];
184#ifdef EXADG_WITH_PRECICE
185 int const precice_id = this->precice->setMeshVertex(this->mesh_id, nodes_position.data());
187 int const precice_id = 0;
189 coupling_nodes_ids.emplace_back(precice_id);
192#ifdef EXADG_WITH_PRECICE
193 if(this->read_data_map.size() > 0)
194 this->
print_info(
true, this->precice->getMeshVertexSize(this->mesh_id));
195 if(this->write_data_map.size() > 0)
196 this->
print_info(
false, this->precice->getMeshVertexSize(this->mesh_id));
205 dealii::LinearAlgebra::distributed::Vector<double>
const & data_vector,
206 std::string
const & data_name)
208 int const write_data_id = this->write_data_map.at(data_name);
209 Assert(write_data_id != -1, dealii::ExcNotInitialized());
210 Assert(coupling_nodes_ids.size() > 0, dealii::ExcNotInitialized());
213 for(std::size_t i = 0; i < global_indices.size(); ++i)
216 for(
unsigned int d = 0; d < data_dim; ++d)
218 auto const element = global_indices[i][d];
222#ifdef EXADG_WITH_PRECICE
224 if constexpr(data_dim > 1)
226 this->precice->writeVectorData(write_data_id, coupling_nodes_ids[i],
write_data.data());
230 this->precice->writeScalarData(write_data_id, coupling_nodes_ids[i],
write_data[0]);
dealii::MatrixFree< dim, double, VectorizedArrayType > const & matrix_free
The dealii::MatrixFree object (preCICE can only handle double precision)
Definition coupling_base.h:144
void print_info(bool const reader, unsigned int const local_size) const
Print information of the current setup.
Definition coupling_base.h:256
virtual void write_data(dealii::LinearAlgebra::distributed::Vector< double > const &data_vector, std::string const &data_name) override
write_data Evaluates the given
Definition dof_coupling.h:204