xref: /petsc/src/dm/impls/da/dadestroy.c (revision 897f70672c0b6de43165d4423f6cd5053c627e19)
147c6ae99SBarry Smith 
247c6ae99SBarry Smith /*
347c6ae99SBarry Smith   Code for manipulating distributed regular arrays in parallel.
447c6ae99SBarry Smith */
547c6ae99SBarry Smith 
6af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h>    /*I   "petscdmda.h"   I*/
747c6ae99SBarry Smith 
847c6ae99SBarry Smith /* Logging support */
967a56275SMatthew G Knepley PetscLogEvent DMDA_LocalADFunction;
1047c6ae99SBarry Smith 
1147c6ae99SBarry Smith #undef __FUNCT__
1247c6ae99SBarry Smith #define __FUNCT__ "DMDestroy_Private"
1347c6ae99SBarry Smith /*
1447c6ae99SBarry Smith    DMDestroy_Private - handles the work vectors created by DMGetGlobalVector() and DMGetLocalVector()
1547c6ae99SBarry Smith 
1647c6ae99SBarry Smith */
177087cfbeSBarry Smith PetscErrorCode  DMDestroy_Private(DM dm,PetscBool  *done)
1847c6ae99SBarry Smith {
1947c6ae99SBarry Smith   PetscErrorCode ierr;
2047c6ae99SBarry Smith   PetscErrorCode i,cnt = 0;
2147c6ae99SBarry Smith 
2247c6ae99SBarry Smith   PetscFunctionBegin;
2347c6ae99SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2447c6ae99SBarry Smith   *done = PETSC_FALSE;
2547c6ae99SBarry Smith 
2647c6ae99SBarry Smith   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
278865f1eaSKarl Rupp     if (dm->localin[i])  cnt++;
288865f1eaSKarl Rupp     if (dm->globalin[i]) cnt++;
2947c6ae99SBarry Smith   }
3047c6ae99SBarry Smith 
3147c6ae99SBarry Smith   if (--((PetscObject)dm)->refct - cnt > 0) PetscFunctionReturn(0);
3247c6ae99SBarry Smith 
3347c6ae99SBarry Smith   /*
3447c6ae99SBarry Smith          Need this test because the dm references the vectors that
3547c6ae99SBarry Smith      reference the dm, so destroying the dm calls destroy on the
3647c6ae99SBarry Smith      vectors that cause another destroy on the dm
3747c6ae99SBarry Smith   */
3847c6ae99SBarry Smith   if (((PetscObject)dm)->refct < 0) PetscFunctionReturn(0);
3947c6ae99SBarry Smith   ((PetscObject)dm)->refct = 0;
4047c6ae99SBarry Smith 
4147c6ae99SBarry Smith   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
4247c6ae99SBarry Smith     if (dm->localout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a local vector obtained with DMGetLocalVector()");
4396e147daSBarry Smith     ierr = VecDestroy(&dm->localin[i]);CHKERRQ(ierr);
4447c6ae99SBarry Smith     if (dm->globalout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a global vector obtained with DMGetGlobalVector()");
4596e147daSBarry Smith     ierr = VecDestroy(&dm->globalin[i]);CHKERRQ(ierr);
4647c6ae99SBarry Smith   }
4796e147daSBarry Smith   ierr = ISLocalToGlobalMappingDestroy(&dm->ltogmap);CHKERRQ(ierr);
481411c6eeSJed Brown 
4947c6ae99SBarry Smith   *done = PETSC_TRUE;
5047c6ae99SBarry Smith   PetscFunctionReturn(0);
5147c6ae99SBarry Smith }
5247c6ae99SBarry Smith 
5347c6ae99SBarry Smith #undef __FUNCT__
549a42bb27SBarry Smith #define __FUNCT__ "DMDestroy_DA"
556bf464f9SBarry Smith PetscErrorCode  DMDestroy_DA(DM da)
5647c6ae99SBarry Smith {
5747c6ae99SBarry Smith   PetscErrorCode ierr;
5847c6ae99SBarry Smith   PetscErrorCode i;
596bf464f9SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
6047c6ae99SBarry Smith 
6147c6ae99SBarry Smith   PetscFunctionBegin;
6247c6ae99SBarry Smith   /* destroy the external/common part */
63aa219208SBarry Smith   for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) {
6447c6ae99SBarry Smith     ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr);
6547c6ae99SBarry Smith     ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr);
6647c6ae99SBarry Smith     ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr);
6747c6ae99SBarry Smith     ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr);
6847c6ae99SBarry Smith   }
6947c6ae99SBarry Smith 
70fcfd50ebSBarry Smith   ierr = VecScatterDestroy(&dd->gtol);CHKERRQ(ierr);
71fcfd50ebSBarry Smith   ierr = VecScatterDestroy(&dd->ltol);CHKERRQ(ierr);
72fcfd50ebSBarry Smith   ierr = VecDestroy(&dd->natural);CHKERRQ(ierr);
73fcfd50ebSBarry Smith   ierr = VecScatterDestroy(&dd->gton);CHKERRQ(ierr);
74fcfd50ebSBarry Smith   ierr = AODestroy(&dd->ao);CHKERRQ(ierr);
759db3d8bcSStefano Zampini   ierr = PetscFree(dd->aotype);CHKERRQ(ierr);
7647c6ae99SBarry Smith 
7747c6ae99SBarry Smith   ierr = PetscFree(dd->lx);CHKERRQ(ierr);
7847c6ae99SBarry Smith   ierr = PetscFree(dd->ly);CHKERRQ(ierr);
7947c6ae99SBarry Smith   ierr = PetscFree(dd->lz);CHKERRQ(ierr);
8047c6ae99SBarry Smith 
81*897f7067SBarry Smith   ierr = PetscFree(dd->refine_x_hier);CHKERRQ(ierr);
82*897f7067SBarry Smith   ierr = PetscFree(dd->refine_y_hier);CHKERRQ(ierr);
83*897f7067SBarry Smith   ierr = PetscFree(dd->refine_z_hier);CHKERRQ(ierr);
84*897f7067SBarry Smith 
8547c6ae99SBarry Smith   if (dd->fieldname) {
8647c6ae99SBarry Smith     for (i=0; i<dd->w; i++) {
8747c6ae99SBarry Smith       ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr);
8847c6ae99SBarry Smith     }
8947c6ae99SBarry Smith     ierr = PetscFree(dd->fieldname);CHKERRQ(ierr);
9047c6ae99SBarry Smith   }
91109c9344SBarry Smith   if (dd->coordinatename) {
92c73cfb54SMatthew G. Knepley     for (i=0; i<da->dim; i++) {
93109c9344SBarry Smith       ierr = PetscFree(dd->coordinatename[i]);CHKERRQ(ierr);
94109c9344SBarry Smith     }
95109c9344SBarry Smith     ierr = PetscFree(dd->coordinatename);CHKERRQ(ierr);
96109c9344SBarry Smith   }
97fcfd50ebSBarry Smith   ierr = ISColoringDestroy(&dd->localcoloring);CHKERRQ(ierr);
98fcfd50ebSBarry Smith   ierr = ISColoringDestroy(&dd->ghostedcoloring);CHKERRQ(ierr);
9947c6ae99SBarry Smith 
10047c6ae99SBarry Smith   ierr = PetscFree(dd->neighbors);CHKERRQ(ierr);
10147c6ae99SBarry Smith   ierr = PetscFree(dd->dfill);CHKERRQ(ierr);
10247c6ae99SBarry Smith   ierr = PetscFree(dd->ofill);CHKERRQ(ierr);
103ae4f298aSBarry Smith   ierr = PetscFree(dd->ofillcols);CHKERRQ(ierr);
10447c6ae99SBarry Smith   ierr = PetscFree(dd->e);CHKERRQ(ierr);
105a66d4d66SMatthew G Knepley 
106797cc32aSMatthew G Knepley   /* ierr = PetscSectionDestroy(&dd->defaultGlobalSection);CHKERRQ(ierr); */
107435a35e8SMatthew G Knepley   /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */
108435a35e8SMatthew G Knepley   ierr = PetscFree(dd);CHKERRQ(ierr);
10947c6ae99SBarry Smith   PetscFunctionReturn(0);
11047c6ae99SBarry Smith }
111