Actual source code: dadist.c


  2: /*
  3:   Code for manipulating distributed regular arrays in parallel.
  4: */

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

  8: PetscErrorCode VecDuplicate_MPI_DA(Vec g, Vec *gg)
  9: {
 10:   DM          da;
 11:   PetscLayout map;

 13:   VecGetDM(g, &da);
 14:   DMCreateGlobalVector(da, gg);
 15:   VecGetLayout(g, &map);
 16:   VecSetLayout(*gg, map);
 17:   return 0;
 18: }

 20: PetscErrorCode DMCreateGlobalVector_DA(DM da, Vec *g)
 21: {
 22:   DM_DA *dd = (DM_DA *)da->data;

 26:   VecCreate(PetscObjectComm((PetscObject)da), g);
 27:   VecSetSizes(*g, dd->Nlocal, PETSC_DETERMINE);
 28:   VecSetBlockSize(*g, dd->w);
 29:   VecSetType(*g, da->vectype);
 30:   if (dd->Nlocal < da->bind_below) {
 31:     VecSetBindingPropagates(*g, PETSC_TRUE);
 32:     VecBindToCPU(*g, PETSC_TRUE);
 33:   }
 34:   VecSetDM(*g, da);
 35:   VecSetLocalToGlobalMapping(*g, da->ltogmap);
 36:   VecSetOperation(*g, VECOP_VIEW, (void (*)(void))VecView_MPI_DA);
 37:   VecSetOperation(*g, VECOP_LOAD, (void (*)(void))VecLoad_Default_DA);
 38:   VecSetOperation(*g, VECOP_DUPLICATE, (void (*)(void))VecDuplicate_MPI_DA);
 39:   return 0;
 40: }

 42: /*@
 43:    DMDACreateNaturalVector - Creates a parallel PETSc vector that
 44:    will hold vector values in the natural numbering, rather than in
 45:    the PETSc parallel numbering associated with the `DMDA`.

 47:    Collective

 49:    Input Parameter:
 50: .  da - the distributed array

 52:    Output Parameter:
 53: .  g - the distributed global vector

 55:    Level: developer

 57:    Notes:
 58:    The output parameter, g, is a regular PETSc vector that should be destroyed
 59:    with a call to `VecDestroy()` when usage is finished.

 61:    The number of local entries in the vector on each process is the same
 62:    as in a vector created with `DMCreateGlobalVector()`.

 64: .seealso: `DM`, `DMDA`, `DMCreateLocalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`,
 65:           `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMGlobalToLocalBegin()`,
 66:           `DMGlobalToLocalEnd()`, `DMLocalToGlobalBegin()`
 67: @*/
 68: PetscErrorCode DMDACreateNaturalVector(DM da, Vec *g)
 69: {
 70:   PetscInt cnt;
 71:   DM_DA   *dd = (DM_DA *)da->data;

 75:   if (dd->natural) {
 76:     PetscObjectGetReference((PetscObject)dd->natural, &cnt);
 77:     if (cnt == 1) { /* object is not currently used by anyone */
 78:       PetscObjectReference((PetscObject)dd->natural);
 79:       *g = dd->natural;
 80:     } else VecDuplicate(dd->natural, g);
 81:   } else { /* create the first version of this guy */
 82:     VecCreate(PetscObjectComm((PetscObject)da), g);
 83:     VecSetSizes(*g, dd->Nlocal, PETSC_DETERMINE);
 84:     VecSetBlockSize(*g, dd->w);
 85:     VecSetType(*g, da->vectype);
 86:     PetscObjectReference((PetscObject)*g);

 88:     dd->natural = *g;
 89:   }
 90:   return 0;
 91: }