xref: /petsc/src/dm/impls/da/dadestroy.c (revision 2f37bf18533e710b9cded1b7a43589f62e5582d2)
1 #define PETSCDM_DLL
2 
3 /*
4   Code for manipulating distributed regular arrays in parallel.
5 */
6 
7 #include "private/daimpl.h"    /*I   "petscdm.h"   I*/
8 
9 /* Logging support */
10 PetscClassId  DM_CLASSID;
11 PetscClassId  ADDA_CLASSID;
12 PetscLogEvent  DMDA_GlobalToLocal, DMDA_LocalToGlobal, DMDA_LocalADFunction;
13 
14 #undef __FUNCT__
15 #define __FUNCT__ "DMDestroy_Private"
16 /*
17    DMDestroy_Private - handles the work vectors created by DMGetGlobalVector() and DMGetLocalVector()
18 
19 */
20 PetscErrorCode  DMDestroy_Private(DM dm,PetscBool  *done)
21 {
22   PetscErrorCode ierr;
23   PetscErrorCode i,cnt = 0;
24 
25   PetscFunctionBegin;
26   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
27   *done = PETSC_FALSE;
28 
29   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
30     if (dm->localin[i])  {cnt++;}
31     if (dm->globalin[i]) {cnt++;}
32   }
33 
34   if (--((PetscObject)dm)->refct - cnt > 0) PetscFunctionReturn(0);
35 
36   /*
37          Need this test because the dm references the vectors that
38      reference the dm, so destroying the dm calls destroy on the
39      vectors that cause another destroy on the dm
40   */
41   if (((PetscObject)dm)->refct < 0) PetscFunctionReturn(0);
42   ((PetscObject)dm)->refct = 0;
43 
44   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
45     if (dm->localout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a local vector obtained with DMGetLocalVector()");
46     if (dm->localin[i]) {ierr = VecDestroy(dm->localin[i]);CHKERRQ(ierr);}
47     if (dm->globalout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a global vector obtained with DMGetGlobalVector()");
48     if (dm->globalin[i]) {ierr = VecDestroy(dm->globalin[i]);CHKERRQ(ierr);}
49   }
50   if (dm->ltogmap)  {ierr = ISLocalToGlobalMappingDestroy(dm->ltogmap);CHKERRQ(ierr);}
51   if (dm->ltogmapb) {ierr = ISLocalToGlobalMappingDestroy(dm->ltogmapb);CHKERRQ(ierr);}
52 
53   *done = PETSC_TRUE;
54   PetscFunctionReturn(0);
55 }
56 
57 #undef __FUNCT__
58 #define __FUNCT__ "DMDestroy_DA"
59 PetscErrorCode  DMDestroy_DA(DM da)
60 {
61   PetscErrorCode ierr;
62   PetscErrorCode i;
63   PetscBool      done;
64   DM_DA          *dd = (DM_DA*)da->data;
65 
66   PetscFunctionBegin;
67   PetscValidHeaderSpecific(da,DM_CLASSID,1);
68 
69   ierr = DMDestroy_Private((DM)da,&done);CHKERRQ(ierr);
70   if (!done) PetscFunctionReturn(0);
71 
72   /* destroy the external/common part */
73   for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) {
74     ierr = PetscFree(dd->adstartghostedout[i]);CHKERRQ(ierr);
75     ierr = PetscFree(dd->adstartghostedin[i]);CHKERRQ(ierr);
76     ierr = PetscFree(dd->adstartout[i]);CHKERRQ(ierr);
77     ierr = PetscFree(dd->adstartin[i]);CHKERRQ(ierr);
78   }
79   for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) {
80     ierr = PetscFree(dd->admfstartghostedout[i]);CHKERRQ(ierr);
81     ierr = PetscFree(dd->admfstartghostedin[i]);CHKERRQ(ierr);
82     ierr = PetscFree(dd->admfstartout[i]);CHKERRQ(ierr);
83     ierr = PetscFree(dd->admfstartin[i]);CHKERRQ(ierr);
84   }
85   for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) {
86     ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr);
87     ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr);
88     ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr);
89     ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr);
90   }
91 
92   /* if memory was published with AMS then destroy it */
93   ierr = PetscObjectDepublish(da);CHKERRQ(ierr);
94 
95   if (dd->ltog)   {ierr = VecScatterDestroy(dd->ltog);CHKERRQ(ierr);}
96   if (dd->gtol)   {ierr = VecScatterDestroy(dd->gtol);CHKERRQ(ierr);}
97   if (dd->ltol)   {ierr = VecScatterDestroy(dd->ltol);CHKERRQ(ierr);}
98   if (dd->natural){
99     ierr = VecDestroy(dd->natural);CHKERRQ(ierr);
100   }
101   if (dd->gton) {
102     ierr = VecScatterDestroy(dd->gton);CHKERRQ(ierr);
103   }
104 
105   if (dd->ao) {
106     ierr = AODestroy(dd->ao);CHKERRQ(ierr);
107   }
108 
109   ierr = PetscFree(dd->idx);CHKERRQ(ierr);
110   ierr = PetscFree(dd->lx);CHKERRQ(ierr);
111   ierr = PetscFree(dd->ly);CHKERRQ(ierr);
112   ierr = PetscFree(dd->lz);CHKERRQ(ierr);
113   ierr = PetscFree(da->vectype);CHKERRQ(ierr);
114 
115   if (dd->fieldname) {
116     for (i=0; i<dd->w; i++) {
117       ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr);
118     }
119     ierr = PetscFree(dd->fieldname);CHKERRQ(ierr);
120   }
121 
122   if (dd->localcoloring) {
123     ierr = ISColoringDestroy(dd->localcoloring);CHKERRQ(ierr);
124   }
125   if (dd->ghostedcoloring) {
126     ierr = ISColoringDestroy(dd->ghostedcoloring);CHKERRQ(ierr);
127   }
128 
129   if (dd->coordinates) {ierr = VecDestroy(dd->coordinates);CHKERRQ(ierr);}
130   if (dd->ghosted_coordinates) {ierr = VecDestroy(dd->ghosted_coordinates);CHKERRQ(ierr);}
131   if (dd->da_coordinates && da != dd->da_coordinates) {ierr = DMDestroy(dd->da_coordinates);CHKERRQ(ierr);}
132 
133   ierr = PetscFree(dd->neighbors);CHKERRQ(ierr);
134   ierr = PetscFree(dd->dfill);CHKERRQ(ierr);
135   ierr = PetscFree(dd->ofill);CHKERRQ(ierr);
136   ierr = PetscFree(dd->e);CHKERRQ(ierr);
137 
138   ierr = PetscFree(dd);CHKERRQ(ierr);
139   ierr = PetscHeaderDestroy(da);CHKERRQ(ierr);
140   PetscFunctionReturn(0);
141 }
142