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