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