Actual source code: ex51.c

  2: static char help[] = "Tests MatIncreaseOverlap(), MatGetSubMatrices() for MatBAIJ format.\n";

 4:  #include petscmat.h

  8: int main(int argc,char **args)
  9: {
 10:   Mat            A,B,*submatA,*submatB;
 11:   PetscInt       bs=1,m=43,ov=1,i,j,k,*rows,*cols,M,nd=5,*idx,mm,nn,lsize;
 13:   PetscScalar    *vals,rval;
 14:   IS             *is1,*is2;
 15:   PetscRandom    rdm;
 16:   Vec            xx,s1,s2;
 17:   PetscReal      s1norm,s2norm,rnorm,tol = 1.e-10;
 18:   PetscTruth     flg;

 20:   PetscInitialize(&argc,&args,(char *)0,help);
 21: 

 23:   PetscOptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,PETSC_NULL);
 24:   PetscOptionsGetInt(PETSC_NULL,"-mat_size",&m,PETSC_NULL);
 25:   PetscOptionsGetInt(PETSC_NULL,"-ov",&ov,PETSC_NULL);
 26:   PetscOptionsGetInt(PETSC_NULL,"-nd",&nd,PETSC_NULL);
 27:   M    = m*bs;

 29:   MatCreateSeqBAIJ(PETSC_COMM_SELF,bs,M,M,1,PETSC_NULL,&A);
 30:   MatCreateSeqAIJ(PETSC_COMM_SELF,M,M,15,PETSC_NULL,&B);
 31:   PetscRandomCreate(PETSC_COMM_SELF,&rdm);
 32:   PetscRandomSetFromOptions(rdm);

 34:   PetscMalloc(bs*sizeof(PetscInt),&rows);
 35:   PetscMalloc(bs*sizeof(PetscInt),&cols);
 36:   PetscMalloc(bs*bs*sizeof(PetscScalar),&vals);
 37:   PetscMalloc(M*sizeof(PetscScalar),&idx);
 38: 
 39:   /* Now set blocks of values */
 40:   for (i=0; i<20*bs; i++) {
 41:       PetscRandomGetValue(rdm,&rval);
 42:       cols[0] = bs*(int)(PetscRealPart(rval)*m);
 43:       PetscRandomGetValue(rdm,&rval);
 44:       rows[0] = bs*(int)(PetscRealPart(rval)*m);
 45:       for (j=1; j<bs; j++) {
 46:         rows[j] = rows[j-1]+1;
 47:         cols[j] = cols[j-1]+1;
 48:       }

 50:       for (j=0; j<bs*bs; j++) {
 51:         PetscRandomGetValue(rdm,&rval);
 52:         vals[j] = rval;
 53:       }
 54:       MatSetValues(A,bs,rows,bs,cols,vals,ADD_VALUES);
 55:       MatSetValues(B,bs,rows,bs,cols,vals,ADD_VALUES);
 56:   }

 58:   MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
 59:   MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);
 60:   MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);
 61:   MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);

 63:     /* Test MatIncreaseOverlap() */
 64:   PetscMalloc(nd*sizeof(IS **),&is1);
 65:   PetscMalloc(nd*sizeof(IS **),&is2);

 67: 
 68:   for (i=0; i<nd; i++) {
 69:     PetscRandomGetValue(rdm,&rval);
 70:     lsize = (int)(PetscRealPart(rval)*m);
 71:     for (j=0; j<lsize; j++) {
 72:       PetscRandomGetValue(rdm,&rval);
 73:       idx[j*bs] = bs*(int)(PetscRealPart(rval)*m);
 74:       for (k=1; k<bs; k++) idx[j*bs+k] = idx[j*bs]+k;
 75:     }
 76:     ISCreateGeneral(PETSC_COMM_SELF,lsize*bs,idx,is1+i);
 77:     ISCreateGeneral(PETSC_COMM_SELF,lsize*bs,idx,is2+i);
 78:   }
 79:   MatIncreaseOverlap(A,nd,is1,ov);
 80:   MatIncreaseOverlap(B,nd,is2,ov);

 82:   for (i=0; i<nd; ++i) {
 83:     ISEqual(is1[i],is2[i],&flg);
 84:     PetscPrintf(PETSC_COMM_SELF,"i=%D, flg =%d\n",i,(int)flg);
 85:   }

 87:   for (i=0; i<nd; ++i) {
 88:     ISSort(is1[i]);
 89:     ISSort(is2[i]);
 90:   }
 91: 
 92:   MatGetSubMatrices(A,nd,is1,is1,MAT_INITIAL_MATRIX,&submatA);
 93:   MatGetSubMatrices(B,nd,is2,is2,MAT_INITIAL_MATRIX,&submatB);

 95:   /* Test MatMult() */
 96:   for (i=0; i<nd; i++) {
 97:     MatGetSize(submatA[i],&mm,&nn);
 98:     VecCreateSeq(PETSC_COMM_SELF,mm,&xx);
 99:     VecDuplicate(xx,&s1);
100:     VecDuplicate(xx,&s2);
101:     for (j=0; j<3; j++) {
102:       VecSetRandom(xx,rdm);
103:       MatMult(submatA[i],xx,s1);
104:       MatMult(submatB[i],xx,s2);
105:       VecNorm(s1,NORM_2,&s1norm);
106:       VecNorm(s2,NORM_2,&s2norm);
107:       rnorm = s2norm-s1norm;
108:       if (rnorm<-tol || rnorm>tol) {
109:         PetscPrintf(PETSC_COMM_SELF,"Error:MatMult - Norm1=%16.14e Norm2=%16.14e\n",s1norm,s2norm);
110:       }
111:     }
112:     VecDestroy(xx);
113:     VecDestroy(s1);
114:     VecDestroy(s2);
115:   }
116:   /* Now test MatGetSubmatrices with MAT_REUSE_MATRIX option */
117:   MatGetSubMatrices(A,nd,is1,is1,MAT_REUSE_MATRIX,&submatA);
118:   MatGetSubMatrices(B,nd,is2,is2,MAT_REUSE_MATRIX,&submatB);
119: 
120:   /* Test MatMult() */
121:   for (i=0; i<nd; i++) {
122:     MatGetSize(submatA[i],&mm,&nn);
123:     VecCreateSeq(PETSC_COMM_SELF,mm,&xx);
124:     VecDuplicate(xx,&s1);
125:     VecDuplicate(xx,&s2);
126:     for (j=0; j<3; j++) {
127:       VecSetRandom(xx,rdm);
128:       MatMult(submatA[i],xx,s1);
129:       MatMult(submatB[i],xx,s2);
130:       VecNorm(s1,NORM_2,&s1norm);
131:       VecNorm(s2,NORM_2,&s2norm);
132:       rnorm = s2norm-s1norm;
133:       if (rnorm<-tol || rnorm>tol) {
134:         PetscPrintf(PETSC_COMM_SELF,"Error:MatMult - Norm1=%16.14e Norm2=%16.14e\n",s1norm,s2norm);
135:       }
136:     }
137:     VecDestroy(xx);
138:     VecDestroy(s1);
139:     VecDestroy(s2);
140:   }
141: 
142:   /* Free allocated memory */
143:   for (i=0; i<nd; ++i) {
144:     ISDestroy(is1[i]);
145:     ISDestroy(is2[i]);
146:     MatDestroy(submatA[i]);
147:     MatDestroy(submatB[i]);
148:  }
149:   PetscFree(is1);
150:   PetscFree(is2);
151:   PetscFree(idx);
152:   PetscFree(rows);
153:   PetscFree(cols);
154:   PetscFree(vals);
155:   MatDestroy(A);
156:   MatDestroy(B);
157:   PetscFree(submatA);
158:   PetscFree(submatB);
159:   PetscRandomDestroy(rdm);
160:   PetscFinalize();
161:   return 0;
162: }