xref: /petsc/src/dm/impls/da/dadist.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
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 
8*d71ae5a4SJacob Faibussowitsch PetscErrorCode VecDuplicate_MPI_DA(Vec g, Vec *gg)
9*d71ae5a4SJacob 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 
21*d71ae5a4SJacob Faibussowitsch PetscErrorCode DMCreateGlobalVector_DA(DM da, Vec *g)
22*d71ae5a4SJacob 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
47aa219208SBarry 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 
5947c6ae99SBarry Smith    Note:
6047c6ae99SBarry Smith    The output parameter, g, is a regular PETSc vector that should be destroyed
6147c6ae99SBarry 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
64564755cdSBarry Smith    as in a vector created with DMCreateGlobalVector().
6547c6ae99SBarry Smith 
66db781477SPatrick Sanan .seealso: `DMCreateLocalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`,
67db781477SPatrick Sanan           `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMGlobalToLocalBegin()`,
68db781477SPatrick Sanan           `DMGlobalToLocalEnd()`, `DMLocalToGlobalBegin()`
6947c6ae99SBarry Smith @*/
70*d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDACreateNaturalVector(DM da, Vec *g)
71*d71ae5a4SJacob 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