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