xref: /petsc/src/dm/impls/da/dadestroy.c (revision 58c9b8173e8b2543964ffc78265fd2abdbcb9cd3)
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  ADDA_CLASSID;
10 PetscLogEvent DMDA_LocalADFunction;
11 
12 #undef __FUNCT__
13 #define __FUNCT__ "DMDestroy_DA"
14 PetscErrorCode  DMDestroy_DA(DM dm)
15 {
16   PetscErrorCode ierr;
17   PetscErrorCode i;
18   DM_DA         *dd = (DM_DA *) dm->data;
19 
20   PetscFunctionBegin;
21   /* destroy the external/common part */
22   for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) {
23     ierr = PetscFree(dd->adstartghostedout[i]);CHKERRQ(ierr);
24     ierr = PetscFree(dd->adstartghostedin[i]);CHKERRQ(ierr);
25     ierr = PetscFree(dd->adstartout[i]);CHKERRQ(ierr);
26     ierr = PetscFree(dd->adstartin[i]);CHKERRQ(ierr);
27   }
28   for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) {
29     ierr = PetscFree(dd->admfstartghostedout[i]);CHKERRQ(ierr);
30     ierr = PetscFree(dd->admfstartghostedin[i]);CHKERRQ(ierr);
31     ierr = PetscFree(dd->admfstartout[i]);CHKERRQ(ierr);
32     ierr = PetscFree(dd->admfstartin[i]);CHKERRQ(ierr);
33   }
34   for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) {
35     ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr);
36     ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr);
37     ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr);
38     ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr);
39   }
40 
41   if (dd->ltog)   {ierr = VecScatterDestroy(dd->ltog);CHKERRQ(ierr);}
42   if (dd->gtol)   {ierr = VecScatterDestroy(dd->gtol);CHKERRQ(ierr);}
43   if (dd->ltol)   {ierr = VecScatterDestroy(dd->ltol);CHKERRQ(ierr);}
44   if (dd->natural){
45     ierr = VecDestroy(dd->natural);CHKERRQ(ierr);
46   }
47   if (dd->gton) {
48     ierr = VecScatterDestroy(dd->gton);CHKERRQ(ierr);
49   }
50 
51   if (dd->ao) {
52     ierr = AODestroy(dd->ao);CHKERRQ(ierr);
53   }
54 
55   ierr = PetscFree(dd->idx);CHKERRQ(ierr);
56   ierr = PetscFree(dd->lx);CHKERRQ(ierr);
57   ierr = PetscFree(dd->ly);CHKERRQ(ierr);
58   ierr = PetscFree(dd->lz);CHKERRQ(ierr);
59 
60   if (dd->fieldname) {
61     for (i=0; i<dd->w; i++) {
62       ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr);
63     }
64     ierr = PetscFree(dd->fieldname);CHKERRQ(ierr);
65   }
66 
67   if (dd->localcoloring) {
68     ierr = ISColoringDestroy(dd->localcoloring);CHKERRQ(ierr);
69   }
70   if (dd->ghostedcoloring) {
71     ierr = ISColoringDestroy(dd->ghostedcoloring);CHKERRQ(ierr);
72   }
73 
74   if (dd->coordinates) {ierr = VecDestroy(dd->coordinates);CHKERRQ(ierr);}
75   if (dd->ghosted_coordinates) {ierr = VecDestroy(dd->ghosted_coordinates);CHKERRQ(ierr);}
76   if (dd->da_coordinates && dm != dd->da_coordinates) {ierr = DMDestroy(dd->da_coordinates);CHKERRQ(ierr);}
77 
78   ierr = PetscFree(dd->neighbors);CHKERRQ(ierr);
79   ierr = PetscFree(dd->dfill);CHKERRQ(ierr);
80   ierr = PetscFree(dd->ofill);CHKERRQ(ierr);
81   ierr = PetscFree(dd->e);CHKERRQ(ierr);
82   PetscFunctionReturn(0);
83 }
84