1*47c6ae99SBarry Smith #define PETSCDM_DLL 2*47c6ae99SBarry Smith 3*47c6ae99SBarry Smith /* 4*47c6ae99SBarry Smith Code for manipulating distributed regular arrays in parallel. 5*47c6ae99SBarry Smith */ 6*47c6ae99SBarry Smith 7*47c6ae99SBarry Smith #include "private/daimpl.h" /*I "petscda.h" I*/ 8*47c6ae99SBarry Smith 9*47c6ae99SBarry Smith /* Logging support */ 10*47c6ae99SBarry Smith PetscClassId PETSCDM_DLLEXPORT DM_CLASSID; 11*47c6ae99SBarry Smith PetscClassId PETSCDM_DLLEXPORT ADDA_CLASSID; 12*47c6ae99SBarry Smith PetscLogEvent DA_GlobalToLocal, DA_LocalToGlobal, DA_LocalADFunction; 13*47c6ae99SBarry Smith 14*47c6ae99SBarry Smith #undef __FUNCT__ 15*47c6ae99SBarry Smith #define __FUNCT__ "DMDestroy_Private" 16*47c6ae99SBarry Smith /* 17*47c6ae99SBarry Smith DMDestroy_Private - handles the work vectors created by DMGetGlobalVector() and DMGetLocalVector() 18*47c6ae99SBarry Smith 19*47c6ae99SBarry Smith */ 20*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMDestroy_Private(DM dm,PetscBool *done) 21*47c6ae99SBarry Smith { 22*47c6ae99SBarry Smith PetscErrorCode ierr; 23*47c6ae99SBarry Smith PetscErrorCode i,cnt = 0; 24*47c6ae99SBarry Smith 25*47c6ae99SBarry Smith PetscFunctionBegin; 26*47c6ae99SBarry Smith PetscValidHeaderSpecific(dm,DM_CLASSID,1); 27*47c6ae99SBarry Smith *done = PETSC_FALSE; 28*47c6ae99SBarry Smith 29*47c6ae99SBarry Smith for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 30*47c6ae99SBarry Smith if (dm->localin[i]) {cnt++;} 31*47c6ae99SBarry Smith if (dm->globalin[i]) {cnt++;} 32*47c6ae99SBarry Smith } 33*47c6ae99SBarry Smith 34*47c6ae99SBarry Smith if (--((PetscObject)dm)->refct - cnt > 0) PetscFunctionReturn(0); 35*47c6ae99SBarry Smith 36*47c6ae99SBarry Smith /* 37*47c6ae99SBarry Smith Need this test because the dm references the vectors that 38*47c6ae99SBarry Smith reference the dm, so destroying the dm calls destroy on the 39*47c6ae99SBarry Smith vectors that cause another destroy on the dm 40*47c6ae99SBarry Smith */ 41*47c6ae99SBarry Smith if (((PetscObject)dm)->refct < 0) PetscFunctionReturn(0); 42*47c6ae99SBarry Smith ((PetscObject)dm)->refct = 0; 43*47c6ae99SBarry Smith 44*47c6ae99SBarry Smith for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 45*47c6ae99SBarry Smith if (dm->localout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a local vector obtained with DMGetLocalVector()"); 46*47c6ae99SBarry Smith if (dm->localin[i]) {ierr = VecDestroy(dm->localin[i]);CHKERRQ(ierr);} 47*47c6ae99SBarry Smith if (dm->globalout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Destroying a DM that has a global vector obtained with DMGetGlobalVector()"); 48*47c6ae99SBarry Smith if (dm->globalin[i]) {ierr = VecDestroy(dm->globalin[i]);CHKERRQ(ierr);} 49*47c6ae99SBarry Smith } 50*47c6ae99SBarry Smith *done = PETSC_TRUE; 51*47c6ae99SBarry Smith PetscFunctionReturn(0); 52*47c6ae99SBarry Smith } 53*47c6ae99SBarry Smith 54*47c6ae99SBarry Smith #undef __FUNCT__ 55*47c6ae99SBarry Smith #define __FUNCT__ "DADestroy" 56*47c6ae99SBarry Smith /*@ 57*47c6ae99SBarry Smith DADestroy - Destroys a distributed array. 58*47c6ae99SBarry Smith 59*47c6ae99SBarry Smith Collective on DA 60*47c6ae99SBarry Smith 61*47c6ae99SBarry Smith Input Parameter: 62*47c6ae99SBarry Smith . da - the distributed array to destroy 63*47c6ae99SBarry Smith 64*47c6ae99SBarry Smith Level: beginner 65*47c6ae99SBarry Smith 66*47c6ae99SBarry Smith .keywords: distributed array, destroy 67*47c6ae99SBarry Smith 68*47c6ae99SBarry Smith .seealso: DACreate1d(), DACreate2d(), DACreate3d() 69*47c6ae99SBarry Smith @*/ 70*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DADestroy(DA da) 71*47c6ae99SBarry Smith { 72*47c6ae99SBarry Smith PetscErrorCode ierr; 73*47c6ae99SBarry Smith PetscErrorCode i; 74*47c6ae99SBarry Smith PetscBool done; 75*47c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 76*47c6ae99SBarry Smith 77*47c6ae99SBarry Smith PetscFunctionBegin; 78*47c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 79*47c6ae99SBarry Smith 80*47c6ae99SBarry Smith ierr = DMDestroy_Private((DM)da,&done);CHKERRQ(ierr); 81*47c6ae99SBarry Smith if (!done) PetscFunctionReturn(0); 82*47c6ae99SBarry Smith /* destroy the internal part */ 83*47c6ae99SBarry Smith if (da->ops->destroy) { 84*47c6ae99SBarry Smith ierr = (*da->ops->destroy)(da);CHKERRQ(ierr); 85*47c6ae99SBarry Smith } 86*47c6ae99SBarry Smith /* destroy the external/common part */ 87*47c6ae99SBarry Smith for (i=0; i<DA_MAX_AD_ARRAYS; i++) { 88*47c6ae99SBarry Smith ierr = PetscFree(dd->adstartghostedout[i]);CHKERRQ(ierr); 89*47c6ae99SBarry Smith ierr = PetscFree(dd->adstartghostedin[i]);CHKERRQ(ierr); 90*47c6ae99SBarry Smith ierr = PetscFree(dd->adstartout[i]);CHKERRQ(ierr); 91*47c6ae99SBarry Smith ierr = PetscFree(dd->adstartin[i]);CHKERRQ(ierr); 92*47c6ae99SBarry Smith } 93*47c6ae99SBarry Smith for (i=0; i<DA_MAX_AD_ARRAYS; i++) { 94*47c6ae99SBarry Smith ierr = PetscFree(dd->admfstartghostedout[i]);CHKERRQ(ierr); 95*47c6ae99SBarry Smith ierr = PetscFree(dd->admfstartghostedin[i]);CHKERRQ(ierr); 96*47c6ae99SBarry Smith ierr = PetscFree(dd->admfstartout[i]);CHKERRQ(ierr); 97*47c6ae99SBarry Smith ierr = PetscFree(dd->admfstartin[i]);CHKERRQ(ierr); 98*47c6ae99SBarry Smith } 99*47c6ae99SBarry Smith for (i=0; i<DA_MAX_WORK_ARRAYS; i++) { 100*47c6ae99SBarry Smith ierr = PetscFree(dd->startghostedout[i]);CHKERRQ(ierr); 101*47c6ae99SBarry Smith ierr = PetscFree(dd->startghostedin[i]);CHKERRQ(ierr); 102*47c6ae99SBarry Smith ierr = PetscFree(dd->startout[i]);CHKERRQ(ierr); 103*47c6ae99SBarry Smith ierr = PetscFree(dd->startin[i]);CHKERRQ(ierr); 104*47c6ae99SBarry Smith } 105*47c6ae99SBarry Smith 106*47c6ae99SBarry Smith /* if memory was published with AMS then destroy it */ 107*47c6ae99SBarry Smith ierr = PetscObjectDepublish(da);CHKERRQ(ierr); 108*47c6ae99SBarry Smith 109*47c6ae99SBarry Smith if (dd->ltog) {ierr = VecScatterDestroy(dd->ltog);CHKERRQ(ierr);} 110*47c6ae99SBarry Smith if (dd->gtol) {ierr = VecScatterDestroy(dd->gtol);CHKERRQ(ierr);} 111*47c6ae99SBarry Smith if (dd->ltol) {ierr = VecScatterDestroy(dd->ltol);CHKERRQ(ierr);} 112*47c6ae99SBarry Smith if (dd->natural){ 113*47c6ae99SBarry Smith ierr = VecDestroy(dd->natural);CHKERRQ(ierr); 114*47c6ae99SBarry Smith } 115*47c6ae99SBarry Smith if (dd->gton) { 116*47c6ae99SBarry Smith ierr = VecScatterDestroy(dd->gton);CHKERRQ(ierr); 117*47c6ae99SBarry Smith } 118*47c6ae99SBarry Smith 119*47c6ae99SBarry Smith if (dd->ao) { 120*47c6ae99SBarry Smith ierr = AODestroy(dd->ao);CHKERRQ(ierr); 121*47c6ae99SBarry Smith } 122*47c6ae99SBarry Smith if (dd->ltogmap) { 123*47c6ae99SBarry Smith ierr = ISLocalToGlobalMappingDestroy(dd->ltogmap);CHKERRQ(ierr); 124*47c6ae99SBarry Smith } 125*47c6ae99SBarry Smith if (dd->ltogmapb) { 126*47c6ae99SBarry Smith ierr = ISLocalToGlobalMappingDestroy(dd->ltogmapb);CHKERRQ(ierr); 127*47c6ae99SBarry Smith } 128*47c6ae99SBarry Smith 129*47c6ae99SBarry Smith ierr = PetscFree(dd->lx);CHKERRQ(ierr); 130*47c6ae99SBarry Smith ierr = PetscFree(dd->ly);CHKERRQ(ierr); 131*47c6ae99SBarry Smith ierr = PetscFree(dd->lz);CHKERRQ(ierr); 132*47c6ae99SBarry Smith ierr = PetscFree(da->vectype);CHKERRQ(ierr); 133*47c6ae99SBarry Smith 134*47c6ae99SBarry Smith if (dd->fieldname) { 135*47c6ae99SBarry Smith for (i=0; i<dd->w; i++) { 136*47c6ae99SBarry Smith ierr = PetscFree(dd->fieldname[i]);CHKERRQ(ierr); 137*47c6ae99SBarry Smith } 138*47c6ae99SBarry Smith ierr = PetscFree(dd->fieldname);CHKERRQ(ierr); 139*47c6ae99SBarry Smith } 140*47c6ae99SBarry Smith 141*47c6ae99SBarry Smith if (dd->localcoloring) { 142*47c6ae99SBarry Smith ierr = ISColoringDestroy(dd->localcoloring);CHKERRQ(ierr); 143*47c6ae99SBarry Smith } 144*47c6ae99SBarry Smith if (dd->ghostedcoloring) { 145*47c6ae99SBarry Smith ierr = ISColoringDestroy(dd->ghostedcoloring);CHKERRQ(ierr); 146*47c6ae99SBarry Smith } 147*47c6ae99SBarry Smith 148*47c6ae99SBarry Smith if (dd->coordinates) {ierr = VecDestroy(dd->coordinates);CHKERRQ(ierr);} 149*47c6ae99SBarry Smith if (dd->ghosted_coordinates) {ierr = VecDestroy(dd->ghosted_coordinates);CHKERRQ(ierr);} 150*47c6ae99SBarry Smith if (dd->da_coordinates && da != dd->da_coordinates) {ierr = DADestroy(dd->da_coordinates);CHKERRQ(ierr);} 151*47c6ae99SBarry Smith 152*47c6ae99SBarry Smith ierr = PetscFree(dd->neighbors);CHKERRQ(ierr); 153*47c6ae99SBarry Smith ierr = PetscFree(dd->dfill);CHKERRQ(ierr); 154*47c6ae99SBarry Smith ierr = PetscFree(dd->ofill);CHKERRQ(ierr); 155*47c6ae99SBarry Smith ierr = PetscFree(dd->e);CHKERRQ(ierr); 156*47c6ae99SBarry Smith 157*47c6ae99SBarry Smith ierr = PetscHeaderDestroy(da);CHKERRQ(ierr); 158*47c6ae99SBarry Smith PetscFunctionReturn(0); 159*47c6ae99SBarry Smith } 160*47c6ae99SBarry Smith 161*47c6ae99SBarry Smith #undef __FUNCT__ 162*47c6ae99SBarry Smith #define __FUNCT__ "DAGetISLocalToGlobalMapping" 163*47c6ae99SBarry Smith /*@ 164*47c6ae99SBarry Smith DAGetISLocalToGlobalMapping - Accesses the local-to-global mapping in a DA. 165*47c6ae99SBarry Smith 166*47c6ae99SBarry Smith Not Collective 167*47c6ae99SBarry Smith 168*47c6ae99SBarry Smith Input Parameter: 169*47c6ae99SBarry Smith . da - the distributed array that provides the mapping 170*47c6ae99SBarry Smith 171*47c6ae99SBarry Smith Output Parameter: 172*47c6ae99SBarry Smith . ltog - the mapping 173*47c6ae99SBarry Smith 174*47c6ae99SBarry Smith Level: intermediate 175*47c6ae99SBarry Smith 176*47c6ae99SBarry Smith Notes: 177*47c6ae99SBarry Smith This mapping can them be used by VecSetLocalToGlobalMapping() or 178*47c6ae99SBarry Smith MatSetLocalToGlobalMapping(). 179*47c6ae99SBarry Smith 180*47c6ae99SBarry Smith Essentially the same data is returned in the form of an integer array 181*47c6ae99SBarry Smith with the routine DAGetGlobalIndices(). 182*47c6ae99SBarry Smith 183*47c6ae99SBarry Smith .keywords: distributed array, destroy 184*47c6ae99SBarry Smith 185*47c6ae99SBarry Smith .seealso: DACreate1d(), DACreate2d(), DACreate3d(), VecSetLocalToGlobalMapping(), 186*47c6ae99SBarry Smith MatSetLocalToGlobalMapping(), DAGetGlobalIndices(), DAGetISLocalToGlobalMappingBlck() 187*47c6ae99SBarry Smith @*/ 188*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGetISLocalToGlobalMapping(DA da,ISLocalToGlobalMapping *map) 189*47c6ae99SBarry Smith { 190*47c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 191*47c6ae99SBarry Smith 192*47c6ae99SBarry Smith PetscFunctionBegin; 193*47c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 194*47c6ae99SBarry Smith PetscValidPointer(map,2); 195*47c6ae99SBarry Smith *map = dd->ltogmap; 196*47c6ae99SBarry Smith PetscFunctionReturn(0); 197*47c6ae99SBarry Smith } 198*47c6ae99SBarry Smith 199*47c6ae99SBarry Smith #undef __FUNCT__ 200*47c6ae99SBarry Smith #define __FUNCT__ "DAGetISLocalToGlobalMappingBlck" 201*47c6ae99SBarry Smith /*@ 202*47c6ae99SBarry Smith DAGetISLocalToGlobalMappingBlck - Accesses the local-to-global mapping in a DA. 203*47c6ae99SBarry Smith 204*47c6ae99SBarry Smith Not Collective 205*47c6ae99SBarry Smith 206*47c6ae99SBarry Smith Input Parameter: 207*47c6ae99SBarry Smith . da - the distributed array that provides the mapping 208*47c6ae99SBarry Smith 209*47c6ae99SBarry Smith Output Parameter: 210*47c6ae99SBarry Smith . ltog - the mapping 211*47c6ae99SBarry Smith 212*47c6ae99SBarry Smith Level: intermediate 213*47c6ae99SBarry Smith 214*47c6ae99SBarry Smith Notes: 215*47c6ae99SBarry Smith This mapping can them be used by VecSetLocalToGlobalMappingBlock() or 216*47c6ae99SBarry Smith MatSetLocalToGlobalMappingBlock(). 217*47c6ae99SBarry Smith 218*47c6ae99SBarry Smith Essentially the same data is returned in the form of an integer array 219*47c6ae99SBarry Smith with the routine DAGetGlobalIndices(). 220*47c6ae99SBarry Smith 221*47c6ae99SBarry Smith .keywords: distributed array, destroy 222*47c6ae99SBarry Smith 223*47c6ae99SBarry Smith .seealso: DACreate1d(), DACreate2d(), DACreate3d(), VecSetLocalToGlobalMapping(), 224*47c6ae99SBarry Smith MatSetLocalToGlobalMapping(), DAGetGlobalIndices(), DAGetISLocalToGlobalMapping() 225*47c6ae99SBarry Smith @*/ 226*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGetISLocalToGlobalMappingBlck(DA da,ISLocalToGlobalMapping *map) 227*47c6ae99SBarry Smith { 228*47c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 229*47c6ae99SBarry Smith 230*47c6ae99SBarry Smith PetscFunctionBegin; 231*47c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 232*47c6ae99SBarry Smith PetscValidPointer(map,2); 233*47c6ae99SBarry Smith *map = dd->ltogmapb; 234*47c6ae99SBarry Smith PetscFunctionReturn(0); 235*47c6ae99SBarry Smith } 236*47c6ae99SBarry Smith 237*47c6ae99SBarry Smith 238