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: `DM`, `DMDA`, `DMDAGlobalToNaturalEnd()`, `DMLocalToGlobalBegin()`, `DMDACreate2d()`,
 27:           `DMGlobalToLocalBegin()`, `DMGlobalToLocalEnd()`, `DMDACreateNaturalVector()`
 28: @*/
 29: PetscErrorCode DMDAGlobalToNaturalAllCreate(DM da, VecScatter *scatter)
 30: {
 31:   PetscInt N;
 32:   IS       from, to;
 33:   Vec      tmplocal, global;
 34:   AO       ao;
 35:   DM_DA   *dd = (DM_DA *)da->data;

 39:   DMDAGetAO(da, &ao);

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

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

 60:    Collective on da

 62:    Input Parameter:
 63: .  da - the distributed array context

 65:    Output Parameter:
 66: .  scatter - the scatter context

 68:    Level: advanced

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

 83:   DMDAGetAO(da, &ao);

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