From 541e232bf20c3f1661ea1b4a38ee4fdbfecad073 Mon Sep 17 00:00:00 2001 From: kanschat Date: Tue, 1 May 2007 23:02:40 +0000 Subject: [PATCH] Fix MGTransfer::copy_from_mg_add git-svn-id: https://svn.dealii.org/trunk@14656 0785d39b-7218-0410-832d-ea1e28bc413d --- .../deal.II/include/multigrid/mg_transfer.h | 9 ++ .../include/multigrid/mg_transfer.templates.h | 148 +++--------------- .../source/multigrid/mg_transfer_prebuilt.cc | 38 ++++- 3 files changed, 65 insertions(+), 130 deletions(-) diff --git a/deal.II/deal.II/include/multigrid/mg_transfer.h b/deal.II/deal.II/include/multigrid/mg_transfer.h index 1500a037dd..9bb9fc1f8e 100644 --- a/deal.II/deal.II/include/multigrid/mg_transfer.h +++ b/deal.II/deal.II/include/multigrid/mg_transfer.h @@ -167,6 +167,15 @@ class MGTransferPrebuilt : public MGTransferBase * child cell, i.e. the fine level. */ std::vector > > prolongation_matrices; + + /** + * Mapping for the + * copy_to/from_mg-functions. + * The data is first the global + * index, then the level index. + */ + std::vector > + copy_indices; }; 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 bef63bb128..a09d838166 100644 --- a/deal.II/deal.II/include/multigrid/mg_transfer.templates.h +++ b/deal.II/deal.II/include/multigrid/mg_transfer.templates.h @@ -29,76 +29,29 @@ DEAL_II_NAMESPACE_OPEN /* --------------------- MGTransferPrebuilt -------------- */ +// Simplify some things below +typedef std::map::const_iterator IT; template template void MGTransferPrebuilt::copy_to_mg ( - const MGDoFHandler &mg_dof_handler, - MGLevelObject &dst, - const InVector &src) const + const MGDoFHandler& mg_dof_handler, + MGLevelObject& dst, + const InVector& src) const { - const FiniteElement& fe = mg_dof_handler.get_fe(); - - const unsigned int dofs_per_cell = fe.dofs_per_cell; - - // set the elements of the vectors - // on all levels to zero - unsigned int minlevel = dst.get_minlevel(); - unsigned int maxlevel = dst.get_maxlevel(); - MGTools::reinit_vector(mg_dof_handler, dst); - - Assert(sizes.size()==mg_dof_handler.get_tria().n_levels(), - ExcMatricesNotBuilt()); - - std::vector global_dof_indices (dofs_per_cell); - std::vector level_dof_indices (dofs_per_cell); - - // traverse the grid top-down - // (i.e. starting with the most - // refined grid). this way, we can - // always get that part of one - // level of the output vector which - // corresponds to a region which is - // more refined, by restriction of - // the respective vector on the - // next finer level, which we then - // already have built. - for (int level=maxlevel; level>=static_cast(minlevel); --level) + bool first = true; + for (unsigned int level=mg_dof_handler.get_tria().n_levels();level != 0;) { - typename MGDoFHandler::active_cell_iterator - level_cell = mg_dof_handler.begin_active(level); - const typename MGDoFHandler::active_cell_iterator - level_end = mg_dof_handler.end_active(level); - - // Compute coarse level right hand side - // by restricting from fine level. - for (; level_cell!=level_end; ++level_cell) - { - // get the dof numbers of - // this cell for the global - // and the level-wise - // numbering - level_cell->get_dof_indices(global_dof_indices); - level_cell->get_mg_dof_indices (level_dof_indices); - - // transfer the global - // defect in the vector - // into the level-wise one - for (unsigned int i=0; i(level) < maxlevel) - { - restrict_and_add (level+1, dst[level], dst[level+1]); - } + --level; + for (IT i= copy_indices[level].begin(); + i != copy_indices[level].end();++i) + dst[level](i->second) = src(i->first); + if (!first) + restrict_and_add (level+1, dst[level], dst[level+1]); + first = false; } } @@ -112,39 +65,10 @@ MGTransferPrebuilt::copy_from_mg( OutVector& dst, const MGLevelObject& src) const { - const FiniteElement& fe = mg_dof_handler.get_fe(); - - const unsigned int dofs_per_cell = fe.dofs_per_cell; - std::vector global_dof_indices (dofs_per_cell); - std::vector level_dof_indices (dofs_per_cell); - - typename MGDoFHandler::active_cell_iterator - level_cell = mg_dof_handler.begin_active(); - const typename MGDoFHandler::active_cell_iterator - endc = mg_dof_handler.end(); - - // traverse all cells and copy the - // data appropriately to the output - // vector - - // Note that the level is - // monotonuosly increasing - for (; level_cell != endc; ++level_cell) - { - const unsigned int level = level_cell->level(); - - // get the dof numbers of - // this cell for the global - // and the level-wise - // numbering - level_cell->get_dof_indices (global_dof_indices); - level_cell->get_mg_dof_indices(level_dof_indices); - - // copy level-wise data to - // global vector - for (unsigned int i=0; ifirst) = src[level](i->second); } @@ -157,38 +81,10 @@ MGTransferPrebuilt::copy_from_mg_add ( OutVector &dst, const MGLevelObject &src) const { - const FiniteElement& fe = mg_dof_handler.get_fe(); - - const unsigned int dofs_per_cell = fe.dofs_per_cell; - std::vector global_dof_indices (dofs_per_cell); - std::vector level_dof_indices (dofs_per_cell); - - typename MGDoFHandler::active_cell_iterator - level_cell = mg_dof_handler.begin_active(); - const typename MGDoFHandler::active_cell_iterator - endc = mg_dof_handler.end(); - - // traverse all cells and copy the - // data appropriately to the output - // vector - - // Note that the level is - // monotonuosly increasing - for (; level_cell != endc; ++level_cell) - { - const unsigned int level = level_cell->level(); - - // get the dof numbers of - // this cell for the global - // and the level-wise - // numbering - level_cell->get_dof_indices (global_dof_indices); - level_cell->get_mg_dof_indices(level_dof_indices); - // copy level-wise data to - // global vector - for (unsigned int i=0; ifirst) += src[level](i->second); } diff --git a/deal.II/deal.II/source/multigrid/mg_transfer_prebuilt.cc b/deal.II/deal.II/source/multigrid/mg_transfer_prebuilt.cc index 291d568301..9ab4e8f599 100644 --- a/deal.II/deal.II/source/multigrid/mg_transfer_prebuilt.cc +++ b/deal.II/deal.II/source/multigrid/mg_transfer_prebuilt.cc @@ -2,7 +2,7 @@ // $Id$ // Version: $Name$ // -// Copyright (C) 2003, 2004, 2005, 2006 by the deal.II authors +// Copyright (C) 2003, 2004, 2005, 2006, 2007 by the deal.II authors // // This file is subject to QPL and may not be distributed // without copyright and license information. Please refer @@ -149,9 +149,39 @@ void MGTransferPrebuilt::build_matrices ( prolongation_matrices[level]->set (dof_indices_child[i], dof_indices_parent[j], prolongation(i,j)); - }; - }; - }; + } + } + } + + copy_indices.resize(mg_dof.get_tria().n_levels()); + std::vector global_dof_indices (dofs_per_cell); + std::vector level_dof_indices (dofs_per_cell); + for (int level=mg_dof.get_tria().n_levels()-1; level>=0; --level) + { + typename MGDoFHandler::active_cell_iterator + level_cell = mg_dof.begin_active(level); + const typename MGDoFHandler::active_cell_iterator + level_end = mg_dof.end_active(level); + + // Compute coarse level right hand side + // by restricting from fine level. + for (; level_cell!=level_end; ++level_cell) + { + DoFObjectAccessor >& global_cell = *level_cell; + // get the dof numbers of + // this cell for the global + // and the level-wise + // numbering + global_cell.get_dof_indices(global_dof_indices); + level_cell->get_mg_dof_indices (level_dof_indices); + + for (unsigned int i=0; i