1032b8ab6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I "petscdm.h" I*/ 21d72bce8STim Tautges 31d72bce8STim Tautges #include <petscdmmoab.h> 488face26SJed Brown #include <MBTagConventions.hpp> 51cec0304SVijay Mahadevan #include <moab/Skinner.hpp> 6032b8ab6SVijay Mahadevan 7fd349b41STim Tautges 8fd349b41STim Tautges #undef __FUNCT__ 91d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 101d72bce8STim Tautges /*@ 111d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 121d72bce8STim Tautges 131d72bce8STim Tautges Collective on MPI_Comm 141d72bce8STim Tautges 151d72bce8STim Tautges Input Parameter: 161d72bce8STim Tautges . comm - The communicator for the DMMoab object 171d72bce8STim Tautges 181d72bce8STim Tautges Output Parameter: 19032b8ab6SVijay Mahadevan . dmb - The DMMoab object 201d72bce8STim Tautges 211d72bce8STim Tautges Level: beginner 221d72bce8STim Tautges 231d72bce8STim Tautges .keywords: DMMoab, create 241d72bce8STim Tautges @*/ 25032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 261d72bce8STim Tautges { 271d72bce8STim Tautges PetscErrorCode ierr; 281d72bce8STim Tautges 291d72bce8STim Tautges PetscFunctionBegin; 30032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 31032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 32032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 331d72bce8STim Tautges PetscFunctionReturn(0); 341d72bce8STim Tautges } 351d72bce8STim Tautges 361d72bce8STim Tautges #undef __FUNCT__ 37aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 381d72bce8STim Tautges /*@ 39a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 401d72bce8STim Tautges 411d72bce8STim Tautges Collective on MPI_Comm 421d72bce8STim Tautges 431d72bce8STim Tautges Input Parameter: 441d72bce8STim Tautges . comm - The communicator for the DMMoab object 45032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 46a4d2169cSTim Tautges along with the DMMoab 47a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 481d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 491d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 501d72bce8STim Tautges 511d72bce8STim Tautges Output Parameter: 52032b8ab6SVijay Mahadevan . dmb - The DMMoab object 531d72bce8STim Tautges 54032b8ab6SVijay Mahadevan Level: intermediate 551d72bce8STim Tautges 561d72bce8STim Tautges .keywords: DMMoab, create 571d72bce8STim Tautges @*/ 58032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 591d72bce8STim Tautges { 601d72bce8STim Tautges PetscErrorCode ierr; 61032b8ab6SVijay Mahadevan moab::ErrorCode merr; 621cec0304SVijay Mahadevan moab::EntityHandle partnset; 631cec0304SVijay Mahadevan PetscInt rank, nprocs; 64853cdec3SJed Brown DM_Moab *dmmoab; 651d72bce8STim Tautges 661d72bce8STim Tautges PetscFunctionBegin; 67032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 68032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 69032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 70a4d2169cSTim Tautges 71a4d2169cSTim Tautges if (!mbiface) { 7272ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 737d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 741d72bce8STim Tautges } 751cec0304SVijay Mahadevan else { 761cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 777d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 781cec0304SVijay Mahadevan } 791cec0304SVijay Mahadevan 80b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 81b5410836SVijay Mahadevan dmmoab->fileset=0; 827d89fc02STim Tautges 83a4d2169cSTim Tautges if (!pcomm) { 84032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 85032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 86032b8ab6SVijay Mahadevan 87db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 88db66d124SVijay Mahadevan to the load_file functions to be populated. */ 890c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr); 90032b8ab6SVijay Mahadevan 91db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 9272ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 9372ff976dSVijay Mahadevan } 9472ff976dSVijay Mahadevan else { 9572ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 96032b8ab6SVijay Mahadevan } 97032b8ab6SVijay Mahadevan 984973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 994973de03SVijay Mahadevan dmmoab->bs = 1; 100addae81cSVijay Mahadevan dmmoab->numFields = 1; 1014973de03SVijay Mahadevan 1024973de03SVijay Mahadevan /* set global ID tag handle */ 103032b8ab6SVijay Mahadevan if (!ltog_tag) { 1044973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 105032b8ab6SVijay Mahadevan } 106032b8ab6SVijay Mahadevan else { 107032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 108a4d2169cSTim Tautges } 109a4d2169cSTim Tautges 1104973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 111a4d2169cSTim Tautges if (range) { 1125eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 113a4d2169cSTim Tautges } 1141d72bce8STim Tautges PetscFunctionReturn(0); 1151d72bce8STim Tautges } 1161d72bce8STim Tautges 1171d72bce8STim Tautges #undef __FUNCT__ 1181d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 119aa768e4cSTim Tautges /*@ 120aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 121aa768e4cSTim Tautges 122aa768e4cSTim Tautges Collective on MPI_Comm 123aa768e4cSTim Tautges 124aa768e4cSTim Tautges Input Parameter: 125aa768e4cSTim Tautges . dm - The DMMoab object being set 126aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 127aa768e4cSTim Tautges 128aa768e4cSTim Tautges Level: beginner 129aa768e4cSTim Tautges 130aa768e4cSTim Tautges .keywords: DMMoab, create 131aa768e4cSTim Tautges @*/ 1321d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 1331d72bce8STim Tautges { 134032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 135032b8ab6SVijay Mahadevan 1361d72bce8STim Tautges PetscFunctionBegin; 1371d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1381cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 139032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 140032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 141032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 1421d72bce8STim Tautges PetscFunctionReturn(0); 1431d72bce8STim Tautges } 1441d72bce8STim Tautges 1451d72bce8STim Tautges 1461d72bce8STim Tautges #undef __FUNCT__ 1471d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 148aa768e4cSTim Tautges /*@ 149aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 150aa768e4cSTim Tautges 151aa768e4cSTim Tautges Collective on MPI_Comm 152aa768e4cSTim Tautges 153aa768e4cSTim Tautges Input Parameter: 154aa768e4cSTim Tautges . dm - The DMMoab object being set 155aa768e4cSTim Tautges 156aa768e4cSTim Tautges Output Parameter: 157aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 158aa768e4cSTim Tautges 159aa768e4cSTim Tautges Level: beginner 160aa768e4cSTim Tautges 161aa768e4cSTim Tautges .keywords: DMMoab, create 162aa768e4cSTim Tautges @*/ 1631d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 1641d72bce8STim Tautges { 1651d72bce8STim Tautges PetscFunctionBegin; 1661d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 167032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 1681d72bce8STim Tautges PetscFunctionReturn(0); 1691d72bce8STim Tautges } 1701d72bce8STim Tautges 1711d72bce8STim Tautges 1721d72bce8STim Tautges #undef __FUNCT__ 1731d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 174aa768e4cSTim Tautges /*@ 175aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 176aa768e4cSTim Tautges 177aa768e4cSTim Tautges Collective on MPI_Comm 178aa768e4cSTim Tautges 179aa768e4cSTim Tautges Input Parameter: 180aa768e4cSTim Tautges . dm - The DMMoab object being set 181aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 182aa768e4cSTim Tautges 183aa768e4cSTim Tautges Level: beginner 184aa768e4cSTim Tautges 185aa768e4cSTim Tautges .keywords: DMMoab, create 186aa768e4cSTim Tautges @*/ 187a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 1881d72bce8STim Tautges { 189032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 190032b8ab6SVijay Mahadevan 1911d72bce8STim Tautges PetscFunctionBegin; 1921d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1931cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 194032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 195032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 196032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 1971d72bce8STim Tautges PetscFunctionReturn(0); 1981d72bce8STim Tautges } 1991d72bce8STim Tautges 2001d72bce8STim Tautges 2011d72bce8STim Tautges #undef __FUNCT__ 2021d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 203aa768e4cSTim Tautges /*@ 204aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 205aa768e4cSTim Tautges 206aa768e4cSTim Tautges Collective on MPI_Comm 207aa768e4cSTim Tautges 208aa768e4cSTim Tautges Input Parameter: 209aa768e4cSTim Tautges . dm - The DMMoab object being set 210aa768e4cSTim Tautges 211aa768e4cSTim Tautges Output Parameter: 212aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 213aa768e4cSTim Tautges 214aa768e4cSTim Tautges Level: beginner 215aa768e4cSTim Tautges 216aa768e4cSTim Tautges .keywords: DMMoab, create 217aa768e4cSTim Tautges @*/ 218a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 2191d72bce8STim Tautges { 2209426e041SSatish Balay PetscErrorCode ierr; 221cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 222cabb514dSBarry Smith 2231d72bce8STim Tautges PetscFunctionBegin; 2241d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 225cabb514dSBarry Smith ierr = PetscCitationsRegister("@techreport{tautges_moab:_2004,\n type = {{SAND2004-1592}},\n title = {{MOAB:} A Mesh-Oriented Database}, institution = {Sandia National Laboratories},\n author = {Tautges, T. J. and Meyers, R. and Merkley, K. and Stimpson, C. and Ernst, C.},\n year = {2004}, note = {Report}\n}\n",&cite);CHKERRQ(ierr); 226a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 2271d72bce8STim Tautges PetscFunctionReturn(0); 2281d72bce8STim Tautges } 2291d72bce8STim Tautges 2301d72bce8STim Tautges 2311d72bce8STim Tautges #undef __FUNCT__ 2325eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 233aa768e4cSTim Tautges /*@ 2345eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 235aa768e4cSTim Tautges 236aa768e4cSTim Tautges Collective on MPI_Comm 237aa768e4cSTim Tautges 238aa768e4cSTim Tautges Input Parameter: 239aa768e4cSTim Tautges . dm - The DMMoab object being set 240aa768e4cSTim Tautges . range - The entities treated by this DMMoab 241aa768e4cSTim Tautges 242aa768e4cSTim Tautges Level: beginner 243aa768e4cSTim Tautges 244aa768e4cSTim Tautges .keywords: DMMoab, create 245aa768e4cSTim Tautges @*/ 2465eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 2471d72bce8STim Tautges { 248032b8ab6SVijay Mahadevan moab::ErrorCode merr; 249032b8ab6SVijay Mahadevan PetscErrorCode ierr; 250fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 251032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 252032b8ab6SVijay Mahadevan 2531d72bce8STim Tautges PetscFunctionBegin; 2541d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 255032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 256032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 257fd3326ddSVijay Mahadevan 258032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 259fd3326ddSVijay Mahadevan 260fd3326ddSVijay Mahadevan /* filter based on parallel status */ 261fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 262fd3326ddSVijay Mahadevan 263fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 264fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 265fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 266fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 267fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 268fd3326ddSVijay Mahadevan 269fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 270032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 271032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 272032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 2731d72bce8STim Tautges PetscFunctionReturn(0); 2741d72bce8STim Tautges } 2751d72bce8STim Tautges 2761d72bce8STim Tautges 2771d72bce8STim Tautges #undef __FUNCT__ 2788d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices" 2798d8d51c8SVijay Mahadevan /*@ 2808d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 2818d8d51c8SVijay Mahadevan 2828d8d51c8SVijay Mahadevan Collective on MPI_Comm 2838d8d51c8SVijay Mahadevan 2848d8d51c8SVijay Mahadevan Input Parameter: 2858d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 2868d8d51c8SVijay Mahadevan 2878d8d51c8SVijay Mahadevan Output Parameter: 2888d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 2898d8d51c8SVijay Mahadevan 2908d8d51c8SVijay Mahadevan Level: beginner 2918d8d51c8SVijay Mahadevan 2928d8d51c8SVijay Mahadevan .keywords: DMMoab, create 2938d8d51c8SVijay Mahadevan @*/ 2948d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 2958d8d51c8SVijay Mahadevan { 2968d8d51c8SVijay Mahadevan PetscFunctionBegin; 2978d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2988d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 2998d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3008d8d51c8SVijay Mahadevan } 3018d8d51c8SVijay Mahadevan 3028d8d51c8SVijay Mahadevan 3038d8d51c8SVijay Mahadevan 3048d8d51c8SVijay Mahadevan #undef __FUNCT__ 3055eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 306aa768e4cSTim Tautges /*@ 3075eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 308aa768e4cSTim Tautges 309aa768e4cSTim Tautges Collective on MPI_Comm 310aa768e4cSTim Tautges 311aa768e4cSTim Tautges Input Parameter: 312aa768e4cSTim Tautges . dm - The DMMoab object being set 313aa768e4cSTim Tautges 314aa768e4cSTim Tautges Output Parameter: 3155eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 3165eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 317aa768e4cSTim Tautges 318aa768e4cSTim Tautges Level: beginner 319aa768e4cSTim Tautges 320aa768e4cSTim Tautges .keywords: DMMoab, create 321aa768e4cSTim Tautges @*/ 322351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost) 3231d72bce8STim Tautges { 3241d72bce8STim Tautges PetscFunctionBegin; 3251d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 326351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 327351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3281d72bce8STim Tautges PetscFunctionReturn(0); 3291d72bce8STim Tautges } 3301d72bce8STim Tautges 3311d72bce8STim Tautges #undef __FUNCT__ 3325eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 3335eb88e9dSVijay Mahadevan /*@ 3345eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3355eb88e9dSVijay Mahadevan 3365eb88e9dSVijay Mahadevan Collective on MPI_Comm 3375eb88e9dSVijay Mahadevan 3385eb88e9dSVijay Mahadevan Input Parameter: 3395eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 3405eb88e9dSVijay Mahadevan 3415eb88e9dSVijay Mahadevan Output Parameter: 3425eb88e9dSVijay Mahadevan . range - The entities owned locally 3435eb88e9dSVijay Mahadevan 3445eb88e9dSVijay Mahadevan Level: beginner 3455eb88e9dSVijay Mahadevan 3465eb88e9dSVijay Mahadevan .keywords: DMMoab, create 3475eb88e9dSVijay Mahadevan @*/ 348351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range) 3495eb88e9dSVijay Mahadevan { 3505eb88e9dSVijay Mahadevan PetscFunctionBegin; 3515eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 352351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 3531cec0304SVijay Mahadevan PetscFunctionReturn(0); 3541cec0304SVijay Mahadevan } 3551cec0304SVijay Mahadevan 3561cec0304SVijay Mahadevan 3571cec0304SVijay Mahadevan #undef __FUNCT__ 3581cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 3591cec0304SVijay Mahadevan /*@ 3601cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 3611cec0304SVijay Mahadevan 3621cec0304SVijay Mahadevan Collective on MPI_Comm 3631cec0304SVijay Mahadevan 3641cec0304SVijay Mahadevan Input Parameter: 3651cec0304SVijay Mahadevan . dm - The DMMoab object being set 3661cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 3671cec0304SVijay Mahadevan 3681cec0304SVijay Mahadevan Level: beginner 3691cec0304SVijay Mahadevan 3701cec0304SVijay Mahadevan .keywords: DMMoab, create 3711cec0304SVijay Mahadevan @*/ 3721cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 3731cec0304SVijay Mahadevan { 3741cec0304SVijay Mahadevan moab::ErrorCode merr; 3751cec0304SVijay Mahadevan PetscErrorCode ierr; 3761cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 3771cec0304SVijay Mahadevan 3781cec0304SVijay Mahadevan PetscFunctionBegin; 3791cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3801cec0304SVijay Mahadevan dmmoab->elocal->clear(); 3811cec0304SVijay Mahadevan dmmoab->eghost->clear(); 3821cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 3831cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 3841cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 3851cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 38641dd5348SVijay Mahadevan dmmoab->neleghost=dmmoab->eghost->size(); 3871cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 3888cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 3895eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 3905eb88e9dSVijay Mahadevan } 3915eb88e9dSVijay Mahadevan 3925eb88e9dSVijay Mahadevan 3935eb88e9dSVijay Mahadevan #undef __FUNCT__ 3941d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 395aa768e4cSTim Tautges /*@ 396aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 397aa768e4cSTim Tautges 398aa768e4cSTim Tautges Collective on MPI_Comm 399aa768e4cSTim Tautges 400aa768e4cSTim Tautges Input Parameter: 401aa768e4cSTim Tautges . dm - The DMMoab object being set 402aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 403aa768e4cSTim Tautges 404aa768e4cSTim Tautges Level: beginner 405aa768e4cSTim Tautges 406aa768e4cSTim Tautges .keywords: DMMoab, create 407aa768e4cSTim Tautges @*/ 4081d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 4091d72bce8STim Tautges { 4101d72bce8STim Tautges PetscFunctionBegin; 4111d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4121d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4131d72bce8STim Tautges PetscFunctionReturn(0); 4141d72bce8STim Tautges } 4151d72bce8STim Tautges 4161d72bce8STim Tautges 4171d72bce8STim Tautges #undef __FUNCT__ 4181d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 419aa768e4cSTim Tautges /*@ 420aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 421aa768e4cSTim Tautges 422aa768e4cSTim Tautges Collective on MPI_Comm 423aa768e4cSTim Tautges 424aa768e4cSTim Tautges Input Parameter: 425aa768e4cSTim Tautges . dm - The DMMoab object being set 426aa768e4cSTim Tautges 427aa768e4cSTim Tautges Output Parameter: 428aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 429aa768e4cSTim Tautges 430aa768e4cSTim Tautges Level: beginner 431aa768e4cSTim Tautges 432aa768e4cSTim Tautges .keywords: DMMoab, create 433aa768e4cSTim Tautges @*/ 4341d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 4351d72bce8STim Tautges { 4361d72bce8STim Tautges PetscFunctionBegin; 4371d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4381d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4391d72bce8STim Tautges PetscFunctionReturn(0); 4401d72bce8STim Tautges } 4411d72bce8STim Tautges 4421d72bce8STim Tautges 4431d72bce8STim Tautges #undef __FUNCT__ 4441d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 445aa768e4cSTim Tautges /*@ 446aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 447aa768e4cSTim Tautges 448aa768e4cSTim Tautges Collective on MPI_Comm 449aa768e4cSTim Tautges 450aa768e4cSTim Tautges Input Parameter: 451aa768e4cSTim Tautges . dm - The DMMoab object being set 452aa768e4cSTim Tautges . bs - The block size used with this DMMoab 453aa768e4cSTim Tautges 454aa768e4cSTim Tautges Level: beginner 455aa768e4cSTim Tautges 456aa768e4cSTim Tautges .keywords: DMMoab, create 457aa768e4cSTim Tautges @*/ 4581d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 4591d72bce8STim Tautges { 4601d72bce8STim Tautges PetscFunctionBegin; 4611d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4621d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4631d72bce8STim Tautges PetscFunctionReturn(0); 4641d72bce8STim Tautges } 4651d72bce8STim Tautges 4661d72bce8STim Tautges 4671d72bce8STim Tautges #undef __FUNCT__ 4681d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 469aa768e4cSTim Tautges /*@ 470aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 471aa768e4cSTim Tautges 472aa768e4cSTim Tautges Collective on MPI_Comm 473aa768e4cSTim Tautges 474aa768e4cSTim Tautges Input Parameter: 475aa768e4cSTim Tautges . dm - The DMMoab object being set 476aa768e4cSTim Tautges 477aa768e4cSTim Tautges Output Parameter: 478aa768e4cSTim Tautges . bs - The block size used with this DMMoab 479aa768e4cSTim Tautges 480aa768e4cSTim Tautges Level: beginner 481aa768e4cSTim Tautges 482aa768e4cSTim Tautges .keywords: DMMoab, create 483aa768e4cSTim Tautges @*/ 4841d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 4851d72bce8STim Tautges { 4861d72bce8STim Tautges PetscFunctionBegin; 4871d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4881d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 4891d72bce8STim Tautges PetscFunctionReturn(0); 4901d72bce8STim Tautges } 4911d72bce8STim Tautges 4921cec0304SVijay Mahadevan 4931cec0304SVijay Mahadevan #undef __FUNCT__ 494212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize" 495212ad6d1SVijay Mahadevan /*@ 496212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 497212ad6d1SVijay Mahadevan 49800cc10feSVijay Mahadevan Collective on DM 499212ad6d1SVijay Mahadevan 500212ad6d1SVijay Mahadevan Input Parameter: 501212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 502212ad6d1SVijay Mahadevan 503212ad6d1SVijay Mahadevan Output Parameter: 50400cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance 50500cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance 506212ad6d1SVijay Mahadevan 507212ad6d1SVijay Mahadevan Level: beginner 508212ad6d1SVijay Mahadevan 509212ad6d1SVijay Mahadevan .keywords: DMMoab, create 510212ad6d1SVijay Mahadevan @*/ 51141dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg) 512212ad6d1SVijay Mahadevan { 513212ad6d1SVijay Mahadevan PetscFunctionBegin; 514212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 51541dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->nele; 51641dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->n; 517212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 518212ad6d1SVijay Mahadevan } 519212ad6d1SVijay Mahadevan 520212ad6d1SVijay Mahadevan 521212ad6d1SVijay Mahadevan #undef __FUNCT__ 522212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize" 523212ad6d1SVijay Mahadevan /*@ 524212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 525212ad6d1SVijay Mahadevan 52600cc10feSVijay Mahadevan Collective on DM 527212ad6d1SVijay Mahadevan 528212ad6d1SVijay Mahadevan Input Parameter: 529212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 530212ad6d1SVijay Mahadevan 531212ad6d1SVijay Mahadevan Output Parameter: 53200cc10feSVijay Mahadevan . nel - The number of owned elements in this processor 53300cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 53400cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 53500cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor 536212ad6d1SVijay Mahadevan 537212ad6d1SVijay Mahadevan Level: beginner 538212ad6d1SVijay Mahadevan 539212ad6d1SVijay Mahadevan .keywords: DMMoab, create 540212ad6d1SVijay Mahadevan @*/ 54141dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg) 542212ad6d1SVijay Mahadevan { 543212ad6d1SVijay Mahadevan PetscFunctionBegin; 544212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 54541dd5348SVijay Mahadevan if(nel) *nel = ((DM_Moab*)dm->data)->neleloc; 54641dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->neleghost; 54741dd5348SVijay Mahadevan if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 54841dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 549212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 550212ad6d1SVijay Mahadevan } 551212ad6d1SVijay Mahadevan 552212ad6d1SVijay Mahadevan 553212ad6d1SVijay Mahadevan #undef __FUNCT__ 55400cc10feSVijay Mahadevan #define __FUNCT__ "DMMoabGetOffset" 55500cc10feSVijay Mahadevan /*@ 55600cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 55700cc10feSVijay Mahadevan 55800cc10feSVijay Mahadevan Collective on MPI_Comm 55900cc10feSVijay Mahadevan 56000cc10feSVijay Mahadevan Input Parameter: 56100cc10feSVijay Mahadevan . dm - The DMMoab object being set 56200cc10feSVijay Mahadevan 56300cc10feSVijay Mahadevan Output Parameter: 56400cc10feSVijay Mahadevan . offset - The local offset for the global vector 56500cc10feSVijay Mahadevan 56600cc10feSVijay Mahadevan Level: beginner 56700cc10feSVijay Mahadevan 56800cc10feSVijay Mahadevan .keywords: DMMoab, create 56900cc10feSVijay Mahadevan @*/ 57000cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset) 57100cc10feSVijay Mahadevan { 57200cc10feSVijay Mahadevan PetscFunctionBegin; 57300cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 57400cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 57500cc10feSVijay Mahadevan PetscFunctionReturn(0); 57600cc10feSVijay Mahadevan } 57700cc10feSVijay Mahadevan 57800cc10feSVijay Mahadevan 57900cc10feSVijay Mahadevan #undef __FUNCT__ 5804920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension" 5814920ab11SVijay Mahadevan /*@ 5824920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 5834920ab11SVijay Mahadevan 5844920ab11SVijay Mahadevan Collective on MPI_Comm 5854920ab11SVijay Mahadevan 5864920ab11SVijay Mahadevan Input Parameter: 5874920ab11SVijay Mahadevan . dm - The DMMoab object being set 5884920ab11SVijay Mahadevan 5894920ab11SVijay Mahadevan Output Parameter: 5904920ab11SVijay Mahadevan . dim - The dimension of DM 5914920ab11SVijay Mahadevan 5924920ab11SVijay Mahadevan Level: beginner 5934920ab11SVijay Mahadevan 5944920ab11SVijay Mahadevan .keywords: DMMoab, create 5954920ab11SVijay Mahadevan @*/ 5964920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 5974920ab11SVijay Mahadevan { 5984920ab11SVijay Mahadevan PetscFunctionBegin; 5994920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6004920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 6014920ab11SVijay Mahadevan PetscFunctionReturn(0); 6024920ab11SVijay Mahadevan } 6034920ab11SVijay Mahadevan 6044920ab11SVijay Mahadevan 6054920ab11SVijay Mahadevan 6064920ab11SVijay Mahadevan #undef __FUNCT__ 6077023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 6087023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 6097023aa44SVijay Mahadevan { 6107023aa44SVijay Mahadevan DM_Moab *dmmoab; 6117023aa44SVijay Mahadevan PetscErrorCode ierr; 6127023aa44SVijay Mahadevan moab::ErrorCode merr; 6137023aa44SVijay Mahadevan 6147023aa44SVijay Mahadevan PetscFunctionBegin; 6157023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6167023aa44SVijay Mahadevan PetscValidPointer(conn,3); 6177023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6187023aa44SVijay Mahadevan 6197023aa44SVijay Mahadevan if (!vpos) { 6207023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 6217023aa44SVijay Mahadevan } 6227023aa44SVijay Mahadevan 6237023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6247023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 6257023aa44SVijay Mahadevan PetscFunctionReturn(0); 6267023aa44SVijay Mahadevan } 6277023aa44SVijay Mahadevan 6287023aa44SVijay Mahadevan 6297023aa44SVijay Mahadevan #undef __FUNCT__ 6308d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity" 6318d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 6328d8d51c8SVijay Mahadevan { 6338d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 6348d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 6358d8d51c8SVijay Mahadevan PetscErrorCode ierr; 6368d8d51c8SVijay Mahadevan moab::ErrorCode merr; 6378d8d51c8SVijay Mahadevan 6388d8d51c8SVijay Mahadevan PetscFunctionBegin; 6398d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6408d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 6418d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6428d8d51c8SVijay Mahadevan 6438d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6448d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 6458d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 6468d8d51c8SVijay Mahadevan 6478d8d51c8SVijay Mahadevan if (conn) { 6488d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 6498d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 6508d8d51c8SVijay Mahadevan } 6518d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 6528d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 6538d8d51c8SVijay Mahadevan } 6548d8d51c8SVijay Mahadevan 6558d8d51c8SVijay Mahadevan 6568d8d51c8SVijay Mahadevan #undef __FUNCT__ 6578d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity" 6588d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 6598d8d51c8SVijay Mahadevan { 6608d8d51c8SVijay Mahadevan PetscErrorCode ierr; 6618d8d51c8SVijay Mahadevan 6628d8d51c8SVijay Mahadevan PetscFunctionBegin; 6638d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6648d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 6658d8d51c8SVijay Mahadevan 6668d8d51c8SVijay Mahadevan if (conn) { 6678d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 6688d8d51c8SVijay Mahadevan } 6698d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 6708d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 6718d8d51c8SVijay Mahadevan } 6728d8d51c8SVijay Mahadevan 6738d8d51c8SVijay Mahadevan 6748d8d51c8SVijay Mahadevan 6758d8d51c8SVijay Mahadevan #undef __FUNCT__ 6767023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 6777023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 6787023aa44SVijay Mahadevan { 6797023aa44SVijay Mahadevan DM_Moab *dmmoab; 6807023aa44SVijay Mahadevan const moab::EntityHandle *connect; 6817023aa44SVijay Mahadevan moab::ErrorCode merr; 6827023aa44SVijay Mahadevan PetscInt nnodes; 6837023aa44SVijay Mahadevan 6847023aa44SVijay Mahadevan PetscFunctionBegin; 6857023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6867023aa44SVijay Mahadevan PetscValidPointer(conn,4); 6877023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6887023aa44SVijay Mahadevan 6897023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6907023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 6917023aa44SVijay Mahadevan if (conn) *conn=connect; 6927023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 6937023aa44SVijay Mahadevan PetscFunctionReturn(0); 6947023aa44SVijay Mahadevan } 6957023aa44SVijay Mahadevan 6967023aa44SVijay Mahadevan 6977023aa44SVijay Mahadevan #undef __FUNCT__ 69869263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 69969263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 70069263071SVijay Mahadevan { 70169263071SVijay Mahadevan moab::EntityType etype; 70269263071SVijay Mahadevan DM_Moab *dmmoab; 70369263071SVijay Mahadevan PetscInt edim; 70469263071SVijay Mahadevan 70569263071SVijay Mahadevan PetscFunctionBegin; 70669263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 70769263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 70869263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 70969263071SVijay Mahadevan 71069263071SVijay Mahadevan /* get the entity type and handle accordingly */ 71169263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 71269263071SVijay Mahadevan if(etype >= moab::MBPOLYHEDRON) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %D\n",etype); 71369263071SVijay Mahadevan 71469263071SVijay Mahadevan /* get the entity dimension */ 71569263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 71669263071SVijay Mahadevan 71769263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 71869263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 7196d9eb265SVijay Mahadevan if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 72069263071SVijay Mahadevan } 72169263071SVijay Mahadevan else { 72269263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 7236d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 72469263071SVijay Mahadevan } 72569263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 7266d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 72769263071SVijay Mahadevan } 72869263071SVijay Mahadevan } 72969263071SVijay Mahadevan PetscFunctionReturn(0); 73069263071SVijay Mahadevan } 73169263071SVijay Mahadevan 73269263071SVijay Mahadevan 73369263071SVijay Mahadevan #undef __FUNCT__ 7347023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 73569263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 7367023aa44SVijay Mahadevan { 7377023aa44SVijay Mahadevan DM_Moab *dmmoab; 7387023aa44SVijay Mahadevan PetscInt i; 7397023aa44SVijay Mahadevan 7407023aa44SVijay Mahadevan PetscFunctionBegin; 7417023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7427023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 7437023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 7447023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7457023aa44SVijay Mahadevan 7467023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 7476d9eb265SVijay Mahadevan isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE); 7487023aa44SVijay Mahadevan } 7497023aa44SVijay Mahadevan PetscFunctionReturn(0); 7507023aa44SVijay Mahadevan } 7517023aa44SVijay Mahadevan 7527023aa44SVijay Mahadevan 7537023aa44SVijay Mahadevan #undef __FUNCT__ 7540c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers" 7556d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces) 7561cec0304SVijay Mahadevan { 7571cec0304SVijay Mahadevan DM_Moab *dmmoab; 7581cec0304SVijay Mahadevan 7591cec0304SVijay Mahadevan PetscFunctionBegin; 7601cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7611cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7621cec0304SVijay Mahadevan 7636d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 7646d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 7656d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 7661cec0304SVijay Mahadevan PetscFunctionReturn(0); 7671cec0304SVijay Mahadevan } 7681cec0304SVijay Mahadevan 769*f6829af0SVijay Mahadevan 770*f6829af0SVijay Mahadevan #undef __FUNCT__ 771*f6829af0SVijay Mahadevan #define __FUNCT__ "DMDestroy_Moab" 772*f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 773*f6829af0SVijay Mahadevan { 774*f6829af0SVijay Mahadevan PetscErrorCode ierr; 775*f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 776*f6829af0SVijay Mahadevan 777*f6829af0SVijay Mahadevan PetscFunctionBegin; 778*f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 779*f6829af0SVijay Mahadevan if (dmmoab->icreatedinstance) { 780*f6829af0SVijay Mahadevan delete dmmoab->mbiface; 781*f6829af0SVijay Mahadevan } 782*f6829af0SVijay Mahadevan dmmoab->mbiface = NULL; 783*f6829af0SVijay Mahadevan dmmoab->pcomm = NULL; 784*f6829af0SVijay Mahadevan delete dmmoab->vlocal; 785*f6829af0SVijay Mahadevan delete dmmoab->vowned; 786*f6829af0SVijay Mahadevan delete dmmoab->vghost; 787*f6829af0SVijay Mahadevan delete dmmoab->elocal; 788*f6829af0SVijay Mahadevan delete dmmoab->eghost; 789*f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 790*f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 791*f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 792*f6829af0SVijay Mahadevan 793*f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 794*f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->lidmap);CHKERRQ(ierr); 795*f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gidmap);CHKERRQ(ierr); 796*f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->llmap);CHKERRQ(ierr); 797*f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->lgmap);CHKERRQ(ierr); 798*f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 799*f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 800*f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 801*f6829af0SVijay Mahadevan PetscFunctionReturn(0); 802*f6829af0SVijay Mahadevan } 803*f6829af0SVijay Mahadevan 804*f6829af0SVijay Mahadevan 805*f6829af0SVijay Mahadevan #undef __FUNCT__ 806*f6829af0SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab" 807*f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 808*f6829af0SVijay Mahadevan { 809*f6829af0SVijay Mahadevan PetscErrorCode ierr; 810*f6829af0SVijay Mahadevan moab::ErrorCode merr; 811*f6829af0SVijay Mahadevan Vec local, global; 812*f6829af0SVijay Mahadevan IS from,to; 813*f6829af0SVijay Mahadevan moab::Range::iterator iter; 814*f6829af0SVijay Mahadevan PetscInt i,j,f,bs,gmin,lmin,lmax,vent,totsize; 815*f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 816*f6829af0SVijay Mahadevan moab::Range adjs; 817*f6829af0SVijay Mahadevan 818*f6829af0SVijay Mahadevan PetscFunctionBegin; 819*f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 820*f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 821*f6829af0SVijay Mahadevan if (dmmoab->mbiface == PETSC_NULL || dmmoab->pcomm == PETSC_NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp."); 822*f6829af0SVijay Mahadevan 823*f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 824*f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 825*f6829af0SVijay Mahadevan { 826*f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 827*f6829af0SVijay Mahadevan 828*f6829af0SVijay Mahadevan /* filter based on parallel status */ 829*f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 830*f6829af0SVijay Mahadevan 831*f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 832*f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 833*f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 834*f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 835*f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 836*f6829af0SVijay Mahadevan 837*f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 838*f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 839*f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 840*f6829af0SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 841*f6829af0SVijay Mahadevan } 842*f6829af0SVijay Mahadevan 843*f6829af0SVijay Mahadevan { 844*f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 845*f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 846*f6829af0SVijay Mahadevan 847*f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 848*f6829af0SVijay Mahadevan for (i=3;i>0;i--) { 849*f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 850*f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 851*f6829af0SVijay Mahadevan 852*f6829af0SVijay Mahadevan /* store the current mesh dimension */ 853*f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 854*f6829af0SVijay Mahadevan dmmoab->dim=i; 855*f6829af0SVijay Mahadevan break; 856*f6829af0SVijay Mahadevan } 857*f6829af0SVijay Mahadevan } 858*f6829af0SVijay Mahadevan 859*f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 860*f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 861*f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 862*f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 863*f6829af0SVijay Mahadevan 864*f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 865*f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 866*f6829af0SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 867*f6829af0SVijay Mahadevan } 868*f6829af0SVijay Mahadevan 869*f6829af0SVijay Mahadevan bs = dmmoab->bs; 870*f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 871*f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 872*f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 873*f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 874*f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 875*f6829af0SVijay Mahadevan } 876*f6829af0SVijay Mahadevan 877*f6829af0SVijay Mahadevan totsize=dmmoab->vlocal->size(); 878*f6829af0SVijay Mahadevan if (totsize != dmmoab->nloc+dmmoab->nghost) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.",totsize,dmmoab->nloc+dmmoab->nghost); 879*f6829af0SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr); 880*f6829af0SVijay Mahadevan { 881*f6829af0SVijay Mahadevan /* first get the local indices */ 882*f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 883*f6829af0SVijay Mahadevan /* next get the ghosted indices */ 884*f6829af0SVijay Mahadevan if (dmmoab->nghost) { 885*f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 886*f6829af0SVijay Mahadevan } 887*f6829af0SVijay Mahadevan 888*f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 889*f6829af0SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 890*f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 891*f6829af0SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 892*f6829af0SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 893*f6829af0SVijay Mahadevan } 894*f6829af0SVijay Mahadevan 895*f6829af0SVijay Mahadevan ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 896*f6829af0SVijay Mahadevan 897*f6829af0SVijay Mahadevan /* set the GID map */ 898*f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 899*f6829af0SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 900*f6829af0SVijay Mahadevan } 901*f6829af0SVijay Mahadevan lmin-=gmin; 902*f6829af0SVijay Mahadevan lmax-=gmin; 903*f6829af0SVijay Mahadevan 904*f6829af0SVijay Mahadevan PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 905*f6829af0SVijay Mahadevan } 906*f6829af0SVijay Mahadevan 907*f6829af0SVijay Mahadevan { 908*f6829af0SVijay Mahadevan ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr); 909*f6829af0SVijay Mahadevan ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr); 910*f6829af0SVijay Mahadevan ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->llmap);CHKERRQ(ierr); 911*f6829af0SVijay Mahadevan ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr); 912*f6829af0SVijay Mahadevan 913*f6829af0SVijay Mahadevan i=j=0; 914*f6829af0SVijay Mahadevan /* set the owned vertex data first */ 915*f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 916*f6829af0SVijay Mahadevan vent=(PetscInt)(*iter); 917*f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 918*f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 919*f6829af0SVijay Mahadevan if (bs > 1) { 920*f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 921*f6829af0SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 922*f6829af0SVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 923*f6829af0SVijay Mahadevan } 924*f6829af0SVijay Mahadevan } 925*f6829af0SVijay Mahadevan else { 926*f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 927*f6829af0SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 928*f6829af0SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 929*f6829af0SVijay Mahadevan } 930*f6829af0SVijay Mahadevan } 931*f6829af0SVijay Mahadevan } 932*f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 933*f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 934*f6829af0SVijay Mahadevan vent=(PetscInt)(*iter); 935*f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 936*f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 937*f6829af0SVijay Mahadevan if (bs > 1) { 938*f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 939*f6829af0SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 940*f6829af0SVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 941*f6829af0SVijay Mahadevan } 942*f6829af0SVijay Mahadevan } 943*f6829af0SVijay Mahadevan else { 944*f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 945*f6829af0SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 946*f6829af0SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 947*f6829af0SVijay Mahadevan } 948*f6829af0SVijay Mahadevan } 949*f6829af0SVijay Mahadevan } 950*f6829af0SVijay Mahadevan 951*f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 952*f6829af0SVijay Mahadevan 1) First create a local and global vector 953*f6829af0SVijay Mahadevan 2) Create a local and global IS 954*f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 955*f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 956*f6829af0SVijay Mahadevan */ 957*f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 958*f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 959*f6829af0SVijay Mahadevan 960*f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 961*f6829af0SVijay Mahadevan PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost); 962*f6829af0SVijay Mahadevan 963*f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 964*f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr); 965*f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr); 966*f6829af0SVijay Mahadevan 967*f6829af0SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 968*f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr); 969*f6829af0SVijay Mahadevan 970*f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 971*f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 972*f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->numFields,dmmoab->lgmap, 973*f6829af0SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 974*f6829af0SVijay Mahadevan } 975*f6829af0SVijay Mahadevan 976*f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 977*f6829af0SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 978*f6829af0SVijay Mahadevan 979*f6829af0SVijay Mahadevan /* clean up IS, Vec */ 980*f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 981*f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 982*f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 983*f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 984*f6829af0SVijay Mahadevan } 985*f6829af0SVijay Mahadevan 986*f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 987*f6829af0SVijay Mahadevan { 988*f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 989*f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 990*f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 991*f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 992*f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 993*f6829af0SVijay Mahadevan 994*f6829af0SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 995*f6829af0SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 996*f6829af0SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 997*f6829af0SVijay Mahadevan 998*f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 999*f6829af0SVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, false, true, false);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices 1000*f6829af0SVijay Mahadevan 1001*f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1002*f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1003*f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 1004*f6829af0SVijay Mahadevan 1005*f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1006*f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 1007*f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 1008*f6829af0SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 1009*f6829af0SVijay Mahadevan } 1010*f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1011*f6829af0SVijay Mahadevan } 1012*f6829af0SVijay Mahadevan 1013*f6829af0SVijay Mahadevan 1014*f6829af0SVijay Mahadevan #undef __FUNCT__ 1015*f6829af0SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab" 1016*f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1017*f6829af0SVijay Mahadevan { 1018*f6829af0SVijay Mahadevan PetscErrorCode ierr; 1019*f6829af0SVijay Mahadevan 1020*f6829af0SVijay Mahadevan PetscFunctionBegin; 1021*f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1022*f6829af0SVijay Mahadevan ierr = PetscNewLog(dm,DM_Moab,&dm->data);CHKERRQ(ierr); 1023*f6829af0SVijay Mahadevan 1024*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1025*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1026*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1027*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1028*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1029*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1030*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1031*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1032*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 1033*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 1034*f6829af0SVijay Mahadevan 1035*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1036*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1037*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1038*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1039*f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1040*f6829af0SVijay Mahadevan 1041*f6829af0SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1042*f6829af0SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1043*f6829af0SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1044*f6829af0SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1045*f6829af0SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 1046*f6829af0SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1047*f6829af0SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1048*f6829af0SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1049*f6829af0SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1050*f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1051*f6829af0SVijay Mahadevan } 1052*f6829af0SVijay Mahadevan 1053