Actual source code: dadist.c

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

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

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

 12:   PetscFunctionBegin;
 13:   PetscCall(VecGetDM(g, &da));
 14:   PetscCall(DMCreateGlobalVector(da, gg));
 15:   PetscCall(VecGetLayout(g, &map));
 16:   PetscCall(VecSetLayout(*gg, map));
 17:   PetscFunctionReturn(PETSC_SUCCESS);
 18: }

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

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

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

 48:   Collective

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

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

 56:   Level: developer

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

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

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

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

 90:     dd->natural = *g;
 91:   }
 92:   PetscFunctionReturn(PETSC_SUCCESS);
 93: }