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 /*@ 52*b117cd09SVijay 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; 97*b117cd09SVijay 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; 1172e4e7c01SVijay Mahadevan dmmoab->rw_dbglevel = 0; 1182e4e7c01SVijay Mahadevan dmmoab->partition_by_rank = PETSC_FALSE; 1192e4e7c01SVijay Mahadevan dmmoab->extra_read_options[0] = '\0'; 1202e4e7c01SVijay Mahadevan dmmoab->extra_write_options[0] = '\0'; 1212e4e7c01SVijay Mahadevan dmmoab->read_mode = READ_PART; 1222e4e7c01SVijay Mahadevan dmmoab->write_mode = WRITE_PART; 1234973de03SVijay Mahadevan 1244973de03SVijay Mahadevan /* set global ID tag handle */ 1251a845d2aSVijay Mahadevan if (ltog_tag && *ltog_tag) { 12685d305f5SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr); 127032b8ab6SVijay Mahadevan } 128032b8ab6SVijay Mahadevan else { 1291a845d2aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1301a845d2aSVijay Mahadevan if (ltog_tag) *ltog_tag = dmmoab->ltog_tag; 131a4d2169cSTim Tautges } 132a4d2169cSTim Tautges 133340f3b9aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr); 134340f3b9aSVijay Mahadevan 1354973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 136a4d2169cSTim Tautges if (range) { 13785d305f5SVijay Mahadevan ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr); 138a4d2169cSTim Tautges } 13985d305f5SVijay Mahadevan *dmb=dmmb; 1401d72bce8STim Tautges PetscFunctionReturn(0); 1411d72bce8STim Tautges } 1421d72bce8STim Tautges 143aa768e4cSTim Tautges /*@ 144aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 145aa768e4cSTim Tautges 146aa768e4cSTim Tautges Collective on MPI_Comm 147aa768e4cSTim Tautges 148aa768e4cSTim Tautges Input Parameter: 149aa768e4cSTim Tautges . dm - The DMMoab object being set 150aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 151aa768e4cSTim Tautges 152aa768e4cSTim Tautges Level: beginner 153aa768e4cSTim Tautges 154aa768e4cSTim Tautges .keywords: DMMoab, create 155aa768e4cSTim Tautges @*/ 1561d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 1571d72bce8STim Tautges { 158032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 159032b8ab6SVijay Mahadevan 1601d72bce8STim Tautges PetscFunctionBegin; 1611d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1621cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 163032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 164032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 165032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 1661d72bce8STim Tautges PetscFunctionReturn(0); 1671d72bce8STim Tautges } 1681d72bce8STim Tautges 1691d72bce8STim Tautges 170aa768e4cSTim Tautges /*@ 171aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 172aa768e4cSTim Tautges 173aa768e4cSTim Tautges Collective on MPI_Comm 174aa768e4cSTim Tautges 175aa768e4cSTim Tautges Input Parameter: 176aa768e4cSTim Tautges . dm - The DMMoab object being set 177aa768e4cSTim Tautges 178aa768e4cSTim Tautges Output Parameter: 179aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 180aa768e4cSTim Tautges 181aa768e4cSTim Tautges Level: beginner 182aa768e4cSTim Tautges 183aa768e4cSTim Tautges .keywords: DMMoab, create 184aa768e4cSTim Tautges @*/ 1851d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 1861d72bce8STim Tautges { 1871d72bce8STim Tautges PetscFunctionBegin; 1881d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 189032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 1901d72bce8STim Tautges PetscFunctionReturn(0); 1911d72bce8STim Tautges } 1921d72bce8STim Tautges 1931d72bce8STim Tautges 194aa768e4cSTim Tautges /*@ 195aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 196aa768e4cSTim Tautges 197aa768e4cSTim Tautges Collective on MPI_Comm 198aa768e4cSTim Tautges 199aa768e4cSTim Tautges Input Parameter: 200aa768e4cSTim Tautges . dm - The DMMoab object being set 201aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 202aa768e4cSTim Tautges 203aa768e4cSTim Tautges Level: beginner 204aa768e4cSTim Tautges 205aa768e4cSTim Tautges .keywords: DMMoab, create 206aa768e4cSTim Tautges @*/ 207a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 2081d72bce8STim Tautges { 209032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 210032b8ab6SVijay Mahadevan 2111d72bce8STim Tautges PetscFunctionBegin; 2121d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2131cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 214032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 215032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 216032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2171d72bce8STim Tautges PetscFunctionReturn(0); 2181d72bce8STim Tautges } 2191d72bce8STim Tautges 2201d72bce8STim Tautges 221aa768e4cSTim Tautges /*@ 222aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 223aa768e4cSTim Tautges 224aa768e4cSTim Tautges Collective on MPI_Comm 225aa768e4cSTim Tautges 226aa768e4cSTim Tautges Input Parameter: 227aa768e4cSTim Tautges . dm - The DMMoab object being set 228aa768e4cSTim Tautges 229aa768e4cSTim Tautges Output Parameter: 230aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 231aa768e4cSTim Tautges 232aa768e4cSTim Tautges Level: beginner 233aa768e4cSTim Tautges 234aa768e4cSTim Tautges .keywords: DMMoab, create 235aa768e4cSTim Tautges @*/ 236a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 2371d72bce8STim Tautges { 2389426e041SSatish Balay PetscErrorCode ierr; 239cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 240cabb514dSBarry Smith 2411d72bce8STim Tautges PetscFunctionBegin; 2421d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 243cabb514dSBarry 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); 244a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 2451d72bce8STim Tautges PetscFunctionReturn(0); 2461d72bce8STim Tautges } 2471d72bce8STim Tautges 2481d72bce8STim Tautges 249aa768e4cSTim Tautges /*@ 2505eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 251aa768e4cSTim Tautges 252aa768e4cSTim Tautges Collective on MPI_Comm 253aa768e4cSTim Tautges 254aa768e4cSTim Tautges Input Parameter: 255aa768e4cSTim Tautges . dm - The DMMoab object being set 256aa768e4cSTim Tautges . range - The entities treated by this DMMoab 257aa768e4cSTim Tautges 258aa768e4cSTim Tautges Level: beginner 259aa768e4cSTim Tautges 260aa768e4cSTim Tautges .keywords: DMMoab, create 261aa768e4cSTim Tautges @*/ 2625eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 2631d72bce8STim Tautges { 264032b8ab6SVijay Mahadevan moab::ErrorCode merr; 265032b8ab6SVijay Mahadevan PetscErrorCode ierr; 266fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 267032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 268032b8ab6SVijay Mahadevan 2691d72bce8STim Tautges PetscFunctionBegin; 2701d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 271032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 272032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 273fd3326ddSVijay Mahadevan 274032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 275fd3326ddSVijay Mahadevan 276fd3326ddSVijay Mahadevan /* filter based on parallel status */ 277fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 278fd3326ddSVijay Mahadevan 279fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 280fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 281fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 282fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 283fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 284fd3326ddSVijay Mahadevan 285fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 286032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 287032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 288b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 2891d72bce8STim Tautges PetscFunctionReturn(0); 2901d72bce8STim Tautges } 2911d72bce8STim Tautges 2921d72bce8STim Tautges 2938d8d51c8SVijay Mahadevan /*@ 2948d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 2958d8d51c8SVijay Mahadevan 2968d8d51c8SVijay Mahadevan Collective on MPI_Comm 2978d8d51c8SVijay Mahadevan 2988d8d51c8SVijay Mahadevan Input Parameter: 2998d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 3008d8d51c8SVijay Mahadevan 3018d8d51c8SVijay Mahadevan Output Parameter: 3028d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 3038d8d51c8SVijay Mahadevan 3048d8d51c8SVijay Mahadevan Level: beginner 3058d8d51c8SVijay Mahadevan 3068d8d51c8SVijay Mahadevan .keywords: DMMoab, create 3078d8d51c8SVijay Mahadevan @*/ 3088d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 3098d8d51c8SVijay Mahadevan { 3108d8d51c8SVijay Mahadevan PetscFunctionBegin; 3118d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3128d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 3138d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3148d8d51c8SVijay Mahadevan } 3158d8d51c8SVijay Mahadevan 3168d8d51c8SVijay Mahadevan 3178d8d51c8SVijay Mahadevan 318aa768e4cSTim Tautges /*@ 3195eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 320aa768e4cSTim Tautges 321aa768e4cSTim Tautges Collective on MPI_Comm 322aa768e4cSTim Tautges 323aa768e4cSTim Tautges Input Parameter: 324aa768e4cSTim Tautges . dm - The DMMoab object being set 325aa768e4cSTim Tautges 326aa768e4cSTim Tautges Output Parameter: 3275eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 3285eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 329aa768e4cSTim Tautges 330aa768e4cSTim Tautges Level: beginner 331aa768e4cSTim Tautges 332aa768e4cSTim Tautges .keywords: DMMoab, create 333aa768e4cSTim Tautges @*/ 334351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost) 3351d72bce8STim Tautges { 3361d72bce8STim Tautges PetscFunctionBegin; 3371d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 338351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 339351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3401d72bce8STim Tautges PetscFunctionReturn(0); 3411d72bce8STim Tautges } 3421d72bce8STim Tautges 3435eb88e9dSVijay Mahadevan /*@ 3445eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3455eb88e9dSVijay Mahadevan 3465eb88e9dSVijay Mahadevan Collective on MPI_Comm 3475eb88e9dSVijay Mahadevan 3485eb88e9dSVijay Mahadevan Input Parameter: 3495eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 3505eb88e9dSVijay Mahadevan 3515eb88e9dSVijay Mahadevan Output Parameter: 3525eb88e9dSVijay Mahadevan . range - The entities owned locally 3535eb88e9dSVijay Mahadevan 3545eb88e9dSVijay Mahadevan Level: beginner 3555eb88e9dSVijay Mahadevan 3565eb88e9dSVijay Mahadevan .keywords: DMMoab, create 3575eb88e9dSVijay Mahadevan @*/ 358351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range) 3595eb88e9dSVijay Mahadevan { 3605eb88e9dSVijay Mahadevan PetscFunctionBegin; 3615eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 362351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 3631cec0304SVijay Mahadevan PetscFunctionReturn(0); 3641cec0304SVijay Mahadevan } 3651cec0304SVijay Mahadevan 3661cec0304SVijay Mahadevan 3671cec0304SVijay Mahadevan /*@ 3681cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 3691cec0304SVijay Mahadevan 3701cec0304SVijay Mahadevan Collective on MPI_Comm 3711cec0304SVijay Mahadevan 3721cec0304SVijay Mahadevan Input Parameter: 3731cec0304SVijay Mahadevan . dm - The DMMoab object being set 3741cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 3751cec0304SVijay Mahadevan 3761cec0304SVijay Mahadevan Level: beginner 3771cec0304SVijay Mahadevan 3781cec0304SVijay Mahadevan .keywords: DMMoab, create 3791cec0304SVijay Mahadevan @*/ 3801cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 3811cec0304SVijay Mahadevan { 3821cec0304SVijay Mahadevan moab::ErrorCode merr; 3831cec0304SVijay Mahadevan PetscErrorCode ierr; 3841cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 3851cec0304SVijay Mahadevan 3861cec0304SVijay Mahadevan PetscFunctionBegin; 3871cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3881cec0304SVijay Mahadevan dmmoab->elocal->clear(); 3891cec0304SVijay Mahadevan dmmoab->eghost->clear(); 3901cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 3911cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 3921cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 3931cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 39441dd5348SVijay Mahadevan dmmoab->neleghost=dmmoab->eghost->size(); 395b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 3968cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 3975eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 3985eb88e9dSVijay Mahadevan } 3995eb88e9dSVijay Mahadevan 4005eb88e9dSVijay Mahadevan 401aa768e4cSTim Tautges /*@ 402aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 403aa768e4cSTim Tautges 404aa768e4cSTim Tautges Collective on MPI_Comm 405aa768e4cSTim Tautges 406aa768e4cSTim Tautges Input Parameter: 407aa768e4cSTim Tautges . dm - The DMMoab object being set 408aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 409aa768e4cSTim Tautges 410aa768e4cSTim Tautges Level: beginner 411aa768e4cSTim Tautges 412aa768e4cSTim Tautges .keywords: DMMoab, create 413aa768e4cSTim Tautges @*/ 4141d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 4151d72bce8STim Tautges { 4161d72bce8STim Tautges PetscFunctionBegin; 4171d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4181d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4191d72bce8STim Tautges PetscFunctionReturn(0); 4201d72bce8STim Tautges } 4211d72bce8STim Tautges 4221d72bce8STim Tautges 423aa768e4cSTim Tautges /*@ 424aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 425aa768e4cSTim Tautges 426aa768e4cSTim Tautges Collective on MPI_Comm 427aa768e4cSTim Tautges 428aa768e4cSTim Tautges Input Parameter: 429aa768e4cSTim Tautges . dm - The DMMoab object being set 430aa768e4cSTim Tautges 431aa768e4cSTim Tautges Output Parameter: 432aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 433aa768e4cSTim Tautges 434aa768e4cSTim Tautges Level: beginner 435aa768e4cSTim Tautges 436aa768e4cSTim Tautges .keywords: DMMoab, create 437aa768e4cSTim Tautges @*/ 4381d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 4391d72bce8STim Tautges { 4401d72bce8STim Tautges PetscFunctionBegin; 4411d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4421d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4431d72bce8STim Tautges PetscFunctionReturn(0); 4441d72bce8STim Tautges } 4451d72bce8STim Tautges 4461d72bce8STim Tautges 447aa768e4cSTim Tautges /*@ 448aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 449aa768e4cSTim Tautges 450aa768e4cSTim Tautges Collective on MPI_Comm 451aa768e4cSTim Tautges 452aa768e4cSTim Tautges Input Parameter: 453aa768e4cSTim Tautges . dm - The DMMoab object being set 454aa768e4cSTim Tautges . bs - The block size used with this DMMoab 455aa768e4cSTim Tautges 456aa768e4cSTim Tautges Level: beginner 457aa768e4cSTim Tautges 458aa768e4cSTim Tautges .keywords: DMMoab, create 459aa768e4cSTim Tautges @*/ 4601d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 4611d72bce8STim Tautges { 4621d72bce8STim Tautges PetscFunctionBegin; 4631d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4641d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4651d72bce8STim Tautges PetscFunctionReturn(0); 4661d72bce8STim Tautges } 4671d72bce8STim Tautges 4681d72bce8STim Tautges 469aa768e4cSTim Tautges /*@ 470aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 471aa768e4cSTim Tautges 472aa768e4cSTim Tautges Collective on MPI_Comm 473aa768e4cSTim Tautges 474aa768e4cSTim Tautges Input Parameter: 475aa768e4cSTim Tautges . dm - The DMMoab object being set 476aa768e4cSTim Tautges 477aa768e4cSTim Tautges Output Parameter: 478aa768e4cSTim Tautges . bs - The block size used with this DMMoab 479aa768e4cSTim Tautges 480aa768e4cSTim Tautges Level: beginner 481aa768e4cSTim Tautges 482aa768e4cSTim Tautges .keywords: DMMoab, create 483aa768e4cSTim Tautges @*/ 4841d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 4851d72bce8STim Tautges { 4861d72bce8STim Tautges PetscFunctionBegin; 4871d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4881d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 4891d72bce8STim Tautges PetscFunctionReturn(0); 4901d72bce8STim Tautges } 4911d72bce8STim Tautges 4921cec0304SVijay Mahadevan 493212ad6d1SVijay Mahadevan /*@ 494212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 495212ad6d1SVijay Mahadevan 49600cc10feSVijay Mahadevan Collective on DM 497212ad6d1SVijay Mahadevan 498212ad6d1SVijay Mahadevan Input Parameter: 499212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 500212ad6d1SVijay Mahadevan 501212ad6d1SVijay Mahadevan Output Parameter: 50200cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance 50300cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance 504212ad6d1SVijay Mahadevan 505212ad6d1SVijay Mahadevan Level: beginner 506212ad6d1SVijay Mahadevan 507212ad6d1SVijay Mahadevan .keywords: DMMoab, create 508212ad6d1SVijay Mahadevan @*/ 50941dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg) 510212ad6d1SVijay Mahadevan { 511212ad6d1SVijay Mahadevan PetscFunctionBegin; 512212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 51341dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->nele; 51441dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->n; 515212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 516212ad6d1SVijay Mahadevan } 517212ad6d1SVijay Mahadevan 518212ad6d1SVijay Mahadevan 519212ad6d1SVijay Mahadevan /*@ 520212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 521212ad6d1SVijay Mahadevan 52200cc10feSVijay Mahadevan Collective on DM 523212ad6d1SVijay Mahadevan 524212ad6d1SVijay Mahadevan Input Parameter: 525212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 526212ad6d1SVijay Mahadevan 527212ad6d1SVijay Mahadevan Output Parameter: 528b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor 52900cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 53000cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 53100cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor 532212ad6d1SVijay Mahadevan 533212ad6d1SVijay Mahadevan Level: beginner 534212ad6d1SVijay Mahadevan 535212ad6d1SVijay Mahadevan .keywords: DMMoab, create 536212ad6d1SVijay Mahadevan @*/ 53741dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg) 538212ad6d1SVijay Mahadevan { 539212ad6d1SVijay Mahadevan PetscFunctionBegin; 540212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 54141dd5348SVijay Mahadevan if(nel) *nel = ((DM_Moab*)dm->data)->neleloc; 54241dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->neleghost; 54341dd5348SVijay Mahadevan if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 54441dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 545212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 546212ad6d1SVijay Mahadevan } 547212ad6d1SVijay Mahadevan 548212ad6d1SVijay Mahadevan 54900cc10feSVijay Mahadevan /*@ 55000cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 55100cc10feSVijay Mahadevan 55200cc10feSVijay Mahadevan Collective on MPI_Comm 55300cc10feSVijay Mahadevan 55400cc10feSVijay Mahadevan Input Parameter: 55500cc10feSVijay Mahadevan . dm - The DMMoab object being set 55600cc10feSVijay Mahadevan 55700cc10feSVijay Mahadevan Output Parameter: 55800cc10feSVijay Mahadevan . offset - The local offset for the global vector 55900cc10feSVijay Mahadevan 56000cc10feSVijay Mahadevan Level: beginner 56100cc10feSVijay Mahadevan 56200cc10feSVijay Mahadevan .keywords: DMMoab, create 56300cc10feSVijay Mahadevan @*/ 56400cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset) 56500cc10feSVijay Mahadevan { 56600cc10feSVijay Mahadevan PetscFunctionBegin; 56700cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 56800cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 56900cc10feSVijay Mahadevan PetscFunctionReturn(0); 57000cc10feSVijay Mahadevan } 57100cc10feSVijay Mahadevan 57200cc10feSVijay Mahadevan 5734920ab11SVijay Mahadevan /*@ 5744920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 5754920ab11SVijay Mahadevan 5764920ab11SVijay Mahadevan Collective on MPI_Comm 5774920ab11SVijay Mahadevan 5784920ab11SVijay Mahadevan Input Parameter: 579340f3b9aSVijay Mahadevan . dm - The DMMoab object 5804920ab11SVijay Mahadevan 5814920ab11SVijay Mahadevan Output Parameter: 5824920ab11SVijay Mahadevan . dim - The dimension of DM 5834920ab11SVijay Mahadevan 5844920ab11SVijay Mahadevan Level: beginner 5854920ab11SVijay Mahadevan 5864920ab11SVijay Mahadevan .keywords: DMMoab, create 5874920ab11SVijay Mahadevan @*/ 5884920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 5894920ab11SVijay Mahadevan { 5904920ab11SVijay Mahadevan PetscFunctionBegin; 5914920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5924920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 5934920ab11SVijay Mahadevan PetscFunctionReturn(0); 5944920ab11SVijay Mahadevan } 5954920ab11SVijay Mahadevan 5964920ab11SVijay Mahadevan 597340f3b9aSVijay Mahadevan /*@ 598340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 599340f3b9aSVijay Mahadevan 600340f3b9aSVijay Mahadevan Collective on MPI_Comm 601340f3b9aSVijay Mahadevan 602340f3b9aSVijay Mahadevan Input Parameter: 603340f3b9aSVijay Mahadevan . dm - The DMMoab object 604340f3b9aSVijay Mahadevan . ehandle - The element entity handle 605340f3b9aSVijay Mahadevan 606340f3b9aSVijay Mahadevan Output Parameter: 607340f3b9aSVijay Mahadevan . mat - The material ID for the current entity 608340f3b9aSVijay Mahadevan 609340f3b9aSVijay Mahadevan Level: beginner 610340f3b9aSVijay Mahadevan 611340f3b9aSVijay Mahadevan .keywords: DMMoab, create 612340f3b9aSVijay Mahadevan @*/ 613340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat) 614340f3b9aSVijay Mahadevan { 615340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 616340f3b9aSVijay Mahadevan moab::ErrorCode merr; 617340f3b9aSVijay Mahadevan 618340f3b9aSVijay Mahadevan PetscFunctionBegin; 619340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 620340f3b9aSVijay Mahadevan if (*mat) { 621340f3b9aSVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 62263cd93b2SVijay Mahadevan merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr); 623340f3b9aSVijay Mahadevan } 624340f3b9aSVijay Mahadevan PetscFunctionReturn(0); 625340f3b9aSVijay Mahadevan } 626340f3b9aSVijay Mahadevan 6274920ab11SVijay Mahadevan 62885d305f5SVijay Mahadevan /*@ 62985d305f5SVijay Mahadevan DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities 63085d305f5SVijay Mahadevan 63185d305f5SVijay Mahadevan Collective on MPI_Comm 63285d305f5SVijay Mahadevan 63385d305f5SVijay Mahadevan Input Parameter: 63485d305f5SVijay Mahadevan . dm - The DMMoab object 63585d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 63685d305f5SVijay Mahadevan . conn - The vertex entity handles 63785d305f5SVijay Mahadevan 63885d305f5SVijay Mahadevan Output Parameter: 63985d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities 64085d305f5SVijay Mahadevan 64185d305f5SVijay Mahadevan Level: beginner 64285d305f5SVijay Mahadevan 64385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity() 64485d305f5SVijay Mahadevan @*/ 645cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscReal *vpos) 6467023aa44SVijay Mahadevan { 6477023aa44SVijay Mahadevan DM_Moab *dmmoab; 6487023aa44SVijay Mahadevan PetscErrorCode ierr; 6497023aa44SVijay Mahadevan moab::ErrorCode merr; 6507023aa44SVijay Mahadevan 6517023aa44SVijay Mahadevan PetscFunctionBegin; 6527023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6537023aa44SVijay Mahadevan PetscValidPointer(conn,3); 6547023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6557023aa44SVijay Mahadevan 6567023aa44SVijay Mahadevan if (!vpos) { 6577ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr); 6587023aa44SVijay Mahadevan } 6597023aa44SVijay Mahadevan 6607023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6617023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 6627023aa44SVijay Mahadevan PetscFunctionReturn(0); 6637023aa44SVijay Mahadevan } 6647023aa44SVijay Mahadevan 6657023aa44SVijay Mahadevan 66685d305f5SVijay Mahadevan /*@ 66785d305f5SVijay Mahadevan DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity 66885d305f5SVijay Mahadevan 66985d305f5SVijay Mahadevan Collective on MPI_Comm 67085d305f5SVijay Mahadevan 67185d305f5SVijay Mahadevan Input Parameter: 67285d305f5SVijay Mahadevan . dm - The DMMoab object 67385d305f5SVijay Mahadevan . vhandle - Vertex entity handle 67485d305f5SVijay Mahadevan 67585d305f5SVijay Mahadevan Output Parameter: 67685d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 67785d305f5SVijay Mahadevan . conn - The vertex entity handles 67885d305f5SVijay Mahadevan 67985d305f5SVijay Mahadevan Level: beginner 68085d305f5SVijay Mahadevan 68185d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity() 68285d305f5SVijay Mahadevan @*/ 68385d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt* nconn, moab::EntityHandle **conn) 6848d8d51c8SVijay Mahadevan { 6858d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 6868d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 6878d8d51c8SVijay Mahadevan PetscErrorCode ierr; 6888d8d51c8SVijay Mahadevan moab::ErrorCode merr; 6898d8d51c8SVijay Mahadevan 6908d8d51c8SVijay Mahadevan PetscFunctionBegin; 6918d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6928d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 6938d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6948d8d51c8SVijay Mahadevan 6958d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 69685d305f5SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 6978d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 6988d8d51c8SVijay Mahadevan 6998d8d51c8SVijay Mahadevan if (conn) { 7008d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 7018d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 7028d8d51c8SVijay Mahadevan } 7038d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 7048d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7058d8d51c8SVijay Mahadevan } 7068d8d51c8SVijay Mahadevan 7078d8d51c8SVijay Mahadevan 70885d305f5SVijay Mahadevan /*@ 70985d305f5SVijay Mahadevan DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity 71085d305f5SVijay Mahadevan 71185d305f5SVijay Mahadevan Collective on MPI_Comm 71285d305f5SVijay Mahadevan 71385d305f5SVijay Mahadevan Input Parameter: 71485d305f5SVijay Mahadevan . dm - The DMMoab object 71585d305f5SVijay Mahadevan . vhandle - Vertex entity handle 71685d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 71785d305f5SVijay Mahadevan . conn - The vertex entity handles 71885d305f5SVijay Mahadevan 71985d305f5SVijay Mahadevan Level: beginner 72085d305f5SVijay Mahadevan 72185d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity() 72285d305f5SVijay Mahadevan @*/ 7238d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 7248d8d51c8SVijay Mahadevan { 7258d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7268d8d51c8SVijay Mahadevan 7278d8d51c8SVijay Mahadevan PetscFunctionBegin; 7288d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7298d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 7308d8d51c8SVijay Mahadevan 7318d8d51c8SVijay Mahadevan if (conn) { 7328d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 7338d8d51c8SVijay Mahadevan } 7348d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 7358d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7368d8d51c8SVijay Mahadevan } 7378d8d51c8SVijay Mahadevan 7388d8d51c8SVijay Mahadevan 73985d305f5SVijay Mahadevan /*@ 74085d305f5SVijay Mahadevan DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity 74185d305f5SVijay Mahadevan 74285d305f5SVijay Mahadevan Collective on MPI_Comm 74385d305f5SVijay Mahadevan 74485d305f5SVijay Mahadevan Input Parameter: 74585d305f5SVijay Mahadevan . dm - The DMMoab object 74685d305f5SVijay Mahadevan . ehandle - Vertex entity handle 74785d305f5SVijay Mahadevan 74885d305f5SVijay Mahadevan Output Parameter: 74985d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 75085d305f5SVijay Mahadevan . conn - The vertex entity handles 75185d305f5SVijay Mahadevan 75285d305f5SVijay Mahadevan Level: beginner 75385d305f5SVijay Mahadevan 75485d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity() 75585d305f5SVijay Mahadevan @*/ 7567023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 7577023aa44SVijay Mahadevan { 7587023aa44SVijay Mahadevan DM_Moab *dmmoab; 7597023aa44SVijay Mahadevan const moab::EntityHandle *connect; 7607023aa44SVijay Mahadevan moab::ErrorCode merr; 7617023aa44SVijay Mahadevan PetscInt nnodes; 7627023aa44SVijay Mahadevan 7637023aa44SVijay Mahadevan PetscFunctionBegin; 7647023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7657023aa44SVijay Mahadevan PetscValidPointer(conn,4); 7667023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7677023aa44SVijay Mahadevan 7687023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7697023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 7707023aa44SVijay Mahadevan if (conn) *conn=connect; 7717023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 7727023aa44SVijay Mahadevan PetscFunctionReturn(0); 7737023aa44SVijay Mahadevan } 7747023aa44SVijay Mahadevan 7757023aa44SVijay Mahadevan 77685d305f5SVijay Mahadevan /*@ 77785d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 77885d305f5SVijay Mahadevan 77985d305f5SVijay Mahadevan Collective on MPI_Comm 78085d305f5SVijay Mahadevan 78185d305f5SVijay Mahadevan Input Parameter: 78285d305f5SVijay Mahadevan . dm - The DMMoab object 78385d305f5SVijay Mahadevan . ent - Entity handle 78485d305f5SVijay Mahadevan 78585d305f5SVijay Mahadevan Output Parameter: 78685d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 78785d305f5SVijay Mahadevan 78885d305f5SVijay Mahadevan Level: beginner 78985d305f5SVijay Mahadevan 79085d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices() 79185d305f5SVijay Mahadevan @*/ 79269263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 79369263071SVijay Mahadevan { 79469263071SVijay Mahadevan moab::EntityType etype; 79569263071SVijay Mahadevan DM_Moab *dmmoab; 79669263071SVijay Mahadevan PetscInt edim; 79769263071SVijay Mahadevan 79869263071SVijay Mahadevan PetscFunctionBegin; 79969263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 80069263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 80169263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 80269263071SVijay Mahadevan 80369263071SVijay Mahadevan /* get the entity type and handle accordingly */ 80469263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 80569263071SVijay 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); 80669263071SVijay Mahadevan 80769263071SVijay Mahadevan /* get the entity dimension */ 80869263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 80969263071SVijay Mahadevan 81069263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 81169263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 812*b117cd09SVijay Mahadevan if (dmmoab->hlevel) { 813*b117cd09SVijay Mahadevan *ent_on_boundary=(dmmoab->hierarchy->is_boundary_vertex(ent) ? PETSC_TRUE:PETSC_FALSE); 814*b117cd09SVijay Mahadevan } 815*b117cd09SVijay Mahadevan else *ent_on_boundary=((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE:PETSC_FALSE); 81669263071SVijay Mahadevan } 81769263071SVijay Mahadevan else { 81869263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 8196d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 82069263071SVijay Mahadevan } 82169263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 8226d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 82369263071SVijay Mahadevan } 82469263071SVijay Mahadevan } 82569263071SVijay Mahadevan PetscFunctionReturn(0); 82669263071SVijay Mahadevan } 82769263071SVijay Mahadevan 82869263071SVijay Mahadevan 82985d305f5SVijay Mahadevan /*@ 83085d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 83185d305f5SVijay Mahadevan 83285d305f5SVijay Mahadevan Input Parameter: 83385d305f5SVijay Mahadevan . dm - The DMMoab object 83485d305f5SVijay Mahadevan . nconn - Number of handles 83585d305f5SVijay Mahadevan . cnt - Array of entity handles 83685d305f5SVijay Mahadevan 83785d305f5SVijay Mahadevan Output Parameter: 83885d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 83985d305f5SVijay Mahadevan 84085d305f5SVijay Mahadevan Level: beginner 84185d305f5SVijay Mahadevan 84285d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary() 84385d305f5SVijay Mahadevan @*/ 84469263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 8457023aa44SVijay Mahadevan { 8467023aa44SVijay Mahadevan DM_Moab *dmmoab; 8477023aa44SVijay Mahadevan PetscInt i; 8487023aa44SVijay Mahadevan 8497023aa44SVijay Mahadevan PetscFunctionBegin; 8507023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8517023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 8527023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 8537023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8547023aa44SVijay Mahadevan 8557023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 856*b117cd09SVijay Mahadevan if (dmmoab->hlevel) { 857*b117cd09SVijay Mahadevan isbdvtx[i]=(dmmoab->hierarchy->is_boundary_vertex(cnt[i]) ? PETSC_TRUE:PETSC_FALSE); 858*b117cd09SVijay Mahadevan } 859*b117cd09SVijay Mahadevan else { 8606d9eb265SVijay Mahadevan isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE); 8617023aa44SVijay Mahadevan } 862*b117cd09SVijay Mahadevan } 8637023aa44SVijay Mahadevan PetscFunctionReturn(0); 8647023aa44SVijay Mahadevan } 8657023aa44SVijay Mahadevan 8667023aa44SVijay Mahadevan 86785d305f5SVijay Mahadevan /*@ 86885d305f5SVijay Mahadevan DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary 86985d305f5SVijay Mahadevan 87085d305f5SVijay Mahadevan Input Parameter: 87185d305f5SVijay Mahadevan . dm - The DMMoab object 87285d305f5SVijay Mahadevan 87385d305f5SVijay Mahadevan Output Parameter: 87485d305f5SVijay Mahadevan . bdvtx - Boundary vertices 87585d305f5SVijay Mahadevan . bdelems - Boundary elements 87685d305f5SVijay Mahadevan . bdfaces - Boundary faces 87785d305f5SVijay Mahadevan 87885d305f5SVijay Mahadevan Level: beginner 87985d305f5SVijay Mahadevan 88085d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary() 88185d305f5SVijay Mahadevan @*/ 8826d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces) 8831cec0304SVijay Mahadevan { 8841cec0304SVijay Mahadevan DM_Moab *dmmoab; 8851cec0304SVijay Mahadevan 8861cec0304SVijay Mahadevan PetscFunctionBegin; 8871cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8881cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8891cec0304SVijay Mahadevan 8906d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 8916d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 8926d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 8931cec0304SVijay Mahadevan PetscFunctionReturn(0); 8941cec0304SVijay Mahadevan } 8951cec0304SVijay Mahadevan 896f6829af0SVijay Mahadevan 897f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 898f6829af0SVijay Mahadevan { 899f6829af0SVijay Mahadevan PetscErrorCode ierr; 90085d305f5SVijay Mahadevan PetscInt i; 901f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 902f6829af0SVijay Mahadevan 903f6829af0SVijay Mahadevan PetscFunctionBegin; 904f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 905f6829af0SVijay Mahadevan if (dmmoab->icreatedinstance) { 906f6829af0SVijay Mahadevan delete dmmoab->mbiface; 907f6829af0SVijay Mahadevan } 908f6829af0SVijay Mahadevan dmmoab->mbiface = NULL; 909f6829af0SVijay Mahadevan dmmoab->pcomm = NULL; 910f6829af0SVijay Mahadevan delete dmmoab->vlocal; 911f6829af0SVijay Mahadevan delete dmmoab->vowned; 912f6829af0SVijay Mahadevan delete dmmoab->vghost; 913f6829af0SVijay Mahadevan delete dmmoab->elocal; 914f6829af0SVijay Mahadevan delete dmmoab->eghost; 915f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 916f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 917f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 918f6829af0SVijay Mahadevan 919f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 9207ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr); 9217ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->lgmap,dmmoab->llmap);CHKERRQ(ierr); 9225905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr); 9235905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr); 92485d305f5SVijay Mahadevan if (dmmoab->fieldNames) { 92585d305f5SVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 92685d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 92785d305f5SVijay Mahadevan } 92885d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 92985d305f5SVijay Mahadevan } 930*b117cd09SVijay Mahadevan 931*b117cd09SVijay Mahadevan if (dmmoab->nhlevels) { 932*b117cd09SVijay Mahadevan ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr); 933*b117cd09SVijay Mahadevan } 934f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 935f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 936f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 937f6829af0SVijay Mahadevan PetscFunctionReturn(0); 938f6829af0SVijay Mahadevan } 939f6829af0SVijay Mahadevan 940f6829af0SVijay Mahadevan 9414416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject,DM dm) 9422e4e7c01SVijay Mahadevan { 9432e4e7c01SVijay Mahadevan PetscErrorCode ierr; 9442e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 9452e4e7c01SVijay Mahadevan 9462e4e7c01SVijay Mahadevan PetscFunctionBegin; 9472e4e7c01SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 948cc310fddSBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr); 9492e4e7c01SVijay 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); 9502e4e7c01SVijay 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); 9512e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 9522e4e7c01SVijay 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); 9532e4e7c01SVijay 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); 9542e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr); 9552e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr); 9562e4e7c01SVijay Mahadevan PetscFunctionReturn(0); 9572e4e7c01SVijay Mahadevan } 9582e4e7c01SVijay Mahadevan 9592e4e7c01SVijay Mahadevan 960f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 961f6829af0SVijay Mahadevan { 962f6829af0SVijay Mahadevan PetscErrorCode ierr; 963f6829af0SVijay Mahadevan moab::ErrorCode merr; 964f6829af0SVijay Mahadevan Vec local, global; 965f6829af0SVijay Mahadevan IS from,to; 966f6829af0SVijay Mahadevan moab::Range::iterator iter; 967f6829af0SVijay Mahadevan PetscInt i,j,f,bs,gmin,lmin,lmax,vent,totsize; 968f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 969f6829af0SVijay Mahadevan moab::Range adjs; 970f6829af0SVijay Mahadevan 971f6829af0SVijay Mahadevan PetscFunctionBegin; 972f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 973f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 974c528d872SBarry 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."); 975f6829af0SVijay Mahadevan 976f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 977f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 978f6829af0SVijay Mahadevan { 979f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 980f6829af0SVijay Mahadevan 981f6829af0SVijay Mahadevan /* filter based on parallel status */ 982f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 983f6829af0SVijay Mahadevan 984f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 985f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 986f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 987f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 988f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 989f6829af0SVijay Mahadevan 990f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 991f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 992f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 993b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 994f6829af0SVijay Mahadevan } 995f6829af0SVijay Mahadevan 996f6829af0SVijay Mahadevan { 997f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 998f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 999f6829af0SVijay Mahadevan 1000f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 1001f6829af0SVijay Mahadevan for (i=3;i>0;i--) { 1002f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 1003f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 1004f6829af0SVijay Mahadevan 1005f6829af0SVijay Mahadevan /* store the current mesh dimension */ 1006f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 1007f6829af0SVijay Mahadevan dmmoab->dim=i; 1008f6829af0SVijay Mahadevan break; 1009f6829af0SVijay Mahadevan } 1010f6829af0SVijay Mahadevan } 1011f6829af0SVijay Mahadevan 1012*b117cd09SVijay Mahadevan ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr); 1013*b117cd09SVijay Mahadevan 1014f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 1015f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 1016f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1017f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 1018f6829af0SVijay Mahadevan 1019f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 1020f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 1021b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1022f6829af0SVijay Mahadevan } 1023f6829af0SVijay Mahadevan 1024f6829af0SVijay Mahadevan bs = dmmoab->bs; 1025f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 1026f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 1027f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 1028f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 1029f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1030f6829af0SVijay Mahadevan } 1031f6829af0SVijay Mahadevan 1032f6829af0SVijay Mahadevan totsize=dmmoab->vlocal->size(); 1033f6829af0SVijay 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); 10347ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr); 1035f6829af0SVijay Mahadevan { 1036f6829af0SVijay Mahadevan /* first get the local indices */ 1037f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 1038f6829af0SVijay Mahadevan /* next get the ghosted indices */ 1039f6829af0SVijay Mahadevan if (dmmoab->nghost) { 1040f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1041f6829af0SVijay Mahadevan } 1042f6829af0SVijay Mahadevan 1043f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1044f6829af0SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 1045f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1046f6829af0SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 1047f6829af0SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 1048f6829af0SVijay Mahadevan } 1049f6829af0SVijay Mahadevan 1050b2566f29SBarry Smith ierr = MPIU_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1051f6829af0SVijay Mahadevan 1052f6829af0SVijay Mahadevan /* set the GID map */ 1053f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1054f6829af0SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 1055f6829af0SVijay Mahadevan } 1056f6829af0SVijay Mahadevan lmin-=gmin; 1057f6829af0SVijay Mahadevan lmax-=gmin; 1058f6829af0SVijay Mahadevan 1059f6829af0SVijay Mahadevan PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 1060f6829af0SVijay Mahadevan } 106182dfd14aSVijay 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); 1062f6829af0SVijay Mahadevan 1063f6829af0SVijay Mahadevan { 10647ae5e5b6SVijay Mahadevan i=(PetscInt)dmmoab->vlocal->back()+1; 10657ae5e5b6SVijay Mahadevan //i=(PetscInt)(dmmoab->vlocal->back()-dmmoab->vlocal->front())+1; 10667ae5e5b6SVijay Mahadevan j=totsize*dmmoab->numFields; 10677ae5e5b6SVijay Mahadevan ierr = PetscMalloc2(i,&dmmoab->gidmap,i,&dmmoab->lidmap);CHKERRQ(ierr); 10687ae5e5b6SVijay Mahadevan ierr = PetscMalloc2(j,&dmmoab->lgmap,j,&dmmoab->llmap);CHKERRQ(ierr); 1069f6829af0SVijay Mahadevan 1070f6829af0SVijay Mahadevan i=j=0; 1071f6829af0SVijay Mahadevan /* set the owned vertex data first */ 1072f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 1073f6829af0SVijay Mahadevan vent=(PetscInt)(*iter); 1074f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1075f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1076f6829af0SVijay Mahadevan if (bs > 1) { 1077f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1078f6829af0SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 1079f6829af0SVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 1080f6829af0SVijay Mahadevan } 1081f6829af0SVijay Mahadevan } 1082f6829af0SVijay Mahadevan else { 1083f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1084f6829af0SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 1085f6829af0SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 1086f6829af0SVijay Mahadevan } 1087f6829af0SVijay Mahadevan } 1088f6829af0SVijay Mahadevan } 1089f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1090f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 1091f6829af0SVijay Mahadevan vent=(PetscInt)(*iter); 1092f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1093f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1094f6829af0SVijay Mahadevan if (bs > 1) { 1095f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1096f6829af0SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 1097f6829af0SVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 1098f6829af0SVijay Mahadevan } 1099f6829af0SVijay Mahadevan } 1100f6829af0SVijay Mahadevan else { 1101f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1102f6829af0SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 1103f6829af0SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 1104f6829af0SVijay Mahadevan } 1105f6829af0SVijay Mahadevan } 1106f6829af0SVijay Mahadevan } 1107f6829af0SVijay Mahadevan 1108f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1109f6829af0SVijay Mahadevan 1) First create a local and global vector 1110f6829af0SVijay Mahadevan 2) Create a local and global IS 1111f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1112f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1113f6829af0SVijay Mahadevan */ 1114f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 1115f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 1116f6829af0SVijay Mahadevan 1117f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 1118f6829af0SVijay Mahadevan PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost); 1119f6829af0SVijay Mahadevan 1120f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 1121f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr); 1122f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr); 1123f6829af0SVijay Mahadevan 1124f6829af0SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 1125f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr); 1126f6829af0SVijay Mahadevan 1127f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1128f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 112982dfd14aSVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,dmmoab->lgmap, 1130f6829af0SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 1131f6829af0SVijay Mahadevan } 1132f6829af0SVijay Mahadevan 1133f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 1134f6829af0SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 1135f6829af0SVijay Mahadevan 1136f6829af0SVijay Mahadevan /* clean up IS, Vec */ 1137f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 1138f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 1139f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 1140f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 1141f6829af0SVijay Mahadevan } 1142f6829af0SVijay Mahadevan 1143f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 1144f6829af0SVijay Mahadevan { 1145f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1146f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1147f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1148f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1149f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1150f6829af0SVijay Mahadevan 1151f6829af0SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 1152f6829af0SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 1153f6829af0SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1154f6829af0SVijay Mahadevan 1155f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 1156f6829af0SVijay 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 1157f6829af0SVijay Mahadevan 1158f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1159f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1160f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 1161f6829af0SVijay Mahadevan 1162f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1163f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 1164f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 1165f6829af0SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 1166f6829af0SVijay Mahadevan } 1167f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1168f6829af0SVijay Mahadevan } 1169f6829af0SVijay Mahadevan 1170f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1171f6829af0SVijay Mahadevan { 1172f6829af0SVijay Mahadevan PetscErrorCode ierr; 1173f6829af0SVijay Mahadevan 1174f6829af0SVijay Mahadevan PetscFunctionBegin; 1175f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1176f90c3b0eSVijay Mahadevan ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr); 1177f6829af0SVijay Mahadevan 1178f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1179f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1180f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1181f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1182f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1183f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1184f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1185f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1186c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_map = NULL; 1187c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_sendrecv = NULL; 1188f6829af0SVijay Mahadevan 1189f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1190f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1191f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1192f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1193f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1194f6829af0SVijay Mahadevan 1195f6829af0SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1196f6829af0SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1197f6829af0SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1198f6829af0SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1199f6829af0SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 1200*b117cd09SVijay Mahadevan //dm->ops->coarsenhierarchy = DMCoarsenHierarchy_Moab; 1201*b117cd09SVijay Mahadevan //dm->ops->refinehierarchy = DMRefineHierarchy_Moab; 1202*b117cd09SVijay Mahadevan dm->ops->createinterpolation = DMCreateInterpolation_Moab; 1203*b117cd09SVijay Mahadevan //dm->ops->getinjection = DMCreateInjection_Moab; 1204*b117cd09SVijay Mahadevan dm->ops->refine = DMRefine_Moab; 1205*b117cd09SVijay Mahadevan dm->ops->coarsen = DMCoarsen_Moab; 12062e4e7c01SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1207f6829af0SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1208f6829af0SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1209f6829af0SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1210f6829af0SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1211f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1212f6829af0SVijay Mahadevan } 1213f6829af0SVijay Mahadevan 1214