Actual source code: ex28.c
petsc-3.7.4 2016-10-02
2: static char help[] = "Tests repeated VecDotBegin()/VecDotEnd().\n\n";
4: #include <petscvec.h>
8: int main(int argc,char **argv)
9: {
11: PetscInt n = 25,i,row0 = 0;
12: PetscScalar two = 2.0,result1,result2,results[40],value,ten = 10.0;
13: PetscScalar result1a,result2a;
14: PetscReal result3,result4,result[2],result3a,result4a,resulta[2];
15: Vec x,y,vecs[40];
16: PetscRandom rctx;
18: PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
20: /* create vector */
21: VecCreate(PETSC_COMM_WORLD,&x);
22: VecSetSizes(x,n,PETSC_DECIDE);
23: VecSetFromOptions(x);
24: VecDuplicate(x,&y);
26: PetscRandomCreate(PETSC_COMM_WORLD,&rctx);
27: PetscRandomSetFromOptions(rctx);
28: VecSetRandom(x,rctx);
29: PetscRandomDestroy(&rctx);
30: VecSet(y,two);
32: /*
33: Test mixing dot products and norms that require sums
34: */
35: result1 = result2 = 0.0;
36: result3 = result4 = 0.0;
37: VecDotBegin(x,y,&result1);
38: VecDotBegin(y,x,&result2);
39: VecNormBegin(y,NORM_2,&result3);
40: VecNormBegin(x,NORM_1,&result4);
41: PetscCommSplitReductionBegin(PetscObjectComm((PetscObject)x));
42: VecDotEnd(x,y,&result1);
43: VecDotEnd(y,x,&result2);
44: VecNormEnd(y,NORM_2,&result3);
45: VecNormEnd(x,NORM_1,&result4);
47: VecDot(x,y,&result1a);
48: VecDot(y,x,&result2a);
49: VecNorm(y,NORM_2,&result3a);
50: VecNorm(x,NORM_1,&result4a);
52: if (result1 != result1a || result2 != result2a) {
53: PetscPrintf(PETSC_COMM_WORLD,"Error dot: result1 %g result2 %g\n",(double)PetscRealPart(result1),(double)PetscRealPart(result2));
54: }
55: if (result3 != result3a || result4 != result4a) {
56: PetscPrintf(PETSC_COMM_WORLD,"Error 1,2 norms: result3 %g result4 %g\n",(double)result3,(double)result4);
57: }
59: /*
60: Test norms that only require abs
61: */
62: result1 = result2 = 0.0;
63: result3 = result4 = 0.0;
64: VecNormBegin(y,NORM_MAX,&result3);
65: VecNormBegin(x,NORM_MAX,&result4);
66: VecNormEnd(y,NORM_MAX,&result3);
67: VecNormEnd(x,NORM_MAX,&result4);
69: VecNorm(x,NORM_MAX,&result4a);
70: VecNorm(y,NORM_MAX,&result3a);
71: if (result3 != result3a || result4 != result4a) {
72: PetscPrintf(PETSC_COMM_WORLD,"Error max norm: result3 %g result4 %g\n",(double)result3,(double)result4);
73: }
75: /*
76: Tests dot, max, 1, norm
77: */
78: result1 = result2 = 0.0;
79: result3 = result4 = 0.0;
80: VecSetValues(x,1,&row0,&ten,INSERT_VALUES);
81: VecAssemblyBegin(x);
82: VecAssemblyEnd(x);
84: VecDotBegin(x,y,&result1);
85: VecDotBegin(y,x,&result2);
86: VecNormBegin(x,NORM_MAX,&result3);
87: VecNormBegin(x,NORM_1,&result4);
88: VecDotEnd(x,y,&result1);
89: VecDotEnd(y,x,&result2);
90: VecNormEnd(x,NORM_MAX,&result3);
91: VecNormEnd(x,NORM_1,&result4);
93: VecDot(x,y,&result1a);
94: VecDot(y,x,&result2a);
95: VecNorm(x,NORM_MAX,&result3a);
96: VecNorm(x,NORM_1,&result4a);
98: if (result1 != result1a || result2 != result2a) {
99: PetscPrintf(PETSC_COMM_WORLD,"Error dot: result1 %g result2 %g\n",(double)PetscRealPart(result1),(double)PetscRealPart(result2));
100: }
101: if (result3 != result3a || result4 != result4a) {
102: PetscPrintf(PETSC_COMM_WORLD,"Error max 1 norms: result3 %g result4 %g\n",(double)result3,(double)result4);
103: }
105: /*
106: tests 1_and_2 norm
107: */
108: VecNormBegin(x,NORM_MAX,&result3);
109: VecNormBegin(x,NORM_1_AND_2,result);
110: VecNormBegin(y,NORM_MAX,&result4);
111: VecNormEnd(x,NORM_MAX,&result3);
112: VecNormEnd(x,NORM_1_AND_2,result);
113: VecNormEnd(y,NORM_MAX,&result4);
115: VecNorm(x,NORM_MAX,&result3a);
116: VecNorm(x,NORM_1_AND_2,resulta);
117: VecNorm(y,NORM_MAX,&result4a);
118: if (result3 != result3a || result4 != result4a) {
119: PetscPrintf(PETSC_COMM_WORLD,"Error max: result1 %g result2 %g\n",(double)result3,(double)result4);
120: }
121: if (PetscAbsReal(result[0]-resulta[0]) > .01 || PetscAbsReal(result[1]-resulta[1]) > .01) {
122: PetscPrintf(PETSC_COMM_WORLD,"Error 1 and 2 norms: result[0] %g result[1] %g\n",(double)result[0],(double)result[1]);
123: }
125: VecDestroy(&x);
126: VecDestroy(&y);
128: /*
129: Tests computing a large number of operations that require
130: allocating a larger data structure internally
131: */
132: for (i=0; i<40; i++) {
133: VecCreate(PETSC_COMM_WORLD,vecs+i);
134: VecSetSizes(vecs[i],PETSC_DECIDE,n);
135: VecSetFromOptions(vecs[i]);
136: value = (PetscReal)i;
137: VecSet(vecs[i],value);
138: }
139: for (i=0; i<39; i++) {
140: VecDotBegin(vecs[i],vecs[i+1],results+i);
141: }
142: for (i=0; i<39; i++) {
143: VecDotEnd(vecs[i],vecs[i+1],results+i);
144: if (results[i] != 25.0*i*(i+1)) {
145: PetscPrintf(PETSC_COMM_WORLD,"i %D expected %g got %g\n",i,25.0*i*(i+1),(double)PetscRealPart(results[i]));
146: }
147: }
148: for (i=0; i<40; i++) {
149: VecDestroy(&vecs[i]);
150: }
152: PetscFinalize();
153: return ierr;
154: }