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: }