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