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 600*755f3dfbSVijay Mahadevan #undef __FUNCT__ 601*755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetHierarchyLevel" 602*755f3dfbSVijay Mahadevan /*@ 603*755f3dfbSVijay Mahadevan DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy 604*755f3dfbSVijay Mahadevan generated through uniform refinement. 605*755f3dfbSVijay Mahadevan 606*755f3dfbSVijay Mahadevan Collective on DM 607*755f3dfbSVijay Mahadevan 608*755f3dfbSVijay Mahadevan Input Parameter: 609*755f3dfbSVijay Mahadevan . dm - The DMMoab object being set 610*755f3dfbSVijay Mahadevan 611*755f3dfbSVijay Mahadevan Output Parameter: 612*755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level 613*755f3dfbSVijay Mahadevan 614*755f3dfbSVijay Mahadevan Level: beginner 615*755f3dfbSVijay Mahadevan 616*755f3dfbSVijay Mahadevan .keywords: DMMoab, multigrid 617*755f3dfbSVijay Mahadevan @*/ 618*755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm,PetscInt *nlevel) 619*755f3dfbSVijay Mahadevan { 620*755f3dfbSVijay Mahadevan PetscFunctionBegin; 621*755f3dfbSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 622*755f3dfbSVijay Mahadevan if(nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel; 623*755f3dfbSVijay Mahadevan PetscFunctionReturn(0); 624*755f3dfbSVijay Mahadevan } 625*755f3dfbSVijay Mahadevan 626*755f3dfbSVijay Mahadevan 627*755f3dfbSVijay Mahadevan #undef __FUNCT__ 628*755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetMaterialBlock" 629340f3b9aSVijay Mahadevan /*@ 630340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 631340f3b9aSVijay Mahadevan 632340f3b9aSVijay Mahadevan Collective on MPI_Comm 633340f3b9aSVijay Mahadevan 634340f3b9aSVijay Mahadevan Input Parameter: 635340f3b9aSVijay Mahadevan . dm - The DMMoab object 636340f3b9aSVijay Mahadevan . ehandle - The element entity handle 637340f3b9aSVijay Mahadevan 638340f3b9aSVijay Mahadevan Output Parameter: 639340f3b9aSVijay Mahadevan . mat - The material ID for the current entity 640340f3b9aSVijay Mahadevan 641340f3b9aSVijay Mahadevan Level: beginner 642340f3b9aSVijay Mahadevan 643340f3b9aSVijay Mahadevan .keywords: DMMoab, create 644340f3b9aSVijay Mahadevan @*/ 645340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat) 646340f3b9aSVijay Mahadevan { 647340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 648340f3b9aSVijay Mahadevan moab::ErrorCode merr; 649340f3b9aSVijay Mahadevan 650340f3b9aSVijay Mahadevan PetscFunctionBegin; 651340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 652340f3b9aSVijay Mahadevan if (*mat) { 653340f3b9aSVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 65463cd93b2SVijay Mahadevan merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr); 655340f3b9aSVijay Mahadevan } 656340f3b9aSVijay Mahadevan PetscFunctionReturn(0); 657340f3b9aSVijay Mahadevan } 658340f3b9aSVijay Mahadevan 6594920ab11SVijay Mahadevan 66085d305f5SVijay Mahadevan /*@ 66185d305f5SVijay Mahadevan DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities 66285d305f5SVijay Mahadevan 66385d305f5SVijay Mahadevan Collective on MPI_Comm 66485d305f5SVijay Mahadevan 66585d305f5SVijay Mahadevan Input Parameter: 66685d305f5SVijay Mahadevan . dm - The DMMoab object 66785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 66885d305f5SVijay Mahadevan . conn - The vertex entity handles 66985d305f5SVijay Mahadevan 67085d305f5SVijay Mahadevan Output Parameter: 67185d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities 67285d305f5SVijay Mahadevan 67385d305f5SVijay Mahadevan Level: beginner 67485d305f5SVijay Mahadevan 67585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity() 67685d305f5SVijay Mahadevan @*/ 677cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscReal *vpos) 6787023aa44SVijay Mahadevan { 6797023aa44SVijay Mahadevan DM_Moab *dmmoab; 6807023aa44SVijay Mahadevan PetscErrorCode ierr; 6817023aa44SVijay Mahadevan moab::ErrorCode merr; 6827023aa44SVijay Mahadevan 6837023aa44SVijay Mahadevan PetscFunctionBegin; 6847023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6857023aa44SVijay Mahadevan PetscValidPointer(conn,3); 6867023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6877023aa44SVijay Mahadevan 6887023aa44SVijay Mahadevan if (!vpos) { 6897ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr); 6907023aa44SVijay Mahadevan } 6917023aa44SVijay Mahadevan 6927023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6937023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 6947023aa44SVijay Mahadevan PetscFunctionReturn(0); 6957023aa44SVijay Mahadevan } 6967023aa44SVijay Mahadevan 6977023aa44SVijay Mahadevan 69885d305f5SVijay Mahadevan /*@ 69985d305f5SVijay Mahadevan DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity 70085d305f5SVijay Mahadevan 70185d305f5SVijay Mahadevan Collective on MPI_Comm 70285d305f5SVijay Mahadevan 70385d305f5SVijay Mahadevan Input Parameter: 70485d305f5SVijay Mahadevan . dm - The DMMoab object 70585d305f5SVijay Mahadevan . vhandle - Vertex entity handle 70685d305f5SVijay Mahadevan 70785d305f5SVijay Mahadevan Output Parameter: 70885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 70985d305f5SVijay Mahadevan . conn - The vertex entity handles 71085d305f5SVijay Mahadevan 71185d305f5SVijay Mahadevan Level: beginner 71285d305f5SVijay Mahadevan 71385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity() 71485d305f5SVijay Mahadevan @*/ 71585d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt* nconn, moab::EntityHandle **conn) 7168d8d51c8SVijay Mahadevan { 7178d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 7188d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 7198d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7208d8d51c8SVijay Mahadevan moab::ErrorCode merr; 7218d8d51c8SVijay Mahadevan 7228d8d51c8SVijay Mahadevan PetscFunctionBegin; 7238d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7248d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 7258d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7268d8d51c8SVijay Mahadevan 7278d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 72885d305f5SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 7298d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 7308d8d51c8SVijay Mahadevan 7318d8d51c8SVijay Mahadevan if (conn) { 7328d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 7338d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 7348d8d51c8SVijay Mahadevan } 7358d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 7368d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7378d8d51c8SVijay Mahadevan } 7388d8d51c8SVijay Mahadevan 7398d8d51c8SVijay Mahadevan 74085d305f5SVijay Mahadevan /*@ 74185d305f5SVijay Mahadevan DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity 74285d305f5SVijay Mahadevan 74385d305f5SVijay Mahadevan Collective on MPI_Comm 74485d305f5SVijay Mahadevan 74585d305f5SVijay Mahadevan Input Parameter: 74685d305f5SVijay Mahadevan . dm - The DMMoab object 74785d305f5SVijay Mahadevan . vhandle - Vertex entity handle 74885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 74985d305f5SVijay Mahadevan . conn - The vertex entity handles 75085d305f5SVijay Mahadevan 75185d305f5SVijay Mahadevan Level: beginner 75285d305f5SVijay Mahadevan 75385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity() 75485d305f5SVijay Mahadevan @*/ 7558d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 7568d8d51c8SVijay Mahadevan { 7578d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7588d8d51c8SVijay Mahadevan 7598d8d51c8SVijay Mahadevan PetscFunctionBegin; 7608d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7618d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 7628d8d51c8SVijay Mahadevan 7638d8d51c8SVijay Mahadevan if (conn) { 7648d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 7658d8d51c8SVijay Mahadevan } 7668d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 7678d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7688d8d51c8SVijay Mahadevan } 7698d8d51c8SVijay Mahadevan 7708d8d51c8SVijay Mahadevan 77185d305f5SVijay Mahadevan /*@ 77285d305f5SVijay Mahadevan DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity 77385d305f5SVijay Mahadevan 77485d305f5SVijay Mahadevan Collective on MPI_Comm 77585d305f5SVijay Mahadevan 77685d305f5SVijay Mahadevan Input Parameter: 77785d305f5SVijay Mahadevan . dm - The DMMoab object 77885d305f5SVijay Mahadevan . ehandle - Vertex entity handle 77985d305f5SVijay Mahadevan 78085d305f5SVijay Mahadevan Output Parameter: 78185d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 78285d305f5SVijay Mahadevan . conn - The vertex entity handles 78385d305f5SVijay Mahadevan 78485d305f5SVijay Mahadevan Level: beginner 78585d305f5SVijay Mahadevan 78685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity() 78785d305f5SVijay Mahadevan @*/ 7887023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 7897023aa44SVijay Mahadevan { 7907023aa44SVijay Mahadevan DM_Moab *dmmoab; 7917023aa44SVijay Mahadevan const moab::EntityHandle *connect; 7927023aa44SVijay Mahadevan moab::ErrorCode merr; 7937023aa44SVijay Mahadevan PetscInt nnodes; 7947023aa44SVijay Mahadevan 7957023aa44SVijay Mahadevan PetscFunctionBegin; 7967023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7977023aa44SVijay Mahadevan PetscValidPointer(conn,4); 7987023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7997023aa44SVijay Mahadevan 8007023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 8017023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 8027023aa44SVijay Mahadevan if (conn) *conn=connect; 8037023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 8047023aa44SVijay Mahadevan PetscFunctionReturn(0); 8057023aa44SVijay Mahadevan } 8067023aa44SVijay Mahadevan 8077023aa44SVijay Mahadevan 80885d305f5SVijay Mahadevan /*@ 80985d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 81085d305f5SVijay Mahadevan 81185d305f5SVijay Mahadevan Collective on MPI_Comm 81285d305f5SVijay Mahadevan 81385d305f5SVijay Mahadevan Input Parameter: 81485d305f5SVijay Mahadevan . dm - The DMMoab object 81585d305f5SVijay Mahadevan . ent - Entity handle 81685d305f5SVijay Mahadevan 81785d305f5SVijay Mahadevan Output Parameter: 81885d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 81985d305f5SVijay Mahadevan 82085d305f5SVijay Mahadevan Level: beginner 82185d305f5SVijay Mahadevan 82285d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices() 82385d305f5SVijay Mahadevan @*/ 82469263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 82569263071SVijay Mahadevan { 82669263071SVijay Mahadevan moab::EntityType etype; 82769263071SVijay Mahadevan DM_Moab *dmmoab; 82869263071SVijay Mahadevan PetscInt edim; 82969263071SVijay Mahadevan 83069263071SVijay Mahadevan PetscFunctionBegin; 83169263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 83269263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 83369263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 83469263071SVijay Mahadevan 83569263071SVijay Mahadevan /* get the entity type and handle accordingly */ 83669263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 83769263071SVijay 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); 83869263071SVijay Mahadevan 83969263071SVijay Mahadevan /* get the entity dimension */ 84069263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 84169263071SVijay Mahadevan 84269263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 84369263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 84449d66b22SVijay Mahadevan *ent_on_boundary=((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE:PETSC_FALSE); 84569263071SVijay Mahadevan } 84669263071SVijay Mahadevan else { 84769263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 8486d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 84969263071SVijay Mahadevan } 85069263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 8516d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 85269263071SVijay Mahadevan } 85369263071SVijay Mahadevan } 85469263071SVijay Mahadevan PetscFunctionReturn(0); 85569263071SVijay Mahadevan } 85669263071SVijay Mahadevan 85769263071SVijay Mahadevan 85885d305f5SVijay Mahadevan /*@ 85985d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 86085d305f5SVijay Mahadevan 86185d305f5SVijay Mahadevan Input Parameter: 86285d305f5SVijay Mahadevan . dm - The DMMoab object 86385d305f5SVijay Mahadevan . nconn - Number of handles 86485d305f5SVijay Mahadevan . cnt - Array of entity handles 86585d305f5SVijay Mahadevan 86685d305f5SVijay Mahadevan Output Parameter: 86785d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 86885d305f5SVijay Mahadevan 86985d305f5SVijay Mahadevan Level: beginner 87085d305f5SVijay Mahadevan 87185d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary() 87285d305f5SVijay Mahadevan @*/ 87369263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 8747023aa44SVijay Mahadevan { 8757023aa44SVijay Mahadevan DM_Moab *dmmoab; 8767023aa44SVijay Mahadevan PetscInt i; 8777023aa44SVijay Mahadevan 8787023aa44SVijay Mahadevan PetscFunctionBegin; 8797023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8807023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 8817023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 8827023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8837023aa44SVijay Mahadevan 8847023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 8856d9eb265SVijay Mahadevan isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE); 8867023aa44SVijay Mahadevan } 8877023aa44SVijay Mahadevan PetscFunctionReturn(0); 8887023aa44SVijay Mahadevan } 8897023aa44SVijay Mahadevan 8907023aa44SVijay Mahadevan 89185d305f5SVijay Mahadevan /*@ 89285d305f5SVijay Mahadevan DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary 89385d305f5SVijay Mahadevan 89485d305f5SVijay Mahadevan Input Parameter: 89585d305f5SVijay Mahadevan . dm - The DMMoab object 89685d305f5SVijay Mahadevan 89785d305f5SVijay Mahadevan Output Parameter: 89885d305f5SVijay Mahadevan . bdvtx - Boundary vertices 89985d305f5SVijay Mahadevan . bdelems - Boundary elements 90085d305f5SVijay Mahadevan . bdfaces - Boundary faces 90185d305f5SVijay Mahadevan 90285d305f5SVijay Mahadevan Level: beginner 90385d305f5SVijay Mahadevan 90485d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary() 90585d305f5SVijay Mahadevan @*/ 9066d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces) 9071cec0304SVijay Mahadevan { 9081cec0304SVijay Mahadevan DM_Moab *dmmoab; 9091cec0304SVijay Mahadevan 9101cec0304SVijay Mahadevan PetscFunctionBegin; 9111cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9121cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9131cec0304SVijay Mahadevan 9146d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 9156d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 9166d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 9171cec0304SVijay Mahadevan PetscFunctionReturn(0); 9181cec0304SVijay Mahadevan } 9191cec0304SVijay Mahadevan 920f6829af0SVijay Mahadevan 921f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 922f6829af0SVijay Mahadevan { 923f6829af0SVijay Mahadevan PetscErrorCode ierr; 92485d305f5SVijay Mahadevan PetscInt i; 925e882eb38SVijay Mahadevan moab::ErrorCode merr; 926f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 927f6829af0SVijay Mahadevan 928f6829af0SVijay Mahadevan PetscFunctionBegin; 929f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 930f6829af0SVijay Mahadevan if (dmmoab->icreatedinstance) { 931f6829af0SVijay Mahadevan delete dmmoab->mbiface; 932f6829af0SVijay Mahadevan } 933f6829af0SVijay Mahadevan dmmoab->mbiface = NULL; 934f6829af0SVijay Mahadevan dmmoab->pcomm = NULL; 935f6829af0SVijay Mahadevan delete dmmoab->vlocal; 936f6829af0SVijay Mahadevan delete dmmoab->vowned; 937f6829af0SVijay Mahadevan delete dmmoab->vghost; 938f6829af0SVijay Mahadevan delete dmmoab->elocal; 939f6829af0SVijay Mahadevan delete dmmoab->eghost; 940f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 941f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 942f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 943f6829af0SVijay Mahadevan 944f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 9457ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr); 9465905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr); 9475905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr); 94885d305f5SVijay Mahadevan if (dmmoab->fieldNames) { 94985d305f5SVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 95085d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 95185d305f5SVijay Mahadevan } 95285d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 95385d305f5SVijay Mahadevan } 954b117cd09SVijay Mahadevan 955b117cd09SVijay Mahadevan if (dmmoab->nhlevels) { 956b117cd09SVijay Mahadevan ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr); 957e882eb38SVijay Mahadevan dmmoab->nhlevels=0; 958e882eb38SVijay Mahadevan if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy; 959e882eb38SVijay Mahadevan dmmoab->hierarchy=NULL; 960b117cd09SVijay Mahadevan } 961e882eb38SVijay Mahadevan 962e882eb38SVijay Mahadevan if (dmmoab->icreatedinstance) { 963e882eb38SVijay Mahadevan merr = dmmoab->mbiface->delete_mesh();MBERRNM(merr); 964e882eb38SVijay Mahadevan delete dmmoab->mbiface; 965e882eb38SVijay Mahadevan } 966e882eb38SVijay Mahadevan dmmoab->mbiface = NULL; 967e882eb38SVijay Mahadevan dmmoab->pcomm = NULL; 968e882eb38SVijay Mahadevan 969f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 970f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 971f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 972f6829af0SVijay Mahadevan PetscFunctionReturn(0); 973f6829af0SVijay Mahadevan } 974f6829af0SVijay Mahadevan 975f6829af0SVijay Mahadevan 9764416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject,DM dm) 9772e4e7c01SVijay Mahadevan { 9782e4e7c01SVijay Mahadevan PetscErrorCode ierr; 9792e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 9802e4e7c01SVijay Mahadevan 9812e4e7c01SVijay Mahadevan PetscFunctionBegin; 9822e4e7c01SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 983cc310fddSBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr); 9842e4e7c01SVijay 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); 9852e4e7c01SVijay 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); 9862e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 9872e4e7c01SVijay 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); 9882e4e7c01SVijay 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); 9892e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr); 9902e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr); 9912e4e7c01SVijay Mahadevan PetscFunctionReturn(0); 9922e4e7c01SVijay Mahadevan } 9932e4e7c01SVijay Mahadevan 9942e4e7c01SVijay Mahadevan 995f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 996f6829af0SVijay Mahadevan { 997f6829af0SVijay Mahadevan PetscErrorCode ierr; 998f6829af0SVijay Mahadevan moab::ErrorCode merr; 999f6829af0SVijay Mahadevan Vec local, global; 1000f6829af0SVijay Mahadevan IS from,to; 1001f6829af0SVijay Mahadevan moab::Range::iterator iter; 1002ce27a4eeSVijay Mahadevan PetscInt i,j,f,bs,gmin,lmin,lmax,vent,totsize,*lgmap; 1003f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 1004f6829af0SVijay Mahadevan moab::Range adjs; 1005f6829af0SVijay Mahadevan 1006f6829af0SVijay Mahadevan PetscFunctionBegin; 1007f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1008f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 1009c528d872SBarry 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."); 1010f6829af0SVijay Mahadevan 1011f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 1012f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 1013f6829af0SVijay Mahadevan { 101449d66b22SVijay Mahadevan //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 101549d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false);MBERRNM(merr); 1016f6829af0SVijay Mahadevan 1017f6829af0SVijay Mahadevan /* filter based on parallel status */ 1018f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 1019f6829af0SVijay Mahadevan 1020f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1021f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 102264e1c140SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_GHOST|PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 1023f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 1024f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 1025f6829af0SVijay Mahadevan 1026f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 1027f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 1028f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 102949d66b22SVijay Mahadevan 1030b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 103149d66b22SVijay Mahadevan PetscInfo4(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost); 1032f6829af0SVijay Mahadevan } 1033f6829af0SVijay Mahadevan 1034f6829af0SVijay Mahadevan { 1035f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 1036f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 1037f6829af0SVijay Mahadevan 1038f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 1039f6829af0SVijay Mahadevan for (i=3;i>0;i--) { 1040f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 104149d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false);MBERRNM(merr); 1042f6829af0SVijay Mahadevan 1043f6829af0SVijay Mahadevan /* store the current mesh dimension */ 1044f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 1045f6829af0SVijay Mahadevan dmmoab->dim=i; 1046f6829af0SVijay Mahadevan break; 1047f6829af0SVijay Mahadevan } 1048f6829af0SVijay Mahadevan } 1049f6829af0SVijay Mahadevan 1050b117cd09SVijay Mahadevan ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr); 1051b117cd09SVijay Mahadevan 1052f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 1053f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 1054f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1055f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 1056f6829af0SVijay Mahadevan 1057f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 1058f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 105949d66b22SVijay Mahadevan 1060b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 106149d66b22SVijay Mahadevan PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost); 1062f6829af0SVijay Mahadevan } 1063f6829af0SVijay Mahadevan 1064f6829af0SVijay Mahadevan bs = dmmoab->bs; 1065f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 1066f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 1067f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 1068f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 1069f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1070f6829af0SVijay Mahadevan } 1071f6829af0SVijay Mahadevan 1072f6829af0SVijay Mahadevan totsize=dmmoab->vlocal->size(); 107349d66b22SVijay 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); 107449d66b22SVijay Mahadevan ierr = PetscCalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr); 1075f6829af0SVijay Mahadevan { 1076f6829af0SVijay Mahadevan /* first get the local indices */ 1077f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 10783f1c6e43SVijay Mahadevan if (dmmoab->nghost) { /* next get the ghosted indices */ 1079f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1080f6829af0SVijay Mahadevan } 1081f6829af0SVijay Mahadevan 1082f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1083f6829af0SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 1084f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1085f6829af0SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 1086f6829af0SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 1087f6829af0SVijay Mahadevan } 1088f6829af0SVijay Mahadevan 1089b2566f29SBarry Smith ierr = MPIU_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1090f6829af0SVijay Mahadevan 1091f6829af0SVijay Mahadevan /* set the GID map */ 1092f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1093f6829af0SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 1094f6829af0SVijay Mahadevan } 1095f6829af0SVijay Mahadevan lmin-=gmin; 1096f6829af0SVijay Mahadevan lmax-=gmin; 1097f6829af0SVijay Mahadevan 1098f6829af0SVijay Mahadevan PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 1099f6829af0SVijay Mahadevan } 110082dfd14aSVijay 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); 1101f6829af0SVijay Mahadevan 1102f6829af0SVijay Mahadevan { 11033f1c6e43SVijay Mahadevan dmmoab->seqstart=((PetscInt)dmmoab->vlocal->front()); 11043f1c6e43SVijay Mahadevan dmmoab->seqend=((PetscInt)dmmoab->vlocal->back()); 110549d66b22SVijay Mahadevan PetscInfo2(NULL, "SEQUENCE: Local minima - %D, Local maxima - %D.\n", dmmoab->seqstart, dmmoab->seqend); 11063f1c6e43SVijay Mahadevan 110749d66b22SVijay Mahadevan ierr = PetscMalloc2(dmmoab->seqend-dmmoab->seqstart+1,&dmmoab->gidmap,dmmoab->seqend-dmmoab->seqstart+1,&dmmoab->lidmap);CHKERRQ(ierr); 11083f1c6e43SVijay Mahadevan ierr = PetscMalloc1(totsize*dmmoab->numFields,&lgmap);CHKERRQ(ierr); 1109f6829af0SVijay Mahadevan 1110f6829af0SVijay Mahadevan i=j=0; 1111f6829af0SVijay Mahadevan /* set the owned vertex data first */ 1112f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 11133f1c6e43SVijay Mahadevan vent=(PetscInt)(*iter)-dmmoab->seqstart; 1114f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1115f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1116f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 11173f1c6e43SVijay Mahadevan lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]); 1118f6829af0SVijay Mahadevan } 1119f6829af0SVijay Mahadevan } 1120f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1121f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 11223f1c6e43SVijay Mahadevan vent=(PetscInt)(*iter)-dmmoab->seqstart; 1123f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1124f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1125f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 11263f1c6e43SVijay Mahadevan lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]); 1127f6829af0SVijay Mahadevan } 1128f6829af0SVijay Mahadevan } 1129f6829af0SVijay Mahadevan 1130f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1131f6829af0SVijay Mahadevan 1) First create a local and global vector 1132f6829af0SVijay Mahadevan 2) Create a local and global IS 1133f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1134f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1135f6829af0SVijay Mahadevan */ 1136f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 1137f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 1138f6829af0SVijay Mahadevan 1139f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 1140f6829af0SVijay Mahadevan 1141f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 1142f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr); 1143f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr); 1144f6829af0SVijay Mahadevan 11453f1c6e43SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 1146f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr); 1147f6829af0SVijay Mahadevan 1148f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1149f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 11503f1c6e43SVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,lgmap, 1151f6829af0SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 1152f6829af0SVijay Mahadevan } 1153f6829af0SVijay Mahadevan 1154f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 1155f6829af0SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 1156f6829af0SVijay Mahadevan 1157f6829af0SVijay Mahadevan /* clean up IS, Vec */ 11583f1c6e43SVijay Mahadevan ierr = PetscFree(lgmap);CHKERRQ(ierr); 1159f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 1160f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 1161f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 1162f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 1163f6829af0SVijay Mahadevan } 1164f6829af0SVijay Mahadevan 116549d66b22SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 116649d66b22SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 116749d66b22SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1168f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 1169f6829af0SVijay Mahadevan { 1170f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1171f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1172f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1173f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1174f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1175f6829af0SVijay Mahadevan 1176f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 1177f6829af0SVijay 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 1178f6829af0SVijay Mahadevan 1179f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1180f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1181f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 1182f6829af0SVijay Mahadevan 1183f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1184f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 1185*755f3dfbSVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 1186f6829af0SVijay Mahadevan } 118749d66b22SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size()); 1188f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1189f6829af0SVijay Mahadevan } 1190f6829af0SVijay Mahadevan 1191f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1192f6829af0SVijay Mahadevan { 1193f6829af0SVijay Mahadevan PetscErrorCode ierr; 1194f6829af0SVijay Mahadevan 1195f6829af0SVijay Mahadevan PetscFunctionBegin; 1196f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1197f90c3b0eSVijay Mahadevan ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr); 1198f6829af0SVijay Mahadevan 1199f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1200f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1201f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1202f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1203f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1204f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1205f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1206f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1207c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_map = NULL; 1208c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_sendrecv = NULL; 1209f6829af0SVijay Mahadevan 1210f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1211f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1212f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1213f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1214f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1215f6829af0SVijay Mahadevan 1216f6829af0SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1217f6829af0SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1218f6829af0SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1219f6829af0SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1220f6829af0SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 1221e882eb38SVijay Mahadevan dm->ops->coarsenhierarchy = DMCoarsenHierarchy_Moab; 1222e882eb38SVijay Mahadevan dm->ops->refinehierarchy = DMRefineHierarchy_Moab; 1223b117cd09SVijay Mahadevan dm->ops->createinterpolation = DMCreateInterpolation_Moab; 1224b117cd09SVijay Mahadevan //dm->ops->getinjection = DMCreateInjection_Moab; 1225b117cd09SVijay Mahadevan dm->ops->refine = DMRefine_Moab; 1226b117cd09SVijay Mahadevan dm->ops->coarsen = DMCoarsen_Moab; 12272e4e7c01SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1228f6829af0SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1229f6829af0SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1230f6829af0SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1231f6829af0SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1232f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1233f6829af0SVijay Mahadevan } 1234f6829af0SVijay Mahadevan 1235