Actual source code: ex53.c
2: static char help[] = "Tests the vatious routines in MatMPIBAIJ format.\n";
5: #include petscmat.h
6: #define IMAX 15
9: int main(int argc,char **args)
10: {
11: Mat A,B,C,At,Bt;
12: PetscViewer fd;
13: char file[PETSC_MAX_PATH_LEN];
14: PetscRandom rand;
15: Vec xx,yy,s1,s2;
16: PetscReal s1norm,s2norm,rnorm,tol = 1.e-10;
17: PetscInt rstart,rend,rows[2],cols[2],m,n,i,j,M,N,ct,row,ncols1,ncols2,bs;
18: PetscMPIInt rank;
19: PetscErrorCode ierr;
20: const PetscInt *cols1,*cols2;
21: PetscScalar vals1[4],vals2[4],v;
22: const PetscScalar *v1,*v2;
23: PetscTruth flg;
25: PetscInitialize(&argc,&args,(char *)0,help);
26: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
28: #if defined(PETSC_USE_COMPLEX)
29: SETERRQ(1,"This example does not work with complex numbers");
30: #else
32: /* Check out if MatLoad() works */
33: PetscOptionsGetString(PETSC_NULL,"-f",file,PETSC_MAX_PATH_LEN-1,&flg);
34: if (!flg) SETERRQ(1,"Input file not specified");
35: PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,PETSC_FILE_RDONLY,&fd);
36: MatLoad(fd,MATMPIBAIJ,&A);
37: PetscViewerDestroy(fd);
39: MatConvert(A,MATMPIAIJ,&B);
40:
41: PetscRandomCreate(PETSC_COMM_WORLD,RANDOM_DEFAULT,&rand);
42: MatGetLocalSize(A,&m,&n);
43: VecCreate(PETSC_COMM_WORLD,&xx);
44: VecSetSizes(xx,m,PETSC_DECIDE);
45: VecSetFromOptions(xx);
46: VecDuplicate(xx,&s1);
47: VecDuplicate(xx,&s2);
48: VecDuplicate(xx,&yy);
50: MatGetBlockSize(A,&bs);
51: /* Test MatMult() */
52: for (i=0; i<IMAX; i++) {
53: VecSetRandom(rand,xx);
54: MatMult(A,xx,s1);
55: MatMult(B,xx,s2);
56: VecNorm(s1,NORM_2,&s1norm);
57: VecNorm(s2,NORM_2,&s2norm);
58: rnorm = s2norm-s1norm;
59: if (rnorm<-tol || rnorm>tol) {
60: PetscPrintf(PETSC_COMM_SELF,"Error:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %D\n",
61: s1norm,s2norm,bs);
62: }
63: }
64: /* test MatMultAdd() */
65: for (i=0; i<IMAX; i++) {
66: VecSetRandom(rand,xx);
67: VecSetRandom(rand,yy);
68: MatMultAdd(A,xx,yy,s1);
69: MatMultAdd(B,xx,yy,s2);
70: VecNorm(s1,NORM_2,&s1norm);
71: VecNorm(s2,NORM_2,&s2norm);
72: rnorm = s2norm-s1norm;
73: if (rnorm<-tol || rnorm>tol) {
74: PetscPrintf(PETSC_COMM_SELF,"Error:MatMultAdd - Norm1=%16.14e Norm2=%16.14e bs = %D\n",s1norm,s2norm,bs);
75: }
76: }
77: /* Test MatMultTranspose() */
78: for (i=0; i<IMAX; i++) {
79: VecSetRandom(rand,xx);
80: MatMultTranspose(A,xx,s1);
81: MatMultTranspose(B,xx,s2);
82: VecNorm(s1,NORM_2,&s1norm);
83: VecNorm(s2,NORM_2,&s2norm);
84: rnorm = s2norm-s1norm;
85: if (rnorm<-tol || rnorm>tol) {
86: PetscPrintf(PETSC_COMM_SELF,"Error:MatMultTranspose - Norm1=%16.14e Norm2=%16.14e bs = %D\n",s1norm,s2norm,bs);
87: }
88: }
89: /* Test MatMultTransposeAdd() */
90: for (i=0; i<IMAX; i++) {
91: VecSetRandom(rand,xx);
92: VecSetRandom(rand,yy);
93: MatMultTransposeAdd(A,xx,yy,s1);
94: MatMultTransposeAdd(B,xx,yy,s2);
95: VecNorm(s1,NORM_2,&s1norm);
96: VecNorm(s2,NORM_2,&s2norm);
97: rnorm = s2norm-s1norm;
98: if (rnorm<-tol || rnorm>tol) {
99: PetscPrintf(PETSC_COMM_SELF,"Error:MatMultTransposeAdd - Norm1=%16.14e Norm2=%16.14e bs = %D\n",s1norm,s2norm,bs);
100: }
101: }
103: /* Check MatGetValues() */
104: MatGetOwnershipRange(A,&rstart,&rend);
105: MatGetSize(A,&M,&N);
108: for (i=0; i<IMAX; i++) {
109: /* Create random row numbers ad col numbers */
110: PetscRandomGetValue(rand,&v);
111: cols[0] = (int)(PetscRealPart(v)*N);
112: PetscRandomGetValue(rand,&v);
113: cols[1] = (int)(PetscRealPart(v)*N);
114: PetscRandomGetValue(rand,&v);
115: rows[0] = rstart + (int)(PetscRealPart(v)*m);
116: PetscRandomGetValue(rand,&v);
117: rows[1] = rstart + (int)(PetscRealPart(v)*m);
118:
119: MatGetValues(A,2,rows,2,cols,vals1);
120: MatGetValues(B,2,rows,2,cols,vals2);
123: for (j=0; j<4; j++) {
124: if(vals1[j] != vals2[j])
125: PetscPrintf(PETSC_COMM_SELF,"[%d]: Error:MatGetValues rstart = %2d row = %2d col = %2d val1 = %e val2 = %e bs = %D\n",rank,rstart,rows[j/2],cols[j%2],PetscRealPart(vals1[j]),PetscRealPart(vals2[j]),bs);
126: }
127: }
129: /* Test MatGetRow()/ MatRestoreRow() */
130: for (ct=0; ct<100; ct++) {
131: PetscRandomGetValue(rand,&v);
132: row = rstart + (int)(PetscRealPart(v)*m);
133: MatGetRow(A,row,&ncols1,&cols1,&v1);
134: MatGetRow(B,row,&ncols2,&cols2,&v2);
135:
136: for (i=0,j=0; i<ncols1 && j<ncols2; j++) {
137: while (cols2[j] != cols1[i]) i++;
138: if (v1[i] != v2[j]) SETERRQ(1,"MatGetRow() failed - vals incorrect.");
139: }
140: if (j<ncols2) SETERRQ(1,"MatGetRow() failed - cols incorrect");
141:
142: MatRestoreRow(A,row,&ncols1,&cols1,&v1);
143: MatRestoreRow(B,row,&ncols2,&cols2,&v2);
144: }
145:
146: /* Test MatConvert() */
147: MatConvert(A,MATSAME,&C);
148:
149: /* See if MatMult Says both are same */
150: for (i=0; i<IMAX; i++) {
151: VecSetRandom(rand,xx);
152: MatMult(A,xx,s1);
153: MatMult(C,xx,s2);
154: VecNorm(s1,NORM_2,&s1norm);
155: VecNorm(s2,NORM_2,&s2norm);
156: rnorm = s2norm-s1norm;
157: if (rnorm<-tol || rnorm>tol) {
158: PetscPrintf(PETSC_COMM_SELF,"Error in MatConvert:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %D\n",
159: s1norm,s2norm,bs);
160: }
161: }
162: MatDestroy(C);
164: /* Test MatTranspose() */
165: MatTranspose(A,&At);
166: MatTranspose(B,&Bt);
167: for (i=0; i<IMAX; i++) {
168: VecSetRandom(rand,xx);
169: MatMult(At,xx,s1);
170: MatMult(Bt,xx,s2);
171: VecNorm(s1,NORM_2,&s1norm);
172: VecNorm(s2,NORM_2,&s2norm);
173: rnorm = s2norm-s1norm;
174: if (rnorm<-tol || rnorm>tol) {
175: PetscPrintf(PETSC_COMM_SELF,"Error in MatConvert:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %D\n",
176: s1norm,s2norm,bs);
177: }
178: }
179: MatDestroy(At);
180: MatDestroy(Bt);
182: MatDestroy(A);
183: MatDestroy(B);
184: VecDestroy(xx);
185: VecDestroy(yy);
186: VecDestroy(s1);
187: VecDestroy(s2);
188: PetscRandomDestroy(rand);
189: PetscFinalize();
190: #endif
191: return 0;
192: }