From ec4c0d5114631cd7f985cbeef26710f3779726e0 Mon Sep 17 00:00:00 2001 From: bangerth Date: Mon, 28 Oct 2013 03:09:24 +0000 Subject: [PATCH] Document the changes to WorkStream. git-svn-id: https://svn.dealii.org/trunk@31457 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/examples/step-14/step-14.cc | 163 ++++++++++++++++------------ 1 file changed, 93 insertions(+), 70 deletions(-) diff --git a/deal.II/examples/step-14/step-14.cc b/deal.II/examples/step-14/step-14.cc index 515e9159dc..989922e8ab 100644 --- a/deal.II/examples/step-14/step-14.cc +++ b/deal.II/examples/step-14/step-14.cc @@ -60,23 +60,6 @@ namespace Step14 { using namespace dealii; - namespace Assembler - { - struct Scratch - { - Scratch() {} - }; - - struct CopyData - { - CopyData() {} - - unsigned int dofs_per_cell; - FullMatrix cell_matrix; - std::vector local_dof_indices; - }; - } - // @sect3{Evaluating the solution} // As mentioned in the introduction, significant parts of the program have @@ -489,18 +472,38 @@ namespace Step14 }; + // The remainder of the class is essentially a copy of step-13 + // as well, including the data structures and functions + // necessary to compute the linear system in parallel using the + // WorkStream framework: + struct AssemblyScratchData + { + AssemblyScratchData (const FiniteElement &fe, + const Quadrature &quadrature); + AssemblyScratchData (const AssemblyScratchData &scratch_data); + + FEValues fe_values; + }; + + struct AssemblyCopyData + { + FullMatrix cell_matrix; + std::vector local_dof_indices; + }; + + void assemble_linear_system (LinearSystem &linear_system); void - assemble_matrix (const typename DoFHandler::active_cell_iterator &cell, - Assembler::Scratch &scratch, - Assembler::CopyData ©_data) const; - + local_assemble_matrix (const typename DoFHandler::active_cell_iterator &cell, + AssemblyScratchData &scratch_data, + AssemblyCopyData ©_data) const; + void - copy_local_to_global(Assembler::CopyData const ©_data, - LinearSystem &linear_system) const; + copy_local_to_global(const AssemblyCopyData ©_data, + LinearSystem &linear_system) const; }; @@ -558,30 +561,30 @@ namespace Step14 } + // The following few functions and constructors are verbatim + // copies taken from step-13: template void Solver::assemble_linear_system (LinearSystem &linear_system) { - typedef - typename DoFHandler::active_cell_iterator - active_cell_iterator; + Threads::Task<> rhs_task = Threads::new_task (&Solver::assemble_rhs, + *this, + linear_system.rhs); + + WorkStream::run(dof_handler.begin_active(), + dof_handler.end(), + std_cxx1x::bind(&Solver::local_assemble_matrix, + this, + std_cxx1x::_1, + std_cxx1x::_2, + std_cxx1x::_3), + std_cxx1x::bind(&Solver::copy_local_to_global, + this, + std_cxx1x::_1, + std_cxx1x::ref(linear_system)), + AssemblyScratchData(*fe, *quadrature), + AssemblyCopyData()); - const unsigned int n_threads = multithread_info.n_threads(); - std::vector > - thread_ranges - = Threads::split_range (dof_handler.begin_active (), - dof_handler.end (), - n_threads); - - Assembler::Scratch scratch; - Assembler::CopyData copy_data; - WorkStream::run(dof_handler.begin_active(),dof_handler.end(), - std_cxx1x::bind(&Solver::assemble_matrix,this,std_cxx1x::_1,std_cxx1x::_2,std_cxx1x::_3), - std_cxx1x::bind(&Solver::copy_local_to_global,this,std_cxx1x::_1,std_cxx1x::ref(linear_system)), - scratch,copy_data); - - - assemble_rhs (linear_system.rhs); linear_system.hanging_node_constraints.condense (linear_system.rhs); std::map boundary_value_map; @@ -590,6 +593,8 @@ namespace Step14 *boundary_values, boundary_value_map); + rhs_task.join (); + linear_system.hanging_node_constraints.condense (linear_system.matrix); MatrixTools::apply_boundary_values (boundary_value_map, @@ -599,30 +604,48 @@ namespace Step14 } + template + Solver::AssemblyScratchData:: + AssemblyScratchData (const FiniteElement &fe, + const Quadrature &quadrature) + : + fe_values (fe, + quadrature, + update_gradients | update_JxW_values) + {} + + + template + Solver::AssemblyScratchData:: + AssemblyScratchData (const AssemblyScratchData &scratch_data) + : + fe_values (scratch_data.fe_values.get_fe(), + scratch_data.fe_values.get_quadrature(), + update_gradients | update_JxW_values) + {} + + template void - Solver::assemble_matrix (const typename DoFHandler::active_cell_iterator &cell, - Assembler::Scratch &scratch, - Assembler::CopyData ©_data) const + Solver::local_assemble_matrix (const typename DoFHandler::active_cell_iterator &cell, + AssemblyScratchData &scratch_data, + AssemblyCopyData ©_data) const { - FEValues fe_values (*fe, *quadrature, - update_gradients | update_JxW_values); - - copy_data.dofs_per_cell = fe->dofs_per_cell; - const unsigned int n_q_points = quadrature->size(); + const unsigned int dofs_per_cell = fe->dofs_per_cell; + const unsigned int n_q_points = quadrature->size(); - copy_data.cell_matrix = FullMatrix (copy_data.dofs_per_cell, copy_data.dofs_per_cell); + copy_data.cell_matrix.reinit (dofs_per_cell, dofs_per_cell); - copy_data.local_dof_indices.resize(copy_data.dofs_per_cell); + copy_data.local_dof_indices.resize(dofs_per_cell); - fe_values.reinit (cell); + scratch_data.fe_values.reinit (cell); for (unsigned int q_point=0; q_pointget_dof_indices (copy_data.local_dof_indices); } @@ -631,14 +654,14 @@ namespace Step14 template void - Solver::copy_local_to_global(Assembler::CopyData const ©_data, - LinearSystem &linear_system) const - { - for (unsigned int i=0; i::copy_local_to_global(const AssemblyCopyData ©_data, + LinearSystem &linear_system) const + { + for (unsigned int i=0; i::solve_problem () { Threads::TaskGroup<> tasks; - tasks += Threads::Task<> (std_cxx1x::bind(&WeightedResidual::solve_primal_problem, - std_cxx1x::ref(*this))); - tasks += Threads::Task<> (std_cxx1x::bind(&WeightedResidual::solve_dual_problem, - std_cxx1x::ref(*this))); + tasks += Threads::new_task (&WeightedResidual::solve_primal_problem, + *this); + tasks += Threads::new_task (&WeightedResidual::solve_dual_problem, + *this); tasks.join_all(); } -- 2.39.5