Actual source code: ex34.c
1: /*
2: * Test file for norm caching
3: */
5: #include petscvec.h
9: int main(int argc,char **argv)
10: {
11: Vec V,W;
12: PetscReal nrm1,nrm2,nrm3,nrm4;
13: MPI_Comm comm;
14: PetscScalar one=1,e=2.7181;
15: PetscInt ione=1;
19: PetscInitialize(&argc,&argv,0,0);
20: comm = MPI_COMM_SELF;
21:
22: VecCreateSeq(comm,10,&V);
23: VecSetRandom(V,PETSC_NULL);
24: VecAssemblyBegin(V);
25: VecAssemblyEnd(V);
27: /*
28: * Initial
29: */
30: /* display norm 1 & 2 */
31: VecNorm(V,NORM_1,&nrm1);
32: VecNorm(V,NORM_2,&nrm2);
33: PetscPrintf(comm,"Original: norm1=%e, norm2=%e\n",nrm1,nrm2);
35: /* display cached norm 1 & 2 */
36: VecNorm(V,NORM_1,&nrm1);
37: VecNorm(V,NORM_2,&nrm2);
38: PetscPrintf(comm,"cached: norm1=%e, norm2=%e\n",nrm1,nrm2);
40: /*
41: * Alter an element
42: */
43: VecSetValues(V,1,&ione,&one,INSERT_VALUES);
45: /* display norm 1 & 2 */
46: VecNorm(V,NORM_1,&nrm1);
47: VecNorm(V,NORM_2,&nrm2);
48: PetscPrintf(comm,"Altered: norm1=%e, norm2=%e\n",nrm1,nrm2);
50: /* display cached norm 1 & 2 */
51: VecNorm(V,NORM_1,&nrm1);
52: VecNorm(V,NORM_2,&nrm2);
53: PetscPrintf(comm,"recomputed: norm1=%e, norm2=%e\n",nrm1,nrm2);
55: /*
56: * Scale the vector a little
57: */
58: VecScale(V,e);
60: /* display updated cached norm 1 & 2 */
61: VecNorm(V,NORM_1,&nrm1);
62: VecNorm(V,NORM_2,&nrm2);
63: PetscPrintf(comm,"Scale: norm1=%e, norm2=%e\n",nrm1,nrm2);
65: /* display forced norm 1 & 2 */
66: PetscObjectStateIncrease((PetscObject)V);
67: VecNorm(V,NORM_1,&nrm1);
68: VecNorm(V,NORM_2,&nrm2);
69: PetscPrintf(comm,"recompute: norm1=%e, norm2=%e\n",nrm1,nrm2);
71: /*
72: * Normalize the vector a little
73: */
74: VecNormalize(V,&nrm1);
76: /* display updated cached norm 1 & 2 */
77: VecNorm(V,NORM_1,&nrm1);
78: VecNorm(V,NORM_2,&nrm2);
79: PetscPrintf(comm,"Normalize: norm1=%e, norm2=%e\n",nrm1,nrm2);
81: /* display forced norm 1 & 2 */
82: PetscObjectStateIncrease((PetscObject)V);
83: VecNorm(V,NORM_1,&nrm1);
84: VecNorm(V,NORM_2,&nrm2);
85: PetscPrintf(comm,"recompute: norm1=%e, norm2=%e\n",nrm1,nrm2);
87: /*
88: * Copy to another vector
89: */
90: VecDuplicate(V,&W);
91: VecCopy(V,W);
93: /* display norm 1 & 2 */
94: VecNorm(V,NORM_1,&nrm1);
95: VecNorm(V,NORM_2,&nrm2);
96: PetscPrintf(comm,"Original: norm1=%e, norm2=%e\n",nrm1,nrm2);
98: /* display cached norm 1 & 2 */
99: VecNorm(W,NORM_1,&nrm1);
100: VecNorm(W,NORM_2,&nrm2);
101: PetscPrintf(comm,"copied: norm1=%e, norm2=%e\n",nrm1,nrm2);
103: /*
104: * Copy while data is invalid
105: */
106: VecSetValues(V,1,&ione,&one,INSERT_VALUES);
107: VecCopy(V,W);
109: /* display norm 1 & 2 */
110: VecNorm(V,NORM_1,&nrm1);
111: VecNorm(V,NORM_2,&nrm2);
112: PetscPrintf(comm,"Invalidated: norm1=%e, norm2=%e\n",nrm1,nrm2);
114: /* display norm 1 & 2 */
115: VecNorm(W,NORM_1,&nrm1);
116: VecNorm(W,NORM_2,&nrm2);
117: PetscPrintf(comm,"copied: norm1=%e, norm2=%e\n",nrm1,nrm2);
119: /*
120: * Constant vector
121: */
122: VecSet(V,e);
124: /* display updated cached norm 1 & 2 */
125: VecNorm(V,NORM_1,&nrm1);
126: VecNorm(V,NORM_2,&nrm2);
127: PetscPrintf(comm,"Constant: norm1=%e, norm2=%e\n",nrm1,nrm2);
129: /* display forced norm 1 & 2 */
130: PetscObjectStateIncrease((PetscObject)V);
131: VecNorm(V,NORM_1,&nrm1);
132: VecNorm(V,NORM_2,&nrm2);
133: PetscPrintf(comm,"recomputed: norm1=%e, norm2=%e\n",nrm1,nrm2);
135: /*
136: * Swap vectors
137: */
138: VecNorm(V,NORM_1,&nrm1);
139: VecNorm(W,NORM_1,&nrm2);
140: PetscPrintf(comm,"Orig: norm V=%e, norm W=%e\n",nrm1,nrm2);
141: /* store inf norm */
142: VecNorm(V,NORM_INFINITY,&nrm3);
143: VecNorm(W,NORM_INFINITY,&nrm4);
145: VecSwap(V,W);
147: PetscObjectStateIncrease((PetscObject)V);
148: PetscObjectStateIncrease((PetscObject)W);
149: VecNorm(V,NORM_1,&nrm1);
150: VecNorm(W,NORM_1,&nrm2);
151: PetscPrintf(comm,"swapped: norm V=%e, norm W=%e\n",nrm2,nrm1);
152: PetscPrintf(comm,"orig: F norm V=%e, F norm W=%e\n",nrm3,nrm4);
153: VecNorm(V,NORM_INFINITY,&nrm3);
154: VecNorm(W,NORM_INFINITY,&nrm4);
155: PetscPrintf(comm,"swapped: F norm V=%e, F norm W=%e\n",nrm4,nrm3);
157: VecDestroy(V);
158: VecDestroy(W);
160: PetscFinalize();
161: return(0);
162: }