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,size;
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);
27: MPI_Comm_size(PETSC_COMM_WORLD,&size);
29: #if defined(PETSC_USE_COMPLEX)
30: SETERRQ(1,"This example does not work with complex numbers");
31: #else
33: /* Check out if MatLoad() works */
34: PetscOptionsGetString(PETSC_NULL,"-f",file,PETSC_MAX_PATH_LEN-1,&flg);
35: if (!flg) SETERRQ(1,"Input file not specified");
36: PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&fd);
37: MatLoad(fd,MATBAIJ,&A);
38: /*
39: if (size == 1){
40: MatConvert(A,MATSEQAIJ,MAT_INITIAL_MATRIX,&B);
41: } else {
42: MatConvert(A,MATMPIAIJ,MAT_INITIAL_MATRIX,&B);
43: }
44: */
45: MatConvert(A,MATAIJ,MAT_INITIAL_MATRIX,&B);
46: PetscViewerDestroy(fd);
47:
48: PetscRandomCreate(PETSC_COMM_WORLD,RANDOM_DEFAULT,&rand);
49: MatGetLocalSize(A,&m,&n);
50: VecCreate(PETSC_COMM_WORLD,&xx);
51: VecSetSizes(xx,m,PETSC_DECIDE);
52: VecSetFromOptions(xx);
53: VecDuplicate(xx,&s1);
54: VecDuplicate(xx,&s2);
55: VecDuplicate(xx,&yy);
56: MatGetBlockSize(A,&bs);
58: /* Test MatNorm() */
59: MatNorm(A,NORM_FROBENIUS,&s1norm);
60: MatNorm(B,NORM_FROBENIUS,&s2norm);
61: rnorm = PetscAbsScalar(s2norm-s1norm)/s2norm;
62: if ( rnorm>tol ) {
63: PetscPrintf(PETSC_COMM_SELF,"[%d] Error: MatNorm_FROBENIUS()- NormA=%16.14e NormB=%16.14e bs = %D\n",rank,s1norm,s2norm,bs);
64: }
65: MatNorm(A,NORM_INFINITY,&s1norm);
66: MatNorm(B,NORM_INFINITY,&s2norm);
67: rnorm = PetscAbsScalar(s2norm-s1norm)/s2norm;
68: if ( rnorm>tol ) {
69: PetscPrintf(PETSC_COMM_SELF,"[%d] Error: MatNorm_INFINITY()- NormA=%16.14e NormB=%16.14e bs = %D\n",rank,s1norm,s2norm,bs);
70: }
71: MatNorm(A,NORM_1,&s1norm);
72: MatNorm(B,NORM_1,&s2norm);
73: rnorm = PetscAbsScalar(s2norm-s1norm)/s2norm;
74: if ( rnorm>tol ) {
75: PetscPrintf(PETSC_COMM_SELF,"[%d] Error: MatNorm_NORM_1()- NormA=%16.14e NormB=%16.14e bs = %D\n",rank,s1norm,s2norm,bs);
76: }
78: /* Test MatMult() */
79: for (i=0; i<IMAX; i++) {
80: VecSetRandom(xx,rand);
81: MatMult(A,xx,s1);
82: MatMult(B,xx,s2);
83: VecAXPY(s2,-1.0,s1);
84: VecNorm(s2,NORM_2,&rnorm);
85: if (rnorm>tol) {
86: PetscPrintf(PETSC_COMM_SELF,"[%d] Error: MatMult - Norm2=%16.14e bs = %D\n",rank,rnorm,bs);
87: }
88: }
90: /* test MatMultAdd() */
91: for (i=0; i<IMAX; i++) {
92: VecSetRandom(xx,rand);
93: VecSetRandom(yy,rand);
94: MatMultAdd(A,xx,yy,s1);
95: MatMultAdd(B,xx,yy,s2);
96: VecAXPY(s2,-1.0,s1);
97: VecNorm(s2,NORM_2,&rnorm);
98: if (rnorm>tol) {
99: PetscPrintf(PETSC_COMM_SELF,"[%d] Error: MatMultAdd - Norm2=%16.14e bs = %D\n",rank,rnorm,bs);
100: }
101: }
103: /* Test MatMultTranspose() */
104: for (i=0; i<IMAX; i++) {
105: VecSetRandom(xx,rand);
106: MatMultTranspose(A,xx,s1);
107: MatMultTranspose(B,xx,s2);
108: VecNorm(s1,NORM_2,&s1norm);
109: VecNorm(s2,NORM_2,&s2norm);
110: rnorm = s2norm-s1norm;
111: if (rnorm<-tol || rnorm>tol) {
112: PetscPrintf(PETSC_COMM_SELF,"[%d] Error: MatMultTranspose - Norm1=%16.14e Norm2=%16.14e bs = %D\n",rank,s1norm,s2norm,bs);
113: }
114: }
115: /* Test MatMultTransposeAdd() */
116: for (i=0; i<IMAX; i++) {
117: VecSetRandom(xx,rand);
118: VecSetRandom(yy,rand);
119: MatMultTransposeAdd(A,xx,yy,s1);
120: MatMultTransposeAdd(B,xx,yy,s2);
121: VecNorm(s1,NORM_2,&s1norm);
122: VecNorm(s2,NORM_2,&s2norm);
123: rnorm = s2norm-s1norm;
124: if (rnorm<-tol || rnorm>tol) {
125: PetscPrintf(PETSC_COMM_SELF,"[%d] Error: MatMultTransposeAdd - Norm1=%16.14e Norm2=%16.14e bs = %D\n",rank,s1norm,s2norm,bs);
126: }
127: }
129: /* Check MatGetValues() */
130: MatGetOwnershipRange(A,&rstart,&rend);
131: MatGetSize(A,&M,&N);
134: for (i=0; i<IMAX; i++) {
135: /* Create random row numbers ad col numbers */
136: PetscRandomGetValue(rand,&v);
137: cols[0] = (int)(PetscRealPart(v)*N);
138: PetscRandomGetValue(rand,&v);
139: cols[1] = (int)(PetscRealPart(v)*N);
140: PetscRandomGetValue(rand,&v);
141: rows[0] = rstart + (int)(PetscRealPart(v)*m);
142: PetscRandomGetValue(rand,&v);
143: rows[1] = rstart + (int)(PetscRealPart(v)*m);
144:
145: MatGetValues(A,2,rows,2,cols,vals1);
146: MatGetValues(B,2,rows,2,cols,vals2);
149: for (j=0; j<4; j++) {
150: if(vals1[j] != vals2[j])
151: 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);
152: }
153: }
155: /* Test MatGetRow()/ MatRestoreRow() */
156: for (ct=0; ct<100; ct++) {
157: PetscRandomGetValue(rand,&v);
158: row = rstart + (int)(PetscRealPart(v)*m);
159: MatGetRow(A,row,&ncols1,&cols1,&v1);
160: MatGetRow(B,row,&ncols2,&cols2,&v2);
161:
162: for (i=0,j=0; i<ncols1 && j<ncols2; j++) {
163: while (cols2[j] != cols1[i]) i++;
164: if (v1[i] != v2[j]) SETERRQ(1,"MatGetRow() failed - vals incorrect.");
165: }
166: if (j<ncols2) SETERRQ(1,"MatGetRow() failed - cols incorrect");
167:
168: MatRestoreRow(A,row,&ncols1,&cols1,&v1);
169: MatRestoreRow(B,row,&ncols2,&cols2,&v2);
170: }
171:
172: /* Test MatConvert() */
173: MatConvert(A,MATSAME,MAT_INITIAL_MATRIX,&C);
174:
175: /* See if MatMult Says both are same */
176: for (i=0; i<IMAX; i++) {
177: VecSetRandom(xx,rand);
178: MatMult(A,xx,s1);
179: MatMult(C,xx,s2);
180: VecNorm(s1,NORM_2,&s1norm);
181: VecNorm(s2,NORM_2,&s2norm);
182: rnorm = s2norm-s1norm;
183: if (rnorm<-tol || rnorm>tol) {
184: PetscPrintf(PETSC_COMM_SELF,"[%d] Error in MatConvert: MatMult - Norm1=%16.14e Norm2=%16.14e bs = %D\n",rank,s1norm,s2norm,bs);
185: }
186: }
187: MatDestroy(C);
189: /* Test MatTranspose() */
190: MatTranspose(A,&At);
191: MatTranspose(B,&Bt);
192: for (i=0; i<IMAX; i++) {
193: VecSetRandom(xx,rand);
194: MatMult(At,xx,s1);
195: MatMult(Bt,xx,s2);
196: VecNorm(s1,NORM_2,&s1norm);
197: VecNorm(s2,NORM_2,&s2norm);
198: rnorm = s2norm-s1norm;
199: if (rnorm<-tol || rnorm>tol) {
200: PetscPrintf(PETSC_COMM_SELF,"[%d] Error in MatConvert:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %D\n",
201: rank,s1norm,s2norm,bs);
202: }
203: }
204: MatDestroy(At);
205: MatDestroy(Bt);
207: MatDestroy(A);
208: MatDestroy(B);
209: VecDestroy(xx);
210: VecDestroy(yy);
211: VecDestroy(s1);
212: VecDestroy(s2);
213: PetscRandomDestroy(rand);
214: PetscFinalize();
215: #endif
216: return 0;
217: }