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 17c6ef30f9SVijay Mahadevan Reference: http://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html 18c6ef30f9SVijay Mahadevan 19c6ef30f9SVijay Mahadevan Level: intermediate 20c6ef30f9SVijay Mahadevan 21c6ef30f9SVijay Mahadevan .seealso: DMType, DMMoabCreate(), DMCreate(), DMSetType(), DMMoabCreateMoab() 22c6ef30f9SVijay Mahadevan M*/ 23c6ef30f9SVijay Mahadevan 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 43304006b3SVijay Mahadevan /* Un-implemented routines */ 44304006b3SVijay Mahadevan /* 45304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultSection_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 531d72bce8STim Tautges /*@ 541d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 551d72bce8STim Tautges 561d72bce8STim Tautges Collective on MPI_Comm 571d72bce8STim Tautges 581d72bce8STim Tautges Input Parameter: 591d72bce8STim Tautges . comm - The communicator for the DMMoab object 601d72bce8STim Tautges 611d72bce8STim Tautges Output Parameter: 62032b8ab6SVijay Mahadevan . dmb - The DMMoab object 631d72bce8STim Tautges 641d72bce8STim Tautges Level: beginner 651d72bce8STim Tautges 661d72bce8STim Tautges .keywords: DMMoab, create 671d72bce8STim Tautges @*/ 68032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 691d72bce8STim Tautges { 701d72bce8STim Tautges PetscErrorCode ierr; 711d72bce8STim Tautges 721d72bce8STim Tautges PetscFunctionBegin; 73032b8ab6SVijay Mahadevan PetscValidPointer(dmb, 2); 74032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 75032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 761d72bce8STim Tautges PetscFunctionReturn(0); 771d72bce8STim Tautges } 781d72bce8STim Tautges 791d72bce8STim Tautges /*@ 80b117cd09SVijay Mahadevan DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data 811d72bce8STim Tautges 821d72bce8STim Tautges Collective on MPI_Comm 831d72bce8STim Tautges 841d72bce8STim Tautges Input Parameter: 851d72bce8STim Tautges . comm - The communicator for the DMMoab object 86032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 87a4d2169cSTim Tautges along with the DMMoab 88a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 891d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 901d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 911d72bce8STim Tautges 921d72bce8STim Tautges Output Parameter: 93032b8ab6SVijay Mahadevan . dmb - The DMMoab object 941d72bce8STim Tautges 95032b8ab6SVijay Mahadevan Level: intermediate 961d72bce8STim Tautges 971d72bce8STim Tautges .keywords: DMMoab, create 981d72bce8STim Tautges @*/ 999daf19fdSVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 1001d72bce8STim Tautges { 1011d72bce8STim Tautges PetscErrorCode ierr; 102032b8ab6SVijay Mahadevan moab::ErrorCode merr; 10385d305f5SVijay Mahadevan DM dmmb; 104853cdec3SJed Brown DM_Moab *dmmoab; 1051d72bce8STim Tautges 1061d72bce8STim Tautges PetscFunctionBegin; 107032b8ab6SVijay Mahadevan PetscValidPointer(dmb, 6); 10885d305f5SVijay Mahadevan 10985d305f5SVijay Mahadevan ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr); 11085d305f5SVijay Mahadevan dmmoab = (DM_Moab*)(dmmb)->data; 111a4d2169cSTim Tautges 112a4d2169cSTim Tautges if (!mbiface) { 11372ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 1147d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 1151d72bce8STim Tautges } 1161cec0304SVijay Mahadevan else { 1171cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 1187d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 1191cec0304SVijay Mahadevan } 1201cec0304SVijay Mahadevan 121b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 122b5410836SVijay Mahadevan dmmoab->fileset = 0; 123b117cd09SVijay Mahadevan dmmoab->hlevel = 0; 12449d66b22SVijay Mahadevan dmmoab->nghostrings = 0; 1257d89fc02STim Tautges 1269daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1279daf19fdSVijay Mahadevan moab::EntityHandle partnset; 1289daf19fdSVijay Mahadevan PetscInt rank, nprocs; 129032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 130032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 131032b8ab6SVijay Mahadevan 132db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 133db66d124SVijay Mahadevan to the load_file functions to be populated. */ 1340c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); MBERR("Creating partition set failed", merr); 135032b8ab6SVijay Mahadevan 136db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 13772ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 1389daf19fdSVijay Mahadevan #endif 139032b8ab6SVijay Mahadevan 1404973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 1414973de03SVijay Mahadevan dmmoab->bs = 1; 142addae81cSVijay Mahadevan dmmoab->numFields = 1; 1433f1c6e43SVijay Mahadevan ierr = PetscMalloc(dmmoab->numFields * sizeof(char*), &dmmoab->fieldNames);CHKERRQ(ierr); 1443f1c6e43SVijay Mahadevan ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr); 1452e4e7c01SVijay Mahadevan dmmoab->rw_dbglevel = 0; 1462e4e7c01SVijay Mahadevan dmmoab->partition_by_rank = PETSC_FALSE; 1472e4e7c01SVijay Mahadevan dmmoab->extra_read_options[0] = '\0'; 1482e4e7c01SVijay Mahadevan dmmoab->extra_write_options[0] = '\0'; 1492e4e7c01SVijay Mahadevan dmmoab->read_mode = READ_PART; 1502e4e7c01SVijay Mahadevan dmmoab->write_mode = WRITE_PART; 1514973de03SVijay Mahadevan 1524973de03SVijay Mahadevan /* set global ID tag handle */ 1531a845d2aSVijay Mahadevan if (ltog_tag && *ltog_tag) { 15485d305f5SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr); 155032b8ab6SVijay Mahadevan } 156032b8ab6SVijay Mahadevan else { 1571a845d2aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr); 1581a845d2aSVijay Mahadevan if (ltog_tag) *ltog_tag = dmmoab->ltog_tag; 159a4d2169cSTim Tautges } 160a4d2169cSTim Tautges 161340f3b9aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag); MBERRNM(merr); 162340f3b9aSVijay Mahadevan 1634973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 164a4d2169cSTim Tautges if (range) { 16585d305f5SVijay Mahadevan ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr); 166a4d2169cSTim Tautges } 16785d305f5SVijay Mahadevan *dmb = dmmb; 1681d72bce8STim Tautges PetscFunctionReturn(0); 1691d72bce8STim Tautges } 1701d72bce8STim Tautges 171304006b3SVijay Mahadevan 1729daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1731d72bce8STim Tautges 174aa768e4cSTim Tautges /*@ 175aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 176aa768e4cSTim Tautges 177aa768e4cSTim Tautges Collective on MPI_Comm 178aa768e4cSTim Tautges 179aa768e4cSTim Tautges Input Parameter: 180aa768e4cSTim Tautges . dm - The DMMoab object being set 181aa768e4cSTim Tautges 182aa768e4cSTim Tautges Output Parameter: 183aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 184aa768e4cSTim Tautges 185aa768e4cSTim Tautges Level: beginner 186aa768e4cSTim Tautges 187aa768e4cSTim Tautges .keywords: DMMoab, create 188aa768e4cSTim Tautges @*/ 1891d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm) 1901d72bce8STim Tautges { 1911d72bce8STim Tautges PetscFunctionBegin; 1921d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 193032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 1941d72bce8STim Tautges PetscFunctionReturn(0); 1951d72bce8STim Tautges } 1961d72bce8STim Tautges 1979daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */ 1989daf19fdSVijay Mahadevan 1991d72bce8STim Tautges 200aa768e4cSTim Tautges /*@ 201aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 202aa768e4cSTim Tautges 203aa768e4cSTim Tautges Collective on MPI_Comm 204aa768e4cSTim Tautges 205aa768e4cSTim Tautges Input Parameter: 206aa768e4cSTim Tautges . dm - The DMMoab object being set 207aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 208aa768e4cSTim Tautges 209aa768e4cSTim Tautges Level: beginner 210aa768e4cSTim Tautges 211aa768e4cSTim Tautges .keywords: DMMoab, create 212aa768e4cSTim Tautges @*/ 213a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface) 2141d72bce8STim Tautges { 215032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 216032b8ab6SVijay Mahadevan 2171d72bce8STim Tautges PetscFunctionBegin; 2181d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2191cec0304SVijay Mahadevan PetscValidPointer(mbiface, 2); 2209daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 221032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 2229daf19fdSVijay Mahadevan #endif 223032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 224032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2251d72bce8STim Tautges PetscFunctionReturn(0); 2261d72bce8STim Tautges } 2271d72bce8STim Tautges 2281d72bce8STim Tautges 229aa768e4cSTim Tautges /*@ 230aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 231aa768e4cSTim Tautges 232aa768e4cSTim Tautges Collective on MPI_Comm 233aa768e4cSTim Tautges 234aa768e4cSTim Tautges Input Parameter: 235aa768e4cSTim Tautges . dm - The DMMoab object being set 236aa768e4cSTim Tautges 237aa768e4cSTim Tautges Output Parameter: 238aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 239aa768e4cSTim Tautges 240aa768e4cSTim Tautges Level: beginner 241aa768e4cSTim Tautges 242aa768e4cSTim Tautges .keywords: DMMoab, create 243aa768e4cSTim Tautges @*/ 244a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface) 2451d72bce8STim Tautges { 2469426e041SSatish Balay PetscErrorCode ierr; 247cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 248cabb514dSBarry Smith 2491d72bce8STim Tautges PetscFunctionBegin; 2501d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 251cabb514dSBarry Smith ierr = PetscCitationsRegister("@techreport{tautges_moab:_2004,\n type = {{SAND2004-1592}},\n title = {{MOAB:} A Mesh-Oriented Database}, institution = {Sandia National Laboratories},\n author = {Tautges, T. J. and Meyers, R. and Merkley, K. and Stimpson, C. and Ernst, C.},\n year = {2004}, note = {Report}\n}\n", &cite);CHKERRQ(ierr); 252a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 2531d72bce8STim Tautges PetscFunctionReturn(0); 2541d72bce8STim Tautges } 2551d72bce8STim Tautges 2561d72bce8STim Tautges 257aa768e4cSTim Tautges /*@ 2585eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 259aa768e4cSTim Tautges 260aa768e4cSTim Tautges Collective on MPI_Comm 261aa768e4cSTim Tautges 262aa768e4cSTim Tautges Input Parameter: 263aa768e4cSTim Tautges . dm - The DMMoab object being set 264aa768e4cSTim Tautges . range - The entities treated by this DMMoab 265aa768e4cSTim Tautges 266aa768e4cSTim Tautges Level: beginner 267aa768e4cSTim Tautges 268aa768e4cSTim Tautges .keywords: DMMoab, create 269aa768e4cSTim Tautges @*/ 2705eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range) 2711d72bce8STim Tautges { 272fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 273032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 274032b8ab6SVijay Mahadevan 2751d72bce8STim Tautges PetscFunctionBegin; 2761d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 277032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 278032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 279fd3326ddSVijay Mahadevan 280032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 281fd3326ddSVijay Mahadevan 2829daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 2839daf19fdSVijay Mahadevan moab::ErrorCode merr; 284fd3326ddSVijay Mahadevan /* filter based on parallel status */ 285fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr); 286fd3326ddSVijay Mahadevan 287fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 288fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 289fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr); 290fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 291fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 2929daf19fdSVijay Mahadevan #else 2939daf19fdSVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 2949daf19fdSVijay Mahadevan #endif 295fd3326ddSVijay Mahadevan 296fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 297032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 298032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 2999daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 3009daf19fdSVijay Mahadevan PetscErrorCode ierr; 301b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 3029daf19fdSVijay Mahadevan #else 3039daf19fdSVijay Mahadevan dmmoab->n = dmmoab->nloc; 3049daf19fdSVijay Mahadevan #endif 3051d72bce8STim Tautges PetscFunctionReturn(0); 3061d72bce8STim Tautges } 3071d72bce8STim Tautges 3081d72bce8STim Tautges 3098d8d51c8SVijay Mahadevan /*@ 3108d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 3118d8d51c8SVijay Mahadevan 3128d8d51c8SVijay Mahadevan Collective on MPI_Comm 3138d8d51c8SVijay Mahadevan 3148d8d51c8SVijay Mahadevan Input Parameter: 3158d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 3168d8d51c8SVijay Mahadevan 3178d8d51c8SVijay Mahadevan Output Parameter: 3188d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 3198d8d51c8SVijay Mahadevan 3208d8d51c8SVijay Mahadevan Level: beginner 3218d8d51c8SVijay Mahadevan 3228d8d51c8SVijay Mahadevan .keywords: DMMoab, create 3238d8d51c8SVijay Mahadevan @*/ 3248d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local) 3258d8d51c8SVijay Mahadevan { 3268d8d51c8SVijay Mahadevan PetscFunctionBegin; 3278d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 3288d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 3298d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3308d8d51c8SVijay Mahadevan } 3318d8d51c8SVijay Mahadevan 3328d8d51c8SVijay Mahadevan 3338d8d51c8SVijay Mahadevan 334aa768e4cSTim Tautges /*@ 3355eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 336aa768e4cSTim Tautges 337aa768e4cSTim Tautges Collective on MPI_Comm 338aa768e4cSTim Tautges 339aa768e4cSTim Tautges Input Parameter: 340aa768e4cSTim Tautges . dm - The DMMoab object being set 341aa768e4cSTim Tautges 342aa768e4cSTim Tautges Output Parameter: 3435eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 3445eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 345aa768e4cSTim Tautges 346aa768e4cSTim Tautges Level: beginner 347aa768e4cSTim Tautges 348aa768e4cSTim Tautges .keywords: DMMoab, create 349aa768e4cSTim Tautges @*/ 350351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost) 3511d72bce8STim Tautges { 3521d72bce8STim Tautges PetscFunctionBegin; 3531d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 354351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 355351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3561d72bce8STim Tautges PetscFunctionReturn(0); 3571d72bce8STim Tautges } 3581d72bce8STim Tautges 3595eb88e9dSVijay Mahadevan /*@ 3605eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3615eb88e9dSVijay Mahadevan 3625eb88e9dSVijay Mahadevan Collective on MPI_Comm 3635eb88e9dSVijay Mahadevan 3645eb88e9dSVijay Mahadevan Input Parameter: 3655eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 3665eb88e9dSVijay Mahadevan 3675eb88e9dSVijay Mahadevan Output Parameter: 3685eb88e9dSVijay Mahadevan . range - The entities owned locally 3695eb88e9dSVijay Mahadevan 3705eb88e9dSVijay Mahadevan Level: beginner 3715eb88e9dSVijay Mahadevan 3725eb88e9dSVijay Mahadevan .keywords: DMMoab, create 3735eb88e9dSVijay Mahadevan @*/ 374351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range) 3755eb88e9dSVijay Mahadevan { 3765eb88e9dSVijay Mahadevan PetscFunctionBegin; 3775eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 378351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 3791cec0304SVijay Mahadevan PetscFunctionReturn(0); 3801cec0304SVijay Mahadevan } 3811cec0304SVijay Mahadevan 3821cec0304SVijay Mahadevan 3831cec0304SVijay Mahadevan /*@ 3841cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 3851cec0304SVijay Mahadevan 3861cec0304SVijay Mahadevan Collective on MPI_Comm 3871cec0304SVijay Mahadevan 3881cec0304SVijay Mahadevan Input Parameter: 3891cec0304SVijay Mahadevan . dm - The DMMoab object being set 3901cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 3911cec0304SVijay Mahadevan 3921cec0304SVijay Mahadevan Level: beginner 3931cec0304SVijay Mahadevan 3941cec0304SVijay Mahadevan .keywords: DMMoab, create 3951cec0304SVijay Mahadevan @*/ 3961cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range) 3971cec0304SVijay Mahadevan { 3981cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 3991cec0304SVijay Mahadevan 4001cec0304SVijay Mahadevan PetscFunctionBegin; 4011cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4021cec0304SVijay Mahadevan dmmoab->elocal->clear(); 4031cec0304SVijay Mahadevan dmmoab->eghost->clear(); 4041cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 4059daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 4069daf19fdSVijay Mahadevan moab::ErrorCode merr; 4071cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 4081cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 4099daf19fdSVijay Mahadevan #endif 4101cec0304SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 41141dd5348SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 4129daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 4139daf19fdSVijay Mahadevan PetscErrorCode ierr; 4149daf19fdSVijay Mahadevan ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4158cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 4169daf19fdSVijay Mahadevan #else 4179daf19fdSVijay Mahadevan dmmoab->nele = dmmoab->neleloc; 4189daf19fdSVijay Mahadevan #endif 4195eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 4205eb88e9dSVijay Mahadevan } 4215eb88e9dSVijay Mahadevan 4225eb88e9dSVijay Mahadevan 423aa768e4cSTim Tautges /*@ 424aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 425aa768e4cSTim Tautges 426aa768e4cSTim Tautges Collective on MPI_Comm 427aa768e4cSTim Tautges 428aa768e4cSTim Tautges Input Parameter: 429aa768e4cSTim Tautges . dm - The DMMoab object being set 430aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 431aa768e4cSTim Tautges 432aa768e4cSTim Tautges Level: beginner 433aa768e4cSTim Tautges 434aa768e4cSTim Tautges .keywords: DMMoab, create 435aa768e4cSTim Tautges @*/ 4361d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag) 4371d72bce8STim Tautges { 4381d72bce8STim Tautges PetscFunctionBegin; 4391d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4401d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4411d72bce8STim Tautges PetscFunctionReturn(0); 4421d72bce8STim Tautges } 4431d72bce8STim Tautges 4441d72bce8STim Tautges 445aa768e4cSTim Tautges /*@ 446aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 447aa768e4cSTim Tautges 448aa768e4cSTim Tautges Collective on MPI_Comm 449aa768e4cSTim Tautges 450aa768e4cSTim Tautges Input Parameter: 451aa768e4cSTim Tautges . dm - The DMMoab object being set 452aa768e4cSTim Tautges 453aa768e4cSTim Tautges Output Parameter: 454aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 455aa768e4cSTim Tautges 456aa768e4cSTim Tautges Level: beginner 457aa768e4cSTim Tautges 458aa768e4cSTim Tautges .keywords: DMMoab, create 459aa768e4cSTim Tautges @*/ 4601d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag) 4611d72bce8STim Tautges { 4621d72bce8STim Tautges PetscFunctionBegin; 4631d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4641d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4651d72bce8STim Tautges PetscFunctionReturn(0); 4661d72bce8STim Tautges } 4671d72bce8STim Tautges 4681d72bce8STim Tautges 469aa768e4cSTim Tautges /*@ 470aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 471aa768e4cSTim Tautges 472aa768e4cSTim Tautges Collective on MPI_Comm 473aa768e4cSTim Tautges 474aa768e4cSTim Tautges Input Parameter: 475aa768e4cSTim Tautges . dm - The DMMoab object being set 476aa768e4cSTim Tautges . bs - The block size used with this DMMoab 477aa768e4cSTim Tautges 478aa768e4cSTim Tautges Level: beginner 479aa768e4cSTim Tautges 480aa768e4cSTim Tautges .keywords: DMMoab, create 481aa768e4cSTim Tautges @*/ 4821d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs) 4831d72bce8STim Tautges { 4841d72bce8STim Tautges PetscFunctionBegin; 4851d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4861d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4871d72bce8STim Tautges PetscFunctionReturn(0); 4881d72bce8STim Tautges } 4891d72bce8STim Tautges 4901d72bce8STim Tautges 491aa768e4cSTim Tautges /*@ 492aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 493aa768e4cSTim Tautges 494aa768e4cSTim Tautges Collective on MPI_Comm 495aa768e4cSTim Tautges 496aa768e4cSTim Tautges Input Parameter: 497aa768e4cSTim Tautges . dm - The DMMoab object being set 498aa768e4cSTim Tautges 499aa768e4cSTim Tautges Output Parameter: 500aa768e4cSTim Tautges . bs - The block size used with this DMMoab 501aa768e4cSTim Tautges 502aa768e4cSTim Tautges Level: beginner 503aa768e4cSTim Tautges 504aa768e4cSTim Tautges .keywords: DMMoab, create 505aa768e4cSTim Tautges @*/ 5061d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs) 5071d72bce8STim Tautges { 5081d72bce8STim Tautges PetscFunctionBegin; 5091d72bce8STim Tautges PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5101d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 5111d72bce8STim Tautges PetscFunctionReturn(0); 5121d72bce8STim Tautges } 5131d72bce8STim Tautges 5141cec0304SVijay Mahadevan 515212ad6d1SVijay Mahadevan /*@ 516212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 517212ad6d1SVijay Mahadevan 51800cc10feSVijay Mahadevan Collective on DM 519212ad6d1SVijay Mahadevan 520212ad6d1SVijay Mahadevan Input Parameter: 521212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 522212ad6d1SVijay Mahadevan 523212ad6d1SVijay Mahadevan Output Parameter: 52400cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance 52500cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance 526212ad6d1SVijay Mahadevan 527212ad6d1SVijay Mahadevan Level: beginner 528212ad6d1SVijay Mahadevan 529212ad6d1SVijay Mahadevan .keywords: DMMoab, create 530212ad6d1SVijay Mahadevan @*/ 53141dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg) 532212ad6d1SVijay Mahadevan { 533212ad6d1SVijay Mahadevan PetscFunctionBegin; 534212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 53541dd5348SVijay Mahadevan if (neg) *neg = ((DM_Moab*)dm->data)->nele; 53641dd5348SVijay Mahadevan if (nvg) *nvg = ((DM_Moab*)dm->data)->n; 537212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 538212ad6d1SVijay Mahadevan } 539212ad6d1SVijay Mahadevan 540212ad6d1SVijay Mahadevan 541212ad6d1SVijay Mahadevan /*@ 542212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 543212ad6d1SVijay Mahadevan 54400cc10feSVijay Mahadevan Collective on DM 545212ad6d1SVijay Mahadevan 546212ad6d1SVijay Mahadevan Input Parameter: 547212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 548212ad6d1SVijay Mahadevan 549212ad6d1SVijay Mahadevan Output Parameter: 550b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor 55100cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 55200cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 55300cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor 554212ad6d1SVijay Mahadevan 555212ad6d1SVijay Mahadevan Level: beginner 556212ad6d1SVijay Mahadevan 557212ad6d1SVijay Mahadevan .keywords: DMMoab, create 558212ad6d1SVijay Mahadevan @*/ 55941dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg) 560212ad6d1SVijay Mahadevan { 561212ad6d1SVijay Mahadevan PetscFunctionBegin; 562212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 56341dd5348SVijay Mahadevan if (nel) *nel = ((DM_Moab*)dm->data)->neleloc; 56441dd5348SVijay Mahadevan if (neg) *neg = ((DM_Moab*)dm->data)->neleghost; 56541dd5348SVijay Mahadevan if (nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 56641dd5348SVijay Mahadevan if (nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 567212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 568212ad6d1SVijay Mahadevan } 569212ad6d1SVijay Mahadevan 570212ad6d1SVijay Mahadevan 57100cc10feSVijay Mahadevan /*@ 57200cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 57300cc10feSVijay Mahadevan 57400cc10feSVijay Mahadevan Collective on MPI_Comm 57500cc10feSVijay Mahadevan 57600cc10feSVijay Mahadevan Input Parameter: 57700cc10feSVijay Mahadevan . dm - The DMMoab object being set 57800cc10feSVijay Mahadevan 57900cc10feSVijay Mahadevan Output Parameter: 58000cc10feSVijay Mahadevan . offset - The local offset for the global vector 58100cc10feSVijay Mahadevan 58200cc10feSVijay Mahadevan Level: beginner 58300cc10feSVijay Mahadevan 58400cc10feSVijay Mahadevan .keywords: DMMoab, create 58500cc10feSVijay Mahadevan @*/ 58600cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset) 58700cc10feSVijay Mahadevan { 58800cc10feSVijay Mahadevan PetscFunctionBegin; 58900cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 59000cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 59100cc10feSVijay Mahadevan PetscFunctionReturn(0); 59200cc10feSVijay Mahadevan } 59300cc10feSVijay Mahadevan 59400cc10feSVijay Mahadevan 5954920ab11SVijay Mahadevan /*@ 5964920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 5974920ab11SVijay Mahadevan 5984920ab11SVijay Mahadevan Collective on MPI_Comm 5994920ab11SVijay Mahadevan 6004920ab11SVijay Mahadevan Input Parameter: 601340f3b9aSVijay Mahadevan . dm - The DMMoab object 6024920ab11SVijay Mahadevan 6034920ab11SVijay Mahadevan Output Parameter: 6044920ab11SVijay Mahadevan . dim - The dimension of DM 6054920ab11SVijay Mahadevan 6064920ab11SVijay Mahadevan Level: beginner 6074920ab11SVijay Mahadevan 6084920ab11SVijay Mahadevan .keywords: DMMoab, create 6094920ab11SVijay Mahadevan @*/ 6104920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim) 6114920ab11SVijay Mahadevan { 6124920ab11SVijay Mahadevan PetscFunctionBegin; 6134920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 6144920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 6154920ab11SVijay Mahadevan PetscFunctionReturn(0); 6164920ab11SVijay Mahadevan } 6174920ab11SVijay Mahadevan 6184920ab11SVijay Mahadevan 619755f3dfbSVijay Mahadevan #undef __FUNCT__ 620755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetHierarchyLevel" 621755f3dfbSVijay Mahadevan /*@ 622755f3dfbSVijay Mahadevan DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy 623755f3dfbSVijay Mahadevan generated through uniform refinement. 624755f3dfbSVijay Mahadevan 625755f3dfbSVijay Mahadevan Collective on DM 626755f3dfbSVijay Mahadevan 627755f3dfbSVijay Mahadevan Input Parameter: 628755f3dfbSVijay Mahadevan . dm - The DMMoab object being set 629755f3dfbSVijay Mahadevan 630755f3dfbSVijay Mahadevan Output Parameter: 631755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level 632755f3dfbSVijay Mahadevan 633755f3dfbSVijay Mahadevan Level: beginner 634755f3dfbSVijay Mahadevan 635755f3dfbSVijay Mahadevan .keywords: DMMoab, multigrid 636755f3dfbSVijay Mahadevan @*/ 637755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel) 638755f3dfbSVijay Mahadevan { 639755f3dfbSVijay Mahadevan PetscFunctionBegin; 640755f3dfbSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 641755f3dfbSVijay Mahadevan if (nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel; 642755f3dfbSVijay Mahadevan PetscFunctionReturn(0); 643755f3dfbSVijay Mahadevan } 644755f3dfbSVijay Mahadevan 645755f3dfbSVijay Mahadevan 646755f3dfbSVijay Mahadevan #undef __FUNCT__ 647755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetMaterialBlock" 648340f3b9aSVijay Mahadevan /*@ 649340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 650340f3b9aSVijay Mahadevan 651340f3b9aSVijay Mahadevan Collective on MPI_Comm 652340f3b9aSVijay Mahadevan 653340f3b9aSVijay Mahadevan Input Parameter: 654340f3b9aSVijay Mahadevan . dm - The DMMoab object 655340f3b9aSVijay Mahadevan . ehandle - The element entity handle 656340f3b9aSVijay Mahadevan 657340f3b9aSVijay Mahadevan Output Parameter: 658340f3b9aSVijay Mahadevan . mat - The material ID for the current entity 659340f3b9aSVijay Mahadevan 660340f3b9aSVijay Mahadevan Level: beginner 661340f3b9aSVijay Mahadevan 662340f3b9aSVijay Mahadevan .keywords: DMMoab, create 663340f3b9aSVijay Mahadevan @*/ 664340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat) 665340f3b9aSVijay Mahadevan { 666340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 667340f3b9aSVijay Mahadevan moab::ErrorCode merr; 668340f3b9aSVijay Mahadevan 669340f3b9aSVijay Mahadevan PetscFunctionBegin; 670340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 671340f3b9aSVijay Mahadevan if (*mat) { 672340f3b9aSVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 67363cd93b2SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat); MBERRNM(merr); 674340f3b9aSVijay Mahadevan } 675340f3b9aSVijay Mahadevan PetscFunctionReturn(0); 676340f3b9aSVijay Mahadevan } 677340f3b9aSVijay Mahadevan 6784920ab11SVijay Mahadevan 67985d305f5SVijay Mahadevan /*@ 68085d305f5SVijay Mahadevan DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities 68185d305f5SVijay Mahadevan 68285d305f5SVijay Mahadevan Collective on MPI_Comm 68385d305f5SVijay Mahadevan 68485d305f5SVijay Mahadevan Input Parameter: 68585d305f5SVijay Mahadevan . dm - The DMMoab object 68685d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 68785d305f5SVijay Mahadevan . conn - The vertex entity handles 68885d305f5SVijay Mahadevan 68985d305f5SVijay Mahadevan Output Parameter: 69085d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities 69185d305f5SVijay Mahadevan 69285d305f5SVijay Mahadevan Level: beginner 69385d305f5SVijay Mahadevan 69485d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity() 69585d305f5SVijay Mahadevan @*/ 696cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos) 6977023aa44SVijay Mahadevan { 6987023aa44SVijay Mahadevan DM_Moab *dmmoab; 6997023aa44SVijay Mahadevan PetscErrorCode ierr; 7007023aa44SVijay Mahadevan moab::ErrorCode merr; 7017023aa44SVijay Mahadevan 7027023aa44SVijay Mahadevan PetscFunctionBegin; 7037023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7047023aa44SVijay Mahadevan PetscValidPointer(conn, 3); 7057023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7067023aa44SVijay Mahadevan 7077023aa44SVijay Mahadevan if (!vpos) { 7087ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(nconn * 3, &vpos);CHKERRQ(ierr); 7097023aa44SVijay Mahadevan } 7107023aa44SVijay Mahadevan 7117023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7127023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos); MBERRNM(merr); 7137023aa44SVijay Mahadevan PetscFunctionReturn(0); 7147023aa44SVijay Mahadevan } 7157023aa44SVijay Mahadevan 7167023aa44SVijay Mahadevan 71785d305f5SVijay Mahadevan /*@ 71885d305f5SVijay Mahadevan DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity 71985d305f5SVijay Mahadevan 72085d305f5SVijay Mahadevan Collective on MPI_Comm 72185d305f5SVijay Mahadevan 72285d305f5SVijay Mahadevan Input Parameter: 72385d305f5SVijay Mahadevan . dm - The DMMoab object 72485d305f5SVijay Mahadevan . vhandle - Vertex entity handle 72585d305f5SVijay Mahadevan 72685d305f5SVijay Mahadevan Output Parameter: 72785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 72885d305f5SVijay Mahadevan . conn - The vertex entity handles 72985d305f5SVijay Mahadevan 73085d305f5SVijay Mahadevan Level: beginner 73185d305f5SVijay Mahadevan 73285d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity() 73385d305f5SVijay Mahadevan @*/ 73485d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt* nconn, moab::EntityHandle **conn) 7358d8d51c8SVijay Mahadevan { 7368d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 7378d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities, connect; 7388d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7398d8d51c8SVijay Mahadevan moab::ErrorCode merr; 7408d8d51c8SVijay Mahadevan 7418d8d51c8SVijay Mahadevan PetscFunctionBegin; 7428d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7438d8d51c8SVijay Mahadevan PetscValidPointer(conn, 4); 7448d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7458d8d51c8SVijay Mahadevan 7468d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 74785d305f5SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION); MBERRNM(merr); 7488d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect); MBERRNM(merr); 7498d8d51c8SVijay Mahadevan 7508d8d51c8SVijay Mahadevan if (conn) { 7518d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn);CHKERRQ(ierr); 7528d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle) * connect.size());CHKERRQ(ierr); 7538d8d51c8SVijay Mahadevan } 7548d8d51c8SVijay Mahadevan if (nconn) *nconn = connect.size(); 7558d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7568d8d51c8SVijay Mahadevan } 7578d8d51c8SVijay Mahadevan 7588d8d51c8SVijay Mahadevan 75985d305f5SVijay Mahadevan /*@ 76085d305f5SVijay Mahadevan DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity 76185d305f5SVijay Mahadevan 76285d305f5SVijay Mahadevan Collective on MPI_Comm 76385d305f5SVijay Mahadevan 76485d305f5SVijay Mahadevan Input Parameter: 76585d305f5SVijay Mahadevan . dm - The DMMoab object 76685d305f5SVijay Mahadevan . vhandle - Vertex entity handle 76785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 76885d305f5SVijay Mahadevan . conn - The vertex entity handles 76985d305f5SVijay Mahadevan 77085d305f5SVijay Mahadevan Level: beginner 77185d305f5SVijay Mahadevan 77285d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity() 77385d305f5SVijay Mahadevan @*/ 7748d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, moab::EntityHandle **conn) 7758d8d51c8SVijay Mahadevan { 7768d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7778d8d51c8SVijay Mahadevan 7788d8d51c8SVijay Mahadevan PetscFunctionBegin; 7798d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7808d8d51c8SVijay Mahadevan PetscValidPointer(conn, 4); 7818d8d51c8SVijay Mahadevan 7828d8d51c8SVijay Mahadevan if (conn) { 7838d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 7848d8d51c8SVijay Mahadevan } 7858d8d51c8SVijay Mahadevan if (nconn) *nconn = 0; 7868d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7878d8d51c8SVijay Mahadevan } 7888d8d51c8SVijay Mahadevan 7898d8d51c8SVijay Mahadevan 79085d305f5SVijay Mahadevan /*@ 79185d305f5SVijay Mahadevan DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity 79285d305f5SVijay Mahadevan 79385d305f5SVijay Mahadevan Collective on MPI_Comm 79485d305f5SVijay Mahadevan 79585d305f5SVijay Mahadevan Input Parameter: 79685d305f5SVijay Mahadevan . dm - The DMMoab object 79785d305f5SVijay Mahadevan . ehandle - Vertex entity handle 79885d305f5SVijay Mahadevan 79985d305f5SVijay Mahadevan Output Parameter: 80085d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 80185d305f5SVijay Mahadevan . conn - The vertex entity handles 80285d305f5SVijay Mahadevan 80385d305f5SVijay Mahadevan Level: beginner 80485d305f5SVijay Mahadevan 80585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity() 80685d305f5SVijay Mahadevan @*/ 8077023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, const moab::EntityHandle **conn) 8087023aa44SVijay Mahadevan { 8097023aa44SVijay Mahadevan DM_Moab *dmmoab; 8107023aa44SVijay Mahadevan const moab::EntityHandle *connect; 8117023aa44SVijay Mahadevan moab::ErrorCode merr; 8127023aa44SVijay Mahadevan PetscInt nnodes; 8137023aa44SVijay Mahadevan 8147023aa44SVijay Mahadevan PetscFunctionBegin; 8157023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 8167023aa44SVijay Mahadevan PetscValidPointer(conn, 4); 8177023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8187023aa44SVijay Mahadevan 8197023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 8207023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes); MBERRNM(merr); 8217023aa44SVijay Mahadevan if (conn) *conn = connect; 8227023aa44SVijay Mahadevan if (nconn) *nconn = nnodes; 8237023aa44SVijay Mahadevan PetscFunctionReturn(0); 8247023aa44SVijay Mahadevan } 8257023aa44SVijay Mahadevan 8267023aa44SVijay Mahadevan 82785d305f5SVijay Mahadevan /*@ 82885d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 82985d305f5SVijay Mahadevan 83085d305f5SVijay Mahadevan Collective on MPI_Comm 83185d305f5SVijay Mahadevan 83285d305f5SVijay Mahadevan Input Parameter: 83385d305f5SVijay Mahadevan . dm - The DMMoab object 83485d305f5SVijay Mahadevan . ent - Entity handle 83585d305f5SVijay Mahadevan 83685d305f5SVijay Mahadevan Output Parameter: 83785d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 83885d305f5SVijay Mahadevan 83985d305f5SVijay Mahadevan Level: beginner 84085d305f5SVijay Mahadevan 84185d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices() 84285d305f5SVijay Mahadevan @*/ 84369263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool* ent_on_boundary) 84469263071SVijay Mahadevan { 84569263071SVijay Mahadevan moab::EntityType etype; 84669263071SVijay Mahadevan DM_Moab *dmmoab; 84769263071SVijay Mahadevan PetscInt edim; 84869263071SVijay Mahadevan 84969263071SVijay Mahadevan PetscFunctionBegin; 85069263071SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 85169263071SVijay Mahadevan PetscValidPointer(ent_on_boundary, 3); 85269263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 85369263071SVijay Mahadevan 85469263071SVijay Mahadevan /* get the entity type and handle accordingly */ 85569263071SVijay Mahadevan etype = dmmoab->mbiface->type_from_handle(ent); 85669263071SVijay Mahadevan if (etype >= moab::MBPOLYHEDRON) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %D\n", etype); 85769263071SVijay Mahadevan 85869263071SVijay Mahadevan /* get the entity dimension */ 85969263071SVijay Mahadevan edim = dmmoab->mbiface->dimension_from_handle(ent); 86069263071SVijay Mahadevan 86169263071SVijay Mahadevan *ent_on_boundary = PETSC_FALSE; 86269263071SVijay Mahadevan if (etype == moab::MBVERTEX && edim == 0) { 86349d66b22SVijay Mahadevan *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE); 86469263071SVijay Mahadevan } 86569263071SVijay Mahadevan else { 86669263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 8676d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE; 86869263071SVijay Mahadevan } 86969263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 8706d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE; 87169263071SVijay Mahadevan } 87269263071SVijay Mahadevan } 87369263071SVijay Mahadevan PetscFunctionReturn(0); 87469263071SVijay Mahadevan } 87569263071SVijay Mahadevan 87669263071SVijay Mahadevan 87785d305f5SVijay Mahadevan /*@ 87885d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 87985d305f5SVijay Mahadevan 88085d305f5SVijay Mahadevan Input Parameter: 88185d305f5SVijay Mahadevan . dm - The DMMoab object 88285d305f5SVijay Mahadevan . nconn - Number of handles 88385d305f5SVijay Mahadevan . cnt - Array of entity handles 88485d305f5SVijay Mahadevan 88585d305f5SVijay Mahadevan Output Parameter: 88685d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 88785d305f5SVijay Mahadevan 88885d305f5SVijay Mahadevan Level: beginner 88985d305f5SVijay Mahadevan 89085d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary() 89185d305f5SVijay Mahadevan @*/ 89269263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool* isbdvtx) 8937023aa44SVijay Mahadevan { 8947023aa44SVijay Mahadevan DM_Moab *dmmoab; 8957023aa44SVijay Mahadevan PetscInt i; 8967023aa44SVijay Mahadevan 8977023aa44SVijay Mahadevan PetscFunctionBegin; 8987023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 8997023aa44SVijay Mahadevan PetscValidPointer(cnt, 3); 9007023aa44SVijay Mahadevan PetscValidPointer(isbdvtx, 4); 9017023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9027023aa44SVijay Mahadevan 9037023aa44SVijay Mahadevan for (i = 0; i < nconn; ++i) { 9046d9eb265SVijay Mahadevan isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE); 9057023aa44SVijay Mahadevan } 9067023aa44SVijay Mahadevan PetscFunctionReturn(0); 9077023aa44SVijay Mahadevan } 9087023aa44SVijay Mahadevan 9097023aa44SVijay Mahadevan 91085d305f5SVijay Mahadevan /*@ 91185d305f5SVijay Mahadevan DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary 91285d305f5SVijay Mahadevan 91385d305f5SVijay Mahadevan Input Parameter: 91485d305f5SVijay Mahadevan . dm - The DMMoab object 91585d305f5SVijay Mahadevan 91685d305f5SVijay Mahadevan Output Parameter: 91785d305f5SVijay Mahadevan . bdvtx - Boundary vertices 91885d305f5SVijay Mahadevan . bdelems - Boundary elements 91985d305f5SVijay Mahadevan . bdfaces - Boundary faces 92085d305f5SVijay Mahadevan 92185d305f5SVijay Mahadevan Level: beginner 92285d305f5SVijay Mahadevan 92385d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary() 92485d305f5SVijay Mahadevan @*/ 9256d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range** bdelems, const moab::Range** bdfaces) 9261cec0304SVijay Mahadevan { 9271cec0304SVijay Mahadevan DM_Moab *dmmoab; 9281cec0304SVijay Mahadevan 9291cec0304SVijay Mahadevan PetscFunctionBegin; 9301cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 9311cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9321cec0304SVijay Mahadevan 9336d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 9346d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 9356d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 9361cec0304SVijay Mahadevan PetscFunctionReturn(0); 9371cec0304SVijay Mahadevan } 9381cec0304SVijay Mahadevan 939f6829af0SVijay Mahadevan 940f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 941f6829af0SVijay Mahadevan { 942f6829af0SVijay Mahadevan PetscErrorCode ierr; 94385d305f5SVijay Mahadevan PetscInt i; 944e882eb38SVijay Mahadevan moab::ErrorCode merr; 945f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 946f6829af0SVijay Mahadevan 947f6829af0SVijay Mahadevan PetscFunctionBegin; 948f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 949304006b3SVijay Mahadevan 950304006b3SVijay Mahadevan dmmoab->refct--; 951304006b3SVijay Mahadevan if (!dmmoab->refct) { 952f6829af0SVijay Mahadevan delete dmmoab->vlocal; 953f6829af0SVijay Mahadevan delete dmmoab->vowned; 954f6829af0SVijay Mahadevan delete dmmoab->vghost; 955f6829af0SVijay Mahadevan delete dmmoab->elocal; 956f6829af0SVijay Mahadevan delete dmmoab->eghost; 957f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 958f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 959f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 960f6829af0SVijay Mahadevan 961f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 9627ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->gidmap, dmmoab->lidmap);CHKERRQ(ierr); 9635905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr); 9645905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr); 96585d305f5SVijay Mahadevan if (dmmoab->fieldNames) { 96685d305f5SVijay Mahadevan for (i = 0; i < dmmoab->numFields; i++) { 96785d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 96885d305f5SVijay Mahadevan } 96985d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 97085d305f5SVijay Mahadevan } 971b117cd09SVijay Mahadevan 972b117cd09SVijay Mahadevan if (dmmoab->nhlevels) { 973b117cd09SVijay Mahadevan ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr); 974e882eb38SVijay Mahadevan dmmoab->nhlevels = 0; 975e882eb38SVijay Mahadevan if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy; 976e882eb38SVijay Mahadevan dmmoab->hierarchy = NULL; 977b117cd09SVijay Mahadevan } 978e882eb38SVijay Mahadevan 979e882eb38SVijay Mahadevan if (dmmoab->icreatedinstance) { 980e882eb38SVijay Mahadevan merr = dmmoab->mbiface->delete_mesh(); MBERRNM(merr); 981e882eb38SVijay Mahadevan delete dmmoab->mbiface; 982e882eb38SVijay Mahadevan } 983e882eb38SVijay Mahadevan dmmoab->mbiface = NULL; 9849daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 985e882eb38SVijay Mahadevan dmmoab->pcomm = NULL; 9869daf19fdSVijay Mahadevan #endif 987f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 988f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 989f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 990304006b3SVijay Mahadevan } 991f6829af0SVijay Mahadevan PetscFunctionReturn(0); 992f6829af0SVijay Mahadevan } 993f6829af0SVijay Mahadevan 994f6829af0SVijay Mahadevan 995*63d025dbSVijay Mahadevan #undef __FUNCT__ 996*63d025dbSVijay Mahadevan #define __FUNCT__ "DMSetFromOptions_Moab" 9974416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject, DM dm) 9982e4e7c01SVijay Mahadevan { 9992e4e7c01SVijay Mahadevan PetscErrorCode ierr; 10002e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 10012e4e7c01SVijay Mahadevan 10022e4e7c01SVijay Mahadevan PetscFunctionBegin; 10032e4e7c01SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1004cc310fddSBarry Smith ierr = PetscOptionsHead(PetscOptionsObject, "DMMoab Options");CHKERRQ(ierr); 10052e4e7c01SVijay Mahadevan ierr = PetscOptionsInt("-dm_moab_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "DMView", dmmoab->rw_dbglevel, &dmmoab->rw_dbglevel, NULL);CHKERRQ(ierr); 10062e4e7c01SVijay Mahadevan ierr = PetscOptionsBool("-dm_moab_partiton_by_rank", "Use partition by rank when reading MOAB meshes from file", "DMView", dmmoab->partition_by_rank, &dmmoab->partition_by_rank, NULL);CHKERRQ(ierr); 10072e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 10082e4e7c01SVijay Mahadevan ierr = PetscOptionsString("-dm_moab_read_opts", "Extra options to enable MOAB reader to load DM from file", "DMView", dmmoab->extra_read_options, dmmoab->extra_read_options, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr); 10092e4e7c01SVijay Mahadevan ierr = PetscOptionsString("-dm_moab_write_opts", "Extra options to enable MOAB writer to serialize DM to file", "DMView", dmmoab->extra_write_options, dmmoab->extra_write_options, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr); 10102e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr); 10112e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr); 10122e4e7c01SVijay Mahadevan PetscFunctionReturn(0); 10132e4e7c01SVijay Mahadevan } 10142e4e7c01SVijay Mahadevan 10152e4e7c01SVijay Mahadevan 1016f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 1017f6829af0SVijay Mahadevan { 1018f6829af0SVijay Mahadevan PetscErrorCode ierr; 1019f6829af0SVijay Mahadevan moab::ErrorCode merr; 1020f6829af0SVijay Mahadevan Vec local, global; 1021f6829af0SVijay Mahadevan IS from, to; 1022f6829af0SVijay Mahadevan moab::Range::iterator iter; 1023304006b3SVijay Mahadevan PetscInt i, j, f, bs, vent, totsize, *lgmap; 1024f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 1025f6829af0SVijay Mahadevan moab::Range adjs; 1026f6829af0SVijay Mahadevan 1027f6829af0SVijay Mahadevan PetscFunctionBegin; 1028f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1029f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 10309daf19fdSVijay Mahadevan if (dmmoab->mbiface == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp."); 10319daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 10329daf19fdSVijay Mahadevan if (dmmoab->pcomm == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp."); 10339daf19fdSVijay Mahadevan #endif 1034f6829af0SVijay Mahadevan 1035f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 1036f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 1037f6829af0SVijay Mahadevan { 103849d66b22SVijay Mahadevan //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 103949d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false); MBERRNM(merr); 1040f6829af0SVijay Mahadevan 10419daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1042f6829af0SVijay Mahadevan /* filter based on parallel status */ 1043f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr); 1044f6829af0SVijay Mahadevan 1045f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1046f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 104764e1c140SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr); 1048f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 1049f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 10509daf19fdSVijay Mahadevan #else 10519daf19fdSVijay Mahadevan *dmmoab->vowned = *dmmoab->vlocal; 10529daf19fdSVijay Mahadevan #endif 1053f6829af0SVijay Mahadevan 1054f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 1055f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 1056f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 105749d66b22SVijay Mahadevan 10589daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1059b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 106049d66b22SVijay Mahadevan PetscInfo4(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost); 10619daf19fdSVijay Mahadevan #else 10629daf19fdSVijay Mahadevan dmmoab->n = dmmoab->nloc; 10639daf19fdSVijay Mahadevan #endif 1064f6829af0SVijay Mahadevan } 1065f6829af0SVijay Mahadevan 1066f6829af0SVijay Mahadevan { 1067f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 1068f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 1069f6829af0SVijay Mahadevan 1070f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 1071f6829af0SVijay Mahadevan for (i = 3; i > 0; i--) { 1072f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 107349d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false); MBERRNM(merr); 1074f6829af0SVijay Mahadevan 1075f6829af0SVijay Mahadevan /* store the current mesh dimension */ 1076f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 1077f6829af0SVijay Mahadevan dmmoab->dim = i; 1078f6829af0SVijay Mahadevan break; 1079f6829af0SVijay Mahadevan } 1080f6829af0SVijay Mahadevan } 1081f6829af0SVijay Mahadevan 1082b117cd09SVijay Mahadevan ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr); 1083b117cd09SVijay Mahadevan 10849daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1085f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 1086f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 1087f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 1088f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 10899daf19fdSVijay Mahadevan #endif 1090f6829af0SVijay Mahadevan 1091f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 1092f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 109349d66b22SVijay Mahadevan 10949daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1095b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 109649d66b22SVijay Mahadevan PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost); 10979daf19fdSVijay Mahadevan #else 10989daf19fdSVijay Mahadevan dmmoab->nele = dmmoab->neleloc; 10999daf19fdSVijay Mahadevan #endif 1100f6829af0SVijay Mahadevan } 1101f6829af0SVijay Mahadevan 1102f6829af0SVijay Mahadevan bs = dmmoab->bs; 1103f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 1104f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 1105f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 1106f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 1107f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr); 1108f6829af0SVijay Mahadevan } 1109f6829af0SVijay Mahadevan 1110f6829af0SVijay Mahadevan totsize = dmmoab->vlocal->size(); 111149d66b22SVijay Mahadevan if (totsize != dmmoab->nloc + dmmoab->nghost) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.", totsize, dmmoab->nloc + dmmoab->nghost); 111249d66b22SVijay Mahadevan ierr = PetscCalloc1(totsize, &dmmoab->gsindices);CHKERRQ(ierr); 1113f6829af0SVijay Mahadevan { 1114f6829af0SVijay Mahadevan /* first get the local indices */ 1115f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]); MBERRNM(merr); 11163f1c6e43SVijay Mahadevan if (dmmoab->nghost) { /* next get the ghosted indices */ 1117f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]); MBERRNM(merr); 1118f6829af0SVijay Mahadevan } 1119f6829af0SVijay Mahadevan 1120f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1121304006b3SVijay Mahadevan dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0]; 1122f6829af0SVijay Mahadevan for (i = 0; i < totsize; ++i) { 1123304006b3SVijay Mahadevan if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i]; 1124304006b3SVijay Mahadevan if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i]; 1125f6829af0SVijay Mahadevan } 1126f6829af0SVijay Mahadevan 1127304006b3SVijay Mahadevan ierr = MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1128304006b3SVijay Mahadevan ierr = MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1129f6829af0SVijay Mahadevan 1130f6829af0SVijay Mahadevan /* set the GID map */ 1131f6829af0SVijay Mahadevan for (i = 0; i < totsize; ++i) { 1132304006b3SVijay Mahadevan dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */ 1133f6829af0SVijay Mahadevan } 1134304006b3SVijay Mahadevan dmmoab->lminmax[0] -= dmmoab->gminmax[0]; 1135304006b3SVijay Mahadevan dmmoab->lminmax[1] -= dmmoab->gminmax[0]; 1136f6829af0SVijay Mahadevan 1137304006b3SVijay Mahadevan PetscInfo4(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]); 1138f6829af0SVijay Mahadevan } 113982dfd14aSVijay Mahadevan if (!(dmmoab->bs == dmmoab->numFields || dmmoab->bs == 1)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between block size and number of component fields. %D != 1 OR %D != %D.", dmmoab->bs, dmmoab->bs, dmmoab->numFields); 1140f6829af0SVijay Mahadevan 1141f6829af0SVijay Mahadevan { 11423f1c6e43SVijay Mahadevan dmmoab->seqstart = ((PetscInt)dmmoab->vlocal->front()); 11433f1c6e43SVijay Mahadevan dmmoab->seqend = ((PetscInt)dmmoab->vlocal->back()); 1144304006b3SVijay Mahadevan PetscInfo2(NULL, "SEQUENCE: Local [min, max] - [%D, %D]\n", dmmoab->seqstart, dmmoab->seqend); 11453f1c6e43SVijay Mahadevan 114649d66b22SVijay Mahadevan ierr = PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap);CHKERRQ(ierr); 11473f1c6e43SVijay Mahadevan ierr = PetscMalloc1(totsize * dmmoab->numFields, &lgmap);CHKERRQ(ierr); 1148f6829af0SVijay Mahadevan 1149f6829af0SVijay Mahadevan i = j = 0; 1150f6829af0SVijay Mahadevan /* set the owned vertex data first */ 1151f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) { 11523f1c6e43SVijay Mahadevan vent = (PetscInt)(*iter) - dmmoab->seqstart; 1153f6829af0SVijay Mahadevan dmmoab->gidmap[vent] = dmmoab->gsindices[i]; 1154f6829af0SVijay Mahadevan dmmoab->lidmap[vent] = i; 1155f6829af0SVijay Mahadevan for (f = 0; f < dmmoab->numFields; f++, j++) { 11563f1c6e43SVijay Mahadevan lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]); 1157f6829af0SVijay Mahadevan } 1158f6829af0SVijay Mahadevan } 1159f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1160f6829af0SVijay Mahadevan for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) { 11613f1c6e43SVijay Mahadevan vent = (PetscInt)(*iter) - dmmoab->seqstart; 1162f6829af0SVijay Mahadevan dmmoab->gidmap[vent] = dmmoab->gsindices[i]; 1163f6829af0SVijay Mahadevan dmmoab->lidmap[vent] = i; 1164f6829af0SVijay Mahadevan for (f = 0; f < dmmoab->numFields; f++, j++) { 11653f1c6e43SVijay Mahadevan lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]); 1166f6829af0SVijay Mahadevan } 1167f6829af0SVijay Mahadevan } 1168f6829af0SVijay Mahadevan 1169f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1170f6829af0SVijay Mahadevan 1) First create a local and global vector 1171f6829af0SVijay Mahadevan 2) Create a local and global IS 1172f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1173f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1174f6829af0SVijay Mahadevan */ 1175f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 1176f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 1177f6829af0SVijay Mahadevan 1178f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 1179f6829af0SVijay Mahadevan 1180f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 1181f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from);CHKERRQ(ierr); 1182f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from, bs);CHKERRQ(ierr); 1183f6829af0SVijay Mahadevan 11843f1c6e43SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to);CHKERRQ(ierr); 1185f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to, bs);CHKERRQ(ierr); 1186f6829af0SVijay Mahadevan 1187f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1188f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 11893f1c6e43SVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap, 1190f6829af0SVijay Mahadevan PETSC_COPY_VALUES, &dmmoab->ltog_map);CHKERRQ(ierr); 1191f6829af0SVijay Mahadevan } 1192f6829af0SVijay Mahadevan 1193f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 1194f6829af0SVijay Mahadevan ierr = VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv);CHKERRQ(ierr); 1195f6829af0SVijay Mahadevan 1196f6829af0SVijay Mahadevan /* clean up IS, Vec */ 11973f1c6e43SVijay Mahadevan ierr = PetscFree(lgmap);CHKERRQ(ierr); 1198f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 1199f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 1200f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 1201f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 1202f6829af0SVijay Mahadevan } 1203f6829af0SVijay Mahadevan 120449d66b22SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 120549d66b22SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 120649d66b22SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1207f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 1208f6829af0SVijay Mahadevan { 1209f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1210f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1211f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1212f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1213f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1214f6829af0SVijay Mahadevan 1215f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 1216f6829af0SVijay Mahadevan merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, false, true, false); MBERRNM(merr); // 'false' param indicates we want faces back, not vertices 1217f6829af0SVijay Mahadevan 12189daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1219f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1220f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr); 1221f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_SHARED, PSTATUS_NOT); MBERRNM(merr); 12229daf19fdSVijay Mahadevan #endif 1223f6829af0SVijay Mahadevan 1224f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1225f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false); MBERRNM(ierr); 1226755f3dfbSVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION); MBERRNM(ierr); 1227f6829af0SVijay Mahadevan } 122849d66b22SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size()); 1229f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1230f6829af0SVijay Mahadevan } 1231f6829af0SVijay Mahadevan 1232304006b3SVijay Mahadevan 1233304006b3SVijay Mahadevan #undef __FUNCT__ 1234304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateVertices" 1235304006b3SVijay Mahadevan /*@ 1236304006b3SVijay Mahadevan DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM. 1237304006b3SVijay Mahadevan 1238304006b3SVijay Mahadevan Collective on MPI_Comm 1239304006b3SVijay Mahadevan 1240304006b3SVijay Mahadevan Input Parameters: 1241304006b3SVijay Mahadevan + dm - The DM object 1242304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra) 1243304006b3SVijay Mahadevan . conn - The connectivity of the element 1244304006b3SVijay Mahadevan . nverts - The number of vertices that form the element 1245304006b3SVijay Mahadevan 1246304006b3SVijay Mahadevan Output Parameter: 1247304006b3SVijay Mahadevan . overts - The list of vertices that were created (can be NULL) 1248304006b3SVijay Mahadevan 1249304006b3SVijay Mahadevan Level: beginner 1250304006b3SVijay Mahadevan 1251304006b3SVijay Mahadevan .keywords: DM, create vertices 1252304006b3SVijay Mahadevan 1253304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateElement() 1254304006b3SVijay Mahadevan @*/ 1255304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal* coords, PetscInt nverts, moab::Range* overts) 1256304006b3SVijay Mahadevan { 1257304006b3SVijay Mahadevan moab::ErrorCode merr; 1258304006b3SVijay Mahadevan DM_Moab *dmmoab; 1259304006b3SVijay Mahadevan moab::Range verts; 1260304006b3SVijay Mahadevan 1261304006b3SVijay Mahadevan PetscFunctionBegin; 1262304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1263304006b3SVijay Mahadevan PetscValidPointer(coords, 2); 1264304006b3SVijay Mahadevan 1265304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1266304006b3SVijay Mahadevan 1267304006b3SVijay Mahadevan /* Insert new points */ 1268304006b3SVijay Mahadevan merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts); MBERRNM(merr); 1269304006b3SVijay Mahadevan merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts); MBERRNM(merr); 1270304006b3SVijay Mahadevan 1271304006b3SVijay Mahadevan if (overts) *overts = verts; 1272304006b3SVijay Mahadevan PetscFunctionReturn(0); 1273304006b3SVijay Mahadevan } 1274304006b3SVijay Mahadevan 1275304006b3SVijay Mahadevan 1276304006b3SVijay Mahadevan #undef __FUNCT__ 1277304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateElement" 1278304006b3SVijay Mahadevan /*@ 1279304006b3SVijay Mahadevan DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM. 1280304006b3SVijay Mahadevan 1281304006b3SVijay Mahadevan Collective on MPI_Comm 1282304006b3SVijay Mahadevan 1283304006b3SVijay Mahadevan Input Parameters: 1284304006b3SVijay Mahadevan + dm - The DM object 1285304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra) 1286304006b3SVijay Mahadevan . conn - The connectivity of the element 1287304006b3SVijay Mahadevan . nverts - The number of vertices that form the element 1288304006b3SVijay Mahadevan 1289304006b3SVijay Mahadevan Output Parameter: 1290304006b3SVijay Mahadevan . oelem - The handle to the element created and added to the DM object 1291304006b3SVijay Mahadevan 1292304006b3SVijay Mahadevan Level: beginner 1293304006b3SVijay Mahadevan 1294304006b3SVijay Mahadevan .keywords: DM, create element 1295304006b3SVijay Mahadevan 1296304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateVertices() 1297304006b3SVijay Mahadevan @*/ 1298304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle* conn, PetscInt nverts, moab::EntityHandle* oelem) 1299304006b3SVijay Mahadevan { 1300304006b3SVijay Mahadevan moab::ErrorCode merr; 1301304006b3SVijay Mahadevan DM_Moab *dmmoab; 1302304006b3SVijay Mahadevan moab::EntityHandle elem; 1303304006b3SVijay Mahadevan 1304304006b3SVijay Mahadevan PetscFunctionBegin; 1305304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1306304006b3SVijay Mahadevan PetscValidPointer(conn, 3); 1307304006b3SVijay Mahadevan 1308304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1309304006b3SVijay Mahadevan 1310304006b3SVijay Mahadevan /* Insert new element */ 1311304006b3SVijay Mahadevan merr = dmmoab->mbiface->create_element(type, conn, nverts, elem); MBERRNM(merr); 1312304006b3SVijay Mahadevan merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1); MBERRNM(merr); 1313304006b3SVijay Mahadevan 1314304006b3SVijay Mahadevan if (oelem) *oelem = elem; 1315304006b3SVijay Mahadevan PetscFunctionReturn(0); 1316304006b3SVijay Mahadevan } 1317304006b3SVijay Mahadevan 1318304006b3SVijay Mahadevan 1319304006b3SVijay Mahadevan #undef __FUNCT__ 1320304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateSubmesh" 1321304006b3SVijay Mahadevan /*@ 1322304006b3SVijay Mahadevan DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent 1323304006b3SVijay Mahadevan in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to 1324304006b3SVijay Mahadevan create a DM object on a refined level. 1325304006b3SVijay Mahadevan 1326304006b3SVijay Mahadevan Collective on MPI_Comm 1327304006b3SVijay Mahadevan 1328304006b3SVijay Mahadevan Input Parameters: 1329304006b3SVijay Mahadevan + dm - The DM object 1330304006b3SVijay Mahadevan 1331304006b3SVijay Mahadevan Output Parameter: 1332304006b3SVijay Mahadevan . newdm - The sub DM object with updated set information 1333304006b3SVijay Mahadevan 1334304006b3SVijay Mahadevan Level: advanced 1335304006b3SVijay Mahadevan 1336304006b3SVijay Mahadevan .keywords: DM, sub-DM 1337304006b3SVijay Mahadevan 1338304006b3SVijay Mahadevan .seealso: DMCreate(), DMMoabCreateVertices(), DMMoabCreateElement() 1339304006b3SVijay Mahadevan @*/ 1340304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm) 1341304006b3SVijay Mahadevan { 1342304006b3SVijay Mahadevan DM_Moab *dmmoab; 1343304006b3SVijay Mahadevan DM_Moab *ndmmoab; 1344304006b3SVijay Mahadevan moab::ErrorCode merr; 1345304006b3SVijay Mahadevan PetscErrorCode ierr; 1346304006b3SVijay Mahadevan 1347304006b3SVijay Mahadevan PetscFunctionBegin; 1348304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1349304006b3SVijay Mahadevan 1350304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1351304006b3SVijay Mahadevan 1352304006b3SVijay Mahadevan /* Create the basic DMMoab object and keep the default parameters created by DM impls */ 13539daf19fdSVijay Mahadevan ierr = DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, PETSC_NULL, newdm);CHKERRQ(ierr); 1354304006b3SVijay Mahadevan 1355304006b3SVijay Mahadevan /* get all the necessary handles from the private DM object */ 1356304006b3SVijay Mahadevan ndmmoab = (DM_Moab*) (*newdm)->data; 1357304006b3SVijay Mahadevan 1358304006b3SVijay Mahadevan /* set the sub-mesh's parent DM reference */ 1359304006b3SVijay Mahadevan ndmmoab->parent = &dm; 1360304006b3SVijay Mahadevan 1361304006b3SVijay Mahadevan /* create a file set to associate all entities in current mesh */ 1362304006b3SVijay Mahadevan merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset); MBERR("Creating file set failed", merr); 1363304006b3SVijay Mahadevan 1364304006b3SVijay Mahadevan /* create a meshset and then add old fileset as child */ 1365304006b3SVijay Mahadevan merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal); MBERR("Adding child vertices to parent failed", merr); 1366304006b3SVijay Mahadevan merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal); MBERR("Adding child elements to parent failed", merr); 1367304006b3SVijay Mahadevan 1368304006b3SVijay Mahadevan /* preserve the field association between the parent and sub-mesh objects */ 1369304006b3SVijay Mahadevan ierr = DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames);CHKERRQ(ierr); 1370304006b3SVijay Mahadevan PetscFunctionReturn(0); 1371304006b3SVijay Mahadevan } 1372304006b3SVijay Mahadevan 1373304006b3SVijay Mahadevan 1374304006b3SVijay Mahadevan #undef __FUNCT__ 1375304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_Ascii" 1376304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer) 1377304006b3SVijay Mahadevan { 1378304006b3SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 1379304006b3SVijay Mahadevan const char *name; 1380304006b3SVijay Mahadevan MPI_Comm comm; 1381304006b3SVijay Mahadevan PetscMPIInt size; 1382304006b3SVijay Mahadevan PetscErrorCode ierr; 1383304006b3SVijay Mahadevan 1384304006b3SVijay Mahadevan PetscFunctionBegin; 1385304006b3SVijay Mahadevan ierr = PetscObjectGetComm((PetscObject)dm, &comm);CHKERRQ(ierr); 1386304006b3SVijay Mahadevan ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 1387304006b3SVijay Mahadevan ierr = PetscObjectGetName((PetscObject) dm, &name);CHKERRQ(ierr); 1388304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1389304006b3SVijay Mahadevan if (name) {ierr = PetscViewerASCIIPrintf(viewer, "%s in %D dimensions:\n", name, dmmoab->dim);CHKERRQ(ierr);} 1390304006b3SVijay Mahadevan else {ierr = PetscViewerASCIIPrintf(viewer, "Mesh in %D dimensions:\n", dmmoab->dim);CHKERRQ(ierr);} 1391304006b3SVijay Mahadevan /* print details about the global mesh */ 1392304006b3SVijay Mahadevan { 1393304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1394304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "Sizes: cells=%D, vertices=%D, blocks=%D\n", dmmoab->n, dmmoab->nele, dmmoab->bs);CHKERRQ(ierr); 1395304006b3SVijay Mahadevan /* print boundary data */ 1396304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "Boundary trace:\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr); 1397304006b3SVijay Mahadevan { 1398304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1399304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "cells=%D, faces=%D, vertices=%D\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr); 1400304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1401304006b3SVijay Mahadevan } 1402304006b3SVijay Mahadevan /* print field data */ 1403304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "Fields: %D components\n", dmmoab->numFields);CHKERRQ(ierr); 1404304006b3SVijay Mahadevan { 1405304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1406304006b3SVijay Mahadevan for (int i = 0; i < dmmoab->numFields; ++i) { 1407304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "[%D] - %s\n", i, dmmoab->fieldNames[i]);CHKERRQ(ierr); 1408304006b3SVijay Mahadevan } 1409304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1410304006b3SVijay Mahadevan } 1411304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1412304006b3SVijay Mahadevan } 1413304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1414304006b3SVijay Mahadevan ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 1415304006b3SVijay Mahadevan PetscFunctionReturn(0); 1416304006b3SVijay Mahadevan } 1417304006b3SVijay Mahadevan 1418304006b3SVijay Mahadevan #undef __FUNCT__ 1419304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_VTK" 1420304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v) 1421304006b3SVijay Mahadevan { 1422304006b3SVijay Mahadevan PetscFunctionReturn(0); 1423304006b3SVijay Mahadevan } 1424304006b3SVijay Mahadevan 1425304006b3SVijay Mahadevan #undef __FUNCT__ 1426304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_HDF5" 1427304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v) 1428304006b3SVijay Mahadevan { 1429304006b3SVijay Mahadevan PetscFunctionReturn(0); 1430304006b3SVijay Mahadevan } 1431304006b3SVijay Mahadevan 1432304006b3SVijay Mahadevan #undef __FUNCT__ 1433304006b3SVijay Mahadevan #define __FUNCT__ "DMView_Moab" 1434304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer) 1435304006b3SVijay Mahadevan { 1436304006b3SVijay Mahadevan PetscBool iascii, ishdf5, isvtk; 1437304006b3SVijay Mahadevan PetscErrorCode ierr; 1438304006b3SVijay Mahadevan 1439304006b3SVijay Mahadevan PetscFunctionBegin; 1440304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1441304006b3SVijay Mahadevan PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 1442304006b3SVijay Mahadevan ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 1443304006b3SVijay Mahadevan ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERVTK, &isvtk);CHKERRQ(ierr); 1444304006b3SVijay Mahadevan ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERHDF5, &ishdf5);CHKERRQ(ierr); 1445304006b3SVijay Mahadevan if (iascii) { 1446304006b3SVijay Mahadevan ierr = DMMoabView_Ascii(dm, viewer);CHKERRQ(ierr); 1447304006b3SVijay Mahadevan } else if (ishdf5) { 1448304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5) 1449304006b3SVijay Mahadevan ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ);CHKERRQ(ierr); 1450304006b3SVijay Mahadevan ierr = DMMoabView_HDF5(dm, viewer);CHKERRQ(ierr); 1451304006b3SVijay Mahadevan ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 1452304006b3SVijay Mahadevan #else 1453304006b3SVijay Mahadevan SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5"); 1454304006b3SVijay Mahadevan #endif 1455304006b3SVijay Mahadevan } 1456304006b3SVijay Mahadevan else if (isvtk) { 1457304006b3SVijay Mahadevan ierr = DMMoabView_VTK(dm, viewer);CHKERRQ(ierr); 1458304006b3SVijay Mahadevan } 1459304006b3SVijay Mahadevan PetscFunctionReturn(0); 1460304006b3SVijay Mahadevan } 1461304006b3SVijay Mahadevan 1462304006b3SVijay Mahadevan 1463304006b3SVijay Mahadevan #undef __FUNCT__ 1464304006b3SVijay Mahadevan #define __FUNCT__ "DMInitialize_Moab" 1465304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm) 1466304006b3SVijay Mahadevan { 1467304006b3SVijay Mahadevan PetscFunctionBegin; 1468304006b3SVijay Mahadevan dm->ops->view = DMView_Moab; 1469304006b3SVijay Mahadevan dm->ops->load = NULL /*DMLoad_Moab*/; 1470304006b3SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1471304006b3SVijay Mahadevan dm->ops->clone = DMClone_Moab; 1472304006b3SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1473304006b3SVijay Mahadevan dm->ops->createdefaultsection = NULL; 1474304006b3SVijay Mahadevan dm->ops->createdefaultconstraints = NULL; 1475304006b3SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1476304006b3SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1477304006b3SVijay Mahadevan dm->ops->getlocaltoglobalmapping = NULL; 1478304006b3SVijay Mahadevan dm->ops->createfieldis = NULL; 1479304006b3SVijay Mahadevan dm->ops->createcoordinatedm = NULL /*DMCreateCoordinateDM_Moab*/; 1480304006b3SVijay Mahadevan dm->ops->getcoloring = NULL; 1481304006b3SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1482304006b3SVijay Mahadevan dm->ops->createinterpolation = DMCreateInterpolation_Moab; 1483304006b3SVijay Mahadevan dm->ops->getaggregates = NULL; 1484304006b3SVijay Mahadevan dm->ops->getinjection = NULL /*DMCreateInjection_Moab*/; 1485304006b3SVijay Mahadevan dm->ops->refine = DMRefine_Moab; 1486304006b3SVijay Mahadevan dm->ops->coarsen = DMCoarsen_Moab; 1487304006b3SVijay Mahadevan dm->ops->refinehierarchy = DMRefineHierarchy_Moab; 1488304006b3SVijay Mahadevan dm->ops->coarsenhierarchy = DMCoarsenHierarchy_Moab; 1489304006b3SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1490304006b3SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1491304006b3SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1492304006b3SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1493304006b3SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 1494304006b3SVijay Mahadevan dm->ops->createsubdm = NULL /*DMCreateSubDM_Moab*/; 1495304006b3SVijay Mahadevan dm->ops->getdimpoints = NULL /*DMGetDimPoints_Moab*/; 1496304006b3SVijay Mahadevan dm->ops->locatepoints = NULL /*DMLocatePoints_Moab*/; 1497304006b3SVijay Mahadevan PetscFunctionReturn(0); 1498304006b3SVijay Mahadevan } 1499304006b3SVijay Mahadevan 1500304006b3SVijay Mahadevan 1501304006b3SVijay Mahadevan #undef __FUNCT__ 1502304006b3SVijay Mahadevan #define __FUNCT__ "DMClone_Moab" 1503304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm) 1504304006b3SVijay Mahadevan { 1505304006b3SVijay Mahadevan PetscErrorCode ierr; 1506304006b3SVijay Mahadevan 1507304006b3SVijay Mahadevan PetscFunctionBegin; 1508304006b3SVijay Mahadevan ierr = PetscObjectChangeTypeName((PetscObject) * newdm, DMMOAB);CHKERRQ(ierr); 1509304006b3SVijay Mahadevan 1510304006b3SVijay Mahadevan /* get all the necessary handles from the private DM object */ 1511304006b3SVijay Mahadevan (*newdm)->data = (DM_Moab*) dm->data; 1512304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->refct++; 1513304006b3SVijay Mahadevan 1514304006b3SVijay Mahadevan ierr = DMInitialize_Moab(*newdm);CHKERRQ(ierr); 1515304006b3SVijay Mahadevan PetscFunctionReturn(0); 1516304006b3SVijay Mahadevan } 1517304006b3SVijay Mahadevan 1518304006b3SVijay Mahadevan 1519304006b3SVijay Mahadevan #undef __FUNCT__ 1520304006b3SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab" 1521f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1522f6829af0SVijay Mahadevan { 1523f6829af0SVijay Mahadevan PetscErrorCode ierr; 1524f6829af0SVijay Mahadevan 1525f6829af0SVijay Mahadevan PetscFunctionBegin; 1526f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1527f90c3b0eSVijay Mahadevan ierr = PetscNewLog(dm, (DM_Moab**)&dm->data);CHKERRQ(ierr); 1528f6829af0SVijay Mahadevan 1529f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1530f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1531f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1532f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1533f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1534f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1535f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1536f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1537c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_map = NULL; 1538c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_sendrecv = NULL; 1539f6829af0SVijay Mahadevan 1540304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->refct = 1; 1541304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->parent = NULL; 1542f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1543f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1544f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1545f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1546f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1547f6829af0SVijay Mahadevan 1548304006b3SVijay Mahadevan ierr = DMInitialize_Moab(dm);CHKERRQ(ierr); 1549f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1550f6829af0SVijay Mahadevan } 1551f6829af0SVijay Mahadevan 1552