Actual source code: bandwidth.c

  1: #include <petsc/private/matimpl.h>

  3: /*@
  4:   MatComputeBandwidth - Calculate the full bandwidth of the matrix, meaning the width 2k+1 where k diagonals on either side are sufficient to contain all the matrix nonzeros.

  6:   Collective

  8:   Input Parameters:
  9: + A - The Mat
 10: - fraction - An optional percentage of the Frobenius norm of the matrix that the bandwidth should enclose

 12:   Output Parameter:
 13: . bw - The matrix bandwidth

 15:   Level: beginner

 17: .seealso: `DMPlexCreate()`, `DMPlexSetConeSize()`, `DMPlexSetChart()`
 18: @*/
 19: PetscErrorCode MatComputeBandwidth(Mat A, PetscReal fraction, PetscInt *bw)
 20: {
 21:   PetscInt lbw[2] = {0, 0}, gbw[2];
 22:   PetscInt rStart, rEnd, r;

 28:   MatGetOwnershipRange(A, &rStart, &rEnd);
 29:   for (r = rStart; r < rEnd; ++r) {
 30:     const PetscInt *cols;
 31:     PetscInt        ncols;

 33:     MatGetRow(A, r, &ncols, &cols, NULL);
 34:     if (ncols) {
 35:       lbw[0] = PetscMax(lbw[0], r - cols[0]);
 36:       lbw[1] = PetscMax(lbw[1], cols[ncols - 1] - r);
 37:     }
 38:     MatRestoreRow(A, r, &ncols, &cols, NULL);
 39:   }
 40:   MPIU_Allreduce(lbw, gbw, 2, MPIU_INT, MPI_MAX, PetscObjectComm((PetscObject)A));
 41:   *bw = 2 * PetscMax(gbw[0], gbw[1]) + 1;
 42:   return 0;
 43: }