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: PetscInitialize(&argc,&argv,0,help);
15: comm = MPI_COMM_SELF;
17: VecCreate(comm,&V);
18: VecSetSizes(V,10,PETSC_DECIDE);
19: VecSetFromOptions(V);
20: VecSetRandom(V,NULL);
21: VecAssemblyBegin(V);
22: VecAssemblyEnd(V);
24: /*
25: * Initial
26: */
27: /* display norm 1 & 2 */
28: VecNorm(V,NORM_1,&nrm1);
29: VecNorm(V,NORM_2,&nrm2);
30: PetscPrintf(comm,"Original: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
32: /* display cached norm 1 & 2 */
33: VecNorm(V,NORM_1,&nrm1);
34: VecNorm(V,NORM_2,&nrm2);
35: PetscPrintf(comm,"cached: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
37: /*
38: * Alter an element
39: */
40: VecSetValues(V,1,&ione,&one,INSERT_VALUES);
42: /* display norm 1 & 2 */
43: VecNorm(V,NORM_1,&nrm1);
44: VecNorm(V,NORM_2,&nrm2);
45: PetscPrintf(comm,"Altered: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
47: /* display cached norm 1 & 2 */
48: VecNorm(V,NORM_1,&nrm1);
49: VecNorm(V,NORM_2,&nrm2);
50: PetscPrintf(comm,"recomputed: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
52: /*
53: * Scale the vector a little
54: */
55: VecScale(V,e);
57: /* display updated cached norm 1 & 2 */
58: VecNorm(V,NORM_1,&nrm1);
59: VecNorm(V,NORM_2,&nrm2);
60: PetscPrintf(comm,"Scale: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
62: /* display forced norm 1 & 2 */
63: PetscObjectStateIncrease((PetscObject)V);
64: VecNorm(V,NORM_1,&nrm1);
65: VecNorm(V,NORM_2,&nrm2);
66: PetscPrintf(comm,"recompute: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
68: /*
69: * Normalize the vector a little
70: */
71: VecNormalize(V,&nrm1);
73: /* display updated cached norm 1 & 2 */
74: VecNorm(V,NORM_1,&nrm1);
75: VecNorm(V,NORM_2,&nrm2);
76: PetscPrintf(comm,"Normalize: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
78: /* display forced norm 1 & 2 */
79: PetscObjectStateIncrease((PetscObject)V);
80: VecNorm(V,NORM_1,&nrm1);
81: VecNorm(V,NORM_2,&nrm2);
82: PetscPrintf(comm,"recompute: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
84: /*
85: * Copy to another vector
86: */
87: VecDuplicate(V,&W);
88: VecCopy(V,W);
90: /* display norm 1 & 2 */
91: VecNorm(V,NORM_1,&nrm1);
92: VecNorm(V,NORM_2,&nrm2);
93: PetscPrintf(comm,"Original: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
95: /* display cached norm 1 & 2 */
96: VecNorm(W,NORM_1,&nrm1);
97: VecNorm(W,NORM_2,&nrm2);
98: PetscPrintf(comm,"copied: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
100: /*
101: * Copy while data is invalid
102: */
103: VecSetValues(V,1,&ione,&one,INSERT_VALUES);
104: VecCopy(V,W);
106: /* display norm 1 & 2 */
107: VecNorm(V,NORM_1,&nrm1);
108: VecNorm(V,NORM_2,&nrm2);
109: PetscPrintf(comm,"Invalidated: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
111: /* display norm 1 & 2 */
112: VecNorm(W,NORM_1,&nrm1);
113: VecNorm(W,NORM_2,&nrm2);
114: PetscPrintf(comm,"copied: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
116: /*
117: * Constant vector
118: */
119: VecSet(V,e);
121: /* display updated cached norm 1 & 2 */
122: VecNorm(V,NORM_1,&nrm1);
123: VecNorm(V,NORM_2,&nrm2);
124: PetscPrintf(comm,"Constant: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
126: /* display forced norm 1 & 2 */
127: PetscObjectStateIncrease((PetscObject)V);
128: VecNorm(V,NORM_1,&nrm1);
129: VecNorm(V,NORM_2,&nrm2);
130: PetscPrintf(comm,"recomputed: norm1=%e,norm2=%e\n",(double)nrm1,(double)nrm2);
132: /*
133: * Swap vectors
134: */
135: VecNorm(V,NORM_1,&nrm1);
136: VecNorm(W,NORM_1,&nrm2);
137: PetscPrintf(comm,"Orig: norm_V=%e,norm_W=%e\n",(double)nrm1,(double)nrm2);
138: /* store inf norm */
139: VecNorm(V,NORM_INFINITY,&nrm3);
140: VecNorm(W,NORM_INFINITY,&nrm4);
142: VecSwap(V,W);
144: PetscObjectStateIncrease((PetscObject)V);
145: PetscObjectStateIncrease((PetscObject)W);
146: VecNorm(V,NORM_1,&nrm1);
147: VecNorm(W,NORM_1,&nrm2);
148: PetscPrintf(comm,"swapped: norm_V=%e,norm_W=%e\n",(double)nrm2,(double)nrm1);
149: PetscPrintf(comm,"orig: F-norm_V=%e,F-norm_W=%e\n",(double)nrm3,(double)nrm4);
150: VecNorm(V,NORM_INFINITY,&nrm3);
151: VecNorm(W,NORM_INFINITY,&nrm4);
152: PetscPrintf(comm,"swapped: F-norm_V=%e,F-norm_W=%e\n",(double)nrm4,(double)nrm3);
154: VecDestroy(&V);
155: VecDestroy(&W);
156: PetscFinalize();
157: return 0;
158: }
160: /*TEST
162: testset:
163: output_file: output/ex34_1.out
164: test:
165: suffix: standard
166: test:
167: requires: cuda
168: args: -vec_type cuda
169: suffix: cuda
170: test:
171: requires: viennacl
172: args: -vec_type viennacl
173: suffix: viennacl
174: test:
175: requires: kokkos_kernels
176: args: -vec_type kokkos
177: suffix: kokkos
178: test:
179: requires: hip
180: args: -vec_type hip
181: suffix: hip
183: TEST*/