72#undef MUELU_UTILITIESBASE_SHORT
75 typedef typename Teuchos::ScalarTraits<Scalar>::magnitudeType
Magnitude;
77 static RCP<Matrix>
Crs2Op(RCP<CrsMatrix> Op);
94 static RCP<Xpetra::CrsGraph<LocalOrdinal, GlobalOrdinal, Node>>
GetThresholdedGraph(
const RCP<Matrix>& A,
const Magnitude threshold,
const bool symScaled =
false);
127 static RCP<Vector>
GetMatrixDiagonalInverse(
const Matrix& A,
Magnitude tol = Teuchos::ScalarTraits<Scalar>::eps() * 100,
Scalar valReplacement = Teuchos::ScalarTraits<Scalar>::zero(),
const bool doLumped =
false);
136 Magnitude tol = Teuchos::ScalarTraits<Scalar>::magnitude(Teuchos::ScalarTraits<Scalar>::zero()),
137 Scalar valReplacement = Teuchos::ScalarTraits<Scalar>::zero(),
138 const bool replaceSingleEntryRowWithZero =
false,
139 const bool useAverageAbsDiagVal =
false);
149 static Teuchos::RCP<Vector>
GetMatrixMaxMinusOffDiagonal(
const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
const Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node>& BlockNumber);
158 static Teuchos::RCP<Vector>
GetInverse(Teuchos::RCP<const Vector> v,
Magnitude tol = Teuchos::ScalarTraits<Scalar>::eps() * 100,
Scalar valReplacement = Teuchos::ScalarTraits<Scalar>::zero());
179 static RCP<Xpetra::Vector<Magnitude, LocalOrdinal, GlobalOrdinal, Node>>
195 static Teuchos::Array<Magnitude>
ResidualNorm(
const Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Op,
const MultiVector& X,
const MultiVector& RHS);
197 static Teuchos::Array<Magnitude>
ResidualNorm(
const Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Op,
const MultiVector& X,
const MultiVector& RHS, MultiVector& Resid);
199 static RCP<MultiVector>
Residual(
const Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Op,
const MultiVector& X,
const MultiVector& RHS);
201 static void Residual(
const Xpetra::Operator<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Op,
const MultiVector& X,
const MultiVector& RHS, MultiVector& Resid);
216 LocalOrdinal niters = 10,
Magnitude tolerance = 1e-2,
Magnitude diagonalReplacementTol = Teuchos::ScalarTraits<Scalar>::eps() * 100,
bool verbose =
false,
unsigned int seed = 123);
230 LocalOrdinal niters = 10,
Magnitude tolerance = 1e-2,
bool verbose =
false,
unsigned int seed = 123);
232 static RCP<Teuchos::FancyOStream>
MakeFancy(std::ostream& os);
238 static typename Teuchos::ScalarTraits<Scalar>::magnitudeType
Distance2(
const Teuchos::Array<Teuchos::ArrayRCP<const Scalar>>& v,
LocalOrdinal i0,
LocalOrdinal i1);
244 static typename Teuchos::ScalarTraits<Scalar>::magnitudeType
Distance2(
const Teuchos::ArrayView<double>& weight,
const Teuchos::Array<Teuchos::ArrayRCP<const Scalar>>& v,
LocalOrdinal i0,
LocalOrdinal i1);
258 static Teuchos::ArrayRCP<const bool>
DetectDirichletRows(
const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
const Magnitude& tol = Teuchos::ScalarTraits<Magnitude>::zero(),
bool count_twos_as_dirichlet =
false);
267 static Kokkos::View<bool*, typename NO::device_type::memory_space>
DetectDirichletRows_kokkos(
const Matrix& A,
const Magnitude& tol = Teuchos::ScalarTraits<
typename Teuchos::ScalarTraits<SC>::magnitudeType>::zero(),
const bool count_twos_as_dirichlet =
false);
268 static Kokkos::View<bool*, typename Kokkos::HostSpace>
DetectDirichletRows_kokkos_host(
const Matrix& A,
const Magnitude& tol = Teuchos::ScalarTraits<
typename Teuchos::ScalarTraits<SC>::magnitudeType>::zero(),
const bool count_twos_as_dirichlet =
false);
282 static Teuchos::ArrayRCP<const bool>
DetectDirichletRowsExt(
const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
bool& bHasZeroDiagonal,
const Magnitude& tol = Teuchos::ScalarTraits<Scalar>::zero());
289 static void EnforceInitialCondition(
const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& RHS, Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>& InitialGuess,
const Magnitude& tol = Teuchos::ScalarTraits<Magnitude>::zero(),
const bool count_twos_as_dirichlet =
false);
298 static void FindNonZeros(
const Teuchos::ArrayRCP<const Scalar> vals,
299 Teuchos::ArrayRCP<bool> nonzeros);
307 static void FindNonZeros(
const typename Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>::dual_view_type::t_dev_const_um vals,
308 Kokkos::View<bool*, typename Node::device_type> nonzeros);
319 const Teuchos::ArrayRCP<bool>& dirichletRows,
320 Teuchos::ArrayRCP<bool> dirichletCols,
321 Teuchos::ArrayRCP<bool> dirichletDomain);
331 const Kokkos::View<bool*, typename Node::device_type>& dirichletRows,
332 Kokkos::View<bool*, typename Node::device_type> dirichletCols,
333 Kokkos::View<bool*, typename Node::device_type> dirichletDomain);
346 static void ApplyRowSumCriterion(
const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
const Magnitude rowSumTol, Teuchos::ArrayRCP<bool>& dirichletRows);
348 static void ApplyRowSumCriterion(
const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
const Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node>& BlockNumber,
const Magnitude rowSumTol, Teuchos::ArrayRCP<bool>& dirichletRows);
351 const typename Teuchos::ScalarTraits<Scalar>::magnitudeType rowSumTol,
352 Kokkos::View<bool*, typename NO::device_type::memory_space>& dirichletRows);
355 const typename Teuchos::ScalarTraits<Scalar>::magnitudeType rowSumTol,
356 Kokkos::View<bool*, Kokkos::HostSpace>& dirichletRows);
359 const Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node>& BlockNumber,
360 const typename Teuchos::ScalarTraits<Scalar>::magnitudeType rowSumTol,
361 Kokkos::View<bool*, typename NO::device_type::memory_space>& dirichletRows);
364 const Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node>& BlockNumber,
365 const typename Teuchos::ScalarTraits<Scalar>::magnitudeType rowSumTol,
366 Kokkos::View<bool*, Kokkos::HostSpace>& dirichletRows);
378 static Teuchos::ArrayRCP<const bool>
DetectDirichletCols(
const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
379 const Teuchos::ArrayRCP<const bool>& dirichletRows);
391 static Kokkos::View<bool*, typename NO::device_type>
DetectDirichletCols(
const Matrix& A,
const Kokkos::View<const bool*, typename NO::device_type>& dirichletRows);
397 static Scalar Frobenius(
const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& A,
const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& B);
413 static void FindDirichletRows(Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& A,
414 std::vector<LocalOrdinal>& dirichletRows,
bool count_twos_as_dirichlet =
false);
418 static void ApplyOAZToMatrixRows(Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& A,
419 const std::vector<LocalOrdinal>& dirichletRows);
423 static void ApplyOAZToMatrixRows(Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& A,
424 const Teuchos::ArrayRCP<const bool>& dirichletRows);
426 static void ApplyOAZToMatrixRows(RCP<Matrix>& A,
const Kokkos::View<const bool*, typename Node::device_type>& dirichletRows);
430 static void ZeroDirichletRows(Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& A,
431 const std::vector<LocalOrdinal>& dirichletRows,
432 Scalar replaceWith = Teuchos::ScalarTraits<Scalar>::zero());
436 static void ZeroDirichletRows(Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& A,
437 const Teuchos::ArrayRCP<const bool>& dirichletRows,
438 Scalar replaceWith = Teuchos::ScalarTraits<Scalar>::zero());
442 static void ZeroDirichletRows(Teuchos::RCP<Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& X,
443 const Teuchos::ArrayRCP<const bool>& dirichletRows,
444 Scalar replaceWith = Teuchos::ScalarTraits<Scalar>::zero());
446 static void ZeroDirichletRows(RCP<Matrix>& A,
const Kokkos::View<const bool*, typename NO::device_type>& dirichletRows, SC replaceWith = Teuchos::ScalarTraits<SC>::zero());
448 static void ZeroDirichletRows(RCP<MultiVector>& X,
const Kokkos::View<const bool*, typename NO::device_type>& dirichletRows, SC replaceWith = Teuchos::ScalarTraits<SC>::zero());
453 const Teuchos::ArrayRCP<const bool>& dirichletCols,
454 Scalar replaceWith = Teuchos::ScalarTraits<Scalar>::zero());
456 static void ZeroDirichletCols(RCP<Matrix>& A,
const Kokkos::View<const bool*, typename NO::device_type>& dirichletCols, SC replaceWith = Teuchos::ScalarTraits<SC>::zero(),
const bool DontZeroDiagEntries =
false);
460 Teuchos::RCP<Xpetra::Vector<int, LocalOrdinal, GlobalOrdinal, Node>>&
isDirichletRow,
461 Teuchos::RCP<Xpetra::Vector<int, LocalOrdinal, GlobalOrdinal, Node>>& isDirichletCol);
465 static RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
ReplaceNonZerosWithOnes(
const RCP<Matrix>& original);
468 static RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
SPAI(
const RCP<Matrix>& original,
const std::string& MinvScheme);
473 static RCP<const Xpetra::BlockedMap<LocalOrdinal, GlobalOrdinal, Node>>
GeneratedBlockedTargetMap(
const Xpetra::BlockedMap<LocalOrdinal, GlobalOrdinal, Node>& sourceBlockedMap,
474 const Xpetra::Import<LocalOrdinal, GlobalOrdinal, Node>& Importer);
478 static bool MapsAreNested(
const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>& rowMap,
const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>& colMap);
483 static RCP<Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node>>
CuthillMcKee(
const Matrix& Op);
487 static RCP<Xpetra::Vector<LocalOrdinal, LocalOrdinal, GlobalOrdinal, Node>>
ReverseCuthillMcKee(
const Matrix& Op);
489 static void TripleMatrixProduct(
const Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& R,
490 const Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& A,
491 const Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& P,
492 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& Ac,
493 const Teuchos::ParameterList& pL,
495 Teuchos::RCP<Teuchos::ParameterList>& APparams,
496 Teuchos::RCP<Teuchos::ParameterList>& RAPparams,
497 Level* coarseLevel =
nullptr);