xref: /petsc/src/dm/impls/da/dadestroy.c (revision 09573ac72a50d3e7ecd55a2b7f0ef28450cd0a8b)
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 PETSCDM_DLLEXPORT DM_CLASSID;
11 PetscClassId PETSCDM_DLLEXPORT 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 PETSCDM_DLLEXPORT 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 PETSCDM_DLLEXPORT 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->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