xref: /petsc/src/dm/impls/da/dadestroy.c (revision 8135c375e96a7bf70d67c02f02cd826154817056)
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 /*
1247c6ae99SBarry Smith    DMDestroy_Private - handles the work vectors created by DMGetGlobalVector() and DMGetLocalVector()
1347c6ae99SBarry Smith 
1447c6ae99SBarry Smith */
157087cfbeSBarry Smith PetscErrorCode  DMDestroy_Private(DM dm,PetscBool  *done)
1647c6ae99SBarry Smith {
1747c6ae99SBarry Smith   PetscErrorCode ierr;
1847c6ae99SBarry Smith   PetscErrorCode i,cnt = 0;
1947c6ae99SBarry Smith 
2047c6ae99SBarry Smith   PetscFunctionBegin;
2147c6ae99SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2247c6ae99SBarry Smith   *done = PETSC_FALSE;
2347c6ae99SBarry Smith 
2447c6ae99SBarry Smith   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
258865f1eaSKarl Rupp     if (dm->localin[i])  cnt++;
268865f1eaSKarl Rupp     if (dm->globalin[i]) cnt++;
2747c6ae99SBarry Smith   }
2847c6ae99SBarry Smith 
2947c6ae99SBarry Smith   if (--((PetscObject)dm)->refct - cnt > 0) PetscFunctionReturn(0);
3047c6ae99SBarry Smith 
3147c6ae99SBarry Smith   /*
3247c6ae99SBarry Smith          Need this test because the dm references the vectors that
3347c6ae99SBarry Smith      reference the dm, so destroying the dm calls destroy on the
3447c6ae99SBarry Smith      vectors that cause another destroy on the dm
3547c6ae99SBarry Smith   */
3647c6ae99SBarry Smith   if (((PetscObject)dm)->refct < 0) PetscFunctionReturn(0);
3747c6ae99SBarry Smith   ((PetscObject)dm)->refct = 0;
3847c6ae99SBarry Smith 
3947c6ae99SBarry Smith   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
4047c6ae99SBarry Smith     if (dm->localout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a local vector obtained with DMGetLocalVector()");
4196e147daSBarry Smith     ierr = VecDestroy(&dm->localin[i]);CHKERRQ(ierr);
4247c6ae99SBarry Smith     if (dm->globalout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a global vector obtained with DMGetGlobalVector()");
4396e147daSBarry Smith     ierr = VecDestroy(&dm->globalin[i]);CHKERRQ(ierr);
4447c6ae99SBarry Smith   }
4596e147daSBarry Smith   ierr = ISLocalToGlobalMappingDestroy(&dm->ltogmap);CHKERRQ(ierr);
461411c6eeSJed Brown 
4747c6ae99SBarry Smith   *done = PETSC_TRUE;
4847c6ae99SBarry Smith   PetscFunctionReturn(0);
4947c6ae99SBarry Smith }
5047c6ae99SBarry Smith 
516bf464f9SBarry Smith PetscErrorCode  DMDestroy_DA(DM da)
5247c6ae99SBarry Smith {
5347c6ae99SBarry Smith   PetscErrorCode ierr;
5447c6ae99SBarry Smith   PetscErrorCode i;
556bf464f9SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
5647c6ae99SBarry Smith 
5747c6ae99SBarry Smith   PetscFunctionBegin;
5847c6ae99SBarry Smith   /* destroy the external/common part */
59aa219208SBarry Smith   for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) {
6047c6ae99SBarry Smith     ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr);
6147c6ae99SBarry Smith     ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr);
6247c6ae99SBarry Smith     ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr);
6347c6ae99SBarry Smith     ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr);
6447c6ae99SBarry Smith   }
6547c6ae99SBarry Smith 
66fcfd50ebSBarry Smith   ierr = VecScatterDestroy(&dd->gtol);CHKERRQ(ierr);
67fcfd50ebSBarry Smith   ierr = VecScatterDestroy(&dd->ltol);CHKERRQ(ierr);
68fcfd50ebSBarry Smith   ierr = VecDestroy(&dd->natural);CHKERRQ(ierr);
69fcfd50ebSBarry Smith   ierr = VecScatterDestroy(&dd->gton);CHKERRQ(ierr);
70fcfd50ebSBarry Smith   ierr = AODestroy(&dd->ao);CHKERRQ(ierr);
719db3d8bcSStefano Zampini   ierr = PetscFree(dd->aotype);CHKERRQ(ierr);
7247c6ae99SBarry Smith 
7347c6ae99SBarry Smith   ierr = PetscFree(dd->lx);CHKERRQ(ierr);
7447c6ae99SBarry Smith   ierr = PetscFree(dd->ly);CHKERRQ(ierr);
7547c6ae99SBarry Smith   ierr = PetscFree(dd->lz);CHKERRQ(ierr);
7647c6ae99SBarry Smith 
77897f7067SBarry Smith   ierr = PetscFree(dd->refine_x_hier);CHKERRQ(ierr);
78897f7067SBarry Smith   ierr = PetscFree(dd->refine_y_hier);CHKERRQ(ierr);
79897f7067SBarry Smith   ierr = PetscFree(dd->refine_z_hier);CHKERRQ(ierr);
80897f7067SBarry Smith 
8147c6ae99SBarry Smith   if (dd->fieldname) {
8247c6ae99SBarry Smith     for (i=0; i<dd->w; i++) {
8347c6ae99SBarry Smith       ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr);
8447c6ae99SBarry Smith     }
8547c6ae99SBarry Smith     ierr = PetscFree(dd->fieldname);CHKERRQ(ierr);
8647c6ae99SBarry Smith   }
87109c9344SBarry Smith   if (dd->coordinatename) {
88c73cfb54SMatthew G. Knepley     for (i=0; i<da->dim; i++) {
89109c9344SBarry Smith       ierr = PetscFree(dd->coordinatename[i]);CHKERRQ(ierr);
90109c9344SBarry Smith     }
91109c9344SBarry Smith     ierr = PetscFree(dd->coordinatename);CHKERRQ(ierr);
92109c9344SBarry Smith   }
93fcfd50ebSBarry Smith   ierr = ISColoringDestroy(&dd->localcoloring);CHKERRQ(ierr);
94fcfd50ebSBarry Smith   ierr = ISColoringDestroy(&dd->ghostedcoloring);CHKERRQ(ierr);
9547c6ae99SBarry Smith 
9647c6ae99SBarry Smith   ierr = PetscFree(dd->neighbors);CHKERRQ(ierr);
9747c6ae99SBarry Smith   ierr = PetscFree(dd->dfill);CHKERRQ(ierr);
9847c6ae99SBarry Smith   ierr = PetscFree(dd->ofill);CHKERRQ(ierr);
99ae4f298aSBarry Smith   ierr = PetscFree(dd->ofillcols);CHKERRQ(ierr);
10047c6ae99SBarry Smith   ierr = PetscFree(dd->e);CHKERRQ(ierr);
101a66d4d66SMatthew G Knepley 
102*8135c375SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)da,"DMSetUpGLVisViewer_C",NULL);CHKERRQ(ierr);
103*8135c375SStefano Zampini 
104797cc32aSMatthew G Knepley   /* ierr = PetscSectionDestroy(&dd->defaultGlobalSection);CHKERRQ(ierr); */
105435a35e8SMatthew G Knepley   /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */
106435a35e8SMatthew G Knepley   ierr = PetscFree(dd);CHKERRQ(ierr);
10747c6ae99SBarry Smith   PetscFunctionReturn(0);
10847c6ae99SBarry Smith }
109