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