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. */
12: int main(int argc,char **args)
13: {
14: Mat C;
15: PetscScalar v;
16: PetscInt i,j,Ii,J,Istart,Iend,N,m = 4,n = 4;
17: PetscMPIInt rank,size;
19: PetscViewer viewer;
20: #if defined (PETSC_USE_LOG)
21: PetscLogEvent MATRIX_GENERATE,MATRIX_READ;
22: #endif
24: PetscInitialize(&argc,&args,(char *)0,help);
25: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
26: MPI_Comm_size(PETSC_COMM_WORLD,&size);
27: PetscOptionsGetInt(PETSC_NULL,"-m",&m,PETSC_NULL);
28: PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);
29: N = m*n;
31: /* PART 1: Generate matrix, then write it in binary format */
33: PetscLogEventRegister("Generate Matrix",0,&MATRIX_GENERATE);
34: PetscLogEventBegin(MATRIX_GENERATE,0,0,0,0);
36: /* Generate matrix */
37: MatCreate(PETSC_COMM_WORLD,&C);
38: MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,N,N);
39: MatSetFromOptions(C);
40: MatGetOwnershipRange(C,&Istart,&Iend);
41: for (Ii=Istart; Ii<Iend; Ii++) {
42: v = -1.0; i = Ii/n; j = Ii - i*n;
43: if (i>0) {J = Ii - n; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
44: if (i<m-1) {J = Ii + n; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
45: if (j>0) {J = Ii - 1; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
46: if (j<n-1) {J = Ii + 1; MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);}
47: v = 4.0; MatSetValues(C,1,&Ii,1,&Ii,&v,ADD_VALUES);
48: }
49: MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);
50: MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);
51: MatView(C,PETSC_VIEWER_STDOUT_WORLD);
53: PetscPrintf(PETSC_COMM_WORLD,"writing matrix in binary to matrix.dat ...\n");
54: PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_WRITE,&viewer);
55: MatView(C,viewer);
56: PetscViewerDestroy(viewer);
57: MatDestroy(C);
58: PetscLogEventEnd(MATRIX_GENERATE,0,0,0,0);
60: /* PART 2: Read in matrix in binary format */
62: /* All processors wait until test matrix has been dumped */
63: MPI_Barrier(PETSC_COMM_WORLD);
65: PetscLogEventRegister("Read Matrix",0,&MATRIX_READ);
66: PetscLogEventBegin(MATRIX_READ,0,0,0,0);
67: PetscPrintf(PETSC_COMM_WORLD,"reading matrix in binary from matrix.dat ...\n");
68: PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_READ,&viewer);
69: MatLoad(viewer,MATAIJ,&C);
70: PetscViewerDestroy(viewer);
71: PetscLogEventEnd(MATRIX_READ,0,0,0,0);
72: MatView(C,PETSC_VIEWER_STDOUT_WORLD);
74: /* Free data structures */
75: MatDestroy(C);
77: PetscFinalize();
78: return 0;
79: }