From e78d66f77e511ed04b9a27ff2db01f7ce293ebb0 Mon Sep 17 00:00:00 2001 From: janssen Date: Sun, 11 Dec 2011 11:39:53 +0000 Subject: [PATCH] extract also non interface dofs git-svn-id: https://svn.dealii.org/trunk@24821 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/include/deal.II/multigrid/mg_tools.h | 5 ++ deal.II/source/multigrid/mg_tools.cc | 66 ++++++++++++++++++++ deal.II/source/multigrid/mg_tools.inst.in | 4 ++ 3 files changed, 75 insertions(+) diff --git a/deal.II/include/deal.II/multigrid/mg_tools.h b/deal.II/include/deal.II/multigrid/mg_tools.h index 5fb1420f5c..1734a4ea67 100644 --- a/deal.II/include/deal.II/multigrid/mg_tools.h +++ b/deal.II/include/deal.II/multigrid/mg_tools.h @@ -297,6 +297,11 @@ namespace MGTools void extract_inner_interface_dofs (const MGDoFHandler &mg_dof_handler, std::vector > &interface_dofs); + + template + void + extract_non_interface_dofs (const MGDoFHandler &mg_dof_handler, + std::vector > &non_interface_dofs); } /* @} */ diff --git a/deal.II/source/multigrid/mg_tools.cc b/deal.II/source/multigrid/mg_tools.cc index f021ab74b1..76b6fc0085 100644 --- a/deal.II/source/multigrid/mg_tools.cc +++ b/deal.II/source/multigrid/mg_tools.cc @@ -1460,6 +1460,72 @@ namespace MGTools } +template +void +extract_non_interface_dofs (const MGDoFHandler &mg_dof_handler, + std::vector > &non_interface_dofs) +{ + Assert (non_interface_dofs.size() == mg_dof_handler.get_tria().n_levels(), + ExcDimensionMismatch (non_interface_dofs.size(), + mg_dof_handler.get_tria().n_levels())); + + const unsigned int nlevels = mg_dof_handler.get_tria().n_levels(); + const FiniteElement &fe = mg_dof_handler.get_fe(); + + const unsigned int dofs_per_cell = fe.dofs_per_cell; + const unsigned int dofs_per_face = fe.dofs_per_face; + + std::vector local_dof_indices (dofs_per_cell); + std::vector cell_dofs(dofs_per_cell, false); + std::vector cell_dofs_interface(dofs_per_cell, false); + + typename MGDoFHandler::cell_iterator cell = mg_dof_handler.begin(), + endc = mg_dof_handler.end(); + + + bool any_dof_set = false; + for (; cell!=endc; ++cell) + { + std::fill (cell_dofs.begin(), cell_dofs.end(), false); + std::fill (cell_dofs_interface.begin(), cell_dofs_interface.end(), false); + + for (unsigned int face_nr=0; face_nr::faces_per_cell; ++face_nr) + { + const typename DoFHandler::face_iterator face = cell->face(face_nr); + if (!face->at_boundary()) + { + //interior face + const typename MGDoFHandler::cell_iterator + neighbor = cell->neighbor(face_nr); + + if ((neighbor->level() < cell->level())) + { + for (unsigned int j=0; jlevel(); + cell->get_mg_dof_indices (local_dof_indices); + + for(unsigned int i=0; i void diff --git a/deal.II/source/multigrid/mg_tools.inst.in b/deal.II/source/multigrid/mg_tools.inst.in index 5d4b07132b..18b01e5958 100644 --- a/deal.II/source/multigrid/mg_tools.inst.in +++ b/deal.II/source/multigrid/mg_tools.inst.in @@ -106,6 +106,10 @@ for (deal_II_dimension : DIMENSIONS) void extract_inner_interface_dofs (const MGDoFHandler &mg_dof_handler, std::vector > &interface_dofs); + template + void + extract_non_interface_dofs (const MGDoFHandler & mg_dof_handler, + std::vector > &non_interface_dofs); #if deal_II_dimension < 3 template void count_dofs_per_block ( -- 2.39.5