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 /*@ 52a4d2169cSTim Tautges DMMoabCreate - 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; 977d89fc02STim Tautges 98a4d2169cSTim Tautges if (!pcomm) { 99032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 100032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 101032b8ab6SVijay Mahadevan 102db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 103db66d124SVijay Mahadevan to the load_file functions to be populated. */ 1040c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr); 105032b8ab6SVijay Mahadevan 106db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 10772ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 10872ff976dSVijay Mahadevan } 10972ff976dSVijay Mahadevan else { 11085d305f5SVijay Mahadevan ierr = DMMoabSetParallelComm(dmmb, pcomm);CHKERRQ(ierr); 111032b8ab6SVijay Mahadevan } 112032b8ab6SVijay Mahadevan 1134973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 1144973de03SVijay Mahadevan dmmoab->bs = 1; 115addae81cSVijay Mahadevan dmmoab->numFields = 1; 1162e4e7c01SVijay Mahadevan dmmoab->rw_dbglevel = 0; 1172e4e7c01SVijay Mahadevan dmmoab->partition_by_rank = PETSC_FALSE; 1182e4e7c01SVijay Mahadevan dmmoab->extra_read_options[0] = '\0'; 1192e4e7c01SVijay Mahadevan dmmoab->extra_write_options[0] = '\0'; 1202e4e7c01SVijay Mahadevan dmmoab->read_mode = READ_PART; 1212e4e7c01SVijay Mahadevan dmmoab->write_mode = WRITE_PART; 1224973de03SVijay Mahadevan 1234973de03SVijay Mahadevan /* set global ID tag handle */ 1241a845d2aSVijay Mahadevan if (ltog_tag && *ltog_tag) { 12585d305f5SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr); 126032b8ab6SVijay Mahadevan } 127032b8ab6SVijay Mahadevan else { 1281a845d2aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1291a845d2aSVijay Mahadevan if (ltog_tag) *ltog_tag = dmmoab->ltog_tag; 130a4d2169cSTim Tautges } 131a4d2169cSTim Tautges 132340f3b9aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr); 133340f3b9aSVijay Mahadevan 1344973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 135a4d2169cSTim Tautges if (range) { 13685d305f5SVijay Mahadevan ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr); 137a4d2169cSTim Tautges } 13885d305f5SVijay Mahadevan *dmb=dmmb; 1391d72bce8STim Tautges PetscFunctionReturn(0); 1401d72bce8STim Tautges } 1411d72bce8STim Tautges 142aa768e4cSTim Tautges /*@ 143aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 144aa768e4cSTim Tautges 145aa768e4cSTim Tautges Collective on MPI_Comm 146aa768e4cSTim Tautges 147aa768e4cSTim Tautges Input Parameter: 148aa768e4cSTim Tautges . dm - The DMMoab object being set 149aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 150aa768e4cSTim Tautges 151aa768e4cSTim Tautges Level: beginner 152aa768e4cSTim Tautges 153aa768e4cSTim Tautges .keywords: DMMoab, create 154aa768e4cSTim Tautges @*/ 1551d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 1561d72bce8STim Tautges { 157032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 158032b8ab6SVijay Mahadevan 1591d72bce8STim Tautges PetscFunctionBegin; 1601d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1611cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 162032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 163032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 164032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 1651d72bce8STim Tautges PetscFunctionReturn(0); 1661d72bce8STim Tautges } 1671d72bce8STim Tautges 1681d72bce8STim Tautges 169aa768e4cSTim Tautges /*@ 170aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 171aa768e4cSTim Tautges 172aa768e4cSTim Tautges Collective on MPI_Comm 173aa768e4cSTim Tautges 174aa768e4cSTim Tautges Input Parameter: 175aa768e4cSTim Tautges . dm - The DMMoab object being set 176aa768e4cSTim Tautges 177aa768e4cSTim Tautges Output Parameter: 178aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 179aa768e4cSTim Tautges 180aa768e4cSTim Tautges Level: beginner 181aa768e4cSTim Tautges 182aa768e4cSTim Tautges .keywords: DMMoab, create 183aa768e4cSTim Tautges @*/ 1841d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 1851d72bce8STim Tautges { 1861d72bce8STim Tautges PetscFunctionBegin; 1871d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 188032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 1891d72bce8STim Tautges PetscFunctionReturn(0); 1901d72bce8STim Tautges } 1911d72bce8STim Tautges 1921d72bce8STim Tautges 193aa768e4cSTim Tautges /*@ 194aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 195aa768e4cSTim Tautges 196aa768e4cSTim Tautges Collective on MPI_Comm 197aa768e4cSTim Tautges 198aa768e4cSTim Tautges Input Parameter: 199aa768e4cSTim Tautges . dm - The DMMoab object being set 200aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 201aa768e4cSTim Tautges 202aa768e4cSTim Tautges Level: beginner 203aa768e4cSTim Tautges 204aa768e4cSTim Tautges .keywords: DMMoab, create 205aa768e4cSTim Tautges @*/ 206a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 2071d72bce8STim Tautges { 208032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 209032b8ab6SVijay Mahadevan 2101d72bce8STim Tautges PetscFunctionBegin; 2111d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2121cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 213032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 214032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 215032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2161d72bce8STim Tautges PetscFunctionReturn(0); 2171d72bce8STim Tautges } 2181d72bce8STim Tautges 2191d72bce8STim Tautges 220aa768e4cSTim Tautges /*@ 221aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 222aa768e4cSTim Tautges 223aa768e4cSTim Tautges Collective on MPI_Comm 224aa768e4cSTim Tautges 225aa768e4cSTim Tautges Input Parameter: 226aa768e4cSTim Tautges . dm - The DMMoab object being set 227aa768e4cSTim Tautges 228aa768e4cSTim Tautges Output Parameter: 229aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 230aa768e4cSTim Tautges 231aa768e4cSTim Tautges Level: beginner 232aa768e4cSTim Tautges 233aa768e4cSTim Tautges .keywords: DMMoab, create 234aa768e4cSTim Tautges @*/ 235a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 2361d72bce8STim Tautges { 2379426e041SSatish Balay PetscErrorCode ierr; 238cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 239cabb514dSBarry Smith 2401d72bce8STim Tautges PetscFunctionBegin; 2411d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 242cabb514dSBarry 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); 243a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 2441d72bce8STim Tautges PetscFunctionReturn(0); 2451d72bce8STim Tautges } 2461d72bce8STim Tautges 2471d72bce8STim Tautges 248aa768e4cSTim Tautges /*@ 2495eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 250aa768e4cSTim Tautges 251aa768e4cSTim Tautges Collective on MPI_Comm 252aa768e4cSTim Tautges 253aa768e4cSTim Tautges Input Parameter: 254aa768e4cSTim Tautges . dm - The DMMoab object being set 255aa768e4cSTim Tautges . range - The entities treated by this DMMoab 256aa768e4cSTim Tautges 257aa768e4cSTim Tautges Level: beginner 258aa768e4cSTim Tautges 259aa768e4cSTim Tautges .keywords: DMMoab, create 260aa768e4cSTim Tautges @*/ 2615eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 2621d72bce8STim Tautges { 263032b8ab6SVijay Mahadevan moab::ErrorCode merr; 264032b8ab6SVijay Mahadevan PetscErrorCode ierr; 265fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 266032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 267032b8ab6SVijay Mahadevan 2681d72bce8STim Tautges PetscFunctionBegin; 2691d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 270032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 271032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 272fd3326ddSVijay Mahadevan 273032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 274fd3326ddSVijay Mahadevan 275fd3326ddSVijay Mahadevan /* filter based on parallel status */ 276fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 277fd3326ddSVijay Mahadevan 278fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 279fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 280fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 281fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 282fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 283fd3326ddSVijay Mahadevan 284fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 285032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 286032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 287b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 2881d72bce8STim Tautges PetscFunctionReturn(0); 2891d72bce8STim Tautges } 2901d72bce8STim Tautges 2911d72bce8STim Tautges 2928d8d51c8SVijay Mahadevan /*@ 2938d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 2948d8d51c8SVijay Mahadevan 2958d8d51c8SVijay Mahadevan Collective on MPI_Comm 2968d8d51c8SVijay Mahadevan 2978d8d51c8SVijay Mahadevan Input Parameter: 2988d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 2998d8d51c8SVijay Mahadevan 3008d8d51c8SVijay Mahadevan Output Parameter: 3018d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 3028d8d51c8SVijay Mahadevan 3038d8d51c8SVijay Mahadevan Level: beginner 3048d8d51c8SVijay Mahadevan 3058d8d51c8SVijay Mahadevan .keywords: DMMoab, create 3068d8d51c8SVijay Mahadevan @*/ 3078d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 3088d8d51c8SVijay Mahadevan { 3098d8d51c8SVijay Mahadevan PetscFunctionBegin; 3108d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3118d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 3128d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3138d8d51c8SVijay Mahadevan } 3148d8d51c8SVijay Mahadevan 3158d8d51c8SVijay Mahadevan 3168d8d51c8SVijay Mahadevan 317aa768e4cSTim Tautges /*@ 3185eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 319aa768e4cSTim Tautges 320aa768e4cSTim Tautges Collective on MPI_Comm 321aa768e4cSTim Tautges 322aa768e4cSTim Tautges Input Parameter: 323aa768e4cSTim Tautges . dm - The DMMoab object being set 324aa768e4cSTim Tautges 325aa768e4cSTim Tautges Output Parameter: 3265eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 3275eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 328aa768e4cSTim Tautges 329aa768e4cSTim Tautges Level: beginner 330aa768e4cSTim Tautges 331aa768e4cSTim Tautges .keywords: DMMoab, create 332aa768e4cSTim Tautges @*/ 333351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost) 3341d72bce8STim Tautges { 3351d72bce8STim Tautges PetscFunctionBegin; 3361d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 337351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 338351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3391d72bce8STim Tautges PetscFunctionReturn(0); 3401d72bce8STim Tautges } 3411d72bce8STim Tautges 3425eb88e9dSVijay Mahadevan /*@ 3435eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3445eb88e9dSVijay Mahadevan 3455eb88e9dSVijay Mahadevan Collective on MPI_Comm 3465eb88e9dSVijay Mahadevan 3475eb88e9dSVijay Mahadevan Input Parameter: 3485eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 3495eb88e9dSVijay Mahadevan 3505eb88e9dSVijay Mahadevan Output Parameter: 3515eb88e9dSVijay Mahadevan . range - The entities owned locally 3525eb88e9dSVijay Mahadevan 3535eb88e9dSVijay Mahadevan Level: beginner 3545eb88e9dSVijay Mahadevan 3555eb88e9dSVijay Mahadevan .keywords: DMMoab, create 3565eb88e9dSVijay Mahadevan @*/ 357351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range) 3585eb88e9dSVijay Mahadevan { 3595eb88e9dSVijay Mahadevan PetscFunctionBegin; 3605eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 361351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 3621cec0304SVijay Mahadevan PetscFunctionReturn(0); 3631cec0304SVijay Mahadevan } 3641cec0304SVijay Mahadevan 3651cec0304SVijay Mahadevan 3661cec0304SVijay Mahadevan /*@ 3671cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 3681cec0304SVijay Mahadevan 3691cec0304SVijay Mahadevan Collective on MPI_Comm 3701cec0304SVijay Mahadevan 3711cec0304SVijay Mahadevan Input Parameter: 3721cec0304SVijay Mahadevan . dm - The DMMoab object being set 3731cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 3741cec0304SVijay Mahadevan 3751cec0304SVijay Mahadevan Level: beginner 3761cec0304SVijay Mahadevan 3771cec0304SVijay Mahadevan .keywords: DMMoab, create 3781cec0304SVijay Mahadevan @*/ 3791cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 3801cec0304SVijay Mahadevan { 3811cec0304SVijay Mahadevan moab::ErrorCode merr; 3821cec0304SVijay Mahadevan PetscErrorCode ierr; 3831cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 3841cec0304SVijay Mahadevan 3851cec0304SVijay Mahadevan PetscFunctionBegin; 3861cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3871cec0304SVijay Mahadevan dmmoab->elocal->clear(); 3881cec0304SVijay Mahadevan dmmoab->eghost->clear(); 3891cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 3901cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 3911cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 3921cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 39341dd5348SVijay Mahadevan dmmoab->neleghost=dmmoab->eghost->size(); 394b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 3958cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 3965eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 3975eb88e9dSVijay Mahadevan } 3985eb88e9dSVijay Mahadevan 3995eb88e9dSVijay Mahadevan 400aa768e4cSTim Tautges /*@ 401aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 402aa768e4cSTim Tautges 403aa768e4cSTim Tautges Collective on MPI_Comm 404aa768e4cSTim Tautges 405aa768e4cSTim Tautges Input Parameter: 406aa768e4cSTim Tautges . dm - The DMMoab object being set 407aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 408aa768e4cSTim Tautges 409aa768e4cSTim Tautges Level: beginner 410aa768e4cSTim Tautges 411aa768e4cSTim Tautges .keywords: DMMoab, create 412aa768e4cSTim Tautges @*/ 4131d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 4141d72bce8STim Tautges { 4151d72bce8STim Tautges PetscFunctionBegin; 4161d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4171d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4181d72bce8STim Tautges PetscFunctionReturn(0); 4191d72bce8STim Tautges } 4201d72bce8STim Tautges 4211d72bce8STim Tautges 422aa768e4cSTim Tautges /*@ 423aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 424aa768e4cSTim Tautges 425aa768e4cSTim Tautges Collective on MPI_Comm 426aa768e4cSTim Tautges 427aa768e4cSTim Tautges Input Parameter: 428aa768e4cSTim Tautges . dm - The DMMoab object being set 429aa768e4cSTim Tautges 430aa768e4cSTim Tautges Output Parameter: 431aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 432aa768e4cSTim Tautges 433aa768e4cSTim Tautges Level: beginner 434aa768e4cSTim Tautges 435aa768e4cSTim Tautges .keywords: DMMoab, create 436aa768e4cSTim Tautges @*/ 4371d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 4381d72bce8STim Tautges { 4391d72bce8STim Tautges PetscFunctionBegin; 4401d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4411d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4421d72bce8STim Tautges PetscFunctionReturn(0); 4431d72bce8STim Tautges } 4441d72bce8STim Tautges 4451d72bce8STim Tautges 446aa768e4cSTim Tautges /*@ 447aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 448aa768e4cSTim Tautges 449aa768e4cSTim Tautges Collective on MPI_Comm 450aa768e4cSTim Tautges 451aa768e4cSTim Tautges Input Parameter: 452aa768e4cSTim Tautges . dm - The DMMoab object being set 453aa768e4cSTim Tautges . bs - The block size used with this DMMoab 454aa768e4cSTim Tautges 455aa768e4cSTim Tautges Level: beginner 456aa768e4cSTim Tautges 457aa768e4cSTim Tautges .keywords: DMMoab, create 458aa768e4cSTim Tautges @*/ 4591d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 4601d72bce8STim Tautges { 4611d72bce8STim Tautges PetscFunctionBegin; 4621d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4631d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4641d72bce8STim Tautges PetscFunctionReturn(0); 4651d72bce8STim Tautges } 4661d72bce8STim Tautges 4671d72bce8STim Tautges 468aa768e4cSTim Tautges /*@ 469aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 470aa768e4cSTim Tautges 471aa768e4cSTim Tautges Collective on MPI_Comm 472aa768e4cSTim Tautges 473aa768e4cSTim Tautges Input Parameter: 474aa768e4cSTim Tautges . dm - The DMMoab object being set 475aa768e4cSTim Tautges 476aa768e4cSTim Tautges Output Parameter: 477aa768e4cSTim Tautges . bs - The block size used with this DMMoab 478aa768e4cSTim Tautges 479aa768e4cSTim Tautges Level: beginner 480aa768e4cSTim Tautges 481aa768e4cSTim Tautges .keywords: DMMoab, create 482aa768e4cSTim Tautges @*/ 4831d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 4841d72bce8STim Tautges { 4851d72bce8STim Tautges PetscFunctionBegin; 4861d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4871d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 4881d72bce8STim Tautges PetscFunctionReturn(0); 4891d72bce8STim Tautges } 4901d72bce8STim Tautges 4911cec0304SVijay Mahadevan 492212ad6d1SVijay Mahadevan /*@ 493212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 494212ad6d1SVijay Mahadevan 49500cc10feSVijay Mahadevan Collective on DM 496212ad6d1SVijay Mahadevan 497212ad6d1SVijay Mahadevan Input Parameter: 498212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 499212ad6d1SVijay Mahadevan 500212ad6d1SVijay Mahadevan Output Parameter: 50100cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance 50200cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance 503212ad6d1SVijay Mahadevan 504212ad6d1SVijay Mahadevan Level: beginner 505212ad6d1SVijay Mahadevan 506212ad6d1SVijay Mahadevan .keywords: DMMoab, create 507212ad6d1SVijay Mahadevan @*/ 50841dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg) 509212ad6d1SVijay Mahadevan { 510212ad6d1SVijay Mahadevan PetscFunctionBegin; 511212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 51241dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->nele; 51341dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->n; 514212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 515212ad6d1SVijay Mahadevan } 516212ad6d1SVijay Mahadevan 517212ad6d1SVijay Mahadevan 518212ad6d1SVijay Mahadevan /*@ 519212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 520212ad6d1SVijay Mahadevan 52100cc10feSVijay Mahadevan Collective on DM 522212ad6d1SVijay Mahadevan 523212ad6d1SVijay Mahadevan Input Parameter: 524212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 525212ad6d1SVijay Mahadevan 526212ad6d1SVijay Mahadevan Output Parameter: 527b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor 52800cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 52900cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 53000cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor 531212ad6d1SVijay Mahadevan 532212ad6d1SVijay Mahadevan Level: beginner 533212ad6d1SVijay Mahadevan 534212ad6d1SVijay Mahadevan .keywords: DMMoab, create 535212ad6d1SVijay Mahadevan @*/ 53641dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg) 537212ad6d1SVijay Mahadevan { 538212ad6d1SVijay Mahadevan PetscFunctionBegin; 539212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 54041dd5348SVijay Mahadevan if(nel) *nel = ((DM_Moab*)dm->data)->neleloc; 54141dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->neleghost; 54241dd5348SVijay Mahadevan if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 54341dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 544212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 545212ad6d1SVijay Mahadevan } 546212ad6d1SVijay Mahadevan 547212ad6d1SVijay Mahadevan 54800cc10feSVijay Mahadevan /*@ 54900cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 55000cc10feSVijay Mahadevan 55100cc10feSVijay Mahadevan Collective on MPI_Comm 55200cc10feSVijay Mahadevan 55300cc10feSVijay Mahadevan Input Parameter: 55400cc10feSVijay Mahadevan . dm - The DMMoab object being set 55500cc10feSVijay Mahadevan 55600cc10feSVijay Mahadevan Output Parameter: 55700cc10feSVijay Mahadevan . offset - The local offset for the global vector 55800cc10feSVijay Mahadevan 55900cc10feSVijay Mahadevan Level: beginner 56000cc10feSVijay Mahadevan 56100cc10feSVijay Mahadevan .keywords: DMMoab, create 56200cc10feSVijay Mahadevan @*/ 56300cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset) 56400cc10feSVijay Mahadevan { 56500cc10feSVijay Mahadevan PetscFunctionBegin; 56600cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 56700cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 56800cc10feSVijay Mahadevan PetscFunctionReturn(0); 56900cc10feSVijay Mahadevan } 57000cc10feSVijay Mahadevan 57100cc10feSVijay Mahadevan 5724920ab11SVijay Mahadevan /*@ 5734920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 5744920ab11SVijay Mahadevan 5754920ab11SVijay Mahadevan Collective on MPI_Comm 5764920ab11SVijay Mahadevan 5774920ab11SVijay Mahadevan Input Parameter: 578340f3b9aSVijay Mahadevan . dm - The DMMoab object 5794920ab11SVijay Mahadevan 5804920ab11SVijay Mahadevan Output Parameter: 5814920ab11SVijay Mahadevan . dim - The dimension of DM 5824920ab11SVijay Mahadevan 5834920ab11SVijay Mahadevan Level: beginner 5844920ab11SVijay Mahadevan 5854920ab11SVijay Mahadevan .keywords: DMMoab, create 5864920ab11SVijay Mahadevan @*/ 5874920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 5884920ab11SVijay Mahadevan { 5894920ab11SVijay Mahadevan PetscFunctionBegin; 5904920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5914920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 5924920ab11SVijay Mahadevan PetscFunctionReturn(0); 5934920ab11SVijay Mahadevan } 5944920ab11SVijay Mahadevan 5954920ab11SVijay Mahadevan 596340f3b9aSVijay Mahadevan /*@ 597340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 598340f3b9aSVijay Mahadevan 599340f3b9aSVijay Mahadevan Collective on MPI_Comm 600340f3b9aSVijay Mahadevan 601340f3b9aSVijay Mahadevan Input Parameter: 602340f3b9aSVijay Mahadevan . dm - The DMMoab object 603340f3b9aSVijay Mahadevan . ehandle - The element entity handle 604340f3b9aSVijay Mahadevan 605340f3b9aSVijay Mahadevan Output Parameter: 606340f3b9aSVijay Mahadevan . mat - The material ID for the current entity 607340f3b9aSVijay Mahadevan 608340f3b9aSVijay Mahadevan Level: beginner 609340f3b9aSVijay Mahadevan 610340f3b9aSVijay Mahadevan .keywords: DMMoab, create 611340f3b9aSVijay Mahadevan @*/ 612340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat) 613340f3b9aSVijay Mahadevan { 614340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 615340f3b9aSVijay Mahadevan moab::ErrorCode merr; 616340f3b9aSVijay Mahadevan 617340f3b9aSVijay Mahadevan PetscFunctionBegin; 618340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 619340f3b9aSVijay Mahadevan if (*mat) { 620340f3b9aSVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 62163cd93b2SVijay Mahadevan merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr); 622340f3b9aSVijay Mahadevan } 623340f3b9aSVijay Mahadevan PetscFunctionReturn(0); 624340f3b9aSVijay Mahadevan } 625340f3b9aSVijay Mahadevan 6264920ab11SVijay Mahadevan 62785d305f5SVijay Mahadevan /*@ 62885d305f5SVijay Mahadevan DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities 62985d305f5SVijay Mahadevan 63085d305f5SVijay Mahadevan Collective on MPI_Comm 63185d305f5SVijay Mahadevan 63285d305f5SVijay Mahadevan Input Parameter: 63385d305f5SVijay Mahadevan . dm - The DMMoab object 63485d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 63585d305f5SVijay Mahadevan . conn - The vertex entity handles 63685d305f5SVijay Mahadevan 63785d305f5SVijay Mahadevan Output Parameter: 63885d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities 63985d305f5SVijay Mahadevan 64085d305f5SVijay Mahadevan Level: beginner 64185d305f5SVijay Mahadevan 64285d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity() 64385d305f5SVijay Mahadevan @*/ 644cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscReal *vpos) 6457023aa44SVijay Mahadevan { 6467023aa44SVijay Mahadevan DM_Moab *dmmoab; 6477023aa44SVijay Mahadevan PetscErrorCode ierr; 6487023aa44SVijay Mahadevan moab::ErrorCode merr; 6497023aa44SVijay Mahadevan 6507023aa44SVijay Mahadevan PetscFunctionBegin; 6517023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6527023aa44SVijay Mahadevan PetscValidPointer(conn,3); 6537023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6547023aa44SVijay Mahadevan 6557023aa44SVijay Mahadevan if (!vpos) { 6567ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr); 6577023aa44SVijay Mahadevan } 6587023aa44SVijay Mahadevan 6597023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6607023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 6617023aa44SVijay Mahadevan PetscFunctionReturn(0); 6627023aa44SVijay Mahadevan } 6637023aa44SVijay Mahadevan 6647023aa44SVijay Mahadevan 66585d305f5SVijay Mahadevan /*@ 66685d305f5SVijay Mahadevan DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity 66785d305f5SVijay Mahadevan 66885d305f5SVijay Mahadevan Collective on MPI_Comm 66985d305f5SVijay Mahadevan 67085d305f5SVijay Mahadevan Input Parameter: 67185d305f5SVijay Mahadevan . dm - The DMMoab object 67285d305f5SVijay Mahadevan . vhandle - Vertex entity handle 67385d305f5SVijay Mahadevan 67485d305f5SVijay Mahadevan Output Parameter: 67585d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 67685d305f5SVijay Mahadevan . conn - The vertex entity handles 67785d305f5SVijay Mahadevan 67885d305f5SVijay Mahadevan Level: beginner 67985d305f5SVijay Mahadevan 68085d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity() 68185d305f5SVijay Mahadevan @*/ 68285d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt* nconn, moab::EntityHandle **conn) 6838d8d51c8SVijay Mahadevan { 6848d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 6858d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 6868d8d51c8SVijay Mahadevan PetscErrorCode ierr; 6878d8d51c8SVijay Mahadevan moab::ErrorCode merr; 6888d8d51c8SVijay Mahadevan 6898d8d51c8SVijay Mahadevan PetscFunctionBegin; 6908d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6918d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 6928d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6938d8d51c8SVijay Mahadevan 6948d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 69585d305f5SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 6968d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 6978d8d51c8SVijay Mahadevan 6988d8d51c8SVijay Mahadevan if (conn) { 6998d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 7008d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 7018d8d51c8SVijay Mahadevan } 7028d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 7038d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7048d8d51c8SVijay Mahadevan } 7058d8d51c8SVijay Mahadevan 7068d8d51c8SVijay Mahadevan 70785d305f5SVijay Mahadevan /*@ 70885d305f5SVijay Mahadevan DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity 70985d305f5SVijay Mahadevan 71085d305f5SVijay Mahadevan Collective on MPI_Comm 71185d305f5SVijay Mahadevan 71285d305f5SVijay Mahadevan Input Parameter: 71385d305f5SVijay Mahadevan . dm - The DMMoab object 71485d305f5SVijay Mahadevan . vhandle - Vertex entity handle 71585d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 71685d305f5SVijay Mahadevan . conn - The vertex entity handles 71785d305f5SVijay Mahadevan 71885d305f5SVijay Mahadevan Level: beginner 71985d305f5SVijay Mahadevan 72085d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity() 72185d305f5SVijay Mahadevan @*/ 7228d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 7238d8d51c8SVijay Mahadevan { 7248d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7258d8d51c8SVijay Mahadevan 7268d8d51c8SVijay Mahadevan PetscFunctionBegin; 7278d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7288d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 7298d8d51c8SVijay Mahadevan 7308d8d51c8SVijay Mahadevan if (conn) { 7318d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 7328d8d51c8SVijay Mahadevan } 7338d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 7348d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7358d8d51c8SVijay Mahadevan } 7368d8d51c8SVijay Mahadevan 7378d8d51c8SVijay Mahadevan 73885d305f5SVijay Mahadevan /*@ 73985d305f5SVijay Mahadevan DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity 74085d305f5SVijay Mahadevan 74185d305f5SVijay Mahadevan Collective on MPI_Comm 74285d305f5SVijay Mahadevan 74385d305f5SVijay Mahadevan Input Parameter: 74485d305f5SVijay Mahadevan . dm - The DMMoab object 74585d305f5SVijay Mahadevan . ehandle - Vertex entity handle 74685d305f5SVijay Mahadevan 74785d305f5SVijay Mahadevan Output Parameter: 74885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 74985d305f5SVijay Mahadevan . conn - The vertex entity handles 75085d305f5SVijay Mahadevan 75185d305f5SVijay Mahadevan Level: beginner 75285d305f5SVijay Mahadevan 75385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity() 75485d305f5SVijay Mahadevan @*/ 7557023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 7567023aa44SVijay Mahadevan { 7577023aa44SVijay Mahadevan DM_Moab *dmmoab; 7587023aa44SVijay Mahadevan const moab::EntityHandle *connect; 7597023aa44SVijay Mahadevan moab::ErrorCode merr; 7607023aa44SVijay Mahadevan PetscInt nnodes; 7617023aa44SVijay Mahadevan 7627023aa44SVijay Mahadevan PetscFunctionBegin; 7637023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7647023aa44SVijay Mahadevan PetscValidPointer(conn,4); 7657023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7667023aa44SVijay Mahadevan 7677023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7687023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 7697023aa44SVijay Mahadevan if (conn) *conn=connect; 7707023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 7717023aa44SVijay Mahadevan PetscFunctionReturn(0); 7727023aa44SVijay Mahadevan } 7737023aa44SVijay Mahadevan 7747023aa44SVijay Mahadevan 77585d305f5SVijay Mahadevan /*@ 77685d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 77785d305f5SVijay Mahadevan 77885d305f5SVijay Mahadevan Collective on MPI_Comm 77985d305f5SVijay Mahadevan 78085d305f5SVijay Mahadevan Input Parameter: 78185d305f5SVijay Mahadevan . dm - The DMMoab object 78285d305f5SVijay Mahadevan . ent - Entity handle 78385d305f5SVijay Mahadevan 78485d305f5SVijay Mahadevan Output Parameter: 78585d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 78685d305f5SVijay Mahadevan 78785d305f5SVijay Mahadevan Level: beginner 78885d305f5SVijay Mahadevan 78985d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices() 79085d305f5SVijay Mahadevan @*/ 79169263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 79269263071SVijay Mahadevan { 79369263071SVijay Mahadevan moab::EntityType etype; 79469263071SVijay Mahadevan DM_Moab *dmmoab; 79569263071SVijay Mahadevan PetscInt edim; 79669263071SVijay Mahadevan 79769263071SVijay Mahadevan PetscFunctionBegin; 79869263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 79969263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 80069263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 80169263071SVijay Mahadevan 80269263071SVijay Mahadevan /* get the entity type and handle accordingly */ 80369263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 80469263071SVijay 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); 80569263071SVijay Mahadevan 80669263071SVijay Mahadevan /* get the entity dimension */ 80769263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 80869263071SVijay Mahadevan 80969263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 81069263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 8116d9eb265SVijay Mahadevan if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 81269263071SVijay Mahadevan } 81369263071SVijay Mahadevan else { 81469263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 8156d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 81669263071SVijay Mahadevan } 81769263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 8186d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 81969263071SVijay Mahadevan } 82069263071SVijay Mahadevan } 82169263071SVijay Mahadevan PetscFunctionReturn(0); 82269263071SVijay Mahadevan } 82369263071SVijay Mahadevan 82469263071SVijay Mahadevan 82585d305f5SVijay Mahadevan /*@ 82685d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 82785d305f5SVijay Mahadevan 82885d305f5SVijay Mahadevan Input Parameter: 82985d305f5SVijay Mahadevan . dm - The DMMoab object 83085d305f5SVijay Mahadevan . nconn - Number of handles 83185d305f5SVijay Mahadevan . cnt - Array of entity handles 83285d305f5SVijay Mahadevan 83385d305f5SVijay Mahadevan Output Parameter: 83485d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 83585d305f5SVijay Mahadevan 83685d305f5SVijay Mahadevan Level: beginner 83785d305f5SVijay Mahadevan 83885d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary() 83985d305f5SVijay Mahadevan @*/ 84069263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 8417023aa44SVijay Mahadevan { 8427023aa44SVijay Mahadevan DM_Moab *dmmoab; 8437023aa44SVijay Mahadevan PetscInt i; 8447023aa44SVijay Mahadevan 8457023aa44SVijay Mahadevan PetscFunctionBegin; 8467023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8477023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 8487023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 8497023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8507023aa44SVijay Mahadevan 8517023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 8526d9eb265SVijay Mahadevan isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE); 8537023aa44SVijay Mahadevan } 8547023aa44SVijay Mahadevan PetscFunctionReturn(0); 8557023aa44SVijay Mahadevan } 8567023aa44SVijay Mahadevan 8577023aa44SVijay Mahadevan 85885d305f5SVijay Mahadevan /*@ 85985d305f5SVijay Mahadevan DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary 86085d305f5SVijay Mahadevan 86185d305f5SVijay Mahadevan Input Parameter: 86285d305f5SVijay Mahadevan . dm - The DMMoab object 86385d305f5SVijay Mahadevan 86485d305f5SVijay Mahadevan Output Parameter: 86585d305f5SVijay Mahadevan . bdvtx - Boundary vertices 86685d305f5SVijay Mahadevan . bdelems - Boundary elements 86785d305f5SVijay Mahadevan . bdfaces - Boundary faces 86885d305f5SVijay Mahadevan 86985d305f5SVijay Mahadevan Level: beginner 87085d305f5SVijay Mahadevan 87185d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary() 87285d305f5SVijay Mahadevan @*/ 8736d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces) 8741cec0304SVijay Mahadevan { 8751cec0304SVijay Mahadevan DM_Moab *dmmoab; 8761cec0304SVijay Mahadevan 8771cec0304SVijay Mahadevan PetscFunctionBegin; 8781cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8791cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8801cec0304SVijay Mahadevan 8816d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 8826d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 8836d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 8841cec0304SVijay Mahadevan PetscFunctionReturn(0); 8851cec0304SVijay Mahadevan } 8861cec0304SVijay Mahadevan 887f6829af0SVijay Mahadevan 888f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 889f6829af0SVijay Mahadevan { 890f6829af0SVijay Mahadevan PetscErrorCode ierr; 89185d305f5SVijay Mahadevan PetscInt i; 892f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 893f6829af0SVijay Mahadevan 894f6829af0SVijay Mahadevan PetscFunctionBegin; 895f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 896f6829af0SVijay Mahadevan if (dmmoab->icreatedinstance) { 897f6829af0SVijay Mahadevan delete dmmoab->mbiface; 898f6829af0SVijay Mahadevan } 899f6829af0SVijay Mahadevan dmmoab->mbiface = NULL; 900f6829af0SVijay Mahadevan dmmoab->pcomm = NULL; 901f6829af0SVijay Mahadevan delete dmmoab->vlocal; 902f6829af0SVijay Mahadevan delete dmmoab->vowned; 903f6829af0SVijay Mahadevan delete dmmoab->vghost; 904f6829af0SVijay Mahadevan delete dmmoab->elocal; 905f6829af0SVijay Mahadevan delete dmmoab->eghost; 906f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 907f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 908f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 909f6829af0SVijay Mahadevan 910f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 9117ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr); 9127ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->lgmap,dmmoab->llmap);CHKERRQ(ierr); 9135905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr); 9145905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr); 91585d305f5SVijay Mahadevan if (dmmoab->fieldNames) { 91685d305f5SVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 91785d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 91885d305f5SVijay Mahadevan } 91985d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 92085d305f5SVijay Mahadevan } 921f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 922f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 923f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 924f6829af0SVijay Mahadevan PetscFunctionReturn(0); 925f6829af0SVijay Mahadevan } 926f6829af0SVijay Mahadevan 927f6829af0SVijay Mahadevan 9284416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject,DM dm) 9292e4e7c01SVijay Mahadevan { 9302e4e7c01SVijay Mahadevan PetscErrorCode ierr; 9312e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 9322e4e7c01SVijay Mahadevan 9332e4e7c01SVijay Mahadevan PetscFunctionBegin; 9342e4e7c01SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 935cc310fddSBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr); 9362e4e7c01SVijay 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); 9372e4e7c01SVijay 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); 9382e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 9392e4e7c01SVijay 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); 9402e4e7c01SVijay 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); 9412e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr); 9422e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr); 9432e4e7c01SVijay Mahadevan PetscFunctionReturn(0); 9442e4e7c01SVijay Mahadevan } 9452e4e7c01SVijay Mahadevan 9462e4e7c01SVijay Mahadevan 947f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 948f6829af0SVijay Mahadevan { 949f6829af0SVijay Mahadevan PetscErrorCode ierr; 950f6829af0SVijay Mahadevan moab::ErrorCode merr; 951f6829af0SVijay Mahadevan Vec local, global; 952f6829af0SVijay Mahadevan IS from,to; 953f6829af0SVijay Mahadevan moab::Range::iterator iter; 954f6829af0SVijay Mahadevan PetscInt i,j,f,bs,gmin,lmin,lmax,vent,totsize; 955f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 956f6829af0SVijay Mahadevan moab::Range adjs; 957f6829af0SVijay Mahadevan 958f6829af0SVijay Mahadevan PetscFunctionBegin; 959f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 960f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 961*c528d872SBarry 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."); 962f6829af0SVijay Mahadevan 963f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 964f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 965f6829af0SVijay Mahadevan { 966f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 967f6829af0SVijay Mahadevan 968f6829af0SVijay Mahadevan /* filter based on parallel status */ 969f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 970f6829af0SVijay Mahadevan 971f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 972f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 973f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 974f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 975f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 976f6829af0SVijay Mahadevan 977f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 978f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 979f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 980b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 981f6829af0SVijay Mahadevan } 982f6829af0SVijay Mahadevan 983f6829af0SVijay Mahadevan { 984f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 985f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 986f6829af0SVijay Mahadevan 987f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 988f6829af0SVijay Mahadevan for (i=3;i>0;i--) { 989f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 990f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 991f6829af0SVijay Mahadevan 992f6829af0SVijay Mahadevan /* store the current mesh dimension */ 993f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 994f6829af0SVijay Mahadevan dmmoab->dim=i; 995f6829af0SVijay Mahadevan break; 996f6829af0SVijay Mahadevan } 997f6829af0SVijay Mahadevan } 998f6829af0SVijay Mahadevan 999f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 1000f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 1001f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1002f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 1003f6829af0SVijay Mahadevan 1004f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 1005f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 1006b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1007f6829af0SVijay Mahadevan } 1008f6829af0SVijay Mahadevan 1009f6829af0SVijay Mahadevan bs = dmmoab->bs; 1010f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 1011f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 1012f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 1013f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 1014f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1015f6829af0SVijay Mahadevan } 1016f6829af0SVijay Mahadevan 1017f6829af0SVijay Mahadevan totsize=dmmoab->vlocal->size(); 1018f6829af0SVijay 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); 10197ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr); 1020f6829af0SVijay Mahadevan { 1021f6829af0SVijay Mahadevan /* first get the local indices */ 1022f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 1023f6829af0SVijay Mahadevan /* next get the ghosted indices */ 1024f6829af0SVijay Mahadevan if (dmmoab->nghost) { 1025f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1026f6829af0SVijay Mahadevan } 1027f6829af0SVijay Mahadevan 1028f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1029f6829af0SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 1030f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1031f6829af0SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 1032f6829af0SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 1033f6829af0SVijay Mahadevan } 1034f6829af0SVijay Mahadevan 1035b2566f29SBarry Smith ierr = MPIU_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1036f6829af0SVijay Mahadevan 1037f6829af0SVijay Mahadevan /* set the GID map */ 1038f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1039f6829af0SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 1040f6829af0SVijay Mahadevan } 1041f6829af0SVijay Mahadevan lmin-=gmin; 1042f6829af0SVijay Mahadevan lmax-=gmin; 1043f6829af0SVijay Mahadevan 1044f6829af0SVijay Mahadevan PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 1045f6829af0SVijay Mahadevan } 104682dfd14aSVijay 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); 1047f6829af0SVijay Mahadevan 1048f6829af0SVijay Mahadevan { 10497ae5e5b6SVijay Mahadevan i=(PetscInt)dmmoab->vlocal->back()+1; 10507ae5e5b6SVijay Mahadevan //i=(PetscInt)(dmmoab->vlocal->back()-dmmoab->vlocal->front())+1; 10517ae5e5b6SVijay Mahadevan j=totsize*dmmoab->numFields; 10527ae5e5b6SVijay Mahadevan ierr = PetscMalloc2(i,&dmmoab->gidmap,i,&dmmoab->lidmap);CHKERRQ(ierr); 10537ae5e5b6SVijay Mahadevan ierr = PetscMalloc2(j,&dmmoab->lgmap,j,&dmmoab->llmap);CHKERRQ(ierr); 1054f6829af0SVijay Mahadevan 1055f6829af0SVijay Mahadevan i=j=0; 1056f6829af0SVijay Mahadevan /* set the owned vertex data first */ 1057f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 1058f6829af0SVijay Mahadevan vent=(PetscInt)(*iter); 1059f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1060f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1061f6829af0SVijay Mahadevan if (bs > 1) { 1062f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1063f6829af0SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 1064f6829af0SVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 1065f6829af0SVijay Mahadevan } 1066f6829af0SVijay Mahadevan } 1067f6829af0SVijay Mahadevan else { 1068f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1069f6829af0SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 1070f6829af0SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 1071f6829af0SVijay Mahadevan } 1072f6829af0SVijay Mahadevan } 1073f6829af0SVijay Mahadevan } 1074f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1075f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 1076f6829af0SVijay Mahadevan vent=(PetscInt)(*iter); 1077f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1078f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1079f6829af0SVijay Mahadevan if (bs > 1) { 1080f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1081f6829af0SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 1082f6829af0SVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 1083f6829af0SVijay Mahadevan } 1084f6829af0SVijay Mahadevan } 1085f6829af0SVijay Mahadevan else { 1086f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1087f6829af0SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 1088f6829af0SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 1089f6829af0SVijay Mahadevan } 1090f6829af0SVijay Mahadevan } 1091f6829af0SVijay Mahadevan } 1092f6829af0SVijay Mahadevan 1093f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1094f6829af0SVijay Mahadevan 1) First create a local and global vector 1095f6829af0SVijay Mahadevan 2) Create a local and global IS 1096f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1097f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1098f6829af0SVijay Mahadevan */ 1099f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 1100f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 1101f6829af0SVijay Mahadevan 1102f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 1103f6829af0SVijay Mahadevan PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost); 1104f6829af0SVijay Mahadevan 1105f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 1106f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr); 1107f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr); 1108f6829af0SVijay Mahadevan 1109f6829af0SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 1110f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr); 1111f6829af0SVijay Mahadevan 1112f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1113f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 111482dfd14aSVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,dmmoab->lgmap, 1115f6829af0SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 1116f6829af0SVijay Mahadevan } 1117f6829af0SVijay Mahadevan 1118f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 1119f6829af0SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 1120f6829af0SVijay Mahadevan 1121f6829af0SVijay Mahadevan /* clean up IS, Vec */ 1122f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 1123f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 1124f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 1125f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 1126f6829af0SVijay Mahadevan } 1127f6829af0SVijay Mahadevan 1128f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 1129f6829af0SVijay Mahadevan { 1130f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1131f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1132f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1133f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1134f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1135f6829af0SVijay Mahadevan 1136f6829af0SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 1137f6829af0SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 1138f6829af0SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1139f6829af0SVijay Mahadevan 1140f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 1141f6829af0SVijay 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 1142f6829af0SVijay Mahadevan 1143f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1144f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1145f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 1146f6829af0SVijay Mahadevan 1147f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1148f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 1149f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 1150f6829af0SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 1151f6829af0SVijay Mahadevan } 1152f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1153f6829af0SVijay Mahadevan } 1154f6829af0SVijay Mahadevan 1155f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1156f6829af0SVijay Mahadevan { 1157f6829af0SVijay Mahadevan PetscErrorCode ierr; 1158f6829af0SVijay Mahadevan 1159f6829af0SVijay Mahadevan PetscFunctionBegin; 1160f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1161f90c3b0eSVijay Mahadevan ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr); 1162f6829af0SVijay Mahadevan 1163f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1164f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1165f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1166f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1167f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1168f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1169f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1170f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1171*c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_map = NULL; 1172*c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_sendrecv = NULL; 1173f6829af0SVijay Mahadevan 1174f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1175f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1176f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1177f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1178f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1179f6829af0SVijay Mahadevan 1180f6829af0SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1181f6829af0SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1182f6829af0SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1183f6829af0SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1184f6829af0SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 11852e4e7c01SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1186f6829af0SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1187f6829af0SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1188f6829af0SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1189f6829af0SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1190f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1191f6829af0SVijay Mahadevan } 1192f6829af0SVijay Mahadevan 1193