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;

 14:   PetscFunctionBegin;
 15:   PetscFunctionBeginUser;
 16:   PetscCall(PetscInitialize(&argc, &argv, 0, help));
 17:   comm = MPI_COMM_SELF;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

144:   PetscCall(VecSwap(V, W));

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

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

162: /*TEST

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

185: TEST*/