xref: /petsc/src/dm/impls/da/dadist.c (revision 2286efddd54511ab18e8e2adb1e023c4bf8f0b92)
147c6ae99SBarry Smith /*
247c6ae99SBarry Smith   Code for manipulating distributed regular arrays in parallel.
347c6ae99SBarry Smith */
447c6ae99SBarry Smith 
5af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h> /*I   "petscdmda.h"   I*/
647c6ae99SBarry Smith 
DMCreateGlobalVector_DA(DM da,Vec * g)7d71ae5a4SJacob Faibussowitsch PetscErrorCode DMCreateGlobalVector_DA(DM da, Vec *g)
8d71ae5a4SJacob Faibussowitsch {
947c6ae99SBarry Smith   DM_DA *dd = (DM_DA *)da->data;
1047c6ae99SBarry Smith 
1147c6ae99SBarry Smith   PetscFunctionBegin;
1247c6ae99SBarry Smith   PetscValidHeaderSpecific(da, DM_CLASSID, 1);
134f572ea9SToby Isaac   PetscAssertPointer(g, 2);
149566063dSJacob Faibussowitsch   PetscCall(VecCreate(PetscObjectComm((PetscObject)da), g));
159566063dSJacob Faibussowitsch   PetscCall(VecSetSizes(*g, dd->Nlocal, PETSC_DETERMINE));
169566063dSJacob Faibussowitsch   PetscCall(VecSetBlockSize(*g, dd->w));
179566063dSJacob Faibussowitsch   PetscCall(VecSetType(*g, da->vectype));
1874427ab1SRichard Tran Mills   if (dd->Nlocal < da->bind_below) {
199566063dSJacob Faibussowitsch     PetscCall(VecSetBindingPropagates(*g, PETSC_TRUE));
209566063dSJacob Faibussowitsch     PetscCall(VecBindToCPU(*g, PETSC_TRUE));
2174427ab1SRichard Tran Mills   }
229566063dSJacob Faibussowitsch   PetscCall(VecSetDM(*g, da));
239566063dSJacob Faibussowitsch   PetscCall(VecSetLocalToGlobalMapping(*g, da->ltogmap));
24*57d50842SBarry Smith   PetscCall(VecSetOperation(*g, VECOP_VIEW, (PetscErrorCodeFn *)VecView_MPI_DA));
25*57d50842SBarry Smith   PetscCall(VecSetOperation(*g, VECOP_LOAD, (PetscErrorCodeFn *)VecLoad_Default_DA));
263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2747c6ae99SBarry Smith }
2847c6ae99SBarry Smith 
2947c6ae99SBarry Smith /*@
30aa219208SBarry Smith   DMDACreateNaturalVector - Creates a parallel PETSc vector that
3147c6ae99SBarry Smith   will hold vector values in the natural numbering, rather than in
32dce8aebaSBarry Smith   the PETSc parallel numbering associated with the `DMDA`.
3347c6ae99SBarry Smith 
343ca8f39cSDave May   Collective
3547c6ae99SBarry Smith 
3647c6ae99SBarry Smith   Input Parameter:
3772fd0fbdSBarry Smith . da - the `DMDA`
3847c6ae99SBarry Smith 
3947c6ae99SBarry Smith   Output Parameter:
4047c6ae99SBarry Smith . g - the distributed global vector
4147c6ae99SBarry Smith 
4212b4a537SBarry Smith   Level: advanced
4347c6ae99SBarry Smith 
44dce8aebaSBarry Smith   Notes:
4512b4a537SBarry Smith   The natural numbering is a number of grid nodes that starts with, in three dimensions, with (0,0,0), (1,0,0), (2,0,0), ..., (m-1,0,0) followed by
4612b4a537SBarry Smith   (0,1,0), (1,1,0), (2,1,0), ..., (m,1,0) etc up to (0,n-1,p-1), (1,n-1,p-1), (2,n-1,p-1), ..., (m-1,n-1,p-1).
4712b4a537SBarry Smith 
4812b4a537SBarry Smith   The output parameter, `g`, is a regular `Vec` that should be destroyed
49dce8aebaSBarry Smith   with a call to `VecDestroy()` when usage is finished.
5047c6ae99SBarry Smith 
5147c6ae99SBarry Smith   The number of local entries in the vector on each process is the same
52dce8aebaSBarry Smith   as in a vector created with `DMCreateGlobalVector()`.
5347c6ae99SBarry Smith 
5412b4a537SBarry Smith .seealso: [](sec_struct), `DM`, `DMDA`, `DMDAGlobalToNaturalBegin()`, `DMDAGlobalToNaturalEnd()`, `DMDANaturalToGlobalBegin()`, `DMDANaturalToGlobalEnd()`,
5512b4a537SBarry Smith           `DMCreateLocalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`, `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMGlobalToLocalBegin()`,
56db781477SPatrick Sanan           `DMGlobalToLocalEnd()`, `DMLocalToGlobalBegin()`
5747c6ae99SBarry Smith @*/
DMDACreateNaturalVector(DM da,Vec * g)58d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDACreateNaturalVector(DM da, Vec *g)
59d71ae5a4SJacob Faibussowitsch {
6047c6ae99SBarry Smith   PetscInt cnt;
6147c6ae99SBarry Smith   DM_DA   *dd = (DM_DA *)da->data;
6247c6ae99SBarry Smith 
6347c6ae99SBarry Smith   PetscFunctionBegin;
64a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
654f572ea9SToby Isaac   PetscAssertPointer(g, 2);
6647c6ae99SBarry Smith   if (dd->natural) {
679566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetReference((PetscObject)dd->natural, &cnt));
6847c6ae99SBarry Smith     if (cnt == 1) { /* object is not currently used by anyone */
699566063dSJacob Faibussowitsch       PetscCall(PetscObjectReference((PetscObject)dd->natural));
7047c6ae99SBarry Smith       *g = dd->natural;
711baa6e33SBarry Smith     } else PetscCall(VecDuplicate(dd->natural, g));
7247c6ae99SBarry Smith   } else { /* create the first version of this guy */
739566063dSJacob Faibussowitsch     PetscCall(VecCreate(PetscObjectComm((PetscObject)da), g));
749566063dSJacob Faibussowitsch     PetscCall(VecSetSizes(*g, dd->Nlocal, PETSC_DETERMINE));
759566063dSJacob Faibussowitsch     PetscCall(VecSetBlockSize(*g, dd->w));
769566063dSJacob Faibussowitsch     PetscCall(VecSetType(*g, da->vectype));
779566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)*g));
7847c6ae99SBarry Smith     dd->natural = *g;
7947c6ae99SBarry Smith   }
803ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8147c6ae99SBarry Smith }
82