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