1 #define PETSCDM_DLL 2 3 /* 4 Code for manipulating distributed regular arrays in parallel. 5 */ 6 7 #include "private/daimpl.h" /*I "petscdm.h" I*/ 8 9 /* Logging support */ 10 PetscClassId DM_CLASSID; 11 PetscClassId ADDA_CLASSID; 12 PetscLogEvent DMDA_GlobalToLocal, DMDA_LocalToGlobal, DMDA_LocalADFunction; 13 14 #undef __FUNCT__ 15 #define __FUNCT__ "DMDestroy_Private" 16 /* 17 DMDestroy_Private - handles the work vectors created by DMGetGlobalVector() and DMGetLocalVector() 18 19 */ 20 PetscErrorCode DMDestroy_Private(DM dm,PetscBool *done) 21 { 22 PetscErrorCode ierr; 23 PetscErrorCode i,cnt = 0; 24 25 PetscFunctionBegin; 26 PetscValidHeaderSpecific(dm,DM_CLASSID,1); 27 *done = PETSC_FALSE; 28 29 for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 30 if (dm->localin[i]) {cnt++;} 31 if (dm->globalin[i]) {cnt++;} 32 } 33 34 if (--((PetscObject)dm)->refct - cnt > 0) PetscFunctionReturn(0); 35 36 /* 37 Need this test because the dm references the vectors that 38 reference the dm, so destroying the dm calls destroy on the 39 vectors that cause another destroy on the dm 40 */ 41 if (((PetscObject)dm)->refct < 0) PetscFunctionReturn(0); 42 ((PetscObject)dm)->refct = 0; 43 44 for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 45 if (dm->localout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a local vector obtained with DMGetLocalVector()"); 46 if (dm->localin[i]) {ierr = VecDestroy(dm->localin[i]);CHKERRQ(ierr);} 47 if (dm->globalout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a global vector obtained with DMGetGlobalVector()"); 48 if (dm->globalin[i]) {ierr = VecDestroy(dm->globalin[i]);CHKERRQ(ierr);} 49 } 50 if (dm->ltogmap) {ierr = ISLocalToGlobalMappingDestroy(dm->ltogmap);CHKERRQ(ierr);} 51 if (dm->ltogmapb) {ierr = ISLocalToGlobalMappingDestroy(dm->ltogmapb);CHKERRQ(ierr);} 52 53 *done = PETSC_TRUE; 54 PetscFunctionReturn(0); 55 } 56 57 #undef __FUNCT__ 58 #define __FUNCT__ "DMDestroy_DA" 59 PetscErrorCode DMDestroy_DA(DM da) 60 { 61 PetscErrorCode ierr; 62 PetscErrorCode i; 63 PetscBool done; 64 DM_DA *dd = (DM_DA*)da->data; 65 66 PetscFunctionBegin; 67 PetscValidHeaderSpecific(da,DM_CLASSID,1); 68 69 ierr = DMDestroy_Private((DM)da,&done);CHKERRQ(ierr); 70 if (!done) PetscFunctionReturn(0); 71 72 /* destroy the external/common part */ 73 for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) { 74 ierr = PetscFree(dd->adstartghostedout[i]);CHKERRQ(ierr); 75 ierr = PetscFree(dd->adstartghostedin[i]);CHKERRQ(ierr); 76 ierr = PetscFree(dd->adstartout[i]);CHKERRQ(ierr); 77 ierr = PetscFree(dd->adstartin[i]);CHKERRQ(ierr); 78 } 79 for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) { 80 ierr = PetscFree(dd->admfstartghostedout[i]);CHKERRQ(ierr); 81 ierr = PetscFree(dd->admfstartghostedin[i]);CHKERRQ(ierr); 82 ierr = PetscFree(dd->admfstartout[i]);CHKERRQ(ierr); 83 ierr = PetscFree(dd->admfstartin[i]);CHKERRQ(ierr); 84 } 85 for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) { 86 ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr); 87 ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr); 88 ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr); 89 ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr); 90 } 91 92 /* if memory was published with AMS then destroy it */ 93 ierr = PetscObjectDepublish(da);CHKERRQ(ierr); 94 95 if (dd->ltog) {ierr = VecScatterDestroy(dd->ltog);CHKERRQ(ierr);} 96 if (dd->gtol) {ierr = VecScatterDestroy(dd->gtol);CHKERRQ(ierr);} 97 if (dd->ltol) {ierr = VecScatterDestroy(dd->ltol);CHKERRQ(ierr);} 98 if (dd->natural){ 99 ierr = VecDestroy(dd->natural);CHKERRQ(ierr); 100 } 101 if (dd->gton) { 102 ierr = VecScatterDestroy(dd->gton);CHKERRQ(ierr); 103 } 104 105 if (dd->ao) { 106 ierr = AODestroy(dd->ao);CHKERRQ(ierr); 107 } 108 109 ierr = PetscFree(dd->idx);CHKERRQ(ierr); 110 ierr = PetscFree(dd->lx);CHKERRQ(ierr); 111 ierr = PetscFree(dd->ly);CHKERRQ(ierr); 112 ierr = PetscFree(dd->lz);CHKERRQ(ierr); 113 ierr = PetscFree(da->vectype);CHKERRQ(ierr); 114 115 if (dd->fieldname) { 116 for (i=0; i<dd->w; i++) { 117 ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr); 118 } 119 ierr = PetscFree(dd->fieldname);CHKERRQ(ierr); 120 } 121 122 if (dd->localcoloring) { 123 ierr = ISColoringDestroy(dd->localcoloring);CHKERRQ(ierr); 124 } 125 if (dd->ghostedcoloring) { 126 ierr = ISColoringDestroy(dd->ghostedcoloring);CHKERRQ(ierr); 127 } 128 129 if (dd->coordinates) {ierr = VecDestroy(dd->coordinates);CHKERRQ(ierr);} 130 if (dd->ghosted_coordinates) {ierr = VecDestroy(dd->ghosted_coordinates);CHKERRQ(ierr);} 131 if (dd->da_coordinates && da != dd->da_coordinates) {ierr = DMDestroy(dd->da_coordinates);CHKERRQ(ierr);} 132 133 ierr = PetscFree(dd->neighbors);CHKERRQ(ierr); 134 ierr = PetscFree(dd->dfill);CHKERRQ(ierr); 135 ierr = PetscFree(dd->ofill);CHKERRQ(ierr); 136 ierr = PetscFree(dd->e);CHKERRQ(ierr); 137 138 ierr = PetscFree(dd);CHKERRQ(ierr); 139 ierr = PetscHeaderDestroy(da);CHKERRQ(ierr); 140 PetscFunctionReturn(0); 141 } 142