17Teuchos::RCP<matrix_type>
applyFilter_vals(
const matrix_type& A,
const filter_type& filter) {
19 using node_type =
typename matrix_type::node_type;
20 using local_matrix_type =
typename matrix_type::local_matrix_device_type;
21 using rowptr_type =
typename local_matrix_type::row_map_type::non_const_type;
22 using colidx_type =
typename local_matrix_type::index_type::non_const_type;
23 using values_type =
typename local_matrix_type::values_type::non_const_type;
24 using exec_space =
typename node_type::execution_space;
26 local_matrix_type newLclA;
29 auto lclA = A.getLocalMatrixDevice();
31 rowptr = rowptr_type(
"filtered_rowptr", lclA.numRows() + 1);
34 Kokkos::parallel_scan(
35 "filterMatrix::rowptr_construction", Kokkos::RangePolicy<exec_space>(0, lclA.numRows()), KOKKOS_LAMBDA(
const local_ordinal_type rlid,
local_ordinal_type& nnz,
const bool update) {
36 auto row = lclA.rowConst(rlid);
38 auto val = row.value(k);
43 if (update && (rlid + 2 < lclA.numRows() + 1))
44 rowptr(rlid + 2) = nnz;
48 auto colidx = colidx_type(Kokkos::ViewAllocateWithoutInitializing(
"filtered_colidx"), NNZ);
49 auto values = values_type(Kokkos::ViewAllocateWithoutInitializing(
"filtered_values"), NNZ);
52 "filterMatrix::matrix_fill", Kokkos::RangePolicy<exec_space>(0, lclA.numRows()), KOKKOS_LAMBDA(
const local_ordinal_type rlid) {
53 auto row = lclA.rowConst(rlid);
55 auto val = row.value(k);
57 auto clid = row.colidx(k);
58 colidx(rowptr(rlid + 1)) = clid;
59 values(rowptr(rlid + 1)) = val;
65 newLclA = local_matrix_type(
"filtered_matrix", lclA.numRows(), lclA.numCols(), NNZ, values, rowptr, colidx);
68 return Teuchos::rcp(
new matrix_type(newLclA, A.getRowMap(), A.getColMap(), A.getDomainMap(), A.getRangeMap()));
79Teuchos::RCP<matrix_type>
applyFilter_LID(
const matrix_type& A,
const filter_type& filter) {
81 using node_type =
typename matrix_type::node_type;
82 using local_matrix_type =
typename matrix_type::local_matrix_device_type;
83 using rowptr_type =
typename local_matrix_type::row_map_type::non_const_type;
84 using colidx_type =
typename local_matrix_type::index_type::non_const_type;
85 using values_type =
typename local_matrix_type::values_type::non_const_type;
86 using exec_space =
typename node_type::execution_space;
88 local_matrix_type newLclA;
91 auto lclA = A.getLocalMatrixDevice();
93 rowptr = rowptr_type(
"filtered_rowptr", lclA.numRows() + 1);
96 Kokkos::parallel_scan(
97 "filterMatrix::rowptr_construction", Kokkos::RangePolicy<exec_space>(0, lclA.numRows()), KOKKOS_LAMBDA(
const local_ordinal_type rlid,
local_ordinal_type& nnz,
const bool update) {
98 auto row = lclA.rowConst(rlid);
100 auto clid = row.colidx(k);
101 auto val = row.value(k);
102 if (filter(rlid, clid, val)) {
106 if (update && (rlid + 2 < lclA.numRows() + 1))
107 rowptr(rlid + 2) = nnz;
111 auto colidx = colidx_type(Kokkos::ViewAllocateWithoutInitializing(
"filtered_colidx"), NNZ);
112 auto values = values_type(Kokkos::ViewAllocateWithoutInitializing(
"filtered_values"), NNZ);
114 Kokkos::parallel_for(
115 "filterMatrix::matrix_fill", Kokkos::RangePolicy<exec_space>(0, lclA.numRows()), KOKKOS_LAMBDA(
const local_ordinal_type rlid) {
116 auto row = lclA.rowConst(rlid);
118 auto clid = row.colidx(k);
119 auto val = row.value(k);
120 if (filter(rlid, clid, val)) {
121 colidx(rowptr(rlid + 1)) = clid;
122 values(rowptr(rlid + 1)) = val;
128 newLclA = local_matrix_type(
"filtered_matrix", lclA.numRows(), lclA.numCols(), NNZ, values, rowptr, colidx);
131 return Teuchos::rcp(
new matrix_type(newLclA, A.getRowMap(), A.getColMap(), A.getDomainMap(), A.getRangeMap()));
142Teuchos::RCP<matrix_type>
applyFilter_GID(
const matrix_type& A,
const filter_type& filter) {
144 using node_type =
typename matrix_type::node_type;
145 using local_matrix_type =
typename matrix_type::local_matrix_device_type;
146 using rowptr_type =
typename local_matrix_type::row_map_type::non_const_type;
147 using colidx_type =
typename local_matrix_type::index_type::non_const_type;
148 using values_type =
typename local_matrix_type::values_type::non_const_type;
149 using exec_space =
typename node_type::execution_space;
151 local_matrix_type newLclA;
154 auto lclA = A.getLocalMatrixDevice();
156 rowptr = rowptr_type(
"filtered_rowptr", lclA.numRows() + 1);
159 auto lclRowMap = A.
getRowMap()->getLocalMap();
160 auto lclColMap = A.getColMap()->getLocalMap();
162 Kokkos::parallel_scan(
163 "filterMatrix::rowptr_construction", Kokkos::RangePolicy<exec_space>(0, lclA.numRows()), KOKKOS_LAMBDA(
const local_ordinal_type rlid,
local_ordinal_type& nnz,
const bool update) {
164 auto row = lclA.rowConst(rlid);
165 auto rgid = lclRowMap.getGlobalElement(rlid);
167 auto clid = row.colidx(k);
168 auto cgid = lclRowMap.getGlobalElement(clid);
169 auto val = row.value(k);
170 if (filter(rgid, cgid, val)) {
174 if (update && (rlid + 2 < lclA.numRows() + 1))
175 rowptr(rlid + 2) = nnz;
179 auto colidx = colidx_type(Kokkos::ViewAllocateWithoutInitializing(
"filtered_colidx"), NNZ);
180 auto values = values_type(Kokkos::ViewAllocateWithoutInitializing(
"filtered_values"), NNZ);
182 Kokkos::parallel_for(
183 "filterMatrix::matrix_fill", Kokkos::RangePolicy<exec_space>(0, lclA.numRows()), KOKKOS_LAMBDA(
const local_ordinal_type rlid) {
184 auto row = lclA.rowConst(rlid);
185 auto rgid = lclRowMap.getGlobalElement(rlid);
187 auto clid = row.colidx(k);
188 auto cgid = lclRowMap.getGlobalElement(clid);
189 auto val = row.value(k);
190 if (filter(rgid, cgid, val)) {
191 colidx(rowptr(rlid + 1)) = clid;
192 values(rowptr(rlid + 1)) = val;
198 newLclA = local_matrix_type(
"filtered_matrix", lclA.numRows(), lclA.numCols(), NNZ, values, rowptr, colidx);
201 return Teuchos::rcp(
new matrix_type(newLclA, A.getRowMap(), A.getColMap(), A.getDomainMap(), A.getRangeMap()));