xref: /petsc/src/dm/impls/da/dadestroy.c (revision c73cfb54f34510b9dcefc99e398efa3b88d5dde5)
147c6ae99SBarry Smith 
247c6ae99SBarry Smith /*
347c6ae99SBarry Smith   Code for manipulating distributed regular arrays in parallel.
447c6ae99SBarry Smith */
547c6ae99SBarry Smith 
64035e84dSBarry 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);
7547c6ae99SBarry Smith 
7647c6ae99SBarry Smith   ierr = PetscFree(dd->lx);CHKERRQ(ierr);
7747c6ae99SBarry Smith   ierr = PetscFree(dd->ly);CHKERRQ(ierr);
7847c6ae99SBarry Smith   ierr = PetscFree(dd->lz);CHKERRQ(ierr);
7947c6ae99SBarry Smith 
8047c6ae99SBarry Smith   if (dd->fieldname) {
8147c6ae99SBarry Smith     for (i=0; i<dd->w; i++) {
8247c6ae99SBarry Smith       ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr);
8347c6ae99SBarry Smith     }
8447c6ae99SBarry Smith     ierr = PetscFree(dd->fieldname);CHKERRQ(ierr);
8547c6ae99SBarry Smith   }
86109c9344SBarry Smith   if (dd->coordinatename) {
87*c73cfb54SMatthew G. Knepley     for (i=0; i<da->dim; i++) {
88109c9344SBarry Smith       ierr = PetscFree(dd->coordinatename[i]);CHKERRQ(ierr);
89109c9344SBarry Smith     }
90109c9344SBarry Smith     ierr = PetscFree(dd->coordinatename);CHKERRQ(ierr);
91109c9344SBarry Smith   }
92fcfd50ebSBarry Smith   ierr = ISColoringDestroy(&dd->localcoloring);CHKERRQ(ierr);
93fcfd50ebSBarry Smith   ierr = ISColoringDestroy(&dd->ghostedcoloring);CHKERRQ(ierr);
9447c6ae99SBarry Smith 
9547c6ae99SBarry Smith   ierr = PetscFree(dd->neighbors);CHKERRQ(ierr);
9647c6ae99SBarry Smith   ierr = PetscFree(dd->dfill);CHKERRQ(ierr);
9747c6ae99SBarry Smith   ierr = PetscFree(dd->ofill);CHKERRQ(ierr);
98ae4f298aSBarry Smith   ierr = PetscFree(dd->ofillcols);CHKERRQ(ierr);
9947c6ae99SBarry Smith   ierr = PetscFree(dd->e);CHKERRQ(ierr);
100a66d4d66SMatthew G Knepley 
101797cc32aSMatthew G Knepley   /* ierr = PetscSectionDestroy(&dd->defaultGlobalSection);CHKERRQ(ierr); */
102435a35e8SMatthew G Knepley   /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */
103435a35e8SMatthew G Knepley   ierr = PetscFree(dd);CHKERRQ(ierr);
10447c6ae99SBarry Smith   PetscFunctionReturn(0);
10547c6ae99SBarry Smith }
106