Actual source code: ex37.c
2: static char help[] = "Tests MatCopy() and MatStore/RetrieveValues().\n\n";
4: #include <petscmat.h>
6: int main(int argc,char **args)
7: {
8: Mat C,A;
9: PetscInt i, n = 10,midx[3],bs=1;
10: PetscScalar v[3];
11: PetscBool flg,isAIJ;
12: MatType type;
13: PetscMPIInt size;
15: PetscInitialize(&argc,&args,(char*)0,help);
16: MPI_Comm_size(PETSC_COMM_WORLD,&size);
17: PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);
18: PetscOptionsGetInt(NULL,NULL,"-mat_block_size",&bs,NULL);
20: MatCreate(PETSC_COMM_WORLD,&C);
21: MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,n,n);
22: MatSetType(C,MATAIJ);
23: MatSetFromOptions(C);
24: PetscObjectSetName((PetscObject)C,"initial");
26: MatGetType(C,&type);
27: if (size == 1) {
28: PetscObjectTypeCompare((PetscObject)C,MATSEQAIJ,&isAIJ);
29: } else {
30: PetscObjectTypeCompare((PetscObject)C,MATMPIAIJ,&isAIJ);
31: }
32: MatSeqAIJSetPreallocation(C,3,NULL);
33: MatMPIAIJSetPreallocation(C,3,NULL,3,NULL);
34: MatSeqBAIJSetPreallocation(C,bs,3,NULL);
35: MatMPIBAIJSetPreallocation(C,bs,3,NULL,3,NULL);
36: MatSeqSBAIJSetPreallocation(C,bs,3,NULL);
37: MatMPISBAIJSetPreallocation(C,bs,3,NULL,3,NULL);
39: v[0] = -1.; v[1] = 2.; v[2] = -1.;
40: for (i=1; i<n-1; i++) {
41: midx[2] = i-1; midx[1] = i; midx[0] = i+1;
42: MatSetValues(C,1,&i,3,midx,v,INSERT_VALUES);
43: }
44: i = 0; midx[0] = 0; midx[1] = 1;
45: v[0] = 2.0; v[1] = -1.;
46: MatSetValues(C,1,&i,2,midx,v,INSERT_VALUES);
47: i = n-1; midx[0] = n-2; midx[1] = n-1;
48: v[0] = -1.0; v[1] = 2.;
49: MatSetValues(C,1,&i,2,midx,v,INSERT_VALUES);
51: MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);
52: MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);
53: MatView(C,NULL);
54: MatViewFromOptions(C,NULL,"-view");
56: /* test matduplicate */
57: MatDuplicate(C,MAT_COPY_VALUES,&A);
58: PetscObjectSetName((PetscObject)A,"duplicate_copy");
59: MatViewFromOptions(A,NULL,"-view");
60: MatEqual(A,C,&flg);
62: MatDestroy(&A);
64: /* test matrices with different nonzero patterns - Note: A is created with different nonzero pattern of C! */
65: MatCreate(PETSC_COMM_WORLD,&A);
66: MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n);
67: MatSetFromOptions(A);
68: MatSetUp(A);
69: MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
70: MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);
72: MatCopy(C,A,DIFFERENT_NONZERO_PATTERN);
73: PetscObjectSetName((PetscObject)A,"copy_diffnnz");
74: MatViewFromOptions(A,NULL,"-view");
75: MatEqual(A,C,&flg);
78: /* test matrices with same nonzero pattern */
79: MatDestroy(&A);
80: MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&A);
81: MatCopy(C,A,SAME_NONZERO_PATTERN);
82: PetscObjectSetName((PetscObject)A,"copy_samennz");
83: MatViewFromOptions(A,NULL,"-view");
84: MatEqual(A,C,&flg);
87: /* test subset nonzero pattern */
88: MatCopy(C,A,SUBSET_NONZERO_PATTERN);
89: PetscObjectSetName((PetscObject)A,"copy_subnnz");
90: MatViewFromOptions(A,NULL,"-view");
91: MatEqual(A,C,&flg);
94: /* Test MatCopy on a matrix obtained after MatConvert from AIJ
95: see https://lists.mcs.anl.gov/pipermail/petsc-dev/2019-April/024289.html */
96: MatHasCongruentLayouts(C,&flg);
97: if (flg) {
98: Mat Cs,Cse;
99: MatType Ctype,Cstype;
101: MatGetType(C,&Ctype);
102: MatTranspose(C,MAT_INITIAL_MATRIX,&Cs);
103: MatAXPY(Cs,1.0,C,DIFFERENT_NONZERO_PATTERN);
104: MatConvert(Cs,MATAIJ,MAT_INPLACE_MATRIX,&Cs);
105: MatSetOption(Cs,MAT_SYMMETRIC,PETSC_TRUE);
106: MatGetType(Cs,&Cstype);
108: PetscObjectSetName((PetscObject)Cs,"symm_initial");
109: MatViewFromOptions(Cs,NULL,"-view");
111: MatConvert(Cs,Ctype,MAT_INITIAL_MATRIX,&Cse);
112: PetscObjectSetName((PetscObject)Cse,"symm_conv_init");
113: MatViewFromOptions(Cse,NULL,"-view");
114: MatMultEqual(Cs,Cse,5,&flg);
117: MatConvert(Cs,Ctype,MAT_REUSE_MATRIX,&Cse);
118: PetscObjectSetName((PetscObject)Cse,"symm_conv_reuse");
119: MatViewFromOptions(Cse,NULL,"-view");
120: MatMultEqual(Cs,Cse,5,&flg);
123: MatCopy(Cs,Cse,SAME_NONZERO_PATTERN);
124: PetscObjectSetName((PetscObject)Cse,"symm_conv_copy_samennz");
125: MatViewFromOptions(Cse,NULL,"-view");
126: MatMultEqual(Cs,Cse,5,&flg);
129: MatCopy(Cs,Cse,SUBSET_NONZERO_PATTERN);
130: PetscObjectSetName((PetscObject)Cse,"symm_conv_copy_subnnz");
131: MatViewFromOptions(Cse,NULL,"-view");
132: MatMultEqual(Cs,Cse,5,&flg);
135: MatCopy(Cs,Cse,DIFFERENT_NONZERO_PATTERN);
136: PetscObjectSetName((PetscObject)Cse,"symm_conv_copy_diffnnz");
137: MatViewFromOptions(Cse,NULL,"-view");
138: MatMultEqual(Cs,Cse,5,&flg);
141: MatDestroy(&Cse);
142: MatDestroy(&Cs);
143: }
145: /* test MatStore/RetrieveValues() */
146: if (isAIJ) {
147: MatSetOption(A,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE);
148: MatStoreValues(A);
149: MatZeroEntries(A);
150: MatRetrieveValues(A);
151: }
153: MatDestroy(&C);
154: MatDestroy(&A);
155: PetscFinalize();
156: return 0;
157: }
159: /*TEST
161: testset:
162: nsize: {{1 2}separate output}
163: args: -view ::ascii_info -mat_type {{aij baij sbaij mpiaij mpibaij mpisbaij}separate output} -mat_block_size {{1 2}separate output}
165: TEST*/