xref: /petsc/src/dm/impls/da/dadestroy.c (revision fcfd50eb5fbe12291db06fc1b33ad004ead64926)
1 
2 /*
3   Code for manipulating distributed regular arrays in parallel.
4 */
5 
6 #include <private/daimpl.h>    /*I   "petscdmda.h"   I*/
7 
8 /* Logging support */
9 PetscClassId  DM_CLASSID;
10 PetscClassId  ADDA_CLASSID;
11 PetscLogEvent DMDA_LocalADFunction;
12 
13 #undef __FUNCT__
14 #define __FUNCT__ "DMDestroy_Private"
15 /*
16    DMDestroy_Private - handles the work vectors created by DMGetGlobalVector() and DMGetLocalVector()
17 
18 */
19 PetscErrorCode  DMDestroy_Private(DM dm,PetscBool  *done)
20 {
21   PetscErrorCode ierr;
22   PetscErrorCode i,cnt = 0;
23 
24   PetscFunctionBegin;
25   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
26   *done = PETSC_FALSE;
27 
28   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
29     if (dm->localin[i])  {cnt++;}
30     if (dm->globalin[i]) {cnt++;}
31   }
32 
33   if (--((PetscObject)dm)->refct - cnt > 0) PetscFunctionReturn(0);
34 
35   /*
36          Need this test because the dm references the vectors that
37      reference the dm, so destroying the dm calls destroy on the
38      vectors that cause another destroy on the dm
39   */
40   if (((PetscObject)dm)->refct < 0) PetscFunctionReturn(0);
41   ((PetscObject)dm)->refct = 0;
42 
43   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
44     if (dm->localout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a local vector obtained with DMGetLocalVector()");
45     if (dm->localin[i]) {ierr = VecDestroy(&dm->localin[i]);CHKERRQ(ierr);}
46     if (dm->globalout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a global vector obtained with DMGetGlobalVector()");
47     if (dm->globalin[i]) {ierr = VecDestroy(&dm->globalin[i]);CHKERRQ(ierr);}
48   }
49   if (dm->ltogmap)  {ierr = ISLocalToGlobalMappingDestroy(&dm->ltogmap);CHKERRQ(ierr);}
50   if (dm->ltogmapb) {ierr = ISLocalToGlobalMappingDestroy(&dm->ltogmapb);CHKERRQ(ierr);}
51 
52   *done = PETSC_TRUE;
53   PetscFunctionReturn(0);
54 }
55 
56 #undef __FUNCT__
57 #define __FUNCT__ "DMDestroy_DA"
58 PetscErrorCode  DMDestroy_DA(DM *da)
59 {
60   PetscErrorCode ierr;
61   PetscErrorCode i;
62   PetscBool      done;
63   DM_DA          *dd = (DM_DA*)(*da)->data;
64 
65   PetscFunctionBegin;
66   PetscValidHeaderSpecific(da,DM_CLASSID,1);
67 
68   ierr = DMDestroy_Private((DM)da,&done);CHKERRQ(ierr);
69   if (!done) PetscFunctionReturn(0);
70 
71   /* destroy the external/common part */
72   for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) {
73     ierr = PetscFree(dd->adstartghostedout[i]);CHKERRQ(ierr);
74     ierr = PetscFree(dd->adstartghostedin[i]);CHKERRQ(ierr);
75     ierr = PetscFree(dd->adstartout[i]);CHKERRQ(ierr);
76     ierr = PetscFree(dd->adstartin[i]);CHKERRQ(ierr);
77   }
78   for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) {
79     ierr = PetscFree(dd->admfstartghostedout[i]);CHKERRQ(ierr);
80     ierr = PetscFree(dd->admfstartghostedin[i]);CHKERRQ(ierr);
81     ierr = PetscFree(dd->admfstartout[i]);CHKERRQ(ierr);
82     ierr = PetscFree(dd->admfstartin[i]);CHKERRQ(ierr);
83   }
84   for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) {
85     ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr);
86     ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr);
87     ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr);
88     ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr);
89   }
90 
91   /* if memory was published with AMS then destroy it */
92   ierr = PetscObjectDepublish(da);CHKERRQ(ierr);
93 
94   ierr = VecScatterDestroy(&dd->ltog);CHKERRQ(ierr);
95   ierr = VecScatterDestroy(&dd->gtol);CHKERRQ(ierr);
96   ierr = VecScatterDestroy(&dd->ltol);CHKERRQ(ierr);
97   ierr = VecDestroy(&dd->natural);CHKERRQ(ierr);
98   ierr = VecScatterDestroy(&dd->gton);CHKERRQ(ierr);
99   ierr = AODestroy(&dd->ao);CHKERRQ(ierr);
100 
101   ierr = PetscFree(dd->idx);CHKERRQ(ierr);
102   ierr = PetscFree(dd->lx);CHKERRQ(ierr);
103   ierr = PetscFree(dd->ly);CHKERRQ(ierr);
104   ierr = PetscFree(dd->lz);CHKERRQ(ierr);
105   ierr = PetscFree(da->vectype);CHKERRQ(ierr);
106 
107   if (dd->fieldname) {
108     for (i=0; i<dd->w; i++) {
109       ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr);
110     }
111     ierr = PetscFree(dd->fieldname);CHKERRQ(ierr);
112   }
113   ierr = ISColoringDestroy(&dd->localcoloring);CHKERRQ(ierr);
114   ierr = ISColoringDestroy(&dd->ghostedcoloring);CHKERRQ(ierr);
115 
116   ierr = VecDestroy(&dd->coordinates);CHKERRQ(ierr);}
117   ierr = VecDestroy(&dd->ghosted_coordinates);CHKERRQ(ierr);}
118   if (dd->da_coordinates && da != dd->da_coordinates) {ierr = DMDestroy(&dd->da_coordinates);CHKERRQ(ierr);}
119 
120   ierr = PetscFree(dd->neighbors);CHKERRQ(ierr);
121   ierr = PetscFree(dd->dfill);CHKERRQ(ierr);
122   ierr = PetscFree(dd->ofill);CHKERRQ(ierr);
123   ierr = PetscFree(dd->e);CHKERRQ(ierr);
124 
125   ierr = PetscFree(dd);CHKERRQ(ierr);
126   ierr = PetscHeaderDestroy(da);CHKERRQ(ierr);
127   PetscFunctionReturn(0);
128 }
129