From 3bb2d015f6ab46a9bc261daa8b4176961367ec89 Mon Sep 17 00:00:00 2001 From: Wolfgang Bangerth <bangerth@math.tamu.edu> Date: Sun, 19 Jul 2015 09:15:09 -0500 Subject: [PATCH] Clone the base elements of FESystem in parallel. In the constructor of FESystem, we clone the base elements, which requires constructing new finite element objects -- an expensive task. This patch does this in parallel for the base elements. --- source/fe/fe_system.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/fe/fe_system.cc b/source/fe/fe_system.cc index e460f80e0b..3cffc168ef 100644 --- a/source/fe/fe_system.cc +++ b/source/fe/fe_system.cc @@ -1849,6 +1849,13 @@ void FESystem<dim,spacedim>::initialize (const std::vector<const FiniteElement<d if (multiplicities[i]>0) this->base_to_block_indices.push_back( multiplicities[i] ); + std::vector<Threads::Task<FiniteElement<dim,spacedim>*> > clone_base_elements; + + for (unsigned int i=0; i<fes.size(); i++) + if (multiplicities[i]>0) + clone_base_elements.push_back (Threads::new_task (&FiniteElement<dim,spacedim>::clone, + *fes[i])); + unsigned int ind=0; for (unsigned int i=0; i<fes.size(); i++) { @@ -1856,7 +1863,7 @@ void FESystem<dim,spacedim>::initialize (const std::vector<const FiniteElement<d { base_elements[ind] = std::make_pair (std_cxx11::shared_ptr<const FiniteElement<dim,spacedim> > - (fes[i]->clone()), + (clone_base_elements[ind].return_value()), multiplicities[i]); ++ind; } -- 2.39.5