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 = VecSetFromOptions(*g);CHKERRQ(ierr); 45 ierr = VecSetDM(*g, da);CHKERRQ(ierr); 46 ierr = VecSetLocalToGlobalMapping(*g,da->ltogmap);CHKERRQ(ierr); 47 ierr = VecSetLocalToGlobalMappingBlock(*g,da->ltogmapb);CHKERRQ(ierr); 48 } 49 ierr = VecSetOperation(*g,VECOP_VIEW,(void (*)(void))VecView_MPI_DA);CHKERRQ(ierr); 50 ierr = VecSetOperation(*g,VECOP_LOAD,(void (*)(void))VecLoad_Default_DA);CHKERRQ(ierr); 51 ierr = VecSetOperation(*g,VECOP_DUPLICATE,(void (*)(void))VecDuplicate_MPI_DA);CHKERRQ(ierr); 52 PetscFunctionReturn(0); 53 } 54 55 #undef __FUNCT__ 56 #define __FUNCT__ "DMDACreateNaturalVector" 57 /*@ 58 DMDACreateNaturalVector - Creates a parallel PETSc vector that 59 will hold vector values in the natural numbering, rather than in 60 the PETSc parallel numbering associated with the DMDA. 61 62 Collective on DMDA 63 64 Input Parameter: 65 . da - the distributed array 66 67 Output Parameter: 68 . g - the distributed global vector 69 70 Level: developer 71 72 Note: 73 The output parameter, g, is a regular PETSc vector that should be destroyed 74 with a call to VecDestroy() when usage is finished. 75 76 The number of local entries in the vector on each process is the same 77 as in a vector created with DMCreateGlobalVector(). 78 79 .keywords: distributed array, create, global, distributed, vector 80 81 .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(), 82 DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 83 DMGlobalToLocalEnd(), DMDALocalToGlobalBegin() 84 @*/ 85 PetscErrorCode DMDACreateNaturalVector(DM da,Vec *g) 86 { 87 PetscErrorCode ierr; 88 PetscInt cnt; 89 DM_DA *dd = (DM_DA*)da->data; 90 91 PetscFunctionBegin; 92 PetscValidHeaderSpecific(da,DM_CLASSID,1); 93 PetscValidPointer(g,2); 94 if (dd->natural) { 95 ierr = PetscObjectGetReference((PetscObject)dd->natural,&cnt);CHKERRQ(ierr); 96 if (cnt == 1) { /* object is not currently used by anyone */ 97 ierr = PetscObjectReference((PetscObject)dd->natural);CHKERRQ(ierr); 98 *g = dd->natural; 99 } else { 100 ierr = VecDuplicate(dd->natural,g);CHKERRQ(ierr); 101 } 102 } else { /* create the first version of this guy */ 103 ierr = VecCreate(PetscObjectComm((PetscObject)da),g);CHKERRQ(ierr); 104 ierr = VecSetSizes(*g,dd->Nlocal,PETSC_DETERMINE);CHKERRQ(ierr); 105 ierr = VecSetBlockSize(*g, dd->w);CHKERRQ(ierr); 106 ierr = VecSetType(*g,VECMPI);CHKERRQ(ierr); 107 ierr = PetscObjectReference((PetscObject)*g);CHKERRQ(ierr); 108 109 dd->natural = *g; 110 } 111 PetscFunctionReturn(0); 112 } 113 114 115 116