1 2 /* 3 Code for manipulating distributed regular arrays in parallel. 4 */ 5 6 #include <private/daimpl.h> /*I "petscdmda.h" I*/ 7 8 /* Logging support */ 9 PetscClassId DM_CLASSID; 10 PetscClassId ADDA_CLASSID; 11 PetscLogEvent 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 ierr = VecScatterDestroy(&dd->ltog);CHKERRQ(ierr); 95 ierr = VecScatterDestroy(&dd->gtol);CHKERRQ(ierr); 96 ierr = VecScatterDestroy(&dd->ltol);CHKERRQ(ierr); 97 ierr = VecDestroy(&dd->natural);CHKERRQ(ierr); 98 ierr = VecScatterDestroy(&dd->gton);CHKERRQ(ierr); 99 ierr = AODestroy(&dd->ao);CHKERRQ(ierr); 100 101 ierr = PetscFree(dd->idx);CHKERRQ(ierr); 102 ierr = PetscFree(dd->lx);CHKERRQ(ierr); 103 ierr = PetscFree(dd->ly);CHKERRQ(ierr); 104 ierr = PetscFree(dd->lz);CHKERRQ(ierr); 105 ierr = PetscFree(da->vectype);CHKERRQ(ierr); 106 107 if (dd->fieldname) { 108 for (i=0; i<dd->w; i++) { 109 ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr); 110 } 111 ierr = PetscFree(dd->fieldname);CHKERRQ(ierr); 112 } 113 ierr = ISColoringDestroy(&dd->localcoloring);CHKERRQ(ierr); 114 ierr = ISColoringDestroy(&dd->ghostedcoloring);CHKERRQ(ierr); 115 116 ierr = VecDestroy(&dd->coordinates);CHKERRQ(ierr);} 117 ierr = VecDestroy(&dd->ghosted_coordinates);CHKERRQ(ierr);} 118 if (dd->da_coordinates && da != dd->da_coordinates) {ierr = DMDestroy(&dd->da_coordinates);CHKERRQ(ierr);} 119 120 ierr = PetscFree(dd->neighbors);CHKERRQ(ierr); 121 ierr = PetscFree(dd->dfill);CHKERRQ(ierr); 122 ierr = PetscFree(dd->ofill);CHKERRQ(ierr); 123 ierr = PetscFree(dd->e);CHKERRQ(ierr); 124 125 ierr = PetscFree(dd);CHKERRQ(ierr); 126 ierr = PetscHeaderDestroy(da);CHKERRQ(ierr); 127 PetscFunctionReturn(0); 128 } 129