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__ "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<DA_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<DA_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<DA_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 = PetscHeaderDestroy(da);CHKERRQ(ierr); 141 PetscFunctionReturn(0); 142 } 143 144 #undef __FUNCT__ 145 #define __FUNCT__ "DAGetISLocalToGlobalMapping" 146 /*@ 147 DAGetISLocalToGlobalMapping - Accesses the local-to-global mapping in a DA. 148 149 Not Collective 150 151 Input Parameter: 152 . da - the distributed array that provides the mapping 153 154 Output Parameter: 155 . ltog - the mapping 156 157 Level: intermediate 158 159 Notes: 160 This mapping can them be used by VecSetLocalToGlobalMapping() or 161 MatSetLocalToGlobalMapping(). 162 163 Essentially the same data is returned in the form of an integer array 164 with the routine DAGetGlobalIndices(). 165 166 .keywords: distributed array, destroy 167 168 .seealso: DACreate1d(), DACreate2d(), DACreate3d(), VecSetLocalToGlobalMapping(), 169 MatSetLocalToGlobalMapping(), DAGetGlobalIndices(), DAGetISLocalToGlobalMappingBlck() 170 @*/ 171 PetscErrorCode PETSCDM_DLLEXPORT DAGetISLocalToGlobalMapping(DM da,ISLocalToGlobalMapping *map) 172 { 173 DM_DA *dd = (DM_DA*)da->data; 174 175 PetscFunctionBegin; 176 PetscValidHeaderSpecific(da,DM_CLASSID,1); 177 PetscValidPointer(map,2); 178 *map = dd->ltogmap; 179 PetscFunctionReturn(0); 180 } 181 182 #undef __FUNCT__ 183 #define __FUNCT__ "DAGetISLocalToGlobalMappingBlck" 184 /*@ 185 DAGetISLocalToGlobalMappingBlck - Accesses the local-to-global mapping in a DA. 186 187 Not Collective 188 189 Input Parameter: 190 . da - the distributed array that provides the mapping 191 192 Output Parameter: 193 . ltog - the mapping 194 195 Level: intermediate 196 197 Notes: 198 This mapping can them be used by VecSetLocalToGlobalMappingBlock() or 199 MatSetLocalToGlobalMappingBlock(). 200 201 Essentially the same data is returned in the form of an integer array 202 with the routine DAGetGlobalIndices(). 203 204 .keywords: distributed array, destroy 205 206 .seealso: DACreate1d(), DACreate2d(), DACreate3d(), VecSetLocalToGlobalMapping(), 207 MatSetLocalToGlobalMapping(), DAGetGlobalIndices(), DAGetISLocalToGlobalMapping() 208 @*/ 209 PetscErrorCode PETSCDM_DLLEXPORT DAGetISLocalToGlobalMappingBlck(DM da,ISLocalToGlobalMapping *map) 210 { 211 DM_DA *dd = (DM_DA*)da->data; 212 213 PetscFunctionBegin; 214 PetscValidHeaderSpecific(da,DM_CLASSID,1); 215 PetscValidPointer(map,2); 216 *map = dd->ltogmapb; 217 PetscFunctionReturn(0); 218 } 219 220 221