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