36template <
int dim,
typename number,
int n_components>
44 , n_coefficients{inclusions_.n_coefficients}
46 [[maybe_unused]]
auto parallel_triangulation =
48 &dof_handler_.get_triangulation());
49 Assert((parallel_triangulation !=
nullptr),
50 ExcMessage(
"Only p::d::T triangulations are supported."));
54 constraints = &constraints_;
55 dof_handler = &dof_handler_;
56 inclusions = &inclusions_;
59 std::vector<Point<dim>> locations(
60 inclusions->inclusions_as_particles.n_locally_owned_particles());
62 inclusions->inclusions_as_particles)
63 .get_particle_positions(locations);
65 rpe.reinit(locations, dof_handler->get_triangulation(), *mapping);
68 Assert(rpe.all_points_found(),
69 ExcInternalError(
"Not all points have been"
70 "found during the geometric search procedure."));
75template <
int dim,
typename number,
int n_components>
85template <
int dim,
typename number,
int n_components>
91 ExcInternalError(
"Remote evaluator has not been initialized."));
96 std::vector<number> integration_values;
97 const unsigned int n_dofs_per_cell =
fe->n_dofs_per_cell();
100 std::vector<types::global_dof_index> inclusion_dof_indices(
103 auto particle =
inclusions->inclusions_as_particles.begin();
104 while (particle !=
inclusions->inclusions_as_particles.end())
106 const auto id = particle->get_id();
107 inclusion_dof_indices =
inclusions->get_dof_indices(
id);
108 const auto &inclusion_fe_values =
inclusions->get_fe_values(
id);
110 double value_per_particle = 0.;
111 for (
unsigned int j = 0; j <
inclusions->n_coefficients; ++j)
113 value_per_particle +=
114 inclusion_fe_values[j] * src(inclusion_dof_indices[j]);
116 integration_values.push_back(value_per_particle);
121 const auto integration_function = [&](
const auto &values,
122 const auto &cell_data) {
125 std::vector<double> local_values;
126 std::vector<types::global_dof_index> local_dof_indices;
128 for (
const auto cell : cell_data.cell_indices())
131 cell_data.get_active_cell_iterator(cell)->as_dof_handler_iterator(
135 const auto unit_points = cell_data.get_unit_points(cell);
136 const auto inclusion_values = cell_data.get_data_view(cell, values);
138 phi_force.
reinit(cell_dh, unit_points);
143 local_values.resize(n_dofs_per_cell);
146 local_dof_indices.resize(n_dofs_per_cell);
147 cell_dh->get_dof_indices(local_dof_indices);
148 constraints->distribute_local_to_global(local_values,
154 rpe.template process_and_evaluate<number>(integration_values,
155 integration_function);
161template <
int dim,
typename number,
int n_components>
167 ExcInternalError(
"Remote evaluator has not been initialized."));
172 const auto evaluation_function = [&](
const auto &values,
173 const auto &cell_data) {
178 std::vector<double> local_values;
179 const unsigned int n_dofs_per_cell =
fe->n_dofs_per_cell();
181 for (
const auto cell : cell_data.cell_indices())
184 cell_data.get_active_cell_iterator(cell)->as_dof_handler_iterator(
187 const auto unit_points = cell_data.get_unit_points(cell);
188 const auto local_value = cell_data.get_data_view(cell, values);
190 local_values.resize(n_dofs_per_cell);
193 local_values.
begin(),
196 evaluator.
reinit(cell_dh, unit_points);
199 for (
unsigned int q = 0; q < unit_points.size(); ++q)
205 const std::vector<number> output =
206 rpe.template evaluate_and_process<number>(evaluation_function);
208 std::vector<types::global_dof_index> inclusion_dof_indices(
211 auto particle =
inclusions->inclusions_as_particles.begin();
212 while (particle !=
inclusions->inclusions_as_particles.end())
214 const auto id = particle->get_id();
215 const auto local_id = particle->get_local_index();
216 inclusion_dof_indices =
inclusions->get_dof_indices(
id);
217 const auto &inclusion_fe_values =
inclusions->get_fe_values(
id);
219 for (
unsigned int j = 0; j <
inclusions->n_coefficients; ++j)
220 dst(inclusion_dof_indices[j]) +=
221 inclusion_fe_values[j] * output[local_id];
231template <
int dim,
typename number,
int n_components>
238 ExcInternalError(
"Remote evaluator has not been initialized."));
240 tmp_vector.
reinit(dst,
true);
241 vmult(tmp_vector, src);
245template <
int dim,
typename number,
int n_components>
252 ExcInternalError(
"Remote evaluator has not been initialized."));
254 tmp_vector.
reinit(dst,
true);
std_cxx20::ranges::iota_view< unsigned int, unsigned int > quadrature_point_indices() const
const value_type & get_value(const unsigned int point_index) const
void submit_value(const value_type &value, const unsigned int point_index)
void evaluate(const StridedArrayView< const ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &evaluation_flags)
void test_and_sum(const StridedArrayView< ScalarNumber, stride_view > &solution_values, const EvaluationFlags::EvaluationFlags &integration_flags, const bool sum_into_values=false)
void reinit(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const ArrayView< const Point< dim > > &unit_points)
void update_ghost_values() const
void compress(VectorOperation::values operation)
void reinit(const size_type size, const bool omit_zeroing_entries=false)
void initialize_dof_vector(VectorType &vec) const
void vmult(VectorType &dst, const VectorType &src) const
void vmult_add(VectorType &dst, const VectorType &src) const
ObserverPointer< const FiniteElement< dim > > fe
void Tvmult_add(VectorType &dst, const VectorType &src) const
ObserverPointer< const Inclusions< dim > > inclusions
ObserverPointer< const Mapping< dim > > mapping
LinearAlgebra::distributed::Vector< number > VectorType
void Tvmult(VectorType &dst, const VectorType &src) const
ObserverPointer< const AffineConstraints< number > > constraints
CouplingOperator(const Inclusions< dim > &inclusions, const DoFHandler< dim > &dof_handler, const AffineConstraints< number > &constraints=AffineConstraints< number >(), const MappingQ< dim > &mapping=MappingQ1< dim >(), const FiniteElement< dim > &fe=FE_Q< dim >(1))
Utilities::MPI::RemotePointEvaluation< dim > rpe
ObserverPointer< const DoFHandler< dim > > dof_handler
Class for handling inclusions in an immersed boundary method.
unsigned int rtree_extraction_level
#define Assert(cond, exc)
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)