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; 987d89fc02STim Tautges 99a4d2169cSTim Tautges if (!pcomm) { 100032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 101032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 102032b8ab6SVijay Mahadevan 103db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 104db66d124SVijay Mahadevan to the load_file functions to be populated. */ 1050c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr); 106032b8ab6SVijay Mahadevan 107db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 10872ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 10972ff976dSVijay Mahadevan } 11072ff976dSVijay Mahadevan else { 11185d305f5SVijay Mahadevan ierr = DMMoabSetParallelComm(dmmb, pcomm);CHKERRQ(ierr); 112032b8ab6SVijay Mahadevan } 113032b8ab6SVijay Mahadevan 1144973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 1154973de03SVijay Mahadevan dmmoab->bs = 1; 116addae81cSVijay Mahadevan dmmoab->numFields = 1; 1173f1c6e43SVijay Mahadevan ierr = PetscMalloc(dmmoab->numFields*sizeof(char*),&dmmoab->fieldNames);CHKERRQ(ierr); 1183f1c6e43SVijay Mahadevan ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr); 1192e4e7c01SVijay Mahadevan dmmoab->rw_dbglevel = 0; 1202e4e7c01SVijay Mahadevan dmmoab->partition_by_rank = PETSC_FALSE; 1212e4e7c01SVijay Mahadevan dmmoab->extra_read_options[0] = '\0'; 1222e4e7c01SVijay Mahadevan dmmoab->extra_write_options[0] = '\0'; 1232e4e7c01SVijay Mahadevan dmmoab->read_mode = READ_PART; 1242e4e7c01SVijay Mahadevan dmmoab->write_mode = WRITE_PART; 1254973de03SVijay Mahadevan 1264973de03SVijay Mahadevan /* set global ID tag handle */ 1271a845d2aSVijay Mahadevan if (ltog_tag && *ltog_tag) { 12885d305f5SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr); 129032b8ab6SVijay Mahadevan } 130032b8ab6SVijay Mahadevan else { 1311a845d2aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1321a845d2aSVijay Mahadevan if (ltog_tag) *ltog_tag = dmmoab->ltog_tag; 133a4d2169cSTim Tautges } 134a4d2169cSTim Tautges 135340f3b9aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr); 136340f3b9aSVijay Mahadevan 1374973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 138a4d2169cSTim Tautges if (range) { 13985d305f5SVijay Mahadevan ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr); 140a4d2169cSTim Tautges } 14185d305f5SVijay Mahadevan *dmb=dmmb; 1421d72bce8STim Tautges PetscFunctionReturn(0); 1431d72bce8STim Tautges } 1441d72bce8STim Tautges 145aa768e4cSTim Tautges /*@ 146aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 147aa768e4cSTim Tautges 148aa768e4cSTim Tautges Collective on MPI_Comm 149aa768e4cSTim Tautges 150aa768e4cSTim Tautges Input Parameter: 151aa768e4cSTim Tautges . dm - The DMMoab object being set 152aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 153aa768e4cSTim Tautges 154aa768e4cSTim Tautges Level: beginner 155aa768e4cSTim Tautges 156aa768e4cSTim Tautges .keywords: DMMoab, create 157aa768e4cSTim Tautges @*/ 1581d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 1591d72bce8STim Tautges { 160032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 161032b8ab6SVijay Mahadevan 1621d72bce8STim Tautges PetscFunctionBegin; 1631d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1641cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 165032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 166032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 167032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 1681d72bce8STim Tautges PetscFunctionReturn(0); 1691d72bce8STim Tautges } 1701d72bce8STim Tautges 1711d72bce8STim Tautges 172aa768e4cSTim Tautges /*@ 173aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 174aa768e4cSTim Tautges 175aa768e4cSTim Tautges Collective on MPI_Comm 176aa768e4cSTim Tautges 177aa768e4cSTim Tautges Input Parameter: 178aa768e4cSTim Tautges . dm - The DMMoab object being set 179aa768e4cSTim Tautges 180aa768e4cSTim Tautges Output Parameter: 181aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 182aa768e4cSTim Tautges 183aa768e4cSTim Tautges Level: beginner 184aa768e4cSTim Tautges 185aa768e4cSTim Tautges .keywords: DMMoab, create 186aa768e4cSTim Tautges @*/ 1871d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 1881d72bce8STim Tautges { 1891d72bce8STim Tautges PetscFunctionBegin; 1901d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 191032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 1921d72bce8STim Tautges PetscFunctionReturn(0); 1931d72bce8STim Tautges } 1941d72bce8STim Tautges 1951d72bce8STim Tautges 196aa768e4cSTim Tautges /*@ 197aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 198aa768e4cSTim Tautges 199aa768e4cSTim Tautges Collective on MPI_Comm 200aa768e4cSTim Tautges 201aa768e4cSTim Tautges Input Parameter: 202aa768e4cSTim Tautges . dm - The DMMoab object being set 203aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 204aa768e4cSTim Tautges 205aa768e4cSTim Tautges Level: beginner 206aa768e4cSTim Tautges 207aa768e4cSTim Tautges .keywords: DMMoab, create 208aa768e4cSTim Tautges @*/ 209a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 2101d72bce8STim Tautges { 211032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 212032b8ab6SVijay Mahadevan 2131d72bce8STim Tautges PetscFunctionBegin; 2141d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2151cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 216032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 217032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 218032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2191d72bce8STim Tautges PetscFunctionReturn(0); 2201d72bce8STim Tautges } 2211d72bce8STim Tautges 2221d72bce8STim Tautges 223aa768e4cSTim Tautges /*@ 224aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 225aa768e4cSTim Tautges 226aa768e4cSTim Tautges Collective on MPI_Comm 227aa768e4cSTim Tautges 228aa768e4cSTim Tautges Input Parameter: 229aa768e4cSTim Tautges . dm - The DMMoab object being set 230aa768e4cSTim Tautges 231aa768e4cSTim Tautges Output Parameter: 232aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 233aa768e4cSTim Tautges 234aa768e4cSTim Tautges Level: beginner 235aa768e4cSTim Tautges 236aa768e4cSTim Tautges .keywords: DMMoab, create 237aa768e4cSTim Tautges @*/ 238a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 2391d72bce8STim Tautges { 2409426e041SSatish Balay PetscErrorCode ierr; 241cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 242cabb514dSBarry Smith 2431d72bce8STim Tautges PetscFunctionBegin; 2441d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 245cabb514dSBarry 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); 246a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 2471d72bce8STim Tautges PetscFunctionReturn(0); 2481d72bce8STim Tautges } 2491d72bce8STim Tautges 2501d72bce8STim Tautges 251aa768e4cSTim Tautges /*@ 2525eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 253aa768e4cSTim Tautges 254aa768e4cSTim Tautges Collective on MPI_Comm 255aa768e4cSTim Tautges 256aa768e4cSTim Tautges Input Parameter: 257aa768e4cSTim Tautges . dm - The DMMoab object being set 258aa768e4cSTim Tautges . range - The entities treated by this DMMoab 259aa768e4cSTim Tautges 260aa768e4cSTim Tautges Level: beginner 261aa768e4cSTim Tautges 262aa768e4cSTim Tautges .keywords: DMMoab, create 263aa768e4cSTim Tautges @*/ 2645eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 2651d72bce8STim Tautges { 266032b8ab6SVijay Mahadevan moab::ErrorCode merr; 267032b8ab6SVijay Mahadevan PetscErrorCode ierr; 268fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 269032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 270032b8ab6SVijay Mahadevan 2711d72bce8STim Tautges PetscFunctionBegin; 2721d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 273032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 274032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 275fd3326ddSVijay Mahadevan 276032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 277fd3326ddSVijay Mahadevan 278fd3326ddSVijay Mahadevan /* filter based on parallel status */ 279fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 280fd3326ddSVijay Mahadevan 281fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 282fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 283fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 284fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 285fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 286fd3326ddSVijay Mahadevan 287fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 288032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 289032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 290b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 2911d72bce8STim Tautges PetscFunctionReturn(0); 2921d72bce8STim Tautges } 2931d72bce8STim Tautges 2941d72bce8STim Tautges 2958d8d51c8SVijay Mahadevan /*@ 2968d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 2978d8d51c8SVijay Mahadevan 2988d8d51c8SVijay Mahadevan Collective on MPI_Comm 2998d8d51c8SVijay Mahadevan 3008d8d51c8SVijay Mahadevan Input Parameter: 3018d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 3028d8d51c8SVijay Mahadevan 3038d8d51c8SVijay Mahadevan Output Parameter: 3048d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 3058d8d51c8SVijay Mahadevan 3068d8d51c8SVijay Mahadevan Level: beginner 3078d8d51c8SVijay Mahadevan 3088d8d51c8SVijay Mahadevan .keywords: DMMoab, create 3098d8d51c8SVijay Mahadevan @*/ 3108d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 3118d8d51c8SVijay Mahadevan { 3128d8d51c8SVijay Mahadevan PetscFunctionBegin; 3138d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3148d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 3158d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3168d8d51c8SVijay Mahadevan } 3178d8d51c8SVijay Mahadevan 3188d8d51c8SVijay Mahadevan 3198d8d51c8SVijay Mahadevan 320aa768e4cSTim Tautges /*@ 3215eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 322aa768e4cSTim Tautges 323aa768e4cSTim Tautges Collective on MPI_Comm 324aa768e4cSTim Tautges 325aa768e4cSTim Tautges Input Parameter: 326aa768e4cSTim Tautges . dm - The DMMoab object being set 327aa768e4cSTim Tautges 328aa768e4cSTim Tautges Output Parameter: 3295eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 3305eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 331aa768e4cSTim Tautges 332aa768e4cSTim Tautges Level: beginner 333aa768e4cSTim Tautges 334aa768e4cSTim Tautges .keywords: DMMoab, create 335aa768e4cSTim Tautges @*/ 336351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost) 3371d72bce8STim Tautges { 3381d72bce8STim Tautges PetscFunctionBegin; 3391d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 340351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 341351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3421d72bce8STim Tautges PetscFunctionReturn(0); 3431d72bce8STim Tautges } 3441d72bce8STim Tautges 3455eb88e9dSVijay Mahadevan /*@ 3465eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3475eb88e9dSVijay Mahadevan 3485eb88e9dSVijay Mahadevan Collective on MPI_Comm 3495eb88e9dSVijay Mahadevan 3505eb88e9dSVijay Mahadevan Input Parameter: 3515eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 3525eb88e9dSVijay Mahadevan 3535eb88e9dSVijay Mahadevan Output Parameter: 3545eb88e9dSVijay Mahadevan . range - The entities owned locally 3555eb88e9dSVijay Mahadevan 3565eb88e9dSVijay Mahadevan Level: beginner 3575eb88e9dSVijay Mahadevan 3585eb88e9dSVijay Mahadevan .keywords: DMMoab, create 3595eb88e9dSVijay Mahadevan @*/ 360351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range) 3615eb88e9dSVijay Mahadevan { 3625eb88e9dSVijay Mahadevan PetscFunctionBegin; 3635eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 364351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 3651cec0304SVijay Mahadevan PetscFunctionReturn(0); 3661cec0304SVijay Mahadevan } 3671cec0304SVijay Mahadevan 3681cec0304SVijay Mahadevan 3691cec0304SVijay Mahadevan /*@ 3701cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 3711cec0304SVijay Mahadevan 3721cec0304SVijay Mahadevan Collective on MPI_Comm 3731cec0304SVijay Mahadevan 3741cec0304SVijay Mahadevan Input Parameter: 3751cec0304SVijay Mahadevan . dm - The DMMoab object being set 3761cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 3771cec0304SVijay Mahadevan 3781cec0304SVijay Mahadevan Level: beginner 3791cec0304SVijay Mahadevan 3801cec0304SVijay Mahadevan .keywords: DMMoab, create 3811cec0304SVijay Mahadevan @*/ 3821cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 3831cec0304SVijay Mahadevan { 3841cec0304SVijay Mahadevan moab::ErrorCode merr; 3851cec0304SVijay Mahadevan PetscErrorCode ierr; 3861cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 3871cec0304SVijay Mahadevan 3881cec0304SVijay Mahadevan PetscFunctionBegin; 3891cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3901cec0304SVijay Mahadevan dmmoab->elocal->clear(); 3911cec0304SVijay Mahadevan dmmoab->eghost->clear(); 3921cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 3931cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 3941cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 3951cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 39641dd5348SVijay Mahadevan dmmoab->neleghost=dmmoab->eghost->size(); 397b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 3988cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 3995eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 4005eb88e9dSVijay Mahadevan } 4015eb88e9dSVijay Mahadevan 4025eb88e9dSVijay Mahadevan 403aa768e4cSTim Tautges /*@ 404aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 405aa768e4cSTim Tautges 406aa768e4cSTim Tautges Collective on MPI_Comm 407aa768e4cSTim Tautges 408aa768e4cSTim Tautges Input Parameter: 409aa768e4cSTim Tautges . dm - The DMMoab object being set 410aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 411aa768e4cSTim Tautges 412aa768e4cSTim Tautges Level: beginner 413aa768e4cSTim Tautges 414aa768e4cSTim Tautges .keywords: DMMoab, create 415aa768e4cSTim Tautges @*/ 4161d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 4171d72bce8STim Tautges { 4181d72bce8STim Tautges PetscFunctionBegin; 4191d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4201d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4211d72bce8STim Tautges PetscFunctionReturn(0); 4221d72bce8STim Tautges } 4231d72bce8STim Tautges 4241d72bce8STim Tautges 425aa768e4cSTim Tautges /*@ 426aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 427aa768e4cSTim Tautges 428aa768e4cSTim Tautges Collective on MPI_Comm 429aa768e4cSTim Tautges 430aa768e4cSTim Tautges Input Parameter: 431aa768e4cSTim Tautges . dm - The DMMoab object being set 432aa768e4cSTim Tautges 433aa768e4cSTim Tautges Output Parameter: 434aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 435aa768e4cSTim Tautges 436aa768e4cSTim Tautges Level: beginner 437aa768e4cSTim Tautges 438aa768e4cSTim Tautges .keywords: DMMoab, create 439aa768e4cSTim Tautges @*/ 4401d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 4411d72bce8STim Tautges { 4421d72bce8STim Tautges PetscFunctionBegin; 4431d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4441d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4451d72bce8STim Tautges PetscFunctionReturn(0); 4461d72bce8STim Tautges } 4471d72bce8STim Tautges 4481d72bce8STim Tautges 449aa768e4cSTim Tautges /*@ 450aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 451aa768e4cSTim Tautges 452aa768e4cSTim Tautges Collective on MPI_Comm 453aa768e4cSTim Tautges 454aa768e4cSTim Tautges Input Parameter: 455aa768e4cSTim Tautges . dm - The DMMoab object being set 456aa768e4cSTim Tautges . bs - The block size used with this DMMoab 457aa768e4cSTim Tautges 458aa768e4cSTim Tautges Level: beginner 459aa768e4cSTim Tautges 460aa768e4cSTim Tautges .keywords: DMMoab, create 461aa768e4cSTim Tautges @*/ 4621d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 4631d72bce8STim Tautges { 4641d72bce8STim Tautges PetscFunctionBegin; 4651d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4661d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4671d72bce8STim Tautges PetscFunctionReturn(0); 4681d72bce8STim Tautges } 4691d72bce8STim Tautges 4701d72bce8STim Tautges 471aa768e4cSTim Tautges /*@ 472aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 473aa768e4cSTim Tautges 474aa768e4cSTim Tautges Collective on MPI_Comm 475aa768e4cSTim Tautges 476aa768e4cSTim Tautges Input Parameter: 477aa768e4cSTim Tautges . dm - The DMMoab object being set 478aa768e4cSTim Tautges 479aa768e4cSTim Tautges Output Parameter: 480aa768e4cSTim Tautges . bs - The block size used with this DMMoab 481aa768e4cSTim Tautges 482aa768e4cSTim Tautges Level: beginner 483aa768e4cSTim Tautges 484aa768e4cSTim Tautges .keywords: DMMoab, create 485aa768e4cSTim Tautges @*/ 4861d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 4871d72bce8STim Tautges { 4881d72bce8STim Tautges PetscFunctionBegin; 4891d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4901d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 4911d72bce8STim Tautges PetscFunctionReturn(0); 4921d72bce8STim Tautges } 4931d72bce8STim Tautges 4941cec0304SVijay Mahadevan 495212ad6d1SVijay Mahadevan /*@ 496212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 497212ad6d1SVijay Mahadevan 49800cc10feSVijay Mahadevan Collective on DM 499212ad6d1SVijay Mahadevan 500212ad6d1SVijay Mahadevan Input Parameter: 501212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 502212ad6d1SVijay Mahadevan 503212ad6d1SVijay Mahadevan Output Parameter: 50400cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance 50500cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance 506212ad6d1SVijay Mahadevan 507212ad6d1SVijay Mahadevan Level: beginner 508212ad6d1SVijay Mahadevan 509212ad6d1SVijay Mahadevan .keywords: DMMoab, create 510212ad6d1SVijay Mahadevan @*/ 51141dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg) 512212ad6d1SVijay Mahadevan { 513212ad6d1SVijay Mahadevan PetscFunctionBegin; 514212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 51541dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->nele; 51641dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->n; 517212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 518212ad6d1SVijay Mahadevan } 519212ad6d1SVijay Mahadevan 520212ad6d1SVijay Mahadevan 521212ad6d1SVijay Mahadevan /*@ 522212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 523212ad6d1SVijay Mahadevan 52400cc10feSVijay Mahadevan Collective on DM 525212ad6d1SVijay Mahadevan 526212ad6d1SVijay Mahadevan Input Parameter: 527212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 528212ad6d1SVijay Mahadevan 529212ad6d1SVijay Mahadevan Output Parameter: 530b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor 53100cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 53200cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 53300cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor 534212ad6d1SVijay Mahadevan 535212ad6d1SVijay Mahadevan Level: beginner 536212ad6d1SVijay Mahadevan 537212ad6d1SVijay Mahadevan .keywords: DMMoab, create 538212ad6d1SVijay Mahadevan @*/ 53941dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg) 540212ad6d1SVijay Mahadevan { 541212ad6d1SVijay Mahadevan PetscFunctionBegin; 542212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 54341dd5348SVijay Mahadevan if(nel) *nel = ((DM_Moab*)dm->data)->neleloc; 54441dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->neleghost; 54541dd5348SVijay Mahadevan if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 54641dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 547212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 548212ad6d1SVijay Mahadevan } 549212ad6d1SVijay Mahadevan 550212ad6d1SVijay Mahadevan 55100cc10feSVijay Mahadevan /*@ 55200cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 55300cc10feSVijay Mahadevan 55400cc10feSVijay Mahadevan Collective on MPI_Comm 55500cc10feSVijay Mahadevan 55600cc10feSVijay Mahadevan Input Parameter: 55700cc10feSVijay Mahadevan . dm - The DMMoab object being set 55800cc10feSVijay Mahadevan 55900cc10feSVijay Mahadevan Output Parameter: 56000cc10feSVijay Mahadevan . offset - The local offset for the global vector 56100cc10feSVijay Mahadevan 56200cc10feSVijay Mahadevan Level: beginner 56300cc10feSVijay Mahadevan 56400cc10feSVijay Mahadevan .keywords: DMMoab, create 56500cc10feSVijay Mahadevan @*/ 56600cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset) 56700cc10feSVijay Mahadevan { 56800cc10feSVijay Mahadevan PetscFunctionBegin; 56900cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 57000cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 57100cc10feSVijay Mahadevan PetscFunctionReturn(0); 57200cc10feSVijay Mahadevan } 57300cc10feSVijay Mahadevan 57400cc10feSVijay Mahadevan 5754920ab11SVijay Mahadevan /*@ 5764920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 5774920ab11SVijay Mahadevan 5784920ab11SVijay Mahadevan Collective on MPI_Comm 5794920ab11SVijay Mahadevan 5804920ab11SVijay Mahadevan Input Parameter: 581340f3b9aSVijay Mahadevan . dm - The DMMoab object 5824920ab11SVijay Mahadevan 5834920ab11SVijay Mahadevan Output Parameter: 5844920ab11SVijay Mahadevan . dim - The dimension of DM 5854920ab11SVijay Mahadevan 5864920ab11SVijay Mahadevan Level: beginner 5874920ab11SVijay Mahadevan 5884920ab11SVijay Mahadevan .keywords: DMMoab, create 5894920ab11SVijay Mahadevan @*/ 5904920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 5914920ab11SVijay Mahadevan { 5924920ab11SVijay Mahadevan PetscFunctionBegin; 5934920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5944920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 5954920ab11SVijay Mahadevan PetscFunctionReturn(0); 5964920ab11SVijay Mahadevan } 5974920ab11SVijay Mahadevan 5984920ab11SVijay Mahadevan 599340f3b9aSVijay Mahadevan /*@ 600340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 601340f3b9aSVijay Mahadevan 602340f3b9aSVijay Mahadevan Collective on MPI_Comm 603340f3b9aSVijay Mahadevan 604340f3b9aSVijay Mahadevan Input Parameter: 605340f3b9aSVijay Mahadevan . dm - The DMMoab object 606340f3b9aSVijay Mahadevan . ehandle - The element entity handle 607340f3b9aSVijay Mahadevan 608340f3b9aSVijay Mahadevan Output Parameter: 609340f3b9aSVijay Mahadevan . mat - The material ID for the current entity 610340f3b9aSVijay Mahadevan 611340f3b9aSVijay Mahadevan Level: beginner 612340f3b9aSVijay Mahadevan 613340f3b9aSVijay Mahadevan .keywords: DMMoab, create 614340f3b9aSVijay Mahadevan @*/ 615340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat) 616340f3b9aSVijay Mahadevan { 617340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 618340f3b9aSVijay Mahadevan moab::ErrorCode merr; 619340f3b9aSVijay Mahadevan 620340f3b9aSVijay Mahadevan PetscFunctionBegin; 621340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 622340f3b9aSVijay Mahadevan if (*mat) { 623340f3b9aSVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 62463cd93b2SVijay Mahadevan merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr); 625340f3b9aSVijay Mahadevan } 626340f3b9aSVijay Mahadevan PetscFunctionReturn(0); 627340f3b9aSVijay Mahadevan } 628340f3b9aSVijay Mahadevan 6294920ab11SVijay Mahadevan 63085d305f5SVijay Mahadevan /*@ 63185d305f5SVijay Mahadevan DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities 63285d305f5SVijay Mahadevan 63385d305f5SVijay Mahadevan Collective on MPI_Comm 63485d305f5SVijay Mahadevan 63585d305f5SVijay Mahadevan Input Parameter: 63685d305f5SVijay Mahadevan . dm - The DMMoab object 63785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 63885d305f5SVijay Mahadevan . conn - The vertex entity handles 63985d305f5SVijay Mahadevan 64085d305f5SVijay Mahadevan Output Parameter: 64185d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities 64285d305f5SVijay Mahadevan 64385d305f5SVijay Mahadevan Level: beginner 64485d305f5SVijay Mahadevan 64585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity() 64685d305f5SVijay Mahadevan @*/ 647cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscReal *vpos) 6487023aa44SVijay Mahadevan { 6497023aa44SVijay Mahadevan DM_Moab *dmmoab; 6507023aa44SVijay Mahadevan PetscErrorCode ierr; 6517023aa44SVijay Mahadevan moab::ErrorCode merr; 6527023aa44SVijay Mahadevan 6537023aa44SVijay Mahadevan PetscFunctionBegin; 6547023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6557023aa44SVijay Mahadevan PetscValidPointer(conn,3); 6567023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6577023aa44SVijay Mahadevan 6587023aa44SVijay Mahadevan if (!vpos) { 6597ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr); 6607023aa44SVijay Mahadevan } 6617023aa44SVijay Mahadevan 6627023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6637023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 6647023aa44SVijay Mahadevan PetscFunctionReturn(0); 6657023aa44SVijay Mahadevan } 6667023aa44SVijay Mahadevan 6677023aa44SVijay Mahadevan 66885d305f5SVijay Mahadevan /*@ 66985d305f5SVijay Mahadevan DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity 67085d305f5SVijay Mahadevan 67185d305f5SVijay Mahadevan Collective on MPI_Comm 67285d305f5SVijay Mahadevan 67385d305f5SVijay Mahadevan Input Parameter: 67485d305f5SVijay Mahadevan . dm - The DMMoab object 67585d305f5SVijay Mahadevan . vhandle - Vertex entity handle 67685d305f5SVijay Mahadevan 67785d305f5SVijay Mahadevan Output Parameter: 67885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 67985d305f5SVijay Mahadevan . conn - The vertex entity handles 68085d305f5SVijay Mahadevan 68185d305f5SVijay Mahadevan Level: beginner 68285d305f5SVijay Mahadevan 68385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity() 68485d305f5SVijay Mahadevan @*/ 68585d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt* nconn, moab::EntityHandle **conn) 6868d8d51c8SVijay Mahadevan { 6878d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 6888d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 6898d8d51c8SVijay Mahadevan PetscErrorCode ierr; 6908d8d51c8SVijay Mahadevan moab::ErrorCode merr; 6918d8d51c8SVijay Mahadevan 6928d8d51c8SVijay Mahadevan PetscFunctionBegin; 6938d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6948d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 6958d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6968d8d51c8SVijay Mahadevan 6978d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 69885d305f5SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 6998d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 7008d8d51c8SVijay Mahadevan 7018d8d51c8SVijay Mahadevan if (conn) { 7028d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 7038d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 7048d8d51c8SVijay Mahadevan } 7058d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 7068d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7078d8d51c8SVijay Mahadevan } 7088d8d51c8SVijay Mahadevan 7098d8d51c8SVijay Mahadevan 71085d305f5SVijay Mahadevan /*@ 71185d305f5SVijay Mahadevan DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity 71285d305f5SVijay Mahadevan 71385d305f5SVijay Mahadevan Collective on MPI_Comm 71485d305f5SVijay Mahadevan 71585d305f5SVijay Mahadevan Input Parameter: 71685d305f5SVijay Mahadevan . dm - The DMMoab object 71785d305f5SVijay Mahadevan . vhandle - Vertex entity handle 71885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 71985d305f5SVijay Mahadevan . conn - The vertex entity handles 72085d305f5SVijay Mahadevan 72185d305f5SVijay Mahadevan Level: beginner 72285d305f5SVijay Mahadevan 72385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity() 72485d305f5SVijay Mahadevan @*/ 7258d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 7268d8d51c8SVijay Mahadevan { 7278d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7288d8d51c8SVijay Mahadevan 7298d8d51c8SVijay Mahadevan PetscFunctionBegin; 7308d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7318d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 7328d8d51c8SVijay Mahadevan 7338d8d51c8SVijay Mahadevan if (conn) { 7348d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 7358d8d51c8SVijay Mahadevan } 7368d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 7378d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7388d8d51c8SVijay Mahadevan } 7398d8d51c8SVijay Mahadevan 7408d8d51c8SVijay Mahadevan 74185d305f5SVijay Mahadevan /*@ 74285d305f5SVijay Mahadevan DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity 74385d305f5SVijay Mahadevan 74485d305f5SVijay Mahadevan Collective on MPI_Comm 74585d305f5SVijay Mahadevan 74685d305f5SVijay Mahadevan Input Parameter: 74785d305f5SVijay Mahadevan . dm - The DMMoab object 74885d305f5SVijay Mahadevan . ehandle - Vertex entity handle 74985d305f5SVijay Mahadevan 75085d305f5SVijay Mahadevan Output Parameter: 75185d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 75285d305f5SVijay Mahadevan . conn - The vertex entity handles 75385d305f5SVijay Mahadevan 75485d305f5SVijay Mahadevan Level: beginner 75585d305f5SVijay Mahadevan 75685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity() 75785d305f5SVijay Mahadevan @*/ 7587023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 7597023aa44SVijay Mahadevan { 7607023aa44SVijay Mahadevan DM_Moab *dmmoab; 7617023aa44SVijay Mahadevan const moab::EntityHandle *connect; 7627023aa44SVijay Mahadevan moab::ErrorCode merr; 7637023aa44SVijay Mahadevan PetscInt nnodes; 7647023aa44SVijay Mahadevan 7657023aa44SVijay Mahadevan PetscFunctionBegin; 7667023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7677023aa44SVijay Mahadevan PetscValidPointer(conn,4); 7687023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7697023aa44SVijay Mahadevan 7707023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7717023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 7727023aa44SVijay Mahadevan if (conn) *conn=connect; 7737023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 7747023aa44SVijay Mahadevan PetscFunctionReturn(0); 7757023aa44SVijay Mahadevan } 7767023aa44SVijay Mahadevan 7777023aa44SVijay Mahadevan 77885d305f5SVijay Mahadevan /*@ 77985d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 78085d305f5SVijay Mahadevan 78185d305f5SVijay Mahadevan Collective on MPI_Comm 78285d305f5SVijay Mahadevan 78385d305f5SVijay Mahadevan Input Parameter: 78485d305f5SVijay Mahadevan . dm - The DMMoab object 78585d305f5SVijay Mahadevan . ent - Entity handle 78685d305f5SVijay Mahadevan 78785d305f5SVijay Mahadevan Output Parameter: 78885d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 78985d305f5SVijay Mahadevan 79085d305f5SVijay Mahadevan Level: beginner 79185d305f5SVijay Mahadevan 79285d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices() 79385d305f5SVijay Mahadevan @*/ 79469263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 79569263071SVijay Mahadevan { 79669263071SVijay Mahadevan moab::EntityType etype; 79769263071SVijay Mahadevan DM_Moab *dmmoab; 79869263071SVijay Mahadevan PetscInt edim; 79969263071SVijay Mahadevan 80069263071SVijay Mahadevan PetscFunctionBegin; 80169263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 80269263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 80369263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 80469263071SVijay Mahadevan 80569263071SVijay Mahadevan /* get the entity type and handle accordingly */ 80669263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 80769263071SVijay 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); 80869263071SVijay Mahadevan 80969263071SVijay Mahadevan /* get the entity dimension */ 81069263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 81169263071SVijay Mahadevan 81269263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 81369263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 814b117cd09SVijay Mahadevan if (dmmoab->hlevel) { 815b117cd09SVijay Mahadevan *ent_on_boundary=(dmmoab->hierarchy->is_boundary_vertex(ent) ? PETSC_TRUE:PETSC_FALSE); 816b117cd09SVijay Mahadevan } 817b117cd09SVijay Mahadevan else *ent_on_boundary=((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE:PETSC_FALSE); 81869263071SVijay Mahadevan } 81969263071SVijay Mahadevan else { 82069263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 8216d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 82269263071SVijay Mahadevan } 82369263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 8246d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 82569263071SVijay Mahadevan } 82669263071SVijay Mahadevan } 82769263071SVijay Mahadevan PetscFunctionReturn(0); 82869263071SVijay Mahadevan } 82969263071SVijay Mahadevan 83069263071SVijay Mahadevan 83185d305f5SVijay Mahadevan /*@ 83285d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 83385d305f5SVijay Mahadevan 83485d305f5SVijay Mahadevan Input Parameter: 83585d305f5SVijay Mahadevan . dm - The DMMoab object 83685d305f5SVijay Mahadevan . nconn - Number of handles 83785d305f5SVijay Mahadevan . cnt - Array of entity handles 83885d305f5SVijay Mahadevan 83985d305f5SVijay Mahadevan Output Parameter: 84085d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 84185d305f5SVijay Mahadevan 84285d305f5SVijay Mahadevan Level: beginner 84385d305f5SVijay Mahadevan 84485d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary() 84585d305f5SVijay Mahadevan @*/ 84669263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 8477023aa44SVijay Mahadevan { 8487023aa44SVijay Mahadevan DM_Moab *dmmoab; 8497023aa44SVijay Mahadevan PetscInt i; 8507023aa44SVijay Mahadevan 8517023aa44SVijay Mahadevan PetscFunctionBegin; 8527023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8537023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 8547023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 8557023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8567023aa44SVijay Mahadevan 8577023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 858b117cd09SVijay Mahadevan if (dmmoab->hlevel) { 859b117cd09SVijay Mahadevan isbdvtx[i]=(dmmoab->hierarchy->is_boundary_vertex(cnt[i]) ? PETSC_TRUE:PETSC_FALSE); 860b117cd09SVijay Mahadevan } 861b117cd09SVijay Mahadevan else { 8626d9eb265SVijay Mahadevan isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE); 8637023aa44SVijay Mahadevan } 864b117cd09SVijay Mahadevan } 8657023aa44SVijay Mahadevan PetscFunctionReturn(0); 8667023aa44SVijay Mahadevan } 8677023aa44SVijay Mahadevan 8687023aa44SVijay Mahadevan 86985d305f5SVijay Mahadevan /*@ 87085d305f5SVijay Mahadevan DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary 87185d305f5SVijay Mahadevan 87285d305f5SVijay Mahadevan Input Parameter: 87385d305f5SVijay Mahadevan . dm - The DMMoab object 87485d305f5SVijay Mahadevan 87585d305f5SVijay Mahadevan Output Parameter: 87685d305f5SVijay Mahadevan . bdvtx - Boundary vertices 87785d305f5SVijay Mahadevan . bdelems - Boundary elements 87885d305f5SVijay Mahadevan . bdfaces - Boundary faces 87985d305f5SVijay Mahadevan 88085d305f5SVijay Mahadevan Level: beginner 88185d305f5SVijay Mahadevan 88285d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary() 88385d305f5SVijay Mahadevan @*/ 8846d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces) 8851cec0304SVijay Mahadevan { 8861cec0304SVijay Mahadevan DM_Moab *dmmoab; 8871cec0304SVijay Mahadevan 8881cec0304SVijay Mahadevan PetscFunctionBegin; 8891cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8901cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8911cec0304SVijay Mahadevan 8926d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 8936d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 8946d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 8951cec0304SVijay Mahadevan PetscFunctionReturn(0); 8961cec0304SVijay Mahadevan } 8971cec0304SVijay Mahadevan 898f6829af0SVijay Mahadevan 899f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 900f6829af0SVijay Mahadevan { 901f6829af0SVijay Mahadevan PetscErrorCode ierr; 90285d305f5SVijay Mahadevan PetscInt i; 903e882eb38SVijay Mahadevan moab::ErrorCode merr; 904f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 905f6829af0SVijay Mahadevan 906f6829af0SVijay Mahadevan PetscFunctionBegin; 907f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 908f6829af0SVijay Mahadevan if (dmmoab->icreatedinstance) { 909f6829af0SVijay Mahadevan delete dmmoab->mbiface; 910f6829af0SVijay Mahadevan } 911f6829af0SVijay Mahadevan dmmoab->mbiface = NULL; 912f6829af0SVijay Mahadevan dmmoab->pcomm = NULL; 913f6829af0SVijay Mahadevan delete dmmoab->vlocal; 914f6829af0SVijay Mahadevan delete dmmoab->vowned; 915f6829af0SVijay Mahadevan delete dmmoab->vghost; 916f6829af0SVijay Mahadevan delete dmmoab->elocal; 917f6829af0SVijay Mahadevan delete dmmoab->eghost; 918f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 919f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 920f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 921f6829af0SVijay Mahadevan 922f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 9237ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr); 9245905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr); 9255905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr); 92685d305f5SVijay Mahadevan if (dmmoab->fieldNames) { 92785d305f5SVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 92885d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 92985d305f5SVijay Mahadevan } 93085d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 93185d305f5SVijay Mahadevan } 932b117cd09SVijay Mahadevan 933b117cd09SVijay Mahadevan if (dmmoab->nhlevels) { 934b117cd09SVijay Mahadevan ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr); 935e882eb38SVijay Mahadevan dmmoab->nhlevels=0; 936e882eb38SVijay Mahadevan if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy; 937e882eb38SVijay Mahadevan dmmoab->hierarchy=NULL; 938b117cd09SVijay Mahadevan } 939e882eb38SVijay Mahadevan 940e882eb38SVijay Mahadevan if (dmmoab->icreatedinstance) { 941e882eb38SVijay Mahadevan merr = dmmoab->mbiface->delete_mesh();MBERRNM(merr); 942e882eb38SVijay Mahadevan delete dmmoab->mbiface; 943e882eb38SVijay Mahadevan } 944e882eb38SVijay Mahadevan dmmoab->mbiface = NULL; 945e882eb38SVijay Mahadevan dmmoab->pcomm = NULL; 946e882eb38SVijay Mahadevan 947f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 948f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 949f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 950f6829af0SVijay Mahadevan PetscFunctionReturn(0); 951f6829af0SVijay Mahadevan } 952f6829af0SVijay Mahadevan 953f6829af0SVijay Mahadevan 9544416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject,DM dm) 9552e4e7c01SVijay Mahadevan { 9562e4e7c01SVijay Mahadevan PetscErrorCode ierr; 9572e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 9582e4e7c01SVijay Mahadevan 9592e4e7c01SVijay Mahadevan PetscFunctionBegin; 9602e4e7c01SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 961cc310fddSBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr); 9622e4e7c01SVijay 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); 9632e4e7c01SVijay 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); 9642e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 9652e4e7c01SVijay 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); 9662e4e7c01SVijay 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); 9672e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr); 9682e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr); 9692e4e7c01SVijay Mahadevan PetscFunctionReturn(0); 9702e4e7c01SVijay Mahadevan } 9712e4e7c01SVijay Mahadevan 9722e4e7c01SVijay Mahadevan 973f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 974f6829af0SVijay Mahadevan { 975f6829af0SVijay Mahadevan PetscErrorCode ierr; 976f6829af0SVijay Mahadevan moab::ErrorCode merr; 977f6829af0SVijay Mahadevan Vec local, global; 978f6829af0SVijay Mahadevan IS from,to; 979f6829af0SVijay Mahadevan moab::Range::iterator iter; 980*ce27a4eeSVijay Mahadevan PetscInt i,j,f,bs,gmin,lmin,lmax,vent,totsize,*lgmap; 981f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 982f6829af0SVijay Mahadevan moab::Range adjs; 983f6829af0SVijay Mahadevan 984f6829af0SVijay Mahadevan PetscFunctionBegin; 985f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 986f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 987c528d872SBarry 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."); 988f6829af0SVijay Mahadevan 989f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 990f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 991f6829af0SVijay Mahadevan { 992f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 993f6829af0SVijay Mahadevan 994f6829af0SVijay Mahadevan /* filter based on parallel status */ 995f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 996f6829af0SVijay Mahadevan 997f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 998f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 999f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 1000f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 1001f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 1002f6829af0SVijay Mahadevan 1003f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 1004f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 1005f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 1006b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1007f6829af0SVijay Mahadevan } 1008f6829af0SVijay Mahadevan 1009f6829af0SVijay Mahadevan { 1010f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 1011f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 1012f6829af0SVijay Mahadevan 1013f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 1014f6829af0SVijay Mahadevan for (i=3;i>0;i--) { 1015f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 1016f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 1017f6829af0SVijay Mahadevan 1018f6829af0SVijay Mahadevan /* store the current mesh dimension */ 1019f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 1020f6829af0SVijay Mahadevan dmmoab->dim=i; 1021f6829af0SVijay Mahadevan break; 1022f6829af0SVijay Mahadevan } 1023f6829af0SVijay Mahadevan } 1024f6829af0SVijay Mahadevan 1025b117cd09SVijay Mahadevan ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr); 1026b117cd09SVijay Mahadevan 1027f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 1028f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 1029f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1030f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 1031f6829af0SVijay Mahadevan 1032f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 1033f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 1034b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1035f6829af0SVijay Mahadevan } 1036f6829af0SVijay Mahadevan 1037f6829af0SVijay Mahadevan bs = dmmoab->bs; 1038f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 1039f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 1040f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 1041f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 1042f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1043f6829af0SVijay Mahadevan } 1044f6829af0SVijay Mahadevan 1045f6829af0SVijay Mahadevan totsize=dmmoab->vlocal->size(); 1046f6829af0SVijay Mahadevan if (totsize != dmmoab->nloc+dmmoab->nghost) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.",totsize,dmmoab->nloc+dmmoab->nghost); 10477ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr); 1048f6829af0SVijay Mahadevan { 1049f6829af0SVijay Mahadevan /* first get the local indices */ 1050f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 10513f1c6e43SVijay Mahadevan if (dmmoab->nghost) { /* next get the ghosted indices */ 1052f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1053f6829af0SVijay Mahadevan } 1054f6829af0SVijay Mahadevan 1055f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1056f6829af0SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 1057f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1058f6829af0SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 1059f6829af0SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 1060f6829af0SVijay Mahadevan } 1061f6829af0SVijay Mahadevan 1062b2566f29SBarry Smith ierr = MPIU_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1063f6829af0SVijay Mahadevan 1064f6829af0SVijay Mahadevan /* set the GID map */ 1065f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1066f6829af0SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 1067f6829af0SVijay Mahadevan } 1068f6829af0SVijay Mahadevan lmin-=gmin; 1069f6829af0SVijay Mahadevan lmax-=gmin; 1070f6829af0SVijay Mahadevan 1071f6829af0SVijay Mahadevan PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 1072f6829af0SVijay Mahadevan } 107382dfd14aSVijay 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); 1074f6829af0SVijay Mahadevan 1075f6829af0SVijay Mahadevan { 10763f1c6e43SVijay Mahadevan dmmoab->seqstart=((PetscInt)dmmoab->vlocal->front()); 10773f1c6e43SVijay Mahadevan dmmoab->seqend=((PetscInt)dmmoab->vlocal->back()); 10783f1c6e43SVijay Mahadevan 10793f1c6e43SVijay Mahadevan ierr = PetscMalloc2(dmmoab->seqend,&dmmoab->gidmap,dmmoab->seqend,&dmmoab->lidmap);CHKERRQ(ierr); 10803f1c6e43SVijay Mahadevan ierr = PetscMalloc1(totsize*dmmoab->numFields,&lgmap);CHKERRQ(ierr); 1081f6829af0SVijay Mahadevan 1082f6829af0SVijay Mahadevan i=j=0; 1083f6829af0SVijay Mahadevan /* set the owned vertex data first */ 1084f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 10853f1c6e43SVijay Mahadevan vent=(PetscInt)(*iter)-dmmoab->seqstart; 1086f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1087f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1088f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 10893f1c6e43SVijay Mahadevan lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]); 1090f6829af0SVijay Mahadevan } 1091f6829af0SVijay Mahadevan } 1092f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1093f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 10943f1c6e43SVijay Mahadevan vent=(PetscInt)(*iter)-dmmoab->seqstart; 1095f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1096f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1097f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 10983f1c6e43SVijay Mahadevan lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]); 1099f6829af0SVijay Mahadevan } 1100f6829af0SVijay Mahadevan } 1101f6829af0SVijay Mahadevan 1102f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1103f6829af0SVijay Mahadevan 1) First create a local and global vector 1104f6829af0SVijay Mahadevan 2) Create a local and global IS 1105f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1106f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1107f6829af0SVijay Mahadevan */ 1108f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 1109f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 1110f6829af0SVijay Mahadevan 1111f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 1112f6829af0SVijay Mahadevan PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost); 1113f6829af0SVijay Mahadevan 1114f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 1115f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr); 1116f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr); 1117f6829af0SVijay Mahadevan 11183f1c6e43SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 1119f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr); 1120f6829af0SVijay Mahadevan 1121f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1122f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 11233f1c6e43SVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,lgmap, 1124f6829af0SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 1125f6829af0SVijay Mahadevan } 1126f6829af0SVijay Mahadevan 1127f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 1128f6829af0SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 1129f6829af0SVijay Mahadevan 1130f6829af0SVijay Mahadevan /* clean up IS, Vec */ 11313f1c6e43SVijay Mahadevan ierr = PetscFree(lgmap);CHKERRQ(ierr); 1132f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 1133f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 1134f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 1135f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 1136f6829af0SVijay Mahadevan } 1137f6829af0SVijay Mahadevan 1138f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 1139f6829af0SVijay Mahadevan { 1140f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1141f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1142f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1143f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1144f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1145f6829af0SVijay Mahadevan 1146f6829af0SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 1147f6829af0SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 1148f6829af0SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1149f6829af0SVijay Mahadevan 1150f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 1151f6829af0SVijay 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 1152f6829af0SVijay Mahadevan 1153f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1154f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1155f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 1156f6829af0SVijay Mahadevan 1157f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1158f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 1159f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 1160f6829af0SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 1161f6829af0SVijay Mahadevan } 1162f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1163f6829af0SVijay Mahadevan } 1164f6829af0SVijay Mahadevan 1165f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1166f6829af0SVijay Mahadevan { 1167f6829af0SVijay Mahadevan PetscErrorCode ierr; 1168f6829af0SVijay Mahadevan 1169f6829af0SVijay Mahadevan PetscFunctionBegin; 1170f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1171f90c3b0eSVijay Mahadevan ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr); 1172f6829af0SVijay Mahadevan 1173f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1174f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1175f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1176f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1177f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1178f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1179f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1180f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1181c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_map = NULL; 1182c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_sendrecv = NULL; 1183f6829af0SVijay Mahadevan 1184f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1185f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1186f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1187f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1188f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1189f6829af0SVijay Mahadevan 1190f6829af0SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1191f6829af0SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1192f6829af0SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1193f6829af0SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1194f6829af0SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 1195e882eb38SVijay Mahadevan dm->ops->coarsenhierarchy = DMCoarsenHierarchy_Moab; 1196e882eb38SVijay Mahadevan dm->ops->refinehierarchy = DMRefineHierarchy_Moab; 1197b117cd09SVijay Mahadevan dm->ops->createinterpolation = DMCreateInterpolation_Moab; 1198b117cd09SVijay Mahadevan //dm->ops->getinjection = DMCreateInjection_Moab; 1199b117cd09SVijay Mahadevan dm->ops->refine = DMRefine_Moab; 1200b117cd09SVijay Mahadevan dm->ops->coarsen = DMCoarsen_Moab; 12012e4e7c01SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1202f6829af0SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1203f6829af0SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1204f6829af0SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1205f6829af0SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1206f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1207f6829af0SVijay Mahadevan } 1208f6829af0SVijay Mahadevan 1209