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