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 PetscErrorCode ierr; 17 PetscViewer viewer; 18 #if defined(PETSC_USE_LOG) 19 PetscLogEvent MATRIX_GENERATE,MATRIX_READ; 20 #endif 21 22 ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr; 23 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 24 ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); 25 ierr = PetscOptionsGetInt(NULL,NULL,"-m",&m,NULL);CHKERRQ(ierr); 26 ierr = PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);CHKERRQ(ierr); 27 N = m*n; 28 29 /* PART 1: Generate matrix, then write it in binary format */ 30 31 ierr = PetscLogEventRegister("Generate Matrix",0,&MATRIX_GENERATE);CHKERRQ(ierr); 32 ierr = PetscLogEventBegin(MATRIX_GENERATE,0,0,0,0);CHKERRQ(ierr); 33 34 /* Generate matrix */ 35 ierr = MatCreate(PETSC_COMM_WORLD,&C);CHKERRQ(ierr); 36 ierr = MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,N,N);CHKERRQ(ierr); 37 ierr = MatSetFromOptions(C);CHKERRQ(ierr); 38 ierr = MatSetUp(C);CHKERRQ(ierr); 39 ierr = MatGetOwnershipRange(C,&Istart,&Iend);CHKERRQ(ierr); 40 for (Ii=Istart; Ii<Iend; Ii++) { 41 v = -1.0; i = Ii/n; j = Ii - i*n; 42 if (i>0) {J = Ii - n; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);} 43 if (i<m-1) {J = Ii + n; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);} 44 if (j>0) {J = Ii - 1; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);} 45 if (j<n-1) {J = Ii + 1; ierr = MatSetValues(C,1,&Ii,1,&J,&v,ADD_VALUES);CHKERRQ(ierr);} 46 v = 4.0; ierr = MatSetValues(C,1,&Ii,1,&Ii,&v,ADD_VALUES);CHKERRQ(ierr); 47 } 48 ierr = MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 49 ierr = MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 50 ierr = MatView(C,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 51 52 ierr = PetscPrintf(PETSC_COMM_WORLD,"writing matrix in binary to matrix.dat ...\n");CHKERRQ(ierr); 53 ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_WRITE,&viewer);CHKERRQ(ierr); 54 ierr = MatView(C,viewer);CHKERRQ(ierr); 55 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 56 ierr = MatDestroy(&C);CHKERRQ(ierr); 57 ierr = PetscLogEventEnd(MATRIX_GENERATE,0,0,0,0);CHKERRQ(ierr); 58 59 /* PART 2: Read in matrix in binary format */ 60 61 /* All processors wait until test matrix has been dumped */ 62 ierr = MPI_Barrier(PETSC_COMM_WORLD);CHKERRQ(ierr); 63 64 ierr = PetscLogEventRegister("Read Matrix",0,&MATRIX_READ);CHKERRQ(ierr); 65 ierr = PetscLogEventBegin(MATRIX_READ,0,0,0,0);CHKERRQ(ierr); 66 ierr = PetscPrintf(PETSC_COMM_WORLD,"reading matrix in binary from matrix.dat ...\n");CHKERRQ(ierr); 67 ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_READ,&viewer);CHKERRQ(ierr); 68 ierr = MatCreate(PETSC_COMM_WORLD,&C);CHKERRQ(ierr); 69 ierr = MatLoad(C,viewer);CHKERRQ(ierr); 70 ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 71 ierr = PetscLogEventEnd(MATRIX_READ,0,0,0,0);CHKERRQ(ierr); 72 ierr = MatView(C,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); 73 74 /* Free data structures */ 75 ierr = MatDestroy(&C);CHKERRQ(ierr); 76 77 ierr = PetscFinalize(); 78 return ierr; 79 } 80 81 82 83 84 /*TEST 85 86 test: 87 filter: grep -v "MPI processes" 88 89 TEST*/ 90