Actual source code: dagtona.c

      2: /*
      3:      Tools to help solve the coarse grid problem redundantly.
      4:   Provides two scatter contexts that (1) map from the usual global vector
      5:   to all processors the entire vector in NATURAL numbering and (2)
      6:   from the entire vector on each processor in natural numbering extracts
      7:   out this processors piece in GLOBAL numbering
      8: */

     10: #include <petsc/private/dmdaimpl.h>

     12: /*@
     13:    DMDAGlobalToNaturalAllCreate - Creates a scatter context that maps from the
     14:      global vector the entire vector to each processor in natural numbering

     16:    Collective on da

     18:    Input Parameter:
     19: .  da - the distributed array context

     21:    Output Parameter:
     22: .  scatter - the scatter context

     24:    Level: advanced

     26: .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
     27:           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
     28: @*/
     29: PetscErrorCode  DMDAGlobalToNaturalAllCreate(DM da,VecScatter *scatter)
     30: {
     32:   PetscInt       N;
     33:   IS             from,to;
     34:   Vec            tmplocal,global;
     35:   AO             ao;
     36:   DM_DA          *dd = (DM_DA*)da->data;

     41:   DMDAGetAO(da,&ao);

     43:   /* create the scatter context */
     44:   VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,dd->Nlocal,PETSC_DETERMINE,NULL,&global);
     45:   VecGetSize(global,&N);
     46:   ISCreateStride(PetscObjectComm((PetscObject)da),N,0,1,&to);
     47:   AOPetscToApplicationIS(ao,to);
     48:   ISCreateStride(PetscObjectComm((PetscObject)da),N,0,1,&from);
     49:   VecCreateSeqWithArray(PETSC_COMM_SELF,dd->w,N,NULL,&tmplocal);
     50:   VecScatterCreate(global,from,tmplocal,to,scatter);
     51:   VecDestroy(&tmplocal);
     52:   VecDestroy(&global);
     53:   ISDestroy(&from);
     54:   ISDestroy(&to);
     55:   return(0);
     56: }

     58: /*@
     59:    DMDANaturalAllToGlobalCreate - Creates a scatter context that maps from a copy
     60:      of the entire vector on each processor to its local part in the global vector.

     62:    Collective on da

     64:    Input Parameter:
     65: .  da - the distributed array context

     67:    Output Parameter:
     68: .  scatter - the scatter context

     70:    Level: advanced

     72: .seealso: DMDAGlobalToNaturalEnd(), DMLocalToGlobalBegin(), DMDACreate2d(),
     73:           DMGlobalToLocalBegin(), DMGlobalToLocalEnd(), DMDACreateNaturalVector()
     74: @*/
     75: PetscErrorCode  DMDANaturalAllToGlobalCreate(DM da,VecScatter *scatter)
     76: {
     78:   DM_DA          *dd = (DM_DA*)da->data;
     79:   PetscInt       M,m = dd->Nlocal,start;
     80:   IS             from,to;
     81:   Vec            tmplocal,global;
     82:   AO             ao;

     87:   DMDAGetAO(da,&ao);

     89:   /* create the scatter context */
     90:   MPIU_Allreduce(&m,&M,1,MPIU_INT,MPI_SUM,PetscObjectComm((PetscObject)da));
     91:   VecCreateMPIWithArray(PetscObjectComm((PetscObject)da),dd->w,m,PETSC_DETERMINE,NULL,&global);
     92:   VecGetOwnershipRange(global,&start,NULL);
     93:   ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&from);
     94:   AOPetscToApplicationIS(ao,from);
     95:   ISCreateStride(PetscObjectComm((PetscObject)da),m,start,1,&to);
     96:   VecCreateSeqWithArray(PETSC_COMM_SELF,dd->w,M,NULL,&tmplocal);
     97:   VecScatterCreate(tmplocal,from,global,to,scatter);
     98:   VecDestroy(&tmplocal);
     99:   VecDestroy(&global);
    100:   ISDestroy(&from);
    101:   ISDestroy(&to);
    102:   return(0);
    103: }