147c6ae99SBarry Smith 247c6ae99SBarry Smith /* 347c6ae99SBarry Smith Code for manipulating distributed regular arrays in parallel. 447c6ae99SBarry Smith */ 547c6ae99SBarry Smith 6b45d2f2cSJed Brown #include <petsc-private/daimpl.h> /*I "petscdmda.h" I*/ 747c6ae99SBarry Smith 847c6ae99SBarry Smith #undef __FUNCT__ 92dcb2ebcSBarry Smith #define __FUNCT__ "VecDuplicate_MPI_DA" 107087cfbeSBarry Smith PetscErrorCode VecDuplicate_MPI_DA(Vec g,Vec *gg) 112dcb2ebcSBarry Smith { 122dcb2ebcSBarry Smith PetscErrorCode ierr; 132dcb2ebcSBarry Smith DM da; 142dcb2ebcSBarry Smith 152dcb2ebcSBarry Smith PetscFunctionBegin; 16c688c046SMatthew G Knepley ierr = VecGetDM(g, &da);CHKERRQ(ierr); 172dcb2ebcSBarry Smith ierr = DMCreateGlobalVector(da,gg);CHKERRQ(ierr); 185ead1ec2SBarry Smith ierr = PetscLayoutReference(g->map,&(*gg)->map);CHKERRQ(ierr); 192dcb2ebcSBarry Smith PetscFunctionReturn(0); 202dcb2ebcSBarry Smith } 212dcb2ebcSBarry Smith 222dcb2ebcSBarry Smith 232dcb2ebcSBarry Smith #undef __FUNCT__ 24564755cdSBarry Smith #define __FUNCT__ "DMCreateGlobalVector_DA" 257087cfbeSBarry Smith PetscErrorCode 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); 3311689aebSJed Brown if (da->defaultSection) { 3411689aebSJed Brown ierr = DMCreateGlobalVector_Section_Private(da,g);CHKERRQ(ierr); 3511689aebSJed Brown } else { 3647c6ae99SBarry Smith ierr = VecCreate(((PetscObject)da)->comm,g);CHKERRQ(ierr); 3747c6ae99SBarry Smith ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr); 38401ddaa8SBarry Smith ierr = VecSetBlockSize(*g,dd->w);CHKERRQ(ierr); 3947c6ae99SBarry Smith ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr); 401ca04561SShri Abhyankar ierr = VecSetFromOptions(*g);CHKERRQ(ierr); 41c688c046SMatthew G Knepley ierr = VecSetDM(*g, da);CHKERRQ(ierr); 421411c6eeSJed Brown ierr = VecSetLocalToGlobalMapping(*g,da->ltogmap);CHKERRQ(ierr); 431411c6eeSJed Brown ierr = VecSetLocalToGlobalMappingBlock(*g,da->ltogmapb);CHKERRQ(ierr); 4411689aebSJed Brown } 4547c6ae99SBarry Smith ierr = VecSetOperation(*g,VECOP_VIEW,(void (*)(void))VecView_MPI_DA);CHKERRQ(ierr); 4647c6ae99SBarry Smith ierr = VecSetOperation(*g,VECOP_LOAD,(void (*)(void))VecLoad_Default_DA);CHKERRQ(ierr); 472dcb2ebcSBarry Smith ierr = VecSetOperation(*g,VECOP_DUPLICATE,(void (*)(void))VecDuplicate_MPI_DA);CHKERRQ(ierr); 4847c6ae99SBarry Smith PetscFunctionReturn(0); 4947c6ae99SBarry Smith } 5047c6ae99SBarry Smith 5147c6ae99SBarry Smith #undef __FUNCT__ 52aa219208SBarry Smith #define __FUNCT__ "DMDACreateNaturalVector" 5347c6ae99SBarry Smith /*@ 54aa219208SBarry Smith DMDACreateNaturalVector - Creates a parallel PETSc vector that 5547c6ae99SBarry Smith will hold vector values in the natural numbering, rather than in 56aa219208SBarry Smith the PETSc parallel numbering associated with the DMDA. 5747c6ae99SBarry Smith 58aa219208SBarry Smith Collective on DMDA 5947c6ae99SBarry Smith 6047c6ae99SBarry Smith Input Parameter: 6147c6ae99SBarry Smith . da - the distributed array 6247c6ae99SBarry Smith 6347c6ae99SBarry Smith Output Parameter: 6447c6ae99SBarry Smith . g - the distributed global vector 6547c6ae99SBarry Smith 6647c6ae99SBarry Smith Level: developer 6747c6ae99SBarry Smith 6847c6ae99SBarry Smith Note: 6947c6ae99SBarry Smith The output parameter, g, is a regular PETSc vector that should be destroyed 7047c6ae99SBarry Smith with a call to VecDestroy() when usage is finished. 7147c6ae99SBarry Smith 7247c6ae99SBarry Smith The number of local entries in the vector on each process is the same 73564755cdSBarry Smith as in a vector created with DMCreateGlobalVector(). 7447c6ae99SBarry Smith 7547c6ae99SBarry Smith .keywords: distributed array, create, global, distributed, vector 7647c6ae99SBarry Smith 77564755cdSBarry Smith .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(), 78aa219208SBarry Smith DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 79aa219208SBarry Smith DMGlobalToLocalEnd(), DMDALocalToGlobalBegin() 8047c6ae99SBarry Smith @*/ 817087cfbeSBarry Smith PetscErrorCode DMDACreateNaturalVector(DM da,Vec *g) 8247c6ae99SBarry Smith { 8347c6ae99SBarry Smith PetscErrorCode ierr; 8447c6ae99SBarry Smith PetscInt cnt; 8547c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 8647c6ae99SBarry Smith 8747c6ae99SBarry Smith PetscFunctionBegin; 8847c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 8947c6ae99SBarry Smith PetscValidPointer(g,2); 9047c6ae99SBarry Smith if (dd->natural) { 9147c6ae99SBarry Smith ierr = PetscObjectGetReference((PetscObject)dd->natural,&cnt);CHKERRQ(ierr); 9247c6ae99SBarry Smith if (cnt == 1) { /* object is not currently used by anyone */ 9347c6ae99SBarry Smith ierr = PetscObjectReference((PetscObject)dd->natural);CHKERRQ(ierr); 9447c6ae99SBarry Smith *g = dd->natural; 9547c6ae99SBarry Smith } else { 9647c6ae99SBarry Smith ierr = VecDuplicate(dd->natural,g);CHKERRQ(ierr); 9747c6ae99SBarry Smith } 9847c6ae99SBarry Smith } else { /* create the first version of this guy */ 99a34bdc0bSBarry Smith ierr = VecCreate(((PetscObject)da)->comm,g);CHKERRQ(ierr); 100a34bdc0bSBarry Smith ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr); 10147c6ae99SBarry Smith ierr = VecSetBlockSize(*g, dd->w);CHKERRQ(ierr); 102a34bdc0bSBarry Smith ierr = VecSetType(*g,VECMPI);CHKERRQ(ierr); 10347c6ae99SBarry Smith ierr = PetscObjectReference((PetscObject)*g);CHKERRQ(ierr); 104*8865f1eaSKarl Rupp 10547c6ae99SBarry Smith dd->natural = *g; 10647c6ae99SBarry Smith } 10747c6ae99SBarry Smith PetscFunctionReturn(0); 10847c6ae99SBarry Smith } 10947c6ae99SBarry Smith 11047c6ae99SBarry Smith 11147c6ae99SBarry Smith 112