Actual source code: ex34.c

petsc-3.9.4 2018-09-11
Report Typos and Errors
  1: static char help[] = "Tests for norm caching\n";

  3:  #include <petscvec.h>
  4: #include <petsc/private/petscimpl.h>  /* to gain access to the private PetscObjectStateIncrease() */

  6: int main(int argc,char **argv)
  7: {
  8:   Vec            V,W;
  9:   MPI_Comm       comm;
 10:   PetscScalar    one=1,e=2.7181;
 11:   PetscReal      nrm1,nrm2,nrm3,nrm4;
 12:   PetscInt       ione=1;

 16:   PetscInitialize(&argc,&argv,0,help);
 17:   comm = MPI_COMM_SELF;

 19:   VecCreateSeq(comm,10,&V);
 20:   VecSetRandom(V,NULL);
 21:   VecAssemblyBegin(V);
 22:   VecAssemblyEnd(V);

 24:   /*
 25:    * Initial
 26:    */
 27:   /* display norm 1 & 2 */
 28:   VecNorm(V,NORM_1,&nrm1);
 29:   VecNorm(V,NORM_2,&nrm2);
 30:   PetscPrintf(comm,"Original: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

 32:   /* display cached norm 1 & 2 */
 33:   VecNorm(V,NORM_1,&nrm1);
 34:   VecNorm(V,NORM_2,&nrm2);
 35:   PetscPrintf(comm,"cached: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

 37:   /*
 38:    * Alter an element
 39:    */
 40:   VecSetValues(V,1,&ione,&one,INSERT_VALUES);

 42:   /* display norm 1 & 2 */
 43:   VecNorm(V,NORM_1,&nrm1);
 44:   VecNorm(V,NORM_2,&nrm2);
 45:   PetscPrintf(comm,"Altered: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

 47:   /* display cached norm 1 & 2 */
 48:   VecNorm(V,NORM_1,&nrm1);
 49:   VecNorm(V,NORM_2,&nrm2);
 50:   PetscPrintf(comm,"recomputed: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

 52:   /*
 53:    * Scale the vector a little
 54:    */
 55:   VecScale(V,e);

 57:   /* display updated cached norm 1 & 2 */
 58:   VecNorm(V,NORM_1,&nrm1);
 59:   VecNorm(V,NORM_2,&nrm2);
 60:   PetscPrintf(comm,"Scale: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

 62:   /* display forced norm 1 & 2 */
 63:   PetscObjectStateIncrease((PetscObject)V);
 64:   VecNorm(V,NORM_1,&nrm1);
 65:   VecNorm(V,NORM_2,&nrm2);
 66:   PetscPrintf(comm,"recompute: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

 68:   /*
 69:    * Normalize the vector a little
 70:    */
 71:   VecNormalize(V,&nrm1);

 73:   /* display updated cached norm 1 & 2 */
 74:   VecNorm(V,NORM_1,&nrm1);
 75:   VecNorm(V,NORM_2,&nrm2);
 76:   PetscPrintf(comm,"Normalize: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

 78:   /* display forced norm 1 & 2 */
 79:   PetscObjectStateIncrease((PetscObject)V);
 80:   VecNorm(V,NORM_1,&nrm1);
 81:   VecNorm(V,NORM_2,&nrm2);
 82:   PetscPrintf(comm,"recompute: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

 84:   /*
 85:    * Copy to another vector
 86:    */
 87:   VecDuplicate(V,&W);
 88:   VecCopy(V,W);

 90:   /* display norm 1 & 2 */
 91:   VecNorm(V,NORM_1,&nrm1);
 92:   VecNorm(V,NORM_2,&nrm2);
 93:   PetscPrintf(comm,"Original: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

 95:   /* display cached norm 1 & 2 */
 96:   VecNorm(W,NORM_1,&nrm1);
 97:   VecNorm(W,NORM_2,&nrm2);
 98:   PetscPrintf(comm,"copied: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

100:   /*
101:    * Copy while data is invalid
102:    */
103:   VecSetValues(V,1,&ione,&one,INSERT_VALUES);
104:   VecCopy(V,W);

106:   /* display norm 1 & 2 */
107:   VecNorm(V,NORM_1,&nrm1);
108:   VecNorm(V,NORM_2,&nrm2);
109:   PetscPrintf(comm,"Invalidated: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

111:   /* display norm 1 & 2 */
112:   VecNorm(W,NORM_1,&nrm1);
113:   VecNorm(W,NORM_2,&nrm2);
114:   PetscPrintf(comm,"copied: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

116:   /*
117:    * Constant vector
118:    */
119:   VecSet(V,e);

121:   /* display updated cached norm 1 & 2 */
122:   VecNorm(V,NORM_1,&nrm1);
123:   VecNorm(V,NORM_2,&nrm2);
124:   PetscPrintf(comm,"Constant: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

126:   /* display forced norm 1 & 2 */
127:   PetscObjectStateIncrease((PetscObject)V);
128:   VecNorm(V,NORM_1,&nrm1);
129:   VecNorm(V,NORM_2,&nrm2);
130:   PetscPrintf(comm,"recomputed: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);

132:   /*
133:    * Swap vectors
134:    */
135:   VecNorm(V,NORM_1,&nrm1);
136:   VecNorm(W,NORM_1,&nrm2);
137:   PetscPrintf(comm,"Orig: norm_V=%e,norm_W=%e\n",(double)nrm1,(double)nrm2);
138:   /* store inf norm */
139:   VecNorm(V,NORM_INFINITY,&nrm3);
140:   VecNorm(W,NORM_INFINITY,&nrm4);

142:   VecSwap(V,W);

144:   PetscObjectStateIncrease((PetscObject)V);
145:   PetscObjectStateIncrease((PetscObject)W);
146:   VecNorm(V,NORM_1,&nrm1);
147:   VecNorm(W,NORM_1,&nrm2);
148:   PetscPrintf(comm,"swapped: norm_V=%e,norm_W=%e\n",(double)nrm2,(double)nrm1);
149:   PetscPrintf(comm,"orig: F-norm_V=%e,F-norm_W=%e\n",(double)nrm3,(double)nrm4);
150:   VecNorm(V,NORM_INFINITY,&nrm3);
151:   VecNorm(W,NORM_INFINITY,&nrm4);
152:   PetscPrintf(comm,"swapped: F-norm_V=%e,F-norm_W=%e\n",(double)nrm4,(double)nrm3);

154:   VecDestroy(&V);
155:   VecDestroy(&W);
156:   PetscFinalize();
157:   return ierr;
158: }


161: /*TEST

163:    test:

165: TEST*/