Actual source code: vecmpitoseq.c

  1: #define PETSCVEC_DLL

 3:  #include vecimpl.h

  7: /*@C
  8:       VecScatterCreateToAll - Creates a scatter context that copies all 
  9:           vector values to each processor

 11:   Collective

 13:   Input Parameter: 
 14: .  vin  - input MPIVEC

 16:   Output Parameter:
 17: +  ctx - scatter context
 18: -  vout - output SEQVEC that is large enough to scatter into

 20:   Level: intermediate

 22:    Usage:
 23: $        VecScatterCreateToAll(vin,&ctx,&vout);
 24: $
 25: $        // scatter as many times as you need 
 26: $        VecScatterBegin(vin,vout,INSERT_VALUES,SCATTER_FORWARD,ctx);
 27: $        VecScatterEnd(vin,vout,INSERT_VALUES,SCATTER_FORWARD,ctx);
 28: $
 29: $        // destroy scatter context and local vector when no longer needed
 30: $        VecScatterDestroy(ctx);
 31: $        VecDestroy(vout);

 33: .seealso VecScatterCreate(), VecScatterCreateToZero(), VecScatterBegin(), VecScatterEnd()

 35: @*/
 36: PetscErrorCode PETSCVEC_DLLEXPORT VecScatterCreateToAll(Vec vin,VecScatter *ctx,Vec *vout)
 37: {

 40:   PetscInt       N;
 41:   IS             is;


 49:   /* Create seq vec on each proc, with the same size of the original mpi vec */
 50:   VecGetSize(vin,&N);
 51:   VecCreateSeq(PETSC_COMM_SELF,N,vout);
 52:   /* Create the VecScatter ctx with the communication info */
 53:   ISCreateStride(PETSC_COMM_SELF,N,0,1,&is);
 54:   VecScatterCreate(vin,is,*vout,is,ctx);
 55:   ISDestroy(is);
 56:   return(0);
 57: }


 62: /*@C
 63:       VecScatterCreateToZero - Creates a scatter context that copies all 
 64:           vector values to a vector on the zeroth processor

 66:   Collective

 68:   Input Parameter: 
 69: .  vin  - input MPIVEC

 71:   Output Parameter:
 72: +  ctx - scatter context
 73: -  vout - output MPIVEC that is large enough to scatter into on processor 0 and
 74:           of length zero on all other processors

 76:   Level: intermediate

 78:    Usage:
 79: $        VecScatterCreateToZero(vin,&ctx,&vout);
 80: $
 81: $        // scatter as many times as you need 
 82: $        VecScatterBegin(vin,vout,INSERT_VALUES,SCATTER_FORWARD,ctx);
 83: $        VecScatterEnd(vin,vout,INSERT_VALUES,SCATTER_FORWARD,ctx);
 84: $
 85: $        // destroy scatter context and local vector when no longer needed
 86: $        VecScatterDestroy(ctx);
 87: $        VecDestroy(vout);

 89:    Note: If you want to treat the vector on processor zero as a sequential vector call
 90:          VecGetArray() on it and create a sequential vector with VecCreateSeqWithArray().

 92: .seealso VecScatterCreate(), VecScatterCreateToAll(), VecScatterBegin(), VecScatterEnd()

 94: @*/
 95: PetscErrorCode PETSCVEC_DLLEXPORT VecScatterCreateToZero(Vec vin,VecScatter *ctx,Vec *vout)
 96: {

 99:   PetscInt       N;
100:   PetscMPIInt    rank;
101:   IS             is;


109:   /* Create seq vec on each proc, with the same size of the original mpi vec */
110:   VecGetSize(vin,&N);
111:   MPI_Comm_rank(vin->comm,&rank);
112:   if (!rank) {
113:     VecCreateMPI(vin->comm,N,N,vout);
114:   } else {
115:     VecCreateMPI(vin->comm,0,N,vout);
116:   }
117:   /* Create the VecScatter ctx with the communication info */
118:   ISCreateStride(PETSC_COMM_SELF,N,0,1,&is);
119:   VecScatterCreate(vin,is,*vout,is,ctx);
120:   ISDestroy(is);
121:   return(0);
122: }