Actual source code: ex53.c

  1: /*$Id: ex53.c,v 1.22 2001/04/10 19:35:44 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:   double      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:   Scalar      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:   VecCreateMPI(PETSC_COMM_WORLD,m,PETSC_DECIDE,&xx);
 40:   VecDuplicate(xx,&s1);
 41:   VecDuplicate(xx,&s2);
 42:   VecDuplicate(xx,&yy);

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

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


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


117:     for (j=0; j<4; j++) {
118:       if(vals1[j] != vals2[j])
119:         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);
120:     }
121:   }

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

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

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