Actual source code: ex41.c
petsc-3.13.4 2020-08-01
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;
18: PetscInt tmp_ind[2];
19: Vec tmp_buf[2];
22: PetscPrintf(PETSC_COMM_WORLD, "============== %s ==============\n",PETSC_FUNCTION_NAME);
24: /* create 4 slave vectors */
25: VecCreate(PETSC_COMM_WORLD, &c);
26: VecSetSizes(c, PETSC_DECIDE, 4);
27: VecSetType(c, VECMPI);
28: VecDuplicate(c, &d);
29: VecDuplicate(c, &e);
30: VecDuplicate(c, &f);
32: /* create two more slaves of different sizes */
33: VecCreate(PETSC_COMM_WORLD, &g);
34: VecSetSizes(g, PETSC_DECIDE, 6);
35: VecSetType(g, VECMPI);
36: VecCreate(PETSC_COMM_WORLD, &h);
37: VecSetSizes(h, PETSC_DECIDE, 8);
38: VecSetType(h, VECMPI);
40: /* set the 6 vectors to some numbers */
41: VecSet(c, 1.0);
42: VecSet(d, 2.0);
43: VecSet(e, 3.0);
44: VecSet(f, 4.0);
45: VecSet(g, 5.0);
46: VecSet(h, 6.0);
48: /* assemble a */
49: PetscPrintf(PETSC_COMM_WORLD, "a = [c d] \n");
50: tmp_buf[0] = c; tmp_buf[1] = d;
52: VecCreateNest(PETSC_COMM_WORLD,2,NULL,tmp_buf,&a);
53: VecView(a,PETSC_VIEWER_STDOUT_WORLD);
54: PetscPrintf(PETSC_COMM_WORLD, "a = [d c] \n");
55: VecNestSetSubVec(a, 1, c);
56: VecNestSetSubVec(a, 0, d);
57: VecAssemblyBegin(a);
58: VecAssemblyEnd(a);
59: VecView(a,PETSC_VIEWER_STDOUT_WORLD);
61: /* assemble b */
62: PetscPrintf(PETSC_COMM_WORLD, "b = [e f] \n");
63: tmp_buf[0] = e; tmp_buf[1] = f;
65: VecCreateNest(PETSC_COMM_WORLD,2,NULL,tmp_buf,&b);
66: VecView(b,PETSC_VIEWER_STDOUT_WORLD);
67: PetscPrintf(PETSC_COMM_WORLD, "b = [f e] \n");
68: VecNestSetSubVec(b, 1, e);
69: VecNestSetSubVec(b, 0, f);
70: VecAssemblyBegin(b);
71: VecAssemblyEnd(b);
72: VecView(b,PETSC_VIEWER_STDOUT_WORLD);
74: PetscPrintf(PETSC_COMM_WORLD, "X = [a b] \n");
75: tmp_buf[0] = a; tmp_buf[1] = b;
77: VecCreateNest(PETSC_COMM_WORLD,2,NULL,tmp_buf,&X);
78: VecView(X,PETSC_VIEWER_STDOUT_WORLD);
79: VecDot(X,X, &val);
80: PetscPrintf(PETSC_COMM_WORLD, "X.X = %g \n", (double)PetscRealPart(val));
82: PetscPrintf(PETSC_COMM_WORLD, "X = [b a] \n");
83: /* re-order components of X */
84: VecNestSetSubVec(X,1,a);
85: VecNestSetSubVec(X,0,b);
86: VecAssemblyBegin(X);
87: VecAssemblyEnd(X);
88: VecView(X,PETSC_VIEWER_STDOUT_WORLD);
89: VecDot(X,X,&val);
90: PetscPrintf(PETSC_COMM_WORLD, "X.X = %g \n", (double)PetscRealPart(val));
92: /* re-assemble X */
93: PetscPrintf(PETSC_COMM_WORLD, "X = [g h] \n");
94: VecNestSetSubVec(X,1,g);
95: VecNestSetSubVec(X,0,h);
96: VecAssemblyBegin(X);
97: VecAssemblyEnd(X);
98: VecView(X,PETSC_VIEWER_STDOUT_WORLD);
99: VecDot(X,X,&val);
100: PetscPrintf(PETSC_COMM_WORLD, "X.X = %g \n", (double)PetscRealPart(val));
102: PetscPrintf(PETSC_COMM_WORLD, "Y = X \n");
103: VecDuplicate(X, &Y);
104: VecCopy(X,Y);
105: VecView(Y,PETSC_VIEWER_STDOUT_WORLD);
106: VecDot(Y,Y,&val);
107: PetscPrintf(PETSC_COMM_WORLD, "Y.Y = %g \n", (double)PetscRealPart(val));
109: PetscPrintf(PETSC_COMM_WORLD, "Y = [a b] \n");
110: tmp_buf[0] = a; tmp_buf[1] = b;
111: tmp_ind[0] = 0; tmp_ind[1] = 1;
113: VecNestSetSubVecs(Y,2,tmp_ind,tmp_buf);
114: VecView(Y,PETSC_VIEWER_STDOUT_WORLD);
116: VecDestroy(&c);
117: VecDestroy(&d);
118: VecDestroy(&e);
119: VecDestroy(&f);
120: VecDestroy(&g);
121: VecDestroy(&h);
122: VecDestroy(&a);
123: VecDestroy(&b);
124: VecDestroy(&X);
125: VecDestroy(&Y);
126: return(0);
127: }
129: int main(int argc, char **args)
130: {
133: PetscInitialize(&argc, &args,(char*)0, help);if (ierr) return ierr;
134: test_vec_ops();
135: PetscFinalize();
136: return ierr;
137: }
140: /*TEST
142: test:
144: TEST*/