Actual source code: ex28.c

petsc-3.7.4 2016-10-02
Report Typos and Errors
  2: static char help[] = "Tests repeated VecDotBegin()/VecDotEnd().\n\n";

  4: #include <petscvec.h>

  8: int main(int argc,char **argv)
  9: {
 11:   PetscInt       n = 25,i,row0 = 0;
 12:   PetscScalar    two = 2.0,result1,result2,results[40],value,ten = 10.0;
 13:   PetscScalar    result1a,result2a;
 14:   PetscReal      result3,result4,result[2],result3a,result4a,resulta[2];
 15:   Vec            x,y,vecs[40];
 16:   PetscRandom    rctx;

 18:   PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;

 20:   /* create vector */
 21:   VecCreate(PETSC_COMM_WORLD,&x);
 22:   VecSetSizes(x,n,PETSC_DECIDE);
 23:   VecSetFromOptions(x);
 24:   VecDuplicate(x,&y);

 26:   PetscRandomCreate(PETSC_COMM_WORLD,&rctx);
 27:   PetscRandomSetFromOptions(rctx);
 28:   VecSetRandom(x,rctx);
 29:   PetscRandomDestroy(&rctx);
 30:   VecSet(y,two);

 32:   /*
 33:         Test mixing dot products and norms that require sums
 34:   */
 35:   result1 = result2 = 0.0;
 36:   result3 = result4 = 0.0;
 37:   VecDotBegin(x,y,&result1);
 38:   VecDotBegin(y,x,&result2);
 39:   VecNormBegin(y,NORM_2,&result3);
 40:   VecNormBegin(x,NORM_1,&result4);
 41:   PetscCommSplitReductionBegin(PetscObjectComm((PetscObject)x));
 42:   VecDotEnd(x,y,&result1);
 43:   VecDotEnd(y,x,&result2);
 44:   VecNormEnd(y,NORM_2,&result3);
 45:   VecNormEnd(x,NORM_1,&result4);

 47:   VecDot(x,y,&result1a);
 48:   VecDot(y,x,&result2a);
 49:   VecNorm(y,NORM_2,&result3a);
 50:   VecNorm(x,NORM_1,&result4a);

 52:   if (result1 != result1a || result2 != result2a) {
 53:     PetscPrintf(PETSC_COMM_WORLD,"Error dot: result1 %g result2 %g\n",(double)PetscRealPart(result1),(double)PetscRealPart(result2));
 54:   }
 55:   if (result3 != result3a || result4 != result4a) {
 56:     PetscPrintf(PETSC_COMM_WORLD,"Error 1,2 norms: result3 %g result4 %g\n",(double)result3,(double)result4);
 57:   }

 59:   /*
 60:         Test norms that only require abs
 61:   */
 62:   result1 = result2 = 0.0;
 63:   result3 = result4 = 0.0;
 64:   VecNormBegin(y,NORM_MAX,&result3);
 65:   VecNormBegin(x,NORM_MAX,&result4);
 66:   VecNormEnd(y,NORM_MAX,&result3);
 67:   VecNormEnd(x,NORM_MAX,&result4);

 69:   VecNorm(x,NORM_MAX,&result4a);
 70:   VecNorm(y,NORM_MAX,&result3a);
 71:   if (result3 != result3a || result4 != result4a) {
 72:     PetscPrintf(PETSC_COMM_WORLD,"Error max norm: result3 %g result4 %g\n",(double)result3,(double)result4);
 73:   }

 75:   /*
 76:         Tests dot,  max, 1, norm
 77:   */
 78:   result1 = result2 = 0.0;
 79:   result3 = result4 = 0.0;
 80:   VecSetValues(x,1,&row0,&ten,INSERT_VALUES);
 81:   VecAssemblyBegin(x);
 82:   VecAssemblyEnd(x);

 84:   VecDotBegin(x,y,&result1);
 85:   VecDotBegin(y,x,&result2);
 86:   VecNormBegin(x,NORM_MAX,&result3);
 87:   VecNormBegin(x,NORM_1,&result4);
 88:   VecDotEnd(x,y,&result1);
 89:   VecDotEnd(y,x,&result2);
 90:   VecNormEnd(x,NORM_MAX,&result3);
 91:   VecNormEnd(x,NORM_1,&result4);

 93:   VecDot(x,y,&result1a);
 94:   VecDot(y,x,&result2a);
 95:   VecNorm(x,NORM_MAX,&result3a);
 96:   VecNorm(x,NORM_1,&result4a);

 98:   if (result1 != result1a || result2 != result2a) {
 99:     PetscPrintf(PETSC_COMM_WORLD,"Error dot: result1 %g result2 %g\n",(double)PetscRealPart(result1),(double)PetscRealPart(result2));
100:   }
101:   if (result3 != result3a || result4 != result4a) {
102:     PetscPrintf(PETSC_COMM_WORLD,"Error max 1 norms: result3 %g result4 %g\n",(double)result3,(double)result4);
103:   }

105:   /*
106:        tests 1_and_2 norm
107:   */
108:   VecNormBegin(x,NORM_MAX,&result3);
109:   VecNormBegin(x,NORM_1_AND_2,result);
110:   VecNormBegin(y,NORM_MAX,&result4);
111:   VecNormEnd(x,NORM_MAX,&result3);
112:   VecNormEnd(x,NORM_1_AND_2,result);
113:   VecNormEnd(y,NORM_MAX,&result4);

115:   VecNorm(x,NORM_MAX,&result3a);
116:   VecNorm(x,NORM_1_AND_2,resulta);
117:   VecNorm(y,NORM_MAX,&result4a);
118:   if (result3 != result3a || result4 != result4a) {
119:     PetscPrintf(PETSC_COMM_WORLD,"Error max: result1 %g result2 %g\n",(double)result3,(double)result4);
120:   }
121:   if (PetscAbsReal(result[0]-resulta[0]) > .01 || PetscAbsReal(result[1]-resulta[1]) > .01) {
122:     PetscPrintf(PETSC_COMM_WORLD,"Error 1 and 2 norms: result[0] %g result[1] %g\n",(double)result[0],(double)result[1]);
123:   }

125:   VecDestroy(&x);
126:   VecDestroy(&y);

128:   /*
129:        Tests computing a large number of operations that require
130:     allocating a larger data structure internally
131:   */
132:   for (i=0; i<40; i++) {
133:     VecCreate(PETSC_COMM_WORLD,vecs+i);
134:     VecSetSizes(vecs[i],PETSC_DECIDE,n);
135:     VecSetFromOptions(vecs[i]);
136:     value = (PetscReal)i;
137:     VecSet(vecs[i],value);
138:   }
139:   for (i=0; i<39; i++) {
140:     VecDotBegin(vecs[i],vecs[i+1],results+i);
141:   }
142:   for (i=0; i<39; i++) {
143:     VecDotEnd(vecs[i],vecs[i+1],results+i);
144:     if (results[i] != 25.0*i*(i+1)) {
145:       PetscPrintf(PETSC_COMM_WORLD,"i %D expected %g got %g\n",i,25.0*i*(i+1),(double)PetscRealPart(results[i]));
146:     }
147:   }
148:   for (i=0; i<40; i++) {
149:     VecDestroy(&vecs[i]);
150:   }

152:   PetscFinalize();
153:   return ierr;
154: }