1032b8ab6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I "petscdm.h" I*/ 21d72bce8STim Tautges 31d72bce8STim Tautges #include <petscdmmoab.h> 488face26SJed Brown #include <MBTagConventions.hpp> 51cec0304SVijay Mahadevan #include <moab/Skinner.hpp> 6032b8ab6SVijay Mahadevan 7fd349b41STim Tautges 8*c6ef30f9SVijay Mahadevan /*MC 9*c6ef30f9SVijay Mahadevan DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database. 10*c6ef30f9SVijay Mahadevan Direct access to the MOAB Interface and other mesh manipulation related objects are available 11*c6ef30f9SVijay Mahadevan through public API. Ability to create global and local representation of Vecs containing all 12*c6ef30f9SVijay Mahadevan unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided 13*c6ef30f9SVijay Mahadevan along with utility functions to traverse the mesh and assemble a discrete system via 14*c6ef30f9SVijay Mahadevan field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are 15*c6ef30f9SVijay Mahadevan available. 16*c6ef30f9SVijay Mahadevan 17*c6ef30f9SVijay Mahadevan Reference: http://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html 18*c6ef30f9SVijay Mahadevan 19*c6ef30f9SVijay Mahadevan Level: intermediate 20*c6ef30f9SVijay Mahadevan 21*c6ef30f9SVijay Mahadevan .seealso: DMType, DMMoabCreate(), DMCreate(), DMSetType(), DMMoabCreateMoab() 22*c6ef30f9SVijay Mahadevan M*/ 23*c6ef30f9SVijay Mahadevan 24*c6ef30f9SVijay Mahadevan 25fd349b41STim Tautges #undef __FUNCT__ 261d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 271d72bce8STim Tautges /*@ 281d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 291d72bce8STim Tautges 301d72bce8STim Tautges Collective on MPI_Comm 311d72bce8STim Tautges 321d72bce8STim Tautges Input Parameter: 331d72bce8STim Tautges . comm - The communicator for the DMMoab object 341d72bce8STim Tautges 351d72bce8STim Tautges Output Parameter: 36032b8ab6SVijay Mahadevan . dmb - The DMMoab object 371d72bce8STim Tautges 381d72bce8STim Tautges Level: beginner 391d72bce8STim Tautges 401d72bce8STim Tautges .keywords: DMMoab, create 411d72bce8STim Tautges @*/ 42032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 431d72bce8STim Tautges { 441d72bce8STim Tautges PetscErrorCode ierr; 451d72bce8STim Tautges 461d72bce8STim Tautges PetscFunctionBegin; 47032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 48032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 49032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 501d72bce8STim Tautges PetscFunctionReturn(0); 511d72bce8STim Tautges } 521d72bce8STim Tautges 531d72bce8STim Tautges #undef __FUNCT__ 54aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 551d72bce8STim Tautges /*@ 56a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 571d72bce8STim Tautges 581d72bce8STim Tautges Collective on MPI_Comm 591d72bce8STim Tautges 601d72bce8STim Tautges Input Parameter: 611d72bce8STim Tautges . comm - The communicator for the DMMoab object 62032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 63a4d2169cSTim Tautges along with the DMMoab 64a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 651d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 661d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 671d72bce8STim Tautges 681d72bce8STim Tautges Output Parameter: 69032b8ab6SVijay Mahadevan . dmb - The DMMoab object 701d72bce8STim Tautges 71032b8ab6SVijay Mahadevan Level: intermediate 721d72bce8STim Tautges 731d72bce8STim Tautges .keywords: DMMoab, create 741d72bce8STim Tautges @*/ 75032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 761d72bce8STim Tautges { 771d72bce8STim Tautges PetscErrorCode ierr; 78032b8ab6SVijay Mahadevan moab::ErrorCode merr; 791cec0304SVijay Mahadevan moab::EntityHandle partnset; 801cec0304SVijay Mahadevan PetscInt rank, nprocs; 81853cdec3SJed Brown DM_Moab *dmmoab; 821d72bce8STim Tautges 831d72bce8STim Tautges PetscFunctionBegin; 84032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 85032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 86032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 87a4d2169cSTim Tautges 88a4d2169cSTim Tautges if (!mbiface) { 8972ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 907d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 911d72bce8STim Tautges } 921cec0304SVijay Mahadevan else { 931cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 947d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 951cec0304SVijay Mahadevan } 961cec0304SVijay Mahadevan 97b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 98b5410836SVijay Mahadevan dmmoab->fileset=0; 997d89fc02STim Tautges 100a4d2169cSTim Tautges if (!pcomm) { 101032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 102032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 103032b8ab6SVijay Mahadevan 104db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 105db66d124SVijay Mahadevan to the load_file functions to be populated. */ 1060c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr); 107032b8ab6SVijay Mahadevan 108db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 10972ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 11072ff976dSVijay Mahadevan } 11172ff976dSVijay Mahadevan else { 11272ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 113032b8ab6SVijay Mahadevan } 114032b8ab6SVijay Mahadevan 1154973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 1164973de03SVijay Mahadevan dmmoab->bs = 1; 117addae81cSVijay Mahadevan dmmoab->numFields = 1; 1184973de03SVijay Mahadevan 1194973de03SVijay Mahadevan /* set global ID tag handle */ 120032b8ab6SVijay Mahadevan if (!ltog_tag) { 1214973de03SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 122032b8ab6SVijay Mahadevan } 123032b8ab6SVijay Mahadevan else { 124032b8ab6SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 125a4d2169cSTim Tautges } 126a4d2169cSTim Tautges 1274973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 128a4d2169cSTim Tautges if (range) { 1295eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 130a4d2169cSTim Tautges } 1311d72bce8STim Tautges PetscFunctionReturn(0); 1321d72bce8STim Tautges } 1331d72bce8STim Tautges 1341d72bce8STim Tautges #undef __FUNCT__ 1351d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 136aa768e4cSTim Tautges /*@ 137aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 138aa768e4cSTim Tautges 139aa768e4cSTim Tautges Collective on MPI_Comm 140aa768e4cSTim Tautges 141aa768e4cSTim Tautges Input Parameter: 142aa768e4cSTim Tautges . dm - The DMMoab object being set 143aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 144aa768e4cSTim Tautges 145aa768e4cSTim Tautges Level: beginner 146aa768e4cSTim Tautges 147aa768e4cSTim Tautges .keywords: DMMoab, create 148aa768e4cSTim Tautges @*/ 1491d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 1501d72bce8STim Tautges { 151032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 152032b8ab6SVijay Mahadevan 1531d72bce8STim Tautges PetscFunctionBegin; 1541d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1551cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 156032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 157032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 158032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 1591d72bce8STim Tautges PetscFunctionReturn(0); 1601d72bce8STim Tautges } 1611d72bce8STim Tautges 1621d72bce8STim Tautges 1631d72bce8STim Tautges #undef __FUNCT__ 1641d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 165aa768e4cSTim Tautges /*@ 166aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 167aa768e4cSTim Tautges 168aa768e4cSTim Tautges Collective on MPI_Comm 169aa768e4cSTim Tautges 170aa768e4cSTim Tautges Input Parameter: 171aa768e4cSTim Tautges . dm - The DMMoab object being set 172aa768e4cSTim Tautges 173aa768e4cSTim Tautges Output Parameter: 174aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 175aa768e4cSTim Tautges 176aa768e4cSTim Tautges Level: beginner 177aa768e4cSTim Tautges 178aa768e4cSTim Tautges .keywords: DMMoab, create 179aa768e4cSTim Tautges @*/ 1801d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 1811d72bce8STim Tautges { 1821d72bce8STim Tautges PetscFunctionBegin; 1831d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 184032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 1851d72bce8STim Tautges PetscFunctionReturn(0); 1861d72bce8STim Tautges } 1871d72bce8STim Tautges 1881d72bce8STim Tautges 1891d72bce8STim Tautges #undef __FUNCT__ 1901d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 191aa768e4cSTim Tautges /*@ 192aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 193aa768e4cSTim Tautges 194aa768e4cSTim Tautges Collective on MPI_Comm 195aa768e4cSTim Tautges 196aa768e4cSTim Tautges Input Parameter: 197aa768e4cSTim Tautges . dm - The DMMoab object being set 198aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 199aa768e4cSTim Tautges 200aa768e4cSTim Tautges Level: beginner 201aa768e4cSTim Tautges 202aa768e4cSTim Tautges .keywords: DMMoab, create 203aa768e4cSTim Tautges @*/ 204a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 2051d72bce8STim Tautges { 206032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 207032b8ab6SVijay Mahadevan 2081d72bce8STim Tautges PetscFunctionBegin; 2091d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2101cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 211032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 212032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 213032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2141d72bce8STim Tautges PetscFunctionReturn(0); 2151d72bce8STim Tautges } 2161d72bce8STim Tautges 2171d72bce8STim Tautges 2181d72bce8STim Tautges #undef __FUNCT__ 2191d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 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 2481d72bce8STim Tautges #undef __FUNCT__ 2495eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 250aa768e4cSTim Tautges /*@ 2515eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 252aa768e4cSTim Tautges 253aa768e4cSTim Tautges Collective on MPI_Comm 254aa768e4cSTim Tautges 255aa768e4cSTim Tautges Input Parameter: 256aa768e4cSTim Tautges . dm - The DMMoab object being set 257aa768e4cSTim Tautges . range - The entities treated by this DMMoab 258aa768e4cSTim Tautges 259aa768e4cSTim Tautges Level: beginner 260aa768e4cSTim Tautges 261aa768e4cSTim Tautges .keywords: DMMoab, create 262aa768e4cSTim Tautges @*/ 2635eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 2641d72bce8STim Tautges { 265032b8ab6SVijay Mahadevan moab::ErrorCode merr; 266032b8ab6SVijay Mahadevan PetscErrorCode ierr; 267fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 268032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 269032b8ab6SVijay Mahadevan 2701d72bce8STim Tautges PetscFunctionBegin; 2711d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 272032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 273032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 274fd3326ddSVijay Mahadevan 275032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 276fd3326ddSVijay Mahadevan 277fd3326ddSVijay Mahadevan /* filter based on parallel status */ 278fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 279fd3326ddSVijay Mahadevan 280fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 281fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 282fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 283fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 284fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 285fd3326ddSVijay Mahadevan 286fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 287032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 288032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 289032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 2901d72bce8STim Tautges PetscFunctionReturn(0); 2911d72bce8STim Tautges } 2921d72bce8STim Tautges 2931d72bce8STim Tautges 2941d72bce8STim Tautges #undef __FUNCT__ 2958d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices" 2968d8d51c8SVijay Mahadevan /*@ 2978d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 2988d8d51c8SVijay Mahadevan 2998d8d51c8SVijay Mahadevan Collective on MPI_Comm 3008d8d51c8SVijay Mahadevan 3018d8d51c8SVijay Mahadevan Input Parameter: 3028d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 3038d8d51c8SVijay Mahadevan 3048d8d51c8SVijay Mahadevan Output Parameter: 3058d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 3068d8d51c8SVijay Mahadevan 3078d8d51c8SVijay Mahadevan Level: beginner 3088d8d51c8SVijay Mahadevan 3098d8d51c8SVijay Mahadevan .keywords: DMMoab, create 3108d8d51c8SVijay Mahadevan @*/ 3118d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 3128d8d51c8SVijay Mahadevan { 3138d8d51c8SVijay Mahadevan PetscFunctionBegin; 3148d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3158d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 3168d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3178d8d51c8SVijay Mahadevan } 3188d8d51c8SVijay Mahadevan 3198d8d51c8SVijay Mahadevan 3208d8d51c8SVijay Mahadevan 3218d8d51c8SVijay Mahadevan #undef __FUNCT__ 3225eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 323aa768e4cSTim Tautges /*@ 3245eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 325aa768e4cSTim Tautges 326aa768e4cSTim Tautges Collective on MPI_Comm 327aa768e4cSTim Tautges 328aa768e4cSTim Tautges Input Parameter: 329aa768e4cSTim Tautges . dm - The DMMoab object being set 330aa768e4cSTim Tautges 331aa768e4cSTim Tautges Output Parameter: 3325eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 3335eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 334aa768e4cSTim Tautges 335aa768e4cSTim Tautges Level: beginner 336aa768e4cSTim Tautges 337aa768e4cSTim Tautges .keywords: DMMoab, create 338aa768e4cSTim Tautges @*/ 339351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost) 3401d72bce8STim Tautges { 3411d72bce8STim Tautges PetscFunctionBegin; 3421d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 343351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 344351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3451d72bce8STim Tautges PetscFunctionReturn(0); 3461d72bce8STim Tautges } 3471d72bce8STim Tautges 3481d72bce8STim Tautges #undef __FUNCT__ 3495eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 3505eb88e9dSVijay Mahadevan /*@ 3515eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3525eb88e9dSVijay Mahadevan 3535eb88e9dSVijay Mahadevan Collective on MPI_Comm 3545eb88e9dSVijay Mahadevan 3555eb88e9dSVijay Mahadevan Input Parameter: 3565eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 3575eb88e9dSVijay Mahadevan 3585eb88e9dSVijay Mahadevan Output Parameter: 3595eb88e9dSVijay Mahadevan . range - The entities owned locally 3605eb88e9dSVijay Mahadevan 3615eb88e9dSVijay Mahadevan Level: beginner 3625eb88e9dSVijay Mahadevan 3635eb88e9dSVijay Mahadevan .keywords: DMMoab, create 3645eb88e9dSVijay Mahadevan @*/ 365351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range) 3665eb88e9dSVijay Mahadevan { 3675eb88e9dSVijay Mahadevan PetscFunctionBegin; 3685eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 369351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 3701cec0304SVijay Mahadevan PetscFunctionReturn(0); 3711cec0304SVijay Mahadevan } 3721cec0304SVijay Mahadevan 3731cec0304SVijay Mahadevan 3741cec0304SVijay Mahadevan #undef __FUNCT__ 3751cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 3761cec0304SVijay Mahadevan /*@ 3771cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 3781cec0304SVijay Mahadevan 3791cec0304SVijay Mahadevan Collective on MPI_Comm 3801cec0304SVijay Mahadevan 3811cec0304SVijay Mahadevan Input Parameter: 3821cec0304SVijay Mahadevan . dm - The DMMoab object being set 3831cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 3841cec0304SVijay Mahadevan 3851cec0304SVijay Mahadevan Level: beginner 3861cec0304SVijay Mahadevan 3871cec0304SVijay Mahadevan .keywords: DMMoab, create 3881cec0304SVijay Mahadevan @*/ 3891cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 3901cec0304SVijay Mahadevan { 3911cec0304SVijay Mahadevan moab::ErrorCode merr; 3921cec0304SVijay Mahadevan PetscErrorCode ierr; 3931cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 3941cec0304SVijay Mahadevan 3951cec0304SVijay Mahadevan PetscFunctionBegin; 3961cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3971cec0304SVijay Mahadevan dmmoab->elocal->clear(); 3981cec0304SVijay Mahadevan dmmoab->eghost->clear(); 3991cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 4001cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 4011cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 4021cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 40341dd5348SVijay Mahadevan dmmoab->neleghost=dmmoab->eghost->size(); 4041cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4058cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 4065eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 4075eb88e9dSVijay Mahadevan } 4085eb88e9dSVijay Mahadevan 4095eb88e9dSVijay Mahadevan 4105eb88e9dSVijay Mahadevan #undef __FUNCT__ 4111d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 412aa768e4cSTim Tautges /*@ 413aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 414aa768e4cSTim Tautges 415aa768e4cSTim Tautges Collective on MPI_Comm 416aa768e4cSTim Tautges 417aa768e4cSTim Tautges Input Parameter: 418aa768e4cSTim Tautges . dm - The DMMoab object being set 419aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 420aa768e4cSTim Tautges 421aa768e4cSTim Tautges Level: beginner 422aa768e4cSTim Tautges 423aa768e4cSTim Tautges .keywords: DMMoab, create 424aa768e4cSTim Tautges @*/ 4251d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 4261d72bce8STim Tautges { 4271d72bce8STim Tautges PetscFunctionBegin; 4281d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4291d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4301d72bce8STim Tautges PetscFunctionReturn(0); 4311d72bce8STim Tautges } 4321d72bce8STim Tautges 4331d72bce8STim Tautges 4341d72bce8STim Tautges #undef __FUNCT__ 4351d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 436aa768e4cSTim Tautges /*@ 437aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 438aa768e4cSTim Tautges 439aa768e4cSTim Tautges Collective on MPI_Comm 440aa768e4cSTim Tautges 441aa768e4cSTim Tautges Input Parameter: 442aa768e4cSTim Tautges . dm - The DMMoab object being set 443aa768e4cSTim Tautges 444aa768e4cSTim Tautges Output Parameter: 445aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 446aa768e4cSTim Tautges 447aa768e4cSTim Tautges Level: beginner 448aa768e4cSTim Tautges 449aa768e4cSTim Tautges .keywords: DMMoab, create 450aa768e4cSTim Tautges @*/ 4511d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 4521d72bce8STim Tautges { 4531d72bce8STim Tautges PetscFunctionBegin; 4541d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4551d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4561d72bce8STim Tautges PetscFunctionReturn(0); 4571d72bce8STim Tautges } 4581d72bce8STim Tautges 4591d72bce8STim Tautges 4601d72bce8STim Tautges #undef __FUNCT__ 4611d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 462aa768e4cSTim Tautges /*@ 463aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 464aa768e4cSTim Tautges 465aa768e4cSTim Tautges Collective on MPI_Comm 466aa768e4cSTim Tautges 467aa768e4cSTim Tautges Input Parameter: 468aa768e4cSTim Tautges . dm - The DMMoab object being set 469aa768e4cSTim Tautges . bs - The block size used with this DMMoab 470aa768e4cSTim Tautges 471aa768e4cSTim Tautges Level: beginner 472aa768e4cSTim Tautges 473aa768e4cSTim Tautges .keywords: DMMoab, create 474aa768e4cSTim Tautges @*/ 4751d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 4761d72bce8STim Tautges { 4771d72bce8STim Tautges PetscFunctionBegin; 4781d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4791d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4801d72bce8STim Tautges PetscFunctionReturn(0); 4811d72bce8STim Tautges } 4821d72bce8STim Tautges 4831d72bce8STim Tautges 4841d72bce8STim Tautges #undef __FUNCT__ 4851d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 486aa768e4cSTim Tautges /*@ 487aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 488aa768e4cSTim Tautges 489aa768e4cSTim Tautges Collective on MPI_Comm 490aa768e4cSTim Tautges 491aa768e4cSTim Tautges Input Parameter: 492aa768e4cSTim Tautges . dm - The DMMoab object being set 493aa768e4cSTim Tautges 494aa768e4cSTim Tautges Output Parameter: 495aa768e4cSTim Tautges . bs - The block size used with this DMMoab 496aa768e4cSTim Tautges 497aa768e4cSTim Tautges Level: beginner 498aa768e4cSTim Tautges 499aa768e4cSTim Tautges .keywords: DMMoab, create 500aa768e4cSTim Tautges @*/ 5011d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 5021d72bce8STim Tautges { 5031d72bce8STim Tautges PetscFunctionBegin; 5041d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5051d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 5061d72bce8STim Tautges PetscFunctionReturn(0); 5071d72bce8STim Tautges } 5081d72bce8STim Tautges 5091cec0304SVijay Mahadevan 5101cec0304SVijay Mahadevan #undef __FUNCT__ 511212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize" 512212ad6d1SVijay Mahadevan /*@ 513212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 514212ad6d1SVijay Mahadevan 51500cc10feSVijay Mahadevan Collective on DM 516212ad6d1SVijay Mahadevan 517212ad6d1SVijay Mahadevan Input Parameter: 518212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 519212ad6d1SVijay Mahadevan 520212ad6d1SVijay Mahadevan Output Parameter: 52100cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance 52200cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance 523212ad6d1SVijay Mahadevan 524212ad6d1SVijay Mahadevan Level: beginner 525212ad6d1SVijay Mahadevan 526212ad6d1SVijay Mahadevan .keywords: DMMoab, create 527212ad6d1SVijay Mahadevan @*/ 52841dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg) 529212ad6d1SVijay Mahadevan { 530212ad6d1SVijay Mahadevan PetscFunctionBegin; 531212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 53241dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->nele; 53341dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->n; 534212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 535212ad6d1SVijay Mahadevan } 536212ad6d1SVijay Mahadevan 537212ad6d1SVijay Mahadevan 538212ad6d1SVijay Mahadevan #undef __FUNCT__ 539212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize" 540212ad6d1SVijay Mahadevan /*@ 541212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 542212ad6d1SVijay Mahadevan 54300cc10feSVijay Mahadevan Collective on DM 544212ad6d1SVijay Mahadevan 545212ad6d1SVijay Mahadevan Input Parameter: 546212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 547212ad6d1SVijay Mahadevan 548212ad6d1SVijay Mahadevan Output Parameter: 54900cc10feSVijay Mahadevan . nel - The number of owned elements in this processor 55000cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 55100cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 55200cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor 553212ad6d1SVijay Mahadevan 554212ad6d1SVijay Mahadevan Level: beginner 555212ad6d1SVijay Mahadevan 556212ad6d1SVijay Mahadevan .keywords: DMMoab, create 557212ad6d1SVijay Mahadevan @*/ 55841dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg) 559212ad6d1SVijay Mahadevan { 560212ad6d1SVijay Mahadevan PetscFunctionBegin; 561212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 56241dd5348SVijay Mahadevan if(nel) *nel = ((DM_Moab*)dm->data)->neleloc; 56341dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->neleghost; 56441dd5348SVijay Mahadevan if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 56541dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 566212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 567212ad6d1SVijay Mahadevan } 568212ad6d1SVijay Mahadevan 569212ad6d1SVijay Mahadevan 570212ad6d1SVijay Mahadevan #undef __FUNCT__ 57100cc10feSVijay Mahadevan #define __FUNCT__ "DMMoabGetOffset" 57200cc10feSVijay Mahadevan /*@ 57300cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 57400cc10feSVijay Mahadevan 57500cc10feSVijay Mahadevan Collective on MPI_Comm 57600cc10feSVijay Mahadevan 57700cc10feSVijay Mahadevan Input Parameter: 57800cc10feSVijay Mahadevan . dm - The DMMoab object being set 57900cc10feSVijay Mahadevan 58000cc10feSVijay Mahadevan Output Parameter: 58100cc10feSVijay Mahadevan . offset - The local offset for the global vector 58200cc10feSVijay Mahadevan 58300cc10feSVijay Mahadevan Level: beginner 58400cc10feSVijay Mahadevan 58500cc10feSVijay Mahadevan .keywords: DMMoab, create 58600cc10feSVijay Mahadevan @*/ 58700cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset) 58800cc10feSVijay Mahadevan { 58900cc10feSVijay Mahadevan PetscFunctionBegin; 59000cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 59100cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 59200cc10feSVijay Mahadevan PetscFunctionReturn(0); 59300cc10feSVijay Mahadevan } 59400cc10feSVijay Mahadevan 59500cc10feSVijay Mahadevan 59600cc10feSVijay Mahadevan #undef __FUNCT__ 5974920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension" 5984920ab11SVijay Mahadevan /*@ 5994920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 6004920ab11SVijay Mahadevan 6014920ab11SVijay Mahadevan Collective on MPI_Comm 6024920ab11SVijay Mahadevan 6034920ab11SVijay Mahadevan Input Parameter: 6044920ab11SVijay Mahadevan . dm - The DMMoab object being set 6054920ab11SVijay Mahadevan 6064920ab11SVijay Mahadevan Output Parameter: 6074920ab11SVijay Mahadevan . dim - The dimension of DM 6084920ab11SVijay Mahadevan 6094920ab11SVijay Mahadevan Level: beginner 6104920ab11SVijay Mahadevan 6114920ab11SVijay Mahadevan .keywords: DMMoab, create 6124920ab11SVijay Mahadevan @*/ 6134920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 6144920ab11SVijay Mahadevan { 6154920ab11SVijay Mahadevan PetscFunctionBegin; 6164920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6174920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 6184920ab11SVijay Mahadevan PetscFunctionReturn(0); 6194920ab11SVijay Mahadevan } 6204920ab11SVijay Mahadevan 6214920ab11SVijay Mahadevan 6224920ab11SVijay Mahadevan 6234920ab11SVijay Mahadevan #undef __FUNCT__ 6247023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 6257023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 6267023aa44SVijay Mahadevan { 6277023aa44SVijay Mahadevan DM_Moab *dmmoab; 6287023aa44SVijay Mahadevan PetscErrorCode ierr; 6297023aa44SVijay Mahadevan moab::ErrorCode merr; 6307023aa44SVijay Mahadevan 6317023aa44SVijay Mahadevan PetscFunctionBegin; 6327023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6337023aa44SVijay Mahadevan PetscValidPointer(conn,3); 6347023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6357023aa44SVijay Mahadevan 6367023aa44SVijay Mahadevan if (!vpos) { 6377023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 6387023aa44SVijay Mahadevan } 6397023aa44SVijay Mahadevan 6407023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6417023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 6427023aa44SVijay Mahadevan PetscFunctionReturn(0); 6437023aa44SVijay Mahadevan } 6447023aa44SVijay Mahadevan 6457023aa44SVijay Mahadevan 6467023aa44SVijay Mahadevan #undef __FUNCT__ 6478d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity" 6488d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 6498d8d51c8SVijay Mahadevan { 6508d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 6518d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 6528d8d51c8SVijay Mahadevan PetscErrorCode ierr; 6538d8d51c8SVijay Mahadevan moab::ErrorCode merr; 6548d8d51c8SVijay Mahadevan 6558d8d51c8SVijay Mahadevan PetscFunctionBegin; 6568d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6578d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 6588d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6598d8d51c8SVijay Mahadevan 6608d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6618d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 6628d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 6638d8d51c8SVijay Mahadevan 6648d8d51c8SVijay Mahadevan if (conn) { 6658d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 6668d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 6678d8d51c8SVijay Mahadevan } 6688d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 6698d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 6708d8d51c8SVijay Mahadevan } 6718d8d51c8SVijay Mahadevan 6728d8d51c8SVijay Mahadevan 6738d8d51c8SVijay Mahadevan #undef __FUNCT__ 6748d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity" 6758d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 6768d8d51c8SVijay Mahadevan { 6778d8d51c8SVijay Mahadevan PetscErrorCode ierr; 6788d8d51c8SVijay Mahadevan 6798d8d51c8SVijay Mahadevan PetscFunctionBegin; 6808d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6818d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 6828d8d51c8SVijay Mahadevan 6838d8d51c8SVijay Mahadevan if (conn) { 6848d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 6858d8d51c8SVijay Mahadevan } 6868d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 6878d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 6888d8d51c8SVijay Mahadevan } 6898d8d51c8SVijay Mahadevan 6908d8d51c8SVijay Mahadevan 6918d8d51c8SVijay Mahadevan 6928d8d51c8SVijay Mahadevan #undef __FUNCT__ 6937023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 6947023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 6957023aa44SVijay Mahadevan { 6967023aa44SVijay Mahadevan DM_Moab *dmmoab; 6977023aa44SVijay Mahadevan const moab::EntityHandle *connect; 6987023aa44SVijay Mahadevan moab::ErrorCode merr; 6997023aa44SVijay Mahadevan PetscInt nnodes; 7007023aa44SVijay Mahadevan 7017023aa44SVijay Mahadevan PetscFunctionBegin; 7027023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7037023aa44SVijay Mahadevan PetscValidPointer(conn,4); 7047023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7057023aa44SVijay Mahadevan 7067023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7077023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 7087023aa44SVijay Mahadevan if (conn) *conn=connect; 7097023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 7107023aa44SVijay Mahadevan PetscFunctionReturn(0); 7117023aa44SVijay Mahadevan } 7127023aa44SVijay Mahadevan 7137023aa44SVijay Mahadevan 7147023aa44SVijay Mahadevan #undef __FUNCT__ 71569263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 71669263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 71769263071SVijay Mahadevan { 71869263071SVijay Mahadevan moab::EntityType etype; 71969263071SVijay Mahadevan DM_Moab *dmmoab; 72069263071SVijay Mahadevan PetscInt edim; 72169263071SVijay Mahadevan 72269263071SVijay Mahadevan PetscFunctionBegin; 72369263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 72469263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 72569263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 72669263071SVijay Mahadevan 72769263071SVijay Mahadevan /* get the entity type and handle accordingly */ 72869263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 72969263071SVijay 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); 73069263071SVijay Mahadevan 73169263071SVijay Mahadevan /* get the entity dimension */ 73269263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 73369263071SVijay Mahadevan 73469263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 73569263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 7366d9eb265SVijay Mahadevan if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 73769263071SVijay Mahadevan } 73869263071SVijay Mahadevan else { 73969263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 7406d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 74169263071SVijay Mahadevan } 74269263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 7436d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 74469263071SVijay Mahadevan } 74569263071SVijay Mahadevan } 74669263071SVijay Mahadevan PetscFunctionReturn(0); 74769263071SVijay Mahadevan } 74869263071SVijay Mahadevan 74969263071SVijay Mahadevan 75069263071SVijay Mahadevan #undef __FUNCT__ 7517023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 75269263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 7537023aa44SVijay Mahadevan { 7547023aa44SVijay Mahadevan DM_Moab *dmmoab; 7557023aa44SVijay Mahadevan PetscInt i; 7567023aa44SVijay Mahadevan 7577023aa44SVijay Mahadevan PetscFunctionBegin; 7587023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7597023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 7607023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 7617023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7627023aa44SVijay Mahadevan 7637023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 7646d9eb265SVijay Mahadevan isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE); 7657023aa44SVijay Mahadevan } 7667023aa44SVijay Mahadevan PetscFunctionReturn(0); 7677023aa44SVijay Mahadevan } 7687023aa44SVijay Mahadevan 7697023aa44SVijay Mahadevan 7707023aa44SVijay Mahadevan #undef __FUNCT__ 7710c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers" 7726d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces) 7731cec0304SVijay Mahadevan { 7741cec0304SVijay Mahadevan DM_Moab *dmmoab; 7751cec0304SVijay Mahadevan 7761cec0304SVijay Mahadevan PetscFunctionBegin; 7771cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7781cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7791cec0304SVijay Mahadevan 7806d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 7816d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 7826d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 7831cec0304SVijay Mahadevan PetscFunctionReturn(0); 7841cec0304SVijay Mahadevan } 7851cec0304SVijay Mahadevan 786f6829af0SVijay Mahadevan 787f6829af0SVijay Mahadevan #undef __FUNCT__ 788f6829af0SVijay Mahadevan #define __FUNCT__ "DMDestroy_Moab" 789f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 790f6829af0SVijay Mahadevan { 791f6829af0SVijay Mahadevan PetscErrorCode ierr; 792f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 793f6829af0SVijay Mahadevan 794f6829af0SVijay Mahadevan PetscFunctionBegin; 795f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 796f6829af0SVijay Mahadevan if (dmmoab->icreatedinstance) { 797f6829af0SVijay Mahadevan delete dmmoab->mbiface; 798f6829af0SVijay Mahadevan } 799f6829af0SVijay Mahadevan dmmoab->mbiface = NULL; 800f6829af0SVijay Mahadevan dmmoab->pcomm = NULL; 801f6829af0SVijay Mahadevan delete dmmoab->vlocal; 802f6829af0SVijay Mahadevan delete dmmoab->vowned; 803f6829af0SVijay Mahadevan delete dmmoab->vghost; 804f6829af0SVijay Mahadevan delete dmmoab->elocal; 805f6829af0SVijay Mahadevan delete dmmoab->eghost; 806f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 807f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 808f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 809f6829af0SVijay Mahadevan 810f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 811f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->lidmap);CHKERRQ(ierr); 812f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gidmap);CHKERRQ(ierr); 813f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->llmap);CHKERRQ(ierr); 814f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->lgmap);CHKERRQ(ierr); 815f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 816f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 817f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 818f6829af0SVijay Mahadevan PetscFunctionReturn(0); 819f6829af0SVijay Mahadevan } 820f6829af0SVijay Mahadevan 821f6829af0SVijay Mahadevan 822f6829af0SVijay Mahadevan #undef __FUNCT__ 823f6829af0SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab" 824f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 825f6829af0SVijay Mahadevan { 826f6829af0SVijay Mahadevan PetscErrorCode ierr; 827f6829af0SVijay Mahadevan moab::ErrorCode merr; 828f6829af0SVijay Mahadevan Vec local, global; 829f6829af0SVijay Mahadevan IS from,to; 830f6829af0SVijay Mahadevan moab::Range::iterator iter; 831f6829af0SVijay Mahadevan PetscInt i,j,f,bs,gmin,lmin,lmax,vent,totsize; 832f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 833f6829af0SVijay Mahadevan moab::Range adjs; 834f6829af0SVijay Mahadevan 835f6829af0SVijay Mahadevan PetscFunctionBegin; 836f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 837f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 838f6829af0SVijay Mahadevan if (dmmoab->mbiface == PETSC_NULL || dmmoab->pcomm == PETSC_NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp."); 839f6829af0SVijay Mahadevan 840f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 841f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 842f6829af0SVijay Mahadevan { 843f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 844f6829af0SVijay Mahadevan 845f6829af0SVijay Mahadevan /* filter based on parallel status */ 846f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 847f6829af0SVijay Mahadevan 848f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 849f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 850f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 851f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 852f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 853f6829af0SVijay Mahadevan 854f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 855f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 856f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 857f6829af0SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 858f6829af0SVijay Mahadevan } 859f6829af0SVijay Mahadevan 860f6829af0SVijay Mahadevan { 861f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 862f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 863f6829af0SVijay Mahadevan 864f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 865f6829af0SVijay Mahadevan for (i=3;i>0;i--) { 866f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 867f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 868f6829af0SVijay Mahadevan 869f6829af0SVijay Mahadevan /* store the current mesh dimension */ 870f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 871f6829af0SVijay Mahadevan dmmoab->dim=i; 872f6829af0SVijay Mahadevan break; 873f6829af0SVijay Mahadevan } 874f6829af0SVijay Mahadevan } 875f6829af0SVijay Mahadevan 876f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 877f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 878f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 879f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 880f6829af0SVijay Mahadevan 881f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 882f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 883f6829af0SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 884f6829af0SVijay Mahadevan } 885f6829af0SVijay Mahadevan 886f6829af0SVijay Mahadevan bs = dmmoab->bs; 887f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 888f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 889f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 890f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 891f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 892f6829af0SVijay Mahadevan } 893f6829af0SVijay Mahadevan 894f6829af0SVijay Mahadevan totsize=dmmoab->vlocal->size(); 895f6829af0SVijay 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); 896f6829af0SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr); 897f6829af0SVijay Mahadevan { 898f6829af0SVijay Mahadevan /* first get the local indices */ 899f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 900f6829af0SVijay Mahadevan /* next get the ghosted indices */ 901f6829af0SVijay Mahadevan if (dmmoab->nghost) { 902f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 903f6829af0SVijay Mahadevan } 904f6829af0SVijay Mahadevan 905f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 906f6829af0SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 907f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 908f6829af0SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 909f6829af0SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 910f6829af0SVijay Mahadevan } 911f6829af0SVijay Mahadevan 912f6829af0SVijay Mahadevan ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 913f6829af0SVijay Mahadevan 914f6829af0SVijay Mahadevan /* set the GID map */ 915f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 916f6829af0SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 917f6829af0SVijay Mahadevan } 918f6829af0SVijay Mahadevan lmin-=gmin; 919f6829af0SVijay Mahadevan lmax-=gmin; 920f6829af0SVijay Mahadevan 921f6829af0SVijay Mahadevan PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 922f6829af0SVijay Mahadevan } 923f6829af0SVijay Mahadevan 924f6829af0SVijay Mahadevan { 925f6829af0SVijay Mahadevan ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr); 926f6829af0SVijay Mahadevan ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr); 927f6829af0SVijay Mahadevan ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->llmap);CHKERRQ(ierr); 928f6829af0SVijay Mahadevan ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr); 929f6829af0SVijay Mahadevan 930f6829af0SVijay Mahadevan i=j=0; 931f6829af0SVijay Mahadevan /* set the owned vertex data first */ 932f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 933f6829af0SVijay Mahadevan vent=(PetscInt)(*iter); 934f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 935f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 936f6829af0SVijay Mahadevan if (bs > 1) { 937f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 938f6829af0SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 939f6829af0SVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 940f6829af0SVijay Mahadevan } 941f6829af0SVijay Mahadevan } 942f6829af0SVijay Mahadevan else { 943f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 944f6829af0SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 945f6829af0SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 946f6829af0SVijay Mahadevan } 947f6829af0SVijay Mahadevan } 948f6829af0SVijay Mahadevan } 949f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 950f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 951f6829af0SVijay Mahadevan vent=(PetscInt)(*iter); 952f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 953f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 954f6829af0SVijay Mahadevan if (bs > 1) { 955f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 956f6829af0SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 957f6829af0SVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 958f6829af0SVijay Mahadevan } 959f6829af0SVijay Mahadevan } 960f6829af0SVijay Mahadevan else { 961f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 962f6829af0SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 963f6829af0SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 964f6829af0SVijay Mahadevan } 965f6829af0SVijay Mahadevan } 966f6829af0SVijay Mahadevan } 967f6829af0SVijay Mahadevan 968f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 969f6829af0SVijay Mahadevan 1) First create a local and global vector 970f6829af0SVijay Mahadevan 2) Create a local and global IS 971f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 972f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 973f6829af0SVijay Mahadevan */ 974f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 975f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 976f6829af0SVijay Mahadevan 977f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 978f6829af0SVijay Mahadevan PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost); 979f6829af0SVijay Mahadevan 980f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 981f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr); 982f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr); 983f6829af0SVijay Mahadevan 984f6829af0SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 985f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr); 986f6829af0SVijay Mahadevan 987f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 988f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 989f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->numFields,dmmoab->lgmap, 990f6829af0SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 991f6829af0SVijay Mahadevan } 992f6829af0SVijay Mahadevan 993f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 994f6829af0SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 995f6829af0SVijay Mahadevan 996f6829af0SVijay Mahadevan /* clean up IS, Vec */ 997f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 998f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 999f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 1000f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 1001f6829af0SVijay Mahadevan } 1002f6829af0SVijay Mahadevan 1003f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 1004f6829af0SVijay Mahadevan { 1005f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1006f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1007f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1008f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1009f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1010f6829af0SVijay Mahadevan 1011f6829af0SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 1012f6829af0SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 1013f6829af0SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1014f6829af0SVijay Mahadevan 1015f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 1016f6829af0SVijay 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 1017f6829af0SVijay Mahadevan 1018f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1019f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1020f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 1021f6829af0SVijay Mahadevan 1022f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1023f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 1024f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 1025f6829af0SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 1026f6829af0SVijay Mahadevan } 1027f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1028f6829af0SVijay Mahadevan } 1029f6829af0SVijay Mahadevan 1030f6829af0SVijay Mahadevan 1031f6829af0SVijay Mahadevan #undef __FUNCT__ 1032f6829af0SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab" 1033f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1034f6829af0SVijay Mahadevan { 1035f6829af0SVijay Mahadevan PetscErrorCode ierr; 1036f6829af0SVijay Mahadevan 1037f6829af0SVijay Mahadevan PetscFunctionBegin; 1038f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1039f6829af0SVijay Mahadevan ierr = PetscNewLog(dm,DM_Moab,&dm->data);CHKERRQ(ierr); 1040f6829af0SVijay Mahadevan 1041f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1042f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1043f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1044f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1045f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1046f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1047f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1048f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1049f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 1050f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 1051f6829af0SVijay Mahadevan 1052f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1053f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1054f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1055f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1056f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1057f6829af0SVijay Mahadevan 1058f6829af0SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1059f6829af0SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1060f6829af0SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1061f6829af0SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1062f6829af0SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 1063f6829af0SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1064f6829af0SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1065f6829af0SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1066f6829af0SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1067f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1068f6829af0SVijay Mahadevan } 1069f6829af0SVijay Mahadevan 1070