xref: /petsc/src/dm/impls/da/dadestroy.c (revision 9a42bb27a39f0cdf3306a1e22d33cd9809484eaa) !
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__ "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<DA_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<DA_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<DA_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 = PetscHeaderDestroy(da);CHKERRQ(ierr);
141   PetscFunctionReturn(0);
142 }
143 
144 #undef __FUNCT__
145 #define __FUNCT__ "DAGetISLocalToGlobalMapping"
146 /*@
147    DAGetISLocalToGlobalMapping - Accesses the local-to-global mapping in a DA.
148 
149    Not Collective
150 
151    Input Parameter:
152 .  da - the distributed array that provides the mapping
153 
154    Output Parameter:
155 .  ltog - the mapping
156 
157    Level: intermediate
158 
159    Notes:
160    This mapping can them be used by VecSetLocalToGlobalMapping() or
161    MatSetLocalToGlobalMapping().
162 
163    Essentially the same data is returned in the form of an integer array
164    with the routine DAGetGlobalIndices().
165 
166 .keywords: distributed array, destroy
167 
168 .seealso: DACreate1d(), DACreate2d(), DACreate3d(), VecSetLocalToGlobalMapping(),
169           MatSetLocalToGlobalMapping(), DAGetGlobalIndices(), DAGetISLocalToGlobalMappingBlck()
170 @*/
171 PetscErrorCode PETSCDM_DLLEXPORT DAGetISLocalToGlobalMapping(DM da,ISLocalToGlobalMapping *map)
172 {
173   DM_DA *dd = (DM_DA*)da->data;
174 
175   PetscFunctionBegin;
176   PetscValidHeaderSpecific(da,DM_CLASSID,1);
177   PetscValidPointer(map,2);
178   *map = dd->ltogmap;
179   PetscFunctionReturn(0);
180 }
181 
182 #undef __FUNCT__
183 #define __FUNCT__ "DAGetISLocalToGlobalMappingBlck"
184 /*@
185    DAGetISLocalToGlobalMappingBlck - Accesses the local-to-global mapping in a DA.
186 
187    Not Collective
188 
189    Input Parameter:
190 .  da - the distributed array that provides the mapping
191 
192    Output Parameter:
193 .  ltog - the mapping
194 
195    Level: intermediate
196 
197    Notes:
198    This mapping can them be used by VecSetLocalToGlobalMappingBlock() or
199    MatSetLocalToGlobalMappingBlock().
200 
201    Essentially the same data is returned in the form of an integer array
202    with the routine DAGetGlobalIndices().
203 
204 .keywords: distributed array, destroy
205 
206 .seealso: DACreate1d(), DACreate2d(), DACreate3d(), VecSetLocalToGlobalMapping(),
207           MatSetLocalToGlobalMapping(), DAGetGlobalIndices(), DAGetISLocalToGlobalMapping()
208 @*/
209 PetscErrorCode PETSCDM_DLLEXPORT DAGetISLocalToGlobalMappingBlck(DM da,ISLocalToGlobalMapping *map)
210 {
211   DM_DA *dd = (DM_DA*)da->data;
212 
213   PetscFunctionBegin;
214   PetscValidHeaderSpecific(da,DM_CLASSID,1);
215   PetscValidPointer(map,2);
216   *map = dd->ltogmapb;
217   PetscFunctionReturn(0);
218 }
219 
220 
221