1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Tests MatCopy() and MatStore/RetrieveValues().\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscmat.h> 5c4762a1bSJed Brown 6*d71ae5a4SJacob Faibussowitsch int main(int argc, char **args) 7*d71ae5a4SJacob Faibussowitsch { 8c4762a1bSJed Brown Mat C, A; 9c4762a1bSJed Brown PetscInt i, n = 10, midx[3], bs = 1; 10c4762a1bSJed Brown PetscScalar v[3]; 11c4762a1bSJed Brown PetscBool flg, isAIJ; 12c4762a1bSJed Brown MatType type; 13c4762a1bSJed Brown PetscMPIInt size; 14c4762a1bSJed Brown 15327415f7SBarry Smith PetscFunctionBeginUser; 169566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &args, (char *)0, help)); 179566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 189566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL)); 199566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-mat_block_size", &bs, NULL)); 20c4762a1bSJed Brown 219566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &C)); 229566063dSJacob Faibussowitsch PetscCall(MatSetSizes(C, PETSC_DECIDE, PETSC_DECIDE, n, n)); 239566063dSJacob Faibussowitsch PetscCall(MatSetType(C, MATAIJ)); 249566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(C)); 259566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)C, "initial")); 26c4762a1bSJed Brown 279566063dSJacob Faibussowitsch PetscCall(MatGetType(C, &type)); 28c4762a1bSJed Brown if (size == 1) { 299566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)C, MATSEQAIJ, &isAIJ)); 30c4762a1bSJed Brown } else { 319566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)C, MATMPIAIJ, &isAIJ)); 32c4762a1bSJed Brown } 339566063dSJacob Faibussowitsch PetscCall(MatSeqAIJSetPreallocation(C, 3, NULL)); 349566063dSJacob Faibussowitsch PetscCall(MatMPIAIJSetPreallocation(C, 3, NULL, 3, NULL)); 359566063dSJacob Faibussowitsch PetscCall(MatSeqBAIJSetPreallocation(C, bs, 3, NULL)); 369566063dSJacob Faibussowitsch PetscCall(MatMPIBAIJSetPreallocation(C, bs, 3, NULL, 3, NULL)); 379566063dSJacob Faibussowitsch PetscCall(MatSeqSBAIJSetPreallocation(C, bs, 3, NULL)); 389566063dSJacob Faibussowitsch PetscCall(MatMPISBAIJSetPreallocation(C, bs, 3, NULL, 3, NULL)); 39c4762a1bSJed Brown 409371c9d4SSatish Balay v[0] = -1.; 419371c9d4SSatish Balay v[1] = 2.; 429371c9d4SSatish Balay v[2] = -1.; 43c4762a1bSJed Brown for (i = 1; i < n - 1; i++) { 449371c9d4SSatish Balay midx[2] = i - 1; 459371c9d4SSatish Balay midx[1] = i; 469371c9d4SSatish Balay midx[0] = i + 1; 479566063dSJacob Faibussowitsch PetscCall(MatSetValues(C, 1, &i, 3, midx, v, INSERT_VALUES)); 48c4762a1bSJed Brown } 499371c9d4SSatish Balay i = 0; 509371c9d4SSatish Balay midx[0] = 0; 519371c9d4SSatish Balay midx[1] = 1; 529371c9d4SSatish Balay v[0] = 2.0; 539371c9d4SSatish Balay v[1] = -1.; 549566063dSJacob Faibussowitsch PetscCall(MatSetValues(C, 1, &i, 2, midx, v, INSERT_VALUES)); 559371c9d4SSatish Balay i = n - 1; 569371c9d4SSatish Balay midx[0] = n - 2; 579371c9d4SSatish Balay midx[1] = n - 1; 589371c9d4SSatish Balay v[0] = -1.0; 599371c9d4SSatish Balay v[1] = 2.; 609566063dSJacob Faibussowitsch PetscCall(MatSetValues(C, 1, &i, 2, midx, v, INSERT_VALUES)); 61c4762a1bSJed Brown 629566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(C, MAT_FINAL_ASSEMBLY)); 639566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(C, MAT_FINAL_ASSEMBLY)); 649566063dSJacob Faibussowitsch PetscCall(MatView(C, NULL)); 659566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(C, NULL, "-view")); 66c4762a1bSJed Brown 67c4762a1bSJed Brown /* test matduplicate */ 689566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C, MAT_COPY_VALUES, &A)); 699566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)A, "duplicate_copy")); 709566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(A, NULL, "-view")); 719566063dSJacob Faibussowitsch PetscCall(MatEqual(A, C, &flg)); 7228b400f6SJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_SUP, "MatDuplicate(C,MAT_COPY_VALUES,): Matrices are NOT equal"); 739566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 74c4762a1bSJed Brown 75c4762a1bSJed Brown /* test matrices with different nonzero patterns - Note: A is created with different nonzero pattern of C! */ 769566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &A)); 779566063dSJacob Faibussowitsch PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, n, n)); 789566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(A)); 799566063dSJacob Faibussowitsch PetscCall(MatSetUp(A)); 809566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY)); 819566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY)); 82c4762a1bSJed Brown 839566063dSJacob Faibussowitsch PetscCall(MatCopy(C, A, DIFFERENT_NONZERO_PATTERN)); 849566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)A, "copy_diffnnz")); 859566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(A, NULL, "-view")); 869566063dSJacob Faibussowitsch PetscCall(MatEqual(A, C, &flg)); 8728b400f6SJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_SUP, "MatCopy(C,A,DIFFERENT_NONZERO_PATTERN): Matrices are NOT equal"); 88c4762a1bSJed Brown 89c4762a1bSJed Brown /* test matrices with same nonzero pattern */ 909566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 919566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C, MAT_DO_NOT_COPY_VALUES, &A)); 929566063dSJacob Faibussowitsch PetscCall(MatCopy(C, A, SAME_NONZERO_PATTERN)); 939566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)A, "copy_samennz")); 949566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(A, NULL, "-view")); 959566063dSJacob Faibussowitsch PetscCall(MatEqual(A, C, &flg)); 9628b400f6SJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_SUP, "MatCopy(C,A,SAME_NONZERO_PATTERN): Matrices are NOT equal"); 97c4762a1bSJed Brown 98c4762a1bSJed Brown /* test subset nonzero pattern */ 999566063dSJacob Faibussowitsch PetscCall(MatCopy(C, A, SUBSET_NONZERO_PATTERN)); 1009566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)A, "copy_subnnz")); 1019566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(A, NULL, "-view")); 1029566063dSJacob Faibussowitsch PetscCall(MatEqual(A, C, &flg)); 10328b400f6SJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_SUP, "MatCopy(C,A,SUBSET_NONZERO_PATTERN): Matrices are NOT equal"); 104c4762a1bSJed Brown 105c4762a1bSJed Brown /* Test MatCopy on a matrix obtained after MatConvert from AIJ 106c4762a1bSJed Brown see https://lists.mcs.anl.gov/pipermail/petsc-dev/2019-April/024289.html */ 1079566063dSJacob Faibussowitsch PetscCall(MatHasCongruentLayouts(C, &flg)); 108c4762a1bSJed Brown if (flg) { 109c4762a1bSJed Brown Mat Cs, Cse; 110c4762a1bSJed Brown MatType Ctype, Cstype; 111c4762a1bSJed Brown 1129566063dSJacob Faibussowitsch PetscCall(MatGetType(C, &Ctype)); 1139566063dSJacob Faibussowitsch PetscCall(MatTranspose(C, MAT_INITIAL_MATRIX, &Cs)); 1149566063dSJacob Faibussowitsch PetscCall(MatAXPY(Cs, 1.0, C, DIFFERENT_NONZERO_PATTERN)); 1159566063dSJacob Faibussowitsch PetscCall(MatConvert(Cs, MATAIJ, MAT_INPLACE_MATRIX, &Cs)); 1169566063dSJacob Faibussowitsch PetscCall(MatSetOption(Cs, MAT_SYMMETRIC, PETSC_TRUE)); 1179566063dSJacob Faibussowitsch PetscCall(MatGetType(Cs, &Cstype)); 118c4762a1bSJed Brown 1199566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)Cs, "symm_initial")); 1209566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(Cs, NULL, "-view")); 121c4762a1bSJed Brown 1229566063dSJacob Faibussowitsch PetscCall(MatConvert(Cs, Ctype, MAT_INITIAL_MATRIX, &Cse)); 1239566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)Cse, "symm_conv_init")); 1249566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(Cse, NULL, "-view")); 1259566063dSJacob Faibussowitsch PetscCall(MatMultEqual(Cs, Cse, 5, &flg)); 12628b400f6SJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "MatConvert MAT_INITIAL_MATRIX %s -> %s: Matrices are NOT multequal", Ctype, Cstype); 127c4762a1bSJed Brown 1289566063dSJacob Faibussowitsch PetscCall(MatConvert(Cs, Ctype, MAT_REUSE_MATRIX, &Cse)); 1299566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)Cse, "symm_conv_reuse")); 1309566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(Cse, NULL, "-view")); 1319566063dSJacob Faibussowitsch PetscCall(MatMultEqual(Cs, Cse, 5, &flg)); 13228b400f6SJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "MatConvert MAT_REUSE_MATRIX %s -> %s: Matrices are NOT multequal", Ctype, Cstype); 133c4762a1bSJed Brown 1349566063dSJacob Faibussowitsch PetscCall(MatCopy(Cs, Cse, SAME_NONZERO_PATTERN)); 1359566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)Cse, "symm_conv_copy_samennz")); 1369566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(Cse, NULL, "-view")); 1379566063dSJacob Faibussowitsch PetscCall(MatMultEqual(Cs, Cse, 5, &flg)); 13828b400f6SJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "MatCopy(...SAME_NONZERO_PATTERN) %s -> %s: Matrices are NOT multequal", Ctype, Cstype); 139c4762a1bSJed Brown 1409566063dSJacob Faibussowitsch PetscCall(MatCopy(Cs, Cse, SUBSET_NONZERO_PATTERN)); 1419566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)Cse, "symm_conv_copy_subnnz")); 1429566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(Cse, NULL, "-view")); 1439566063dSJacob Faibussowitsch PetscCall(MatMultEqual(Cs, Cse, 5, &flg)); 14428b400f6SJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "MatCopy(...SUBSET_NONZERO_PATTERN) %s -> %s: Matrices are NOT multequal", Ctype, Cstype); 145c4762a1bSJed Brown 1469566063dSJacob Faibussowitsch PetscCall(MatCopy(Cs, Cse, DIFFERENT_NONZERO_PATTERN)); 1479566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)Cse, "symm_conv_copy_diffnnz")); 1489566063dSJacob Faibussowitsch PetscCall(MatViewFromOptions(Cse, NULL, "-view")); 1499566063dSJacob Faibussowitsch PetscCall(MatMultEqual(Cs, Cse, 5, &flg)); 15028b400f6SJacob Faibussowitsch PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_PLIB, "MatCopy(...DIFFERENT_NONZERO_PATTERN) %s -> %s: Matrices are NOT multequal", Ctype, Cstype); 151c4762a1bSJed Brown 1529566063dSJacob Faibussowitsch PetscCall(MatDestroy(&Cse)); 1539566063dSJacob Faibussowitsch PetscCall(MatDestroy(&Cs)); 154c4762a1bSJed Brown } 155c4762a1bSJed Brown 156c4762a1bSJed Brown /* test MatStore/RetrieveValues() */ 157c4762a1bSJed Brown if (isAIJ) { 1589566063dSJacob Faibussowitsch PetscCall(MatSetOption(A, MAT_NEW_NONZERO_LOCATIONS, PETSC_FALSE)); 1599566063dSJacob Faibussowitsch PetscCall(MatStoreValues(A)); 1609566063dSJacob Faibussowitsch PetscCall(MatZeroEntries(A)); 1619566063dSJacob Faibussowitsch PetscCall(MatRetrieveValues(A)); 162c4762a1bSJed Brown } 163c4762a1bSJed Brown 1649566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C)); 1659566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 1669566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 167b122ec5aSJacob Faibussowitsch return 0; 168c4762a1bSJed Brown } 169c4762a1bSJed Brown 170c4762a1bSJed Brown /*TEST 171c4762a1bSJed Brown 172c4762a1bSJed Brown testset: 173c4762a1bSJed Brown nsize: {{1 2}separate output} 174c4762a1bSJed Brown args: -view ::ascii_info -mat_type {{aij baij sbaij mpiaij mpibaij mpisbaij}separate output} -mat_block_size {{1 2}separate output} 175c4762a1bSJed Brown 176c4762a1bSJed Brown TEST*/ 177