From b012a4dcaf77be61b09276f9d01718bbc6a1933f Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Thu, 13 Nov 2014 16:47:26 +0000 Subject: [PATCH] [bugfix] The matrix communicator actually needs to different GridView objects Normally, the two different level grid views. Previously we used the same one to compute the localToGlobal renumbering for boths rows and columns. Of course that screws up the numbering. I am not quite sure when that got introduced. I may have gotten in fairly recently, after the upstreaming of the GlobalIndexSet classs. [[Imported from SVN: r9962]] --- dune/gfe/parallel/matrixcommunicator.hh | 39 +++++++++++++++++-------- dune/gfe/riemanniantrsolver.cc | 8 +++-- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/dune/gfe/parallel/matrixcommunicator.hh b/dune/gfe/parallel/matrixcommunicator.hh index c934286d..3ddd3b15 100644 --- a/dune/gfe/parallel/matrixcommunicator.hh +++ b/dune/gfe/parallel/matrixcommunicator.hh @@ -9,7 +9,7 @@ #include <dune/gfe/parallel/mpifunctions.hh> -template<typename RowGlobalMapper, typename GridView, typename MatrixType, typename LocalMapper1, typename LocalMapper2, typename ColumnGlobalMapper=RowGlobalMapper> +template<typename RowGlobalMapper, typename GridView1, typename GridView2, typename MatrixType, typename LocalMapper1, typename LocalMapper2, typename ColumnGlobalMapper=RowGlobalMapper> class MatrixCommunicator { struct TransferMatrixTuple { @@ -45,7 +45,7 @@ class MatrixCommunicator { } public: - MatrixCommunicator(const RowGlobalMapper& rowGlobalMapper, const GridView& gridView, const LocalMapper1& localMapper1, const LocalMapper2& localMapper2, const int& root) + MatrixCommunicator(const RowGlobalMapper& rowGlobalMapper, const GridView1& gridView, const LocalMapper1& localMapper1, const LocalMapper2& localMapper2, const int& root) : rowGlobalMapper_(rowGlobalMapper), columnGlobalMapper_(rowGlobalMapper), localMapper1_(localMapper1), @@ -53,18 +53,22 @@ public: communicator_(gridView.comm()), root_rank(root) { - setLocalToGlobal(gridView); + setLocalToGlobalRows(gridView); + setLocalToGlobalColumns(gridView); } - MatrixCommunicator(const RowGlobalMapper& rowGlobalMapper, const ColumnGlobalMapper& columnGlobalMapper, const GridView& gridView, const LocalMapper1& localMapper1, const LocalMapper2& localMapper2, const int& root) + MatrixCommunicator(const RowGlobalMapper& rowGlobalMapper, const ColumnGlobalMapper& columnGlobalMapper, + const GridView1& gridView1, const GridView2& gridView2, + const LocalMapper1& localMapper1, const LocalMapper2& localMapper2, const int& root) : rowGlobalMapper_(rowGlobalMapper), columnGlobalMapper_(columnGlobalMapper), localMapper1_(localMapper1), localMapper2_(localMapper2), - communicator_(gridView.comm()), + communicator_(gridView1.comm()), root_rank(root) { - setLocalToGlobal(gridView); + setLocalToGlobalRows(gridView1); + setLocalToGlobalColumns(gridView2); } MatrixType reduceAdd(const MatrixType& local) @@ -119,27 +123,38 @@ public: private: - void setLocalToGlobal(const GridView& gridView) + void setLocalToGlobalRows(const GridView1& gridView) { localToGlobal1_.resize(localMapper1_.size()); - localToGlobal2_.resize(localMapper2_.size()); for (auto it = gridView.template begin<0>(); it != gridView.template end<0>(); ++it) - for (int codim = 0; codim <= GridView::dimension; codim++) + for (int codim = 0; codim <= GridView1::dimension; codim++) for (size_t i=0; i<it->subEntities(codim); i++) { - typename RowGlobalMapper::Index localIdx; + typename LocalMapper1::Index localIdx; typename RowGlobalMapper::Index globalIdx; if (localMapper1_.contains(*it,i,codim,localIdx) and rowGlobalMapper_.contains(*it,i,codim,globalIdx)) localToGlobal1_[localIdx] = globalIdx; + } + + } + + void setLocalToGlobalColumns(const GridView2& gridView) + { + localToGlobal2_.resize(localMapper2_.size()); + for (auto it = gridView.template begin<0>(); it != gridView.template end<0>(); ++it) + for (int codim = 0; codim <= GridView2::dimension; codim++) + for (size_t i=0; i<it->subEntities(codim); i++) + { + typename LocalMapper2::Index localIdx; + typename ColumnGlobalMapper::Index globalIdx; if (localMapper2_.contains(*it,i,codim,localIdx) and columnGlobalMapper_.contains(*it,i,codim,globalIdx)) localToGlobal2_[localIdx] = globalIdx; } - } // Mappers for the global numbering @@ -150,7 +165,7 @@ private: const LocalMapper1& localMapper1_; const LocalMapper2& localMapper2_; - const typename GridView::CollectiveCommunication& communicator_; + const typename GridView1::CollectiveCommunication& communicator_; int root_rank; std::vector<typename RowGlobalMapper::Index> localToGlobal1_; diff --git a/dune/gfe/riemanniantrsolver.cc b/dune/gfe/riemanniantrsolver.cc index 4a3f567d..8f9d44b4 100644 --- a/dune/gfe/riemanniantrsolver.cc +++ b/dune/gfe/riemanniantrsolver.cc @@ -131,6 +131,7 @@ setup(const GridType& grid, LocalMapper localMapper(grid_->leafGridView()); MatrixCommunicator<GlobalMapper, + typename GridType::LeafGridView, typename GridType::LeafGridView, ScalarMatrixType, LocalMapper, @@ -199,11 +200,12 @@ setup(const GridType& grid, typedef typename TruncatedCompressedMGTransfer<CorrectionType>::TransferOperatorType TransferOperatorType; MatrixCommunicator<GlobalMapper, + typename GridType::LeafGridView, typename GridType::LeafGridView, TransferOperatorType, LocalMapper, LeafP1LocalMapper, - GlobalLeafP1Mapper> matrixComm(*globalMapper_, p1Index, grid_->leafGridView(), localMapper, leafP1LocalMapper, 0); + GlobalLeafP1Mapper> matrixComm(*globalMapper_, p1Index, grid_->leafGridView(), grid_->leafGridView(), localMapper, leafP1LocalMapper, 0); mmgStep->mgTransfer_.back() = new PKtoP1MGTransfer<CorrectionType>; Dune::shared_ptr<TransferOperatorType> topTransferOperator = Dune::make_shared<TransferOperatorType>(matrixComm.reduceCopy(topTransferOp->getMatrix())); @@ -226,10 +228,11 @@ setup(const GridType& grid, typedef typename TruncatedCompressedMGTransfer<CorrectionType>::TransferOperatorType TransferOperatorType; MatrixCommunicator<GlobalLevelP1Mapper, + typename GridType::LevelGridView, typename GridType::LevelGridView, TransferOperatorType, LevelLocalMapper, - LevelLocalMapper> matrixComm(fineGUIndex, coarseGUIndex, grid_->levelGridView(i+1), fineLevelLocalMapper, coarseLevelLocalMapper, 0); + LevelLocalMapper> matrixComm(fineGUIndex, coarseGUIndex, grid_->levelGridView(i+2), grid_->levelGridView(i+1), fineLevelLocalMapper, coarseLevelLocalMapper, 0); mmgStep->mgTransfer_[i] = new TruncatedCompressedMGTransfer<CorrectionType>; Dune::shared_ptr<TransferOperatorType> transferOperatorMatrix = Dune::make_shared<TransferOperatorType>(matrixComm.reduceCopy(newTransferOp->getMatrix())); @@ -337,6 +340,7 @@ void RiemannianTrustRegionSolver<GridType,TargetSpace>::solve() LocalMapper localMapper(grid_->leafGridView()); MatrixCommunicator<GlobalMapper, + typename GridType::LeafGridView, typename GridType::LeafGridView, MatrixType, LocalMapper, -- GitLab