1 2 /* 3 Code for manipulating distributed regular arrays in parallel. 4 */ 5 6 #include "private/daimpl.h" /*I "petscdm.h" I*/ 7 8 /* Logging support */ 9 PetscClassId DM_CLASSID; 10 PetscClassId ADDA_CLASSID; 11 PetscLogEvent DMDA_GlobalToLocal, DMDA_LocalToGlobal, DMDA_LocalADFunction; 12 13 #undef __FUNCT__ 14 #define __FUNCT__ "DMDestroy_Private" 15 /* 16 DMDestroy_Private - handles the work vectors created by DMGetGlobalVector() and DMGetLocalVector() 17 18 */ 19 PetscErrorCode DMDestroy_Private(DM dm,PetscBool *done) 20 { 21 PetscErrorCode ierr; 22 PetscErrorCode i,cnt = 0; 23 24 PetscFunctionBegin; 25 PetscValidHeaderSpecific(dm,DM_CLASSID,1); 26 *done = PETSC_FALSE; 27 28 for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 29 if (dm->localin[i]) {cnt++;} 30 if (dm->globalin[i]) {cnt++;} 31 } 32 33 if (--((PetscObject)dm)->refct - cnt > 0) PetscFunctionReturn(0); 34 35 /* 36 Need this test because the dm references the vectors that 37 reference the dm, so destroying the dm calls destroy on the 38 vectors that cause another destroy on the dm 39 */ 40 if (((PetscObject)dm)->refct < 0) PetscFunctionReturn(0); 41 ((PetscObject)dm)->refct = 0; 42 43 for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 44 if (dm->localout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a local vector obtained with DMGetLocalVector()"); 45 if (dm->localin[i]) {ierr = VecDestroy(dm->localin[i]);CHKERRQ(ierr);} 46 if (dm->globalout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a global vector obtained with DMGetGlobalVector()"); 47 if (dm->globalin[i]) {ierr = VecDestroy(dm->globalin[i]);CHKERRQ(ierr);} 48 } 49 if (dm->ltogmap) {ierr = ISLocalToGlobalMappingDestroy(dm->ltogmap);CHKERRQ(ierr);} 50 if (dm->ltogmapb) {ierr = ISLocalToGlobalMappingDestroy(dm->ltogmapb);CHKERRQ(ierr);} 51 52 *done = PETSC_TRUE; 53 PetscFunctionReturn(0); 54 } 55 56 #undef __FUNCT__ 57 #define __FUNCT__ "DMDestroy_DA" 58 PetscErrorCode DMDestroy_DA(DM da) 59 { 60 PetscErrorCode ierr; 61 PetscErrorCode i; 62 PetscBool done; 63 DM_DA *dd = (DM_DA*)da->data; 64 65 PetscFunctionBegin; 66 PetscValidHeaderSpecific(da,DM_CLASSID,1); 67 68 ierr = DMDestroy_Private((DM)da,&done);CHKERRQ(ierr); 69 if (!done) PetscFunctionReturn(0); 70 71 /* destroy the external/common part */ 72 for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) { 73 ierr = PetscFree(dd->adstartghostedout[i]);CHKERRQ(ierr); 74 ierr = PetscFree(dd->adstartghostedin[i]);CHKERRQ(ierr); 75 ierr = PetscFree(dd->adstartout[i]);CHKERRQ(ierr); 76 ierr = PetscFree(dd->adstartin[i]);CHKERRQ(ierr); 77 } 78 for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) { 79 ierr = PetscFree(dd->admfstartghostedout[i]);CHKERRQ(ierr); 80 ierr = PetscFree(dd->admfstartghostedin[i]);CHKERRQ(ierr); 81 ierr = PetscFree(dd->admfstartout[i]);CHKERRQ(ierr); 82 ierr = PetscFree(dd->admfstartin[i]);CHKERRQ(ierr); 83 } 84 for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) { 85 ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr); 86 ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr); 87 ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr); 88 ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr); 89 } 90 91 /* if memory was published with AMS then destroy it */ 92 ierr = PetscObjectDepublish(da);CHKERRQ(ierr); 93 94 if (dd->ltog) {ierr = VecScatterDestroy(dd->ltog);CHKERRQ(ierr);} 95 if (dd->gtol) {ierr = VecScatterDestroy(dd->gtol);CHKERRQ(ierr);} 96 if (dd->ltol) {ierr = VecScatterDestroy(dd->ltol);CHKERRQ(ierr);} 97 if (dd->natural){ 98 ierr = VecDestroy(dd->natural);CHKERRQ(ierr); 99 } 100 if (dd->gton) { 101 ierr = VecScatterDestroy(dd->gton);CHKERRQ(ierr); 102 } 103 104 if (dd->ao) { 105 ierr = AODestroy(dd->ao);CHKERRQ(ierr); 106 } 107 108 ierr = PetscFree(dd->idx);CHKERRQ(ierr); 109 ierr = PetscFree(dd->lx);CHKERRQ(ierr); 110 ierr = PetscFree(dd->ly);CHKERRQ(ierr); 111 ierr = PetscFree(dd->lz);CHKERRQ(ierr); 112 ierr = PetscFree(da->vectype);CHKERRQ(ierr); 113 114 if (dd->fieldname) { 115 for (i=0; i<dd->w; i++) { 116 ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr); 117 } 118 ierr = PetscFree(dd->fieldname);CHKERRQ(ierr); 119 } 120 121 if (dd->localcoloring) { 122 ierr = ISColoringDestroy(dd->localcoloring);CHKERRQ(ierr); 123 } 124 if (dd->ghostedcoloring) { 125 ierr = ISColoringDestroy(dd->ghostedcoloring);CHKERRQ(ierr); 126 } 127 128 if (dd->coordinates) {ierr = VecDestroy(dd->coordinates);CHKERRQ(ierr);} 129 if (dd->ghosted_coordinates) {ierr = VecDestroy(dd->ghosted_coordinates);CHKERRQ(ierr);} 130 if (dd->da_coordinates && da != dd->da_coordinates) {ierr = DMDestroy(dd->da_coordinates);CHKERRQ(ierr);} 131 132 ierr = PetscFree(dd->neighbors);CHKERRQ(ierr); 133 ierr = PetscFree(dd->dfill);CHKERRQ(ierr); 134 ierr = PetscFree(dd->ofill);CHKERRQ(ierr); 135 ierr = PetscFree(dd->e);CHKERRQ(ierr); 136 137 ierr = PetscFree(dd);CHKERRQ(ierr); 138 ierr = PetscHeaderDestroy(da);CHKERRQ(ierr); 139 PetscFunctionReturn(0); 140 } 141