xref: /petsc/src/dm/impls/da/dadestroy.c (revision 0c18141cf122a3c32b07535bd3d54e4a0d5f18b1)
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 /* Logging support */
9 PetscLogEvent DMDA_LocalADFunction;
10 
11 #undef __FUNCT__
12 #define __FUNCT__ "DMDestroy_Private"
13 /*
14    DMDestroy_Private - handles the work vectors created by DMGetGlobalVector() and DMGetLocalVector()
15 
16 */
17 PetscErrorCode  DMDestroy_Private(DM dm,PetscBool  *done)
18 {
19   PetscErrorCode ierr;
20   PetscErrorCode i,cnt = 0;
21 
22   PetscFunctionBegin;
23   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
24   *done = PETSC_FALSE;
25 
26   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
27     if (dm->localin[i])  cnt++;
28     if (dm->globalin[i]) cnt++;
29   }
30 
31   if (--((PetscObject)dm)->refct - cnt > 0) PetscFunctionReturn(0);
32 
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) PetscFunctionReturn(0);
39   ((PetscObject)dm)->refct = 0;
40 
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     ierr = VecDestroy(&dm->localin[i]);CHKERRQ(ierr);
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     ierr = VecDestroy(&dm->globalin[i]);CHKERRQ(ierr);
46   }
47   ierr = ISLocalToGlobalMappingDestroy(&dm->ltogmap);CHKERRQ(ierr);
48 
49   *done = PETSC_TRUE;
50   PetscFunctionReturn(0);
51 }
52 
53 #undef __FUNCT__
54 #define __FUNCT__ "DMDestroy_DA"
55 PetscErrorCode  DMDestroy_DA(DM da)
56 {
57   PetscErrorCode ierr;
58   PetscErrorCode i;
59   DM_DA          *dd = (DM_DA*)da->data;
60 
61   PetscFunctionBegin;
62   /* destroy the external/common part */
63   for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) {
64     ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr);
65     ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr);
66     ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr);
67     ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr);
68   }
69 
70   ierr = VecScatterDestroy(&dd->gtol);CHKERRQ(ierr);
71   ierr = VecScatterDestroy(&dd->ltol);CHKERRQ(ierr);
72   ierr = VecDestroy(&dd->natural);CHKERRQ(ierr);
73   ierr = VecScatterDestroy(&dd->gton);CHKERRQ(ierr);
74   ierr = AODestroy(&dd->ao);CHKERRQ(ierr);
75 
76   ierr = PetscFree(dd->lx);CHKERRQ(ierr);
77   ierr = PetscFree(dd->ly);CHKERRQ(ierr);
78   ierr = PetscFree(dd->lz);CHKERRQ(ierr);
79 
80   if (dd->fieldname) {
81     for (i=0; i<dd->w; i++) {
82       ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr);
83     }
84     ierr = PetscFree(dd->fieldname);CHKERRQ(ierr);
85   }
86   if (dd->coordinatename) {
87     for (i=0; i<dd->dim; i++) {
88       ierr = PetscFree(dd->coordinatename[i]);CHKERRQ(ierr);
89     }
90     ierr = PetscFree(dd->coordinatename);CHKERRQ(ierr);
91   }
92   ierr = ISColoringDestroy(&dd->localcoloring);CHKERRQ(ierr);
93   ierr = ISColoringDestroy(&dd->ghostedcoloring);CHKERRQ(ierr);
94 
95   ierr = PetscFree(dd->neighbors);CHKERRQ(ierr);
96   ierr = PetscFree(dd->dfill);CHKERRQ(ierr);
97   ierr = PetscFree(dd->ofill);CHKERRQ(ierr);
98   ierr = PetscFree(dd->ofillcols);CHKERRQ(ierr);
99   ierr = PetscFree(dd->e);CHKERRQ(ierr);
100 
101   /* ierr = PetscSectionDestroy(&dd->defaultGlobalSection);CHKERRQ(ierr); */
102   /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */
103   ierr = PetscFree(dd);CHKERRQ(ierr);
104   PetscFunctionReturn(0);
105 }
106