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/>

Reply via email to