From 1848f5ffc0e66b445b41d7c56b8f96beb435dcaa Mon Sep 17 00:00:00 2001 From: Christian Glusa Date: Fri, 22 May 2020 18:54:33 -0700 Subject: [PATCH] Fix --- .../adapters/xpetra/MueLu_RefMaxwell_decl.hpp | 22 ---- .../adapters/xpetra/MueLu_RefMaxwell_def.hpp | 114 +++++++++--------- 2 files changed, 58 insertions(+), 78 deletions(-) diff --git a/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_decl.hpp b/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_decl.hpp index 2395bb352fe6..98a53a002a16 100644 --- a/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_decl.hpp +++ b/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_decl.hpp @@ -410,28 +410,6 @@ namespace MueLu { xpExporter->setDistributorParameters(matvecParams); } - //! find nonzeros in ArrayRCP - void FindNonZeros(const Teuchos::ArrayRCP vals, - Teuchos::ArrayRCP nonzeros); - - //! - void DetectDirichletCols(const Matrix& A, - const Teuchos::ArrayRCP& dirichletRows, - Teuchos::ArrayRCP dirichletCols, - Teuchos::ArrayRCP dirichletDomain); - -#ifdef HAVE_MUELU_KOKKOS_REFACTOR - //! find nonzeros in Kokkos::View - void FindNonZeros(const typename Xpetra::MultiVector::dual_view_type::t_dev_um vals, - Kokkos::View nonzeros); - - //! - void DetectDirichletCols(const Xpetra::Matrix& A, - const Kokkos::View & dirichletRows, - Kokkos::View dirichletCols, - Kokkos::View dirichletDomain); -#endif - //! Two hierarchies: one for the coarse (1,1)-block, another for the (2,2)-block Teuchos::RCP HierarchyH_, Hierarchy22_; Teuchos::RCP PreSmoother_, PostSmoother_; diff --git a/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_def.hpp b/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_def.hpp index c89faa956d5a..022fcca04330 100644 --- a/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_def.hpp +++ b/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_def.hpp @@ -106,56 +106,30 @@ namespace MueLu { template - Teuchos::RCP > RefMaxwell::getDomainMap() const { - return SM_Matrix_->getDomainMap(); - } - - - template - Teuchos::RCP > RefMaxwell::getRangeMap() const { - return SM_Matrix_->getRangeMap(); - } - - template - void RefMaxwell::FindNonZeros(const Teuchos::ArrayRCP vals, - Teuchos::ArrayRCP nonzeros) { + void FindNonZeros(const Teuchos::ArrayRCP vals, + Teuchos::ArrayRCP nonzeros) { TEUCHOS_ASSERT(vals.size() == nonzeros.size()); + typedef typename Teuchos::ScalarTraits::magnitudeType magnitudeType; const magnitudeType eps = 2.0*Teuchos::ScalarTraits::eps(); for(size_t i=0; i(vals.size()); i++) { nonzeros[i] = (Teuchos::ScalarTraits::magnitude(vals[i]) > eps); } } -#ifdef HAVE_MUELU_KOKKOS_REFACTOR - template - void RefMaxwell::FindNonZeros(const typename Xpetra::MultiVector::dual_view_type::t_dev_um vals, - Kokkos::View nonzeros) { - using ATS = Kokkos::ArithTraits; - using range_type = Kokkos::RangePolicy; - TEUCHOS_ASSERT(vals.extent(0) == nonzeros.extent(0)); - const typename ATS::magnitudeType eps = 2.0*ATS::eps(); - - Kokkos::parallel_for("MueLu:RefMaxwell::FindNonZeros", range_type(0,vals.extent(0)), - KOKKOS_LAMBDA (const size_t i) { - nonzeros(i) = (ATS::magnitude(vals(i,0)) > eps); - }); - } -#endif - template - void RefMaxwell::DetectDirichletCols(const Xpetra::Matrix& A, - const Teuchos::ArrayRCP& dirichletRows, - Teuchos::ArrayRCP dirichletCols, - Teuchos::ArrayRCP dirichletDomain) { + void DetectDirichletCols(const Xpetra::Matrix& A, + const Teuchos::ArrayRCP& dirichletRows, + Teuchos::ArrayRCP dirichletCols, + Teuchos::ArrayRCP dirichletDomain) { const Scalar one = Teuchos::ScalarTraits::one(); - RCP domMap = A.getDomainMap(); - RCP rowMap = A.getRowMap(); - RCP colMap = A.getColMap(); + RCP > domMap = A.getDomainMap(); + RCP > rowMap = A.getRowMap(); + RCP > colMap = A.getColMap(); TEUCHOS_ASSERT(static_cast(dirichletRows.size()) == rowMap->getNodeNumElements()); TEUCHOS_ASSERT(static_cast(dirichletCols.size()) == colMap->getNodeNumElements()); TEUCHOS_ASSERT(static_cast(dirichletDomain.size()) == domMap->getNodeNumElements()); - RCP myColsToZero = MultiVectorFactory::Build(colMap, 1, /*zeroOut=*/true); + RCP > myColsToZero = Xpetra::MultiVectorFactory::Build(colMap, 1, /*zeroOut=*/true); // Find all local column indices that are in Dirichlet rows, record in myColsToZero as 1.0 for(size_t i=0; i<(size_t) dirichletRows.size(); i++) { if (dirichletRows[i]) { @@ -167,10 +141,10 @@ namespace MueLu { } } - RCP globalColsToZero; - RCP importer = A.getCrsGraph()->getImporter(); + RCP > globalColsToZero; + RCP > importer = A.getCrsGraph()->getImporter(); if (!importer.is_null()) { - globalColsToZero = MultiVectorFactory::Build(domMap, 1, /*zeroOut=*/true); + globalColsToZero = Xpetra::MultiVectorFactory::Build(domMap, 1, /*zeroOut=*/true); // export to domain map globalColsToZero->doExport(*myColsToZero,*importer,Xpetra::ADD); // import to column map @@ -179,30 +153,46 @@ namespace MueLu { else globalColsToZero = myColsToZero; - FindNonZeros(globalColsToZero->getData(0),dirichletDomain); - FindNonZeros(myColsToZero->getData(0),dirichletCols); + FindNonZeros(globalColsToZero->getData(0),dirichletDomain); + FindNonZeros(myColsToZero->getData(0),dirichletCols); } + #ifdef HAVE_MUELU_KOKKOS_REFACTOR + + template + void FindNonZeros(const typename Xpetra::MultiVector::dual_view_type::t_dev_um vals, + Kokkos::View nonzeros) { + using ATS = Kokkos::ArithTraits; + using range_type = Kokkos::RangePolicy; + TEUCHOS_ASSERT(vals.extent(0) == nonzeros.extent(0)); + const typename ATS::magnitudeType eps = 2.0*ATS::eps(); + + Kokkos::parallel_for("MueLu:RefMaxwell::FindNonZeros", range_type(0,vals.extent(0)), + KOKKOS_LAMBDA (const size_t i) { + nonzeros(i) = (ATS::magnitude(vals(i,0)) > eps); + }); + } + template - void RefMaxwell::DetectDirichletCols(const Xpetra::Matrix& A, - const Kokkos::View & dirichletRows, - Kokkos::View dirichletCols, - Kokkos::View dirichletDomain) { + void DetectDirichletCols(const Xpetra::Matrix& A, + const Kokkos::View & dirichletRows, + Kokkos::View dirichletCols, + Kokkos::View dirichletDomain) { using range_type = Kokkos::RangePolicy; const Scalar one = Teuchos::ScalarTraits::one(); - RCP domMap = A.getDomainMap(); - RCP rowMap = A.getRowMap(); - RCP colMap = A.getColMap(); + RCP > domMap = A.getDomainMap(); + RCP > rowMap = A.getRowMap(); + RCP > colMap = A.getColMap(); TEUCHOS_ASSERT(dirichletRows.extent(0) == rowMap->getNodeNumElements()); TEUCHOS_ASSERT(dirichletCols.extent(0) == colMap->getNodeNumElements()); TEUCHOS_ASSERT(dirichletDomain.extent(0) == domMap->getNodeNumElements()); - RCP myColsToZero = VectorFactory::Build(colMap, /*zeroOut=*/true); + RCP > myColsToZero = Xpetra::VectorFactory::Build(colMap, /*zeroOut=*/true); // Find all local column indices that are in Dirichlet rows, record in myColsToZero as 1.0 auto myColsToZeroView = myColsToZero->template getLocalView(); auto localMatrix = A.getLocalMatrix(); Kokkos::parallel_for("MueLu:RefMaxwell::DetectDirichletCols", range_type(0,rowMap->getNodeNumElements()), - KOKKOS_LAMBDA(const LO row) { + KOKKOS_LAMBDA(const LocalOrdinal row) { if (dirichletRows(row)) { auto rowView = localMatrix.row(row); auto length = rowView.length; @@ -212,10 +202,10 @@ namespace MueLu { } }); - RCP globalColsToZero; - RCP importer = A.getCrsGraph()->getImporter(); + RCP > globalColsToZero; + RCP > importer = A.getCrsGraph()->getImporter(); if (!importer.is_null()) { - globalColsToZero = VectorFactory::Build(domMap, /*zeroOut=*/true); + globalColsToZero = Xpetra::VectorFactory::Build(domMap, /*zeroOut=*/true); // export to domain map globalColsToZero->doExport(*myColsToZero,*importer,Xpetra::ADD); // import to column map @@ -223,12 +213,24 @@ namespace MueLu { } else globalColsToZero = myColsToZero; - FindNonZeros(globalColsToZero->template getLocalView(),dirichletDomain); - FindNonZeros(myColsToZero->template getLocalView(),dirichletCols); + FindNonZeros(globalColsToZero->template getLocalView(),dirichletDomain); + FindNonZeros(myColsToZero->template getLocalView(),dirichletCols); } #endif + template + Teuchos::RCP > RefMaxwell::getDomainMap() const { + return SM_Matrix_->getDomainMap(); + } + + + template + Teuchos::RCP > RefMaxwell::getRangeMap() const { + return SM_Matrix_->getRangeMap(); + } + + template void RefMaxwell::setParameters(Teuchos::ParameterList& list) {