1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 21d72bce8STim Tautges 31d72bce8STim Tautges #include <petscdmmoab.h> 488face26SJed Brown #include <MBTagConventions.hpp> 59daf19fdSVijay Mahadevan #include <moab/NestedRefine.hpp> 61cec0304SVijay Mahadevan #include <moab/Skinner.hpp> 7032b8ab6SVijay Mahadevan 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 17a8d69d7bSBarry Smith Reference: https://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 24304006b3SVijay Mahadevan /* External function declarations here */ 25304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling); 26304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm); 27304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J); 28304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm); 29304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined); 30304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened); 31304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]); 32304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm, PetscInt nlevels, DM dmCoarsened[]); 33304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm); 34304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM, Vec *); 35304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM, Vec *); 36304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J); 37304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM, Vec, InsertMode, Vec); 38304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM, Vec, InsertMode, Vec); 39304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM, Vec, InsertMode, Vec); 40304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM, Vec, InsertMode, Vec); 41304006b3SVijay Mahadevan 42304006b3SVijay Mahadevan /* Un-implemented routines */ 43304006b3SVijay Mahadevan /* 441bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMCreatelocalsection_Moab(DM dm); 45304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat); 46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer); 47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd); 48304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm); 49304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS); 50304006b3SVijay Mahadevan */ 51c6ef30f9SVijay Mahadevan 52cab5ea25SPierre Jolivet /*@C 531d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 541d72bce8STim Tautges 55d083f849SBarry Smith Collective 561d72bce8STim Tautges 571d72bce8STim Tautges Input Parameter: 581d72bce8STim Tautges . comm - The communicator for the DMMoab object 591d72bce8STim Tautges 601d72bce8STim Tautges Output Parameter: 61032b8ab6SVijay Mahadevan . dmb - The DMMoab object 621d72bce8STim Tautges 631d72bce8STim Tautges Level: beginner 641d72bce8STim Tautges 651d72bce8STim Tautges @*/ 66032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 671d72bce8STim Tautges { 681d72bce8STim Tautges PetscFunctionBegin; 69032b8ab6SVijay Mahadevan PetscValidPointer(dmb, 2); 709566063dSJacob Faibussowitsch PetscCall(DMCreate(comm, dmb)); 719566063dSJacob Faibussowitsch PetscCall(DMSetType(*dmb, DMMOAB)); 721d72bce8STim Tautges PetscFunctionReturn(0); 731d72bce8STim Tautges } 741d72bce8STim Tautges 75cab5ea25SPierre Jolivet /*@C 76b117cd09SVijay Mahadevan DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data 771d72bce8STim Tautges 78d083f849SBarry Smith Collective 791d72bce8STim Tautges 80d8d19677SJose E. Roman Input Parameters: 81a2b725a8SWilliam Gropp + comm - The communicator for the DMMoab object 82032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 83a4d2169cSTim Tautges along with the DMMoab 841d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 85a2b725a8SWilliam Gropp - range - If non-NULL, contains range of entities to which DOFs will be assigned 861d72bce8STim Tautges 871d72bce8STim Tautges Output Parameter: 88032b8ab6SVijay Mahadevan . dmb - The DMMoab object 891d72bce8STim Tautges 90032b8ab6SVijay Mahadevan Level: intermediate 911d72bce8STim Tautges 921d72bce8STim Tautges @*/ 939daf19fdSVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 941d72bce8STim Tautges { 95032b8ab6SVijay Mahadevan moab::ErrorCode merr; 9685d305f5SVijay Mahadevan DM dmmb; 97853cdec3SJed Brown DM_Moab *dmmoab; 981d72bce8STim Tautges 991d72bce8STim Tautges PetscFunctionBegin; 100032b8ab6SVijay Mahadevan PetscValidPointer(dmb, 6); 10185d305f5SVijay Mahadevan 1029566063dSJacob Faibussowitsch PetscCall(DMMoabCreate(comm, &dmmb)); 10385d305f5SVijay Mahadevan dmmoab = (DM_Moab*)(dmmb)->data; 104a4d2169cSTim Tautges 105a4d2169cSTim Tautges if (!mbiface) { 10672ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 1077d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 1081d72bce8STim Tautges } 1091cec0304SVijay Mahadevan else { 1101cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 1117d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 1121cec0304SVijay Mahadevan } 1131cec0304SVijay Mahadevan 114b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 115b5410836SVijay Mahadevan dmmoab->fileset = 0; 116b117cd09SVijay Mahadevan dmmoab->hlevel = 0; 11749d66b22SVijay Mahadevan dmmoab->nghostrings = 0; 1187d89fc02STim Tautges 1199daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1209daf19fdSVijay Mahadevan moab::EntityHandle partnset; 121032b8ab6SVijay Mahadevan 122db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 123db66d124SVijay Mahadevan to the load_file functions to be populated. */ 1240c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); MBERR("Creating partition set failed", merr); 125032b8ab6SVijay Mahadevan 126db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 12772ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 1289daf19fdSVijay Mahadevan #endif 129032b8ab6SVijay Mahadevan 1304973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 1314973de03SVijay Mahadevan dmmoab->bs = 1; 132addae81cSVijay Mahadevan dmmoab->numFields = 1; 1339566063dSJacob Faibussowitsch PetscCall(PetscMalloc(dmmoab->numFields * sizeof(char*), &dmmoab->fieldNames)); 1349566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0])); 1352e4e7c01SVijay Mahadevan dmmoab->rw_dbglevel = 0; 1362e4e7c01SVijay Mahadevan dmmoab->partition_by_rank = PETSC_FALSE; 1372e4e7c01SVijay Mahadevan dmmoab->extra_read_options[0] = '\0'; 1382e4e7c01SVijay Mahadevan dmmoab->extra_write_options[0] = '\0'; 1392e4e7c01SVijay Mahadevan dmmoab->read_mode = READ_PART; 1402e4e7c01SVijay Mahadevan dmmoab->write_mode = WRITE_PART; 1414973de03SVijay Mahadevan 1424973de03SVijay Mahadevan /* set global ID tag handle */ 1431a845d2aSVijay Mahadevan if (ltog_tag && *ltog_tag) { 1449566063dSJacob Faibussowitsch PetscCall(DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag)); 145032b8ab6SVijay Mahadevan } 146032b8ab6SVijay Mahadevan else { 1471a845d2aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr); 1481a845d2aSVijay Mahadevan if (ltog_tag) *ltog_tag = dmmoab->ltog_tag; 149a4d2169cSTim Tautges } 150a4d2169cSTim Tautges 151340f3b9aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag); MBERRNM(merr); 152340f3b9aSVijay Mahadevan 1534973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 154a4d2169cSTim Tautges if (range) { 1559566063dSJacob Faibussowitsch PetscCall(DMMoabSetLocalVertices(dmmb, range)); 156a4d2169cSTim Tautges } 15785d305f5SVijay Mahadevan *dmb = dmmb; 1581d72bce8STim Tautges PetscFunctionReturn(0); 1591d72bce8STim Tautges } 1601d72bce8STim Tautges 1619daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1621d72bce8STim Tautges 163cab5ea25SPierre Jolivet /*@C 164aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 165aa768e4cSTim Tautges 166d083f849SBarry Smith Collective 167aa768e4cSTim Tautges 168aa768e4cSTim Tautges Input Parameter: 169aa768e4cSTim Tautges . dm - The DMMoab object being set 170aa768e4cSTim Tautges 171aa768e4cSTim Tautges Output Parameter: 172aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 173aa768e4cSTim Tautges 174aa768e4cSTim Tautges Level: beginner 175aa768e4cSTim Tautges 176aa768e4cSTim Tautges @*/ 1771d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm) 1781d72bce8STim Tautges { 1791d72bce8STim Tautges PetscFunctionBegin; 1801d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 181032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 1821d72bce8STim Tautges PetscFunctionReturn(0); 1831d72bce8STim Tautges } 1841d72bce8STim Tautges 1859daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */ 1869daf19fdSVijay Mahadevan 187cab5ea25SPierre Jolivet /*@C 188aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 189aa768e4cSTim Tautges 190d083f849SBarry Smith Collective 191aa768e4cSTim Tautges 192d8d19677SJose E. Roman Input Parameters: 193a2b725a8SWilliam Gropp + dm - The DMMoab object being set 194a2b725a8SWilliam Gropp - mbiface - The MOAB instance being set on this DMMoab 195aa768e4cSTim Tautges 196aa768e4cSTim Tautges Level: beginner 197aa768e4cSTim Tautges 198aa768e4cSTim Tautges @*/ 199a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface) 2001d72bce8STim Tautges { 201032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 202032b8ab6SVijay Mahadevan 2031d72bce8STim Tautges PetscFunctionBegin; 2041d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2051cec0304SVijay Mahadevan PetscValidPointer(mbiface, 2); 2069daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 207032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 2089daf19fdSVijay Mahadevan #endif 209032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 210032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2111d72bce8STim Tautges PetscFunctionReturn(0); 2121d72bce8STim Tautges } 2131d72bce8STim Tautges 214cab5ea25SPierre Jolivet /*@C 215aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 216aa768e4cSTim Tautges 217d083f849SBarry Smith Collective 218aa768e4cSTim Tautges 219aa768e4cSTim Tautges Input Parameter: 220aa768e4cSTim Tautges . dm - The DMMoab object being set 221aa768e4cSTim Tautges 222aa768e4cSTim Tautges Output Parameter: 223aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 224aa768e4cSTim Tautges 225aa768e4cSTim Tautges Level: beginner 226aa768e4cSTim Tautges 227aa768e4cSTim Tautges @*/ 228a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface) 2291d72bce8STim Tautges { 230cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 231cabb514dSBarry Smith 2321d72bce8STim Tautges PetscFunctionBegin; 2331d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2349566063dSJacob Faibussowitsch PetscCall(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)); 235a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 2361d72bce8STim Tautges PetscFunctionReturn(0); 2371d72bce8STim Tautges } 2381d72bce8STim Tautges 239cab5ea25SPierre Jolivet /*@C 2405eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 241aa768e4cSTim Tautges 242d083f849SBarry Smith Collective 243aa768e4cSTim Tautges 244d8d19677SJose E. Roman Input Parameters: 245a2b725a8SWilliam Gropp + dm - The DMMoab object being set 246a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab 247aa768e4cSTim Tautges 248aa768e4cSTim Tautges Level: beginner 249aa768e4cSTim Tautges 250aa768e4cSTim Tautges @*/ 2515eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range) 2521d72bce8STim Tautges { 253fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 254032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 255032b8ab6SVijay Mahadevan 2561d72bce8STim Tautges PetscFunctionBegin; 2571d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 258032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 259032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 260fd3326ddSVijay Mahadevan 261032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 262fd3326ddSVijay Mahadevan 2639daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 2649daf19fdSVijay Mahadevan moab::ErrorCode merr; 265fd3326ddSVijay Mahadevan /* filter based on parallel status */ 266fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr); 267fd3326ddSVijay Mahadevan 268fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 269fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 270fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr); 271fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 272fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 2739daf19fdSVijay Mahadevan #else 2749daf19fdSVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 2759daf19fdSVijay Mahadevan #endif 276fd3326ddSVijay Mahadevan 277fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 278032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 279032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 2809daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 2811c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm)); 2829daf19fdSVijay Mahadevan #else 2839daf19fdSVijay Mahadevan dmmoab->n = dmmoab->nloc; 2849daf19fdSVijay Mahadevan #endif 2851d72bce8STim Tautges PetscFunctionReturn(0); 2861d72bce8STim Tautges } 2871d72bce8STim Tautges 288cab5ea25SPierre Jolivet /*@C 2898d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 2908d8d51c8SVijay Mahadevan 291d083f849SBarry Smith Collective 2928d8d51c8SVijay Mahadevan 2938d8d51c8SVijay Mahadevan Input Parameter: 2948d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 2958d8d51c8SVijay Mahadevan 2968d8d51c8SVijay Mahadevan Output Parameter: 2978d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 2988d8d51c8SVijay Mahadevan 2998d8d51c8SVijay Mahadevan Level: beginner 3008d8d51c8SVijay Mahadevan 3018d8d51c8SVijay Mahadevan @*/ 3028d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local) 3038d8d51c8SVijay Mahadevan { 3048d8d51c8SVijay Mahadevan PetscFunctionBegin; 3058d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 3068d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 3078d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3088d8d51c8SVijay Mahadevan } 3098d8d51c8SVijay Mahadevan 310cab5ea25SPierre Jolivet /*@C 3115eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 312aa768e4cSTim Tautges 313d083f849SBarry Smith Collective 314aa768e4cSTim Tautges 315aa768e4cSTim Tautges Input Parameter: 316aa768e4cSTim Tautges . dm - The DMMoab object being set 317aa768e4cSTim Tautges 318a2b725a8SWilliam Gropp Output Parameters: 319a2b725a8SWilliam Gropp + owned - The owned vertex entities in this DMMoab 320a2b725a8SWilliam Gropp - ghost - The ghosted entities (non-owned) stored locally in this partition 321aa768e4cSTim Tautges 322aa768e4cSTim Tautges Level: beginner 323aa768e4cSTim Tautges 324aa768e4cSTim Tautges @*/ 325351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost) 3261d72bce8STim Tautges { 3271d72bce8STim Tautges PetscFunctionBegin; 3281d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 329351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 330351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3311d72bce8STim Tautges PetscFunctionReturn(0); 3321d72bce8STim Tautges } 3331d72bce8STim Tautges 334cab5ea25SPierre Jolivet /*@C 3355eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3365eb88e9dSVijay Mahadevan 337d083f849SBarry Smith Collective 3385eb88e9dSVijay Mahadevan 3395eb88e9dSVijay Mahadevan Input Parameter: 3405eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 3415eb88e9dSVijay Mahadevan 3425eb88e9dSVijay Mahadevan Output Parameter: 3435eb88e9dSVijay Mahadevan . range - The entities owned locally 3445eb88e9dSVijay Mahadevan 3455eb88e9dSVijay Mahadevan Level: beginner 3465eb88e9dSVijay Mahadevan 3475eb88e9dSVijay Mahadevan @*/ 348351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range) 3495eb88e9dSVijay Mahadevan { 3505eb88e9dSVijay Mahadevan PetscFunctionBegin; 3515eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 352351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 3531cec0304SVijay Mahadevan PetscFunctionReturn(0); 3541cec0304SVijay Mahadevan } 3551cec0304SVijay Mahadevan 356cab5ea25SPierre Jolivet /*@C 3571cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 3581cec0304SVijay Mahadevan 359d083f849SBarry Smith Collective 3601cec0304SVijay Mahadevan 361a2b725a8SWilliam Gropp Input Parameters: 362a2b725a8SWilliam Gropp + dm - The DMMoab object being set 363a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab 3641cec0304SVijay Mahadevan 3651cec0304SVijay Mahadevan Level: beginner 3661cec0304SVijay Mahadevan 3671cec0304SVijay Mahadevan @*/ 3681cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range) 3691cec0304SVijay Mahadevan { 3701cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 3711cec0304SVijay Mahadevan 3721cec0304SVijay Mahadevan PetscFunctionBegin; 3731cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 3741cec0304SVijay Mahadevan dmmoab->elocal->clear(); 3751cec0304SVijay Mahadevan dmmoab->eghost->clear(); 3761cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 3779daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 3789daf19fdSVijay Mahadevan moab::ErrorCode merr; 3791cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 3801cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 3819daf19fdSVijay Mahadevan #endif 3821cec0304SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 38341dd5348SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 3849daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 3851c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm)); 38663a3b9bcSJacob Faibussowitsch PetscInfo(dm, "Created %" PetscInt_FMT " local and %" PetscInt_FMT " global elements.\n", dmmoab->neleloc, dmmoab->nele); 3879daf19fdSVijay Mahadevan #else 3889daf19fdSVijay Mahadevan dmmoab->nele = dmmoab->neleloc; 3899daf19fdSVijay Mahadevan #endif 3905eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 3915eb88e9dSVijay Mahadevan } 3925eb88e9dSVijay Mahadevan 393cab5ea25SPierre Jolivet /*@C 394aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 395aa768e4cSTim Tautges 396d083f849SBarry Smith Collective 397aa768e4cSTim Tautges 398a2b725a8SWilliam Gropp Input Parameters: 399a2b725a8SWilliam Gropp + dm - The DMMoab object being set 400a2b725a8SWilliam Gropp - ltogtag - The MOAB tag used for local to global ids 401aa768e4cSTim Tautges 402aa768e4cSTim Tautges Level: beginner 403aa768e4cSTim Tautges 404aa768e4cSTim Tautges @*/ 4051d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag) 4061d72bce8STim Tautges { 4071d72bce8STim Tautges PetscFunctionBegin; 4081d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4091d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4101d72bce8STim Tautges PetscFunctionReturn(0); 4111d72bce8STim Tautges } 4121d72bce8STim Tautges 413cab5ea25SPierre Jolivet /*@C 414aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 415aa768e4cSTim Tautges 416d083f849SBarry Smith Collective 417aa768e4cSTim Tautges 418aa768e4cSTim Tautges Input Parameter: 419aa768e4cSTim Tautges . dm - The DMMoab object being set 420aa768e4cSTim Tautges 421aa768e4cSTim Tautges Output Parameter: 422aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 423aa768e4cSTim Tautges 424aa768e4cSTim Tautges Level: beginner 425aa768e4cSTim Tautges 426aa768e4cSTim Tautges @*/ 4271d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag) 4281d72bce8STim Tautges { 4291d72bce8STim Tautges PetscFunctionBegin; 4301d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4311d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4321d72bce8STim Tautges PetscFunctionReturn(0); 4331d72bce8STim Tautges } 4341d72bce8STim Tautges 435cab5ea25SPierre Jolivet /*@C 436aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 437aa768e4cSTim Tautges 438d083f849SBarry Smith Collective 439aa768e4cSTim Tautges 440d8d19677SJose E. Roman Input Parameters: 441a2b725a8SWilliam Gropp + dm - The DMMoab object being set 442a2b725a8SWilliam Gropp - bs - The block size used with this DMMoab 443aa768e4cSTim Tautges 444aa768e4cSTim Tautges Level: beginner 445aa768e4cSTim Tautges 446aa768e4cSTim Tautges @*/ 4471d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs) 4481d72bce8STim Tautges { 4491d72bce8STim Tautges PetscFunctionBegin; 4501d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4511d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4521d72bce8STim Tautges PetscFunctionReturn(0); 4531d72bce8STim Tautges } 4541d72bce8STim Tautges 455cab5ea25SPierre Jolivet /*@C 456aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 457aa768e4cSTim Tautges 458d083f849SBarry Smith Collective 459aa768e4cSTim Tautges 460aa768e4cSTim Tautges Input Parameter: 461aa768e4cSTim Tautges . dm - The DMMoab object being set 462aa768e4cSTim Tautges 463aa768e4cSTim Tautges Output Parameter: 464aa768e4cSTim Tautges . bs - The block size used with this DMMoab 465aa768e4cSTim Tautges 466aa768e4cSTim Tautges Level: beginner 467aa768e4cSTim Tautges 468aa768e4cSTim Tautges @*/ 4691d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs) 4701d72bce8STim Tautges { 4711d72bce8STim Tautges PetscFunctionBegin; 4721d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4731d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 4741d72bce8STim Tautges PetscFunctionReturn(0); 4751d72bce8STim Tautges } 4761d72bce8STim Tautges 477cab5ea25SPierre Jolivet /*@C 478212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 479212ad6d1SVijay Mahadevan 480d083f849SBarry Smith Collective on dm 481212ad6d1SVijay Mahadevan 482212ad6d1SVijay Mahadevan Input Parameter: 483212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 484212ad6d1SVijay Mahadevan 485d8d19677SJose E. Roman Output Parameters: 486a2b725a8SWilliam Gropp + neg - The number of global elements in the DMMoab instance 487a2b725a8SWilliam Gropp - nvg - The number of global vertices in the DMMoab instance 488212ad6d1SVijay Mahadevan 489212ad6d1SVijay Mahadevan Level: beginner 490212ad6d1SVijay Mahadevan 491212ad6d1SVijay Mahadevan @*/ 49241dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg) 493212ad6d1SVijay Mahadevan { 494212ad6d1SVijay Mahadevan PetscFunctionBegin; 495212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 49641dd5348SVijay Mahadevan if (neg) *neg = ((DM_Moab*)dm->data)->nele; 49741dd5348SVijay Mahadevan if (nvg) *nvg = ((DM_Moab*)dm->data)->n; 498212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 499212ad6d1SVijay Mahadevan } 500212ad6d1SVijay Mahadevan 501cab5ea25SPierre Jolivet /*@C 502212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 503212ad6d1SVijay Mahadevan 504d083f849SBarry Smith Collective on dm 505212ad6d1SVijay Mahadevan 506212ad6d1SVijay Mahadevan Input Parameter: 507212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 508212ad6d1SVijay Mahadevan 509d8d19677SJose E. Roman Output Parameters: 510b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor 51100cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 51200cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 513a2b725a8SWilliam Gropp - nvg - The number of ghosted vertices in this processor 514212ad6d1SVijay Mahadevan 515212ad6d1SVijay Mahadevan Level: beginner 516212ad6d1SVijay Mahadevan 517212ad6d1SVijay Mahadevan @*/ 51841dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg) 519212ad6d1SVijay Mahadevan { 520212ad6d1SVijay Mahadevan PetscFunctionBegin; 521212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 52241dd5348SVijay Mahadevan if (nel) *nel = ((DM_Moab*)dm->data)->neleloc; 52341dd5348SVijay Mahadevan if (neg) *neg = ((DM_Moab*)dm->data)->neleghost; 52441dd5348SVijay Mahadevan if (nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 52541dd5348SVijay Mahadevan if (nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 526212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 527212ad6d1SVijay Mahadevan } 528212ad6d1SVijay Mahadevan 529cab5ea25SPierre Jolivet /*@C 53000cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 53100cc10feSVijay Mahadevan 532d083f849SBarry Smith Collective 53300cc10feSVijay Mahadevan 53400cc10feSVijay Mahadevan Input Parameter: 53500cc10feSVijay Mahadevan . dm - The DMMoab object being set 53600cc10feSVijay Mahadevan 53700cc10feSVijay Mahadevan Output Parameter: 53800cc10feSVijay Mahadevan . offset - The local offset for the global vector 53900cc10feSVijay Mahadevan 54000cc10feSVijay Mahadevan Level: beginner 54100cc10feSVijay Mahadevan 54200cc10feSVijay Mahadevan @*/ 54300cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset) 54400cc10feSVijay Mahadevan { 54500cc10feSVijay Mahadevan PetscFunctionBegin; 54600cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 54700cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 54800cc10feSVijay Mahadevan PetscFunctionReturn(0); 54900cc10feSVijay Mahadevan } 55000cc10feSVijay Mahadevan 551cab5ea25SPierre Jolivet /*@C 5524920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 5534920ab11SVijay Mahadevan 554d083f849SBarry Smith Collective 5554920ab11SVijay Mahadevan 5564920ab11SVijay Mahadevan Input Parameter: 557340f3b9aSVijay Mahadevan . dm - The DMMoab object 5584920ab11SVijay Mahadevan 5594920ab11SVijay Mahadevan Output Parameter: 5604920ab11SVijay Mahadevan . dim - The dimension of DM 5614920ab11SVijay Mahadevan 5624920ab11SVijay Mahadevan Level: beginner 5634920ab11SVijay Mahadevan 5644920ab11SVijay Mahadevan @*/ 5654920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim) 5664920ab11SVijay Mahadevan { 5674920ab11SVijay Mahadevan PetscFunctionBegin; 5684920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5694920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 5704920ab11SVijay Mahadevan PetscFunctionReturn(0); 5714920ab11SVijay Mahadevan } 5724920ab11SVijay Mahadevan 573cab5ea25SPierre Jolivet /*@C 574755f3dfbSVijay Mahadevan DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy 575755f3dfbSVijay Mahadevan generated through uniform refinement. 576755f3dfbSVijay Mahadevan 577d083f849SBarry Smith Collective on dm 578755f3dfbSVijay Mahadevan 579755f3dfbSVijay Mahadevan Input Parameter: 580755f3dfbSVijay Mahadevan . dm - The DMMoab object being set 581755f3dfbSVijay Mahadevan 582755f3dfbSVijay Mahadevan Output Parameter: 583755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level 584755f3dfbSVijay Mahadevan 585755f3dfbSVijay Mahadevan Level: beginner 586755f3dfbSVijay Mahadevan 587755f3dfbSVijay Mahadevan @*/ 588755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel) 589755f3dfbSVijay Mahadevan { 590755f3dfbSVijay Mahadevan PetscFunctionBegin; 591755f3dfbSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 592755f3dfbSVijay Mahadevan if (nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel; 593755f3dfbSVijay Mahadevan PetscFunctionReturn(0); 594755f3dfbSVijay Mahadevan } 595755f3dfbSVijay Mahadevan 596cab5ea25SPierre Jolivet /*@C 597340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 598340f3b9aSVijay Mahadevan 599d083f849SBarry Smith Collective 600340f3b9aSVijay Mahadevan 601d8d19677SJose E. Roman Input Parameters: 602a2b725a8SWilliam Gropp + dm - The DMMoab object 603a2b725a8SWilliam Gropp - 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 @*/ 611340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat) 612340f3b9aSVijay Mahadevan { 613340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 614340f3b9aSVijay Mahadevan 615340f3b9aSVijay Mahadevan PetscFunctionBegin; 616340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 617340f3b9aSVijay Mahadevan if (*mat) { 618340f3b9aSVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 619a044f6b6SVijay Mahadevan *mat = dmmoab->materials[dmmoab->elocal->index(ehandle)]; 620340f3b9aSVijay Mahadevan } 621340f3b9aSVijay Mahadevan PetscFunctionReturn(0); 622340f3b9aSVijay Mahadevan } 623340f3b9aSVijay Mahadevan 624cab5ea25SPierre Jolivet /*@C 62585d305f5SVijay Mahadevan DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities 62685d305f5SVijay Mahadevan 627d083f849SBarry Smith Collective 62885d305f5SVijay Mahadevan 629d8d19677SJose E. Roman Input Parameters: 630a2b725a8SWilliam Gropp + dm - The DMMoab object 63185d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 632a2b725a8SWilliam Gropp - conn - The vertex entity handles 63385d305f5SVijay Mahadevan 63485d305f5SVijay Mahadevan Output Parameter: 63585d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities 63685d305f5SVijay Mahadevan 63785d305f5SVijay Mahadevan Level: beginner 63885d305f5SVijay Mahadevan 63985d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity() 64085d305f5SVijay Mahadevan @*/ 641cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos) 6427023aa44SVijay Mahadevan { 6437023aa44SVijay Mahadevan DM_Moab *dmmoab; 6447023aa44SVijay Mahadevan moab::ErrorCode merr; 6457023aa44SVijay Mahadevan 6467023aa44SVijay Mahadevan PetscFunctionBegin; 6477023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 6487023aa44SVijay Mahadevan PetscValidPointer(conn, 3); 6499c368985SVijay Mahadevan PetscValidPointer(vpos, 4); 6507023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6517023aa44SVijay Mahadevan 6527023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6539c368985SVijay Mahadevan if (dmmoab->hlevel) { 6549c368985SVijay Mahadevan merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle*>(conn), nconn, dmmoab->hlevel, vpos);MBERRNM(merr); 6559c368985SVijay Mahadevan } 6569c368985SVijay Mahadevan else { 6577023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 6589c368985SVijay Mahadevan } 6597023aa44SVijay Mahadevan PetscFunctionReturn(0); 6607023aa44SVijay Mahadevan } 6617023aa44SVijay Mahadevan 662cab5ea25SPierre Jolivet /*@C 66385d305f5SVijay Mahadevan DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity 66485d305f5SVijay Mahadevan 665d083f849SBarry Smith Collective 66685d305f5SVijay Mahadevan 667d8d19677SJose E. Roman Input Parameters: 668a2b725a8SWilliam Gropp + dm - The DMMoab object 669a2b725a8SWilliam Gropp - vhandle - Vertex entity handle 67085d305f5SVijay Mahadevan 671d8d19677SJose E. Roman Output Parameters: 672a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed 673a2b725a8SWilliam Gropp - conn - The vertex entity handles 67485d305f5SVijay Mahadevan 67585d305f5SVijay Mahadevan Level: beginner 67685d305f5SVijay Mahadevan 67785d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity() 67885d305f5SVijay Mahadevan @*/ 67985d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt* nconn, moab::EntityHandle **conn) 6808d8d51c8SVijay Mahadevan { 6818d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 6828d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities, connect; 6838d8d51c8SVijay Mahadevan moab::ErrorCode merr; 6848d8d51c8SVijay Mahadevan 6858d8d51c8SVijay Mahadevan PetscFunctionBegin; 6868d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 6878d8d51c8SVijay Mahadevan PetscValidPointer(conn, 4); 6888d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6898d8d51c8SVijay Mahadevan 6908d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 69185d305f5SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION); MBERRNM(merr); 6928d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect); MBERRNM(merr); 6938d8d51c8SVijay Mahadevan 6948d8d51c8SVijay Mahadevan if (conn) { 6959566063dSJacob Faibussowitsch PetscCall(PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn)); 6969566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(*conn, &connect[0], connect.size())); 6978d8d51c8SVijay Mahadevan } 6988d8d51c8SVijay Mahadevan if (nconn) *nconn = connect.size(); 6998d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7008d8d51c8SVijay Mahadevan } 7018d8d51c8SVijay Mahadevan 702cab5ea25SPierre Jolivet /*@C 70385d305f5SVijay Mahadevan DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity 70485d305f5SVijay Mahadevan 705d083f849SBarry Smith Collective 70685d305f5SVijay Mahadevan 707d8d19677SJose E. Roman Input Parameters: 708a2b725a8SWilliam Gropp + dm - The DMMoab object 70985d305f5SVijay Mahadevan . vhandle - Vertex entity handle 71085d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 711a2b725a8SWilliam Gropp - conn - The vertex entity handles 71285d305f5SVijay Mahadevan 71385d305f5SVijay Mahadevan Level: beginner 71485d305f5SVijay Mahadevan 71585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity() 71685d305f5SVijay Mahadevan @*/ 7178d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, moab::EntityHandle **conn) 7188d8d51c8SVijay Mahadevan { 7198d8d51c8SVijay Mahadevan PetscFunctionBegin; 7208d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7218d8d51c8SVijay Mahadevan PetscValidPointer(conn, 4); 7228d8d51c8SVijay Mahadevan 7238d8d51c8SVijay Mahadevan if (conn) { 7249566063dSJacob Faibussowitsch PetscCall(PetscFree(*conn)); 7258d8d51c8SVijay Mahadevan } 7268d8d51c8SVijay Mahadevan if (nconn) *nconn = 0; 7278d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7288d8d51c8SVijay Mahadevan } 7298d8d51c8SVijay Mahadevan 730cab5ea25SPierre Jolivet /*@C 73185d305f5SVijay Mahadevan DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity 73285d305f5SVijay Mahadevan 733d083f849SBarry Smith Collective 73485d305f5SVijay Mahadevan 735d8d19677SJose E. Roman Input Parameters: 736a2b725a8SWilliam Gropp + dm - The DMMoab object 737a2b725a8SWilliam Gropp - ehandle - Vertex entity handle 73885d305f5SVijay Mahadevan 739d8d19677SJose E. Roman Output Parameters: 740a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed 741a2b725a8SWilliam Gropp - conn - The vertex entity handles 74285d305f5SVijay Mahadevan 74385d305f5SVijay Mahadevan Level: beginner 74485d305f5SVijay Mahadevan 74585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity() 74685d305f5SVijay Mahadevan @*/ 7477023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, const moab::EntityHandle **conn) 7487023aa44SVijay Mahadevan { 7497023aa44SVijay Mahadevan DM_Moab *dmmoab; 7507023aa44SVijay Mahadevan const moab::EntityHandle *connect; 7519c368985SVijay Mahadevan std::vector<moab::EntityHandle> vconn; 7527023aa44SVijay Mahadevan moab::ErrorCode merr; 7537023aa44SVijay Mahadevan PetscInt nnodes; 7547023aa44SVijay Mahadevan 7557023aa44SVijay Mahadevan PetscFunctionBegin; 7567023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7577023aa44SVijay Mahadevan PetscValidPointer(conn, 4); 7587023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7597023aa44SVijay Mahadevan 7607023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7617023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes); MBERRNM(merr); 7627023aa44SVijay Mahadevan if (conn) *conn = connect; 7637023aa44SVijay Mahadevan if (nconn) *nconn = nnodes; 7647023aa44SVijay Mahadevan PetscFunctionReturn(0); 7657023aa44SVijay Mahadevan } 7667023aa44SVijay Mahadevan 767cab5ea25SPierre Jolivet /*@C 76885d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 76985d305f5SVijay Mahadevan 770d083f849SBarry Smith Collective 77185d305f5SVijay Mahadevan 772d8d19677SJose E. Roman Input Parameters: 773a2b725a8SWilliam Gropp + dm - The DMMoab object 774a2b725a8SWilliam Gropp - ent - Entity handle 77585d305f5SVijay Mahadevan 77685d305f5SVijay Mahadevan Output Parameter: 77785d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 77885d305f5SVijay Mahadevan 77985d305f5SVijay Mahadevan Level: beginner 78085d305f5SVijay Mahadevan 78185d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices() 78285d305f5SVijay Mahadevan @*/ 78369263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool* ent_on_boundary) 78469263071SVijay Mahadevan { 78569263071SVijay Mahadevan moab::EntityType etype; 78669263071SVijay Mahadevan DM_Moab *dmmoab; 78769263071SVijay Mahadevan PetscInt edim; 78869263071SVijay Mahadevan 78969263071SVijay Mahadevan PetscFunctionBegin; 79069263071SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 79169263071SVijay Mahadevan PetscValidPointer(ent_on_boundary, 3); 79269263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 79369263071SVijay Mahadevan 79469263071SVijay Mahadevan /* get the entity type and handle accordingly */ 79569263071SVijay Mahadevan etype = dmmoab->mbiface->type_from_handle(ent); 796*1dca8a05SBarry Smith PetscCheck(etype < moab::MBPOLYHEDRON,PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %" PetscInt_FMT, etype); 79769263071SVijay Mahadevan 79869263071SVijay Mahadevan /* get the entity dimension */ 79969263071SVijay Mahadevan edim = dmmoab->mbiface->dimension_from_handle(ent); 80069263071SVijay Mahadevan 80169263071SVijay Mahadevan *ent_on_boundary = PETSC_FALSE; 80269263071SVijay Mahadevan if (etype == moab::MBVERTEX && edim == 0) { 80349d66b22SVijay Mahadevan *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE); 80469263071SVijay Mahadevan } 80569263071SVijay Mahadevan else { 80669263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 8076d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE; 80869263071SVijay Mahadevan } 80969263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 8106d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE; 81169263071SVijay Mahadevan } 81269263071SVijay Mahadevan } 81369263071SVijay Mahadevan PetscFunctionReturn(0); 81469263071SVijay Mahadevan } 81569263071SVijay Mahadevan 816cab5ea25SPierre Jolivet /*@C 8174597dd3dSJose E. Roman DMMoabCheckBoundaryVertices - Check whether a given entity is on the boundary (vertex, edge, face, element) 81885d305f5SVijay Mahadevan 81997bb3fdcSJose E. Roman Input Parameters: 820a2b725a8SWilliam Gropp + dm - The DMMoab object 82185d305f5SVijay Mahadevan . nconn - Number of handles 822a2b725a8SWilliam Gropp - cnt - Array of entity handles 82385d305f5SVijay Mahadevan 82485d305f5SVijay Mahadevan Output Parameter: 82585d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 82685d305f5SVijay Mahadevan 82785d305f5SVijay Mahadevan Level: beginner 82885d305f5SVijay Mahadevan 82985d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary() 83085d305f5SVijay Mahadevan @*/ 83169263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool* isbdvtx) 8327023aa44SVijay Mahadevan { 8337023aa44SVijay Mahadevan DM_Moab *dmmoab; 8347023aa44SVijay Mahadevan PetscInt i; 8357023aa44SVijay Mahadevan 8367023aa44SVijay Mahadevan PetscFunctionBegin; 8377023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 8387023aa44SVijay Mahadevan PetscValidPointer(cnt, 3); 8397023aa44SVijay Mahadevan PetscValidPointer(isbdvtx, 4); 8407023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8417023aa44SVijay Mahadevan 8427023aa44SVijay Mahadevan for (i = 0; i < nconn; ++i) { 8436d9eb265SVijay Mahadevan isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE); 8447023aa44SVijay Mahadevan } 8457023aa44SVijay Mahadevan PetscFunctionReturn(0); 8467023aa44SVijay Mahadevan } 8477023aa44SVijay Mahadevan 848cab5ea25SPierre Jolivet /*@C 84985d305f5SVijay Mahadevan DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary 85085d305f5SVijay Mahadevan 85185d305f5SVijay Mahadevan Input Parameter: 85285d305f5SVijay Mahadevan . dm - The DMMoab object 85385d305f5SVijay Mahadevan 854d8d19677SJose E. Roman Output Parameters: 855a2b725a8SWilliam Gropp + bdvtx - Boundary vertices 85685d305f5SVijay Mahadevan . bdelems - Boundary elements 857a2b725a8SWilliam Gropp - bdfaces - Boundary faces 85885d305f5SVijay Mahadevan 85985d305f5SVijay Mahadevan Level: beginner 86085d305f5SVijay Mahadevan 86185d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary() 86285d305f5SVijay Mahadevan @*/ 8636d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range** bdelems, const moab::Range** bdfaces) 8641cec0304SVijay Mahadevan { 8651cec0304SVijay Mahadevan DM_Moab *dmmoab; 8661cec0304SVijay Mahadevan 8671cec0304SVijay Mahadevan PetscFunctionBegin; 8681cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 8691cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8701cec0304SVijay Mahadevan 8716d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 8726d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 8736d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 8741cec0304SVijay Mahadevan PetscFunctionReturn(0); 8751cec0304SVijay Mahadevan } 8761cec0304SVijay Mahadevan 877f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 878f6829af0SVijay Mahadevan { 87985d305f5SVijay Mahadevan PetscInt i; 880e882eb38SVijay Mahadevan moab::ErrorCode merr; 881f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 882f6829af0SVijay Mahadevan 883f6829af0SVijay Mahadevan PetscFunctionBegin; 884f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 885304006b3SVijay Mahadevan 886304006b3SVijay Mahadevan dmmoab->refct--; 887304006b3SVijay Mahadevan if (!dmmoab->refct) { 888f6829af0SVijay Mahadevan delete dmmoab->vlocal; 889f6829af0SVijay Mahadevan delete dmmoab->vowned; 890f6829af0SVijay Mahadevan delete dmmoab->vghost; 891f6829af0SVijay Mahadevan delete dmmoab->elocal; 892f6829af0SVijay Mahadevan delete dmmoab->eghost; 893f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 894f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 895f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 896f6829af0SVijay Mahadevan 8979566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->gsindices)); 8989566063dSJacob Faibussowitsch PetscCall(PetscFree2(dmmoab->gidmap, dmmoab->lidmap)); 8999566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->dfill)); 9009566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->ofill)); 9019566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->materials)); 90285d305f5SVijay Mahadevan if (dmmoab->fieldNames) { 90385d305f5SVijay Mahadevan for (i = 0; i < dmmoab->numFields; i++) { 9049566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->fieldNames[i])); 90585d305f5SVijay Mahadevan } 9069566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->fieldNames)); 90785d305f5SVijay Mahadevan } 908b117cd09SVijay Mahadevan 909b117cd09SVijay Mahadevan if (dmmoab->nhlevels) { 9109566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->hsets)); 911e882eb38SVijay Mahadevan dmmoab->nhlevels = 0; 912e882eb38SVijay Mahadevan if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy; 913e882eb38SVijay Mahadevan dmmoab->hierarchy = NULL; 914b117cd09SVijay Mahadevan } 915e882eb38SVijay Mahadevan 916e882eb38SVijay Mahadevan if (dmmoab->icreatedinstance) { 9179c368985SVijay Mahadevan delete dmmoab->pcomm; 918e882eb38SVijay Mahadevan merr = dmmoab->mbiface->delete_mesh(); MBERRNM(merr); 919e882eb38SVijay Mahadevan delete dmmoab->mbiface; 920e882eb38SVijay Mahadevan } 921e882eb38SVijay Mahadevan dmmoab->mbiface = NULL; 9229daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 923e882eb38SVijay Mahadevan dmmoab->pcomm = NULL; 9249daf19fdSVijay Mahadevan #endif 9259566063dSJacob Faibussowitsch PetscCall(VecScatterDestroy(&dmmoab->ltog_sendrecv)); 9269566063dSJacob Faibussowitsch PetscCall(ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map)); 9279566063dSJacob Faibussowitsch PetscCall(PetscFree(dm->data)); 928304006b3SVijay Mahadevan } 929f6829af0SVijay Mahadevan PetscFunctionReturn(0); 930f6829af0SVijay Mahadevan } 931f6829af0SVijay Mahadevan 9324416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject, DM dm) 9332e4e7c01SVijay Mahadevan { 9342e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 9352e4e7c01SVijay Mahadevan 9362e4e7c01SVijay Mahadevan PetscFunctionBegin; 9372e4e7c01SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 938d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "DMMoab Options"); 9399566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-dm_moab_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "DMView", dmmoab->rw_dbglevel, &dmmoab->rw_dbglevel, NULL,0)); 9409566063dSJacob Faibussowitsch PetscCall(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)); 9412e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 9429566063dSJacob Faibussowitsch PetscCall(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, sizeof(dmmoab->extra_read_options), NULL)); 9439566063dSJacob Faibussowitsch PetscCall(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, sizeof(dmmoab->extra_write_options), NULL)); 9449566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL)); 9459566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL)); 946d0609cedSBarry Smith PetscOptionsHeadEnd(); 9472e4e7c01SVijay Mahadevan PetscFunctionReturn(0); 9482e4e7c01SVijay Mahadevan } 9492e4e7c01SVijay Mahadevan 950f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 951f6829af0SVijay Mahadevan { 952f6829af0SVijay Mahadevan moab::ErrorCode merr; 953f6829af0SVijay Mahadevan Vec local, global; 954f6829af0SVijay Mahadevan IS from, to; 955f6829af0SVijay Mahadevan moab::Range::iterator iter; 956304006b3SVijay Mahadevan PetscInt i, j, f, bs, vent, totsize, *lgmap; 957f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 958f6829af0SVijay Mahadevan moab::Range adjs; 959f6829af0SVijay Mahadevan 960f6829af0SVijay Mahadevan PetscFunctionBegin; 961f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 962f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 96308401ef6SPierre Jolivet PetscCheck(dmmoab->mbiface != NULL,PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp."); 9649daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 96508401ef6SPierre Jolivet PetscCheck(dmmoab->pcomm != NULL,PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp."); 9669daf19fdSVijay Mahadevan #endif 967f6829af0SVijay Mahadevan 968f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 969f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 970f6829af0SVijay Mahadevan { 97149d66b22SVijay Mahadevan //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 97249d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false); MBERRNM(merr); 973f6829af0SVijay Mahadevan 9749daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 975f6829af0SVijay Mahadevan /* filter based on parallel status */ 976f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr); 977f6829af0SVijay Mahadevan 978f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 9799c368985SVijay Mahadevan // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 980f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 98164e1c140SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr); 982f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 983f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 9849daf19fdSVijay Mahadevan #else 9859daf19fdSVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 9869daf19fdSVijay Mahadevan #endif 987f6829af0SVijay Mahadevan 988f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 989f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 990f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 99149d66b22SVijay Mahadevan 9929daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 9931c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm)); 99463a3b9bcSJacob Faibussowitsch PetscInfo(NULL, "Filset ID: %lu, Vertices: local - %zu, owned - %" PetscInt_FMT ", ghosted - %" PetscInt_FMT ".\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost); 9959daf19fdSVijay Mahadevan #else 9969daf19fdSVijay Mahadevan dmmoab->n = dmmoab->nloc; 9979daf19fdSVijay Mahadevan #endif 998f6829af0SVijay Mahadevan } 999f6829af0SVijay Mahadevan 1000f6829af0SVijay Mahadevan { 1001f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 1002f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 1003f6829af0SVijay Mahadevan 1004f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 1005f6829af0SVijay Mahadevan for (i = 3; i > 0; i--) { 1006f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 100749d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false); MBERRNM(merr); 1008f6829af0SVijay Mahadevan 1009f6829af0SVijay Mahadevan /* store the current mesh dimension */ 1010f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 1011f6829af0SVijay Mahadevan dmmoab->dim = i; 1012f6829af0SVijay Mahadevan break; 1013f6829af0SVijay Mahadevan } 1014f6829af0SVijay Mahadevan } 1015f6829af0SVijay Mahadevan 10169566063dSJacob Faibussowitsch PetscCall(DMSetDimension(dm, dmmoab->dim)); 1017b117cd09SVijay Mahadevan 10189daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1019f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 1020f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 1021f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 1022f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 10239daf19fdSVijay Mahadevan #endif 1024f6829af0SVijay Mahadevan 1025f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 1026f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 102749d66b22SVijay Mahadevan 10289daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 10291c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm)); 103063a3b9bcSJacob Faibussowitsch PetscInfo(NULL, "%d-dim elements: owned - %" PetscInt_FMT ", ghosted - %" PetscInt_FMT ".\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost); 10319daf19fdSVijay Mahadevan #else 10329daf19fdSVijay Mahadevan dmmoab->nele = dmmoab->neleloc; 10339daf19fdSVijay Mahadevan #endif 1034f6829af0SVijay Mahadevan } 1035f6829af0SVijay Mahadevan 1036f6829af0SVijay Mahadevan bs = dmmoab->bs; 1037f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 1038f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 1039f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 1040f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 1041f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr); 1042f6829af0SVijay Mahadevan } 1043f6829af0SVijay Mahadevan 1044f6829af0SVijay Mahadevan totsize = dmmoab->vlocal->size(); 1045*1dca8a05SBarry Smith PetscCheck(totsize == dmmoab->nloc + dmmoab->nghost,PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %" PetscInt_FMT " != %" PetscInt_FMT ".", totsize, dmmoab->nloc + dmmoab->nghost); 10469566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(totsize, &dmmoab->gsindices)); 1047f6829af0SVijay Mahadevan { 1048f6829af0SVijay Mahadevan /* first get the local indices */ 1049f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]); MBERRNM(merr); 10503f1c6e43SVijay Mahadevan if (dmmoab->nghost) { /* next get the ghosted indices */ 1051f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]); MBERRNM(merr); 1052f6829af0SVijay Mahadevan } 1053f6829af0SVijay Mahadevan 1054f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1055304006b3SVijay Mahadevan dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0]; 1056f6829af0SVijay Mahadevan for (i = 0; i < totsize; ++i) { 1057304006b3SVijay Mahadevan if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i]; 1058304006b3SVijay Mahadevan if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i]; 1059f6829af0SVijay Mahadevan } 1060f6829af0SVijay Mahadevan 10611c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm)); 10621c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm)); 1063f6829af0SVijay Mahadevan 1064f6829af0SVijay Mahadevan /* set the GID map */ 1065f6829af0SVijay Mahadevan for (i = 0; i < totsize; ++i) { 1066304006b3SVijay Mahadevan dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */ 10679c368985SVijay Mahadevan 1068f6829af0SVijay Mahadevan } 1069304006b3SVijay Mahadevan dmmoab->lminmax[0] -= dmmoab->gminmax[0]; 1070304006b3SVijay Mahadevan dmmoab->lminmax[1] -= dmmoab->gminmax[0]; 1071f6829af0SVijay Mahadevan 107263a3b9bcSJacob Faibussowitsch PetscInfo(NULL, "GLOBAL_ID: Local [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "], Global [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "]\n", dmmoab->lminmax[0], dmmoab->lminmax[1], dmmoab->gminmax[0], dmmoab->gminmax[1]); 1073f6829af0SVijay Mahadevan } 107463a3b9bcSJacob Faibussowitsch PetscCheck(dmmoab->bs == dmmoab->numFields || dmmoab->bs == 1,PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between block size and number of component fields. %" PetscInt_FMT " != 1 OR %" PetscInt_FMT " != %" PetscInt_FMT ".", dmmoab->bs, dmmoab->bs, dmmoab->numFields); 1075f6829af0SVijay Mahadevan 1076f6829af0SVijay Mahadevan { 10779c368985SVijay Mahadevan dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front()); 10789c368985SVijay Mahadevan dmmoab->seqend = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back()); 107963a3b9bcSJacob Faibussowitsch PetscInfo(NULL, "SEQUENCE: Local [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "]\n", dmmoab->seqstart, dmmoab->seqend); 10803f1c6e43SVijay Mahadevan 10819566063dSJacob Faibussowitsch PetscCall(PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap)); 10829566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(totsize * dmmoab->numFields, &lgmap)); 1083f6829af0SVijay Mahadevan 1084f6829af0SVijay Mahadevan i = j = 0; 1085f6829af0SVijay Mahadevan /* set the owned vertex data first */ 1086f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) { 1087e92d1c7cSVijay Mahadevan vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart; 1088f6829af0SVijay Mahadevan dmmoab->gidmap[vent] = dmmoab->gsindices[i]; 1089f6829af0SVijay Mahadevan dmmoab->lidmap[vent] = i; 1090f6829af0SVijay Mahadevan for (f = 0; f < dmmoab->numFields; f++, j++) { 10913f1c6e43SVijay Mahadevan lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]); 1092f6829af0SVijay Mahadevan } 1093f6829af0SVijay Mahadevan } 1094f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1095f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) { 1096e92d1c7cSVijay Mahadevan vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart; 1097f6829af0SVijay Mahadevan dmmoab->gidmap[vent] = dmmoab->gsindices[i]; 1098f6829af0SVijay Mahadevan dmmoab->lidmap[vent] = i; 1099f6829af0SVijay Mahadevan for (f = 0; f < dmmoab->numFields; f++, j++) { 11003f1c6e43SVijay Mahadevan lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]); 1101f6829af0SVijay Mahadevan } 1102f6829af0SVijay Mahadevan } 1103f6829af0SVijay Mahadevan 1104f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1105f6829af0SVijay Mahadevan 1) First create a local and global vector 1106f6829af0SVijay Mahadevan 2) Create a local and global IS 1107f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1108f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1109f6829af0SVijay Mahadevan */ 11109566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &global)); 11119566063dSJacob Faibussowitsch PetscCall(DMCreateLocalVector(dm, &local)); 1112f6829af0SVijay Mahadevan 11139566063dSJacob Faibussowitsch PetscCall(VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend)); 1114f6829af0SVijay Mahadevan 1115f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 11169566063dSJacob Faibussowitsch PetscCall(ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from)); 11179566063dSJacob Faibussowitsch PetscCall(ISSetBlockSize(from, bs)); 1118f6829af0SVijay Mahadevan 11199566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to)); 11209566063dSJacob Faibussowitsch PetscCall(ISSetBlockSize(to, bs)); 1121f6829af0SVijay Mahadevan 1122f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1123f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 11249566063dSJacob Faibussowitsch PetscCall(ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap,PETSC_COPY_VALUES, &dmmoab->ltog_map)); 1125f6829af0SVijay Mahadevan } 1126f6829af0SVijay Mahadevan 1127f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 11289566063dSJacob Faibussowitsch PetscCall(VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv)); 1129f6829af0SVijay Mahadevan 1130f6829af0SVijay Mahadevan /* clean up IS, Vec */ 11319566063dSJacob Faibussowitsch PetscCall(PetscFree(lgmap)); 11329566063dSJacob Faibussowitsch PetscCall(ISDestroy(&from)); 11339566063dSJacob Faibussowitsch PetscCall(ISDestroy(&to)); 11349566063dSJacob Faibussowitsch PetscCall(VecDestroy(&local)); 11359566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global)); 1136f6829af0SVijay Mahadevan } 1137f6829af0SVijay Mahadevan 113849d66b22SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 113949d66b22SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 114049d66b22SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1141f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 11429c368985SVijay Mahadevan if (!dmmoab->hlevel) { 1143f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1144f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1145f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1146f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1147f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1148f6829af0SVijay Mahadevan 1149f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 11502417220eSVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, true, true, false); MBERRNM(merr); // 'false' param indicates we want faces back, not vertices 1151f6829af0SVijay Mahadevan 11529daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1153f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1154f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT);MBERRNM(merr); 11552417220eSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT);MBERRNM(merr); 11569daf19fdSVijay Mahadevan #endif 1157f6829af0SVijay Mahadevan 1158f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 11595f80ce2aSJacob Faibussowitsch merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(merr); 11605f80ce2aSJacob Faibussowitsch merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(merr); 1161f6829af0SVijay Mahadevan } 11629c368985SVijay Mahadevan else { 11639c368985SVijay Mahadevan /* Let us query the hierarchy manager and get the results directly for this level */ 11649c368985SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) { 11659c368985SVijay Mahadevan moab::EntityHandle elemHandle = *iter; 11669c368985SVijay Mahadevan if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) { 11679c368985SVijay Mahadevan dmmoab->bndyelems->insert(elemHandle); 11689c368985SVijay Mahadevan /* For this boundary element, query the vertices and add them to the list */ 11699c368985SVijay Mahadevan std::vector<moab::EntityHandle> connect; 11705f80ce2aSJacob Faibussowitsch merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect);MBERRNM(merr); 11719c368985SVijay Mahadevan for (unsigned iv=0; iv < connect.size(); ++iv) 11729c368985SVijay Mahadevan if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv])) 11739c368985SVijay Mahadevan dmmoab->bndyvtx->insert(connect[iv]); 11749c368985SVijay Mahadevan /* Next, let us query the boundary faces and add them also to the list */ 11759c368985SVijay Mahadevan std::vector<moab::EntityHandle> faces; 11765f80ce2aSJacob Faibussowitsch merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim-1, faces);MBERRNM(merr); 11779c368985SVijay Mahadevan for (unsigned ifa=0; ifa < faces.size(); ++ifa) 11789c368985SVijay Mahadevan if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa])) 11799c368985SVijay Mahadevan dmmoab->bndyfaces->insert(faces[ifa]); 11809c368985SVijay Mahadevan } 11819c368985SVijay Mahadevan } 11829c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI 11839c368985SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 11849c368985SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 11859c368985SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 11869c368985SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 11879c368985SVijay Mahadevan #endif 11889c368985SVijay Mahadevan 11899c368985SVijay Mahadevan } 119063a3b9bcSJacob Faibussowitsch PetscInfo(NULL, "Found %zu boundary vertices, %zu boundary faces and %zu boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size()); 1191a044f6b6SVijay Mahadevan 1192a044f6b6SVijay Mahadevan /* Get the material sets and populate the data for all locally owned elements */ 1193a044f6b6SVijay Mahadevan { 11949566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials)); 1195a044f6b6SVijay Mahadevan /* Get the count of entities of particular type from dmmoab->elocal 1196a044f6b6SVijay Mahadevan -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */ 1197a044f6b6SVijay Mahadevan moab::Range msets; 1198a044f6b6SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type_and_tag(dmmoab->fileset, moab::MBENTITYSET, &dmmoab->material_tag, NULL, 1, msets, moab::Interface::UNION);MB_CHK_ERR(merr); 1199a044f6b6SVijay Mahadevan if (msets.size() == 0) { 1200a044f6b6SVijay Mahadevan PetscInfo(NULL, "No material sets found in the fileset."); 1201a044f6b6SVijay Mahadevan } 1202a044f6b6SVijay Mahadevan 1203a044f6b6SVijay Mahadevan for (unsigned i=0; i < msets.size(); ++i) { 1204a044f6b6SVijay Mahadevan moab::Range msetelems; 1205a044f6b6SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);MB_CHK_ERR(merr); 1206aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI 1207aedf4482SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1208aedf4482SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 1209aedf4482SVijay Mahadevan #endif 1210a044f6b6SVijay Mahadevan 1211a044f6b6SVijay Mahadevan int partID; 1212a044f6b6SVijay Mahadevan moab::EntityHandle mset=msets[i]; 1213a044f6b6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);MB_CHK_ERR(merr); 1214a044f6b6SVijay Mahadevan 1215a044f6b6SVijay Mahadevan for (unsigned j=0; j < msetelems.size(); ++j) 1216a044f6b6SVijay Mahadevan dmmoab->materials[dmmoab->elocal->index(msetelems[j])]=partID; 1217a044f6b6SVijay Mahadevan } 1218a044f6b6SVijay Mahadevan } 1219a044f6b6SVijay Mahadevan 1220f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1221f6829af0SVijay Mahadevan } 1222f6829af0SVijay Mahadevan 1223cab5ea25SPierre Jolivet /*@C 1224304006b3SVijay Mahadevan DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM. 1225304006b3SVijay Mahadevan 1226d083f849SBarry Smith Collective 1227304006b3SVijay Mahadevan 1228304006b3SVijay Mahadevan Input Parameters: 1229304006b3SVijay Mahadevan + dm - The DM object 1230304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra) 1231304006b3SVijay Mahadevan . conn - The connectivity of the element 1232a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element 1233304006b3SVijay Mahadevan 1234304006b3SVijay Mahadevan Output Parameter: 1235304006b3SVijay Mahadevan . overts - The list of vertices that were created (can be NULL) 1236304006b3SVijay Mahadevan 1237304006b3SVijay Mahadevan Level: beginner 1238304006b3SVijay Mahadevan 1239304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateElement() 1240304006b3SVijay Mahadevan @*/ 1241304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal* coords, PetscInt nverts, moab::Range* overts) 1242304006b3SVijay Mahadevan { 1243304006b3SVijay Mahadevan moab::ErrorCode merr; 1244304006b3SVijay Mahadevan DM_Moab *dmmoab; 1245304006b3SVijay Mahadevan moab::Range verts; 1246304006b3SVijay Mahadevan 1247304006b3SVijay Mahadevan PetscFunctionBegin; 1248304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1249304006b3SVijay Mahadevan PetscValidPointer(coords, 2); 1250304006b3SVijay Mahadevan 1251304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1252304006b3SVijay Mahadevan 1253304006b3SVijay Mahadevan /* Insert new points */ 1254304006b3SVijay Mahadevan merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts); MBERRNM(merr); 1255304006b3SVijay Mahadevan merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts); MBERRNM(merr); 1256304006b3SVijay Mahadevan 1257304006b3SVijay Mahadevan if (overts) *overts = verts; 1258304006b3SVijay Mahadevan PetscFunctionReturn(0); 1259304006b3SVijay Mahadevan } 1260304006b3SVijay Mahadevan 1261cab5ea25SPierre Jolivet /*@C 1262304006b3SVijay Mahadevan DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM. 1263304006b3SVijay Mahadevan 1264d083f849SBarry Smith Collective 1265304006b3SVijay Mahadevan 1266304006b3SVijay Mahadevan Input Parameters: 1267304006b3SVijay Mahadevan + dm - The DM object 1268304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra) 1269304006b3SVijay Mahadevan . conn - The connectivity of the element 1270a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element 1271304006b3SVijay Mahadevan 1272304006b3SVijay Mahadevan Output Parameter: 1273304006b3SVijay Mahadevan . oelem - The handle to the element created and added to the DM object 1274304006b3SVijay Mahadevan 1275304006b3SVijay Mahadevan Level: beginner 1276304006b3SVijay Mahadevan 1277304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateVertices() 1278304006b3SVijay Mahadevan @*/ 1279304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle* conn, PetscInt nverts, moab::EntityHandle* oelem) 1280304006b3SVijay Mahadevan { 1281304006b3SVijay Mahadevan moab::ErrorCode merr; 1282304006b3SVijay Mahadevan DM_Moab *dmmoab; 1283304006b3SVijay Mahadevan moab::EntityHandle elem; 1284304006b3SVijay Mahadevan 1285304006b3SVijay Mahadevan PetscFunctionBegin; 1286304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1287304006b3SVijay Mahadevan PetscValidPointer(conn, 3); 1288304006b3SVijay Mahadevan 1289304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1290304006b3SVijay Mahadevan 1291304006b3SVijay Mahadevan /* Insert new element */ 1292304006b3SVijay Mahadevan merr = dmmoab->mbiface->create_element(type, conn, nverts, elem); MBERRNM(merr); 1293304006b3SVijay Mahadevan merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1); MBERRNM(merr); 1294304006b3SVijay Mahadevan 1295304006b3SVijay Mahadevan if (oelem) *oelem = elem; 1296304006b3SVijay Mahadevan PetscFunctionReturn(0); 1297304006b3SVijay Mahadevan } 1298304006b3SVijay Mahadevan 1299cab5ea25SPierre Jolivet /*@C 1300304006b3SVijay Mahadevan DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent 1301304006b3SVijay Mahadevan in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to 1302304006b3SVijay Mahadevan create a DM object on a refined level. 1303304006b3SVijay Mahadevan 1304d083f849SBarry Smith Collective 1305304006b3SVijay Mahadevan 1306304006b3SVijay Mahadevan Input Parameters: 1307a2b725a8SWilliam Gropp . dm - The DM object 1308304006b3SVijay Mahadevan 1309304006b3SVijay Mahadevan Output Parameter: 1310304006b3SVijay Mahadevan . newdm - The sub DM object with updated set information 1311304006b3SVijay Mahadevan 1312304006b3SVijay Mahadevan Level: advanced 1313304006b3SVijay Mahadevan 1314304006b3SVijay Mahadevan .seealso: DMCreate(), DMMoabCreateVertices(), DMMoabCreateElement() 1315304006b3SVijay Mahadevan @*/ 1316304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm) 1317304006b3SVijay Mahadevan { 1318304006b3SVijay Mahadevan DM_Moab *dmmoab; 1319304006b3SVijay Mahadevan DM_Moab *ndmmoab; 1320304006b3SVijay Mahadevan moab::ErrorCode merr; 1321304006b3SVijay Mahadevan 1322304006b3SVijay Mahadevan PetscFunctionBegin; 1323304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1324304006b3SVijay Mahadevan 1325304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1326304006b3SVijay Mahadevan 1327304006b3SVijay Mahadevan /* Create the basic DMMoab object and keep the default parameters created by DM impls */ 13289566063dSJacob Faibussowitsch PetscCall(DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, PETSC_NULL, newdm)); 1329304006b3SVijay Mahadevan 1330304006b3SVijay Mahadevan /* get all the necessary handles from the private DM object */ 1331304006b3SVijay Mahadevan ndmmoab = (DM_Moab*) (*newdm)->data; 1332304006b3SVijay Mahadevan 1333304006b3SVijay Mahadevan /* set the sub-mesh's parent DM reference */ 1334304006b3SVijay Mahadevan ndmmoab->parent = &dm; 1335304006b3SVijay Mahadevan 1336304006b3SVijay Mahadevan /* create a file set to associate all entities in current mesh */ 1337304006b3SVijay Mahadevan merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset); MBERR("Creating file set failed", merr); 1338304006b3SVijay Mahadevan 1339304006b3SVijay Mahadevan /* create a meshset and then add old fileset as child */ 1340304006b3SVijay Mahadevan merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal); MBERR("Adding child vertices to parent failed", merr); 1341304006b3SVijay Mahadevan merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal); MBERR("Adding child elements to parent failed", merr); 1342304006b3SVijay Mahadevan 1343304006b3SVijay Mahadevan /* preserve the field association between the parent and sub-mesh objects */ 13449566063dSJacob Faibussowitsch PetscCall(DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames)); 1345304006b3SVijay Mahadevan PetscFunctionReturn(0); 1346304006b3SVijay Mahadevan } 1347304006b3SVijay Mahadevan 1348304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer) 1349304006b3SVijay Mahadevan { 1350304006b3SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 1351304006b3SVijay Mahadevan const char *name; 1352304006b3SVijay Mahadevan MPI_Comm comm; 1353304006b3SVijay Mahadevan PetscMPIInt size; 1354304006b3SVijay Mahadevan 1355304006b3SVijay Mahadevan PetscFunctionBegin; 13569566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)dm, &comm)); 13579566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 13589566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject) dm, &name)); 13599566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 136063a3b9bcSJacob Faibussowitsch if (name) PetscCall(PetscViewerASCIIPrintf(viewer, "%s in %" PetscInt_FMT " dimensions:\n", name, dmmoab->dim)); 136163a3b9bcSJacob Faibussowitsch else PetscCall(PetscViewerASCIIPrintf(viewer, "Mesh in %" PetscInt_FMT " dimensions:\n", dmmoab->dim)); 1362304006b3SVijay Mahadevan /* print details about the global mesh */ 1363304006b3SVijay Mahadevan { 13649566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 136563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Sizes: cells=%" PetscInt_FMT ", vertices=%" PetscInt_FMT ", blocks=%" PetscInt_FMT "\n", dmmoab->nele, dmmoab->n, dmmoab->bs)); 1366304006b3SVijay Mahadevan /* print boundary data */ 136763a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Boundary trace:\n")); 1368304006b3SVijay Mahadevan { 13699566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 137063a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "cells=%zu, faces=%zu, vertices=%zu\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size())); 13719566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1372304006b3SVijay Mahadevan } 1373304006b3SVijay Mahadevan /* print field data */ 137463a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Fields: %" PetscInt_FMT " components\n", dmmoab->numFields)); 1375304006b3SVijay Mahadevan { 13769566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 1377304006b3SVijay Mahadevan for (int i = 0; i < dmmoab->numFields; ++i) { 137863a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "[%" PetscInt_FMT "] - %s\n", i, dmmoab->fieldNames[i])); 1379304006b3SVijay Mahadevan } 13809566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1381304006b3SVijay Mahadevan } 13829566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1383304006b3SVijay Mahadevan } 13849566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 13859566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 1386304006b3SVijay Mahadevan PetscFunctionReturn(0); 1387304006b3SVijay Mahadevan } 1388304006b3SVijay Mahadevan 1389304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v) 1390304006b3SVijay Mahadevan { 1391304006b3SVijay Mahadevan PetscFunctionReturn(0); 1392304006b3SVijay Mahadevan } 1393304006b3SVijay Mahadevan 1394304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v) 1395304006b3SVijay Mahadevan { 1396304006b3SVijay Mahadevan PetscFunctionReturn(0); 1397304006b3SVijay Mahadevan } 1398304006b3SVijay Mahadevan 1399304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer) 1400304006b3SVijay Mahadevan { 1401304006b3SVijay Mahadevan PetscBool iascii, ishdf5, isvtk; 1402304006b3SVijay Mahadevan 1403304006b3SVijay Mahadevan PetscFunctionBegin; 1404304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1405304006b3SVijay Mahadevan PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 14069566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii)); 14079566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERVTK, &isvtk)); 14089566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERHDF5, &ishdf5)); 1409304006b3SVijay Mahadevan if (iascii) { 14109566063dSJacob Faibussowitsch PetscCall(DMMoabView_Ascii(dm, viewer)); 1411304006b3SVijay Mahadevan } else if (ishdf5) { 1412304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5) 14139566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ)); 14149566063dSJacob Faibussowitsch PetscCall(DMMoabView_HDF5(dm, viewer)); 14159566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer)); 1416304006b3SVijay Mahadevan #else 1417304006b3SVijay Mahadevan SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5"); 1418304006b3SVijay Mahadevan #endif 1419304006b3SVijay Mahadevan } 1420304006b3SVijay Mahadevan else if (isvtk) { 14219566063dSJacob Faibussowitsch PetscCall(DMMoabView_VTK(dm, viewer)); 1422304006b3SVijay Mahadevan } 1423304006b3SVijay Mahadevan PetscFunctionReturn(0); 1424304006b3SVijay Mahadevan } 1425304006b3SVijay Mahadevan 1426304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm) 1427304006b3SVijay Mahadevan { 1428304006b3SVijay Mahadevan PetscFunctionBegin; 1429304006b3SVijay Mahadevan dm->ops->view = DMView_Moab; 1430304006b3SVijay Mahadevan dm->ops->load = NULL /* DMLoad_Moab */; 1431304006b3SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1432304006b3SVijay Mahadevan dm->ops->clone = DMClone_Moab; 1433304006b3SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 14341bb6d2a8SBarry Smith dm->ops->createlocalsection = NULL; 1435304006b3SVijay Mahadevan dm->ops->createdefaultconstraints = NULL; 1436304006b3SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1437304006b3SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1438304006b3SVijay Mahadevan dm->ops->getlocaltoglobalmapping = NULL; 1439304006b3SVijay Mahadevan dm->ops->createfieldis = NULL; 1440304006b3SVijay Mahadevan dm->ops->createcoordinatedm = NULL /* DMCreateCoordinateDM_Moab */; 1441304006b3SVijay Mahadevan dm->ops->getcoloring = NULL; 1442304006b3SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1443304006b3SVijay Mahadevan dm->ops->createinterpolation = DMCreateInterpolation_Moab; 14445a84ad33SLisandro Dalcin dm->ops->createinjection = NULL /* DMCreateInjection_Moab */; 1445304006b3SVijay Mahadevan dm->ops->refine = DMRefine_Moab; 1446304006b3SVijay Mahadevan dm->ops->coarsen = DMCoarsen_Moab; 1447304006b3SVijay Mahadevan dm->ops->refinehierarchy = DMRefineHierarchy_Moab; 1448304006b3SVijay Mahadevan dm->ops->coarsenhierarchy = DMCoarsenHierarchy_Moab; 1449304006b3SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1450304006b3SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1451304006b3SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1452304006b3SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1453304006b3SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 1454304006b3SVijay Mahadevan dm->ops->createsubdm = NULL /* DMCreateSubDM_Moab */; 1455304006b3SVijay Mahadevan dm->ops->getdimpoints = NULL /* DMGetDimPoints_Moab */; 1456304006b3SVijay Mahadevan dm->ops->locatepoints = NULL /* DMLocatePoints_Moab */; 1457304006b3SVijay Mahadevan PetscFunctionReturn(0); 1458304006b3SVijay Mahadevan } 1459304006b3SVijay Mahadevan 1460304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm) 1461304006b3SVijay Mahadevan { 1462304006b3SVijay Mahadevan PetscFunctionBegin; 1463304006b3SVijay Mahadevan /* get all the necessary handles from the private DM object */ 1464304006b3SVijay Mahadevan (*newdm)->data = (DM_Moab*) dm->data; 1465304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->refct++; 1466304006b3SVijay Mahadevan 14679566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject) *newdm, DMMOAB)); 14689566063dSJacob Faibussowitsch PetscCall(DMInitialize_Moab(*newdm)); 1469304006b3SVijay Mahadevan PetscFunctionReturn(0); 1470304006b3SVijay Mahadevan } 1471304006b3SVijay Mahadevan 1472f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1473f6829af0SVijay Mahadevan { 1474f6829af0SVijay Mahadevan PetscFunctionBegin; 1475f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 14769566063dSJacob Faibussowitsch PetscCall(PetscNewLog(dm, (DM_Moab**)&dm->data)); 1477f6829af0SVijay Mahadevan 1478f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1479f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1480f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1481f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1482f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1483f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1484f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1485f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1486c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_map = NULL; 1487c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_sendrecv = NULL; 1488f6829af0SVijay Mahadevan 1489304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->refct = 1; 1490304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->parent = NULL; 1491f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1492f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1493f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1494f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1495f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1496f6829af0SVijay Mahadevan 14979566063dSJacob Faibussowitsch PetscCall(DMInitialize_Moab(dm)); 1498f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1499f6829af0SVijay Mahadevan } 1500