From: kanschat Date: Tue, 1 May 2007 21:36:49 +0000 (+0000) Subject: fix copy_to/from_mg X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b2fe8a7d788a518eb118dccb7c491b549415bf4f;p=dealii-svn.git fix copy_to/from_mg git-svn-id: https://svn.dealii.org/trunk@14651 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/deal.II/include/multigrid/mg_transfer_block.h b/deal.II/deal.II/include/multigrid/mg_transfer_block.h index e48cdac38a..31acdcd5ed 100644 --- a/deal.II/deal.II/include/multigrid/mg_transfer_block.h +++ b/deal.II/deal.II/include/multigrid/mg_transfer_block.h @@ -24,6 +24,7 @@ # include #endif #include +#include #include #include @@ -90,6 +91,12 @@ class MGTransferBlockBase */ std::vector selected; + /** + * Number of blocks of multigrid + * vector. + */ + unsigned int n_mg_blocks; + /** * For each block of the whole * block vector, list to what diff --git a/deal.II/deal.II/include/multigrid/mg_transfer_block.templates.h b/deal.II/deal.II/include/multigrid/mg_transfer_block.templates.h index fba513ae2d..0ad3afee42 100644 --- a/deal.II/deal.II/include/multigrid/mg_transfer_block.templates.h +++ b/deal.II/deal.II/include/multigrid/mg_transfer_block.templates.h @@ -42,13 +42,22 @@ MGTransferBlockSelect::copy_to_mg ( MGLevelObject > &dst, const BlockVector &src) const { - MGTools::reinit_vector_by_blocks(mg_dof_handler, dst, selected, sizes); + MGTools::reinit_vector_by_blocks(mg_dof_handler, dst, selected_block, sizes); // For MGTransferBlockSelect, the // multilevel block is always the - // first, since only one block is selected. - for (unsigned int level=0;levelsecond) = src.block(selected_block)(i->first); + // first, since only one block is + // selected. + bool first = true; + for (unsigned int level=mg_dof_handler.get_tria().n_levels();level != 0;) + { + --level; + for (IT i= copy_indices[selected_block][level].begin(); + i != copy_indices[selected_block][level].end();++i) + dst[level](i->second) = src.block(selected_block)(i->first); + if (!first) + restrict_and_add (level+1, dst[level], dst[level+1]); + first = false; + } } @@ -61,14 +70,21 @@ MGTransferBlockSelect::copy_to_mg ( MGLevelObject > &dst, const Vector &src) const { - MGTools::reinit_vector_by_blocks(mg_dof_handler, dst, selected, sizes); + MGTools::reinit_vector_by_blocks(mg_dof_handler, dst, selected_block, sizes); // For MGTransferBlockSelect, the // multilevel block is always the // first, since only one block is selected. - for (unsigned int level=0;levelsecond) = src(i->first); + bool first = true; + for (unsigned int level=mg_dof_handler.get_tria().n_levels();level != 0;) + { + --level; + for (IT i= copy_indices[selected_block][level].begin(); + i != copy_indices[selected_block][level].end();++i) + dst[level](i->second) = src(i->first); + if (!first) + restrict_and_add (level+1, dst[level], dst[level+1]); + first = false; + } } @@ -158,12 +174,19 @@ MGTransferBlock::copy_to_mg ( const BlockVector& src) const { MGTools::reinit_vector_by_blocks(mg_dof_handler, dst, selected, sizes); - for (unsigned int block=0;blocksecond) = src.block(block)(i->first); + bool first = true; + for (unsigned int level=mg_dof_handler.get_tria().n_levels();level != 0;) + { + --level; + for (unsigned int block=0;blocksecond) = src.block(block)(i->first); + if (!first) + restrict_and_add (level+1, dst[level], dst[level+1]); + first = false; + } } 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 9ff04129f6..a859fb73ed 100644 --- a/deal.II/deal.II/source/multigrid/mg_transfer_block.cc +++ b/deal.II/deal.II/source/multigrid/mg_transfer_block.cc @@ -51,15 +51,13 @@ void MGTransferBlockBase::build_matrices ( // blocks and blocks used for // multigrid computations. mg_block.resize(n_blocks); - if (true) - { - unsigned int k=0; - for (unsigned int i=0;i