1 2 /* 3 Code for manipulating distributed regular arrays in parallel. 4 */ 5 6 #include <petsc/private/dmdaimpl.h> /*I "petscdmda.h" I*/ 7 8 PetscErrorCode VecDuplicate_MPI_DA(Vec g,Vec *gg) 9 { 10 PetscErrorCode ierr; 11 DM da; 12 PetscLayout map; 13 14 PetscFunctionBegin; 15 ierr = VecGetDM(g, &da);CHKERRQ(ierr); 16 ierr = DMCreateGlobalVector(da,gg);CHKERRQ(ierr); 17 ierr = VecGetLayout(g,&map);CHKERRQ(ierr); 18 ierr = VecSetLayout(*gg,map);CHKERRQ(ierr); 19 PetscFunctionReturn(0); 20 } 21 22 23 PetscErrorCode DMCreateGlobalVector_DA(DM da,Vec *g) 24 { 25 PetscErrorCode ierr; 26 DM_DA *dd = (DM_DA*)da->data; 27 28 PetscFunctionBegin; 29 PetscValidHeaderSpecific(da,DM_CLASSID,1); 30 PetscValidPointer(g,2); 31 if (da->defaultSection) { 32 ierr = DMCreateGlobalVector_Section_Private(da,g);CHKERRQ(ierr); 33 /* The view and load functions break for general layouts */ 34 PetscFunctionReturn(0); 35 } else { 36 ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr); 37 ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr); 38 ierr = VecSetBlockSize(*g,dd->w);CHKERRQ(ierr); 39 ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr); 40 ierr = VecSetDM(*g, da);CHKERRQ(ierr); 41 ierr = VecSetLocalToGlobalMapping(*g,da->ltogmap);CHKERRQ(ierr); 42 } 43 ierr = VecSetOperation(*g,VECOP_VIEW,(void (*)(void))VecView_MPI_DA);CHKERRQ(ierr); 44 ierr = VecSetOperation(*g,VECOP_LOAD,(void (*)(void))VecLoad_Default_DA);CHKERRQ(ierr); 45 ierr = VecSetOperation(*g,VECOP_DUPLICATE,(void (*)(void))VecDuplicate_MPI_DA);CHKERRQ(ierr); 46 PetscFunctionReturn(0); 47 } 48 49 /*@ 50 DMDACreateNaturalVector - Creates a parallel PETSc vector that 51 will hold vector values in the natural numbering, rather than in 52 the PETSc parallel numbering associated with the DMDA. 53 54 Collective 55 56 Input Parameter: 57 . da - the distributed array 58 59 Output Parameter: 60 . g - the distributed global vector 61 62 Level: developer 63 64 Note: 65 The output parameter, g, is a regular PETSc vector that should be destroyed 66 with a call to VecDestroy() when usage is finished. 67 68 The number of local entries in the vector on each process is the same 69 as in a vector created with DMCreateGlobalVector(). 70 71 .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(), 72 DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 73 DMGlobalToLocalEnd(), DMDALocalToGlobalBegin() 74 @*/ 75 PetscErrorCode DMDACreateNaturalVector(DM da,Vec *g) 76 { 77 PetscErrorCode ierr; 78 PetscInt cnt; 79 DM_DA *dd = (DM_DA*)da->data; 80 81 PetscFunctionBegin; 82 PetscValidHeaderSpecificType(da,DM_CLASSID,1,DMDA); 83 PetscValidPointer(g,2); 84 if (dd->natural) { 85 ierr = PetscObjectGetReference((PetscObject)dd->natural,&cnt);CHKERRQ(ierr); 86 if (cnt == 1) { /* object is not currently used by anyone */ 87 ierr = PetscObjectReference((PetscObject)dd->natural);CHKERRQ(ierr); 88 *g = dd->natural; 89 } else { 90 ierr = VecDuplicate(dd->natural,g);CHKERRQ(ierr); 91 } 92 } else { /* create the first version of this guy */ 93 ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr); 94 ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr); 95 ierr = VecSetBlockSize(*g, dd->w);CHKERRQ(ierr); 96 ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr); 97 ierr = PetscObjectReference((PetscObject)*g);CHKERRQ(ierr); 98 99 dd->natural = *g; 100 } 101 PetscFunctionReturn(0); 102 } 103 104 105 106