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