147c6ae99SBarry Smith #define PETSCDM_DLL 247c6ae99SBarry Smith 347c6ae99SBarry Smith /* 447c6ae99SBarry Smith Code for manipulating distributed regular arrays in parallel. 547c6ae99SBarry Smith */ 647c6ae99SBarry Smith 747c6ae99SBarry Smith #include "private/daimpl.h" /*I "petscda.h" I*/ 847c6ae99SBarry Smith 947c6ae99SBarry Smith #undef __FUNCT__ 10*564755cdSBarry Smith #define __FUNCT__ "DMCreateGlobalVector_DA" 11*564755cdSBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMCreateGlobalVector_DA(DM da,Vec* g) 1247c6ae99SBarry Smith { 1347c6ae99SBarry Smith PetscErrorCode ierr; 1447c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 1547c6ae99SBarry Smith 1647c6ae99SBarry Smith PetscFunctionBegin; 1747c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 1847c6ae99SBarry Smith PetscValidPointer(g,2); 1947c6ae99SBarry Smith ierr = VecCreate(((PetscObject)da)->comm,g);CHKERRQ(ierr); 2047c6ae99SBarry Smith ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr); 2147c6ae99SBarry Smith ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr); 2247c6ae99SBarry Smith ierr = PetscObjectCompose((PetscObject)*g,"DA",(PetscObject)da);CHKERRQ(ierr); 2347c6ae99SBarry Smith ierr = VecSetLocalToGlobalMapping(*g,dd->ltogmap);CHKERRQ(ierr); 2447c6ae99SBarry Smith ierr = VecSetLocalToGlobalMappingBlock(*g,dd->ltogmapb);CHKERRQ(ierr); 2547c6ae99SBarry Smith ierr = VecSetBlockSize(*g,dd->w);CHKERRQ(ierr); 2647c6ae99SBarry Smith ierr = VecSetOperation(*g,VECOP_VIEW,(void(*)(void))VecView_MPI_DA);CHKERRQ(ierr); 2747c6ae99SBarry Smith ierr = VecSetOperation(*g,VECOP_LOAD,(void(*)(void))VecLoad_Default_DA);CHKERRQ(ierr); 2847c6ae99SBarry Smith PetscFunctionReturn(0); 2947c6ae99SBarry Smith } 3047c6ae99SBarry Smith 3147c6ae99SBarry Smith #undef __FUNCT__ 3247c6ae99SBarry Smith #define __FUNCT__ "DACreateNaturalVector" 3347c6ae99SBarry Smith /*@ 3447c6ae99SBarry Smith DACreateNaturalVector - Creates a parallel PETSc vector that 3547c6ae99SBarry Smith will hold vector values in the natural numbering, rather than in 3647c6ae99SBarry Smith the PETSc parallel numbering associated with the DA. 3747c6ae99SBarry Smith 3847c6ae99SBarry Smith Collective on DA 3947c6ae99SBarry Smith 4047c6ae99SBarry Smith Input Parameter: 4147c6ae99SBarry Smith . da - the distributed array 4247c6ae99SBarry Smith 4347c6ae99SBarry Smith Output Parameter: 4447c6ae99SBarry Smith . g - the distributed global vector 4547c6ae99SBarry Smith 4647c6ae99SBarry Smith Level: developer 4747c6ae99SBarry Smith 4847c6ae99SBarry Smith Note: 4947c6ae99SBarry Smith The output parameter, g, is a regular PETSc vector that should be destroyed 5047c6ae99SBarry Smith with a call to VecDestroy() when usage is finished. 5147c6ae99SBarry Smith 5247c6ae99SBarry Smith The number of local entries in the vector on each process is the same 53*564755cdSBarry Smith as in a vector created with DMCreateGlobalVector(). 5447c6ae99SBarry Smith 5547c6ae99SBarry Smith .keywords: distributed array, create, global, distributed, vector 5647c6ae99SBarry Smith 57*564755cdSBarry Smith .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(), 589a42bb27SBarry Smith DACreate1d(), DACreate2d(), DACreate3d(), DMGlobalToLocalBegin(), 599a42bb27SBarry Smith DMGlobalToLocalEnd(), DALocalToGlobalBegin() 6047c6ae99SBarry Smith @*/ 619a42bb27SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DACreateNaturalVector(DM da,Vec* g) 6247c6ae99SBarry Smith { 6347c6ae99SBarry Smith PetscErrorCode ierr; 6447c6ae99SBarry Smith PetscInt cnt; 6547c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 6647c6ae99SBarry Smith 6747c6ae99SBarry Smith PetscFunctionBegin; 6847c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 6947c6ae99SBarry Smith PetscValidPointer(g,2); 7047c6ae99SBarry Smith if (dd->natural) { 7147c6ae99SBarry Smith ierr = PetscObjectGetReference((PetscObject)dd->natural,&cnt);CHKERRQ(ierr); 7247c6ae99SBarry Smith if (cnt == 1) { /* object is not currently used by anyone */ 7347c6ae99SBarry Smith ierr = PetscObjectReference((PetscObject)dd->natural);CHKERRQ(ierr); 7447c6ae99SBarry Smith *g = dd->natural; 7547c6ae99SBarry Smith } else { 7647c6ae99SBarry Smith ierr = VecDuplicate(dd->natural,g);CHKERRQ(ierr); 7747c6ae99SBarry Smith } 7847c6ae99SBarry Smith } else { /* create the first version of this guy */ 7947c6ae99SBarry Smith ierr = VecCreateMPI(((PetscObject)da)->comm,dd->Nlocal,PETSC_DETERMINE,g);CHKERRQ(ierr); 8047c6ae99SBarry Smith ierr = VecSetBlockSize(*g, dd->w);CHKERRQ(ierr); 8147c6ae99SBarry Smith ierr = PetscObjectReference((PetscObject)*g);CHKERRQ(ierr); 8247c6ae99SBarry Smith dd->natural = *g; 8347c6ae99SBarry Smith } 8447c6ae99SBarry Smith PetscFunctionReturn(0); 8547c6ae99SBarry Smith } 8647c6ae99SBarry Smith 8747c6ae99SBarry Smith 8847c6ae99SBarry Smith 89