On Mon, Mar 4, 2019 at 10:39 AM Matthew Knepley via petsc-users <[email protected]<mailto:[email protected]>> wrote: On Mon, Mar 4, 2019 at 11:28 AM Cyrill Vonplanta via petsc-users <[email protected]<mailto:[email protected]>> wrote: Dear Petsc Users,
I am trying to implement a variant of the $l^1$-Gauss-Seidel smoother from https://doi.org/10.1137/100798806 (eq. 6.1 and below). One of the main issues is that I need to compute the sum $\sum_j |a_{i_j}|$ of the matrix entries that are not part of the local diagonal block. I was looking for something like MatGetRowSumAbs but it looks like it hasn't been made yet. I guess i have to come up with something myself, but would you know of some workaround for this without going too deep into PETCs? MatGetOwnershipRange(A, &rS, &rE); for (r = rS; r < rE; ++r) { sum = 0.0; MatGetRow(A, r, &ncols, &cols, &vals); for (c = 0; c < ncols; ++c) if ((cols[c] < rS) || (cols[c] >= rE)) sum += PetscAbsScalar(vals[c]); } Perhaps PETSc should have a MatGetRemoteRow (or MatGetRowOffDiagonalBlock) (A, r, &ncols, &cols, &vals). MatGetRow() internally has to allocate memory and sort indices and values from local diagonal block and off-diagonal block. It is totally a waste in this case -- users do not care column indices and the local block. With MatGetRemoteRow(A, r, &ncols, NULL, &vals), PETSc just needs to set an integer and a pointer. Thanks, Matt Best Cyrill -- What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead. -- Norbert Wiener https://www.cse.buffalo.edu/~knepley/<http://www.cse.buffalo.edu/~knepley/>
