Date: 2025-03-28T21:10:57+00:00

Actual source code: dspai.c

      1: #include <petscmat.h>
      2: #include <petsc/private/petscimpl.h>

      4: /*
      5:      MatDumpSPAI - Dumps a PETSc matrix to a file in an ASCII format
      6:   suitable for the SPAI code of Stephen Barnard to solve. This routine
      7:   is simply here to allow testing of matrices directly with the SPAI
      8:   code, rather than through the PETSc interface.

     10: */
     11: PetscErrorCode MatDumpSPAI(Mat A, FILE *file)
     12: {
     13:   PetscMPIInt size;
     14:   PetscInt    n;
     15:   MPI_Comm    comm;

     17:   PetscFunctionBegin;
     19:   PetscAssertPointer(file, 2);
     20:   PetscCall(PetscObjectGetComm((PetscObject)A, &comm));
     21:   PetscCallMPI(MPI_Comm_size(comm, &size));
     22:   PetscCheck(size == 1, comm, PETSC_ERR_SUP, "Only single processor dumps");
     23:   PetscCall(MatGetSize(A, &n, &n));
     24:   /* print the matrix */
     25:   fprintf(file, "%" PetscInt_FMT "\n", n);
     26:   for (PetscInt i = 0; i < n; i++) {
     27:     const PetscInt    *cols;
     28:     const PetscScalar *vals;
     29:     PetscInt           nz;

     31:     PetscCall(MatGetRow(A, i, &nz, &cols, &vals));
     32:     for (PetscInt j = 0; j < nz; j++) fprintf(file, "%" PetscInt_FMT " %d" PetscInt_FMT " %16.14e\n", i + 1, cols[j] + 1, vals[j]);
     33:     PetscCall(MatRestoreRow(A, i, &nz, &cols, &vals));
     34:   }
     35:   PetscFunctionReturn(PETSC_SUCCESS);
     36: }

     38: PetscErrorCode VecDumpSPAI(Vec b, FILE *file)
     39: {
     40:   PetscInt           n;
     41:   const PetscScalar *array;

     43:   PetscFunctionBegin;
     45:   PetscAssertPointer(file, 2);
     46:   PetscCall(VecGetSize(b, &n));
     47:   PetscCall(VecGetArrayRead(b, &array));
     48:   fprintf(file, "%" PetscInt_FMT "\n", n);
     49:   for (PetscInt i = 0; i < n; i++) fprintf(file, "%" PetscInt_FMT " %16.14e\n", i + 1, array[i]);
     50:   PetscCall(VecRestoreArrayRead(b, &array));
     51:   PetscFunctionReturn(PETSC_SUCCESS);
     52: }