From: Peter Munch Date: Tue, 10 Aug 2021 09:14:18 +0000 (+0200) Subject: Override MGTransferGlobalCoarsening::prolongate_and_add() X-Git-Tag: v9.4.0-rc1~1095^2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eef0a635202b1555d7fd0d36897d7a1fa387add8;p=dealii.git Override MGTransferGlobalCoarsening::prolongate_and_add() --- diff --git a/include/deal.II/multigrid/mg_transfer_global_coarsening.h b/include/deal.II/multigrid/mg_transfer_global_coarsening.h index 38790e66e5..1edbf0d7bf 100644 --- a/include/deal.II/multigrid/mg_transfer_global_coarsening.h +++ b/include/deal.II/multigrid/mg_transfer_global_coarsening.h @@ -159,7 +159,7 @@ public: * Perform prolongation. */ void - prolongate(VectorType &dst, const VectorType &src) const; + prolongate_and_add(VectorType &dst, const VectorType &src) const; /** * Perform restriction. @@ -253,8 +253,9 @@ public: * Perform prolongation. */ void - prolongate(LinearAlgebra::distributed::Vector & dst, - const LinearAlgebra::distributed::Vector &src) const; + prolongate_and_add( + LinearAlgebra::distributed::Vector & dst, + const LinearAlgebra::distributed::Vector &src) const; /** * Perform restriction. @@ -475,6 +476,14 @@ public: VectorType & dst, const VectorType & src) const override; + /** + * Perform prolongation. + */ + void + prolongate_and_add(const unsigned int to_level, + VectorType & dst, + const VectorType & src) const override; + /** * Perform restriction. */ @@ -566,7 +575,20 @@ MGTransferGlobalCoarsening::prolongate( VectorType & dst, const VectorType & src) const { - this->transfer[to_level].prolongate(dst, src); + dst = 0; + prolongate_and_add(to_level, dst, src); +} + + + +template +void +MGTransferGlobalCoarsening::prolongate_and_add( + const unsigned int to_level, + VectorType & dst, + const VectorType & src) const +{ + this->transfer[to_level].prolongate_and_add(dst, src); } diff --git a/include/deal.II/multigrid/mg_transfer_global_coarsening.templates.h b/include/deal.II/multigrid/mg_transfer_global_coarsening.templates.h index 2bdb1f0bc9..5bf9a45126 100644 --- a/include/deal.II/multigrid/mg_transfer_global_coarsening.templates.h +++ b/include/deal.II/multigrid/mg_transfer_global_coarsening.templates.h @@ -2296,9 +2296,10 @@ namespace MGTransferGlobalCoarseningTools template void -MGTwoLevelTransfer>::prolongate( - LinearAlgebra::distributed::Vector & dst, - const LinearAlgebra::distributed::Vector &src) const +MGTwoLevelTransfer>:: + prolongate_and_add( + LinearAlgebra::distributed::Vector & dst, + const LinearAlgebra::distributed::Vector &src) const { using VectorizedArrayType = VectorizedArray; @@ -2339,7 +2340,7 @@ MGTwoLevelTransfer>::prolongate( this->vec_coarse .update_ghost_values(); // note: make sure that ghost values are set - if (fine_element_is_continuous) + if (fine_element_is_continuous && (use_dst_inplace == false)) *vec_fine_ptr = Number(0.); AlignedVector evaluation_data_fine; @@ -2368,7 +2369,7 @@ MGTwoLevelTransfer>::prolongate( weights[i]; else for (unsigned int i = 0; i < scheme.dofs_per_cell_fine; ++i) - vec_fine_ptr->local_element(indices_fine[i]) = + vec_fine_ptr->local_element(indices_fine[i]) += this->vec_coarse.local_element(indices_coarse[i]); indices_fine += scheme.dofs_per_cell_fine; @@ -2448,7 +2449,7 @@ MGTwoLevelTransfer>::prolongate( evaluation_data_fine[i][v] * weights[i]; else for (unsigned int i = 0; i < scheme.dofs_per_cell_fine; ++i) - vec_fine_ptr->local_element(indices[i]) = + vec_fine_ptr->local_element(indices[i]) += evaluation_data_fine[i][v]; indices += scheme.dofs_per_cell_fine; @@ -2467,7 +2468,7 @@ MGTwoLevelTransfer>::prolongate( vec_fine_ptr->compress(VectorOperation::add); if (use_dst_inplace == false) - dst.copy_locally_owned_data_from(this->vec_fine); + dst += this->vec_fine; } diff --git a/tests/multigrid-global-coarsening/mg_transfer_util.h b/tests/multigrid-global-coarsening/mg_transfer_util.h index 7cb31d2e26..162541d3d3 100644 --- a/tests/multigrid-global-coarsening/mg_transfer_util.h +++ b/tests/multigrid-global-coarsening/mg_transfer_util.h @@ -85,7 +85,8 @@ test_transfer_operator( { src = 0.0; src = 1.0; - transfer.prolongate(dst, src); + dst = 0.0; + transfer.prolongate_and_add(dst, src); // transfer operator sets only non-constrained dofs -> update the rest // via constraint matrix @@ -114,7 +115,7 @@ test_transfer_operator( src[i] = 1.0; dst = 0.0; - transfer.prolongate(dst, src); + transfer.prolongate_and_add(dst, src); for (unsigned int j = 0; j < dst.size(); j++) prolongation_matrix[j][i] = dst[j];