From 8cae63f804c561c4a0bed04ada53a4a2ec945bf3 Mon Sep 17 00:00:00 2001 From: Daniel Arndt Date: Mon, 2 Oct 2017 16:12:44 +0200 Subject: [PATCH] Extend convert_generalized_support_point_values_to_dof_values for complex-valued types --- include/deal.II/fe/fe_tools.templates.h | 54 +++++++++++++++++++++++++ source/fe/fe_tools.inst.in | 17 ++++++++ 2 files changed, 71 insertions(+) diff --git a/include/deal.II/fe/fe_tools.templates.h b/include/deal.II/fe/fe_tools.templates.h index ac7b14fa98..8dd5e9cf4c 100644 --- a/include/deal.II/fe/fe_tools.templates.h +++ b/include/deal.II/fe/fe_tools.templates.h @@ -2947,6 +2947,60 @@ namespace FETools } + template + static void convert_helper( + const FiniteElement &finite_element, + const std::vector > > &support_point_values, + std::vector > &dof_values) + { + static Threads::ThreadLocalStorage > > + double_support_point_values_real; + static Threads::ThreadLocalStorage > + double_dof_values_real; + static Threads::ThreadLocalStorage > > + double_support_point_values_imag; + static Threads::ThreadLocalStorage > + double_dof_values_imag; + + double_support_point_values_real.get().resize(support_point_values.size()); + double_dof_values_real.get().resize(dof_values.size()); + double_support_point_values_imag.get().resize(support_point_values.size()); + double_dof_values_imag.get().resize(dof_values.size()); + + for (unsigned int i = 0; i < support_point_values.size(); ++i) + { + double_support_point_values_real.get()[i].reinit( + finite_element.n_components(), false); + double_support_point_values_imag.get()[i].reinit( + finite_element.n_components(), false); + + std::transform + (std::begin(support_point_values[i]), + std::end(support_point_values[i]), + std::begin(double_support_point_values_real.get()[i]), + [](std::complex c) -> double {return c.real();}); + + std::transform + (std::begin(support_point_values[i]), + std::end(support_point_values[i]), + std::begin(double_support_point_values_imag.get()[i]), + [](std::complex c) -> double {return c.imag();}); + } + + finite_element.convert_generalized_support_point_values_to_dof_values( + double_support_point_values_real.get(), double_dof_values_real.get()); + finite_element.convert_generalized_support_point_values_to_dof_values( + double_support_point_values_imag.get(), double_dof_values_imag.get()); + + std::transform + (std::begin(double_dof_values_real.get()), + std::end(double_dof_values_real.get()), + std::begin(double_dof_values_imag.get()), + std::begin(dof_values), + [](number real, number imag) -> std::complex {return {real, imag};}); + } + + template static void convert_helper( const FiniteElement &finite_element, diff --git a/source/fe/fe_tools.inst.in b/source/fe/fe_tools.inst.in index 53b7632fec..d122f11ae0 100644 --- a/source/fe/fe_tools.inst.in +++ b/source/fe/fe_tools.inst.in @@ -276,3 +276,20 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS; \} #endif } + +for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : SPACE_DIMENSIONS; number : COMPLEX_SCALARS) +{ +#if deal_II_dimension <= deal_II_space_dimension + namespace FETools + \{ + + template + void + convert_generalized_support_point_values_to_dof_values ( + const FiniteElement &, + const std::vector > &, + std::vector &); + + \} +#endif +} -- 2.39.5