Actual source code: ex37.c
2: static char help[] = "Tests MatCopy() and MatStore/RetrieveValues().\n\n";
4: #include <petscmat.h>
8: int main(int argc,char **args)
9: {
10: Mat C,A;
11: PetscInt i, n = 10,midx[3],bs=1;
13: PetscScalar v[3];
14: PetscBool flg,isAIJ;
15: const MatType type;
16: PetscMPIInt size;
18: PetscInitialize(&argc,&args,(char *)0,help);
19: MPI_Comm_size(PETSC_COMM_WORLD,&size);
20: PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);
22: MatCreate(PETSC_COMM_WORLD,&C);
23: MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,n,n);
24: MatSetType(C,MATAIJ);
25: MatSetFromOptions(C);
27: MatGetType(C,&type);
28: if (size == 1){
29: PetscTypeCompare((PetscObject)C,MATSEQAIJ,&isAIJ);
30: } else {
31: PetscTypeCompare((PetscObject)C,MATMPIAIJ,&isAIJ);
32: }
33: if (isAIJ){
34: MatSeqAIJSetPreallocation(C,3,PETSC_NULL);
35: MatMPIAIJSetPreallocation(C,3,PETSC_NULL,3,PETSC_NULL);
36: } else {
37: MatGetBlockSize(C,&bs);
38: MatSeqBAIJSetPreallocation(C,bs,3,PETSC_NULL);
39: MatMPIBAIJSetPreallocation(C,bs,3,PETSC_NULL,3,PETSC_NULL);
40: }
41: v[0] = -1.; v[1] = 2.; v[2] = -1.;
42: for (i=1; i<n-1; i++){
43: midx[2] = i-1; midx[1] = i; midx[0] = i+1;
44: MatSetValues(C,1,&i,3,midx,v,INSERT_VALUES);
45: }
46: i = 0; midx[0] = 0; midx[1] = 1;
47: v[0] = 2.0; v[1] = -1.;
48: MatSetValues(C,1,&i,2,midx,v,INSERT_VALUES);
49: i = n-1; midx[0] = n-2; midx[1] = n-1;
50: v[0] = -1.0; v[1] = 2.;
51: MatSetValues(C,1,&i,2,midx,v,INSERT_VALUES);
53: MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);
54: MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);
56: MatCreate(PETSC_COMM_WORLD,&A);
57: MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n);
58: MatSetFromOptions(A);
59: MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
60: MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);
62: /* test matrices with different nonzero patterns - Note: A is created with different nonzero pattern of C! */
63: MatCopy(C,A,DIFFERENT_NONZERO_PATTERN);
64: MatEqual(A,C,&flg);
65: if (!flg) SETERRQ(PETSC_COMM_SELF,1,"MatCopy(C,A,DIFFERENT_NONZERO_PATTERN): Matrices are NOT equal");
66:
67: PetscViewerSetFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO);
68: PetscPrintf(PETSC_COMM_WORLD,"A is obtained with MatCopy(,,DIFFERENT_NONZERO_PATTERN):\n");
69: MatView(A,PETSC_VIEWER_STDOUT_WORLD);
70: MatDestroy(&A);
72: /* test matrices with same nonzero pattern */
73: MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&A);
74: MatCopy(C,A,SAME_NONZERO_PATTERN);
75: MatEqual(A,C,&flg);
76: if (!flg) SETERRQ(PETSC_COMM_SELF,1,"MatCopy(C,A,SAME_NONZERO_PATTERN): Matrices are NOT equal");
77:
78: PetscViewerSetFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO);
79: PetscPrintf(PETSC_COMM_WORLD,"\nA is obtained with MatCopy(,,SAME_NONZERO_PATTERN):\n");
80: MatView(A,PETSC_VIEWER_STDOUT_WORLD);
82: PetscViewerSetFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_COMMON);
83: PetscPrintf(PETSC_COMM_WORLD,"A:\n");
84: MatView(A,PETSC_VIEWER_STDOUT_WORLD);
85:
86: /* test MatStore/RetrieveValues() */
87: if (isAIJ){
88: MatSetOption(A,MAT_NEW_NONZERO_LOCATIONS,PETSC_FALSE);
89: MatStoreValues(A);
90: MatZeroEntries(A);
91: MatRetrieveValues(A);
92: }
94: MatDestroy(&C);
95: MatDestroy(&A);
96: PetscFinalize();
97: return 0;
98: }
100: