xref: /petsc/src/dm/impls/da/dadestroy.c (revision fbf9dbe564678ed6eff1806adbc4c4f01b9743f4)
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   DM_DA *dd = (DM_DA *)da->data;
11 
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   }
20 
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));
27 
28   PetscCall(PetscFree(dd->lx));
29   PetscCall(PetscFree(dd->ly));
30   PetscCall(PetscFree(dd->lz));
31 
32   PetscCall(PetscFree(dd->refine_x_hier));
33   PetscCall(PetscFree(dd->refine_y_hier));
34   PetscCall(PetscFree(dd->refine_z_hier));
35 
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));
46 
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));
53 
54   PetscCall(PetscObjectComposeFunction((PetscObject)da, "DMSetUpGLVisViewer_C", NULL));
55 
56   PetscCall(PetscFree(dd));
57   PetscFunctionReturn(PETSC_SUCCESS);
58 }
59