101#undef MUELU_UTILITIESBASE_SHORT
104 typedef typename Teuchos::ScalarTraits<Scalar>::magnitudeType
Magnitude;
107 static RCP<Matrix>
Crs2Op(RCP<CrsMatrix> Op);
149 static RCP<Vector>
GetMatrixDiagonalInverse(
const Matrix& A,
Magnitude tol=Teuchos::ScalarTraits<Scalar>::eps()*100,
Scalar valReplacement = Teuchos::ScalarTraits<Scalar>::zero(),
const bool doLumped=
false);
158 Magnitude tol = Teuchos::ScalarTraits<Scalar>::magnitude(Teuchos::ScalarTraits<Scalar>::zero()),
159 Scalar valReplacement = Teuchos::ScalarTraits<Scalar>::zero(),
160 const bool replaceSingleEntryRowWithZero =
false,
161 const bool useAverageAbsDiagVal =
false);
171 static Teuchos::ArrayRCP<Magnitude>
GetMatrixMaxMinusOffDiagonal(
const Xpetra::Matrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>& A,
const Xpetra::Vector<LocalOrdinal,LocalOrdinal,GlobalOrdinal,Node> &BlockNumber);
180 static Teuchos::RCP<Vector>
GetInverse(Teuchos::RCP<const Vector> v,
Magnitude tol = Teuchos::ScalarTraits<Scalar>::eps()*100,
Scalar valReplacement = Teuchos::ScalarTraits<Scalar>::zero());
202 static RCP<Xpetra::Vector<Magnitude,LocalOrdinal,GlobalOrdinal,Node> >
211 static Teuchos::Array<Magnitude>
ResidualNorm(
const Xpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node>& Op,
const MultiVector& X,
const MultiVector& RHS);
213 static Teuchos::Array<Magnitude>
ResidualNorm(
const Xpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node>& Op,
const MultiVector& X,
const MultiVector& RHS, MultiVector & Resid);
215 static RCP<MultiVector>
Residual(
const Xpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node>& Op,
const MultiVector& X,
const MultiVector& RHS);
218 static void Residual(
const Xpetra::Operator<Scalar,LocalOrdinal,GlobalOrdinal,Node>& Op,
const MultiVector& X,
const MultiVector& RHS, MultiVector & Resid);
233 LocalOrdinal niters = 10,
Magnitude tolerance = 1e-2,
bool verbose =
false,
unsigned int seed = 123);
247 LocalOrdinal niters = 10,
Magnitude tolerance = 1e-2,
bool verbose =
false,
unsigned int seed = 123);
249 static RCP<Teuchos::FancyOStream>
MakeFancy(std::ostream& os);
255 static typename Teuchos::ScalarTraits<Scalar>::magnitudeType
Distance2(
const Teuchos::Array<Teuchos::ArrayRCP<const Scalar>> &v,
LocalOrdinal i0,
LocalOrdinal i1);
261 static typename Teuchos::ScalarTraits<Scalar>::magnitudeType
Distance2(
const Teuchos::ArrayView<double> & weight,
const Teuchos::Array<Teuchos::ArrayRCP<const Scalar>> &v,
LocalOrdinal i0,
LocalOrdinal i1);
276 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);
285 static Kokkos::View<bool*, typename NO::device_type>
DetectDirichletRows_kokkos(
const Matrix& A,
const Magnitude& tol = Teuchos::ScalarTraits<
typename Teuchos::ScalarTraits<SC>::magnitudeType>::zero(),
const bool count_twos_as_dirichlet=
false);
300 static Teuchos::ArrayRCP<const bool>
DetectDirichletRowsExt(
const Xpetra::Matrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>& A,
bool & bHasZeroDiagonal,
const Magnitude& tol = Teuchos::ScalarTraits<Scalar>::zero());
309 static void FindNonZeros(
const Teuchos::ArrayRCP<const Scalar> vals,
310 Teuchos::ArrayRCP<bool> nonzeros);
318 static void FindNonZeros(
const typename Xpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::dual_view_type::t_dev_const_um vals,
319 Kokkos::View<bool*, typename Node::device_type> nonzeros);
330 const Teuchos::ArrayRCP<bool>& dirichletRows,
331 Teuchos::ArrayRCP<bool> dirichletCols,
332 Teuchos::ArrayRCP<bool> dirichletDomain);
342 const Kokkos::View<bool*, typename Node::device_type> & dirichletRows,
343 Kokkos::View<bool*, typename Node::device_type> dirichletCols,
344 Kokkos::View<bool*, typename Node::device_type> dirichletDomain);
358 static void ApplyRowSumCriterion(
const Xpetra::Matrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>& A,
const Magnitude rowSumTol, Teuchos::ArrayRCP<bool>& dirichletRows);
360 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);
363 const typename Teuchos::ScalarTraits<Scalar>::magnitudeType rowSumTol,
364 Kokkos::View<bool*, typename NO::device_type> & dirichletRows);
377 static Teuchos::ArrayRCP<const bool>
DetectDirichletCols(
const Xpetra::Matrix<Scalar,LocalOrdinal,GlobalOrdinal,Node>& A,
378 const Teuchos::ArrayRCP<const bool>& dirichletRows);
390 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());
460 Teuchos::RCP<Xpetra::Vector<int,LocalOrdinal,GlobalOrdinal,Node> >& isDirichletRow,
461 Teuchos::RCP<Xpetra::Vector<int,LocalOrdinal,GlobalOrdinal,Node> >& isDirichletCol);
467 static RCP<Xpetra::Matrix<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
ReplaceNonZerosWithOnes(
const RCP<Matrix> & original);
474 static RCP<const Xpetra::BlockedMap<LocalOrdinal,GlobalOrdinal,Node> >
GeneratedBlockedTargetMap(
const Xpetra::BlockedMap<LocalOrdinal,GlobalOrdinal,Node> & sourceBlockedMap,
475 const Xpetra::Import<LocalOrdinal,GlobalOrdinal,Node> & Importer);
479 static bool MapsAreNested(
const Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node>& rowMap,
const Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node>& colMap);
485 static RCP<Xpetra::Vector<LocalOrdinal,LocalOrdinal,GlobalOrdinal,Node> >
CuthillMcKee(
const Matrix &Op);
489 static RCP<Xpetra::Vector<LocalOrdinal,LocalOrdinal,GlobalOrdinal,Node> >
ReverseCuthillMcKee(
const Matrix &Op);