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: }