Actual source code: ex41.c
1: static char help[] = "Nest vector set subvector functionality.\n\n";
3: /*T
4: Concepts: vectors^block operators
5: Concepts: vectors^setting values
6: Concepts: vectors^local access to
7: Processors: n
8: T*/
10: #include <petscvec.h>
12: PetscErrorCode test_vec_ops(void)
13: {
14: Vec X,Y,a,b;
15: Vec c,d,e,f,g,h;
16: PetscScalar val;
17: PetscInt tmp_ind[2];
18: Vec tmp_buf[2];
20: PetscPrintf(PETSC_COMM_WORLD, "============== %s ==============\n",PETSC_FUNCTION_NAME);
22: /* create 4 worker vectors */
23: VecCreate(PETSC_COMM_WORLD, &c);
24: VecSetSizes(c, PETSC_DECIDE, 4);
25: VecSetType(c, VECMPI);
26: VecDuplicate(c, &d);
27: VecDuplicate(c, &e);
28: VecDuplicate(c, &f);
30: /* create two more workers of different sizes */
31: VecCreate(PETSC_COMM_WORLD, &g);
32: VecSetSizes(g, PETSC_DECIDE, 6);
33: VecSetType(g, VECMPI);
34: VecCreate(PETSC_COMM_WORLD, &h);
35: VecSetSizes(h, PETSC_DECIDE, 8);
36: VecSetType(h, VECMPI);
38: /* set the 6 vectors to some numbers */
39: VecSet(c, 1.0);
40: VecSet(d, 2.0);
41: VecSet(e, 3.0);
42: VecSet(f, 4.0);
43: VecSet(g, 5.0);
44: VecSet(h, 6.0);
46: /* assemble a */
47: PetscPrintf(PETSC_COMM_WORLD, "a = [c d] \n");
48: tmp_buf[0] = c; tmp_buf[1] = d;
50: VecCreateNest(PETSC_COMM_WORLD,2,NULL,tmp_buf,&a);
51: VecView(a,PETSC_VIEWER_STDOUT_WORLD);
52: PetscPrintf(PETSC_COMM_WORLD, "a = [d c] \n");
53: VecNestSetSubVec(a, 1, c);
54: VecNestSetSubVec(a, 0, d);
55: VecAssemblyBegin(a);
56: VecAssemblyEnd(a);
57: VecView(a,PETSC_VIEWER_STDOUT_WORLD);
59: /* assemble b */
60: PetscPrintf(PETSC_COMM_WORLD, "b = [e f] \n");
61: tmp_buf[0] = e; tmp_buf[1] = f;
63: VecCreateNest(PETSC_COMM_WORLD,2,NULL,tmp_buf,&b);
64: VecView(b,PETSC_VIEWER_STDOUT_WORLD);
65: PetscPrintf(PETSC_COMM_WORLD, "b = [f e] \n");
66: VecNestSetSubVec(b, 1, e);
67: VecNestSetSubVec(b, 0, f);
68: VecAssemblyBegin(b);
69: VecAssemblyEnd(b);
70: VecView(b,PETSC_VIEWER_STDOUT_WORLD);
72: PetscPrintf(PETSC_COMM_WORLD, "X = [a b] \n");
73: tmp_buf[0] = a; tmp_buf[1] = b;
75: VecCreateNest(PETSC_COMM_WORLD,2,NULL,tmp_buf,&X);
76: VecView(X,PETSC_VIEWER_STDOUT_WORLD);
77: VecDot(X,X, &val);
78: PetscPrintf(PETSC_COMM_WORLD, "X.X = %g \n", (double)PetscRealPart(val));
80: PetscPrintf(PETSC_COMM_WORLD, "X = [b a] \n");
81: /* re-order components of X */
82: VecNestSetSubVec(X,1,a);
83: VecNestSetSubVec(X,0,b);
84: VecAssemblyBegin(X);
85: VecAssemblyEnd(X);
86: VecView(X,PETSC_VIEWER_STDOUT_WORLD);
87: VecDot(X,X,&val);
88: PetscPrintf(PETSC_COMM_WORLD, "X.X = %g \n", (double)PetscRealPart(val));
90: /* re-assemble X */
91: PetscPrintf(PETSC_COMM_WORLD, "X = [g h] \n");
92: VecNestSetSubVec(X,1,g);
93: VecNestSetSubVec(X,0,h);
94: VecAssemblyBegin(X);
95: VecAssemblyEnd(X);
96: VecView(X,PETSC_VIEWER_STDOUT_WORLD);
97: VecDot(X,X,&val);
98: PetscPrintf(PETSC_COMM_WORLD, "X.X = %g \n", (double)PetscRealPart(val));
100: PetscPrintf(PETSC_COMM_WORLD, "Y = X \n");
101: VecDuplicate(X, &Y);
102: VecCopy(X,Y);
103: VecView(Y,PETSC_VIEWER_STDOUT_WORLD);
104: VecDot(Y,Y,&val);
105: PetscPrintf(PETSC_COMM_WORLD, "Y.Y = %g \n", (double)PetscRealPart(val));
107: PetscPrintf(PETSC_COMM_WORLD, "Y = [a b] \n");
108: tmp_buf[0] = a; tmp_buf[1] = b;
109: tmp_ind[0] = 0; tmp_ind[1] = 1;
111: VecNestSetSubVecs(Y,2,tmp_ind,tmp_buf);
112: VecView(Y,PETSC_VIEWER_STDOUT_WORLD);
114: VecDestroy(&c);
115: VecDestroy(&d);
116: VecDestroy(&e);
117: VecDestroy(&f);
118: VecDestroy(&g);
119: VecDestroy(&h);
120: VecDestroy(&a);
121: VecDestroy(&b);
122: VecDestroy(&X);
123: VecDestroy(&Y);
124: return 0;
125: }
127: int main(int argc, char **args)
128: {
130: PetscInitialize(&argc, &args,(char*)0, help);
131: test_vec_ops();
132: PetscFinalize();
133: return 0;
134: }
136: /*TEST
138: test:
140: TEST*/