1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Tests binary I/O of matrices and illustrates user-defined event logging.\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscmat.h> 5c4762a1bSJed Brown 6c4762a1bSJed Brown /* Note: Most applications would not read and write the same matrix within 7c4762a1bSJed Brown the same program. This example is intended only to demonstrate 8c4762a1bSJed Brown both input and output. */ 9c4762a1bSJed Brown 10*d71ae5a4SJacob Faibussowitsch int main(int argc, char **args) 11*d71ae5a4SJacob Faibussowitsch { 12c4762a1bSJed Brown Mat C; 13c4762a1bSJed Brown PetscScalar v; 14c4762a1bSJed Brown PetscInt i, j, Ii, J, Istart, Iend, N, m = 4, n = 4; 15c4762a1bSJed Brown PetscMPIInt rank, size; 16c4762a1bSJed Brown PetscViewer viewer; 17c4762a1bSJed Brown #if defined(PETSC_USE_LOG) 18c4762a1bSJed Brown PetscLogEvent MATRIX_GENERATE, MATRIX_READ; 19c4762a1bSJed Brown #endif 20c4762a1bSJed Brown 21327415f7SBarry Smith PetscFunctionBeginUser; 229566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &args, (char *)0, help)); 239566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 249566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 259566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL)); 269566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL)); 27c4762a1bSJed Brown N = m * n; 28c4762a1bSJed Brown 29c4762a1bSJed Brown /* PART 1: Generate matrix, then write it in binary format */ 30c4762a1bSJed Brown 319566063dSJacob Faibussowitsch PetscCall(PetscLogEventRegister("Generate Matrix", 0, &MATRIX_GENERATE)); 329566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(MATRIX_GENERATE, 0, 0, 0, 0)); 33c4762a1bSJed Brown 34c4762a1bSJed Brown /* Generate matrix */ 359566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &C)); 369566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C, PETSC_DECIDE, PETSC_DECIDE, N, N)); 379566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(C)); 389566063dSJacob Faibussowitsch PetscCall(MatSetUp(C)); 399566063dSJacob Faibussowitsch PetscCall(MatGetOwnershipRange(C, &Istart, &Iend)); 40c4762a1bSJed Brown for (Ii = Istart; Ii < Iend; Ii++) { 419371c9d4SSatish Balay v = -1.0; 429371c9d4SSatish Balay i = Ii / n; 439371c9d4SSatish Balay j = Ii - i * n; 449371c9d4SSatish Balay if (i > 0) { 459371c9d4SSatish Balay J = Ii - n; 469371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 479371c9d4SSatish Balay } 489371c9d4SSatish Balay if (i < m - 1) { 499371c9d4SSatish Balay J = Ii + n; 509371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 519371c9d4SSatish Balay } 529371c9d4SSatish Balay if (j > 0) { 539371c9d4SSatish Balay J = Ii - 1; 549371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 559371c9d4SSatish Balay } 569371c9d4SSatish Balay if (j < n - 1) { 579371c9d4SSatish Balay J = Ii + 1; 589371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &J, &v, ADD_VALUES)); 599371c9d4SSatish Balay } 609371c9d4SSatish Balay v = 4.0; 619371c9d4SSatish Balay PetscCall(MatSetValues(C, 1, &Ii, 1, &Ii, &v, ADD_VALUES)); 62c4762a1bSJed Brown } 639566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY)); 649566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY)); 659566063dSJacob Faibussowitsch PetscCall(MatView(C, PETSC_VIEWER_STDOUT_WORLD)); 66c4762a1bSJed Brown 679566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "writing matrix in binary to matrix.dat ...\n")); 689566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "matrix.dat", FILE_MODE_WRITE, &viewer)); 699566063dSJacob Faibussowitsch PetscCall(MatView(C, viewer)); 709566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 719566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C)); 729566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(MATRIX_GENERATE, 0, 0, 0, 0)); 73c4762a1bSJed Brown 74c4762a1bSJed Brown /* PART 2: Read in matrix in binary format */ 75c4762a1bSJed Brown 76c4762a1bSJed Brown /* All processors wait until test matrix has been dumped */ 779566063dSJacob Faibussowitsch PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD)); 78c4762a1bSJed Brown 799566063dSJacob Faibussowitsch PetscCall(PetscLogEventRegister("Read Matrix", 0, &MATRIX_READ)); 809566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(MATRIX_READ, 0, 0, 0, 0)); 819566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "reading matrix in binary from matrix.dat ...\n")); 829566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "matrix.dat", FILE_MODE_READ, &viewer)); 839566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &C)); 849566063dSJacob Faibussowitsch PetscCall(MatLoad(C, viewer)); 859566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 869566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(MATRIX_READ, 0, 0, 0, 0)); 879566063dSJacob Faibussowitsch PetscCall(MatView(C, PETSC_VIEWER_STDOUT_WORLD)); 88c4762a1bSJed Brown 89c4762a1bSJed Brown /* Free data structures */ 909566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C)); 91c4762a1bSJed Brown 929566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 93b122ec5aSJacob Faibussowitsch return 0; 94c4762a1bSJed Brown } 95c4762a1bSJed Brown 96c4762a1bSJed Brown /*TEST 97c4762a1bSJed Brown 98c4762a1bSJed Brown test: 998cc725e6SPierre Jolivet filter: grep -v " MPI process" 100c4762a1bSJed Brown 101c4762a1bSJed Brown TEST*/ 102