Actual source code: ex34.c

  1: static char help[] = "Tests for norm caching\n";

  3: #include <petscvec.h>
  4: #include <petsc/private/petscimpl.h>

  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;

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

 18:   VecCreate(comm, &V);
 19:   VecSetSizes(V, 10, PETSC_DECIDE);
 20:   VecSetFromOptions(V);
 21:   VecSetRandom(V, NULL);
 22:   VecAssemblyBegin(V);
 23:   VecAssemblyEnd(V);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

143:   VecSwap(V, W);

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

155:   VecDestroy(&V);
156:   VecDestroy(&W);
157:   PetscFinalize();
158:   return 0;
159: }

161: /*TEST

163:    testset:
164:       output_file: output/ex34_1.out
165:       test:
166:         suffix: standard
167:       test:
168:         requires: cuda
169:         args: -vec_type cuda
170:         suffix: cuda
171:       test:
172:         requires: viennacl
173:         args: -vec_type viennacl
174:         suffix: viennacl
175:       test:
176:         requires: kokkos_kernels
177:         args: -vec_type kokkos
178:         suffix: kokkos
179:       test:
180:         requires: hip
181:         args: -vec_type hip
182:         suffix: hip

184: TEST*/