1 static char help[] = "Tests MatView()/MatLoad() with binary viewers for BAIJ matrices.\n\n"; 2 3 #include <petscmat.h> 4 #include <petscviewer.h> 5 6 #include <petsc/private/hashtable.h> 7 static PetscReal MakeValue(PetscInt i,PetscInt j,PetscInt M) 8 { 9 PetscHash_t h = PetscHashCombine(PetscHashInt(i),PetscHashInt(j)); 10 return (PetscReal) ((h % 5 == 0) ? (1 + i + j*M) : 0); 11 } 12 13 static PetscErrorCode CheckValuesAIJ(Mat A) 14 { 15 PetscInt M,N,rstart,rend,i,j; 16 PetscReal v,w; 17 PetscScalar val; 18 PetscErrorCode ierr; 19 20 PetscFunctionBegin; 21 ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 22 ierr = MatGetOwnershipRange(A,&rstart,&rend);CHKERRQ(ierr); 23 for (i=rstart; i<rend; i++) { 24 for (j=0; j<N; j++) { 25 ierr = MatGetValue(A,i,j,&val);CHKERRQ(ierr); 26 v = MakeValue(i,j,M); w = PetscRealPart(val); 27 PetscCheckFalse(PetscAbsReal(v-w) > 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Matrix entry (%" PetscInt_FMT ",%" PetscInt_FMT ") should be %g, got %g",i,j,(double)v,(double)w); 28 } 29 } 30 PetscFunctionReturn(0); 31 } 32 33 int main(int argc,char **args) 34 { 35 Mat A; 36 PetscInt M = 24,N = 48,bs = 2; 37 PetscInt rstart,rend,i,j; 38 PetscErrorCode ierr; 39 PetscViewer view; 40 41 ierr = PetscInitialize(&argc,&args,NULL,help);if (ierr) return ierr; 42 /* 43 Create a parallel BAIJ matrix shared by all processors 44 */ 45 ierr = MatCreateBAIJ(PETSC_COMM_WORLD, 46 bs, 47 PETSC_DECIDE,PETSC_DECIDE, 48 M,N, 49 PETSC_DECIDE,NULL, 50 PETSC_DECIDE,NULL, 51 &A);CHKERRQ(ierr); 52 53 /* 54 Set values into the matrix 55 */ 56 ierr = MatGetSize(A,&M,&N);CHKERRQ(ierr); 57 ierr = MatGetOwnershipRange(A,&rstart,&rend);CHKERRQ(ierr); 58 for (i=rstart; i<rend; i++) { 59 for (j=0; j<N; j++) { 60 PetscReal v = MakeValue(i,j,M); 61 if (PetscAbsReal(v) > 0) { 62 ierr = MatSetValue(A,i,j,v,INSERT_VALUES);CHKERRQ(ierr); 63 } 64 } 65 } 66 ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 67 ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 68 ierr = MatViewFromOptions(A,NULL,"-mat_base_view");CHKERRQ(ierr); 69 70 /* 71 Store the binary matrix to a file 72 */ 73 ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD, "matrix.dat", FILE_MODE_WRITE, &view);CHKERRQ(ierr); 74 for (i=0; i<3; i++) { 75 ierr = MatView(A,view);CHKERRQ(ierr); 76 } 77 ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 78 ierr = MatDestroy(&A);CHKERRQ(ierr); 79 80 /* 81 Now reload the matrix and check its values 82 */ 83 ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_READ,&view);CHKERRQ(ierr); 84 ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); 85 ierr = MatSetType(A,MATBAIJ);CHKERRQ(ierr); 86 for (i=0; i<3; i++) { 87 if (i > 0) {ierr = MatZeroEntries(A);CHKERRQ(ierr);} 88 ierr = MatLoad(A,view);CHKERRQ(ierr); 89 ierr = CheckValuesAIJ(A);CHKERRQ(ierr); 90 } 91 ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 92 ierr = MatViewFromOptions(A,NULL,"-mat_load_view");CHKERRQ(ierr); 93 ierr = MatDestroy(&A);CHKERRQ(ierr); 94 95 /* 96 Reload in SEQBAIJ matrix and check its values 97 */ 98 ierr = PetscViewerBinaryOpen(PETSC_COMM_SELF,"matrix.dat",FILE_MODE_READ,&view);CHKERRQ(ierr); 99 ierr = MatCreate(PETSC_COMM_SELF,&A);CHKERRQ(ierr); 100 ierr = MatSetType(A,MATSEQBAIJ);CHKERRQ(ierr); 101 for (i=0; i<3; i++) { 102 if (i > 0) {ierr = MatZeroEntries(A);CHKERRQ(ierr);} 103 ierr = MatLoad(A,view);CHKERRQ(ierr); 104 ierr = CheckValuesAIJ(A);CHKERRQ(ierr); 105 } 106 ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 107 ierr = MatDestroy(&A);CHKERRQ(ierr); 108 109 /* 110 Reload in MPIBAIJ matrix and check its values 111 */ 112 ierr = PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_READ,&view);CHKERRQ(ierr); 113 ierr = MatCreate(PETSC_COMM_WORLD,&A);CHKERRQ(ierr); 114 ierr = MatSetType(A,MATMPIBAIJ);CHKERRQ(ierr); 115 for (i=0; i<3; i++) { 116 if (i > 0) {ierr = MatZeroEntries(A);CHKERRQ(ierr);} 117 ierr = MatLoad(A,view);CHKERRQ(ierr); 118 ierr = CheckValuesAIJ(A);CHKERRQ(ierr); 119 } 120 ierr = PetscViewerDestroy(&view);CHKERRQ(ierr); 121 ierr = MatDestroy(&A);CHKERRQ(ierr); 122 123 ierr = PetscFinalize(); 124 return ierr; 125 } 126 127 /*TEST 128 129 testset: 130 args: -viewer_binary_mpiio 0 131 output_file: output/ex45.out 132 test: 133 suffix: stdio_1 134 nsize: 1 135 test: 136 suffix: stdio_2 137 nsize: 2 138 test: 139 suffix: stdio_3 140 nsize: 3 141 test: 142 suffix: stdio_4 143 nsize: 4 144 test: 145 suffix: stdio_5 146 nsize: 4 147 148 testset: 149 requires: mpiio 150 args: -viewer_binary_mpiio 1 151 output_file: output/ex45.out 152 test: 153 suffix: mpiio_1 154 nsize: 1 155 test: 156 suffix: mpiio_2 157 nsize: 2 158 test: 159 suffix: mpiio_3 160 nsize: 3 161 test: 162 suffix: mpiio_4 163 nsize: 4 164 test: 165 suffix: mpiio_5 166 nsize: 5 167 168 TEST*/ 169