From cfb831af5c7b4478b77845b59666132a6f2694c9 Mon Sep 17 00:00:00 2001 From: Guido Kanschat Date: Fri, 11 Jul 2003 15:35:41 +0000 Subject: [PATCH] must check this at home git-svn-id: https://svn.dealii.org/trunk@7873 0785d39b-7218-0410-832d-ea1e28bc413d --- .../deal.II/include/multigrid/mg_dof_tools.h | 9 +++- .../include/multigrid/mg_transfer.templates.h | 5 +- .../deal.II/source/multigrid/mg_dof_tools.cc | 53 ++++++++++++------- .../source/multigrid/mg_transfer_block.cc | 15 +++--- 4 files changed, 53 insertions(+), 29 deletions(-) diff --git a/deal.II/deal.II/include/multigrid/mg_dof_tools.h b/deal.II/deal.II/include/multigrid/mg_dof_tools.h index 738b96204d..99ce9dcb26 100644 --- a/deal.II/deal.II/include/multigrid/mg_dof_tools.h +++ b/deal.II/deal.II/include/multigrid/mg_dof_tools.h @@ -167,12 +167,19 @@ class MGTools * sorted by component in order * to obtain reasonable results * from this function. + * + * The argument + * @p{target_component} allows to + * re-sort and groupt components + * as in + * @p{DoFRenumbering::component_wise}. */ template static void reinit_vector (const MGDoFHandler& mg_dof, MGLevelObject >& v, - const std::vector& selected); + const std::vector& selected, + const std::vector& target_component); }; diff --git a/deal.II/deal.II/include/multigrid/mg_transfer.templates.h b/deal.II/deal.II/include/multigrid/mg_transfer.templates.h index 828e0865a0..1e4bee572c 100644 --- a/deal.II/deal.II/include/multigrid/mg_transfer.templates.h +++ b/deal.II/deal.II/include/multigrid/mg_transfer.templates.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -581,9 +582,7 @@ copy_to_mg (const MGDoFHandler &mg_dof_handler, dst.clear(); -//TODO:[GK] Make sure dst is not too large and sizes is filled - for (unsigned int l=minlevel;l<=maxlevel;++l) - dst[l].reinit(sizes[l]); + MGTools::reinit_vector(mg_dof_handler, dst, selected, target_component); std::vector global_dof_indices (dofs_per_cell); std::vector level_dof_indices (dofs_per_cell); diff --git a/deal.II/deal.II/source/multigrid/mg_dof_tools.cc b/deal.II/deal.II/source/multigrid/mg_dof_tools.cc index 09ac11fb1a..a44c269283 100644 --- a/deal.II/deal.II/source/multigrid/mg_dof_tools.cc +++ b/deal.II/deal.II/source/multigrid/mg_dof_tools.cc @@ -395,7 +395,8 @@ template void MGTools::reinit_vector (const MGDoFHandler& mg_dof, MGLevelObject >& v, - const std::vector& selected_in) + const std::vector& selected_in, + const std::vector& target_component) { // Copy selection vector to // non-const since we may want to @@ -408,30 +409,33 @@ MGTools::reinit_vector (const MGDoFHandler& mg_dof, // all components are selected. if (selected.size() == 0) { - selected.resize(ncomp); - std::fill_n (selected.begin(), ncomp, true); + selected.resize(target_component.size()); + std::fill_n (selected.begin(), ncomp, false); + for (unsigned int i=0;i > - ndofs(mg_dof.n_levels(), ncomp); + ndofs(mg_dof.get_tria().n_levels(), target_component.size()); count_dofs_per_component (mg_dof, ndofs); for (unsigned int level=v.get_minlevel(); level<=v.get_maxlevel();++level) { - v[level].reinit(n_selected); + v[level].reinit(n_selected, 0); unsigned int k=0; - for (unsigned int i=0;i (const MGDoFHandler (const MGDoFHandler&, - MGLevelObject >&); -template void MGTools::reinit_vector (const MGDoFHandler&, - MGLevelObject >&); - - - -template void MGTools::count_dofs_per_component (const MGDoFHandler&, - std::vector >&, - std::vector guidos_special_arg); +template void MGTools::reinit_vector ( + const MGDoFHandler&, + MGLevelObject >&); +template void MGTools::reinit_vector ( + const MGDoFHandler&, + MGLevelObject >&); + +template void MGTools::reinit_vector ( + const MGDoFHandler&, + MGLevelObject >&, + const std::vector&, + const std::vector&); +template void MGTools::reinit_vector ( + const MGDoFHandler&, + MGLevelObject >&, + const std::vector&, + const std::vector&); + + +template void MGTools::count_dofs_per_component ( + const MGDoFHandler&, + std::vector >&, + std::vector); diff --git a/deal.II/deal.II/source/multigrid/mg_transfer_block.cc b/deal.II/deal.II/source/multigrid/mg_transfer_block.cc index 9c41d0cd19..94a2875640 100644 --- a/deal.II/deal.II/source/multigrid/mg_transfer_block.cc +++ b/deal.II/deal.II/source/multigrid/mg_transfer_block.cc @@ -27,6 +27,8 @@ #include #include +#include + template void MGTransferBlockBase::build_matrices ( const MGDoFHandler& mg_dof, @@ -41,25 +43,25 @@ void MGTransferBlockBase::build_matrices ( Assert (target_component.size() == mg_dof.get_fe().n_components(), ExcDimensionMismatch(target_component.size(), mg_dof.get_fe().n_components())); -// unsigned int previous = 0; + for (unsigned int i=0;i& fe = mg_dof.get_fe(); - const unsigned int n_components = fe.n_components(); + + const unsigned int n_components = + *std::max_element(target_component.begin(), target_component.end()) + 1; const unsigned int dofs_per_cell = fe.dofs_per_cell; const unsigned int n_levels = mg_dof.get_tria().n_levels(); selected = select; - Assert (selected.size() == n_components, - ExcDimensionMismatch(selected.size(), n_components)) + Assert (selected.size() == fe.n_components(), + ExcDimensionMismatch(selected.size(), fe.n_components())) sizes.resize(n_levels); MGTools::count_dofs_per_component(mg_dof, sizes, target_component); @@ -142,7 +144,6 @@ void MGTransferBlockBase::build_matrices ( prolongation_sparsities[level]->block(i,j) .reinit(sizes[level+1][i], sizes[level][j], -//TODO:[GK] Split this by component to save memory dofs_per_cell+1); else prolongation_sparsities[level]->block(i,j) -- 2.39.5