Actual source code: ex41.c
petsc-3.3-p6 2013-02-11
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 <stdio.h>
11: #include <stdlib.h>
13: #include <petsc.h>
14: #include <petscvec.h>
16: #include ../src/vec/vec/impls/nest/vecnestimpl.h
20: PetscErrorCode test_vec_ops( void )
21: {
22: Vec X,Y,a,b;
23: Vec c,d,e,f,g,h;
24: PetscScalar val;
26: PetscInt tmp_ind[2];
27: Vec tmp_buf[2];
30: PetscPrintf( PETSC_COMM_WORLD, "============== %s ==============\n",PETSC_FUNCTION_NAME);
31:
32: /* create 4 slave vectors */
33: VecCreate( PETSC_COMM_WORLD, &c );
34: VecSetSizes( c, PETSC_DECIDE, 4 );
35: VecSetType( c, VECMPI );
36: VecDuplicate( c, &d );
37: VecDuplicate( c, &e );
38: VecDuplicate( c, &f );
40: /* create two more slaves of different sizes */
41: VecCreate( PETSC_COMM_WORLD, &g );
42: VecSetSizes( g, PETSC_DECIDE, 6 );
43: VecSetType( g, VECMPI );
44: VecCreate( PETSC_COMM_WORLD, &h );
45: VecSetSizes( h, PETSC_DECIDE, 8 );
46: VecSetType( h, VECMPI );
47:
48: /* set the 6 vectors to some numbers */
49: VecSet( c, 1.0 );
50: VecSet( d, 2.0 );
51: VecSet( e, 3.0 );
52: VecSet( f, 4.0 );
53: VecSet( g, 5.0 );
54: VecSet( h, 6.0 );
56: /* assemble a */
57: PetscPrintf( PETSC_COMM_WORLD, "a = [c d] \n");
58: tmp_buf[0] = c ; tmp_buf[1] = d ;
59: VecCreateNest(PETSC_COMM_WORLD,2,PETSC_NULL,tmp_buf,&a);
60: VecView(a,PETSC_VIEWER_STDOUT_WORLD);
61: PetscPrintf( PETSC_COMM_WORLD, "a = [d c] \n");
62: VecNestSetSubVec( a, 1, c );
63: VecNestSetSubVec( a, 0, d );
64: VecAssemblyBegin(a);
65: VecAssemblyEnd(a);
66: VecView(a,PETSC_VIEWER_STDOUT_WORLD);
68: /* assemble b */
69: PetscPrintf( PETSC_COMM_WORLD, "b = [e f] \n");
70: tmp_buf[0] = e ; tmp_buf[1] = f ;
71: VecCreateNest(PETSC_COMM_WORLD,2,PETSC_NULL,tmp_buf,&b);
72: VecView(b,PETSC_VIEWER_STDOUT_WORLD);
73: PetscPrintf( PETSC_COMM_WORLD, "b = [f e] \n");
74: VecNestSetSubVec( b, 1, e );
75: VecNestSetSubVec( b, 0, f );
76: VecAssemblyBegin(b);
77: VecAssemblyEnd(b);
78: VecView(b,PETSC_VIEWER_STDOUT_WORLD);
80: PetscPrintf( PETSC_COMM_WORLD, "X = [a b] \n");
81: tmp_buf[0] = a ; tmp_buf[1] = b ;
82: VecCreateNest(PETSC_COMM_WORLD,2,PETSC_NULL,tmp_buf,&X);
83: VecView(X,PETSC_VIEWER_STDOUT_WORLD);
84: VecDot( X,X, &val );
85: PetscPrintf( PETSC_COMM_WORLD, "X.X = %f \n", val );
87: /* re-order components of X */
88: PetscPrintf( PETSC_COMM_WORLD, "X = [b a] \n");
89: VecNestSetSubVec(X,1,a);
90: VecNestSetSubVec(X,0,b);
91: VecAssemblyBegin(X);
92: VecAssemblyEnd(X);
93: VecView(X,PETSC_VIEWER_STDOUT_WORLD);
94: VecDot(X,X,&val);
95: PetscPrintf( PETSC_COMM_WORLD, "X.X = %f \n", val );
96:
97: /* re-assemble X */
98: PetscPrintf( PETSC_COMM_WORLD, "X = [g h] \n");
99: VecNestSetSubVec(X,1,g);
100: VecNestSetSubVec(X,0,h);
101: VecAssemblyBegin(X);
102: VecAssemblyEnd(X);
103: VecView(X,PETSC_VIEWER_STDOUT_WORLD);
104: VecDot( X,X,&val );
105: PetscPrintf( PETSC_COMM_WORLD, "X.X = %f \n", val );
107: PetscPrintf( PETSC_COMM_WORLD, "Y = X \n");
108: VecDuplicate(X, &Y);
109: VecCopy(X,Y);
110: VecView(Y,PETSC_VIEWER_STDOUT_WORLD);
111: VecDot( Y,Y,&val );
112: PetscPrintf( PETSC_COMM_WORLD, "Y.Y = %f \n", val );
114: PetscPrintf( PETSC_COMM_WORLD, "Y = [a b] \n");
115: tmp_buf[0] = a; tmp_buf[1] = b ;
116: tmp_ind[0] = 0; tmp_ind[1] = 1;
117: VecNestSetSubVecs( Y,2,tmp_ind,tmp_buf );
118: VecView(Y,PETSC_VIEWER_STDOUT_WORLD);
120: VecDestroy(&c);
121: VecDestroy(&d);
122: VecDestroy(&e);
123: VecDestroy(&f);
124: VecDestroy(&g);
125: VecDestroy(&h);
126: VecDestroy(&a);
127: VecDestroy(&b);
128: VecDestroy(&X);
129: VecDestroy(&Y);
131: return(0);
132: }
134: int main( int argc, char **args )
135: {
136: PetscInitialize( &argc, &args,(char *)0, help );
138: test_vec_ops();
140: PetscFinalize();
141: return 0;
142: }