1 #define PETSCDM_DLL 2 3 /* 4 Code for manipulating distributed regular arrays in parallel. 5 */ 6 7 #include "private/daimpl.h" /*I "petscda.h" I*/ 8 9 /* Logging support */ 10 PetscClassId PETSCDM_DLLEXPORT DM_CLASSID; 11 PetscClassId PETSCDM_DLLEXPORT ADDA_CLASSID; 12 PetscLogEvent DA_GlobalToLocal, DA_LocalToGlobal, DA_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__ "DADestroy" 56 /*@ 57 DADestroy - Destroys a distributed array. 58 59 Collective on DA 60 61 Input Parameter: 62 . da - the distributed array to destroy 63 64 Level: beginner 65 66 .keywords: distributed array, destroy 67 68 .seealso: DACreate1d(), DACreate2d(), DACreate3d() 69 @*/ 70 PetscErrorCode PETSCDM_DLLEXPORT DADestroy(DA da) 71 { 72 PetscErrorCode ierr; 73 PetscErrorCode i; 74 PetscBool done; 75 DM_DA *dd = (DM_DA*)da->data; 76 77 PetscFunctionBegin; 78 PetscValidHeaderSpecific(da,DM_CLASSID,1); 79 80 ierr = DMDestroy_Private((DM)da,&done);CHKERRQ(ierr); 81 if (!done) PetscFunctionReturn(0); 82 /* destroy the internal part */ 83 if (da->ops->destroy) { 84 ierr = (*da->ops->destroy)(da);CHKERRQ(ierr); 85 } 86 /* destroy the external/common part */ 87 for (i=0; i<DA_MAX_AD_ARRAYS; i++) { 88 ierr = PetscFree(dd->adstartghostedout[i]);CHKERRQ(ierr); 89 ierr = PetscFree(dd->adstartghostedin[i]);CHKERRQ(ierr); 90 ierr = PetscFree(dd->adstartout[i]);CHKERRQ(ierr); 91 ierr = PetscFree(dd->adstartin[i]);CHKERRQ(ierr); 92 } 93 for (i=0; i<DA_MAX_AD_ARRAYS; i++) { 94 ierr = PetscFree(dd->admfstartghostedout[i]);CHKERRQ(ierr); 95 ierr = PetscFree(dd->admfstartghostedin[i]);CHKERRQ(ierr); 96 ierr = PetscFree(dd->admfstartout[i]);CHKERRQ(ierr); 97 ierr = PetscFree(dd->admfstartin[i]);CHKERRQ(ierr); 98 } 99 for (i=0; i<DA_MAX_WORK_ARRAYS; i++) { 100 ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr); 101 ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr); 102 ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr); 103 ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr); 104 } 105 106 /* if memory was published with AMS then destroy it */ 107 ierr = PetscObjectDepublish(da);CHKERRQ(ierr); 108 109 if (dd->ltog) {ierr = VecScatterDestroy(dd->ltog);CHKERRQ(ierr);} 110 if (dd->gtol) {ierr = VecScatterDestroy(dd->gtol);CHKERRQ(ierr);} 111 if (dd->ltol) {ierr = VecScatterDestroy(dd->ltol);CHKERRQ(ierr);} 112 if (dd->natural){ 113 ierr = VecDestroy(dd->natural);CHKERRQ(ierr); 114 } 115 if (dd->gton) { 116 ierr = VecScatterDestroy(dd->gton);CHKERRQ(ierr); 117 } 118 119 if (dd->ao) { 120 ierr = AODestroy(dd->ao);CHKERRQ(ierr); 121 } 122 if (dd->ltogmap) { 123 ierr = ISLocalToGlobalMappingDestroy(dd->ltogmap);CHKERRQ(ierr); 124 } 125 if (dd->ltogmapb) { 126 ierr = ISLocalToGlobalMappingDestroy(dd->ltogmapb);CHKERRQ(ierr); 127 } 128 129 ierr = PetscFree(dd->lx);CHKERRQ(ierr); 130 ierr = PetscFree(dd->ly);CHKERRQ(ierr); 131 ierr = PetscFree(dd->lz);CHKERRQ(ierr); 132 ierr = PetscFree(da->vectype);CHKERRQ(ierr); 133 134 if (dd->fieldname) { 135 for (i=0; i<dd->w; i++) { 136 ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr); 137 } 138 ierr = PetscFree(dd->fieldname);CHKERRQ(ierr); 139 } 140 141 if (dd->localcoloring) { 142 ierr = ISColoringDestroy(dd->localcoloring);CHKERRQ(ierr); 143 } 144 if (dd->ghostedcoloring) { 145 ierr = ISColoringDestroy(dd->ghostedcoloring);CHKERRQ(ierr); 146 } 147 148 if (dd->coordinates) {ierr = VecDestroy(dd->coordinates);CHKERRQ(ierr);} 149 if (dd->ghosted_coordinates) {ierr = VecDestroy(dd->ghosted_coordinates);CHKERRQ(ierr);} 150 if (dd->da_coordinates && da != dd->da_coordinates) {ierr = DADestroy(dd->da_coordinates);CHKERRQ(ierr);} 151 152 ierr = PetscFree(dd->neighbors);CHKERRQ(ierr); 153 ierr = PetscFree(dd->dfill);CHKERRQ(ierr); 154 ierr = PetscFree(dd->ofill);CHKERRQ(ierr); 155 ierr = PetscFree(dd->e);CHKERRQ(ierr); 156 157 ierr = PetscHeaderDestroy(da);CHKERRQ(ierr); 158 PetscFunctionReturn(0); 159 } 160 161 #undef __FUNCT__ 162 #define __FUNCT__ "DAGetISLocalToGlobalMapping" 163 /*@ 164 DAGetISLocalToGlobalMapping - Accesses the local-to-global mapping in a DA. 165 166 Not Collective 167 168 Input Parameter: 169 . da - the distributed array that provides the mapping 170 171 Output Parameter: 172 . ltog - the mapping 173 174 Level: intermediate 175 176 Notes: 177 This mapping can them be used by VecSetLocalToGlobalMapping() or 178 MatSetLocalToGlobalMapping(). 179 180 Essentially the same data is returned in the form of an integer array 181 with the routine DAGetGlobalIndices(). 182 183 .keywords: distributed array, destroy 184 185 .seealso: DACreate1d(), DACreate2d(), DACreate3d(), VecSetLocalToGlobalMapping(), 186 MatSetLocalToGlobalMapping(), DAGetGlobalIndices(), DAGetISLocalToGlobalMappingBlck() 187 @*/ 188 PetscErrorCode PETSCDM_DLLEXPORT DAGetISLocalToGlobalMapping(DA da,ISLocalToGlobalMapping *map) 189 { 190 DM_DA *dd = (DM_DA*)da->data; 191 192 PetscFunctionBegin; 193 PetscValidHeaderSpecific(da,DM_CLASSID,1); 194 PetscValidPointer(map,2); 195 *map = dd->ltogmap; 196 PetscFunctionReturn(0); 197 } 198 199 #undef __FUNCT__ 200 #define __FUNCT__ "DAGetISLocalToGlobalMappingBlck" 201 /*@ 202 DAGetISLocalToGlobalMappingBlck - Accesses the local-to-global mapping in a DA. 203 204 Not Collective 205 206 Input Parameter: 207 . da - the distributed array that provides the mapping 208 209 Output Parameter: 210 . ltog - the mapping 211 212 Level: intermediate 213 214 Notes: 215 This mapping can them be used by VecSetLocalToGlobalMappingBlock() or 216 MatSetLocalToGlobalMappingBlock(). 217 218 Essentially the same data is returned in the form of an integer array 219 with the routine DAGetGlobalIndices(). 220 221 .keywords: distributed array, destroy 222 223 .seealso: DACreate1d(), DACreate2d(), DACreate3d(), VecSetLocalToGlobalMapping(), 224 MatSetLocalToGlobalMapping(), DAGetGlobalIndices(), DAGetISLocalToGlobalMapping() 225 @*/ 226 PetscErrorCode PETSCDM_DLLEXPORT DAGetISLocalToGlobalMappingBlck(DA da,ISLocalToGlobalMapping *map) 227 { 228 DM_DA *dd = (DM_DA*)da->data; 229 230 PetscFunctionBegin; 231 PetscValidHeaderSpecific(da,DM_CLASSID,1); 232 PetscValidPointer(map,2); 233 *map = dd->ltogmapb; 234 PetscFunctionReturn(0); 235 } 236 237 238