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