xref: /petsc/src/dm/impls/da/dadestroy.c (revision 8b8307b2cbff7ae63ec0459e534a4a6ccda2943f)
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   *done = PETSC_TRUE;
51   PetscFunctionReturn(0);
52 }
53 
54 #undef __FUNCT__
55 #define __FUNCT__ "DMDestroy_DA"
56 PetscErrorCode PETSCDM_DLLEXPORT DMDestroy_DA(DM da)
57 {
58   PetscErrorCode ierr;
59   PetscErrorCode i;
60   PetscBool      done;
61   DM_DA          *dd = (DM_DA*)da->data;
62 
63   PetscFunctionBegin;
64   PetscValidHeaderSpecific(da,DM_CLASSID,1);
65 
66   ierr = DMDestroy_Private((DM)da,&done);CHKERRQ(ierr);
67   if (!done) PetscFunctionReturn(0);
68 
69   /* destroy the external/common part */
70   for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) {
71     ierr = PetscFree(dd->adstartghostedout[i]);CHKERRQ(ierr);
72     ierr = PetscFree(dd->adstartghostedin[i]);CHKERRQ(ierr);
73     ierr = PetscFree(dd->adstartout[i]);CHKERRQ(ierr);
74     ierr = PetscFree(dd->adstartin[i]);CHKERRQ(ierr);
75   }
76   for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) {
77     ierr = PetscFree(dd->admfstartghostedout[i]);CHKERRQ(ierr);
78     ierr = PetscFree(dd->admfstartghostedin[i]);CHKERRQ(ierr);
79     ierr = PetscFree(dd->admfstartout[i]);CHKERRQ(ierr);
80     ierr = PetscFree(dd->admfstartin[i]);CHKERRQ(ierr);
81   }
82   for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) {
83     ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr);
84     ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr);
85     ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr);
86     ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr);
87   }
88 
89   /* if memory was published with AMS then destroy it */
90   ierr = PetscObjectDepublish(da);CHKERRQ(ierr);
91 
92   if (dd->ltog)   {ierr = VecScatterDestroy(dd->ltog);CHKERRQ(ierr);}
93   if (dd->gtol)   {ierr = VecScatterDestroy(dd->gtol);CHKERRQ(ierr);}
94   if (dd->ltol)   {ierr = VecScatterDestroy(dd->ltol);CHKERRQ(ierr);}
95   if (dd->natural){
96     ierr = VecDestroy(dd->natural);CHKERRQ(ierr);
97   }
98   if (dd->gton) {
99     ierr = VecScatterDestroy(dd->gton);CHKERRQ(ierr);
100   }
101 
102   if (dd->ao) {
103     ierr = AODestroy(dd->ao);CHKERRQ(ierr);
104   }
105   if (dd->ltogmap) {
106     ierr = ISLocalToGlobalMappingDestroy(dd->ltogmap);CHKERRQ(ierr);
107   }
108   if (dd->ltogmapb) {
109     ierr = ISLocalToGlobalMappingDestroy(dd->ltogmapb);CHKERRQ(ierr);
110   }
111 
112   ierr = PetscFree(dd->lx);CHKERRQ(ierr);
113   ierr = PetscFree(dd->ly);CHKERRQ(ierr);
114   ierr = PetscFree(dd->lz);CHKERRQ(ierr);
115   ierr = PetscFree(da->vectype);CHKERRQ(ierr);
116 
117   if (dd->fieldname) {
118     for (i=0; i<dd->w; i++) {
119       ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr);
120     }
121     ierr = PetscFree(dd->fieldname);CHKERRQ(ierr);
122   }
123 
124   if (dd->localcoloring) {
125     ierr = ISColoringDestroy(dd->localcoloring);CHKERRQ(ierr);
126   }
127   if (dd->ghostedcoloring) {
128     ierr = ISColoringDestroy(dd->ghostedcoloring);CHKERRQ(ierr);
129   }
130 
131   if (dd->coordinates) {ierr = VecDestroy(dd->coordinates);CHKERRQ(ierr);}
132   if (dd->ghosted_coordinates) {ierr = VecDestroy(dd->ghosted_coordinates);CHKERRQ(ierr);}
133   if (dd->da_coordinates && da != dd->da_coordinates) {ierr = DMDestroy(dd->da_coordinates);CHKERRQ(ierr);}
134 
135   ierr = PetscFree(dd->neighbors);CHKERRQ(ierr);
136   ierr = PetscFree(dd->dfill);CHKERRQ(ierr);
137   ierr = PetscFree(dd->ofill);CHKERRQ(ierr);
138   ierr = PetscFree(dd->e);CHKERRQ(ierr);
139 
140   ierr = PetscFree(dd);CHKERRQ(ierr);
141   ierr = PetscHeaderDestroy(da);CHKERRQ(ierr);
142   PetscFunctionReturn(0);
143 }
144 
145 #undef __FUNCT__
146 #define __FUNCT__ "DMDAGetISLocalToGlobalMapping"
147 /*@
148    DMDAGetISLocalToGlobalMapping - Accesses the local-to-global mapping in a DMDA.
149 
150    Not Collective
151 
152    Input Parameter:
153 .  da - the distributed array that provides the mapping
154 
155    Output Parameter:
156 .  ltog - the mapping
157 
158    Level: intermediate
159 
160    Notes:
161    This mapping can them be used by VecSetLocalToGlobalMapping() or
162    MatSetLocalToGlobalMapping().
163 
164    Essentially the same data is returned in the form of an integer array
165    with the routine DMDAGetGlobalIndices().
166 
167 .keywords: distributed array, destroy
168 
169 .seealso: DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), VecSetLocalToGlobalMapping(),
170           MatSetLocalToGlobalMapping(), DMDAGetGlobalIndices(), DMDAGetISLocalToGlobalMappingBlck()
171 @*/
172 PetscErrorCode PETSCDM_DLLEXPORT DMDAGetISLocalToGlobalMapping(DM da,ISLocalToGlobalMapping *map)
173 {
174   DM_DA *dd = (DM_DA*)da->data;
175 
176   PetscFunctionBegin;
177   PetscValidHeaderSpecific(da,DM_CLASSID,1);
178   PetscValidPointer(map,2);
179   *map = dd->ltogmap;
180   PetscFunctionReturn(0);
181 }
182 
183 #undef __FUNCT__
184 #define __FUNCT__ "DMDAGetISLocalToGlobalMappingBlck"
185 /*@
186    DMDAGetISLocalToGlobalMappingBlck - Accesses the local-to-global mapping in a DMDA.
187 
188    Not Collective
189 
190    Input Parameter:
191 .  da - the distributed array that provides the mapping
192 
193    Output Parameter:
194 .  ltog - the mapping
195 
196    Level: intermediate
197 
198    Notes:
199    This mapping can them be used by VecSetLocalToGlobalMappingBlock() or
200    MatSetLocalToGlobalMappingBlock().
201 
202    Essentially the same data is returned in the form of an integer array
203    with the routine DMDAGetGlobalIndices().
204 
205 .keywords: distributed array, destroy
206 
207 .seealso: DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), VecSetLocalToGlobalMapping(),
208           MatSetLocalToGlobalMapping(), DMDAGetGlobalIndices(), DMDAGetISLocalToGlobalMapping()
209 @*/
210 PetscErrorCode PETSCDM_DLLEXPORT DMDAGetISLocalToGlobalMappingBlck(DM da,ISLocalToGlobalMapping *map)
211 {
212   DM_DA *dd = (DM_DA*)da->data;
213 
214   PetscFunctionBegin;
215   PetscValidHeaderSpecific(da,DM_CLASSID,1);
216   PetscValidPointer(map,2);
217   *map = dd->ltogmapb;
218   PetscFunctionReturn(0);
219 }
220 
221 
222