static char help[] = "Tests MatCopy() and MatStore/RetrieveValues().\n\n"; #include int main(int argc,char **args) { Mat C,A; PetscInt i, n = 10,midx[3],bs=1; PetscScalar v[3]; PetscBool flg,isAIJ; MatType type; PetscMPIInt size; PetscCall(PetscInitialize(&argc,&args,(char*)0,help)); PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL)); PetscCall(PetscOptionsGetInt(NULL,NULL,"-mat_block_size",&bs,NULL)); PetscCall(MatCreate(PETSC_COMM_WORLD,&C)); PetscCall(MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,n,n)); PetscCall(MatSetType(C,MATAIJ)); PetscCall(MatSetFromOptions(C)); PetscCall(PetscObjectSetName((PetscObject)C,"initial")); PetscCall(MatGetType(C,&type)); if (size == 1) { PetscCall(PetscObjectTypeCompare((PetscObject)C,MATSEQAIJ,&isAIJ)); } else { PetscCall(PetscObjectTypeCompare((PetscObject)C,MATMPIAIJ,&isAIJ)); } PetscCall(MatSeqAIJSetPreallocation(C,3,NULL)); PetscCall(MatMPIAIJSetPreallocation(C,3,NULL,3,NULL)); PetscCall(MatSeqBAIJSetPreallocation(C,bs,3,NULL)); PetscCall(MatMPIBAIJSetPreallocation(C,bs,3,NULL,3,NULL)); PetscCall(MatSeqSBAIJSetPreallocation(C,bs,3,NULL)); PetscCall(MatMPISBAIJSetPreallocation(C,bs,3,NULL,3,NULL)); v[0] = -1.; v[1] = 2.; v[2] = -1.; for (i=1; i %s: Matrices are NOT multequal",Ctype,Cstype); PetscCall(MatConvert(Cs,Ctype,MAT_REUSE_MATRIX,&Cse)); PetscCall(PetscObjectSetName((PetscObject)Cse,"symm_conv_reuse")); PetscCall(MatViewFromOptions(Cse,NULL,"-view")); PetscCall(MatMultEqual(Cs,Cse,5,&flg)); PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"MatConvert MAT_REUSE_MATRIX %s -> %s: Matrices are NOT multequal",Ctype,Cstype); PetscCall(MatCopy(Cs,Cse,SAME_NONZERO_PATTERN)); PetscCall(PetscObjectSetName((PetscObject)Cse,"symm_conv_copy_samennz")); PetscCall(MatViewFromOptions(Cse,NULL,"-view")); PetscCall(MatMultEqual(Cs,Cse,5,&flg)); PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"MatCopy(...SAME_NONZERO_PATTERN) %s -> %s: Matrices are NOT multequal",Ctype,Cstype); PetscCall(MatCopy(Cs,Cse,SUBSET_NONZERO_PATTERN)); PetscCall(PetscObjectSetName((PetscObject)Cse,"symm_conv_copy_subnnz")); PetscCall(MatViewFromOptions(Cse,NULL,"-view")); PetscCall(MatMultEqual(Cs,Cse,5,&flg)); PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"MatCopy(...SUBSET_NONZERO_PATTERN) %s -> %s: Matrices are NOT multequal",Ctype,Cstype); PetscCall(MatCopy(Cs,Cse,DIFFERENT_NONZERO_PATTERN)); PetscCall(PetscObjectSetName((PetscObject)Cse,"symm_conv_copy_diffnnz")); PetscCall(MatViewFromOptions(Cse,NULL,"-view")); PetscCall(MatMultEqual(Cs,Cse,5,&flg)); PetscCheck(flg,PETSC_COMM_SELF,PETSC_ERR_PLIB,"MatCopy(...DIFFERENT_NONZERO_PATTERN) %s -> %s: Matrices are NOT multequal",Ctype,Cstype); PetscCall(MatDestroy(&Cse)); PetscCall(MatDestroy(&Cs)); } /* test MatStore/RetrieveValues() */ if (isAIJ) { PetscCall(MatSetOption(A,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE)); PetscCall(MatStoreValues(A)); PetscCall(MatZeroEntries(A)); PetscCall(MatRetrieveValues(A)); } PetscCall(MatDestroy(&C)); PetscCall(MatDestroy(&A)); PetscCall(PetscFinalize()); return 0; } /*TEST testset: nsize: {{1 2}separate output} args: -view ::ascii_info -mat_type {{aij baij sbaij mpiaij mpibaij mpisbaij}separate output} -mat_block_size {{1 2}separate output} TEST*/