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 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 @*/ 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