101a81e61SBarry Smith 2c6db04a5SJed Brown #include <petscmat.h> 3af0996ceSBarry Smith #include <petsc/private/petscimpl.h> 401a81e61SBarry Smith 501a81e61SBarry Smith /* 601a81e61SBarry Smith MatDumpSPAI - Dumps a PETSc matrix to a file in an ASCII format 701a81e61SBarry Smith suitable for the SPAI code of Stephen Barnard to solve. This routine 801a81e61SBarry Smith is simply here to allow testing of matrices directly with the SPAI 901a81e61SBarry Smith code, rather then through the PETSc interface. 1001a81e61SBarry Smith 1101a81e61SBarry Smith */ 12d71ae5a4SJacob Faibussowitsch PetscErrorCode MatDumpSPAI(Mat A, FILE *file) 13d71ae5a4SJacob Faibussowitsch { 14*3ba16761SJacob Faibussowitsch PetscMPIInt size; 15*3ba16761SJacob Faibussowitsch PetscInt n; 1601a81e61SBarry Smith MPI_Comm comm; 1701a81e61SBarry Smith 185f80ce2aSJacob Faibussowitsch PetscFunctionBegin; 19*3ba16761SJacob Faibussowitsch PetscValidHeaderSpecific(A, MAT_CLASSID, 1); 20*3ba16761SJacob Faibussowitsch PetscValidPointer(file, 2); 21*3ba16761SJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)A, &comm)); 22*3ba16761SJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 23*3ba16761SJacob Faibussowitsch PetscCheck(size == 1, comm, PETSC_ERR_SUP, "Only single processor dumps"); 249566063dSJacob Faibussowitsch PetscCall(MatGetSize(A, &n, &n)); 2501a81e61SBarry Smith /* print the matrix */ 26*3ba16761SJacob Faibussowitsch fprintf(file, "%" PetscInt_FMT "\n", n); 27*3ba16761SJacob Faibussowitsch for (PetscInt i = 0; i < n; i++) { 28*3ba16761SJacob Faibussowitsch const PetscInt *cols; 29*3ba16761SJacob Faibussowitsch const PetscScalar *vals; 30*3ba16761SJacob Faibussowitsch PetscInt nz; 31*3ba16761SJacob Faibussowitsch 329566063dSJacob Faibussowitsch PetscCall(MatGetRow(A, i, &nz, &cols, &vals)); 33*3ba16761SJacob Faibussowitsch for (PetscInt j = 0; j < nz; j++) fprintf(file, "%" PetscInt_FMT " %d" PetscInt_FMT " %16.14e\n", i + 1, cols[j] + 1, vals[j]); 349566063dSJacob Faibussowitsch PetscCall(MatRestoreRow(A, i, &nz, &cols, &vals)); 3501a81e61SBarry Smith } 36*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3701a81e61SBarry Smith } 3801a81e61SBarry Smith 39d71ae5a4SJacob Faibussowitsch PetscErrorCode VecDumpSPAI(Vec b, FILE *file) 40d71ae5a4SJacob Faibussowitsch { 41*3ba16761SJacob Faibussowitsch PetscInt n; 42*3ba16761SJacob Faibussowitsch const PetscScalar *array; 4301a81e61SBarry Smith 445f80ce2aSJacob Faibussowitsch PetscFunctionBegin; 45*3ba16761SJacob Faibussowitsch PetscValidHeaderSpecific(b, VEC_CLASSID, 1); 46*3ba16761SJacob Faibussowitsch PetscValidPointer(file, 2); 479566063dSJacob Faibussowitsch PetscCall(VecGetSize(b, &n)); 48*3ba16761SJacob Faibussowitsch PetscCall(VecGetArrayRead(b, &array)); 49*3ba16761SJacob Faibussowitsch fprintf(file, "%" PetscInt_FMT "\n", n); 50*3ba16761SJacob Faibussowitsch for (PetscInt i = 0; i < n; i++) fprintf(file, "%" PetscInt_FMT " %16.14e\n", i + 1, array[i]); 51*3ba16761SJacob Faibussowitsch PetscCall(VecRestoreArrayRead(b, &array)); 52*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5301a81e61SBarry Smith } 54