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