1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 21d72bce8STim Tautges 31d72bce8STim Tautges #include <petscdmmoab.h> 488face26SJed Brown #include <MBTagConventions.hpp> 51cec0304SVijay Mahadevan #include <moab/Skinner.hpp> 6032b8ab6SVijay Mahadevan 7fd349b41STim Tautges 8c6ef30f9SVijay Mahadevan /*MC 9c6ef30f9SVijay Mahadevan DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database. 10c6ef30f9SVijay Mahadevan Direct access to the MOAB Interface and other mesh manipulation related objects are available 11c6ef30f9SVijay Mahadevan through public API. Ability to create global and local representation of Vecs containing all 12c6ef30f9SVijay Mahadevan unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided 13c6ef30f9SVijay Mahadevan along with utility functions to traverse the mesh and assemble a discrete system via 14c6ef30f9SVijay Mahadevan field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are 15c6ef30f9SVijay Mahadevan available. 16c6ef30f9SVijay Mahadevan 17c6ef30f9SVijay Mahadevan Reference: http://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html 18c6ef30f9SVijay Mahadevan 19c6ef30f9SVijay Mahadevan Level: intermediate 20c6ef30f9SVijay Mahadevan 21c6ef30f9SVijay Mahadevan .seealso: DMType, DMMoabCreate(), DMCreate(), DMSetType(), DMMoabCreateMoab() 22c6ef30f9SVijay Mahadevan M*/ 23c6ef30f9SVijay Mahadevan 24c6ef30f9SVijay Mahadevan 251d72bce8STim Tautges /*@ 261d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 271d72bce8STim Tautges 281d72bce8STim Tautges Collective on MPI_Comm 291d72bce8STim Tautges 301d72bce8STim Tautges Input Parameter: 311d72bce8STim Tautges . comm - The communicator for the DMMoab object 321d72bce8STim Tautges 331d72bce8STim Tautges Output Parameter: 34032b8ab6SVijay Mahadevan . dmb - The DMMoab object 351d72bce8STim Tautges 361d72bce8STim Tautges Level: beginner 371d72bce8STim Tautges 381d72bce8STim Tautges .keywords: DMMoab, create 391d72bce8STim Tautges @*/ 40032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 411d72bce8STim Tautges { 421d72bce8STim Tautges PetscErrorCode ierr; 431d72bce8STim Tautges 441d72bce8STim Tautges PetscFunctionBegin; 45032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 46032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 47032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 481d72bce8STim Tautges PetscFunctionReturn(0); 491d72bce8STim Tautges } 501d72bce8STim Tautges 511d72bce8STim Tautges /*@ 52b117cd09SVijay Mahadevan DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data 531d72bce8STim Tautges 541d72bce8STim Tautges Collective on MPI_Comm 551d72bce8STim Tautges 561d72bce8STim Tautges Input Parameter: 571d72bce8STim Tautges . comm - The communicator for the DMMoab object 58032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 59a4d2169cSTim Tautges along with the DMMoab 60a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 611d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 621d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 631d72bce8STim Tautges 641d72bce8STim Tautges Output Parameter: 65032b8ab6SVijay Mahadevan . dmb - The DMMoab object 661d72bce8STim Tautges 67032b8ab6SVijay Mahadevan Level: intermediate 681d72bce8STim Tautges 691d72bce8STim Tautges .keywords: DMMoab, create 701d72bce8STim Tautges @*/ 71032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 721d72bce8STim Tautges { 731d72bce8STim Tautges PetscErrorCode ierr; 74032b8ab6SVijay Mahadevan moab::ErrorCode merr; 751cec0304SVijay Mahadevan moab::EntityHandle partnset; 761cec0304SVijay Mahadevan PetscInt rank, nprocs; 7785d305f5SVijay Mahadevan DM dmmb; 78853cdec3SJed Brown DM_Moab *dmmoab; 791d72bce8STim Tautges 801d72bce8STim Tautges PetscFunctionBegin; 81032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 8285d305f5SVijay Mahadevan 8385d305f5SVijay Mahadevan ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr); 8485d305f5SVijay Mahadevan dmmoab = (DM_Moab*)(dmmb)->data; 85a4d2169cSTim Tautges 86a4d2169cSTim Tautges if (!mbiface) { 8772ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 887d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 891d72bce8STim Tautges } 901cec0304SVijay Mahadevan else { 911cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 927d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 931cec0304SVijay Mahadevan } 941cec0304SVijay Mahadevan 95b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 96b5410836SVijay Mahadevan dmmoab->fileset=0; 97b117cd09SVijay Mahadevan dmmoab->hlevel=0; 9849d66b22SVijay Mahadevan dmmoab->nghostrings=0; 997d89fc02STim Tautges 100a4d2169cSTim Tautges if (!pcomm) { 101032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 102032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 103032b8ab6SVijay Mahadevan 104db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 105db66d124SVijay Mahadevan to the load_file functions to be populated. */ 1060c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr); 107032b8ab6SVijay Mahadevan 108db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 10972ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 11072ff976dSVijay Mahadevan } 11172ff976dSVijay Mahadevan else { 11285d305f5SVijay Mahadevan ierr = DMMoabSetParallelComm(dmmb, pcomm);CHKERRQ(ierr); 113032b8ab6SVijay Mahadevan } 114032b8ab6SVijay Mahadevan 1154973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 1164973de03SVijay Mahadevan dmmoab->bs = 1; 117addae81cSVijay Mahadevan dmmoab->numFields = 1; 1183f1c6e43SVijay Mahadevan ierr = PetscMalloc(dmmoab->numFields*sizeof(char*),&dmmoab->fieldNames);CHKERRQ(ierr); 1193f1c6e43SVijay Mahadevan ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr); 1202e4e7c01SVijay Mahadevan dmmoab->rw_dbglevel = 0; 1212e4e7c01SVijay Mahadevan dmmoab->partition_by_rank = PETSC_FALSE; 1222e4e7c01SVijay Mahadevan dmmoab->extra_read_options[0] = '\0'; 1232e4e7c01SVijay Mahadevan dmmoab->extra_write_options[0] = '\0'; 1242e4e7c01SVijay Mahadevan dmmoab->read_mode = READ_PART; 1252e4e7c01SVijay Mahadevan dmmoab->write_mode = WRITE_PART; 1264973de03SVijay Mahadevan 1274973de03SVijay Mahadevan /* set global ID tag handle */ 1281a845d2aSVijay Mahadevan if (ltog_tag && *ltog_tag) { 12985d305f5SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr); 130032b8ab6SVijay Mahadevan } 131032b8ab6SVijay Mahadevan else { 1321a845d2aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1331a845d2aSVijay Mahadevan if (ltog_tag) *ltog_tag = dmmoab->ltog_tag; 134a4d2169cSTim Tautges } 135a4d2169cSTim Tautges 136340f3b9aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr); 137340f3b9aSVijay Mahadevan 1384973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 139a4d2169cSTim Tautges if (range) { 14085d305f5SVijay Mahadevan ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr); 141a4d2169cSTim Tautges } 14285d305f5SVijay Mahadevan *dmb=dmmb; 1431d72bce8STim Tautges PetscFunctionReturn(0); 1441d72bce8STim Tautges } 1451d72bce8STim Tautges 146aa768e4cSTim Tautges /*@ 147aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 148aa768e4cSTim Tautges 149aa768e4cSTim Tautges Collective on MPI_Comm 150aa768e4cSTim Tautges 151aa768e4cSTim Tautges Input Parameter: 152aa768e4cSTim Tautges . dm - The DMMoab object being set 153aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 154aa768e4cSTim Tautges 155aa768e4cSTim Tautges Level: beginner 156aa768e4cSTim Tautges 157aa768e4cSTim Tautges .keywords: DMMoab, create 158aa768e4cSTim Tautges @*/ 1591d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 1601d72bce8STim Tautges { 161032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 162032b8ab6SVijay Mahadevan 1631d72bce8STim Tautges PetscFunctionBegin; 1641d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1651cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 166032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 167032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 168032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 1691d72bce8STim Tautges PetscFunctionReturn(0); 1701d72bce8STim Tautges } 1711d72bce8STim Tautges 1721d72bce8STim Tautges 173aa768e4cSTim Tautges /*@ 174aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 175aa768e4cSTim Tautges 176aa768e4cSTim Tautges Collective on MPI_Comm 177aa768e4cSTim Tautges 178aa768e4cSTim Tautges Input Parameter: 179aa768e4cSTim Tautges . dm - The DMMoab object being set 180aa768e4cSTim Tautges 181aa768e4cSTim Tautges Output Parameter: 182aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 183aa768e4cSTim Tautges 184aa768e4cSTim Tautges Level: beginner 185aa768e4cSTim Tautges 186aa768e4cSTim Tautges .keywords: DMMoab, create 187aa768e4cSTim Tautges @*/ 1881d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 1891d72bce8STim Tautges { 1901d72bce8STim Tautges PetscFunctionBegin; 1911d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 192032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 1931d72bce8STim Tautges PetscFunctionReturn(0); 1941d72bce8STim Tautges } 1951d72bce8STim Tautges 1961d72bce8STim Tautges 197aa768e4cSTim Tautges /*@ 198aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 199aa768e4cSTim Tautges 200aa768e4cSTim Tautges Collective on MPI_Comm 201aa768e4cSTim Tautges 202aa768e4cSTim Tautges Input Parameter: 203aa768e4cSTim Tautges . dm - The DMMoab object being set 204aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 205aa768e4cSTim Tautges 206aa768e4cSTim Tautges Level: beginner 207aa768e4cSTim Tautges 208aa768e4cSTim Tautges .keywords: DMMoab, create 209aa768e4cSTim Tautges @*/ 210a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 2111d72bce8STim Tautges { 212032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 213032b8ab6SVijay Mahadevan 2141d72bce8STim Tautges PetscFunctionBegin; 2151d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2161cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 217032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 218032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 219032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2201d72bce8STim Tautges PetscFunctionReturn(0); 2211d72bce8STim Tautges } 2221d72bce8STim Tautges 2231d72bce8STim Tautges 224aa768e4cSTim Tautges /*@ 225aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 226aa768e4cSTim Tautges 227aa768e4cSTim Tautges Collective on MPI_Comm 228aa768e4cSTim Tautges 229aa768e4cSTim Tautges Input Parameter: 230aa768e4cSTim Tautges . dm - The DMMoab object being set 231aa768e4cSTim Tautges 232aa768e4cSTim Tautges Output Parameter: 233aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 234aa768e4cSTim Tautges 235aa768e4cSTim Tautges Level: beginner 236aa768e4cSTim Tautges 237aa768e4cSTim Tautges .keywords: DMMoab, create 238aa768e4cSTim Tautges @*/ 239a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 2401d72bce8STim Tautges { 2419426e041SSatish Balay PetscErrorCode ierr; 242cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 243cabb514dSBarry Smith 2441d72bce8STim Tautges PetscFunctionBegin; 2451d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 246cabb514dSBarry 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); 247a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 2481d72bce8STim Tautges PetscFunctionReturn(0); 2491d72bce8STim Tautges } 2501d72bce8STim Tautges 2511d72bce8STim Tautges 252aa768e4cSTim Tautges /*@ 2535eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 254aa768e4cSTim Tautges 255aa768e4cSTim Tautges Collective on MPI_Comm 256aa768e4cSTim Tautges 257aa768e4cSTim Tautges Input Parameter: 258aa768e4cSTim Tautges . dm - The DMMoab object being set 259aa768e4cSTim Tautges . range - The entities treated by this DMMoab 260aa768e4cSTim Tautges 261aa768e4cSTim Tautges Level: beginner 262aa768e4cSTim Tautges 263aa768e4cSTim Tautges .keywords: DMMoab, create 264aa768e4cSTim Tautges @*/ 2655eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 2661d72bce8STim Tautges { 267032b8ab6SVijay Mahadevan moab::ErrorCode merr; 268032b8ab6SVijay Mahadevan PetscErrorCode ierr; 269fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 270032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 271032b8ab6SVijay Mahadevan 2721d72bce8STim Tautges PetscFunctionBegin; 2731d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 274032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 275032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 276fd3326ddSVijay Mahadevan 277032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 278fd3326ddSVijay Mahadevan 279fd3326ddSVijay Mahadevan /* filter based on parallel status */ 280fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 281fd3326ddSVijay Mahadevan 282fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 283fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 284fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 285fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 286fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 287fd3326ddSVijay Mahadevan 288fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 289032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 290032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 291b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 2921d72bce8STim Tautges PetscFunctionReturn(0); 2931d72bce8STim Tautges } 2941d72bce8STim Tautges 2951d72bce8STim Tautges 2968d8d51c8SVijay Mahadevan /*@ 2978d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 2988d8d51c8SVijay Mahadevan 2998d8d51c8SVijay Mahadevan Collective on MPI_Comm 3008d8d51c8SVijay Mahadevan 3018d8d51c8SVijay Mahadevan Input Parameter: 3028d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 3038d8d51c8SVijay Mahadevan 3048d8d51c8SVijay Mahadevan Output Parameter: 3058d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 3068d8d51c8SVijay Mahadevan 3078d8d51c8SVijay Mahadevan Level: beginner 3088d8d51c8SVijay Mahadevan 3098d8d51c8SVijay Mahadevan .keywords: DMMoab, create 3108d8d51c8SVijay Mahadevan @*/ 3118d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 3128d8d51c8SVijay Mahadevan { 3138d8d51c8SVijay Mahadevan PetscFunctionBegin; 3148d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3158d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 3168d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3178d8d51c8SVijay Mahadevan } 3188d8d51c8SVijay Mahadevan 3198d8d51c8SVijay Mahadevan 3208d8d51c8SVijay Mahadevan 321aa768e4cSTim Tautges /*@ 3225eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 323aa768e4cSTim Tautges 324aa768e4cSTim Tautges Collective on MPI_Comm 325aa768e4cSTim Tautges 326aa768e4cSTim Tautges Input Parameter: 327aa768e4cSTim Tautges . dm - The DMMoab object being set 328aa768e4cSTim Tautges 329aa768e4cSTim Tautges Output Parameter: 3305eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 3315eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 332aa768e4cSTim Tautges 333aa768e4cSTim Tautges Level: beginner 334aa768e4cSTim Tautges 335aa768e4cSTim Tautges .keywords: DMMoab, create 336aa768e4cSTim Tautges @*/ 337351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost) 3381d72bce8STim Tautges { 3391d72bce8STim Tautges PetscFunctionBegin; 3401d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 341351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 342351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3431d72bce8STim Tautges PetscFunctionReturn(0); 3441d72bce8STim Tautges } 3451d72bce8STim Tautges 3465eb88e9dSVijay Mahadevan /*@ 3475eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3485eb88e9dSVijay Mahadevan 3495eb88e9dSVijay Mahadevan Collective on MPI_Comm 3505eb88e9dSVijay Mahadevan 3515eb88e9dSVijay Mahadevan Input Parameter: 3525eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 3535eb88e9dSVijay Mahadevan 3545eb88e9dSVijay Mahadevan Output Parameter: 3555eb88e9dSVijay Mahadevan . range - The entities owned locally 3565eb88e9dSVijay Mahadevan 3575eb88e9dSVijay Mahadevan Level: beginner 3585eb88e9dSVijay Mahadevan 3595eb88e9dSVijay Mahadevan .keywords: DMMoab, create 3605eb88e9dSVijay Mahadevan @*/ 361351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range) 3625eb88e9dSVijay Mahadevan { 3635eb88e9dSVijay Mahadevan PetscFunctionBegin; 3645eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 365351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 3661cec0304SVijay Mahadevan PetscFunctionReturn(0); 3671cec0304SVijay Mahadevan } 3681cec0304SVijay Mahadevan 3691cec0304SVijay Mahadevan 3701cec0304SVijay Mahadevan /*@ 3711cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 3721cec0304SVijay Mahadevan 3731cec0304SVijay Mahadevan Collective on MPI_Comm 3741cec0304SVijay Mahadevan 3751cec0304SVijay Mahadevan Input Parameter: 3761cec0304SVijay Mahadevan . dm - The DMMoab object being set 3771cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 3781cec0304SVijay Mahadevan 3791cec0304SVijay Mahadevan Level: beginner 3801cec0304SVijay Mahadevan 3811cec0304SVijay Mahadevan .keywords: DMMoab, create 3821cec0304SVijay Mahadevan @*/ 3831cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 3841cec0304SVijay Mahadevan { 3851cec0304SVijay Mahadevan moab::ErrorCode merr; 3861cec0304SVijay Mahadevan PetscErrorCode ierr; 3871cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 3881cec0304SVijay Mahadevan 3891cec0304SVijay Mahadevan PetscFunctionBegin; 3901cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3911cec0304SVijay Mahadevan dmmoab->elocal->clear(); 3921cec0304SVijay Mahadevan dmmoab->eghost->clear(); 3931cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 3941cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 3951cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 3961cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 39741dd5348SVijay Mahadevan dmmoab->neleghost=dmmoab->eghost->size(); 398b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 3998cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 4005eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 4015eb88e9dSVijay Mahadevan } 4025eb88e9dSVijay Mahadevan 4035eb88e9dSVijay Mahadevan 404aa768e4cSTim Tautges /*@ 405aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 406aa768e4cSTim Tautges 407aa768e4cSTim Tautges Collective on MPI_Comm 408aa768e4cSTim Tautges 409aa768e4cSTim Tautges Input Parameter: 410aa768e4cSTim Tautges . dm - The DMMoab object being set 411aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 412aa768e4cSTim Tautges 413aa768e4cSTim Tautges Level: beginner 414aa768e4cSTim Tautges 415aa768e4cSTim Tautges .keywords: DMMoab, create 416aa768e4cSTim Tautges @*/ 4171d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 4181d72bce8STim Tautges { 4191d72bce8STim Tautges PetscFunctionBegin; 4201d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4211d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4221d72bce8STim Tautges PetscFunctionReturn(0); 4231d72bce8STim Tautges } 4241d72bce8STim Tautges 4251d72bce8STim Tautges 426aa768e4cSTim Tautges /*@ 427aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 428aa768e4cSTim Tautges 429aa768e4cSTim Tautges Collective on MPI_Comm 430aa768e4cSTim Tautges 431aa768e4cSTim Tautges Input Parameter: 432aa768e4cSTim Tautges . dm - The DMMoab object being set 433aa768e4cSTim Tautges 434aa768e4cSTim Tautges Output Parameter: 435aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 436aa768e4cSTim Tautges 437aa768e4cSTim Tautges Level: beginner 438aa768e4cSTim Tautges 439aa768e4cSTim Tautges .keywords: DMMoab, create 440aa768e4cSTim Tautges @*/ 4411d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 4421d72bce8STim Tautges { 4431d72bce8STim Tautges PetscFunctionBegin; 4441d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4451d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4461d72bce8STim Tautges PetscFunctionReturn(0); 4471d72bce8STim Tautges } 4481d72bce8STim Tautges 4491d72bce8STim Tautges 450aa768e4cSTim Tautges /*@ 451aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 452aa768e4cSTim Tautges 453aa768e4cSTim Tautges Collective on MPI_Comm 454aa768e4cSTim Tautges 455aa768e4cSTim Tautges Input Parameter: 456aa768e4cSTim Tautges . dm - The DMMoab object being set 457aa768e4cSTim Tautges . bs - The block size used with this DMMoab 458aa768e4cSTim Tautges 459aa768e4cSTim Tautges Level: beginner 460aa768e4cSTim Tautges 461aa768e4cSTim Tautges .keywords: DMMoab, create 462aa768e4cSTim Tautges @*/ 4631d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 4641d72bce8STim Tautges { 4651d72bce8STim Tautges PetscFunctionBegin; 4661d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4671d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4681d72bce8STim Tautges PetscFunctionReturn(0); 4691d72bce8STim Tautges } 4701d72bce8STim Tautges 4711d72bce8STim Tautges 472aa768e4cSTim Tautges /*@ 473aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 474aa768e4cSTim Tautges 475aa768e4cSTim Tautges Collective on MPI_Comm 476aa768e4cSTim Tautges 477aa768e4cSTim Tautges Input Parameter: 478aa768e4cSTim Tautges . dm - The DMMoab object being set 479aa768e4cSTim Tautges 480aa768e4cSTim Tautges Output Parameter: 481aa768e4cSTim Tautges . bs - The block size used with this DMMoab 482aa768e4cSTim Tautges 483aa768e4cSTim Tautges Level: beginner 484aa768e4cSTim Tautges 485aa768e4cSTim Tautges .keywords: DMMoab, create 486aa768e4cSTim Tautges @*/ 4871d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 4881d72bce8STim Tautges { 4891d72bce8STim Tautges PetscFunctionBegin; 4901d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4911d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 4921d72bce8STim Tautges PetscFunctionReturn(0); 4931d72bce8STim Tautges } 4941d72bce8STim Tautges 4951cec0304SVijay Mahadevan 496212ad6d1SVijay Mahadevan /*@ 497212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 498212ad6d1SVijay Mahadevan 49900cc10feSVijay Mahadevan Collective on DM 500212ad6d1SVijay Mahadevan 501212ad6d1SVijay Mahadevan Input Parameter: 502212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 503212ad6d1SVijay Mahadevan 504212ad6d1SVijay Mahadevan Output Parameter: 50500cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance 50600cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance 507212ad6d1SVijay Mahadevan 508212ad6d1SVijay Mahadevan Level: beginner 509212ad6d1SVijay Mahadevan 510212ad6d1SVijay Mahadevan .keywords: DMMoab, create 511212ad6d1SVijay Mahadevan @*/ 51241dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg) 513212ad6d1SVijay Mahadevan { 514212ad6d1SVijay Mahadevan PetscFunctionBegin; 515212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 51641dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->nele; 51741dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->n; 518212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 519212ad6d1SVijay Mahadevan } 520212ad6d1SVijay Mahadevan 521212ad6d1SVijay Mahadevan 522212ad6d1SVijay Mahadevan /*@ 523212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 524212ad6d1SVijay Mahadevan 52500cc10feSVijay Mahadevan Collective on DM 526212ad6d1SVijay Mahadevan 527212ad6d1SVijay Mahadevan Input Parameter: 528212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 529212ad6d1SVijay Mahadevan 530212ad6d1SVijay Mahadevan Output Parameter: 531b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor 53200cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 53300cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 53400cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor 535212ad6d1SVijay Mahadevan 536212ad6d1SVijay Mahadevan Level: beginner 537212ad6d1SVijay Mahadevan 538212ad6d1SVijay Mahadevan .keywords: DMMoab, create 539212ad6d1SVijay Mahadevan @*/ 54041dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg) 541212ad6d1SVijay Mahadevan { 542212ad6d1SVijay Mahadevan PetscFunctionBegin; 543212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 54441dd5348SVijay Mahadevan if(nel) *nel = ((DM_Moab*)dm->data)->neleloc; 54541dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->neleghost; 54641dd5348SVijay Mahadevan if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 54741dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 548212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 549212ad6d1SVijay Mahadevan } 550212ad6d1SVijay Mahadevan 551212ad6d1SVijay Mahadevan 55200cc10feSVijay Mahadevan /*@ 55300cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 55400cc10feSVijay Mahadevan 55500cc10feSVijay Mahadevan Collective on MPI_Comm 55600cc10feSVijay Mahadevan 55700cc10feSVijay Mahadevan Input Parameter: 55800cc10feSVijay Mahadevan . dm - The DMMoab object being set 55900cc10feSVijay Mahadevan 56000cc10feSVijay Mahadevan Output Parameter: 56100cc10feSVijay Mahadevan . offset - The local offset for the global vector 56200cc10feSVijay Mahadevan 56300cc10feSVijay Mahadevan Level: beginner 56400cc10feSVijay Mahadevan 56500cc10feSVijay Mahadevan .keywords: DMMoab, create 56600cc10feSVijay Mahadevan @*/ 56700cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset) 56800cc10feSVijay Mahadevan { 56900cc10feSVijay Mahadevan PetscFunctionBegin; 57000cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 57100cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 57200cc10feSVijay Mahadevan PetscFunctionReturn(0); 57300cc10feSVijay Mahadevan } 57400cc10feSVijay Mahadevan 57500cc10feSVijay Mahadevan 5764920ab11SVijay Mahadevan /*@ 5774920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 5784920ab11SVijay Mahadevan 5794920ab11SVijay Mahadevan Collective on MPI_Comm 5804920ab11SVijay Mahadevan 5814920ab11SVijay Mahadevan Input Parameter: 582340f3b9aSVijay Mahadevan . dm - The DMMoab object 5834920ab11SVijay Mahadevan 5844920ab11SVijay Mahadevan Output Parameter: 5854920ab11SVijay Mahadevan . dim - The dimension of DM 5864920ab11SVijay Mahadevan 5874920ab11SVijay Mahadevan Level: beginner 5884920ab11SVijay Mahadevan 5894920ab11SVijay Mahadevan .keywords: DMMoab, create 5904920ab11SVijay Mahadevan @*/ 5914920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 5924920ab11SVijay Mahadevan { 5934920ab11SVijay Mahadevan PetscFunctionBegin; 5944920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5954920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 5964920ab11SVijay Mahadevan PetscFunctionReturn(0); 5974920ab11SVijay Mahadevan } 5984920ab11SVijay Mahadevan 5994920ab11SVijay Mahadevan 600340f3b9aSVijay Mahadevan /*@ 601340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 602340f3b9aSVijay Mahadevan 603340f3b9aSVijay Mahadevan Collective on MPI_Comm 604340f3b9aSVijay Mahadevan 605340f3b9aSVijay Mahadevan Input Parameter: 606340f3b9aSVijay Mahadevan . dm - The DMMoab object 607340f3b9aSVijay Mahadevan . ehandle - The element entity handle 608340f3b9aSVijay Mahadevan 609340f3b9aSVijay Mahadevan Output Parameter: 610340f3b9aSVijay Mahadevan . mat - The material ID for the current entity 611340f3b9aSVijay Mahadevan 612340f3b9aSVijay Mahadevan Level: beginner 613340f3b9aSVijay Mahadevan 614340f3b9aSVijay Mahadevan .keywords: DMMoab, create 615340f3b9aSVijay Mahadevan @*/ 616340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat) 617340f3b9aSVijay Mahadevan { 618340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 619340f3b9aSVijay Mahadevan moab::ErrorCode merr; 620340f3b9aSVijay Mahadevan 621340f3b9aSVijay Mahadevan PetscFunctionBegin; 622340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 623340f3b9aSVijay Mahadevan if (*mat) { 624340f3b9aSVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 62563cd93b2SVijay Mahadevan merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr); 626340f3b9aSVijay Mahadevan } 627340f3b9aSVijay Mahadevan PetscFunctionReturn(0); 628340f3b9aSVijay Mahadevan } 629340f3b9aSVijay Mahadevan 6304920ab11SVijay Mahadevan 63185d305f5SVijay Mahadevan /*@ 63285d305f5SVijay Mahadevan DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities 63385d305f5SVijay Mahadevan 63485d305f5SVijay Mahadevan Collective on MPI_Comm 63585d305f5SVijay Mahadevan 63685d305f5SVijay Mahadevan Input Parameter: 63785d305f5SVijay Mahadevan . dm - The DMMoab object 63885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 63985d305f5SVijay Mahadevan . conn - The vertex entity handles 64085d305f5SVijay Mahadevan 64185d305f5SVijay Mahadevan Output Parameter: 64285d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities 64385d305f5SVijay Mahadevan 64485d305f5SVijay Mahadevan Level: beginner 64585d305f5SVijay Mahadevan 64685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity() 64785d305f5SVijay Mahadevan @*/ 648cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscReal *vpos) 6497023aa44SVijay Mahadevan { 6507023aa44SVijay Mahadevan DM_Moab *dmmoab; 6517023aa44SVijay Mahadevan PetscErrorCode ierr; 6527023aa44SVijay Mahadevan moab::ErrorCode merr; 6537023aa44SVijay Mahadevan 6547023aa44SVijay Mahadevan PetscFunctionBegin; 6557023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6567023aa44SVijay Mahadevan PetscValidPointer(conn,3); 6577023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6587023aa44SVijay Mahadevan 6597023aa44SVijay Mahadevan if (!vpos) { 6607ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr); 6617023aa44SVijay Mahadevan } 6627023aa44SVijay Mahadevan 6637023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6647023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 6657023aa44SVijay Mahadevan PetscFunctionReturn(0); 6667023aa44SVijay Mahadevan } 6677023aa44SVijay Mahadevan 6687023aa44SVijay Mahadevan 66985d305f5SVijay Mahadevan /*@ 67085d305f5SVijay Mahadevan DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity 67185d305f5SVijay Mahadevan 67285d305f5SVijay Mahadevan Collective on MPI_Comm 67385d305f5SVijay Mahadevan 67485d305f5SVijay Mahadevan Input Parameter: 67585d305f5SVijay Mahadevan . dm - The DMMoab object 67685d305f5SVijay Mahadevan . vhandle - Vertex entity handle 67785d305f5SVijay Mahadevan 67885d305f5SVijay Mahadevan Output Parameter: 67985d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 68085d305f5SVijay Mahadevan . conn - The vertex entity handles 68185d305f5SVijay Mahadevan 68285d305f5SVijay Mahadevan Level: beginner 68385d305f5SVijay Mahadevan 68485d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity() 68585d305f5SVijay Mahadevan @*/ 68685d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt* nconn, moab::EntityHandle **conn) 6878d8d51c8SVijay Mahadevan { 6888d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 6898d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 6908d8d51c8SVijay Mahadevan PetscErrorCode ierr; 6918d8d51c8SVijay Mahadevan moab::ErrorCode merr; 6928d8d51c8SVijay Mahadevan 6938d8d51c8SVijay Mahadevan PetscFunctionBegin; 6948d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6958d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 6968d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6978d8d51c8SVijay Mahadevan 6988d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 69985d305f5SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 7008d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 7018d8d51c8SVijay Mahadevan 7028d8d51c8SVijay Mahadevan if (conn) { 7038d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 7048d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 7058d8d51c8SVijay Mahadevan } 7068d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 7078d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7088d8d51c8SVijay Mahadevan } 7098d8d51c8SVijay Mahadevan 7108d8d51c8SVijay Mahadevan 71185d305f5SVijay Mahadevan /*@ 71285d305f5SVijay Mahadevan DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity 71385d305f5SVijay Mahadevan 71485d305f5SVijay Mahadevan Collective on MPI_Comm 71585d305f5SVijay Mahadevan 71685d305f5SVijay Mahadevan Input Parameter: 71785d305f5SVijay Mahadevan . dm - The DMMoab object 71885d305f5SVijay Mahadevan . vhandle - Vertex entity handle 71985d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 72085d305f5SVijay Mahadevan . conn - The vertex entity handles 72185d305f5SVijay Mahadevan 72285d305f5SVijay Mahadevan Level: beginner 72385d305f5SVijay Mahadevan 72485d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity() 72585d305f5SVijay Mahadevan @*/ 7268d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 7278d8d51c8SVijay Mahadevan { 7288d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7298d8d51c8SVijay Mahadevan 7308d8d51c8SVijay Mahadevan PetscFunctionBegin; 7318d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7328d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 7338d8d51c8SVijay Mahadevan 7348d8d51c8SVijay Mahadevan if (conn) { 7358d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 7368d8d51c8SVijay Mahadevan } 7378d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 7388d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7398d8d51c8SVijay Mahadevan } 7408d8d51c8SVijay Mahadevan 7418d8d51c8SVijay Mahadevan 74285d305f5SVijay Mahadevan /*@ 74385d305f5SVijay Mahadevan DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity 74485d305f5SVijay Mahadevan 74585d305f5SVijay Mahadevan Collective on MPI_Comm 74685d305f5SVijay Mahadevan 74785d305f5SVijay Mahadevan Input Parameter: 74885d305f5SVijay Mahadevan . dm - The DMMoab object 74985d305f5SVijay Mahadevan . ehandle - Vertex entity handle 75085d305f5SVijay Mahadevan 75185d305f5SVijay Mahadevan Output Parameter: 75285d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 75385d305f5SVijay Mahadevan . conn - The vertex entity handles 75485d305f5SVijay Mahadevan 75585d305f5SVijay Mahadevan Level: beginner 75685d305f5SVijay Mahadevan 75785d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity() 75885d305f5SVijay Mahadevan @*/ 7597023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 7607023aa44SVijay Mahadevan { 7617023aa44SVijay Mahadevan DM_Moab *dmmoab; 7627023aa44SVijay Mahadevan const moab::EntityHandle *connect; 7637023aa44SVijay Mahadevan moab::ErrorCode merr; 7647023aa44SVijay Mahadevan PetscInt nnodes; 7657023aa44SVijay Mahadevan 7667023aa44SVijay Mahadevan PetscFunctionBegin; 7677023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7687023aa44SVijay Mahadevan PetscValidPointer(conn,4); 7697023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7707023aa44SVijay Mahadevan 7717023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7727023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 7737023aa44SVijay Mahadevan if (conn) *conn=connect; 7747023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 7757023aa44SVijay Mahadevan PetscFunctionReturn(0); 7767023aa44SVijay Mahadevan } 7777023aa44SVijay Mahadevan 7787023aa44SVijay Mahadevan 77985d305f5SVijay Mahadevan /*@ 78085d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 78185d305f5SVijay Mahadevan 78285d305f5SVijay Mahadevan Collective on MPI_Comm 78385d305f5SVijay Mahadevan 78485d305f5SVijay Mahadevan Input Parameter: 78585d305f5SVijay Mahadevan . dm - The DMMoab object 78685d305f5SVijay Mahadevan . ent - Entity handle 78785d305f5SVijay Mahadevan 78885d305f5SVijay Mahadevan Output Parameter: 78985d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 79085d305f5SVijay Mahadevan 79185d305f5SVijay Mahadevan Level: beginner 79285d305f5SVijay Mahadevan 79385d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices() 79485d305f5SVijay Mahadevan @*/ 79569263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 79669263071SVijay Mahadevan { 79769263071SVijay Mahadevan moab::EntityType etype; 79869263071SVijay Mahadevan DM_Moab *dmmoab; 79969263071SVijay Mahadevan PetscInt edim; 80069263071SVijay Mahadevan 80169263071SVijay Mahadevan PetscFunctionBegin; 80269263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 80369263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 80469263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 80569263071SVijay Mahadevan 80669263071SVijay Mahadevan /* get the entity type and handle accordingly */ 80769263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 80869263071SVijay 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); 80969263071SVijay Mahadevan 81069263071SVijay Mahadevan /* get the entity dimension */ 81169263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 81269263071SVijay Mahadevan 81369263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 81469263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 81549d66b22SVijay Mahadevan *ent_on_boundary=((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE:PETSC_FALSE); 81669263071SVijay Mahadevan } 81769263071SVijay Mahadevan else { 81869263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 8196d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 82069263071SVijay Mahadevan } 82169263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 8226d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 82369263071SVijay Mahadevan } 82469263071SVijay Mahadevan } 82569263071SVijay Mahadevan PetscFunctionReturn(0); 82669263071SVijay Mahadevan } 82769263071SVijay Mahadevan 82869263071SVijay Mahadevan 82985d305f5SVijay Mahadevan /*@ 83085d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 83185d305f5SVijay Mahadevan 83285d305f5SVijay Mahadevan Input Parameter: 83385d305f5SVijay Mahadevan . dm - The DMMoab object 83485d305f5SVijay Mahadevan . nconn - Number of handles 83585d305f5SVijay Mahadevan . cnt - Array of entity handles 83685d305f5SVijay Mahadevan 83785d305f5SVijay Mahadevan Output Parameter: 83885d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 83985d305f5SVijay Mahadevan 84085d305f5SVijay Mahadevan Level: beginner 84185d305f5SVijay Mahadevan 84285d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary() 84385d305f5SVijay Mahadevan @*/ 84469263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 8457023aa44SVijay Mahadevan { 8467023aa44SVijay Mahadevan DM_Moab *dmmoab; 8477023aa44SVijay Mahadevan PetscInt i; 8487023aa44SVijay Mahadevan 8497023aa44SVijay Mahadevan PetscFunctionBegin; 8507023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8517023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 8527023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 8537023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8547023aa44SVijay Mahadevan 8557023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 8566d9eb265SVijay Mahadevan isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE); 8577023aa44SVijay Mahadevan } 8587023aa44SVijay Mahadevan PetscFunctionReturn(0); 8597023aa44SVijay Mahadevan } 8607023aa44SVijay Mahadevan 8617023aa44SVijay Mahadevan 86285d305f5SVijay Mahadevan /*@ 86385d305f5SVijay Mahadevan DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary 86485d305f5SVijay Mahadevan 86585d305f5SVijay Mahadevan Input Parameter: 86685d305f5SVijay Mahadevan . dm - The DMMoab object 86785d305f5SVijay Mahadevan 86885d305f5SVijay Mahadevan Output Parameter: 86985d305f5SVijay Mahadevan . bdvtx - Boundary vertices 87085d305f5SVijay Mahadevan . bdelems - Boundary elements 87185d305f5SVijay Mahadevan . bdfaces - Boundary faces 87285d305f5SVijay Mahadevan 87385d305f5SVijay Mahadevan Level: beginner 87485d305f5SVijay Mahadevan 87585d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary() 87685d305f5SVijay Mahadevan @*/ 8776d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces) 8781cec0304SVijay Mahadevan { 8791cec0304SVijay Mahadevan DM_Moab *dmmoab; 8801cec0304SVijay Mahadevan 8811cec0304SVijay Mahadevan PetscFunctionBegin; 8821cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8831cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8841cec0304SVijay Mahadevan 8856d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 8866d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 8876d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 8881cec0304SVijay Mahadevan PetscFunctionReturn(0); 8891cec0304SVijay Mahadevan } 8901cec0304SVijay Mahadevan 891f6829af0SVijay Mahadevan 892f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 893f6829af0SVijay Mahadevan { 894f6829af0SVijay Mahadevan PetscErrorCode ierr; 89585d305f5SVijay Mahadevan PetscInt i; 896e882eb38SVijay Mahadevan moab::ErrorCode merr; 897f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 898f6829af0SVijay Mahadevan 899f6829af0SVijay Mahadevan PetscFunctionBegin; 900f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 901f6829af0SVijay Mahadevan if (dmmoab->icreatedinstance) { 902f6829af0SVijay Mahadevan delete dmmoab->mbiface; 903f6829af0SVijay Mahadevan } 904f6829af0SVijay Mahadevan dmmoab->mbiface = NULL; 905f6829af0SVijay Mahadevan dmmoab->pcomm = NULL; 906f6829af0SVijay Mahadevan delete dmmoab->vlocal; 907f6829af0SVijay Mahadevan delete dmmoab->vowned; 908f6829af0SVijay Mahadevan delete dmmoab->vghost; 909f6829af0SVijay Mahadevan delete dmmoab->elocal; 910f6829af0SVijay Mahadevan delete dmmoab->eghost; 911f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 912f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 913f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 914f6829af0SVijay Mahadevan 915f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 9167ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr); 9175905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr); 9185905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr); 91985d305f5SVijay Mahadevan if (dmmoab->fieldNames) { 92085d305f5SVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 92185d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 92285d305f5SVijay Mahadevan } 92385d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 92485d305f5SVijay Mahadevan } 925b117cd09SVijay Mahadevan 926b117cd09SVijay Mahadevan if (dmmoab->nhlevels) { 927b117cd09SVijay Mahadevan ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr); 928e882eb38SVijay Mahadevan dmmoab->nhlevels=0; 929e882eb38SVijay Mahadevan if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy; 930e882eb38SVijay Mahadevan dmmoab->hierarchy=NULL; 931b117cd09SVijay Mahadevan } 932e882eb38SVijay Mahadevan 933e882eb38SVijay Mahadevan if (dmmoab->icreatedinstance) { 934e882eb38SVijay Mahadevan merr = dmmoab->mbiface->delete_mesh();MBERRNM(merr); 935e882eb38SVijay Mahadevan delete dmmoab->mbiface; 936e882eb38SVijay Mahadevan } 937e882eb38SVijay Mahadevan dmmoab->mbiface = NULL; 938e882eb38SVijay Mahadevan dmmoab->pcomm = NULL; 939e882eb38SVijay Mahadevan 940f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 941f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 942f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 943f6829af0SVijay Mahadevan PetscFunctionReturn(0); 944f6829af0SVijay Mahadevan } 945f6829af0SVijay Mahadevan 946f6829af0SVijay Mahadevan 9474416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject,DM dm) 9482e4e7c01SVijay Mahadevan { 9492e4e7c01SVijay Mahadevan PetscErrorCode ierr; 9502e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 9512e4e7c01SVijay Mahadevan 9522e4e7c01SVijay Mahadevan PetscFunctionBegin; 9532e4e7c01SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 954cc310fddSBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr); 9552e4e7c01SVijay Mahadevan ierr = PetscOptionsInt("-dm_moab_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "DMView", dmmoab->rw_dbglevel, &dmmoab->rw_dbglevel, NULL);CHKERRQ(ierr); 9562e4e7c01SVijay Mahadevan ierr = PetscOptionsBool("-dm_moab_partiton_by_rank", "Use partition by rank when reading MOAB meshes from file", "DMView", dmmoab->partition_by_rank, &dmmoab->partition_by_rank, NULL);CHKERRQ(ierr); 9572e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 9582e4e7c01SVijay Mahadevan ierr = PetscOptionsString("-dm_moab_read_opts", "Extra options to enable MOAB reader to load DM from file", "DMView", dmmoab->extra_read_options, dmmoab->extra_read_options, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr); 9592e4e7c01SVijay Mahadevan ierr = PetscOptionsString("-dm_moab_write_opts", "Extra options to enable MOAB writer to serialize DM to file", "DMView", dmmoab->extra_write_options, dmmoab->extra_write_options, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr); 9602e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr); 9612e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr); 9622e4e7c01SVijay Mahadevan PetscFunctionReturn(0); 9632e4e7c01SVijay Mahadevan } 9642e4e7c01SVijay Mahadevan 9652e4e7c01SVijay Mahadevan 966f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 967f6829af0SVijay Mahadevan { 968f6829af0SVijay Mahadevan PetscErrorCode ierr; 969f6829af0SVijay Mahadevan moab::ErrorCode merr; 970f6829af0SVijay Mahadevan Vec local, global; 971f6829af0SVijay Mahadevan IS from,to; 972f6829af0SVijay Mahadevan moab::Range::iterator iter; 973ce27a4eeSVijay Mahadevan PetscInt i,j,f,bs,gmin,lmin,lmax,vent,totsize,*lgmap; 974f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 975f6829af0SVijay Mahadevan moab::Range adjs; 976f6829af0SVijay Mahadevan 977f6829af0SVijay Mahadevan PetscFunctionBegin; 978f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 979f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 980c528d872SBarry Smith if (dmmoab->mbiface == NULL || dmmoab->pcomm == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp."); 981f6829af0SVijay Mahadevan 982f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 983f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 984f6829af0SVijay Mahadevan { 98549d66b22SVijay Mahadevan //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 98649d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false);MBERRNM(merr); 987f6829af0SVijay Mahadevan 988f6829af0SVijay Mahadevan /* filter based on parallel status */ 989f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 990f6829af0SVijay Mahadevan 991f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 992f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 993*64e1c140SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_GHOST|PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 994f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 995f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 996f6829af0SVijay Mahadevan 997f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 998f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 999f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 100049d66b22SVijay Mahadevan 1001b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 100249d66b22SVijay Mahadevan PetscInfo4(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost); 1003f6829af0SVijay Mahadevan } 1004f6829af0SVijay Mahadevan 1005f6829af0SVijay Mahadevan { 1006f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 1007f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 1008f6829af0SVijay Mahadevan 1009f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 1010f6829af0SVijay Mahadevan for (i=3;i>0;i--) { 1011f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 101249d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false);MBERRNM(merr); 1013f6829af0SVijay Mahadevan 1014f6829af0SVijay Mahadevan /* store the current mesh dimension */ 1015f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 1016f6829af0SVijay Mahadevan dmmoab->dim=i; 1017f6829af0SVijay Mahadevan break; 1018f6829af0SVijay Mahadevan } 1019f6829af0SVijay Mahadevan } 1020f6829af0SVijay Mahadevan 1021b117cd09SVijay Mahadevan ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr); 1022b117cd09SVijay Mahadevan 1023f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 1024f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 1025f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1026f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 1027f6829af0SVijay Mahadevan 1028f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 1029f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 103049d66b22SVijay Mahadevan 1031b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 103249d66b22SVijay Mahadevan PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost); 1033f6829af0SVijay Mahadevan } 1034f6829af0SVijay Mahadevan 1035f6829af0SVijay Mahadevan bs = dmmoab->bs; 1036f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 1037f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 1038f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 1039f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 1040f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1041f6829af0SVijay Mahadevan } 1042f6829af0SVijay Mahadevan 1043f6829af0SVijay Mahadevan totsize=dmmoab->vlocal->size(); 104449d66b22SVijay Mahadevan if (totsize != dmmoab->nloc+dmmoab->nghost) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.",totsize,dmmoab->nloc+dmmoab->nghost); 104549d66b22SVijay Mahadevan ierr = PetscCalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr); 1046f6829af0SVijay Mahadevan { 1047f6829af0SVijay Mahadevan /* first get the local indices */ 1048f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 10493f1c6e43SVijay Mahadevan if (dmmoab->nghost) { /* next get the ghosted indices */ 1050f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1051f6829af0SVijay Mahadevan } 1052f6829af0SVijay Mahadevan 1053f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1054f6829af0SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 1055f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1056f6829af0SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 1057f6829af0SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 1058f6829af0SVijay Mahadevan } 1059f6829af0SVijay Mahadevan 1060b2566f29SBarry Smith ierr = MPIU_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1061f6829af0SVijay Mahadevan 1062f6829af0SVijay Mahadevan /* set the GID map */ 1063f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1064f6829af0SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 1065f6829af0SVijay Mahadevan } 1066f6829af0SVijay Mahadevan lmin-=gmin; 1067f6829af0SVijay Mahadevan lmax-=gmin; 1068f6829af0SVijay Mahadevan 1069f6829af0SVijay Mahadevan PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 1070f6829af0SVijay Mahadevan } 107182dfd14aSVijay Mahadevan if(!(dmmoab->bs==dmmoab->numFields || dmmoab->bs == 1)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between block size and number of component fields. %D != 1 OR %D != %D.",dmmoab->bs,dmmoab->bs,dmmoab->numFields); 1072f6829af0SVijay Mahadevan 1073f6829af0SVijay Mahadevan { 10743f1c6e43SVijay Mahadevan dmmoab->seqstart=((PetscInt)dmmoab->vlocal->front()); 10753f1c6e43SVijay Mahadevan dmmoab->seqend=((PetscInt)dmmoab->vlocal->back()); 107649d66b22SVijay Mahadevan PetscInfo2(NULL, "SEQUENCE: Local minima - %D, Local maxima - %D.\n", dmmoab->seqstart, dmmoab->seqend); 10773f1c6e43SVijay Mahadevan 107849d66b22SVijay Mahadevan ierr = PetscMalloc2(dmmoab->seqend-dmmoab->seqstart+1,&dmmoab->gidmap,dmmoab->seqend-dmmoab->seqstart+1,&dmmoab->lidmap);CHKERRQ(ierr); 10793f1c6e43SVijay Mahadevan ierr = PetscMalloc1(totsize*dmmoab->numFields,&lgmap);CHKERRQ(ierr); 1080f6829af0SVijay Mahadevan 1081f6829af0SVijay Mahadevan i=j=0; 1082f6829af0SVijay Mahadevan /* set the owned vertex data first */ 1083f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 10843f1c6e43SVijay Mahadevan vent=(PetscInt)(*iter)-dmmoab->seqstart; 1085f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1086f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1087f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 10883f1c6e43SVijay Mahadevan lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]); 1089f6829af0SVijay Mahadevan } 1090f6829af0SVijay Mahadevan } 1091f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1092f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 10933f1c6e43SVijay Mahadevan vent=(PetscInt)(*iter)-dmmoab->seqstart; 1094f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1095f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1096f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 10973f1c6e43SVijay Mahadevan lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]); 1098f6829af0SVijay Mahadevan } 1099f6829af0SVijay Mahadevan } 1100f6829af0SVijay Mahadevan 1101f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1102f6829af0SVijay Mahadevan 1) First create a local and global vector 1103f6829af0SVijay Mahadevan 2) Create a local and global IS 1104f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1105f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1106f6829af0SVijay Mahadevan */ 1107f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 1108f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 1109f6829af0SVijay Mahadevan 1110f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 1111f6829af0SVijay Mahadevan 1112f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 1113f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr); 1114f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr); 1115f6829af0SVijay Mahadevan 11163f1c6e43SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 1117f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr); 1118f6829af0SVijay Mahadevan 1119f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1120f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 11213f1c6e43SVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,lgmap, 1122f6829af0SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 1123f6829af0SVijay Mahadevan } 1124f6829af0SVijay Mahadevan 1125f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 1126f6829af0SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 1127f6829af0SVijay Mahadevan 1128f6829af0SVijay Mahadevan /* clean up IS, Vec */ 11293f1c6e43SVijay Mahadevan ierr = PetscFree(lgmap);CHKERRQ(ierr); 1130f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 1131f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 1132f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 1133f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 1134f6829af0SVijay Mahadevan } 1135f6829af0SVijay Mahadevan 113649d66b22SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 113749d66b22SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 113849d66b22SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1139f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 1140f6829af0SVijay Mahadevan { 1141f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1142f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1143f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1144f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1145f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1146f6829af0SVijay Mahadevan 1147f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 1148f6829af0SVijay 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 1149f6829af0SVijay Mahadevan 1150f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1151f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1152f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 1153f6829af0SVijay Mahadevan 1154f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1155f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 1156f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 1157f6829af0SVijay Mahadevan } 115849d66b22SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size()); 1159f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1160f6829af0SVijay Mahadevan } 1161f6829af0SVijay Mahadevan 1162f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1163f6829af0SVijay Mahadevan { 1164f6829af0SVijay Mahadevan PetscErrorCode ierr; 1165f6829af0SVijay Mahadevan 1166f6829af0SVijay Mahadevan PetscFunctionBegin; 1167f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1168f90c3b0eSVijay Mahadevan ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr); 1169f6829af0SVijay Mahadevan 1170f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1171f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1172f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1173f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1174f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1175f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1176f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1177f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1178c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_map = NULL; 1179c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_sendrecv = NULL; 1180f6829af0SVijay Mahadevan 1181f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1182f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1183f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1184f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1185f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1186f6829af0SVijay Mahadevan 1187f6829af0SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1188f6829af0SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1189f6829af0SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1190f6829af0SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1191f6829af0SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 1192e882eb38SVijay Mahadevan dm->ops->coarsenhierarchy = DMCoarsenHierarchy_Moab; 1193e882eb38SVijay Mahadevan dm->ops->refinehierarchy = DMRefineHierarchy_Moab; 1194b117cd09SVijay Mahadevan dm->ops->createinterpolation = DMCreateInterpolation_Moab; 1195b117cd09SVijay Mahadevan //dm->ops->getinjection = DMCreateInjection_Moab; 1196b117cd09SVijay Mahadevan dm->ops->refine = DMRefine_Moab; 1197b117cd09SVijay Mahadevan dm->ops->coarsen = DMCoarsen_Moab; 11982e4e7c01SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1199f6829af0SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1200f6829af0SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1201f6829af0SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1202f6829af0SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1203f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1204f6829af0SVijay Mahadevan } 1205f6829af0SVijay Mahadevan 1206