10 #ifndef MUELU_CUTDROP_HPP
11 #define MUELU_CUTDROP_HPP
13 #include "Kokkos_Core.hpp"
14 #include "Kokkos_ArithTraits.hpp"
16 #include "MueLu_Utilities.hpp"
21 namespace MueLu::CutDrop {
33 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
48 using ATS = Kokkos::ArithTraits<scalar_type>;
53 :
A(A_.getLocalMatrixDevice())
56 template <
class local_matrix_type2>
64 using ATS = Kokkos::ArithTraits<scalar_type>;
67 const local_matrix_type2
A;
72 KOKKOS_INLINE_FUNCTION
75 ,
offset(A_.graph.row_map(rlid_))
78 KOKKOS_INLINE_FUNCTION
80 return ATS::magnitude(
A.values(
offset + x) *
A.values(
offset + x));
83 KOKKOS_INLINE_FUNCTION
106 KOKKOS_INLINE_FUNCTION
116 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node, Misc::StrengthMeasure measure>
125 using diag_view_type =
typename Kokkos::DualView<const scalar_type*, Kokkos::LayoutStride, typename Node::device_type, Kokkos::MemoryUnmanaged>::t_dev;
132 using ATS = Kokkos::ArithTraits<scalar_type>;
140 :
A(A_.getLocalMatrixDevice())
144 auto lclDiag2d =
diagVec->getLocalViewDevice(Xpetra::Access::ReadOnly);
145 diag = Kokkos::subview(lclDiag2d, Kokkos::ALL(), 0);
148 auto lcl2d =
diagVec->getLocalViewDevice(Xpetra::Access::ReadOnly);
149 diag = Kokkos::subview(lcl2d, Kokkos::ALL(), 0);
153 template <
class local_matrix_type2,
class diag_view_type2>
161 using ATS = Kokkos::ArithTraits<scalar_type>;
163 using mATS = Kokkos::ArithTraits<magnitudeType>;
165 const local_matrix_type2
A;
172 KOKKOS_INLINE_FUNCTION
177 ,
offset(A_.graph.row_map(rlid_))
180 KOKKOS_INLINE_FUNCTION
183 auto x_aij = ATS::magnitude(
A.values(
offset + x) *
A.values(
offset + x));
185 return (x_aij / x_aiiajj);
187 auto val =
A.values(
offset + x);
188 auto neg_aij = -ATS::real(val);
189 auto max_neg_aik = ATS::real(
diag(
rlid));
190 return ATS::magnitude(neg_aij / max_neg_aik);
192 auto val =
A.values(
offset + x);
194 const bool is_nonpositive = ATS::real(val) <= mATS::zero();
195 magnitudeType aij2 = ATS::magnitude(val) * ATS::magnitude(val);
198 return (aij2 / x_aiiajj);
202 KOKKOS_INLINE_FUNCTION
225 KOKKOS_INLINE_FUNCTION
232 template <Misc::StrengthMeasure measure,
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
244 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node,
class DistanceFunctorType>
253 using diag_view_type =
typename Kokkos::DualView<const scalar_type*, Kokkos::LayoutStride, typename Node::device_type, Kokkos::MemoryUnmanaged>::t_dev;
260 using ATS = Kokkos::ArithTraits<scalar_type>;
269 :
A(A_.getLocalMatrixDevice())
274 auto lclDiag2d =
diagVec->getLocalViewDevice(Xpetra::Access::ReadOnly);
275 diag = Kokkos::subview(lclDiag2d, Kokkos::ALL(), 0);
278 template <
class local_matrix_type2,
class DistanceFunctorType2,
class diag_view_type2>
286 using ATS = Kokkos::ArithTraits<scalar_type>;
289 const local_matrix_type2
A;
299 KOKKOS_INLINE_FUNCTION
305 ,
offset(A_.graph.row_map(rlid_))
308 KOKKOS_INLINE_FUNCTION
310 auto clid =
A.graph.entries(
offset + x);
317 auto aij2 = ATS::magnitude(val) * ATS::magnitude(val);
321 KOKKOS_INLINE_FUNCTION
344 KOKKOS_INLINE_FUNCTION
354 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node,
class DistanceFunctorType, Misc::StrengthMeasure measure>
363 using diag_view_type =
typename Kokkos::DualView<const scalar_type*, Kokkos::LayoutStride, typename Node::device_type, Kokkos::MemoryUnmanaged>::t_dev;
370 using ATS = Kokkos::ArithTraits<scalar_type>;
379 :
A(A_.getLocalMatrixDevice())
385 auto lclDiag2d =
diagVec->getLocalViewDevice(Xpetra::Access::ReadOnly);
386 diag = Kokkos::subview(lclDiag2d, Kokkos::ALL(), 0);
389 auto lclDiag2d =
diagVec->getLocalViewDevice(Xpetra::Access::ReadOnly);
390 diag = Kokkos::subview(lclDiag2d, Kokkos::ALL(), 0);
394 template <
class local_matrix_type2,
class DistanceFunctorType2,
class diag_view_type2>
402 using ATS = Kokkos::ArithTraits<scalar_type>;
404 using mATS = Kokkos::ArithTraits<magnitudeType>;
406 const local_matrix_type2
A;
418 KOKKOS_INLINE_FUNCTION
424 ,
offset(A_.graph.row_map(rlid_))
427 KOKKOS_INLINE_FUNCTION
429 auto clid =
A.graph.entries(
offset + x);
438 auto aiiajj = ATS::magnitude(
diag(
rlid)) * ATS::magnitude(
diag(clid));
439 auto aij2 = ATS::magnitude(val) * ATS::magnitude(val);
440 return (aij2 / aiiajj);
442 auto neg_aij = -ATS::real(val);
443 auto max_neg_aik = ATS::real(
diag(
rlid));
444 if (ATS::real(neg_aij) >=
mzero)
445 return ATS::magnitude(neg_aij / max_neg_aik);
447 return -ATS::magnitude(neg_aij / max_neg_aik);
449 auto aiiajj = ATS::magnitude(
diag(
rlid)) * ATS::magnitude(
diag(clid));
450 const bool is_nonpositive = ATS::real(val) <= mATS::zero();
451 magnitudeType aij2 = ATS::magnitude(val) * ATS::magnitude(val);
455 return aij2 / aiiajj;
459 KOKKOS_INLINE_FUNCTION
482 KOKKOS_INLINE_FUNCTION
489 template <Misc::StrengthMeasure measure,
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node,
class DistanceFunctorType>
491 DistanceFunctorType& dist2_,
506 template <
class comparison_type>
515 using ATS = Kokkos::ArithTraits<scalar_type>;
523 Kokkos::View<local_ordinal_type*, memory_space>
index;
531 index = Kokkos::View<local_ordinal_type*, memory_space>(
"indices",
A.nnz());
534 KOKKOS_FORCEINLINE_FUNCTION
536 auto row =
A.rowConst(rlid);
537 size_t nnz = row.length;
539 auto drop_view = Kokkos::subview(
results, Kokkos::make_pair(
A.graph.row_map(rlid),
A.graph.row_map(rlid + 1)));
540 auto row_permutation = Kokkos::subview(
index, Kokkos::make_pair(
A.graph.row_map(rlid),
A.graph.row_map(rlid + 1)));
542 auto comparator =
comparison.getComparator(rlid);
544 for (
size_t i = 0; i < nnz; ++i) {
545 row_permutation(i) = i;
549 size_t keepStart = 0;
550 size_t dropStart = nnz;
552 for (
size_t i = 1; i < nnz; ++i) {
553 auto const& x = row_permutation(i - 1);
554 auto const& y = row_permutation(i);
561 if (
eps *
eps * x_aij > y_aij) {
569 for (
size_t i = keepStart; i < nnz; ++i) {
570 drop_view(row_permutation(i)) = Kokkos::max(dropStart <= i ?
DROP :
KEEP, drop_view(row_permutation(i)));
Kokkos::View< const bool *, memory_space > boundary_nodes_view
KOKKOS_INLINE_FUNCTION bool operator()(size_t x, size_t y) const
const diag_view_type2 diag
typename local_matrix_type::memory_space memory_space
auto make_comparison_functor(Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A_, typename ScaledComparison< Scalar, LocalOrdinal, GlobalOrdinal, Node, measure >::results_view &results_)
static Teuchos::RCP< Vector > GetMatrixMaxMinusOffDiagonal(const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A)
Return vector containing: max_{i=k}(-a_ik), for each for i in the matrix.
const local_ordinal_type offset
typename local_matrix_type::ordinal_type local_ordinal_type
UnscaledComparison(matrix_type &A_, results_view &results_)
const results_view results
Comparator< local_matrix_type, diag_view_type > comparator_type
ScaledDistanceLaplacianComparison(matrix_type &A_, DistanceFunctorType &dist2_, results_view &results_)
const local_matrix_type2 A
KOKKOS_INLINE_FUNCTION magnitudeType get_value(size_t x) const
typename local_matrix_type2::ordinal_type local_ordinal_type
KOKKOS_INLINE_FUNCTION comparator_type getComparator(local_ordinal_type rlid) const
const local_matrix_type2 A
typename ATS::magnitudeType magnitudeType
KOKKOS_INLINE_FUNCTION comparator_type getComparator(local_ordinal_type rlid) const
Kokkos::ArithTraits< magnitudeType > mATS
Kokkos::View< DecisionType *, memory_space > results_view
typename local_matrix_type2::memory_space memory_space
Kokkos::View< DecisionType *, memory_space > results_view
typename matrix_type::local_matrix_type local_matrix_type
Teuchos::RCP< diag_vec_type > diagVec
KOKKOS_INLINE_FUNCTION Comparator(const local_matrix_type2 &A_, const diag_view_type2 &diag_, const DistanceFunctorType2 *dist2_, local_ordinal_type rlid_, const results_view &results_)
Kokkos::View< local_ordinal_type *, memory_space > index
Kokkos::View< DecisionType *, memory_space > results_view
typename local_matrix_type::ordinal_type local_ordinal_type
typename local_matrix_type::ordinal_type local_ordinal_type
Teuchos::RCP< diag_vec_type > diagVec
Teuchos::RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getMaxMinusOffDiagonal(Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, DistanceFunctorType &distFunctor)
const diag_view_type2 diag
typename Kokkos::DualView< const scalar_type *, Kokkos::LayoutStride, typename Node::device_type, Kokkos::MemoryUnmanaged >::t_dev diag_view_type
typename local_matrix_type2::value_type scalar_type
Kokkos::View< DecisionType *, memory_space > results_view
Orders entries of row by .
const local_matrix_type2 A
Kokkos::ArithTraits< scalar_type > ATS
typename local_matrix_type::memory_space memory_space
ScaledComparison(matrix_type &A_, results_view &results_)
KOKKOS_INLINE_FUNCTION comparator_type getComparator(local_ordinal_type rlid) const
comparison_type comparison
const local_ordinal_type rlid
Orders entries of row by where is the distance Laplacian.
Comparator< local_matrix_type > comparator_type
typename local_matrix_type::ordinal_type local_ordinal_type
typename ATS::magnitudeType magnitudeType
typename matrix_type::local_matrix_type local_matrix_type
typename comparison_type::local_matrix_type local_matrix_type
const local_ordinal_type offset
const local_ordinal_type rlid
const local_ordinal_type rlid
Kokkos::View< DecisionType *, memory_space > results_view
Comparator< local_matrix_type, DistanceFunctorType, diag_view_type > comparator_type
typename local_matrix_type::value_type scalar_type
typename local_matrix_type::value_type scalar_type
typename local_matrix_type::ordinal_type local_ordinal_type
KOKKOS_INLINE_FUNCTION void serialHeapSort(view_type &v, comparator_type comparator)
typename local_matrix_type2::ordinal_type local_ordinal_type
KOKKOS_INLINE_FUNCTION bool operator()(size_t x, size_t y) const
Kokkos::ArithTraits< scalar_type > ATS
const local_matrix_type2 A
Kokkos::ArithTraits< magnitudeType > mATS
Kokkos::ArithTraits< scalar_type > ATS
typename local_matrix_type2::ordinal_type local_ordinal_type
UnscaledDistanceLaplacianComparison(matrix_type &A_, DistanceFunctorType &dist2_, results_view &results_)
typename Kokkos::DualView< const scalar_type *, Kokkos::LayoutStride, typename Node::device_type, Kokkos::MemoryUnmanaged >::t_dev diag_view_type
Kokkos::View< DecisionType *, memory_space > results_view
Kokkos::ArithTraits< scalar_type > ATS
typename Kokkos::DualView< const scalar_type *, Kokkos::LayoutStride, typename Node::device_type, Kokkos::MemoryUnmanaged >::t_dev diag_view_type
Kokkos::View< DecisionType *, memory_space > results_view
Kokkos::ArithTraits< scalar_type > ATS
typename ATS::magnitudeType magnitudeType
Order each row by a criterion, compare the ratio of values and drop all entries once the ratio is bel...
KOKKOS_INLINE_FUNCTION magnitudeType get_value(size_t x) const
typename ATS::magnitudeType magnitudeType
typename local_matrix_type::memory_space memory_space
const results_view results
typename ATS::magnitudeType magnitudeType
typename local_matrix_type::value_type scalar_type
static RCP< Vector > GetMatrixOverlappedDiagonal(const Matrix &A)
Extract Overlapped Matrix Diagonal.
Kokkos::ArithTraits< scalar_type > ATS
auto make_dlap_comparison_functor(Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A_, DistanceFunctorType &dist2_, typename ScaledDistanceLaplacianComparison< Scalar, LocalOrdinal, GlobalOrdinal, Node, DistanceFunctorType, measure >::results_view &results_)
typename matrix_type::local_matrix_type local_matrix_type
const results_view results
Teuchos::RCP< diag_vec_type > diagVec
const DistanceFunctorType2 * dist2
KOKKOS_FORCEINLINE_FUNCTION void operator()(const local_ordinal_type &rlid) const
typename local_matrix_type::value_type scalar_type
typename local_matrix_type2::value_type scalar_type
KOKKOS_INLINE_FUNCTION comparator_type getComparator(local_ordinal_type rlid) const
typename ATS::magnitudeType magnitudeType
KOKKOS_INLINE_FUNCTION bool operator()(size_t x, size_t y) const
typename local_matrix_type2::ordinal_type local_ordinal_type
typename local_matrix_type2::memory_space memory_space
DistanceFunctorType dist2
Kokkos::ArithTraits< scalar_type > ATS
typename ATS::magnitudeType magnitudeType
Kokkos::ArithTraits< scalar_type > ATS
KOKKOS_INLINE_FUNCTION bool operator()(size_t x, size_t y) const
typename local_matrix_type2::memory_space memory_space
KOKKOS_INLINE_FUNCTION magnitudeType get_value(size_t x) const
const diag_view_type2 diag
const results_view results
const local_ordinal_type offset
Kokkos::ArithTraits< scalar_type > ATS
const DistanceFunctorType2 * dist2
typename local_matrix_type2::value_type scalar_type
Teuchos::RCP< Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getDiagonal(Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, DistanceFunctorType &distFunctor)
KOKKOS_INLINE_FUNCTION Comparator(const local_matrix_type2 &A_, const diag_view_type2 &diag_, const local_ordinal_type rlid_, const results_view &results_)
KOKKOS_INLINE_FUNCTION Comparator(const local_matrix_type2 &A_, local_ordinal_type rlid_, const results_view &results_)
typename ATS::magnitudeType magnitudeType
Comparator< local_matrix_type, DistanceFunctorType, diag_view_type > comparator_type
KOKKOS_INLINE_FUNCTION magnitudeType get_value(size_t x) const
CutDropFunctor(comparison_type &comparison_, magnitudeType threshold)
typename ATS::magnitudeType magnitudeType
typename matrix_type::local_matrix_type local_matrix_type
Kokkos::View< DecisionType *, memory_space > results_view
typename local_matrix_type::memory_space memory_space
Orders entries of row by .
const local_ordinal_type offset
const magnitudeType mzero
typename local_matrix_type::memory_space memory_space
Kokkos::View< DecisionType *, memory_space > results_view
KOKKOS_INLINE_FUNCTION Comparator(const local_matrix_type2 &A_, const diag_view_type2 &diag_, const DistanceFunctorType2 *dist2_, local_ordinal_type rlid_, const results_view &results_)
typename local_matrix_type::value_type scalar_type
typename local_matrix_type2::value_type scalar_type
typename local_matrix_type2::memory_space memory_space
DistanceFunctorType dist2