1 2 /* 3 Code for manipulating distributed regular arrays in parallel. 4 */ 5 6 #include <private/daimpl.h> /*I "petscdmda.h" I*/ 7 8 /* Logging support */ 9 PetscClassId ADDA_CLASSID; 10 PetscLogEvent DMDA_LocalADFunction; 11 12 #undef __FUNCT__ 13 #define __FUNCT__ "DMDestroy_DA" 14 PetscErrorCode DMDestroy_DA(DM dm) 15 { 16 PetscErrorCode ierr; 17 PetscErrorCode i; 18 DM_DA *dd = (DM_DA *) dm->data; 19 20 PetscFunctionBegin; 21 /* destroy the external/common part */ 22 for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) { 23 ierr = PetscFree(dd->adstartghostedout[i]);CHKERRQ(ierr); 24 ierr = PetscFree(dd->adstartghostedin[i]);CHKERRQ(ierr); 25 ierr = PetscFree(dd->adstartout[i]);CHKERRQ(ierr); 26 ierr = PetscFree(dd->adstartin[i]);CHKERRQ(ierr); 27 } 28 for (i=0; i<DMDA_MAX_AD_ARRAYS; i++) { 29 ierr = PetscFree(dd->admfstartghostedout[i]);CHKERRQ(ierr); 30 ierr = PetscFree(dd->admfstartghostedin[i]);CHKERRQ(ierr); 31 ierr = PetscFree(dd->admfstartout[i]);CHKERRQ(ierr); 32 ierr = PetscFree(dd->admfstartin[i]);CHKERRQ(ierr); 33 } 34 for (i=0; i<DMDA_MAX_WORK_ARRAYS; i++) { 35 ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr); 36 ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr); 37 ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr); 38 ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr); 39 } 40 41 if (dd->ltog) {ierr = VecScatterDestroy(dd->ltog);CHKERRQ(ierr);} 42 if (dd->gtol) {ierr = VecScatterDestroy(dd->gtol);CHKERRQ(ierr);} 43 if (dd->ltol) {ierr = VecScatterDestroy(dd->ltol);CHKERRQ(ierr);} 44 if (dd->natural){ 45 ierr = VecDestroy(dd->natural);CHKERRQ(ierr); 46 } 47 if (dd->gton) { 48 ierr = VecScatterDestroy(dd->gton);CHKERRQ(ierr); 49 } 50 51 if (dd->ao) { 52 ierr = AODestroy(dd->ao);CHKERRQ(ierr); 53 } 54 55 ierr = PetscFree(dd->idx);CHKERRQ(ierr); 56 ierr = PetscFree(dd->lx);CHKERRQ(ierr); 57 ierr = PetscFree(dd->ly);CHKERRQ(ierr); 58 ierr = PetscFree(dd->lz);CHKERRQ(ierr); 59 60 if (dd->fieldname) { 61 for (i=0; i<dd->w; i++) { 62 ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr); 63 } 64 ierr = PetscFree(dd->fieldname);CHKERRQ(ierr); 65 } 66 67 if (dd->localcoloring) { 68 ierr = ISColoringDestroy(dd->localcoloring);CHKERRQ(ierr); 69 } 70 if (dd->ghostedcoloring) { 71 ierr = ISColoringDestroy(dd->ghostedcoloring);CHKERRQ(ierr); 72 } 73 74 if (dd->coordinates) {ierr = VecDestroy(dd->coordinates);CHKERRQ(ierr);} 75 if (dd->ghosted_coordinates) {ierr = VecDestroy(dd->ghosted_coordinates);CHKERRQ(ierr);} 76 if (dd->da_coordinates && dm != dd->da_coordinates) {ierr = DMDestroy(dd->da_coordinates);CHKERRQ(ierr);} 77 78 ierr = PetscFree(dd->neighbors);CHKERRQ(ierr); 79 ierr = PetscFree(dd->dfill);CHKERRQ(ierr); 80 ierr = PetscFree(dd->ofill);CHKERRQ(ierr); 81 ierr = PetscFree(dd->e);CHKERRQ(ierr); 82 PetscFunctionReturn(0); 83 } 84