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 9*0b207066SBarry Smith DMMOAB = "moab" - A `DM` object that encapsulates an unstructured mesh described by the MOAB mesh database. 10c6ef30f9SVijay Mahadevan Direct access to the MOAB Interface and other mesh manipulation related objects are available 11c6ef30f9SVijay Mahadevan through public API. Ability to create global and local representation of Vecs containing all 12c6ef30f9SVijay Mahadevan unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided 13c6ef30f9SVijay Mahadevan along with utility functions to traverse the mesh and assemble a discrete system via 14c6ef30f9SVijay Mahadevan field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are 15c6ef30f9SVijay Mahadevan available. 16c6ef30f9SVijay Mahadevan 17c6ef30f9SVijay Mahadevan Level: intermediate 18c6ef30f9SVijay Mahadevan 19*0b207066SBarry Smith Reference: 20*0b207066SBarry Smith . * - https://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html 21*0b207066SBarry Smith 22*0b207066SBarry Smith .seealso: `DMMOAB`, `DMType`, `DMMoabCreate()`, `DMCreate()`, `DMSetType()`, `DMMoabCreateMoab()` 23c6ef30f9SVijay Mahadevan M*/ 24c6ef30f9SVijay Mahadevan 25304006b3SVijay Mahadevan /* External function declarations here */ 26304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling); 27304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm); 28304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J); 29304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm); 30304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined); 31304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened); 32304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]); 33304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm, PetscInt nlevels, DM dmCoarsened[]); 34304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm); 35304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM, Vec *); 36304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM, Vec *); 37304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J); 38304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM, Vec, InsertMode, Vec); 39304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM, Vec, InsertMode, Vec); 40304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM, Vec, InsertMode, Vec); 41304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM, Vec, InsertMode, Vec); 42304006b3SVijay Mahadevan 43304006b3SVijay Mahadevan /* Un-implemented routines */ 44304006b3SVijay Mahadevan /* 451bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMCreatelocalsection_Moab(DM dm); 46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat); 47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer); 48304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd); 49304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm); 50304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS); 51304006b3SVijay Mahadevan */ 52c6ef30f9SVijay Mahadevan 53cab5ea25SPierre Jolivet /*@C 54*0b207066SBarry Smith DMMoabCreate - Creates a `DMMOAB` object, which encapsulates a moab instance 551d72bce8STim Tautges 56d083f849SBarry Smith Collective 571d72bce8STim Tautges 581d72bce8STim Tautges Input Parameter: 59*0b207066SBarry Smith . comm - The communicator for the `DMMOAB` object 601d72bce8STim Tautges 611d72bce8STim Tautges Output Parameter: 62*0b207066SBarry Smith . dmb - The `DMMOAB` object 631d72bce8STim Tautges 641d72bce8STim Tautges Level: beginner 651d72bce8STim Tautges 66*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCreateMoab()` 671d72bce8STim Tautges @*/ 68d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 69d71ae5a4SJacob Faibussowitsch { 701d72bce8STim Tautges PetscFunctionBegin; 714f572ea9SToby Isaac PetscAssertPointer(dmb, 2); 729566063dSJacob Faibussowitsch PetscCall(DMCreate(comm, dmb)); 739566063dSJacob Faibussowitsch PetscCall(DMSetType(*dmb, DMMOAB)); 743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 751d72bce8STim Tautges } 761d72bce8STim Tautges 77cab5ea25SPierre Jolivet /*@C 78*0b207066SBarry Smith DMMoabCreateMoab - Creates a `DMMOAB` object, optionally from an instance and other data 791d72bce8STim Tautges 80d083f849SBarry Smith Collective 811d72bce8STim Tautges 82d8d19677SJose E. Roman Input Parameters: 83*0b207066SBarry Smith + comm - The communicator for the `DMMOAB` object 84*0b207066SBarry Smith . mbiface - (ptr to) the `DMMOAB` Instance; if passed in `NULL`, MOAB instance is created inside PETSc, and destroyed 85*0b207066SBarry Smith along with the `DMMOAB` 861d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 87*0b207066SBarry Smith - range - If non-`NULL`, contains range of entities to which DOFs will be assigned 881d72bce8STim Tautges 891d72bce8STim Tautges Output Parameter: 90*0b207066SBarry Smith . dmb - The `DMMOAB` object 911d72bce8STim Tautges 92032b8ab6SVijay Mahadevan Level: intermediate 931d72bce8STim Tautges 94*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCreate()` 951d72bce8STim Tautges @*/ 96d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 97d71ae5a4SJacob Faibussowitsch { 98032b8ab6SVijay Mahadevan moab::ErrorCode merr; 9985d305f5SVijay Mahadevan DM dmmb; 100853cdec3SJed Brown DM_Moab *dmmoab; 1011d72bce8STim Tautges 1021d72bce8STim Tautges PetscFunctionBegin; 1034f572ea9SToby Isaac PetscAssertPointer(dmb, 6); 10485d305f5SVijay Mahadevan 1059566063dSJacob Faibussowitsch PetscCall(DMMoabCreate(comm, &dmmb)); 10685d305f5SVijay Mahadevan dmmoab = (DM_Moab *)(dmmb)->data; 107a4d2169cSTim Tautges 108a4d2169cSTim Tautges if (!mbiface) { 10972ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 1107d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 1119371c9d4SSatish Balay } else { 1121cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 1137d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 1141cec0304SVijay Mahadevan } 1151cec0304SVijay Mahadevan 116b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 117b5410836SVijay Mahadevan dmmoab->fileset = 0; 118b117cd09SVijay Mahadevan dmmoab->hlevel = 0; 11949d66b22SVijay Mahadevan dmmoab->nghostrings = 0; 1207d89fc02STim Tautges 1219daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1229daf19fdSVijay Mahadevan moab::EntityHandle partnset; 123032b8ab6SVijay Mahadevan 124db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 125db66d124SVijay Mahadevan to the load_file functions to be populated. */ 1269371c9d4SSatish Balay merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); 1279371c9d4SSatish Balay MBERR("Creating partition set failed", merr); 128032b8ab6SVijay Mahadevan 129db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 13072ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 1319daf19fdSVijay Mahadevan #endif 132032b8ab6SVijay Mahadevan 1334973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 1344973de03SVijay Mahadevan dmmoab->bs = 1; 135addae81cSVijay Mahadevan dmmoab->numFields = 1; 1369566063dSJacob Faibussowitsch PetscCall(PetscMalloc(dmmoab->numFields * sizeof(char *), &dmmoab->fieldNames)); 1379566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy("DEFAULT", (char **)&dmmoab->fieldNames[0])); 1382e4e7c01SVijay Mahadevan dmmoab->rw_dbglevel = 0; 1392e4e7c01SVijay Mahadevan dmmoab->partition_by_rank = PETSC_FALSE; 1402e4e7c01SVijay Mahadevan dmmoab->extra_read_options[0] = '\0'; 1412e4e7c01SVijay Mahadevan dmmoab->extra_write_options[0] = '\0'; 1422e4e7c01SVijay Mahadevan dmmoab->read_mode = READ_PART; 1432e4e7c01SVijay Mahadevan dmmoab->write_mode = WRITE_PART; 1444973de03SVijay Mahadevan 1454973de03SVijay Mahadevan /* set global ID tag handle */ 1461a845d2aSVijay Mahadevan if (ltog_tag && *ltog_tag) { 1479566063dSJacob Faibussowitsch PetscCall(DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag)); 1489371c9d4SSatish Balay } else { 1499371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); 1509371c9d4SSatish Balay MBERRNM(merr); 1511a845d2aSVijay Mahadevan if (ltog_tag) *ltog_tag = dmmoab->ltog_tag; 152a4d2169cSTim Tautges } 153a4d2169cSTim Tautges 1549371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag); 1559371c9d4SSatish Balay MBERRNM(merr); 156340f3b9aSVijay Mahadevan 1574973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 15848a46eb9SPierre Jolivet if (range) PetscCall(DMMoabSetLocalVertices(dmmb, range)); 15985d305f5SVijay Mahadevan *dmb = dmmb; 1603ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1611d72bce8STim Tautges } 1621d72bce8STim Tautges 1639daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1641d72bce8STim Tautges 165cab5ea25SPierre Jolivet /*@C 166*0b207066SBarry Smith DMMoabGetParallelComm - Get the ParallelComm used with this `DMMOAB` 167aa768e4cSTim Tautges 168d083f849SBarry Smith Collective 169aa768e4cSTim Tautges 170aa768e4cSTim Tautges Input Parameter: 171*0b207066SBarry Smith . dm - The `DMMOAB` object being set 172aa768e4cSTim Tautges 173aa768e4cSTim Tautges Output Parameter: 174*0b207066SBarry Smith . pcomm - The ParallelComm for the `DMMOAB` 175aa768e4cSTim Tautges 176aa768e4cSTim Tautges Level: beginner 177aa768e4cSTim Tautges 178*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetInterface()` 179aa768e4cSTim Tautges @*/ 180d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm) 181d71ae5a4SJacob Faibussowitsch { 1821d72bce8STim Tautges PetscFunctionBegin; 1831d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 184032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab *)(dm)->data)->pcomm; 1853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1861d72bce8STim Tautges } 1871d72bce8STim Tautges 1889daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */ 1899daf19fdSVijay Mahadevan 190cab5ea25SPierre Jolivet /*@C 191*0b207066SBarry Smith DMMoabSetInterface - Set the MOAB instance used with this `DMMOAB` 192aa768e4cSTim Tautges 193d083f849SBarry Smith Collective 194aa768e4cSTim Tautges 195d8d19677SJose E. Roman Input Parameters: 196*0b207066SBarry Smith + dm - The `DMMOAB` object being set 197*0b207066SBarry Smith - mbiface - The MOAB instance being set on this `DMMOAB` 198aa768e4cSTim Tautges 199aa768e4cSTim Tautges Level: beginner 200aa768e4cSTim Tautges 201*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetInterface()` 202aa768e4cSTim Tautges @*/ 203d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface) 204d71ae5a4SJacob Faibussowitsch { 205032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)(dm)->data; 206032b8ab6SVijay Mahadevan 2071d72bce8STim Tautges PetscFunctionBegin; 2081d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2094f572ea9SToby Isaac PetscAssertPointer(mbiface, 2); 2109daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 211032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 2129daf19fdSVijay Mahadevan #endif 213032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 214032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2161d72bce8STim Tautges } 2171d72bce8STim Tautges 218cab5ea25SPierre Jolivet /*@C 219*0b207066SBarry Smith DMMoabGetInterface - Get the MOAB instance used with this `DMMOAB` 220aa768e4cSTim Tautges 221d083f849SBarry Smith Collective 222aa768e4cSTim Tautges 223aa768e4cSTim Tautges Input Parameter: 224*0b207066SBarry Smith . dm - The `DMMOAB` object being set 225aa768e4cSTim Tautges 226aa768e4cSTim Tautges Output Parameter: 227*0b207066SBarry Smith . mbiface - The MOAB instance set on this `DMMOAB` 228aa768e4cSTim Tautges 229aa768e4cSTim Tautges Level: beginner 230aa768e4cSTim Tautges 231*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetInterface()` 232aa768e4cSTim Tautges @*/ 233d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface) 234d71ae5a4SJacob Faibussowitsch { 235cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 236cabb514dSBarry Smith 2371d72bce8STim Tautges PetscFunctionBegin; 2381d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2399371c9d4SSatish Balay 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, " 2409371c9d4SSatish Balay "K. and Stimpson, C. and Ernst, C.},\n year = {2004}, note = {Report}\n}\n", 2419371c9d4SSatish Balay &cite)); 242a4d2169cSTim Tautges *mbiface = ((DM_Moab *)dm->data)->mbiface; 2433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2441d72bce8STim Tautges } 2451d72bce8STim Tautges 246cab5ea25SPierre Jolivet /*@C 247*0b207066SBarry Smith DMMoabSetLocalVertices - Set the entities having DOFs on this `DMMOAB` 248aa768e4cSTim Tautges 249d083f849SBarry Smith Collective 250aa768e4cSTim Tautges 251d8d19677SJose E. Roman Input Parameters: 252*0b207066SBarry Smith + dm - The `DMMOAB` object being set 253*0b207066SBarry Smith - range - The entities treated by this `DMMOAB` 254aa768e4cSTim Tautges 255aa768e4cSTim Tautges Level: beginner 256aa768e4cSTim Tautges 257*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetAllVertices()` 258aa768e4cSTim Tautges @*/ 259d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range) 260d71ae5a4SJacob Faibussowitsch { 261fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 262032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)(dm)->data; 263032b8ab6SVijay Mahadevan 2641d72bce8STim Tautges PetscFunctionBegin; 2651d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 266032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 267032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 268fd3326ddSVijay Mahadevan 269032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 270fd3326ddSVijay Mahadevan 2719daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 2729daf19fdSVijay Mahadevan moab::ErrorCode merr; 273fd3326ddSVijay Mahadevan /* filter based on parallel status */ 2749371c9d4SSatish Balay merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); 2759371c9d4SSatish Balay MBERRNM(merr); 276fd3326ddSVijay Mahadevan 277fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 278fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 2799371c9d4SSatish Balay merr = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); 2809371c9d4SSatish Balay MBERRNM(merr); 281fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 282fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 2839daf19fdSVijay Mahadevan #else 2849daf19fdSVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 2859daf19fdSVijay Mahadevan #endif 286fd3326ddSVijay Mahadevan 287fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 288032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 289032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 2909daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 2911c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm)); 2929daf19fdSVijay Mahadevan #else 2939daf19fdSVijay Mahadevan dmmoab->n = dmmoab->nloc; 2949daf19fdSVijay Mahadevan #endif 2953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2961d72bce8STim Tautges } 2971d72bce8STim Tautges 298cab5ea25SPierre Jolivet /*@C 299*0b207066SBarry Smith DMMoabGetAllVertices - Get the entities having DOFs on this `DMMOAB` 3008d8d51c8SVijay Mahadevan 301d083f849SBarry Smith Collective 3028d8d51c8SVijay Mahadevan 3038d8d51c8SVijay Mahadevan Input Parameter: 304*0b207066SBarry Smith . dm - The `DMMOAB` object being set 3058d8d51c8SVijay Mahadevan 3068d8d51c8SVijay Mahadevan Output Parameter: 307*0b207066SBarry Smith . local - The local vertex entities in this `DMMOAB` = (owned+ghosted) 3088d8d51c8SVijay Mahadevan 3098d8d51c8SVijay Mahadevan Level: beginner 3108d8d51c8SVijay Mahadevan 311*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetLocalVertices()` 3128d8d51c8SVijay Mahadevan @*/ 313d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local) 314d71ae5a4SJacob Faibussowitsch { 3158d8d51c8SVijay Mahadevan PetscFunctionBegin; 3168d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 3178d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab *)dm->data)->vlocal; 3183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3198d8d51c8SVijay Mahadevan } 3208d8d51c8SVijay Mahadevan 321cab5ea25SPierre Jolivet /*@C 322*0b207066SBarry Smith DMMoabGetLocalVertices - Get the entities having DOFs on this `DMMOAB` 323aa768e4cSTim Tautges 324d083f849SBarry Smith Collective 325aa768e4cSTim Tautges 326aa768e4cSTim Tautges Input Parameter: 327*0b207066SBarry Smith . dm - The `DMMOAB` object being set 328aa768e4cSTim Tautges 329a2b725a8SWilliam Gropp Output Parameters: 330*0b207066SBarry Smith + owned - The owned vertex entities in this `DMMOAB` 331a2b725a8SWilliam Gropp - ghost - The ghosted entities (non-owned) stored locally in this partition 332aa768e4cSTim Tautges 333aa768e4cSTim Tautges Level: beginner 334aa768e4cSTim Tautges 335*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetAllVertices()` 336aa768e4cSTim Tautges @*/ 337d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost) 338d71ae5a4SJacob Faibussowitsch { 3391d72bce8STim Tautges PetscFunctionBegin; 3401d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 341351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab *)dm->data)->vowned; 342351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab *)dm->data)->vghost; 3433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3441d72bce8STim Tautges } 3451d72bce8STim Tautges 346cab5ea25SPierre Jolivet /*@C 3475eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3485eb88e9dSVijay Mahadevan 349d083f849SBarry Smith Collective 3505eb88e9dSVijay Mahadevan 3515eb88e9dSVijay Mahadevan Input Parameter: 352*0b207066SBarry Smith . dm - The `DMMOAB` object being set 3535eb88e9dSVijay Mahadevan 3545eb88e9dSVijay Mahadevan Output Parameter: 3555eb88e9dSVijay Mahadevan . range - The entities owned locally 3565eb88e9dSVijay Mahadevan 3575eb88e9dSVijay Mahadevan Level: beginner 3585eb88e9dSVijay Mahadevan 359*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetLocalElements()` 3605eb88e9dSVijay Mahadevan @*/ 361d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range) 362d71ae5a4SJacob Faibussowitsch { 3635eb88e9dSVijay Mahadevan PetscFunctionBegin; 3645eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 365351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab *)dm->data)->elocal; 3663ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3671cec0304SVijay Mahadevan } 3681cec0304SVijay Mahadevan 369cab5ea25SPierre Jolivet /*@C 370*0b207066SBarry Smith DMMoabSetLocalElements - Set the entities having DOFs on this `DMMOAB` 3711cec0304SVijay Mahadevan 372d083f849SBarry Smith Collective 3731cec0304SVijay Mahadevan 374a2b725a8SWilliam Gropp Input Parameters: 375*0b207066SBarry Smith + dm - The `DMMOAB` object being set 376*0b207066SBarry Smith - range - The entities treated by this `DMMOAB` 3771cec0304SVijay Mahadevan 3781cec0304SVijay Mahadevan Level: beginner 3791cec0304SVijay Mahadevan 380*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetLocalElements()` 3811cec0304SVijay Mahadevan @*/ 382d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range) 383d71ae5a4SJacob Faibussowitsch { 3841cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)(dm)->data; 3851cec0304SVijay Mahadevan 3861cec0304SVijay Mahadevan PetscFunctionBegin; 3871cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 3881cec0304SVijay Mahadevan dmmoab->elocal->clear(); 3891cec0304SVijay Mahadevan dmmoab->eghost->clear(); 3901cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 3919daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 3929daf19fdSVijay Mahadevan moab::ErrorCode merr; 3939371c9d4SSatish Balay merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); 3949371c9d4SSatish Balay MBERRNM(merr); 3951cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 3969daf19fdSVijay Mahadevan #endif 3971cec0304SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 39841dd5348SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 3999daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 4001c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm)); 4013ba16761SJacob Faibussowitsch PetscCall(PetscInfo(dm, "Created %" PetscInt_FMT " local and %" PetscInt_FMT " global elements.\n", dmmoab->neleloc, dmmoab->nele)); 4029daf19fdSVijay Mahadevan #else 4039daf19fdSVijay Mahadevan dmmoab->nele = dmmoab->neleloc; 4049daf19fdSVijay Mahadevan #endif 4053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4065eb88e9dSVijay Mahadevan } 4075eb88e9dSVijay Mahadevan 408cab5ea25SPierre Jolivet /*@C 409aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 410aa768e4cSTim Tautges 411d083f849SBarry Smith Collective 412aa768e4cSTim Tautges 413a2b725a8SWilliam Gropp Input Parameters: 414*0b207066SBarry Smith + dm - The `DMMOAB` object being set 415*0b207066SBarry Smith - ltogtag - The `DMMOAB` tag used for local to global ids 416aa768e4cSTim Tautges 417aa768e4cSTim Tautges Level: beginner 418aa768e4cSTim Tautges 419*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetLocalToGlobalTag()` 420aa768e4cSTim Tautges @*/ 421d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag) 422d71ae5a4SJacob Faibussowitsch { 4231d72bce8STim Tautges PetscFunctionBegin; 4241d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4251d72bce8STim Tautges ((DM_Moab *)dm->data)->ltog_tag = ltogtag; 4263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4271d72bce8STim Tautges } 4281d72bce8STim Tautges 429cab5ea25SPierre Jolivet /*@C 430aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 431aa768e4cSTim Tautges 432d083f849SBarry Smith Collective 433aa768e4cSTim Tautges 434aa768e4cSTim Tautges Input Parameter: 435*0b207066SBarry Smith . dm - The `DMMOAB` object being set 436aa768e4cSTim Tautges 437aa768e4cSTim Tautges Output Parameter: 43860225df5SJacob Faibussowitsch . ltog_tag - The MOAB tag used for local to global ids 439aa768e4cSTim Tautges 440aa768e4cSTim Tautges Level: beginner 441aa768e4cSTim Tautges 442*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetLocalToGlobalTag()` 443aa768e4cSTim Tautges @*/ 444d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag) 445d71ae5a4SJacob Faibussowitsch { 4461d72bce8STim Tautges PetscFunctionBegin; 4471d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4481d72bce8STim Tautges *ltog_tag = ((DM_Moab *)dm->data)->ltog_tag; 4493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4501d72bce8STim Tautges } 4511d72bce8STim Tautges 452cab5ea25SPierre Jolivet /*@C 453*0b207066SBarry Smith DMMoabSetBlockSize - Set the block size used with this `DMMOAB` 454aa768e4cSTim Tautges 455d083f849SBarry Smith Collective 456aa768e4cSTim Tautges 457d8d19677SJose E. Roman Input Parameters: 458*0b207066SBarry Smith + dm - The `DMMOAB` object being set 459*0b207066SBarry Smith - bs - The block size used with this `DMMOAB` 460aa768e4cSTim Tautges 461aa768e4cSTim Tautges Level: beginner 462aa768e4cSTim Tautges 463*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetBlockSize()` 464aa768e4cSTim Tautges @*/ 465d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs) 466d71ae5a4SJacob Faibussowitsch { 4671d72bce8STim Tautges PetscFunctionBegin; 4681d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4691d72bce8STim Tautges ((DM_Moab *)dm->data)->bs = bs; 4703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4711d72bce8STim Tautges } 4721d72bce8STim Tautges 473cab5ea25SPierre Jolivet /*@C 474*0b207066SBarry Smith DMMoabGetBlockSize - Get the block size used with this `DMMOAB` 475aa768e4cSTim Tautges 476d083f849SBarry Smith Collective 477aa768e4cSTim Tautges 478aa768e4cSTim Tautges Input Parameter: 479*0b207066SBarry Smith . dm - The `DMMOAB` object being set 480aa768e4cSTim Tautges 481aa768e4cSTim Tautges Output Parameter: 482*0b207066SBarry Smith . bs - The block size used with this `DMMOAB` 483aa768e4cSTim Tautges 484aa768e4cSTim Tautges Level: beginner 485aa768e4cSTim Tautges 486*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabSetBlockSize()` 487aa768e4cSTim Tautges @*/ 488d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs) 489d71ae5a4SJacob Faibussowitsch { 4901d72bce8STim Tautges PetscFunctionBegin; 4911d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4921d72bce8STim Tautges *bs = ((DM_Moab *)dm->data)->bs; 4933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4941d72bce8STim Tautges } 4951d72bce8STim Tautges 496cab5ea25SPierre Jolivet /*@C 497*0b207066SBarry Smith DMMoabGetSize - Get the global vertex size used with this `DMMOAB` 498212ad6d1SVijay Mahadevan 499*0b207066SBarry Smith Collective 500212ad6d1SVijay Mahadevan 501212ad6d1SVijay Mahadevan Input Parameter: 502*0b207066SBarry Smith . dm - The `DMMOAB` object being set 503212ad6d1SVijay Mahadevan 504d8d19677SJose E. Roman Output Parameters: 505*0b207066SBarry Smith + neg - The number of global elements in the `DMMOAB` instance 506*0b207066SBarry Smith - nvg - The number of global vertices in the `DMMOAB` instance 507212ad6d1SVijay Mahadevan 508212ad6d1SVijay Mahadevan Level: beginner 509212ad6d1SVijay Mahadevan 510*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetLocalSize()` 511212ad6d1SVijay Mahadevan @*/ 512d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg) 513d71ae5a4SJacob Faibussowitsch { 514212ad6d1SVijay Mahadevan PetscFunctionBegin; 515212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 51641dd5348SVijay Mahadevan if (neg) *neg = ((DM_Moab *)dm->data)->nele; 51741dd5348SVijay Mahadevan if (nvg) *nvg = ((DM_Moab *)dm->data)->n; 5183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 519212ad6d1SVijay Mahadevan } 520212ad6d1SVijay Mahadevan 521cab5ea25SPierre Jolivet /*@C 522*0b207066SBarry Smith DMMoabGetLocalSize - Get the local and ghosted vertex size used with this `DMMOAB` 523212ad6d1SVijay Mahadevan 524*0b207066SBarry Smith Collective 525212ad6d1SVijay Mahadevan 526212ad6d1SVijay Mahadevan Input Parameter: 527*0b207066SBarry Smith . dm - The `DMMOAB` object being set 528212ad6d1SVijay Mahadevan 529d8d19677SJose E. Roman Output Parameters: 530b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor 53100cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 53200cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 533a2b725a8SWilliam Gropp - nvg - The number of ghosted vertices in this processor 534212ad6d1SVijay Mahadevan 535212ad6d1SVijay Mahadevan Level: beginner 536212ad6d1SVijay Mahadevan 537*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetSize()` 538212ad6d1SVijay Mahadevan @*/ 539d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg) 540d71ae5a4SJacob Faibussowitsch { 541212ad6d1SVijay Mahadevan PetscFunctionBegin; 542212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 54341dd5348SVijay Mahadevan if (nel) *nel = ((DM_Moab *)dm->data)->neleloc; 54441dd5348SVijay Mahadevan if (neg) *neg = ((DM_Moab *)dm->data)->neleghost; 54541dd5348SVijay Mahadevan if (nvl) *nvl = ((DM_Moab *)dm->data)->nloc; 54641dd5348SVijay Mahadevan if (nvg) *nvg = ((DM_Moab *)dm->data)->nghost; 5473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 548212ad6d1SVijay Mahadevan } 549212ad6d1SVijay Mahadevan 550cab5ea25SPierre Jolivet /*@C 55100cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 55200cc10feSVijay Mahadevan 553d083f849SBarry Smith Collective 55400cc10feSVijay Mahadevan 55500cc10feSVijay Mahadevan Input Parameter: 556*0b207066SBarry Smith . dm - The `DMMOAB` object being set 55700cc10feSVijay Mahadevan 55800cc10feSVijay Mahadevan Output Parameter: 55900cc10feSVijay Mahadevan . offset - The local offset for the global vector 56000cc10feSVijay Mahadevan 56100cc10feSVijay Mahadevan Level: beginner 56200cc10feSVijay Mahadevan 563*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetDimension()` 56400cc10feSVijay Mahadevan @*/ 565d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset) 566d71ae5a4SJacob Faibussowitsch { 56700cc10feSVijay Mahadevan PetscFunctionBegin; 56800cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 56900cc10feSVijay Mahadevan *offset = ((DM_Moab *)dm->data)->vstart; 5703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 57100cc10feSVijay Mahadevan } 57200cc10feSVijay Mahadevan 573cab5ea25SPierre Jolivet /*@C 574*0b207066SBarry Smith DMMoabGetDimension - Get the dimension of the `DM` Mesh 5754920ab11SVijay Mahadevan 576d083f849SBarry Smith Collective 5774920ab11SVijay Mahadevan 5784920ab11SVijay Mahadevan Input Parameter: 579*0b207066SBarry Smith . dm - The `DMMOAB` object 5804920ab11SVijay Mahadevan 5814920ab11SVijay Mahadevan Output Parameter: 582*0b207066SBarry Smith . dim - The dimension of `DM` 5834920ab11SVijay Mahadevan 5844920ab11SVijay Mahadevan Level: beginner 5854920ab11SVijay Mahadevan 586*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetOffset()` 5874920ab11SVijay Mahadevan @*/ 588d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim) 589d71ae5a4SJacob Faibussowitsch { 5904920ab11SVijay Mahadevan PetscFunctionBegin; 5914920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5924920ab11SVijay Mahadevan *dim = ((DM_Moab *)dm->data)->dim; 5933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5944920ab11SVijay Mahadevan } 5954920ab11SVijay Mahadevan 596cab5ea25SPierre Jolivet /*@C 597755f3dfbSVijay Mahadevan DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy 598755f3dfbSVijay Mahadevan generated through uniform refinement. 599755f3dfbSVijay Mahadevan 600*0b207066SBarry Smith Collective 601755f3dfbSVijay Mahadevan 602755f3dfbSVijay Mahadevan Input Parameter: 603*0b207066SBarry Smith . dm - The `DMMOAB` object being set 604755f3dfbSVijay Mahadevan 605755f3dfbSVijay Mahadevan Output Parameter: 60660225df5SJacob Faibussowitsch . nlevel - The current mesh hierarchy level 607755f3dfbSVijay Mahadevan 608755f3dfbSVijay Mahadevan Level: beginner 609755f3dfbSVijay Mahadevan 610*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetMaterialBlock()` 611755f3dfbSVijay Mahadevan @*/ 612d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel) 613d71ae5a4SJacob Faibussowitsch { 614755f3dfbSVijay Mahadevan PetscFunctionBegin; 615755f3dfbSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 616755f3dfbSVijay Mahadevan if (nlevel) *nlevel = ((DM_Moab *)dm->data)->hlevel; 6173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 618755f3dfbSVijay Mahadevan } 619755f3dfbSVijay Mahadevan 620cab5ea25SPierre Jolivet /*@C 621340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 622340f3b9aSVijay Mahadevan 623d083f849SBarry Smith Collective 624340f3b9aSVijay Mahadevan 625d8d19677SJose E. Roman Input Parameters: 626*0b207066SBarry Smith + dm - The `DMMOAB` object 627a2b725a8SWilliam Gropp - ehandle - The element entity handle 628340f3b9aSVijay Mahadevan 629340f3b9aSVijay Mahadevan Output Parameter: 630340f3b9aSVijay Mahadevan . mat - The material ID for the current entity 631340f3b9aSVijay Mahadevan 632340f3b9aSVijay Mahadevan Level: beginner 633340f3b9aSVijay Mahadevan 634*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetHierarchyLevel()` 635340f3b9aSVijay Mahadevan @*/ 636d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat) 637d71ae5a4SJacob Faibussowitsch { 638340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 639340f3b9aSVijay Mahadevan 640340f3b9aSVijay Mahadevan PetscFunctionBegin; 641340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 642340f3b9aSVijay Mahadevan if (*mat) { 643340f3b9aSVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 644a044f6b6SVijay Mahadevan *mat = dmmoab->materials[dmmoab->elocal->index(ehandle)]; 645340f3b9aSVijay Mahadevan } 6463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 647340f3b9aSVijay Mahadevan } 648340f3b9aSVijay Mahadevan 649cab5ea25SPierre Jolivet /*@C 65085d305f5SVijay Mahadevan DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities 65185d305f5SVijay Mahadevan 652d083f849SBarry Smith Collective 65385d305f5SVijay Mahadevan 654d8d19677SJose E. Roman Input Parameters: 655*0b207066SBarry Smith + dm - The `DMMOAB` object 65685d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 657a2b725a8SWilliam Gropp - conn - The vertex entity handles 65885d305f5SVijay Mahadevan 65985d305f5SVijay Mahadevan Output Parameter: 66085d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities 66185d305f5SVijay Mahadevan 66285d305f5SVijay Mahadevan Level: beginner 66385d305f5SVijay Mahadevan 664*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetVertexConnectivity()` 66585d305f5SVijay Mahadevan @*/ 666d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos) 667d71ae5a4SJacob Faibussowitsch { 6687023aa44SVijay Mahadevan DM_Moab *dmmoab; 6697023aa44SVijay Mahadevan moab::ErrorCode merr; 6707023aa44SVijay Mahadevan 6717023aa44SVijay Mahadevan PetscFunctionBegin; 6727023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 6734f572ea9SToby Isaac PetscAssertPointer(conn, 3); 6744f572ea9SToby Isaac PetscAssertPointer(vpos, 4); 6757023aa44SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 6767023aa44SVijay Mahadevan 6777023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6789c368985SVijay Mahadevan if (dmmoab->hlevel) { 6799371c9d4SSatish Balay merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle *>(conn), nconn, dmmoab->hlevel, vpos); 6809371c9d4SSatish Balay MBERRNM(merr); 6819371c9d4SSatish Balay } else { 6829371c9d4SSatish Balay merr = dmmoab->mbiface->get_coords(conn, nconn, vpos); 6839371c9d4SSatish Balay MBERRNM(merr); 6849c368985SVijay Mahadevan } 6853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6867023aa44SVijay Mahadevan } 6877023aa44SVijay Mahadevan 688cab5ea25SPierre Jolivet /*@C 68985d305f5SVijay Mahadevan DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity 69085d305f5SVijay Mahadevan 691d083f849SBarry Smith Collective 69285d305f5SVijay Mahadevan 693d8d19677SJose E. Roman Input Parameters: 694*0b207066SBarry Smith + dm - The `DMMOAB` object 695a2b725a8SWilliam Gropp - vhandle - Vertex entity handle 69685d305f5SVijay Mahadevan 697d8d19677SJose E. Roman Output Parameters: 698a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed 699a2b725a8SWilliam Gropp - conn - The vertex entity handles 70085d305f5SVijay Mahadevan 70185d305f5SVijay Mahadevan Level: beginner 70285d305f5SVijay Mahadevan 703*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetVertexCoordinates()`, `DMMoabRestoreVertexConnectivity()` 70485d305f5SVijay Mahadevan @*/ 705d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt *nconn, moab::EntityHandle **conn) 706d71ae5a4SJacob Faibussowitsch { 7078d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 7088d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities, connect; 7098d8d51c8SVijay Mahadevan moab::ErrorCode merr; 7108d8d51c8SVijay Mahadevan 7118d8d51c8SVijay Mahadevan PetscFunctionBegin; 7128d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7134f572ea9SToby Isaac PetscAssertPointer(conn, 4); 7148d8d51c8SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 7158d8d51c8SVijay Mahadevan 7168d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7179371c9d4SSatish Balay merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION); 7189371c9d4SSatish Balay MBERRNM(merr); 7199371c9d4SSatish Balay merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect); 7209371c9d4SSatish Balay MBERRNM(merr); 7218d8d51c8SVijay Mahadevan 7228d8d51c8SVijay Mahadevan if (conn) { 7239566063dSJacob Faibussowitsch PetscCall(PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn)); 7249566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(*conn, &connect[0], connect.size())); 7258d8d51c8SVijay Mahadevan } 7268d8d51c8SVijay Mahadevan if (nconn) *nconn = connect.size(); 7273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7288d8d51c8SVijay Mahadevan } 7298d8d51c8SVijay Mahadevan 730cab5ea25SPierre Jolivet /*@C 73185d305f5SVijay Mahadevan DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity 73285d305f5SVijay Mahadevan 733d083f849SBarry Smith Collective 73485d305f5SVijay Mahadevan 735d8d19677SJose E. Roman Input Parameters: 736*0b207066SBarry Smith + dm - The `DMMOAB` object 73760225df5SJacob Faibussowitsch . ehandle - Vertex entity handle 73885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 739a2b725a8SWilliam Gropp - conn - The vertex entity handles 74085d305f5SVijay Mahadevan 74185d305f5SVijay Mahadevan Level: beginner 74285d305f5SVijay Mahadevan 743*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetVertexCoordinates()`, `DMMoabGetVertexConnectivity()` 74485d305f5SVijay Mahadevan @*/ 745d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt *nconn, moab::EntityHandle **conn) 746d71ae5a4SJacob Faibussowitsch { 7478d8d51c8SVijay Mahadevan PetscFunctionBegin; 7488d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7494f572ea9SToby Isaac PetscAssertPointer(conn, 4); 7508d8d51c8SVijay Mahadevan 75148a46eb9SPierre Jolivet if (conn) PetscCall(PetscFree(*conn)); 7528d8d51c8SVijay Mahadevan if (nconn) *nconn = 0; 7533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7548d8d51c8SVijay Mahadevan } 7558d8d51c8SVijay Mahadevan 756cab5ea25SPierre Jolivet /*@C 75785d305f5SVijay Mahadevan DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity 75885d305f5SVijay Mahadevan 759d083f849SBarry Smith Collective 76085d305f5SVijay Mahadevan 761d8d19677SJose E. Roman Input Parameters: 762*0b207066SBarry Smith + dm - The `DMMOAB` object 763a2b725a8SWilliam Gropp - ehandle - Vertex entity handle 76485d305f5SVijay Mahadevan 765d8d19677SJose E. Roman Output Parameters: 766a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed 767a2b725a8SWilliam Gropp - conn - The vertex entity handles 76885d305f5SVijay Mahadevan 76985d305f5SVijay Mahadevan Level: beginner 77085d305f5SVijay Mahadevan 771*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabGetVertexCoordinates()`, `DMMoabGetVertexConnectivity()`, `DMMoabRestoreVertexConnectivity()` 77285d305f5SVijay Mahadevan @*/ 773d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt *nconn, const moab::EntityHandle **conn) 774d71ae5a4SJacob Faibussowitsch { 7757023aa44SVijay Mahadevan DM_Moab *dmmoab; 7767023aa44SVijay Mahadevan const moab::EntityHandle *connect; 7779c368985SVijay Mahadevan std::vector<moab::EntityHandle> vconn; 7787023aa44SVijay Mahadevan moab::ErrorCode merr; 7797023aa44SVijay Mahadevan PetscInt nnodes; 7807023aa44SVijay Mahadevan 7817023aa44SVijay Mahadevan PetscFunctionBegin; 7827023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7834f572ea9SToby Isaac PetscAssertPointer(conn, 4); 7847023aa44SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 7857023aa44SVijay Mahadevan 7867023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7879371c9d4SSatish Balay merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes); 7889371c9d4SSatish Balay MBERRNM(merr); 7897023aa44SVijay Mahadevan if (conn) *conn = connect; 7907023aa44SVijay Mahadevan if (nconn) *nconn = nnodes; 7913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7927023aa44SVijay Mahadevan } 7937023aa44SVijay Mahadevan 794cab5ea25SPierre Jolivet /*@C 79585d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 79685d305f5SVijay Mahadevan 797d083f849SBarry Smith Collective 79885d305f5SVijay Mahadevan 799d8d19677SJose E. Roman Input Parameters: 800*0b207066SBarry Smith + dm - The `DMMOAB` object 801a2b725a8SWilliam Gropp - ent - Entity handle 80285d305f5SVijay Mahadevan 80385d305f5SVijay Mahadevan Output Parameter: 804*0b207066SBarry Smith . ent_on_boundary - `PETSC_TRUE` if entity on boundary; `PETSC_FALSE` otherwise 80585d305f5SVijay Mahadevan 80685d305f5SVijay Mahadevan Level: beginner 80785d305f5SVijay Mahadevan 808*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCheckBoundaryVertices()` 80985d305f5SVijay Mahadevan @*/ 810d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool *ent_on_boundary) 811d71ae5a4SJacob Faibussowitsch { 81269263071SVijay Mahadevan moab::EntityType etype; 81369263071SVijay Mahadevan DM_Moab *dmmoab; 81469263071SVijay Mahadevan PetscInt edim; 81569263071SVijay Mahadevan 81669263071SVijay Mahadevan PetscFunctionBegin; 81769263071SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 8184f572ea9SToby Isaac PetscAssertPointer(ent_on_boundary, 3); 81969263071SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 82069263071SVijay Mahadevan 82169263071SVijay Mahadevan /* get the entity type and handle accordingly */ 82269263071SVijay Mahadevan etype = dmmoab->mbiface->type_from_handle(ent); 8231dca8a05SBarry Smith PetscCheck(etype < moab::MBPOLYHEDRON, PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %" PetscInt_FMT, etype); 82469263071SVijay Mahadevan 82569263071SVijay Mahadevan /* get the entity dimension */ 82669263071SVijay Mahadevan edim = dmmoab->mbiface->dimension_from_handle(ent); 82769263071SVijay Mahadevan 82869263071SVijay Mahadevan *ent_on_boundary = PETSC_FALSE; 82969263071SVijay Mahadevan if (etype == moab::MBVERTEX && edim == 0) { 83049d66b22SVijay Mahadevan *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE); 8319371c9d4SSatish Balay } else { 83269263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 8336d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE; 8349371c9d4SSatish Balay } else { /* next check the lower-dimensional faces */ 8356d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE; 83669263071SVijay Mahadevan } 83769263071SVijay Mahadevan } 8383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 83969263071SVijay Mahadevan } 84069263071SVijay Mahadevan 841cab5ea25SPierre Jolivet /*@C 8424597dd3dSJose E. Roman DMMoabCheckBoundaryVertices - Check whether a given entity is on the boundary (vertex, edge, face, element) 84385d305f5SVijay Mahadevan 84497bb3fdcSJose E. Roman Input Parameters: 845*0b207066SBarry Smith + dm - The `DMMOAB` object 84685d305f5SVijay Mahadevan . nconn - Number of handles 847a2b725a8SWilliam Gropp - cnt - Array of entity handles 84885d305f5SVijay Mahadevan 84985d305f5SVijay Mahadevan Output Parameter: 850*0b207066SBarry Smith . isbdvtx - Array of boundary markers - `PETSC_TRUE` if entity on boundary; `PETSC_FALSE` otherwise 85185d305f5SVijay Mahadevan 85285d305f5SVijay Mahadevan Level: beginner 85385d305f5SVijay Mahadevan 854*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabIsEntityOnBoundary()` 85585d305f5SVijay Mahadevan @*/ 856d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool *isbdvtx) 857d71ae5a4SJacob Faibussowitsch { 8587023aa44SVijay Mahadevan DM_Moab *dmmoab; 8597023aa44SVijay Mahadevan PetscInt i; 8607023aa44SVijay Mahadevan 8617023aa44SVijay Mahadevan PetscFunctionBegin; 8627023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 8634f572ea9SToby Isaac PetscAssertPointer(cnt, 3); 8644f572ea9SToby Isaac PetscAssertPointer(isbdvtx, 4); 8657023aa44SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 8667023aa44SVijay Mahadevan 867ad540459SPierre Jolivet for (i = 0; i < nconn; ++i) isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE); 8683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8697023aa44SVijay Mahadevan } 8707023aa44SVijay Mahadevan 871cab5ea25SPierre Jolivet /*@C 87285d305f5SVijay Mahadevan DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary 87385d305f5SVijay Mahadevan 87485d305f5SVijay Mahadevan Input Parameter: 875*0b207066SBarry Smith . dm - The `DMMOAB` object 87685d305f5SVijay Mahadevan 877d8d19677SJose E. Roman Output Parameters: 878a2b725a8SWilliam Gropp + bdvtx - Boundary vertices 87985d305f5SVijay Mahadevan . bdelems - Boundary elements 880a2b725a8SWilliam Gropp - bdfaces - Boundary faces 88185d305f5SVijay Mahadevan 88285d305f5SVijay Mahadevan Level: beginner 88385d305f5SVijay Mahadevan 884*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCheckBoundaryVertices()`, `DMMoabIsEntityOnBoundary()` 88585d305f5SVijay Mahadevan @*/ 886d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range **bdelems, const moab::Range **bdfaces) 887d71ae5a4SJacob Faibussowitsch { 8881cec0304SVijay Mahadevan DM_Moab *dmmoab; 8891cec0304SVijay Mahadevan 8901cec0304SVijay Mahadevan PetscFunctionBegin; 8911cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 8921cec0304SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 8931cec0304SVijay Mahadevan 8946d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 8956d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 8966d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 8973ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8981cec0304SVijay Mahadevan } 8991cec0304SVijay Mahadevan 900d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 901d71ae5a4SJacob Faibussowitsch { 90285d305f5SVijay Mahadevan PetscInt i; 903e882eb38SVijay Mahadevan moab::ErrorCode merr; 904f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)dm->data; 905f6829af0SVijay Mahadevan 906f6829af0SVijay Mahadevan PetscFunctionBegin; 907f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 908304006b3SVijay Mahadevan 909304006b3SVijay Mahadevan dmmoab->refct--; 910304006b3SVijay Mahadevan if (!dmmoab->refct) { 911f6829af0SVijay Mahadevan delete dmmoab->vlocal; 912f6829af0SVijay Mahadevan delete dmmoab->vowned; 913f6829af0SVijay Mahadevan delete dmmoab->vghost; 914f6829af0SVijay Mahadevan delete dmmoab->elocal; 915f6829af0SVijay Mahadevan delete dmmoab->eghost; 916f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 917f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 918f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 919f6829af0SVijay Mahadevan 9209566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->gsindices)); 9219566063dSJacob Faibussowitsch PetscCall(PetscFree2(dmmoab->gidmap, dmmoab->lidmap)); 9229566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->dfill)); 9239566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->ofill)); 9249566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->materials)); 92585d305f5SVijay Mahadevan if (dmmoab->fieldNames) { 92648a46eb9SPierre Jolivet for (i = 0; i < dmmoab->numFields; i++) PetscCall(PetscFree(dmmoab->fieldNames[i])); 9279566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->fieldNames)); 92885d305f5SVijay Mahadevan } 929b117cd09SVijay Mahadevan 930b117cd09SVijay Mahadevan if (dmmoab->nhlevels) { 9319566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->hsets)); 932e882eb38SVijay Mahadevan dmmoab->nhlevels = 0; 933e882eb38SVijay Mahadevan if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy; 934e882eb38SVijay Mahadevan dmmoab->hierarchy = NULL; 935b117cd09SVijay Mahadevan } 936e882eb38SVijay Mahadevan 937e882eb38SVijay Mahadevan if (dmmoab->icreatedinstance) { 9389c368985SVijay Mahadevan delete dmmoab->pcomm; 9399371c9d4SSatish Balay merr = dmmoab->mbiface->delete_mesh(); 9409371c9d4SSatish Balay MBERRNM(merr); 941e882eb38SVijay Mahadevan delete dmmoab->mbiface; 942e882eb38SVijay Mahadevan } 943e882eb38SVijay Mahadevan dmmoab->mbiface = NULL; 9449daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 945e882eb38SVijay Mahadevan dmmoab->pcomm = NULL; 9469daf19fdSVijay Mahadevan #endif 9479566063dSJacob Faibussowitsch PetscCall(VecScatterDestroy(&dmmoab->ltog_sendrecv)); 9489566063dSJacob Faibussowitsch PetscCall(ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map)); 9499566063dSJacob Faibussowitsch PetscCall(PetscFree(dm->data)); 950304006b3SVijay Mahadevan } 9513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 952f6829af0SVijay Mahadevan } 953f6829af0SVijay Mahadevan 954d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(DM dm, PetscOptionItems *PetscOptionsObject) 955d71ae5a4SJacob Faibussowitsch { 9562e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)dm->data; 9572e4e7c01SVijay Mahadevan 9582e4e7c01SVijay Mahadevan PetscFunctionBegin; 959d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "DMMoab Options"); 9609566063dSJacob 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)); 9619566063dSJacob 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)); 9622e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 9639566063dSJacob 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)); 9649566063dSJacob 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)); 9659566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum *)&dmmoab->read_mode, NULL)); 9669566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum *)&dmmoab->write_mode, NULL)); 967d0609cedSBarry Smith PetscOptionsHeadEnd(); 9683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9692e4e7c01SVijay Mahadevan } 9702e4e7c01SVijay Mahadevan 971d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 972d71ae5a4SJacob Faibussowitsch { 973f6829af0SVijay Mahadevan moab::ErrorCode merr; 974f6829af0SVijay Mahadevan Vec local, global; 975f6829af0SVijay Mahadevan IS from, to; 976f6829af0SVijay Mahadevan moab::Range::iterator iter; 977304006b3SVijay Mahadevan PetscInt i, j, f, bs, vent, totsize, *lgmap; 978f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)dm->data; 979f6829af0SVijay Mahadevan moab::Range adjs; 980f6829af0SVijay Mahadevan 981f6829af0SVijay Mahadevan PetscFunctionBegin; 982f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 983f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 98408401ef6SPierre Jolivet PetscCheck(dmmoab->mbiface != NULL, PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp."); 9859daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 98608401ef6SPierre Jolivet PetscCheck(dmmoab->pcomm != NULL, PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp."); 9879daf19fdSVijay Mahadevan #endif 988f6829af0SVijay Mahadevan 989f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 9909371c9d4SSatish Balay if (dmmoab->vlocal->empty()) { 99149d66b22SVijay Mahadevan //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 9929371c9d4SSatish Balay merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false); 9939371c9d4SSatish Balay MBERRNM(merr); 994f6829af0SVijay Mahadevan 9959daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 996f6829af0SVijay Mahadevan /* filter based on parallel status */ 9979371c9d4SSatish Balay merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); 9989371c9d4SSatish Balay MBERRNM(merr); 999f6829af0SVijay Mahadevan 1000f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 10019c368985SVijay Mahadevan // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 1002f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 10039371c9d4SSatish Balay merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); 10049371c9d4SSatish Balay MBERRNM(merr); 1005f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 1006f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 10079daf19fdSVijay Mahadevan #else 10089daf19fdSVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 10099daf19fdSVijay Mahadevan #endif 1010f6829af0SVijay Mahadevan 1011f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 1012f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 1013f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 101449d66b22SVijay Mahadevan 10159daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 10161c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm)); 10173ba16761SJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Filset ID: %lu, Vertices: local - %zu, owned - %" PetscInt_FMT ", ghosted - %" PetscInt_FMT ".\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost)); 10189daf19fdSVijay Mahadevan #else 10199daf19fdSVijay Mahadevan dmmoab->n = dmmoab->nloc; 10209daf19fdSVijay Mahadevan #endif 1021f6829af0SVijay Mahadevan } 1022f6829af0SVijay Mahadevan 1023f6829af0SVijay Mahadevan { 1024f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 1025f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 1026f6829af0SVijay Mahadevan 1027f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 1028f6829af0SVijay Mahadevan for (i = 3; i > 0; i--) { 1029f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 10309371c9d4SSatish Balay merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false); 10319371c9d4SSatish Balay MBERRNM(merr); 1032f6829af0SVijay Mahadevan 1033f6829af0SVijay Mahadevan /* store the current mesh dimension */ 1034f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 1035f6829af0SVijay Mahadevan dmmoab->dim = i; 1036f6829af0SVijay Mahadevan break; 1037f6829af0SVijay Mahadevan } 1038f6829af0SVijay Mahadevan } 1039f6829af0SVijay Mahadevan 10409566063dSJacob Faibussowitsch PetscCall(DMSetDimension(dm, dmmoab->dim)); 1041b117cd09SVijay Mahadevan 10429daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1043f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 1044f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 10459371c9d4SSatish Balay merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); 10469371c9d4SSatish Balay MBERRNM(merr); 1047f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 10489daf19fdSVijay Mahadevan #endif 1049f6829af0SVijay Mahadevan 1050f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 1051f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 105249d66b22SVijay Mahadevan 10539daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 10541c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm)); 10553ba16761SJacob Faibussowitsch PetscCall(PetscInfo(NULL, "%d-dim elements: owned - %" PetscInt_FMT ", ghosted - %" PetscInt_FMT ".\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost)); 10569daf19fdSVijay Mahadevan #else 10579daf19fdSVijay Mahadevan dmmoab->nele = dmmoab->neleloc; 10589daf19fdSVijay Mahadevan #endif 1059f6829af0SVijay Mahadevan } 1060f6829af0SVijay Mahadevan 1061f6829af0SVijay Mahadevan bs = dmmoab->bs; 1062f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 1063f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 1064f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 1065f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 10669371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); 10679371c9d4SSatish Balay MBERRNM(merr); 1068f6829af0SVijay Mahadevan } 1069f6829af0SVijay Mahadevan 1070f6829af0SVijay Mahadevan totsize = dmmoab->vlocal->size(); 10711dca8a05SBarry 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); 10729566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(totsize, &dmmoab->gsindices)); 1073f6829af0SVijay Mahadevan { 1074f6829af0SVijay Mahadevan /* first get the local indices */ 10759371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]); 10769371c9d4SSatish Balay MBERRNM(merr); 10773f1c6e43SVijay Mahadevan if (dmmoab->nghost) { /* next get the ghosted indices */ 10789371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]); 10799371c9d4SSatish Balay MBERRNM(merr); 1080f6829af0SVijay Mahadevan } 1081f6829af0SVijay Mahadevan 1082f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1083304006b3SVijay Mahadevan dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0]; 1084f6829af0SVijay Mahadevan for (i = 0; i < totsize; ++i) { 1085304006b3SVijay Mahadevan if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i]; 1086304006b3SVijay Mahadevan if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i]; 1087f6829af0SVijay Mahadevan } 1088f6829af0SVijay Mahadevan 10891c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm)); 10901c2dc1cbSBarry Smith PetscCall(MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm)); 1091f6829af0SVijay Mahadevan 1092f6829af0SVijay Mahadevan /* set the GID map */ 10939371c9d4SSatish Balay for (i = 0; i < totsize; ++i) { dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */ } 1094304006b3SVijay Mahadevan dmmoab->lminmax[0] -= dmmoab->gminmax[0]; 1095304006b3SVijay Mahadevan dmmoab->lminmax[1] -= dmmoab->gminmax[0]; 1096f6829af0SVijay Mahadevan 10973ba16761SJacob Faibussowitsch PetscCall(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])); 1098f6829af0SVijay Mahadevan } 10999371c9d4SSatish Balay 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, 11009371c9d4SSatish Balay dmmoab->numFields); 1101f6829af0SVijay Mahadevan 1102f6829af0SVijay Mahadevan { 11039c368985SVijay Mahadevan dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front()); 11049c368985SVijay Mahadevan dmmoab->seqend = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back()); 11053ba16761SJacob Faibussowitsch PetscCall(PetscInfo(NULL, "SEQUENCE: Local [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "]\n", dmmoab->seqstart, dmmoab->seqend)); 11063f1c6e43SVijay Mahadevan 11079566063dSJacob Faibussowitsch PetscCall(PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap)); 11089566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(totsize * dmmoab->numFields, &lgmap)); 1109f6829af0SVijay Mahadevan 1110f6829af0SVijay Mahadevan i = j = 0; 1111f6829af0SVijay Mahadevan /* set the owned vertex data first */ 1112f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) { 1113e92d1c7cSVijay Mahadevan vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart; 1114f6829af0SVijay Mahadevan dmmoab->gidmap[vent] = dmmoab->gsindices[i]; 1115f6829af0SVijay Mahadevan dmmoab->lidmap[vent] = i; 1116ad540459SPierre Jolivet for (f = 0; f < dmmoab->numFields; f++, j++) lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]); 1117f6829af0SVijay Mahadevan } 1118f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1119f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) { 1120e92d1c7cSVijay Mahadevan vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart; 1121f6829af0SVijay Mahadevan dmmoab->gidmap[vent] = dmmoab->gsindices[i]; 1122f6829af0SVijay Mahadevan dmmoab->lidmap[vent] = i; 1123ad540459SPierre Jolivet for (f = 0; f < dmmoab->numFields; f++, j++) lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]); 1124f6829af0SVijay Mahadevan } 1125f6829af0SVijay Mahadevan 1126f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1127f6829af0SVijay Mahadevan 1) First create a local and global vector 1128f6829af0SVijay Mahadevan 2) Create a local and global IS 1129f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1130f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1131f6829af0SVijay Mahadevan */ 11329566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &global)); 11339566063dSJacob Faibussowitsch PetscCall(DMCreateLocalVector(dm, &local)); 1134f6829af0SVijay Mahadevan 11359566063dSJacob Faibussowitsch PetscCall(VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend)); 1136f6829af0SVijay Mahadevan 1137f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 11389566063dSJacob Faibussowitsch PetscCall(ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from)); 11399566063dSJacob Faibussowitsch PetscCall(ISSetBlockSize(from, bs)); 1140f6829af0SVijay Mahadevan 11419566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to)); 11429566063dSJacob Faibussowitsch PetscCall(ISSetBlockSize(to, bs)); 1143f6829af0SVijay Mahadevan 1144f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1145f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 11469566063dSJacob Faibussowitsch PetscCall(ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap, PETSC_COPY_VALUES, &dmmoab->ltog_map)); 1147f6829af0SVijay Mahadevan } 1148f6829af0SVijay Mahadevan 1149f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 11509566063dSJacob Faibussowitsch PetscCall(VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv)); 1151f6829af0SVijay Mahadevan 1152f6829af0SVijay Mahadevan /* clean up IS, Vec */ 11539566063dSJacob Faibussowitsch PetscCall(PetscFree(lgmap)); 11549566063dSJacob Faibussowitsch PetscCall(ISDestroy(&from)); 11559566063dSJacob Faibussowitsch PetscCall(ISDestroy(&to)); 11569566063dSJacob Faibussowitsch PetscCall(VecDestroy(&local)); 11579566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global)); 1158f6829af0SVijay Mahadevan } 1159f6829af0SVijay Mahadevan 116049d66b22SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 116149d66b22SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 116249d66b22SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1163f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 11649c368985SVijay Mahadevan if (!dmmoab->hlevel) { 1165f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1166f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1167f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1168f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1169f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1170f6829af0SVijay Mahadevan 1171f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 11729371c9d4SSatish Balay merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, true, true, false); 11739371c9d4SSatish Balay MBERRNM(merr); // 'false' param indicates we want faces back, not vertices 1174f6829af0SVijay Mahadevan 11759daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1176f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 11779371c9d4SSatish Balay merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); 11789371c9d4SSatish Balay MBERRNM(merr); 11799371c9d4SSatish Balay merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT); 11809371c9d4SSatish Balay MBERRNM(merr); 11819daf19fdSVijay Mahadevan #endif 1182f6829af0SVijay Mahadevan 1183f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 11849371c9d4SSatish Balay merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false); 11859371c9d4SSatish Balay MBERRNM(merr); 11869371c9d4SSatish Balay merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION); 11879371c9d4SSatish Balay MBERRNM(merr); 11889371c9d4SSatish Balay } else { 11899c368985SVijay Mahadevan /* Let us query the hierarchy manager and get the results directly for this level */ 11909c368985SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) { 11919c368985SVijay Mahadevan moab::EntityHandle elemHandle = *iter; 11929c368985SVijay Mahadevan if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) { 11939c368985SVijay Mahadevan dmmoab->bndyelems->insert(elemHandle); 11949c368985SVijay Mahadevan /* For this boundary element, query the vertices and add them to the list */ 11959c368985SVijay Mahadevan std::vector<moab::EntityHandle> connect; 11969371c9d4SSatish Balay merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect); 11979371c9d4SSatish Balay MBERRNM(merr); 11989c368985SVijay Mahadevan for (unsigned iv = 0; iv < connect.size(); ++iv) 11999371c9d4SSatish Balay if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv])) dmmoab->bndyvtx->insert(connect[iv]); 12009c368985SVijay Mahadevan /* Next, let us query the boundary faces and add them also to the list */ 12019c368985SVijay Mahadevan std::vector<moab::EntityHandle> faces; 12029371c9d4SSatish Balay merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim - 1, faces); 12039371c9d4SSatish Balay MBERRNM(merr); 12049c368985SVijay Mahadevan for (unsigned ifa = 0; ifa < faces.size(); ++ifa) 12059371c9d4SSatish Balay if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa])) dmmoab->bndyfaces->insert(faces[ifa]); 12069c368985SVijay Mahadevan } 12079c368985SVijay Mahadevan } 12089c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI 12099c368985SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 12109371c9d4SSatish Balay merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx, PSTATUS_NOT_OWNED, PSTATUS_NOT); 12119371c9d4SSatish Balay MBERRNM(merr); 12129371c9d4SSatish Balay merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); 12139371c9d4SSatish Balay MBERRNM(merr); 12149371c9d4SSatish Balay merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); 12159371c9d4SSatish Balay MBERRNM(merr); 12169c368985SVijay Mahadevan #endif 12179c368985SVijay Mahadevan } 12183ba16761SJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Found %zu boundary vertices, %zu boundary faces and %zu boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size())); 1219a044f6b6SVijay Mahadevan 1220a044f6b6SVijay Mahadevan /* Get the material sets and populate the data for all locally owned elements */ 1221a044f6b6SVijay Mahadevan { 12229566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials)); 1223a044f6b6SVijay Mahadevan /* Get the count of entities of particular type from dmmoab->elocal 1224a044f6b6SVijay Mahadevan -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */ 1225a044f6b6SVijay Mahadevan moab::Range msets; 12269371c9d4SSatish Balay merr = dmmoab->mbiface->get_entities_by_type_and_tag(dmmoab->fileset, moab::MBENTITYSET, &dmmoab->material_tag, NULL, 1, msets, moab::Interface::UNION); 12273ba16761SJacob Faibussowitsch MBERRNM(merr); 12289d3446b2SPierre Jolivet if (msets.size() == 0) PetscCall(PetscInfo(NULL, "No material sets found in the fileset.\n")); 1229a044f6b6SVijay Mahadevan 1230a044f6b6SVijay Mahadevan for (unsigned i = 0; i < msets.size(); ++i) { 1231a044f6b6SVijay Mahadevan moab::Range msetelems; 12329371c9d4SSatish Balay merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true); 12333ba16761SJacob Faibussowitsch MBERRNM(merr); 1234aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI 1235aedf4482SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 12369371c9d4SSatish Balay merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); 12379371c9d4SSatish Balay MBERRNM(merr); 1238aedf4482SVijay Mahadevan #endif 1239a044f6b6SVijay Mahadevan 1240a044f6b6SVijay Mahadevan int partID; 1241a044f6b6SVijay Mahadevan moab::EntityHandle mset = msets[i]; 12429371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID); 12433ba16761SJacob Faibussowitsch MBERRNM(merr); 1244a044f6b6SVijay Mahadevan 12459371c9d4SSatish Balay for (unsigned j = 0; j < msetelems.size(); ++j) dmmoab->materials[dmmoab->elocal->index(msetelems[j])] = partID; 1246a044f6b6SVijay Mahadevan } 1247a044f6b6SVijay Mahadevan } 1248a044f6b6SVijay Mahadevan 12493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1250f6829af0SVijay Mahadevan } 1251f6829af0SVijay Mahadevan 1252cab5ea25SPierre Jolivet /*@C 1253304006b3SVijay Mahadevan DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM. 1254304006b3SVijay Mahadevan 1255d083f849SBarry Smith Collective 1256304006b3SVijay Mahadevan 1257304006b3SVijay Mahadevan Input Parameters: 1258a4e35b19SJacob Faibussowitsch + dm - The `DM` object 125960225df5SJacob Faibussowitsch . coords - The connectivity of the element 1260a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element 1261304006b3SVijay Mahadevan 1262304006b3SVijay Mahadevan Output Parameter: 1263*0b207066SBarry Smith . overts - The list of vertices that were created (can be `NULL`) 1264304006b3SVijay Mahadevan 1265304006b3SVijay Mahadevan Level: beginner 1266304006b3SVijay Mahadevan 1267*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCreateSubmesh()`, `DMMoabCreateElement()` 1268304006b3SVijay Mahadevan @*/ 1269d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal *coords, PetscInt nverts, moab::Range *overts) 1270d71ae5a4SJacob Faibussowitsch { 1271304006b3SVijay Mahadevan moab::ErrorCode merr; 1272304006b3SVijay Mahadevan DM_Moab *dmmoab; 1273304006b3SVijay Mahadevan moab::Range verts; 1274304006b3SVijay Mahadevan 1275304006b3SVijay Mahadevan PetscFunctionBegin; 1276304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 12774f572ea9SToby Isaac PetscAssertPointer(coords, 2); 1278304006b3SVijay Mahadevan 1279304006b3SVijay Mahadevan dmmoab = (DM_Moab *)dm->data; 1280304006b3SVijay Mahadevan 1281304006b3SVijay Mahadevan /* Insert new points */ 12829371c9d4SSatish Balay merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts); 12839371c9d4SSatish Balay MBERRNM(merr); 12849371c9d4SSatish Balay merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts); 12859371c9d4SSatish Balay MBERRNM(merr); 1286304006b3SVijay Mahadevan 1287304006b3SVijay Mahadevan if (overts) *overts = verts; 12883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1289304006b3SVijay Mahadevan } 1290304006b3SVijay Mahadevan 1291cab5ea25SPierre Jolivet /*@C 1292304006b3SVijay Mahadevan DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM. 1293304006b3SVijay Mahadevan 1294d083f849SBarry Smith Collective 1295304006b3SVijay Mahadevan 1296304006b3SVijay Mahadevan Input Parameters: 1297304006b3SVijay Mahadevan + dm - The DM object 1298304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra) 1299304006b3SVijay Mahadevan . conn - The connectivity of the element 1300a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element 1301304006b3SVijay Mahadevan 1302304006b3SVijay Mahadevan Output Parameter: 1303*0b207066SBarry Smith . oelem - The handle to the element created and added to the `DM` object 1304304006b3SVijay Mahadevan 1305304006b3SVijay Mahadevan Level: beginner 1306304006b3SVijay Mahadevan 1307*0b207066SBarry Smith .seealso: `DMMOAB`, `DMMoabCreateSubmesh()`, `DMMoabCreateVertices()` 1308304006b3SVijay Mahadevan @*/ 1309d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle *conn, PetscInt nverts, moab::EntityHandle *oelem) 1310d71ae5a4SJacob Faibussowitsch { 1311304006b3SVijay Mahadevan moab::ErrorCode merr; 1312304006b3SVijay Mahadevan DM_Moab *dmmoab; 1313304006b3SVijay Mahadevan moab::EntityHandle elem; 1314304006b3SVijay Mahadevan 1315304006b3SVijay Mahadevan PetscFunctionBegin; 1316304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 13174f572ea9SToby Isaac PetscAssertPointer(conn, 3); 1318304006b3SVijay Mahadevan 1319304006b3SVijay Mahadevan dmmoab = (DM_Moab *)dm->data; 1320304006b3SVijay Mahadevan 1321304006b3SVijay Mahadevan /* Insert new element */ 13229371c9d4SSatish Balay merr = dmmoab->mbiface->create_element(type, conn, nverts, elem); 13239371c9d4SSatish Balay MBERRNM(merr); 13249371c9d4SSatish Balay merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1); 13259371c9d4SSatish Balay MBERRNM(merr); 1326304006b3SVijay Mahadevan 1327304006b3SVijay Mahadevan if (oelem) *oelem = elem; 13283ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1329304006b3SVijay Mahadevan } 1330304006b3SVijay Mahadevan 1331cab5ea25SPierre Jolivet /*@C 1332*0b207066SBarry Smith DMMoabCreateSubmesh - Creates a sub-`DM` object with a set that contains all vertices/elements of the parent 1333304006b3SVijay Mahadevan in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to 1334304006b3SVijay Mahadevan create a DM object on a refined level. 1335304006b3SVijay Mahadevan 1336d083f849SBarry Smith Collective 1337304006b3SVijay Mahadevan 1338304006b3SVijay Mahadevan Input Parameters: 1339*0b207066SBarry Smith . dm - The `DM` object 1340304006b3SVijay Mahadevan 1341304006b3SVijay Mahadevan Output Parameter: 1342*0b207066SBarry Smith . newdm - The sub `DM` object with updated set information 1343304006b3SVijay Mahadevan 1344304006b3SVijay Mahadevan Level: advanced 1345304006b3SVijay Mahadevan 1346*0b207066SBarry Smith .seealso: `DMMOAB`, `DMCreate()`, `DMMoabCreateVertices()`, `DMMoabCreateElement()` 1347304006b3SVijay Mahadevan @*/ 1348d71ae5a4SJacob Faibussowitsch PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm) 1349d71ae5a4SJacob Faibussowitsch { 1350304006b3SVijay Mahadevan DM_Moab *dmmoab; 1351304006b3SVijay Mahadevan DM_Moab *ndmmoab; 1352304006b3SVijay Mahadevan moab::ErrorCode merr; 1353304006b3SVijay Mahadevan 1354304006b3SVijay Mahadevan PetscFunctionBegin; 1355304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1356304006b3SVijay Mahadevan 1357304006b3SVijay Mahadevan dmmoab = (DM_Moab *)dm->data; 1358304006b3SVijay Mahadevan 1359*0b207066SBarry Smith /* Create the basic DMMOAB object and keep the default parameters created by DM impls */ 1360f3fa974cSJacob Faibussowitsch PetscCall(DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, NULL, newdm)); 1361304006b3SVijay Mahadevan 1362304006b3SVijay Mahadevan /* get all the necessary handles from the private DM object */ 1363304006b3SVijay Mahadevan ndmmoab = (DM_Moab *)(*newdm)->data; 1364304006b3SVijay Mahadevan 1365304006b3SVijay Mahadevan /* set the sub-mesh's parent DM reference */ 1366304006b3SVijay Mahadevan ndmmoab->parent = &dm; 1367304006b3SVijay Mahadevan 1368304006b3SVijay Mahadevan /* create a file set to associate all entities in current mesh */ 13699371c9d4SSatish Balay merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset); 13709371c9d4SSatish Balay MBERR("Creating file set failed", merr); 1371304006b3SVijay Mahadevan 1372304006b3SVijay Mahadevan /* create a meshset and then add old fileset as child */ 13739371c9d4SSatish Balay merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal); 13749371c9d4SSatish Balay MBERR("Adding child vertices to parent failed", merr); 13759371c9d4SSatish Balay merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal); 13769371c9d4SSatish Balay MBERR("Adding child elements to parent failed", merr); 1377304006b3SVijay Mahadevan 1378304006b3SVijay Mahadevan /* preserve the field association between the parent and sub-mesh objects */ 13799566063dSJacob Faibussowitsch PetscCall(DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames)); 13803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1381304006b3SVijay Mahadevan } 1382304006b3SVijay Mahadevan 1383d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer) 1384d71ae5a4SJacob Faibussowitsch { 1385304006b3SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab *)(dm)->data; 1386304006b3SVijay Mahadevan const char *name; 1387304006b3SVijay Mahadevan MPI_Comm comm; 1388304006b3SVijay Mahadevan PetscMPIInt size; 1389304006b3SVijay Mahadevan 1390304006b3SVijay Mahadevan PetscFunctionBegin; 13919566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)dm, &comm)); 13929566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 13939566063dSJacob Faibussowitsch PetscCall(PetscObjectGetName((PetscObject)dm, &name)); 13949566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 139563a3b9bcSJacob Faibussowitsch if (name) PetscCall(PetscViewerASCIIPrintf(viewer, "%s in %" PetscInt_FMT " dimensions:\n", name, dmmoab->dim)); 139663a3b9bcSJacob Faibussowitsch else PetscCall(PetscViewerASCIIPrintf(viewer, "Mesh in %" PetscInt_FMT " dimensions:\n", dmmoab->dim)); 1397304006b3SVijay Mahadevan /* print details about the global mesh */ 1398304006b3SVijay Mahadevan { 13999566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 140063a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Sizes: cells=%" PetscInt_FMT ", vertices=%" PetscInt_FMT ", blocks=%" PetscInt_FMT "\n", dmmoab->nele, dmmoab->n, dmmoab->bs)); 1401304006b3SVijay Mahadevan /* print boundary data */ 140263a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Boundary trace:\n")); 1403304006b3SVijay Mahadevan { 14049566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 140563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "cells=%zu, faces=%zu, vertices=%zu\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size())); 14069566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1407304006b3SVijay Mahadevan } 1408304006b3SVijay Mahadevan /* print field data */ 140963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Fields: %" PetscInt_FMT " components\n", dmmoab->numFields)); 1410304006b3SVijay Mahadevan { 14119566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 141248a46eb9SPierre Jolivet for (int i = 0; i < dmmoab->numFields; ++i) PetscCall(PetscViewerASCIIPrintf(viewer, "[%" PetscInt_FMT "] - %s\n", i, dmmoab->fieldNames[i])); 14139566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1414304006b3SVijay Mahadevan } 14159566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 1416304006b3SVijay Mahadevan } 14179566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 14189566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(viewer)); 14193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1420304006b3SVijay Mahadevan } 1421304006b3SVijay Mahadevan 1422d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v) 1423d71ae5a4SJacob Faibussowitsch { 14243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1425304006b3SVijay Mahadevan } 1426304006b3SVijay Mahadevan 1427d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v) 1428d71ae5a4SJacob Faibussowitsch { 14293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1430304006b3SVijay Mahadevan } 1431304006b3SVijay Mahadevan 1432d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer) 1433d71ae5a4SJacob Faibussowitsch { 1434304006b3SVijay Mahadevan PetscBool iascii, ishdf5, isvtk; 1435304006b3SVijay Mahadevan 1436304006b3SVijay Mahadevan PetscFunctionBegin; 1437304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1438304006b3SVijay Mahadevan PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 14399566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 14409566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERVTK, &isvtk)); 14419566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERHDF5, &ishdf5)); 1442304006b3SVijay Mahadevan if (iascii) { 14439566063dSJacob Faibussowitsch PetscCall(DMMoabView_Ascii(dm, viewer)); 1444304006b3SVijay Mahadevan } else if (ishdf5) { 1445304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5) 14469566063dSJacob Faibussowitsch PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ)); 14479566063dSJacob Faibussowitsch PetscCall(DMMoabView_HDF5(dm, viewer)); 14489566063dSJacob Faibussowitsch PetscCall(PetscViewerPopFormat(viewer)); 1449304006b3SVijay Mahadevan #else 1450304006b3SVijay Mahadevan SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5"); 1451304006b3SVijay Mahadevan #endif 14529371c9d4SSatish Balay } else if (isvtk) { 14539566063dSJacob Faibussowitsch PetscCall(DMMoabView_VTK(dm, viewer)); 1454304006b3SVijay Mahadevan } 14553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1456304006b3SVijay Mahadevan } 1457304006b3SVijay Mahadevan 1458d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm) 1459d71ae5a4SJacob Faibussowitsch { 1460304006b3SVijay Mahadevan PetscFunctionBegin; 1461304006b3SVijay Mahadevan dm->ops->view = DMView_Moab; 1462304006b3SVijay Mahadevan dm->ops->load = NULL /* DMLoad_Moab */; 1463304006b3SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1464304006b3SVijay Mahadevan dm->ops->clone = DMClone_Moab; 1465304006b3SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 14661bb6d2a8SBarry Smith dm->ops->createlocalsection = NULL; 1467304006b3SVijay Mahadevan dm->ops->createdefaultconstraints = NULL; 1468304006b3SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1469304006b3SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1470304006b3SVijay Mahadevan dm->ops->getlocaltoglobalmapping = NULL; 1471304006b3SVijay Mahadevan dm->ops->createfieldis = NULL; 1472304006b3SVijay Mahadevan dm->ops->createcoordinatedm = NULL /* DMCreateCoordinateDM_Moab */; 1473304006b3SVijay Mahadevan dm->ops->getcoloring = NULL; 1474304006b3SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1475304006b3SVijay Mahadevan dm->ops->createinterpolation = DMCreateInterpolation_Moab; 14765a84ad33SLisandro Dalcin dm->ops->createinjection = NULL /* DMCreateInjection_Moab */; 1477304006b3SVijay Mahadevan dm->ops->refine = DMRefine_Moab; 1478304006b3SVijay Mahadevan dm->ops->coarsen = DMCoarsen_Moab; 1479304006b3SVijay Mahadevan dm->ops->refinehierarchy = DMRefineHierarchy_Moab; 1480304006b3SVijay Mahadevan dm->ops->coarsenhierarchy = DMCoarsenHierarchy_Moab; 1481304006b3SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1482304006b3SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1483304006b3SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1484304006b3SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1485304006b3SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 1486304006b3SVijay Mahadevan dm->ops->createsubdm = NULL /* DMCreateSubDM_Moab */; 1487304006b3SVijay Mahadevan dm->ops->getdimpoints = NULL /* DMGetDimPoints_Moab */; 1488304006b3SVijay Mahadevan dm->ops->locatepoints = NULL /* DMLocatePoints_Moab */; 14893ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1490304006b3SVijay Mahadevan } 1491304006b3SVijay Mahadevan 1492d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm) 1493d71ae5a4SJacob Faibussowitsch { 1494304006b3SVijay Mahadevan PetscFunctionBegin; 1495304006b3SVijay Mahadevan /* get all the necessary handles from the private DM object */ 1496304006b3SVijay Mahadevan (*newdm)->data = (DM_Moab *)dm->data; 1497304006b3SVijay Mahadevan ((DM_Moab *)dm->data)->refct++; 1498304006b3SVijay Mahadevan 14999566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)*newdm, DMMOAB)); 15009566063dSJacob Faibussowitsch PetscCall(DMInitialize_Moab(*newdm)); 15013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1502304006b3SVijay Mahadevan } 1503304006b3SVijay Mahadevan 1504d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1505d71ae5a4SJacob Faibussowitsch { 1506f6829af0SVijay Mahadevan PetscFunctionBegin; 1507f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 15084dfa11a4SJacob Faibussowitsch PetscCall(PetscNew((DM_Moab **)&dm->data)); 1509f6829af0SVijay Mahadevan 1510f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->bs = 1; 1511f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->numFields = 1; 1512f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->n = 0; 1513f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->nloc = 0; 1514f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->nghost = 0; 1515f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->nele = 0; 1516f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->neleloc = 0; 1517f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->neleghost = 0; 1518c528d872SBarry Smith ((DM_Moab *)dm->data)->ltog_map = NULL; 1519c528d872SBarry Smith ((DM_Moab *)dm->data)->ltog_sendrecv = NULL; 1520f6829af0SVijay Mahadevan 1521304006b3SVijay Mahadevan ((DM_Moab *)dm->data)->refct = 1; 1522304006b3SVijay Mahadevan ((DM_Moab *)dm->data)->parent = NULL; 1523f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->vlocal = new moab::Range(); 1524f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->vowned = new moab::Range(); 1525f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->vghost = new moab::Range(); 1526f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->elocal = new moab::Range(); 1527f6829af0SVijay Mahadevan ((DM_Moab *)dm->data)->eghost = new moab::Range(); 1528f6829af0SVijay Mahadevan 15299566063dSJacob Faibussowitsch PetscCall(DMInitialize_Moab(dm)); 15303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1531f6829af0SVijay Mahadevan } 1532