From 85193915a0bfef381fc726c30dcb12f1e7d4b8ae Mon Sep 17 00:00:00 2001 From: Jean-Paul Pelteret Date: Thu, 10 Aug 2017 17:05:55 -0600 Subject: [PATCH] Added Tensor::get_function_values_from_local_dof_values --- include/deal.II/fe/fe_values.h | 44 ++++++++++++++++++++++++++++++++++ source/fe/fe_values.cc | 20 ++++++++++++++++ source/fe/fe_values.inst.in | 7 ++++++ 3 files changed, 71 insertions(+) diff --git a/include/deal.II/fe/fe_values.h b/include/deal.II/fe/fe_values.h index 91f1df7b71..1e4fd53119 100644 --- a/include/deal.II/fe/fe_values.h +++ b/include/deal.II/fe/fe_values.h @@ -1400,6 +1400,26 @@ namespace FEValuesViews */ typedef dealii::Tensor<1, spacedim> divergence_type; + /** + * A struct that provides the output type for the product of the value + * and derivatives of basis functions of the Tensor view and any @p Number type. + */ + template + struct OutputType + { + /** + * A typedef for the data type of the product of a @p Number and the + * values of the view the Tensor class. + */ + typedef typename ProductType::type, typename Tensor<2,dim,spacedim>::value_type>::type value_type; + + /** + * A typedef for the data type of the product of a @p Number and the + * divergences of the view the Tensor class. + */ + typedef typename ProductType::type, typename Tensor<2,dim,spacedim>::divergence_type>::type divergence_type; + }; + /** * A structure where for each shape function we pre-compute a bunch of * data that will make later accesses much cheaper. @@ -1522,6 +1542,30 @@ namespace FEValuesViews void get_function_values (const InputVector &fe_function, std::vector::type> &values) const; + /** + * Same as above, but using a vector of local degree-of-freedom values. + * + * The @p dof_values vector must have a length equal to number of DoFs on + * a cell, and each entry @p dof_values[i] is the value of the local DoF + * @p i. The fundamental prerequisite for the @p InputVector is that it must + * be possible to create an ArrayView from it; this is satisfied by the + * @p std::vector class. + * + * The DoF values typically would be obtained in the following way: + * @code + * Vector local_dof_values(cell->get_fe().dofs_per_cell); + * cell->get_dof_values(solution, local_dof_values); + * @endcode + * or, for a generic @p Number type, + * @code + * std::vector local_dof_values(cell->get_fe().dofs_per_cell); + * cell->get_dof_values(solution, local_dof_values.begin(), local_dof_values.end()); + * @endcode + */ + template + void get_function_values_from_local_dof_values (const InputVector &dof_values, + std::vector::value_type> &values) const; + /** * Return the divergence of the selected vector components of the finite diff --git a/source/fe/fe_values.cc b/source/fe/fe_values.cc index 7ad5950c78..834f494f21 100644 --- a/source/fe/fe_values.cc +++ b/source/fe/fe_values.cc @@ -1959,6 +1959,26 @@ namespace FEValuesViews + template + template + void + Tensor<2, dim, spacedim>:: + get_function_values_from_local_dof_values (const InputVector &dof_values, + std::vector::value_type> &values) const + { + Assert(fe_values->update_flags & update_values, + (typename FEValuesBase::ExcAccessToUninitializedField("update_values"))); + Assert(fe_values->present_cell.get() != nullptr, + ExcMessage("FEValues object is not reinit'ed to any cell")); + AssertDimension (dof_values.size(), fe_values->dofs_per_cell); + + internal::do_function_values + (make_array_view(dof_values.begin(), dof_values.end()), + fe_values->finite_element_output.shape_values, shape_function_data, values); + } + + + template template void diff --git a/source/fe/fe_values.inst.in b/source/fe/fe_values.inst.in index 514ebd6834..f9a258895b 100644 --- a/source/fe/fe_values.inst.in +++ b/source/fe/fe_values.inst.in @@ -223,6 +223,13 @@ for (VEC : GENERAL_CONTAINER_TYPES; void FEValuesViews::SymmetricTensor<2,deal_II_dimension, deal_II_space_dimension> ::get_function_divergences_from_local_dof_values> (const VEC&, std::vector::divergence_type>&) const; + + + + template + void FEValuesViews::Tensor<2,deal_II_dimension, deal_II_space_dimension> + ::get_function_values_from_local_dof_values> + (const VEC&, std::vector::value_type>&) const; #endif } -- 2.39.5