1 #define PETSCDM_DLL 2 3 /* 4 Code for manipulating distributed regular arrays in parallel. 5 */ 6 7 #include "private/daimpl.h" /*I "petscdm.h" I*/ 8 9 /* Logging support */ 10 PetscClassId PETSCDM_DLLEXPORT DM_CLASSID; 11 PetscClassId PETSCDM_DLLEXPORT ADDA_CLASSID; 12 PetscLogEvent DMDA_GlobalToLocal, DMDA_LocalToGlobal, DMDA_LocalADFunction; 13 14 #undef __FUNCT__ 15 #define __FUNCT__ "DMDestroy_Private" 16 /* 17 DMDestroy_Private - handles the work vectors created by DMGetGlobalVector() and DMGetLocalVector() 18 19 */ 20 PetscErrorCode PETSCDM_DLLEXPORT DMDestroy_Private(DM dm,PetscBool *done) 21 { 22 PetscErrorCode ierr; 23 PetscErrorCode i,cnt = 0; 24 25 PetscFunctionBegin; 26 PetscValidHeaderSpecific(dm,DM_CLASSID,1); 27 *done = PETSC_FALSE; 28 29 for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 30 if (dm->localin[i]) {cnt++;} 31 if (dm->globalin[i]) {cnt++;} 32 } 33 34 if (--((PetscObject)dm)->refct - cnt > 0) PetscFunctionReturn(0); 35 36 /* 37 Need this test because the dm references the vectors that 38 reference the dm, so destroying the dm calls destroy on the 39 vectors that cause another destroy on the dm 40 */ 41 if (((PetscObject)dm)->refct < 0) PetscFunctionReturn(0); 42 ((PetscObject)dm)->refct = 0; 43 44 for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 45 if (dm->localout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a local vector obtained with DMGetLocalVector()"); 46 if (dm->localin[i]) {ierr = VecDestroy(dm->localin[i]);CHKERRQ(ierr);} 47 if (dm->globalout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a global vector obtained with DMGetGlobalVector()"); 48 if (dm->globalin[i]) {ierr = VecDestroy(dm->globalin[i]);CHKERRQ(ierr);} 49 } 50 *done = PETSC_TRUE; 51 PetscFunctionReturn(0); 52 } 53 54 #undef __FUNCT__ 55 #define __FUNCT__ "DMDestroy_DA" 56 PetscErrorCode PETSCDM_DLLEXPORT DMDestroy_DA(DM da) 57 { 58 PetscErrorCode ierr; 59 PetscErrorCode i; 60 PetscBool done; 61 DM_DA *dd = (DM_DA*)da->data; 62 63 PetscFunctionBegin; 64 PetscValidHeaderSpecific(da,DM_CLASSID,1); 65 66 ierr = DMDestroy_Private((DM)da,&done);CHKERRQ(ierr); 67 if (!done) PetscFunctionReturn(0); 68 69 /* destroy the external/common part */ 70 for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) { 71 ierr = PetscFree(dd->adstartghostedout[i]);CHKERRQ(ierr); 72 ierr = PetscFree(dd->adstartghostedin[i]);CHKERRQ(ierr); 73 ierr = PetscFree(dd->adstartout[i]);CHKERRQ(ierr); 74 ierr = PetscFree(dd->adstartin[i]);CHKERRQ(ierr); 75 } 76 for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) { 77 ierr = PetscFree(dd->admfstartghostedout[i]);CHKERRQ(ierr); 78 ierr = PetscFree(dd->admfstartghostedin[i]);CHKERRQ(ierr); 79 ierr = PetscFree(dd->admfstartout[i]);CHKERRQ(ierr); 80 ierr = PetscFree(dd->admfstartin[i]);CHKERRQ(ierr); 81 } 82 for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) { 83 ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr); 84 ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr); 85 ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr); 86 ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr); 87 } 88 89 /* if memory was published with AMS then destroy it */ 90 ierr = PetscObjectDepublish(da);CHKERRQ(ierr); 91 92 if (dd->ltog) {ierr = VecScatterDestroy(dd->ltog);CHKERRQ(ierr);} 93 if (dd->gtol) {ierr = VecScatterDestroy(dd->gtol);CHKERRQ(ierr);} 94 if (dd->ltol) {ierr = VecScatterDestroy(dd->ltol);CHKERRQ(ierr);} 95 if (dd->natural){ 96 ierr = VecDestroy(dd->natural);CHKERRQ(ierr); 97 } 98 if (dd->gton) { 99 ierr = VecScatterDestroy(dd->gton);CHKERRQ(ierr); 100 } 101 102 if (dd->ao) { 103 ierr = AODestroy(dd->ao);CHKERRQ(ierr); 104 } 105 if (dd->ltogmap) { 106 ierr = ISLocalToGlobalMappingDestroy(dd->ltogmap);CHKERRQ(ierr); 107 } 108 if (dd->ltogmapb) { 109 ierr = ISLocalToGlobalMappingDestroy(dd->ltogmapb);CHKERRQ(ierr); 110 } 111 112 ierr = PetscFree(dd->lx);CHKERRQ(ierr); 113 ierr = PetscFree(dd->ly);CHKERRQ(ierr); 114 ierr = PetscFree(dd->lz);CHKERRQ(ierr); 115 ierr = PetscFree(da->vectype);CHKERRQ(ierr); 116 117 if (dd->fieldname) { 118 for (i=0; i<dd->w; i++) { 119 ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr); 120 } 121 ierr = PetscFree(dd->fieldname);CHKERRQ(ierr); 122 } 123 124 if (dd->localcoloring) { 125 ierr = ISColoringDestroy(dd->localcoloring);CHKERRQ(ierr); 126 } 127 if (dd->ghostedcoloring) { 128 ierr = ISColoringDestroy(dd->ghostedcoloring);CHKERRQ(ierr); 129 } 130 131 if (dd->coordinates) {ierr = VecDestroy(dd->coordinates);CHKERRQ(ierr);} 132 if (dd->ghosted_coordinates) {ierr = VecDestroy(dd->ghosted_coordinates);CHKERRQ(ierr);} 133 if (dd->da_coordinates && da != dd->da_coordinates) {ierr = DMDestroy(dd->da_coordinates);CHKERRQ(ierr);} 134 135 ierr = PetscFree(dd->neighbors);CHKERRQ(ierr); 136 ierr = PetscFree(dd->dfill);CHKERRQ(ierr); 137 ierr = PetscFree(dd->ofill);CHKERRQ(ierr); 138 ierr = PetscFree(dd->e);CHKERRQ(ierr); 139 140 ierr = PetscFree(dd);CHKERRQ(ierr); 141 ierr = PetscHeaderDestroy(da);CHKERRQ(ierr); 142 PetscFunctionReturn(0); 143 } 144 145 #undef __FUNCT__ 146 #define __FUNCT__ "DMDAGetISLocalToGlobalMapping" 147 /*@ 148 DMDAGetISLocalToGlobalMapping - Accesses the local-to-global mapping in a DMDA. 149 150 Not Collective 151 152 Input Parameter: 153 . da - the distributed array that provides the mapping 154 155 Output Parameter: 156 . ltog - the mapping 157 158 Level: intermediate 159 160 Notes: 161 This mapping can them be used by VecSetLocalToGlobalMapping() or 162 MatSetLocalToGlobalMapping(). 163 164 Essentially the same data is returned in the form of an integer array 165 with the routine DMDAGetGlobalIndices(). 166 167 .keywords: distributed array, destroy 168 169 .seealso: DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), VecSetLocalToGlobalMapping(), 170 MatSetLocalToGlobalMapping(), DMDAGetGlobalIndices(), DMDAGetISLocalToGlobalMappingBlck() 171 @*/ 172 PetscErrorCode PETSCDM_DLLEXPORT DMDAGetISLocalToGlobalMapping(DM da,ISLocalToGlobalMapping *map) 173 { 174 DM_DA *dd = (DM_DA*)da->data; 175 176 PetscFunctionBegin; 177 PetscValidHeaderSpecific(da,DM_CLASSID,1); 178 PetscValidPointer(map,2); 179 *map = dd->ltogmap; 180 PetscFunctionReturn(0); 181 } 182 183 #undef __FUNCT__ 184 #define __FUNCT__ "DMDAGetISLocalToGlobalMappingBlck" 185 /*@ 186 DMDAGetISLocalToGlobalMappingBlck - Accesses the local-to-global mapping in a DMDA. 187 188 Not Collective 189 190 Input Parameter: 191 . da - the distributed array that provides the mapping 192 193 Output Parameter: 194 . ltog - the mapping 195 196 Level: intermediate 197 198 Notes: 199 This mapping can them be used by VecSetLocalToGlobalMappingBlock() or 200 MatSetLocalToGlobalMappingBlock(). 201 202 Essentially the same data is returned in the form of an integer array 203 with the routine DMDAGetGlobalIndices(). 204 205 .keywords: distributed array, destroy 206 207 .seealso: DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), VecSetLocalToGlobalMapping(), 208 MatSetLocalToGlobalMapping(), DMDAGetGlobalIndices(), DMDAGetISLocalToGlobalMapping() 209 @*/ 210 PetscErrorCode PETSCDM_DLLEXPORT DMDAGetISLocalToGlobalMappingBlck(DM da,ISLocalToGlobalMapping *map) 211 { 212 DM_DA *dd = (DM_DA*)da->data; 213 214 PetscFunctionBegin; 215 PetscValidHeaderSpecific(da,DM_CLASSID,1); 216 PetscValidPointer(map,2); 217 *map = dd->ltogmapb; 218 PetscFunctionReturn(0); 219 } 220 221 222