2: /* 3: Code for manipulating distributed regular arrays in parallel. 4: */ 6: #include <petsc/private/dmdaimpl.h> 8: PetscErrorCode DMDestroy_DA(DM da) 9: { 10: DM_DA *dd = (DM_DA *)da->data; 12: PetscFunctionBegin; 13: /* destroy the external/common part */ 14: for (PetscInt i = 0; i < DMDA_MAX_WORK_ARRAYS; i++) { 15: PetscCall(PetscFree(dd->startghostedout[i])); 16: PetscCall(PetscFree(dd->startghostedin[i])); 17: PetscCall(PetscFree(dd->startout[i])); 18: PetscCall(PetscFree(dd->startin[i])); 19: } 21: PetscCall(VecScatterDestroy(&dd->gtol)); 22: PetscCall(VecScatterDestroy(&dd->ltol)); 23: PetscCall(VecDestroy(&dd->natural)); 24: PetscCall(VecScatterDestroy(&dd->gton)); 25: PetscCall(AODestroy(&dd->ao)); 26: PetscCall(PetscFree(dd->aotype)); 28: PetscCall(PetscFree(dd->lx)); 29: PetscCall(PetscFree(dd->ly)); 30: PetscCall(PetscFree(dd->lz)); 32: PetscCall(PetscFree(dd->refine_x_hier)); 33: PetscCall(PetscFree(dd->refine_y_hier)); 34: PetscCall(PetscFree(dd->refine_z_hier)); 36: if (dd->fieldname) { 37: for (PetscInt i = 0; i < dd->w; i++) PetscCall(PetscFree(dd->fieldname[i])); 38: PetscCall(PetscFree(dd->fieldname)); 39: } 40: if (dd->coordinatename) { 41: for (PetscInt i = 0; i < da->dim; i++) PetscCall(PetscFree(dd->coordinatename[i])); 42: PetscCall(PetscFree(dd->coordinatename)); 43: } 44: PetscCall(ISColoringDestroy(&dd->localcoloring)); 45: PetscCall(ISColoringDestroy(&dd->ghostedcoloring)); 47: PetscCall(PetscFree(dd->neighbors)); 48: PetscCall(PetscFree(dd->dfill)); 49: PetscCall(PetscFree(dd->ofill)); 50: PetscCall(PetscFree(dd->ofillcols)); 51: PetscCall(PetscFree(dd->e)); 52: PetscCall(ISDestroy(&dd->ecorners)); 54: PetscCall(PetscObjectComposeFunction((PetscObject)da, "DMSetUpGLVisViewer_C", NULL)); 56: PetscCall(PetscFree(dd)); 57: PetscFunctionReturn(PETSC_SUCCESS); 58: }