static char help[] = "Tests MatView()/MatLoad() with binary viewers for AIJ matrices.\n\n"; #include #include #include static PetscReal MakeValue(PetscInt i,PetscInt j,PetscInt M) { PetscHash_t h = PetscHashCombine(PetscHashInt(i),PetscHashInt(j)); return (PetscReal) ((h % 5 == 0) ? (1 + i + j*M) : 0); } static PetscErrorCode CheckValuesAIJ(Mat A) { PetscInt M,N,rstart,rend,i,j; PetscReal v,w; PetscScalar val; PetscFunctionBegin; PetscCall(MatGetSize(A,&M,&N)); PetscCall(MatGetOwnershipRange(A,&rstart,&rend)); for (i=rstart; i 0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Matrix entry (%" PetscInt_FMT ",%" PetscInt_FMT ") should be %g, got %g",i,j,(double)v,(double)w); } } PetscFunctionReturn(0); } int main(int argc,char **args) { Mat A; PetscInt M = 11,N = 13; PetscInt rstart,rend,i,j; PetscErrorCode ierr; PetscViewer view; PetscCall(PetscInitialize(&argc,&args,NULL,help)); /* Create a parallel AIJ matrix shared by all processors */ ierr = MatCreateAIJ(PETSC_COMM_WORLD, PETSC_DECIDE,PETSC_DECIDE, M,N, PETSC_DECIDE,NULL, PETSC_DECIDE,NULL, &A);PetscCall(ierr); /* Set values into the matrix */ PetscCall(MatGetOwnershipRange(A,&rstart,&rend)); for (i=rstart; i 0) { PetscCall(MatSetValue(A,i,j,v,INSERT_VALUES)); } } } PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY)); PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY)); PetscCall(MatViewFromOptions(A,NULL,"-mat_base_view")); /* Store the binary matrix to a file */ PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "matrix.dat", FILE_MODE_WRITE, &view)); for (i=0; i<3; i++) { PetscCall(MatView(A,view)); } PetscCall(PetscViewerDestroy(&view)); PetscCall(MatDestroy(&A)); /* Now reload the matrix and check its values */ PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_READ,&view)); PetscCall(MatCreate(PETSC_COMM_WORLD,&A)); PetscCall(MatSetType(A,MATAIJ)); for (i=0; i<3; i++) { if (i > 0) PetscCall(MatZeroEntries(A)); PetscCall(MatLoad(A,view)); PetscCall(CheckValuesAIJ(A)); } PetscCall(PetscViewerDestroy(&view)); PetscCall(MatViewFromOptions(A,NULL,"-mat_load_view")); PetscCall(MatDestroy(&A)); /* Reload in SEQAIJ matrix and check its values */ PetscCall(PetscViewerBinaryOpen(PETSC_COMM_SELF,"matrix.dat",FILE_MODE_READ,&view)); PetscCall(MatCreate(PETSC_COMM_SELF,&A)); PetscCall(MatSetType(A,MATSEQAIJ)); for (i=0; i<3; i++) { if (i > 0) PetscCall(MatZeroEntries(A)); PetscCall(MatLoad(A,view)); PetscCall(CheckValuesAIJ(A)); } PetscCall(PetscViewerDestroy(&view)); PetscCall(MatDestroy(&A)); /* Reload in MPIAIJ matrix and check its values */ PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD,"matrix.dat",FILE_MODE_READ,&view)); PetscCall(MatCreate(PETSC_COMM_WORLD,&A)); PetscCall(MatSetType(A,MATMPIAIJ)); for (i=0; i<3; i++) { if (i > 0) PetscCall(MatZeroEntries(A)); PetscCall(MatLoad(A,view)); PetscCall(CheckValuesAIJ(A)); } PetscCall(PetscViewerDestroy(&view)); PetscCall(MatDestroy(&A)); PetscCall(PetscFinalize()); return 0; } /*TEST testset: args: -viewer_binary_mpiio 0 output_file: output/ex44.out test: suffix: stdio_1 nsize: 1 test: suffix: stdio_2 nsize: 2 test: suffix: stdio_3 nsize: 3 test: suffix: stdio_4 nsize: 4 test: suffix: stdio_15 nsize: 15 testset: requires: mpiio args: -viewer_binary_mpiio 1 output_file: output/ex44.out test: suffix: mpiio_1 nsize: 1 test: suffix: mpiio_2 nsize: 2 test: suffix: mpiio_3 nsize: 3 test: suffix: mpiio_4 nsize: 4 test: suffix: mpiio_15 nsize: 15 TEST*/