1 2 static char help[] = "Tests binary I/O of matrices and illustrates user-defined event logging.\n\n"; 3 4 #include <petscmat.h> 5 6 /* Note: Most applications would not read and write the same matrix within 7 the same program. This example is intended only to demonstrate 8 both input and output. */ 9 10 int main(int argc, char **args) 11 { 12 Mat C; 13 PetscScalar v; 14 PetscInt i, j, Ii, J, Istart, Iend, N, m = 4, n = 4; 15 PetscMPIInt rank, size; 16 PetscViewer viewer; 17 #if defined(PETSC_USE_LOG) 18 PetscLogEvent MATRIX_GENERATE, MATRIX_READ; 19 #endif 20 21 PetscFunctionBeginUser; 22 PetscCall(PetscInitialize(&argc, &args, (char *)0, help)); 23 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 24 PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 25 PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL)); 26 PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL)); 27 N = m * n; 28 29 /* PART 1: Generate matrix, then write it in binary format */ 30 31 PetscCall(PetscLogEventRegister("Generate Matrix", 0, &MATRIX_GENERATE)); 32 PetscCall(PetscLogEventBegin(MATRIX_GENERATE, 0, 0, 0, 0)); 33 34 /* Generate matrix */ 35 PetscCall(MatCreate(PETSC_COMM_WORLD, &C)); 36 PetscCall(MatSetSizes(C, PETSC_DECIDE, PETSC_DECIDE, N, N)); 37 PetscCall(MatSetFromOptions(C)); 38 PetscCall(MatSetUp(C)); 39 PetscCall(MatGetOwnershipRange(C, &Istart, &Iend)); 40 for (Ii = Istart; Ii < Iend; Ii++) { 41 v = -1.0; 42 i = Ii / n; 43 j = Ii - i * n; 44 if (i > 0) { 45 J = Ii - n; 46 PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 47 } 48 if (i < m - 1) { 49 J = Ii + n; 50 PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 51 } 52 if (j > 0) { 53 J = Ii - 1; 54 PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 55 } 56 if (j < n - 1) { 57 J = Ii + 1; 58 PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 59 } 60 v = 4.0; 61 PetscCall(MatSetValues(C, 1, &Ii, 1, &Ii, &v, ADD_VALUES)); 62 } 63 PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY)); 64 PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY)); 65 PetscCall(MatView(C, PETSC_VIEWER_STDOUT_WORLD)); 66 67 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "writing matrix in binary to matrix.dat ...\n")); 68 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "matrix.dat", FILE_MODE_WRITE, &viewer)); 69 PetscCall(MatView(C, viewer)); 70 PetscCall(PetscViewerDestroy(&viewer)); 71 PetscCall(MatDestroy(&C)); 72 PetscCall(PetscLogEventEnd(MATRIX_GENERATE, 0, 0, 0, 0)); 73 74 /* PART 2: Read in matrix in binary format */ 75 76 /* All processors wait until test matrix has been dumped */ 77 PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD)); 78 79 PetscCall(PetscLogEventRegister("Read Matrix", 0, &MATRIX_READ)); 80 PetscCall(PetscLogEventBegin(MATRIX_READ, 0, 0, 0, 0)); 81 PetscCall(PetscPrintf(PETSC_COMM_WORLD, "reading matrix in binary from matrix.dat ...\n")); 82 PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "matrix.dat", FILE_MODE_READ, &viewer)); 83 PetscCall(MatCreate(PETSC_COMM_WORLD, &C)); 84 PetscCall(MatLoad(C, viewer)); 85 PetscCall(PetscViewerDestroy(&viewer)); 86 PetscCall(PetscLogEventEnd(MATRIX_READ, 0, 0, 0, 0)); 87 PetscCall(MatView(C, PETSC_VIEWER_STDOUT_WORLD)); 88 89 /* Free data structures */ 90 PetscCall(MatDestroy(&C)); 91 92 PetscCall(PetscFinalize()); 93 return 0; 94 } 95 96 /*TEST 97 98 test: 99 filter: grep -v " MPI process" 100 101 TEST*/ 102