Actual source code: ex34.c
petsc-3.8.3 2017-12-09
1: static char help[] = "Tests for norm caching\n";
3: #include <petscvec.h>
4: #include <petsc/private/petscimpl.h> /* to gain access to the private PetscObjectStateIncrease() */
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;
16: PetscInitialize(&argc,&argv,0,help);
17: comm = MPI_COMM_SELF;
19: VecCreateSeq(comm,10,&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 ierr;
158: }