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