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*/