Actual source code: ex31.c
2: static char help[] = "Tests binary I/O of matrices and illustrates user-defined event logging.\n\n";
4: #include <petscmat.h>
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. */
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
21: PetscInitialize(&argc,&args,(char*)0,help);
22: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
23: MPI_Comm_size(PETSC_COMM_WORLD,&size);
24: PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL);
25: PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);
26: N = m*n;
28: /* PART 1: Generate matrix, then write it in binary format */
30: PetscLogEventRegister("Generate Matrix",0,&MATRIX_GENERATE);
31: PetscLogEventBegin(MATRIX_GENERATE,0,0,0,0);
33: /* Generate matrix */
34: MatCreate(PETSC_COMM_WORLD,&C);
35: MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,N,N);
36: MatSetFromOptions(C);
37: MatSetUp(C);
38: MatGetOwnershipRange(C,&Istart,&Iend);
39: for (Ii=Istart; Ii<Iend; Ii++) {
40: v = -1.0; i = Ii/n; j = Ii - i*n;
41: if (i>0) {J = Ii - n; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
42: if (i<m-1) {J = Ii + n; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
43: if (j>0) {J = Ii - 1; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
44: if (j<n-1) {J = Ii + 1; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
45: v = 4.0; MatSetValues(C,1,&Ii,1,&Ii,&v,ADD_VALUES);
46: }
47: MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);
48: MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);
49: MatView(C,PETSC_VIEWER_STDOUT_WORLD);
51: PetscPrintf(PETSC_COMM_WORLD,"writing matrix in binary to matrix.dat ...\n");
52: PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_WRITE,&viewer);
53: MatView(C,viewer);
54: PetscViewerDestroy(&viewer);
55: MatDestroy(&C);
56: PetscLogEventEnd(MATRIX_GENERATE,0,0,0,0);
58: /* PART 2: Read in matrix in binary format */
60: /* All processors wait until test matrix has been dumped */
61: MPI_Barrier(PETSC_COMM_WORLD);
63: PetscLogEventRegister("Read Matrix",0,&MATRIX_READ);
64: PetscLogEventBegin(MATRIX_READ,0,0,0,0);
65: PetscPrintf(PETSC_COMM_WORLD,"reading matrix in binary from matrix.dat ...\n");
66: PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_READ,&viewer);
67: MatCreate(PETSC_COMM_WORLD,&C);
68: MatLoad(C,viewer);
69: PetscViewerDestroy(&viewer);
70: PetscLogEventEnd(MATRIX_READ,0,0,0,0);
71: MatView(C,PETSC_VIEWER_STDOUT_WORLD);
73: /* Free data structures */
74: MatDestroy(&C);
76: PetscFinalize();
77: return 0;
78: }
80: /*TEST
82: test:
83: filter: grep -v "MPI processes"
85: TEST*/