xref: /petsc/src/dm/impls/da/dadist.c (revision dce8aeba1c9b69b19f651c53d8a6b674bd7e9cbd)
147c6ae99SBarry Smith 
247c6ae99SBarry Smith /*
347c6ae99SBarry Smith   Code for manipulating distributed regular arrays in parallel.
447c6ae99SBarry Smith */
547c6ae99SBarry Smith 
6af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h> /*I   "petscdmda.h"   I*/
747c6ae99SBarry Smith 
8d71ae5a4SJacob Faibussowitsch PetscErrorCode VecDuplicate_MPI_DA(Vec g, Vec *gg)
9d71ae5a4SJacob Faibussowitsch {
102dcb2ebcSBarry Smith   DM          da;
11077aedafSJed Brown   PetscLayout map;
122dcb2ebcSBarry Smith 
132dcb2ebcSBarry Smith   PetscFunctionBegin;
149566063dSJacob Faibussowitsch   PetscCall(VecGetDM(g, &da));
159566063dSJacob Faibussowitsch   PetscCall(DMCreateGlobalVector(da, gg));
169566063dSJacob Faibussowitsch   PetscCall(VecGetLayout(g, &map));
179566063dSJacob Faibussowitsch   PetscCall(VecSetLayout(*gg, map));
182dcb2ebcSBarry Smith   PetscFunctionReturn(0);
192dcb2ebcSBarry Smith }
202dcb2ebcSBarry Smith 
21d71ae5a4SJacob Faibussowitsch PetscErrorCode DMCreateGlobalVector_DA(DM da, Vec *g)
22d71ae5a4SJacob Faibussowitsch {
2347c6ae99SBarry Smith   DM_DA *dd = (DM_DA *)da->data;
2447c6ae99SBarry Smith 
2547c6ae99SBarry Smith   PetscFunctionBegin;
2647c6ae99SBarry Smith   PetscValidHeaderSpecific(da, DM_CLASSID, 1);
2747c6ae99SBarry Smith   PetscValidPointer(g, 2);
289566063dSJacob Faibussowitsch   PetscCall(VecCreate(PetscObjectComm((PetscObject)da), g));
299566063dSJacob Faibussowitsch   PetscCall(VecSetSizes(*g, dd->Nlocal, PETSC_DETERMINE));
309566063dSJacob Faibussowitsch   PetscCall(VecSetBlockSize(*g, dd->w));
319566063dSJacob Faibussowitsch   PetscCall(VecSetType(*g, da->vectype));
3274427ab1SRichard Tran Mills   if (dd->Nlocal < da->bind_below) {
339566063dSJacob Faibussowitsch     PetscCall(VecSetBindingPropagates(*g, PETSC_TRUE));
349566063dSJacob Faibussowitsch     PetscCall(VecBindToCPU(*g, PETSC_TRUE));
3574427ab1SRichard Tran Mills   }
369566063dSJacob Faibussowitsch   PetscCall(VecSetDM(*g, da));
379566063dSJacob Faibussowitsch   PetscCall(VecSetLocalToGlobalMapping(*g, da->ltogmap));
389566063dSJacob Faibussowitsch   PetscCall(VecSetOperation(*g, VECOP_VIEW, (void (*)(void))VecView_MPI_DA));
399566063dSJacob Faibussowitsch   PetscCall(VecSetOperation(*g, VECOP_LOAD, (void (*)(void))VecLoad_Default_DA));
409566063dSJacob Faibussowitsch   PetscCall(VecSetOperation(*g, VECOP_DUPLICATE, (void (*)(void))VecDuplicate_MPI_DA));
4147c6ae99SBarry Smith   PetscFunctionReturn(0);
4247c6ae99SBarry Smith }
4347c6ae99SBarry Smith 
4447c6ae99SBarry Smith /*@
45aa219208SBarry Smith    DMDACreateNaturalVector - Creates a parallel PETSc vector that
4647c6ae99SBarry Smith    will hold vector values in the natural numbering, rather than in
47*dce8aebaSBarry Smith    the PETSc parallel numbering associated with the `DMDA`.
4847c6ae99SBarry Smith 
493ca8f39cSDave May    Collective
5047c6ae99SBarry Smith 
5147c6ae99SBarry Smith    Input Parameter:
5247c6ae99SBarry Smith .  da - the distributed array
5347c6ae99SBarry Smith 
5447c6ae99SBarry Smith    Output Parameter:
5547c6ae99SBarry Smith .  g - the distributed global vector
5647c6ae99SBarry Smith 
5747c6ae99SBarry Smith    Level: developer
5847c6ae99SBarry Smith 
59*dce8aebaSBarry Smith    Notes:
6047c6ae99SBarry Smith    The output parameter, g, is a regular PETSc vector that should be destroyed
61*dce8aebaSBarry Smith    with a call to `VecDestroy()` when usage is finished.
6247c6ae99SBarry Smith 
6347c6ae99SBarry Smith    The number of local entries in the vector on each process is the same
64*dce8aebaSBarry Smith    as in a vector created with `DMCreateGlobalVector()`.
6547c6ae99SBarry Smith 
66*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMCreateLocalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`,
67db781477SPatrick Sanan           `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMGlobalToLocalBegin()`,
68db781477SPatrick Sanan           `DMGlobalToLocalEnd()`, `DMLocalToGlobalBegin()`
6947c6ae99SBarry Smith @*/
70d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDACreateNaturalVector(DM da, Vec *g)
71d71ae5a4SJacob Faibussowitsch {
7247c6ae99SBarry Smith   PetscInt cnt;
7347c6ae99SBarry Smith   DM_DA   *dd = (DM_DA *)da->data;
7447c6ae99SBarry Smith 
7547c6ae99SBarry Smith   PetscFunctionBegin;
76a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
7747c6ae99SBarry Smith   PetscValidPointer(g, 2);
7847c6ae99SBarry Smith   if (dd->natural) {
799566063dSJacob Faibussowitsch     PetscCall(PetscObjectGetReference((PetscObject)dd->natural, &cnt));
8047c6ae99SBarry Smith     if (cnt == 1) { /* object is not currently used by anyone */
819566063dSJacob Faibussowitsch       PetscCall(PetscObjectReference((PetscObject)dd->natural));
8247c6ae99SBarry Smith       *g = dd->natural;
831baa6e33SBarry Smith     } else PetscCall(VecDuplicate(dd->natural, g));
8447c6ae99SBarry Smith   } else { /* create the first version of this guy */
859566063dSJacob Faibussowitsch     PetscCall(VecCreate(PetscObjectComm((PetscObject)da), g));
869566063dSJacob Faibussowitsch     PetscCall(VecSetSizes(*g, dd->Nlocal, PETSC_DETERMINE));
879566063dSJacob Faibussowitsch     PetscCall(VecSetBlockSize(*g, dd->w));
889566063dSJacob Faibussowitsch     PetscCall(VecSetType(*g, da->vectype));
899566063dSJacob Faibussowitsch     PetscCall(PetscObjectReference((PetscObject)*g));
908865f1eaSKarl Rupp 
9147c6ae99SBarry Smith     dd->natural = *g;
9247c6ae99SBarry Smith   }
9347c6ae99SBarry Smith   PetscFunctionReturn(0);
9447c6ae99SBarry Smith }
95