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