2: /* 3: Code for manipulating distributed regular arrays in parallel. 4: */ 6: #include <petsc/private/dmdaimpl.h> /*I "petscdmda.h" I*/ 8: /* Logging support */ 9: PetscLogEvent DMDA_LocalADFunction; 13: /* 14: DMDestroy_Private - handles the work vectors created by DMGetGlobalVector() and DMGetLocalVector() 16: */ 17: PetscErrorCode DMDestroy_Private(DM dm,PetscBool *done) 18: { 20: PetscErrorCode i,cnt = 0; 24: *done = PETSC_FALSE; 26: for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 27: if (dm->localin[i]) cnt++; 28: if (dm->globalin[i]) cnt++; 29: } 31: if (--((PetscObject)dm)->refct - cnt > 0) return(0); 33: /* 34: Need this test because the dm references the vectors that 35: reference the dm, so destroying the dm calls destroy on the 36: vectors that cause another destroy on the dm 37: */ 38: if (((PetscObject)dm)->refct < 0) return(0); 39: ((PetscObject)dm)->refct = 0; 41: for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 42: if (dm->localout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a local vector obtained with DMGetLocalVector()"); 43: VecDestroy(&dm->localin[i]); 44: if (dm->globalout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a global vector obtained with DMGetGlobalVector()"); 45: VecDestroy(&dm->globalin[i]); 46: } 47: ISLocalToGlobalMappingDestroy(&dm->ltogmap); 49: *done = PETSC_TRUE; 50: return(0); 51: } 55: PetscErrorCode DMDestroy_DA(DM da) 56: { 58: PetscErrorCode i; 59: DM_DA *dd = (DM_DA*)da->data; 62: /* destroy the external/common part */ 63: for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) { 64: PetscFree(dd->startghostedout[i]); 65: PetscFree(dd->startghostedin[i]); 66: PetscFree(dd->startout[i]); 67: PetscFree(dd->startin[i]); 68: } 70: VecScatterDestroy(&dd->gtol); 71: VecScatterDestroy(&dd->ltol); 72: VecDestroy(&dd->natural); 73: VecScatterDestroy(&dd->gton); 74: AODestroy(&dd->ao); 75: PetscFree(dd->aotype); 77: PetscFree(dd->lx); 78: PetscFree(dd->ly); 79: PetscFree(dd->lz); 81: if (dd->fieldname) { 82: for (i=0; i<dd->w; i++) { 83: PetscFree(dd->fieldname[i]); 84: } 85: PetscFree(dd->fieldname); 86: } 87: if (dd->coordinatename) { 88: for (i=0; i<da->dim; i++) { 89: PetscFree(dd->coordinatename[i]); 90: } 91: PetscFree(dd->coordinatename); 92: } 93: ISColoringDestroy(&dd->localcoloring); 94: ISColoringDestroy(&dd->ghostedcoloring); 96: PetscFree(dd->neighbors); 97: PetscFree(dd->dfill); 98: PetscFree(dd->ofill); 99: PetscFree(dd->ofillcols); 100: PetscFree(dd->e); 102: /* PetscSectionDestroy(&dd->defaultGlobalSection); */ 103: /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */ 104: PetscFree(dd); 105: return(0); 106: }