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 87087cfbeSBarry Smith PetscErrorCode VecDuplicate_MPI_DA(Vec g,Vec *gg) 92dcb2ebcSBarry Smith { 102dcb2ebcSBarry Smith PetscErrorCode ierr; 112dcb2ebcSBarry Smith DM da; 12077aedafSJed Brown PetscLayout map; 132dcb2ebcSBarry Smith 142dcb2ebcSBarry Smith PetscFunctionBegin; 15c688c046SMatthew G Knepley ierr = VecGetDM(g, &da);CHKERRQ(ierr); 162dcb2ebcSBarry Smith ierr = DMCreateGlobalVector(da,gg);CHKERRQ(ierr); 17077aedafSJed Brown ierr = VecGetLayout(g,&map);CHKERRQ(ierr); 18077aedafSJed Brown ierr = VecSetLayout(*gg,map);CHKERRQ(ierr); 192dcb2ebcSBarry Smith PetscFunctionReturn(0); 202dcb2ebcSBarry Smith } 212dcb2ebcSBarry Smith 227087cfbeSBarry Smith PetscErrorCode DMCreateGlobalVector_DA(DM da,Vec *g) 2347c6ae99SBarry Smith { 2447c6ae99SBarry Smith PetscErrorCode ierr; 2547c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 2647c6ae99SBarry Smith 2747c6ae99SBarry Smith PetscFunctionBegin; 2847c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 2947c6ae99SBarry Smith PetscValidPointer(g,2); 30ce94432eSBarry Smith ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr); 3147c6ae99SBarry Smith ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr); 32401ddaa8SBarry Smith ierr = VecSetBlockSize(*g,dd->w);CHKERRQ(ierr); 3347c6ae99SBarry Smith ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr); 34*74427ab1SRichard Tran Mills if (dd->Nlocal < da->bind_below) { 35*74427ab1SRichard Tran Mills ierr = VecSetBindingPropagates(*g,PETSC_TRUE);CHKERRQ(ierr); 36*74427ab1SRichard Tran Mills ierr = VecBindToCPU(*g,PETSC_TRUE);CHKERRQ(ierr); 37*74427ab1SRichard Tran Mills } 38c688c046SMatthew G Knepley ierr = VecSetDM(*g, da);CHKERRQ(ierr); 391411c6eeSJed Brown ierr = VecSetLocalToGlobalMapping(*g,da->ltogmap);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); 422dcb2ebcSBarry Smith ierr = VecSetOperation(*g,VECOP_DUPLICATE,(void (*)(void))VecDuplicate_MPI_DA);CHKERRQ(ierr); 4347c6ae99SBarry Smith PetscFunctionReturn(0); 4447c6ae99SBarry Smith } 4547c6ae99SBarry Smith 4647c6ae99SBarry Smith /*@ 47aa219208SBarry Smith DMDACreateNaturalVector - Creates a parallel PETSc vector that 4847c6ae99SBarry Smith will hold vector values in the natural numbering, rather than in 49aa219208SBarry Smith the PETSc parallel numbering associated with the DMDA. 5047c6ae99SBarry Smith 513ca8f39cSDave May Collective 5247c6ae99SBarry Smith 5347c6ae99SBarry Smith Input Parameter: 5447c6ae99SBarry Smith . da - the distributed array 5547c6ae99SBarry Smith 5647c6ae99SBarry Smith Output Parameter: 5747c6ae99SBarry Smith . g - the distributed global vector 5847c6ae99SBarry Smith 5947c6ae99SBarry Smith Level: developer 6047c6ae99SBarry Smith 6147c6ae99SBarry Smith Note: 6247c6ae99SBarry Smith The output parameter, g, is a regular PETSc vector that should be destroyed 6347c6ae99SBarry Smith with a call to VecDestroy() when usage is finished. 6447c6ae99SBarry Smith 6547c6ae99SBarry Smith The number of local entries in the vector on each process is the same 66564755cdSBarry Smith as in a vector created with DMCreateGlobalVector(). 6747c6ae99SBarry Smith 68564755cdSBarry Smith .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(), 69aa219208SBarry Smith DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 709df75925SJed Brown DMGlobalToLocalEnd(), DMLocalToGlobalBegin() 7147c6ae99SBarry Smith @*/ 727087cfbeSBarry Smith PetscErrorCode DMDACreateNaturalVector(DM da,Vec *g) 7347c6ae99SBarry Smith { 7447c6ae99SBarry Smith PetscErrorCode ierr; 7547c6ae99SBarry Smith PetscInt cnt; 7647c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 7747c6ae99SBarry Smith 7847c6ae99SBarry Smith PetscFunctionBegin; 79a9a02de4SBarry Smith PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 8047c6ae99SBarry Smith PetscValidPointer(g,2); 8147c6ae99SBarry Smith if (dd->natural) { 8247c6ae99SBarry Smith ierr = PetscObjectGetReference((PetscObject)dd->natural,&cnt);CHKERRQ(ierr); 8347c6ae99SBarry Smith if (cnt == 1) { /* object is not currently used by anyone */ 8447c6ae99SBarry Smith ierr = PetscObjectReference((PetscObject)dd->natural);CHKERRQ(ierr); 8547c6ae99SBarry Smith *g = dd->natural; 8647c6ae99SBarry Smith } else { 8747c6ae99SBarry Smith ierr = VecDuplicate(dd->natural,g);CHKERRQ(ierr); 8847c6ae99SBarry Smith } 8947c6ae99SBarry Smith } else { /* create the first version of this guy */ 90ce94432eSBarry Smith ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr); 91a34bdc0bSBarry Smith ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr); 9247c6ae99SBarry Smith ierr = VecSetBlockSize(*g, dd->w);CHKERRQ(ierr); 93265bdeeeSBarry Smith ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr); 9447c6ae99SBarry Smith ierr = PetscObjectReference((PetscObject)*g);CHKERRQ(ierr); 958865f1eaSKarl Rupp 9647c6ae99SBarry Smith dd->natural = *g; 9747c6ae99SBarry Smith } 9847c6ae99SBarry Smith PetscFunctionReturn(0); 9947c6ae99SBarry Smith } 10047c6ae99SBarry Smith 101