Actual source code: ex34.c

  1: /*
  2:  * Test file for norm caching
  3:  */

 5:  #include petscvec.h

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

 19:   PetscInitialize(&argc,&argv,0,0);
 20:   comm = MPI_COMM_SELF;
 21: 
 22:   VecCreateSeq(comm,10,&V);
 23:   VecSetRandom(V,PETSC_NULL);
 24:   VecAssemblyBegin(V);
 25:   VecAssemblyEnd(V);

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

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

 40:   /* 
 41:    * Alter an element
 42:    */
 43:   VecSetValues(V,1,&ione,&one,INSERT_VALUES);

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

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

 55:   /*
 56:    * Scale the vector a little
 57:    */
 58:   VecScale(V,e);

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

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

 71:   /*
 72:    * Normalize the vector a little
 73:    */
 74:   VecNormalize(V,&nrm1);

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

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

 87:   /*
 88:    * Copy to another vector
 89:    */
 90:   VecDuplicate(V,&W);
 91:   VecCopy(V,W);

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

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

103:   /*
104:    * Copy while data is invalid
105:    */
106:   VecSetValues(V,1,&ione,&one,INSERT_VALUES);
107:   VecCopy(V,W);

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

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

119:   /*
120:    * Constant vector
121:    */
122:   VecSet(V,e);

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

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

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

145:   VecSwap(V,W);

147:   PetscObjectStateIncrease((PetscObject)V);
148:   PetscObjectStateIncrease((PetscObject)W);
149:   VecNorm(V,NORM_1,&nrm1);
150:   VecNorm(W,NORM_1,&nrm2);
151:   PetscPrintf(comm,"swapped: norm V=%e, norm W=%e\n",nrm2,nrm1);
152:   PetscPrintf(comm,"orig: F norm V=%e, F norm W=%e\n",nrm3,nrm4);
153:   VecNorm(V,NORM_INFINITY,&nrm3);
154:   VecNorm(W,NORM_INFINITY,&nrm4);
155:   PetscPrintf(comm,"swapped: F norm V=%e, F norm W=%e\n",nrm4,nrm3);

157:   VecDestroy(V);
158:   VecDestroy(W);

160:   PetscFinalize();
161:   return(0);
162: }