Actual source code: ex53.c

  1: /*$Id: ex53.c,v 1.25 2001/09/11 16:32:50 bsmith Exp $*/

  3: static char help[] = "Tests the vatious routines in MatMPIBAIJ format.n";


 6:  #include petscmat.h
  7: #define IMAX 15
  8: int main(int argc,char **args)
  9: {
 10:   Mat         A,B,C,At,Bt;
 11:   PetscViewer fd;
 12:   char        file[128];
 13:   PetscRandom rand;
 14:   Vec         xx,yy,s1,s2;
 15:   PetscReal   s1norm,s2norm,rnorm,tol = 1.e-10;
 16:   int         rstart,rend,rows[2],cols[2],m,n,i,j,ierr,M,N,rank,ct,row,ncols1;
 17:   int         *cols1,ncols2,*cols2,bs;
 18:   PetscScalar vals1[4],vals2[4],v,*v1,*v2;
 19:   PetscTruth  flg;

 21:   PetscInitialize(&argc,&args,(char *)0,help);
 22:   MPI_Comm_rank(PETSC_COMM_WORLD,&rank);

 24: #if defined(PETSC_USE_COMPLEX)
 25:   SETERRQ(1,"This example does not work with complex numbers");
 26: #else

 28:  /* Check out if MatLoad() works */
 29:   PetscOptionsGetString(PETSC_NULL,"-f",file,127,&flg);
 30:   if (!flg) SETERRQ(1,"Input file not specified");
 31:   PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,PETSC_BINARY_RDONLY,&fd);
 32:   MatLoad(fd,MATMPIBAIJ,&A);
 33:   PetscViewerDestroy(fd);

 35:   MatConvert(A,MATMPIAIJ,&B);
 36: 
 37:   PetscRandomCreate(PETSC_COMM_WORLD,RANDOM_DEFAULT,&rand);
 38:   MatGetLocalSize(A,&m,&n);
 39:   VecCreate(PETSC_COMM_WORLD,&xx);
 40:   VecSetSizes(xx,m,PETSC_DECIDE);
 41:   VecSetFromOptions(xx);
 42:   VecDuplicate(xx,&s1);
 43:   VecDuplicate(xx,&s2);
 44:   VecDuplicate(xx,&yy);

 46:   MatGetBlockSize(A,&bs);
 47:   /* Test MatMult() */
 48:   for (i=0; i<IMAX; i++) {
 49:     VecSetRandom(rand,xx);
 50:     MatMult(A,xx,s1);
 51:     MatMult(B,xx,s2);
 52:     VecNorm(s1,NORM_2,&s1norm);
 53:     VecNorm(s2,NORM_2,&s2norm);
 54:     rnorm = s2norm-s1norm;
 55:     if (rnorm<-tol || rnorm>tol) {
 56:       PetscPrintf(PETSC_COMM_SELF,"Error:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %dn",
 57: s1norm,s2norm,bs);
 58:     }
 59:   }
 60:   /* test MatMultAdd() */
 61:   for (i=0; i<IMAX; i++) {
 62:     VecSetRandom(rand,xx);
 63:     VecSetRandom(rand,yy);
 64:     MatMultAdd(A,xx,yy,s1);
 65:     MatMultAdd(B,xx,yy,s2);
 66:     VecNorm(s1,NORM_2,&s1norm);
 67:     VecNorm(s2,NORM_2,&s2norm);
 68:     rnorm = s2norm-s1norm;
 69:     if (rnorm<-tol || rnorm>tol) {
 70:       PetscPrintf(PETSC_COMM_SELF,"Error:MatMultAdd - Norm1=%16.14e Norm2=%16.14e bs = %dn",s1norm,s2norm,bs);
 71:     }
 72:   }
 73:     /* Test MatMultTranspose() */
 74:   for (i=0; i<IMAX; i++) {
 75:     VecSetRandom(rand,xx);
 76:     MatMultTranspose(A,xx,s1);
 77:     MatMultTranspose(B,xx,s2);
 78:     VecNorm(s1,NORM_2,&s1norm);
 79:     VecNorm(s2,NORM_2,&s2norm);
 80:     rnorm = s2norm-s1norm;
 81:     if (rnorm<-tol || rnorm>tol) {
 82:       PetscPrintf(PETSC_COMM_SELF,"Error:MatMultTranspose - Norm1=%16.14e Norm2=%16.14e bs = %dn",s1norm,s2norm,bs);
 83:     }
 84:   }
 85:   /* Test MatMultTransposeAdd() */
 86:   for (i=0; i<IMAX; i++) {
 87:     VecSetRandom(rand,xx);
 88:     VecSetRandom(rand,yy);
 89:     MatMultTransposeAdd(A,xx,yy,s1);
 90:     MatMultTransposeAdd(B,xx,yy,s2);
 91:     VecNorm(s1,NORM_2,&s1norm);
 92:     VecNorm(s2,NORM_2,&s2norm);
 93:     rnorm = s2norm-s1norm;
 94:     if (rnorm<-tol || rnorm>tol) {
 95:       PetscPrintf(PETSC_COMM_SELF,"Error:MatMultTransposeAdd - Norm1=%16.14e Norm2=%16.14e bs = %dn",s1norm,s2norm,bs);
 96:     }
 97:   }

 99:   /* Check MatGetValues() */
100:   MatGetOwnershipRange(A,&rstart,&rend);
101:   MatGetSize(A,&M,&N);


104:   for (i=0; i<IMAX; i++) {
105:     /* Create random row numbers ad col numbers */
106:     PetscRandomGetValue(rand,&v);
107:     cols[0] = (int)(PetscRealPart(v)*N);
108:     PetscRandomGetValue(rand,&v);
109:     cols[1] = (int)(PetscRealPart(v)*N);
110:     PetscRandomGetValue(rand,&v);
111:     rows[0] = rstart + (int)(PetscRealPart(v)*m);
112:     PetscRandomGetValue(rand,&v);
113:     rows[1] = rstart + (int)(PetscRealPart(v)*m);
114: 
115:     MatGetValues(A,2,rows,2,cols,vals1);
116:     MatGetValues(B,2,rows,2,cols,vals2);


119:     for (j=0; j<4; j++) {
120:       if(vals1[j] != vals2[j])
121:         PetscPrintf(PETSC_COMM_SELF,"[%d]: Error:MatGetValues rstart = %2d  row = %2d col = %2d val1 = %e val2 = %e bs = %dn",rank,rstart,rows[j/2],cols[j%2],PetscRealPart(vals1[j]),PetscRealPart(vals2[j]),bs);
122:     }
123:   }

125:   /* Test MatGetRow()/ MatRestoreRow() */
126:   for (ct=0; ct<100; ct++) {
127:     PetscRandomGetValue(rand,&v);
128:     row  = rstart + (int)(PetscRealPart(v)*m);
129:     MatGetRow(A,row,&ncols1,&cols1,&v1);
130:     MatGetRow(B,row,&ncols2,&cols2,&v2);
131: 
132:     for (i=0,j=0; i<ncols1 && j<ncols2; j++) {
133:       while (cols2[j] != cols1[i]) i++;
134:       if (v1[i] != v2[j]) SETERRQ(1,"MatGetRow() failed - vals incorrect.");
135:     }
136:     if (j<ncols2) SETERRQ(1,"MatGetRow() failed - cols incorrect");
137: 
138:     MatRestoreRow(A,row,&ncols1,&cols1,&v1);
139:     MatRestoreRow(B,row,&ncols2,&cols2,&v2);
140:   }
141: 
142:   /* Test MatConvert() */
143:   MatConvert(A,MATSAME,&C);
144: 
145:   /* See if MatMult Says both are same */
146:   for (i=0; i<IMAX; i++) {
147:     VecSetRandom(rand,xx);
148:     MatMult(A,xx,s1);
149:     MatMult(C,xx,s2);
150:     VecNorm(s1,NORM_2,&s1norm);
151:     VecNorm(s2,NORM_2,&s2norm);
152:     rnorm = s2norm-s1norm;
153:     if (rnorm<-tol || rnorm>tol) {
154:       PetscPrintf(PETSC_COMM_SELF,"Error in MatConvert:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %dn",
155: s1norm,s2norm,bs);
156:     }
157:   }
158:   MatDestroy(C);

160:   /* Test MatTranspose() */
161:   MatTranspose(A,&At);
162:   MatTranspose(B,&Bt);
163:   for (i=0; i<IMAX; i++) {
164:     VecSetRandom(rand,xx);
165:     MatMult(At,xx,s1);
166:     MatMult(Bt,xx,s2);
167:     VecNorm(s1,NORM_2,&s1norm);
168:     VecNorm(s2,NORM_2,&s2norm);
169:     rnorm = s2norm-s1norm;
170:     if (rnorm<-tol || rnorm>tol) {
171:       PetscPrintf(PETSC_COMM_SELF,"Error in MatConvert:MatMult - Norm1=%16.14e Norm2=%16.14e bs = %dn",
172:                   s1norm,s2norm,bs);
173:     }
174:   }
175:   MatDestroy(At);
176:   MatDestroy(Bt);

178:   MatDestroy(A);
179:   MatDestroy(B);
180:   VecDestroy(xx);
181:   VecDestroy(yy);
182:   VecDestroy(s1);
183:   VecDestroy(s2);
184:   PetscRandomDestroy(rand);
185:   PetscFinalize();
186: #endif
187:   return 0;
188: }