Date: 2013-07-02T14:44:57+00:00

Actual source code: dadestroy.c
petsc-3.4.2 2013-07-02

      2: /*
      3:   Code for manipulating distributed regular arrays in parallel.
      4: */

      6: #include <petsc-private/dmdaimpl.h>    /*I   "petscdmda.h"   I*/

      8: /* Logging support */
      9: PetscClassId  ADDA_CLASSID;
     10: PetscLogEvent DMDA_LocalADFunction;

     14: /*
     15:    DMDestroy_Private - handles the work vectors created by DMGetGlobalVector() and DMGetLocalVector()

     17: */
     18: PetscErrorCode  DMDestroy_Private(DM dm,PetscBool  *done)
     19: {
     21:   PetscErrorCode i,cnt = 0;

     25:   *done = PETSC_FALSE;

     27:   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
     28:     if (dm->localin[i])  cnt++;
     29:     if (dm->globalin[i]) cnt++;
     30:   }

     32:   if (--((PetscObject)dm)->refct - cnt > 0) return(0);

     34:   /*
     35:          Need this test because the dm references the vectors that
     36:      reference the dm, so destroying the dm calls destroy on the
     37:      vectors that cause another destroy on the dm
     38:   */
     39:   if (((PetscObject)dm)->refct < 0) return(0);
     40:   ((PetscObject)dm)->refct = 0;

     42:   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
     43:     if (dm->localout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a local vector obtained with DMGetLocalVector()");
     44:     VecDestroy(&dm->localin[i]);
     45:     if (dm->globalout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a global vector obtained with DMGetGlobalVector()");
     46:     VecDestroy(&dm->globalin[i]);
     47:   }
     48:   ISLocalToGlobalMappingDestroy(&dm->ltogmap);
     49:   ISLocalToGlobalMappingDestroy(&dm->ltogmapb);

     51:   *done = PETSC_TRUE;
     52:   return(0);
     53: }

     57: PetscErrorCode  DMDestroy_DA(DM da)
     58: {
     60:   PetscErrorCode i;
     61:   DM_DA          *dd = (DM_DA*)da->data;

     64:   /* destroy the external/common part */
     65:   for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) {
     66:     PetscFree(dd->startghostedout[i]);
     67:     PetscFree(dd->startghostedin[i]);
     68:     PetscFree(dd->startout[i]);
     69:     PetscFree(dd->startin[i]);
     70:   }

     72:   VecScatterDestroy(&dd->ltog);
     73:   VecScatterDestroy(&dd->gtol);
     74:   VecScatterDestroy(&dd->ltol);
     75:   VecDestroy(&dd->natural);
     76:   VecScatterDestroy(&dd->gton);
     77:   AODestroy(&dd->ao);

     79:   PetscFree(dd->idx);
     80:   PetscFree(dd->lx);
     81:   PetscFree(dd->ly);
     82:   PetscFree(dd->lz);

     84:   if (dd->fieldname) {
     85:     for (i=0; i<dd->w; i++) {
     86:       PetscFree(dd->fieldname[i]);
     87:     }
     88:     PetscFree(dd->fieldname);
     89:   }
     90:   if (dd->coordinatename) {
     91:     for (i=0; i<dd->dim; i++) {
     92:       PetscFree(dd->coordinatename[i]);
     93:     }
     94:     PetscFree(dd->coordinatename);
     95:   }
     96:   ISColoringDestroy(&dd->localcoloring);
     97:   ISColoringDestroy(&dd->ghostedcoloring);

     99:   PetscFree(dd->neighbors);
    100:   PetscFree(dd->dfill);
    101:   PetscFree(dd->ofill);
    102:   PetscFree(dd->ofillcols);
    103:   PetscFree(dd->e);

    105:   /* PetscSectionDestroy(&dd->defaultGlobalSection); */
    106:   /* This was originally freed in DMDestroy(), but that prevents reference counting of backend objects */
    107:   PetscFree(dd);
    108:   return(0);
    109: }