147c6ae99SBarry Smith #define PETSCDM_DLL 247c6ae99SBarry Smith 347c6ae99SBarry Smith /* 447c6ae99SBarry Smith Code for manipulating distributed regular arrays in parallel. 547c6ae99SBarry Smith */ 647c6ae99SBarry Smith 7e1589f56SBarry Smith #include "private/daimpl.h" /*I "petscdm.h" I*/ 847c6ae99SBarry Smith 947c6ae99SBarry Smith #undef __FUNCT__ 10*2dcb2ebcSBarry Smith #define __FUNCT__ "VecDuplicate_MPI_DA" 11*2dcb2ebcSBarry Smith PetscErrorCode PETSCDM_DLLEXPORT VecDuplicate_MPI_DA(Vec g,Vec* gg) 12*2dcb2ebcSBarry Smith { 13*2dcb2ebcSBarry Smith PetscErrorCode ierr; 14*2dcb2ebcSBarry Smith DM da; 15*2dcb2ebcSBarry Smith 16*2dcb2ebcSBarry Smith PetscFunctionBegin; 17*2dcb2ebcSBarry Smith ierr = PetscObjectQuery((PetscObject)g,"DMDA",(PetscObject*)&da);CHKERRQ(ierr); 18*2dcb2ebcSBarry Smith ierr = DMCreateGlobalVector(da,gg);CHKERRQ(ierr); 19*2dcb2ebcSBarry Smith PetscFunctionReturn(0); 20*2dcb2ebcSBarry Smith } 21*2dcb2ebcSBarry Smith 22*2dcb2ebcSBarry Smith 23*2dcb2ebcSBarry Smith #undef __FUNCT__ 24564755cdSBarry Smith #define __FUNCT__ "DMCreateGlobalVector_DA" 25564755cdSBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMCreateGlobalVector_DA(DM da,Vec* g) 2647c6ae99SBarry Smith { 2747c6ae99SBarry Smith PetscErrorCode ierr; 2847c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 2947c6ae99SBarry Smith 3047c6ae99SBarry Smith PetscFunctionBegin; 3147c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 3247c6ae99SBarry Smith PetscValidPointer(g,2); 3347c6ae99SBarry Smith ierr = VecCreate(((PetscObject)da)->comm,g);CHKERRQ(ierr); 3447c6ae99SBarry Smith ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr); 3547c6ae99SBarry Smith ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr); 36aa219208SBarry Smith ierr = PetscObjectCompose((PetscObject)*g,"DMDA",(PetscObject)da);CHKERRQ(ierr); 3747c6ae99SBarry Smith ierr = VecSetLocalToGlobalMapping(*g,dd->ltogmap);CHKERRQ(ierr); 3847c6ae99SBarry Smith ierr = VecSetLocalToGlobalMappingBlock(*g,dd->ltogmapb);CHKERRQ(ierr); 3947c6ae99SBarry Smith ierr = VecSetBlockSize(*g,dd->w);CHKERRQ(ierr); 4047c6ae99SBarry Smith ierr = VecSetOperation(*g,VECOP_VIEW,(void(*)(void))VecView_MPI_DA);CHKERRQ(ierr); 4147c6ae99SBarry Smith ierr = VecSetOperation(*g,VECOP_LOAD,(void(*)(void))VecLoad_Default_DA);CHKERRQ(ierr); 42*2dcb2ebcSBarry Smith ierr = VecSetOperation(*g,VECOP_DUPLICATE,(void(*)(void))VecDuplicate_MPI_DA);CHKERRQ(ierr); 4347c6ae99SBarry Smith PetscFunctionReturn(0); 4447c6ae99SBarry Smith } 4547c6ae99SBarry Smith 4647c6ae99SBarry Smith #undef __FUNCT__ 47aa219208SBarry Smith #define __FUNCT__ "DMDACreateNaturalVector" 4847c6ae99SBarry Smith /*@ 49aa219208SBarry Smith DMDACreateNaturalVector - Creates a parallel PETSc vector that 5047c6ae99SBarry Smith will hold vector values in the natural numbering, rather than in 51aa219208SBarry Smith the PETSc parallel numbering associated with the DMDA. 5247c6ae99SBarry Smith 53aa219208SBarry Smith Collective on DMDA 5447c6ae99SBarry Smith 5547c6ae99SBarry Smith Input Parameter: 5647c6ae99SBarry Smith . da - the distributed array 5747c6ae99SBarry Smith 5847c6ae99SBarry Smith Output Parameter: 5947c6ae99SBarry Smith . g - the distributed global vector 6047c6ae99SBarry Smith 6147c6ae99SBarry Smith Level: developer 6247c6ae99SBarry Smith 6347c6ae99SBarry Smith Note: 6447c6ae99SBarry Smith The output parameter, g, is a regular PETSc vector that should be destroyed 6547c6ae99SBarry Smith with a call to VecDestroy() when usage is finished. 6647c6ae99SBarry Smith 6747c6ae99SBarry Smith The number of local entries in the vector on each process is the same 68564755cdSBarry Smith as in a vector created with DMCreateGlobalVector(). 6947c6ae99SBarry Smith 7047c6ae99SBarry Smith .keywords: distributed array, create, global, distributed, vector 7147c6ae99SBarry Smith 72564755cdSBarry Smith .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(), 73aa219208SBarry Smith DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 74aa219208SBarry Smith DMGlobalToLocalEnd(), DMDALocalToGlobalBegin() 7547c6ae99SBarry Smith @*/ 76aa219208SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMDACreateNaturalVector(DM da,Vec* g) 7747c6ae99SBarry Smith { 7847c6ae99SBarry Smith PetscErrorCode ierr; 7947c6ae99SBarry Smith PetscInt cnt; 8047c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 8147c6ae99SBarry Smith 8247c6ae99SBarry Smith PetscFunctionBegin; 8347c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 8447c6ae99SBarry Smith PetscValidPointer(g,2); 8547c6ae99SBarry Smith if (dd->natural) { 8647c6ae99SBarry Smith ierr = PetscObjectGetReference((PetscObject)dd->natural,&cnt);CHKERRQ(ierr); 8747c6ae99SBarry Smith if (cnt == 1) { /* object is not currently used by anyone */ 8847c6ae99SBarry Smith ierr = PetscObjectReference((PetscObject)dd->natural);CHKERRQ(ierr); 8947c6ae99SBarry Smith *g = dd->natural; 9047c6ae99SBarry Smith } else { 9147c6ae99SBarry Smith ierr = VecDuplicate(dd->natural,g);CHKERRQ(ierr); 9247c6ae99SBarry Smith } 9347c6ae99SBarry Smith } else { /* create the first version of this guy */ 9447c6ae99SBarry Smith ierr = VecCreateMPI(((PetscObject)da)->comm,dd->Nlocal,PETSC_DETERMINE,g);CHKERRQ(ierr); 9547c6ae99SBarry Smith ierr = VecSetBlockSize(*g, dd->w);CHKERRQ(ierr); 9647c6ae99SBarry Smith ierr = PetscObjectReference((PetscObject)*g);CHKERRQ(ierr); 9747c6ae99SBarry Smith dd->natural = *g; 9847c6ae99SBarry Smith } 9947c6ae99SBarry Smith PetscFunctionReturn(0); 10047c6ae99SBarry Smith } 10147c6ae99SBarry Smith 10247c6ae99SBarry Smith 10347c6ae99SBarry Smith 104