50 reinit(dealii::DoFHandler<dim>
const & dof_handler_dst_in,
51 dealii::Mapping<dim>
const & mapping_dst_in,
52 dealii::DoFHandler<dim>
const & dof_handler_src_in,
53 dealii::Mapping<dim>
const & mapping_src_in)
56 dof_handler_dst_in.get_fe().has_generalized_support_points(),
58 "Solution can only be interpolated to finite elements that have support points."));
60 dof_handler_dst = &dof_handler_dst_in;
61 dof_handler_src = &dof_handler_src_in;
63 rpe.reinit(collect_mapped_support_points(dof_handler_dst_in, mapping_dst_in),
64 dof_handler_src_in.get_triangulation(),
76 template<
int n_components,
typename VectorType1,
typename VectorType2>
79 VectorType2
const & src,
80 dealii::VectorTools::EvaluationFlags::EvaluationFlags
const flags =
81 dealii::VectorTools::EvaluationFlags::avg)
const
83 AssertThrow(src.size() == dof_handler_src->n_dofs(),
84 dealii::ExcMessage(
"Dimensions do not fit."));
85 AssertThrow(dst.size() == dof_handler_dst->n_dofs(),
86 dealii::ExcMessage(
"Dimensions do not fit."));
88 src.update_ghost_values();
90 dealii::VectorTools::point_values<n_components>(rpe, *dof_handler_src, src, flags);
91 src.zero_out_ghost_values();
93 fill_dof_vector_with_values<n_components>(dst, *dof_handler_dst, values);
97 std::vector<dealii::Point<dim>>
98 collect_mapped_support_points(dealii::DoFHandler<dim>
const & dof_handler,
99 dealii::Mapping<dim>
const & mapping)
const
101 std::vector<dealii::Point<dim>> support_points;
103 for(
auto const & cell : dof_handler.active_cell_iterators())
105 if(cell->is_locally_owned())
107 auto cellwise_support_points = cell->get_fe().get_generalized_support_points();
109 for(
auto & csp : cellwise_support_points)
110 csp = mapping.transform_unit_to_real_cell(cell, csp);
112 support_points.insert(support_points.end(),
113 cellwise_support_points.begin(),
114 cellwise_support_points.end());
118 return support_points;
121 template<
int n_components,
typename VectorType,
typename value_type>
123 fill_dof_vector_with_values(VectorType & dst,
124 dealii::DoFHandler<dim>
const & dof_handler,
125 std::vector<value_type>
const & values)
const
127 auto ptr = values.begin();
128 for(
auto const & cell : dof_handler.active_cell_iterators())
130 if(cell->is_locally_owned())
132 auto const & fe = cell->get_fe();
134 std::vector<double> dof_values(fe.n_dofs_per_cell());
135 unsigned int const n_support_points = fe.get_generalized_support_points().size();
136 std::vector<dealii::Vector<double>> component_dof_values(
137 n_support_points, dealii::Vector<double>(n_components));
139 for(
unsigned int i = 0; i < n_support_points; ++i)
141 if constexpr(n_components == 1)
143 component_dof_values[i] = *ptr;
147 component_dof_values[i] =
148 std::move(dealii::Vector<double>(ptr->begin_raw(), ptr->end_raw()));
154 fe.convert_generalized_support_point_values_to_dof_values(component_dof_values, dof_values);
156 cell->set_dof_values(dealii::Vector<typename VectorType::value_type>(dof_values.begin(),
163 dealii::SmartPointer<dealii::DoFHandler<dim>
const> dof_handler_dst;
164 dealii::SmartPointer<dealii::DoFHandler<dim>
const> dof_handler_src;
165 dealii::Utilities::MPI::RemotePointEvaluation<dim> rpe;
void reinit(dealii::DoFHandler< dim > const &dof_handler_dst_in, dealii::Mapping< dim > const &mapping_dst_in, dealii::DoFHandler< dim > const &dof_handler_src_in, dealii::Mapping< dim > const &mapping_src_in)
Definition solution_interpolation_between_triangulations.h:50
void interpolate_solution(VectorType1 &dst, VectorType2 const &src, dealii::VectorTools::EvaluationFlags::EvaluationFlags const flags=dealii::VectorTools::EvaluationFlags::avg) const
Definition solution_interpolation_between_triangulations.h:78