xref: /petsc/src/dm/impls/da/dadist.c (revision 72fd0fbdbfed0156e00d46940d6a00aa32e1f56c)
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 
766976f2fSJacob Faibussowitsch static PetscErrorCode VecDuplicate_MPI_DA(Vec g, Vec *gg)
8d71ae5a4SJacob Faibussowitsch {
92dcb2ebcSBarry Smith   DM          da;
10077aedafSJed Brown   PetscLayout map;
112dcb2ebcSBarry Smith 
122dcb2ebcSBarry Smith   PetscFunctionBegin;
139566063dSJacob Faibussowitsch   PetscCall(VecGetDM(g, &da));
149566063dSJacob Faibussowitsch   PetscCall(DMCreateGlobalVector(da, gg));
159566063dSJacob Faibussowitsch   PetscCall(VecGetLayout(g, &map));
169566063dSJacob Faibussowitsch   PetscCall(VecSetLayout(*gg, map));
173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
182dcb2ebcSBarry Smith }
192dcb2ebcSBarry Smith 
20d71ae5a4SJacob Faibussowitsch PetscErrorCode DMCreateGlobalVector_DA(DM da, Vec *g)
21d71ae5a4SJacob Faibussowitsch {
2247c6ae99SBarry Smith   DM_DA *dd = (DM_DA *)da->data;
2347c6ae99SBarry Smith 
2447c6ae99SBarry Smith   PetscFunctionBegin;
2547c6ae99SBarry Smith   PetscValidHeaderSpecific(da, DM_CLASSID, 1);
264f572ea9SToby Isaac   PetscAssertPointer(g, 2);
279566063dSJacob Faibussowitsch   PetscCall(VecCreate(PetscObjectComm((PetscObject)da), g));
289566063dSJacob Faibussowitsch   PetscCall(VecSetSizes(*g, dd->Nlocal, PETSC_DETERMINE));
299566063dSJacob Faibussowitsch   PetscCall(VecSetBlockSize(*g, dd->w));
309566063dSJacob Faibussowitsch   PetscCall(VecSetType(*g, da->vectype));
3174427ab1SRichard Tran Mills   if (dd->Nlocal < da->bind_below) {
329566063dSJacob Faibussowitsch     PetscCall(VecSetBindingPropagates(*g, PETSC_TRUE));
339566063dSJacob Faibussowitsch     PetscCall(VecBindToCPU(*g, PETSC_TRUE));
3474427ab1SRichard Tran Mills   }
359566063dSJacob Faibussowitsch   PetscCall(VecSetDM(*g, da));
369566063dSJacob Faibussowitsch   PetscCall(VecSetLocalToGlobalMapping(*g, da->ltogmap));
379566063dSJacob Faibussowitsch   PetscCall(VecSetOperation(*g, VECOP_VIEW, (void (*)(void))VecView_MPI_DA));
389566063dSJacob Faibussowitsch   PetscCall(VecSetOperation(*g, VECOP_LOAD, (void (*)(void))VecLoad_Default_DA));
399566063dSJacob Faibussowitsch   PetscCall(VecSetOperation(*g, VECOP_DUPLICATE, (void (*)(void))VecDuplicate_MPI_DA));
403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4147c6ae99SBarry Smith }
4247c6ae99SBarry Smith 
4347c6ae99SBarry Smith /*@
44aa219208SBarry Smith   DMDACreateNaturalVector - Creates a parallel PETSc vector that
4547c6ae99SBarry Smith   will hold vector values in the natural numbering, rather than in
46dce8aebaSBarry Smith   the PETSc parallel numbering associated with the `DMDA`.
4747c6ae99SBarry Smith 
483ca8f39cSDave May   Collective
4947c6ae99SBarry Smith 
5047c6ae99SBarry Smith   Input Parameter:
51*72fd0fbdSBarry Smith . da - the `DMDA`
5247c6ae99SBarry Smith 
5347c6ae99SBarry Smith   Output Parameter:
5447c6ae99SBarry Smith . g - the distributed global vector
5547c6ae99SBarry Smith 
5612b4a537SBarry Smith   Level: advanced
5747c6ae99SBarry Smith 
58dce8aebaSBarry Smith   Notes:
5912b4a537SBarry 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
6012b4a537SBarry 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).
6112b4a537SBarry Smith 
6212b4a537SBarry Smith   The output parameter, `g`, is a regular `Vec` that should be destroyed
63dce8aebaSBarry Smith   with a call to `VecDestroy()` when usage is finished.
6447c6ae99SBarry Smith 
6547c6ae99SBarry Smith   The number of local entries in the vector on each process is the same
66dce8aebaSBarry Smith   as in a vector created with `DMCreateGlobalVector()`.
6747c6ae99SBarry Smith 
6812b4a537SBarry Smith .seealso: [](sec_struct), `DM`, `DMDA`, `DMDAGlobalToNaturalBegin()`, `DMDAGlobalToNaturalEnd()`, `DMDANaturalToGlobalBegin()`, `DMDANaturalToGlobalEnd()`,
6912b4a537SBarry Smith           `DMCreateLocalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`, `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMGlobalToLocalBegin()`,
70db781477SPatrick Sanan           `DMGlobalToLocalEnd()`, `DMLocalToGlobalBegin()`
7147c6ae99SBarry Smith @*/
72d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDACreateNaturalVector(DM da, Vec *g)
73d71ae5a4SJacob Faibussowitsch {
7447c6ae99SBarry Smith   PetscInt cnt;
7547c6ae99SBarry Smith   DM_DA   *dd = (DM_DA *)da->data;
7647c6ae99SBarry Smith 
7747c6ae99SBarry Smith   PetscFunctionBegin;
78a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
794f572ea9SToby Isaac   PetscAssertPointer(g, 2);
8047c6ae99SBarry Smith   if (dd->natural) {
819566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetReference((PetscObject)dd->natural, &cnt));
8247c6ae99SBarry Smith     if (cnt == 1) { /* object is not currently used by anyone */
839566063dSJacob Faibussowitsch       PetscCall(PetscObjectReference((PetscObject)dd->natural));
8447c6ae99SBarry Smith       *g = dd->natural;
851baa6e33SBarry Smith     } else PetscCall(VecDuplicate(dd->natural, g));
8647c6ae99SBarry Smith   } else { /* create the first version of this guy */
879566063dSJacob Faibussowitsch     PetscCall(VecCreate(PetscObjectComm((PetscObject)da), g));
889566063dSJacob Faibussowitsch     PetscCall(VecSetSizes(*g, dd->Nlocal, PETSC_DETERMINE));
899566063dSJacob Faibussowitsch     PetscCall(VecSetBlockSize(*g, dd->w));
909566063dSJacob Faibussowitsch     PetscCall(VecSetType(*g, da->vectype));
919566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)*g));
9247c6ae99SBarry Smith     dd->natural = *g;
9347c6ae99SBarry Smith   }
943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9547c6ae99SBarry Smith }
96