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