1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 21d72bce8STim Tautges 31d72bce8STim Tautges #include <petscdmmoab.h> 488face26SJed Brown #include <MBTagConventions.hpp> 51cec0304SVijay Mahadevan #include <moab/Skinner.hpp> 6032b8ab6SVijay Mahadevan 7c6ef30f9SVijay Mahadevan /*MC 8c6ef30f9SVijay Mahadevan DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database. 9c6ef30f9SVijay Mahadevan Direct access to the MOAB Interface and other mesh manipulation related objects are available 10c6ef30f9SVijay Mahadevan through public API. Ability to create global and local representation of Vecs containing all 11c6ef30f9SVijay Mahadevan unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided 12c6ef30f9SVijay Mahadevan along with utility functions to traverse the mesh and assemble a discrete system via 13c6ef30f9SVijay Mahadevan field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are 14c6ef30f9SVijay Mahadevan available. 15c6ef30f9SVijay Mahadevan 16c6ef30f9SVijay Mahadevan Reference: http://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html 17c6ef30f9SVijay Mahadevan 18c6ef30f9SVijay Mahadevan Level: intermediate 19c6ef30f9SVijay Mahadevan 20c6ef30f9SVijay Mahadevan .seealso: DMType, DMMoabCreate(), DMCreate(), DMSetType(), DMMoabCreateMoab() 21c6ef30f9SVijay Mahadevan M*/ 22c6ef30f9SVijay Mahadevan 23*304006b3SVijay Mahadevan /* External function declarations here */ 24*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling); 25*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm); 26*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J); 27*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm); 28*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined); 29*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened); 30*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]); 31*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm,PetscInt nlevels,DM dmCoarsened[]); 32*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm); 33*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM,Vec *); 34*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM,Vec *); 35*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm,Mat *J); 36*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM,Vec,InsertMode,Vec); 37*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM,Vec,InsertMode,Vec); 38*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM,Vec,InsertMode,Vec); 39*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM,Vec,InsertMode,Vec); 40*304006b3SVijay Mahadevan 41*304006b3SVijay Mahadevan 42*304006b3SVijay Mahadevan /* Un-implemented routines */ 43*304006b3SVijay Mahadevan /* 44*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultSection_Moab(DM dm); 45*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat); 46*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer); 47*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd); 48*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm); 49*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS); 50*304006b3SVijay Mahadevan */ 51c6ef30f9SVijay Mahadevan 521d72bce8STim Tautges /*@ 531d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 541d72bce8STim Tautges 551d72bce8STim Tautges Collective on MPI_Comm 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 .keywords: DMMoab, create 661d72bce8STim Tautges @*/ 67032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 681d72bce8STim Tautges { 691d72bce8STim Tautges PetscErrorCode ierr; 701d72bce8STim Tautges 711d72bce8STim Tautges PetscFunctionBegin; 72032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 73032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 74032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 751d72bce8STim Tautges PetscFunctionReturn(0); 761d72bce8STim Tautges } 771d72bce8STim Tautges 781d72bce8STim Tautges /*@ 79b117cd09SVijay Mahadevan DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data 801d72bce8STim Tautges 811d72bce8STim Tautges Collective on MPI_Comm 821d72bce8STim Tautges 831d72bce8STim Tautges Input Parameter: 841d72bce8STim Tautges . comm - The communicator for the DMMoab object 85032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 86a4d2169cSTim Tautges along with the DMMoab 87a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 881d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 891d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 901d72bce8STim Tautges 911d72bce8STim Tautges Output Parameter: 92032b8ab6SVijay Mahadevan . dmb - The DMMoab object 931d72bce8STim Tautges 94032b8ab6SVijay Mahadevan Level: intermediate 951d72bce8STim Tautges 961d72bce8STim Tautges .keywords: DMMoab, create 971d72bce8STim Tautges @*/ 98032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 991d72bce8STim Tautges { 1001d72bce8STim Tautges PetscErrorCode ierr; 101032b8ab6SVijay Mahadevan moab::ErrorCode merr; 1021cec0304SVijay Mahadevan moab::EntityHandle partnset; 1031cec0304SVijay Mahadevan PetscInt rank, nprocs; 10485d305f5SVijay Mahadevan DM dmmb; 105853cdec3SJed Brown DM_Moab *dmmoab; 1061d72bce8STim Tautges 1071d72bce8STim Tautges PetscFunctionBegin; 108032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 10985d305f5SVijay Mahadevan 11085d305f5SVijay Mahadevan ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr); 11185d305f5SVijay Mahadevan dmmoab = (DM_Moab*)(dmmb)->data; 112a4d2169cSTim Tautges 113a4d2169cSTim Tautges if (!mbiface) { 11472ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 1157d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 1161d72bce8STim Tautges } 1171cec0304SVijay Mahadevan else { 1181cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 1197d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 1201cec0304SVijay Mahadevan } 1211cec0304SVijay Mahadevan 122b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 123b5410836SVijay Mahadevan dmmoab->fileset=0; 124b117cd09SVijay Mahadevan dmmoab->hlevel=0; 12549d66b22SVijay Mahadevan dmmoab->nghostrings=0; 1267d89fc02STim Tautges 127a4d2169cSTim Tautges if (!pcomm) { 128032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 129032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 130032b8ab6SVijay Mahadevan 131db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 132db66d124SVijay Mahadevan to the load_file functions to be populated. */ 1330c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr); 134032b8ab6SVijay Mahadevan 135db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 13672ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 13772ff976dSVijay Mahadevan } 13872ff976dSVijay Mahadevan else { 13985d305f5SVijay Mahadevan ierr = DMMoabSetParallelComm(dmmb, pcomm);CHKERRQ(ierr); 140032b8ab6SVijay Mahadevan } 141032b8ab6SVijay Mahadevan 1424973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 1434973de03SVijay Mahadevan dmmoab->bs = 1; 144addae81cSVijay Mahadevan dmmoab->numFields = 1; 1453f1c6e43SVijay Mahadevan ierr = PetscMalloc(dmmoab->numFields*sizeof(char*),&dmmoab->fieldNames);CHKERRQ(ierr); 1463f1c6e43SVijay Mahadevan ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr); 1472e4e7c01SVijay Mahadevan dmmoab->rw_dbglevel = 0; 1482e4e7c01SVijay Mahadevan dmmoab->partition_by_rank = PETSC_FALSE; 1492e4e7c01SVijay Mahadevan dmmoab->extra_read_options[0] = '\0'; 1502e4e7c01SVijay Mahadevan dmmoab->extra_write_options[0] = '\0'; 1512e4e7c01SVijay Mahadevan dmmoab->read_mode = READ_PART; 1522e4e7c01SVijay Mahadevan dmmoab->write_mode = WRITE_PART; 1534973de03SVijay Mahadevan 1544973de03SVijay Mahadevan /* set global ID tag handle */ 1551a845d2aSVijay Mahadevan if (ltog_tag && *ltog_tag) { 15685d305f5SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr); 157032b8ab6SVijay Mahadevan } 158032b8ab6SVijay Mahadevan else { 1591a845d2aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1601a845d2aSVijay Mahadevan if (ltog_tag) *ltog_tag = dmmoab->ltog_tag; 161a4d2169cSTim Tautges } 162a4d2169cSTim Tautges 163340f3b9aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr); 164340f3b9aSVijay Mahadevan 1654973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 166a4d2169cSTim Tautges if (range) { 16785d305f5SVijay Mahadevan ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr); 168a4d2169cSTim Tautges } 16985d305f5SVijay Mahadevan *dmb=dmmb; 1701d72bce8STim Tautges PetscFunctionReturn(0); 1711d72bce8STim Tautges } 1721d72bce8STim Tautges 173*304006b3SVijay Mahadevan 174*304006b3SVijay Mahadevan #undef __FUNCT__ 175*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabSetParallelComm" 176aa768e4cSTim Tautges /*@ 177aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 178aa768e4cSTim Tautges 179aa768e4cSTim Tautges Collective on MPI_Comm 180aa768e4cSTim Tautges 181aa768e4cSTim Tautges Input Parameter: 182aa768e4cSTim Tautges . dm - The DMMoab object being set 183aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 184aa768e4cSTim Tautges 185aa768e4cSTim Tautges Level: beginner 186aa768e4cSTim Tautges 187aa768e4cSTim Tautges .keywords: DMMoab, create 188aa768e4cSTim Tautges @*/ 1891d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 1901d72bce8STim Tautges { 191032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 192032b8ab6SVijay Mahadevan 1931d72bce8STim Tautges PetscFunctionBegin; 1941d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1951cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 196032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 197032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 198032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 1991d72bce8STim Tautges PetscFunctionReturn(0); 2001d72bce8STim Tautges } 2011d72bce8STim Tautges 2021d72bce8STim Tautges 203aa768e4cSTim Tautges /*@ 204aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 205aa768e4cSTim Tautges 206aa768e4cSTim Tautges Collective on MPI_Comm 207aa768e4cSTim Tautges 208aa768e4cSTim Tautges Input Parameter: 209aa768e4cSTim Tautges . dm - The DMMoab object being set 210aa768e4cSTim Tautges 211aa768e4cSTim Tautges Output Parameter: 212aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 213aa768e4cSTim Tautges 214aa768e4cSTim Tautges Level: beginner 215aa768e4cSTim Tautges 216aa768e4cSTim Tautges .keywords: DMMoab, create 217aa768e4cSTim Tautges @*/ 2181d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 2191d72bce8STim Tautges { 2201d72bce8STim Tautges PetscFunctionBegin; 2211d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 222032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 2231d72bce8STim Tautges PetscFunctionReturn(0); 2241d72bce8STim Tautges } 2251d72bce8STim Tautges 2261d72bce8STim Tautges 227aa768e4cSTim Tautges /*@ 228aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance used with this DMMoab 229aa768e4cSTim Tautges 230aa768e4cSTim Tautges Collective on MPI_Comm 231aa768e4cSTim Tautges 232aa768e4cSTim Tautges Input Parameter: 233aa768e4cSTim Tautges . dm - The DMMoab object being set 234aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab 235aa768e4cSTim Tautges 236aa768e4cSTim Tautges Level: beginner 237aa768e4cSTim Tautges 238aa768e4cSTim Tautges .keywords: DMMoab, create 239aa768e4cSTim Tautges @*/ 240a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 2411d72bce8STim Tautges { 242032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 243032b8ab6SVijay Mahadevan 2441d72bce8STim Tautges PetscFunctionBegin; 2451d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2461cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 247032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 248032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 249032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2501d72bce8STim Tautges PetscFunctionReturn(0); 2511d72bce8STim Tautges } 2521d72bce8STim Tautges 2531d72bce8STim Tautges 254aa768e4cSTim Tautges /*@ 255aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 256aa768e4cSTim Tautges 257aa768e4cSTim Tautges Collective on MPI_Comm 258aa768e4cSTim Tautges 259aa768e4cSTim Tautges Input Parameter: 260aa768e4cSTim Tautges . dm - The DMMoab object being set 261aa768e4cSTim Tautges 262aa768e4cSTim Tautges Output Parameter: 263aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 264aa768e4cSTim Tautges 265aa768e4cSTim Tautges Level: beginner 266aa768e4cSTim Tautges 267aa768e4cSTim Tautges .keywords: DMMoab, create 268aa768e4cSTim Tautges @*/ 269a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 2701d72bce8STim Tautges { 2719426e041SSatish Balay PetscErrorCode ierr; 272cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 273cabb514dSBarry Smith 2741d72bce8STim Tautges PetscFunctionBegin; 2751d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 276cabb514dSBarry 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); 277a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 2781d72bce8STim Tautges PetscFunctionReturn(0); 2791d72bce8STim Tautges } 2801d72bce8STim Tautges 2811d72bce8STim Tautges 282aa768e4cSTim Tautges /*@ 2835eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 284aa768e4cSTim Tautges 285aa768e4cSTim Tautges Collective on MPI_Comm 286aa768e4cSTim Tautges 287aa768e4cSTim Tautges Input Parameter: 288aa768e4cSTim Tautges . dm - The DMMoab object being set 289aa768e4cSTim Tautges . range - The entities treated by this DMMoab 290aa768e4cSTim Tautges 291aa768e4cSTim Tautges Level: beginner 292aa768e4cSTim Tautges 293aa768e4cSTim Tautges .keywords: DMMoab, create 294aa768e4cSTim Tautges @*/ 2955eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 2961d72bce8STim Tautges { 297032b8ab6SVijay Mahadevan moab::ErrorCode merr; 298032b8ab6SVijay Mahadevan PetscErrorCode ierr; 299fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 300032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 301032b8ab6SVijay Mahadevan 3021d72bce8STim Tautges PetscFunctionBegin; 3031d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 304032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 305032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 306fd3326ddSVijay Mahadevan 307032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 308fd3326ddSVijay Mahadevan 309fd3326ddSVijay Mahadevan /* filter based on parallel status */ 310fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 311fd3326ddSVijay Mahadevan 312fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 313fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 314fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 315fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 316fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 317fd3326ddSVijay Mahadevan 318fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 319032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 320032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 321b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 3221d72bce8STim Tautges PetscFunctionReturn(0); 3231d72bce8STim Tautges } 3241d72bce8STim Tautges 3251d72bce8STim Tautges 3268d8d51c8SVijay Mahadevan /*@ 3278d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 3288d8d51c8SVijay Mahadevan 3298d8d51c8SVijay Mahadevan Collective on MPI_Comm 3308d8d51c8SVijay Mahadevan 3318d8d51c8SVijay Mahadevan Input Parameter: 3328d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 3338d8d51c8SVijay Mahadevan 3348d8d51c8SVijay Mahadevan Output Parameter: 3358d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 3368d8d51c8SVijay Mahadevan 3378d8d51c8SVijay Mahadevan Level: beginner 3388d8d51c8SVijay Mahadevan 3398d8d51c8SVijay Mahadevan .keywords: DMMoab, create 3408d8d51c8SVijay Mahadevan @*/ 3418d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 3428d8d51c8SVijay Mahadevan { 3438d8d51c8SVijay Mahadevan PetscFunctionBegin; 3448d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3458d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 3468d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3478d8d51c8SVijay Mahadevan } 3488d8d51c8SVijay Mahadevan 3498d8d51c8SVijay Mahadevan 3508d8d51c8SVijay Mahadevan 351aa768e4cSTim Tautges /*@ 3525eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 353aa768e4cSTim Tautges 354aa768e4cSTim Tautges Collective on MPI_Comm 355aa768e4cSTim Tautges 356aa768e4cSTim Tautges Input Parameter: 357aa768e4cSTim Tautges . dm - The DMMoab object being set 358aa768e4cSTim Tautges 359aa768e4cSTim Tautges Output Parameter: 3605eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 3615eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 362aa768e4cSTim Tautges 363aa768e4cSTim Tautges Level: beginner 364aa768e4cSTim Tautges 365aa768e4cSTim Tautges .keywords: DMMoab, create 366aa768e4cSTim Tautges @*/ 367351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost) 3681d72bce8STim Tautges { 3691d72bce8STim Tautges PetscFunctionBegin; 3701d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 371351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 372351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3731d72bce8STim Tautges PetscFunctionReturn(0); 3741d72bce8STim Tautges } 3751d72bce8STim Tautges 3765eb88e9dSVijay Mahadevan /*@ 3775eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3785eb88e9dSVijay Mahadevan 3795eb88e9dSVijay Mahadevan Collective on MPI_Comm 3805eb88e9dSVijay Mahadevan 3815eb88e9dSVijay Mahadevan Input Parameter: 3825eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 3835eb88e9dSVijay Mahadevan 3845eb88e9dSVijay Mahadevan Output Parameter: 3855eb88e9dSVijay Mahadevan . range - The entities owned locally 3865eb88e9dSVijay Mahadevan 3875eb88e9dSVijay Mahadevan Level: beginner 3885eb88e9dSVijay Mahadevan 3895eb88e9dSVijay Mahadevan .keywords: DMMoab, create 3905eb88e9dSVijay Mahadevan @*/ 391351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range) 3925eb88e9dSVijay Mahadevan { 3935eb88e9dSVijay Mahadevan PetscFunctionBegin; 3945eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 395351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 3961cec0304SVijay Mahadevan PetscFunctionReturn(0); 3971cec0304SVijay Mahadevan } 3981cec0304SVijay Mahadevan 3991cec0304SVijay Mahadevan 4001cec0304SVijay Mahadevan /*@ 4011cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 4021cec0304SVijay Mahadevan 4031cec0304SVijay Mahadevan Collective on MPI_Comm 4041cec0304SVijay Mahadevan 4051cec0304SVijay Mahadevan Input Parameter: 4061cec0304SVijay Mahadevan . dm - The DMMoab object being set 4071cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 4081cec0304SVijay Mahadevan 4091cec0304SVijay Mahadevan Level: beginner 4101cec0304SVijay Mahadevan 4111cec0304SVijay Mahadevan .keywords: DMMoab, create 4121cec0304SVijay Mahadevan @*/ 4131cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 4141cec0304SVijay Mahadevan { 4151cec0304SVijay Mahadevan moab::ErrorCode merr; 4161cec0304SVijay Mahadevan PetscErrorCode ierr; 4171cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 4181cec0304SVijay Mahadevan 4191cec0304SVijay Mahadevan PetscFunctionBegin; 4201cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4211cec0304SVijay Mahadevan dmmoab->elocal->clear(); 4221cec0304SVijay Mahadevan dmmoab->eghost->clear(); 4231cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 4241cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 4251cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 4261cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 42741dd5348SVijay Mahadevan dmmoab->neleghost=dmmoab->eghost->size(); 428b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4298cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 4305eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 4315eb88e9dSVijay Mahadevan } 4325eb88e9dSVijay Mahadevan 4335eb88e9dSVijay Mahadevan 434aa768e4cSTim Tautges /*@ 435aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 436aa768e4cSTim Tautges 437aa768e4cSTim Tautges Collective on MPI_Comm 438aa768e4cSTim Tautges 439aa768e4cSTim Tautges Input Parameter: 440aa768e4cSTim Tautges . dm - The DMMoab object being set 441aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 442aa768e4cSTim Tautges 443aa768e4cSTim Tautges Level: beginner 444aa768e4cSTim Tautges 445aa768e4cSTim Tautges .keywords: DMMoab, create 446aa768e4cSTim Tautges @*/ 4471d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 4481d72bce8STim Tautges { 4491d72bce8STim Tautges PetscFunctionBegin; 4501d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4511d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4521d72bce8STim Tautges PetscFunctionReturn(0); 4531d72bce8STim Tautges } 4541d72bce8STim Tautges 4551d72bce8STim Tautges 456aa768e4cSTim Tautges /*@ 457aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 458aa768e4cSTim Tautges 459aa768e4cSTim Tautges Collective on MPI_Comm 460aa768e4cSTim Tautges 461aa768e4cSTim Tautges Input Parameter: 462aa768e4cSTim Tautges . dm - The DMMoab object being set 463aa768e4cSTim Tautges 464aa768e4cSTim Tautges Output Parameter: 465aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 466aa768e4cSTim Tautges 467aa768e4cSTim Tautges Level: beginner 468aa768e4cSTim Tautges 469aa768e4cSTim Tautges .keywords: DMMoab, create 470aa768e4cSTim Tautges @*/ 4711d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 4721d72bce8STim Tautges { 4731d72bce8STim Tautges PetscFunctionBegin; 4741d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4751d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4761d72bce8STim Tautges PetscFunctionReturn(0); 4771d72bce8STim Tautges } 4781d72bce8STim Tautges 4791d72bce8STim Tautges 480aa768e4cSTim Tautges /*@ 481aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 482aa768e4cSTim Tautges 483aa768e4cSTim Tautges Collective on MPI_Comm 484aa768e4cSTim Tautges 485aa768e4cSTim Tautges Input Parameter: 486aa768e4cSTim Tautges . dm - The DMMoab object being set 487aa768e4cSTim Tautges . bs - The block size used with this DMMoab 488aa768e4cSTim Tautges 489aa768e4cSTim Tautges Level: beginner 490aa768e4cSTim Tautges 491aa768e4cSTim Tautges .keywords: DMMoab, create 492aa768e4cSTim Tautges @*/ 4931d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 4941d72bce8STim Tautges { 4951d72bce8STim Tautges PetscFunctionBegin; 4961d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4971d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4981d72bce8STim Tautges PetscFunctionReturn(0); 4991d72bce8STim Tautges } 5001d72bce8STim Tautges 5011d72bce8STim Tautges 502aa768e4cSTim Tautges /*@ 503aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 504aa768e4cSTim Tautges 505aa768e4cSTim Tautges Collective on MPI_Comm 506aa768e4cSTim Tautges 507aa768e4cSTim Tautges Input Parameter: 508aa768e4cSTim Tautges . dm - The DMMoab object being set 509aa768e4cSTim Tautges 510aa768e4cSTim Tautges Output Parameter: 511aa768e4cSTim Tautges . bs - The block size used with this DMMoab 512aa768e4cSTim Tautges 513aa768e4cSTim Tautges Level: beginner 514aa768e4cSTim Tautges 515aa768e4cSTim Tautges .keywords: DMMoab, create 516aa768e4cSTim Tautges @*/ 5171d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 5181d72bce8STim Tautges { 5191d72bce8STim Tautges PetscFunctionBegin; 5201d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5211d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 5221d72bce8STim Tautges PetscFunctionReturn(0); 5231d72bce8STim Tautges } 5241d72bce8STim Tautges 5251cec0304SVijay Mahadevan 526212ad6d1SVijay Mahadevan /*@ 527212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 528212ad6d1SVijay Mahadevan 52900cc10feSVijay Mahadevan Collective on DM 530212ad6d1SVijay Mahadevan 531212ad6d1SVijay Mahadevan Input Parameter: 532212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 533212ad6d1SVijay Mahadevan 534212ad6d1SVijay Mahadevan Output Parameter: 53500cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance 53600cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance 537212ad6d1SVijay Mahadevan 538212ad6d1SVijay Mahadevan Level: beginner 539212ad6d1SVijay Mahadevan 540212ad6d1SVijay Mahadevan .keywords: DMMoab, create 541212ad6d1SVijay Mahadevan @*/ 54241dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg) 543212ad6d1SVijay Mahadevan { 544212ad6d1SVijay Mahadevan PetscFunctionBegin; 545212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 54641dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->nele; 54741dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->n; 548212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 549212ad6d1SVijay Mahadevan } 550212ad6d1SVijay Mahadevan 551212ad6d1SVijay Mahadevan 552212ad6d1SVijay Mahadevan /*@ 553212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 554212ad6d1SVijay Mahadevan 55500cc10feSVijay Mahadevan Collective on DM 556212ad6d1SVijay Mahadevan 557212ad6d1SVijay Mahadevan Input Parameter: 558212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 559212ad6d1SVijay Mahadevan 560212ad6d1SVijay Mahadevan Output Parameter: 561b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor 56200cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 56300cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 56400cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor 565212ad6d1SVijay Mahadevan 566212ad6d1SVijay Mahadevan Level: beginner 567212ad6d1SVijay Mahadevan 568212ad6d1SVijay Mahadevan .keywords: DMMoab, create 569212ad6d1SVijay Mahadevan @*/ 57041dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg) 571212ad6d1SVijay Mahadevan { 572212ad6d1SVijay Mahadevan PetscFunctionBegin; 573212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 57441dd5348SVijay Mahadevan if(nel) *nel = ((DM_Moab*)dm->data)->neleloc; 57541dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->neleghost; 57641dd5348SVijay Mahadevan if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 57741dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 578212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 579212ad6d1SVijay Mahadevan } 580212ad6d1SVijay Mahadevan 581212ad6d1SVijay Mahadevan 58200cc10feSVijay Mahadevan /*@ 58300cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 58400cc10feSVijay Mahadevan 58500cc10feSVijay Mahadevan Collective on MPI_Comm 58600cc10feSVijay Mahadevan 58700cc10feSVijay Mahadevan Input Parameter: 58800cc10feSVijay Mahadevan . dm - The DMMoab object being set 58900cc10feSVijay Mahadevan 59000cc10feSVijay Mahadevan Output Parameter: 59100cc10feSVijay Mahadevan . offset - The local offset for the global vector 59200cc10feSVijay Mahadevan 59300cc10feSVijay Mahadevan Level: beginner 59400cc10feSVijay Mahadevan 59500cc10feSVijay Mahadevan .keywords: DMMoab, create 59600cc10feSVijay Mahadevan @*/ 59700cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset) 59800cc10feSVijay Mahadevan { 59900cc10feSVijay Mahadevan PetscFunctionBegin; 60000cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 60100cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 60200cc10feSVijay Mahadevan PetscFunctionReturn(0); 60300cc10feSVijay Mahadevan } 60400cc10feSVijay Mahadevan 60500cc10feSVijay Mahadevan 6064920ab11SVijay Mahadevan /*@ 6074920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 6084920ab11SVijay Mahadevan 6094920ab11SVijay Mahadevan Collective on MPI_Comm 6104920ab11SVijay Mahadevan 6114920ab11SVijay Mahadevan Input Parameter: 612340f3b9aSVijay Mahadevan . dm - The DMMoab object 6134920ab11SVijay Mahadevan 6144920ab11SVijay Mahadevan Output Parameter: 6154920ab11SVijay Mahadevan . dim - The dimension of DM 6164920ab11SVijay Mahadevan 6174920ab11SVijay Mahadevan Level: beginner 6184920ab11SVijay Mahadevan 6194920ab11SVijay Mahadevan .keywords: DMMoab, create 6204920ab11SVijay Mahadevan @*/ 6214920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 6224920ab11SVijay Mahadevan { 6234920ab11SVijay Mahadevan PetscFunctionBegin; 6244920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6254920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 6264920ab11SVijay Mahadevan PetscFunctionReturn(0); 6274920ab11SVijay Mahadevan } 6284920ab11SVijay Mahadevan 6294920ab11SVijay Mahadevan 630755f3dfbSVijay Mahadevan #undef __FUNCT__ 631755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetHierarchyLevel" 632755f3dfbSVijay Mahadevan /*@ 633755f3dfbSVijay Mahadevan DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy 634755f3dfbSVijay Mahadevan generated through uniform refinement. 635755f3dfbSVijay Mahadevan 636755f3dfbSVijay Mahadevan Collective on DM 637755f3dfbSVijay Mahadevan 638755f3dfbSVijay Mahadevan Input Parameter: 639755f3dfbSVijay Mahadevan . dm - The DMMoab object being set 640755f3dfbSVijay Mahadevan 641755f3dfbSVijay Mahadevan Output Parameter: 642755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level 643755f3dfbSVijay Mahadevan 644755f3dfbSVijay Mahadevan Level: beginner 645755f3dfbSVijay Mahadevan 646755f3dfbSVijay Mahadevan .keywords: DMMoab, multigrid 647755f3dfbSVijay Mahadevan @*/ 648755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm,PetscInt *nlevel) 649755f3dfbSVijay Mahadevan { 650755f3dfbSVijay Mahadevan PetscFunctionBegin; 651755f3dfbSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 652755f3dfbSVijay Mahadevan if(nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel; 653755f3dfbSVijay Mahadevan PetscFunctionReturn(0); 654755f3dfbSVijay Mahadevan } 655755f3dfbSVijay Mahadevan 656755f3dfbSVijay Mahadevan 657755f3dfbSVijay Mahadevan #undef __FUNCT__ 658755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetMaterialBlock" 659340f3b9aSVijay Mahadevan /*@ 660340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 661340f3b9aSVijay Mahadevan 662340f3b9aSVijay Mahadevan Collective on MPI_Comm 663340f3b9aSVijay Mahadevan 664340f3b9aSVijay Mahadevan Input Parameter: 665340f3b9aSVijay Mahadevan . dm - The DMMoab object 666340f3b9aSVijay Mahadevan . ehandle - The element entity handle 667340f3b9aSVijay Mahadevan 668340f3b9aSVijay Mahadevan Output Parameter: 669340f3b9aSVijay Mahadevan . mat - The material ID for the current entity 670340f3b9aSVijay Mahadevan 671340f3b9aSVijay Mahadevan Level: beginner 672340f3b9aSVijay Mahadevan 673340f3b9aSVijay Mahadevan .keywords: DMMoab, create 674340f3b9aSVijay Mahadevan @*/ 675340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat) 676340f3b9aSVijay Mahadevan { 677340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 678340f3b9aSVijay Mahadevan moab::ErrorCode merr; 679340f3b9aSVijay Mahadevan 680340f3b9aSVijay Mahadevan PetscFunctionBegin; 681340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 682340f3b9aSVijay Mahadevan if (*mat) { 683340f3b9aSVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 68463cd93b2SVijay Mahadevan merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr); 685340f3b9aSVijay Mahadevan } 686340f3b9aSVijay Mahadevan PetscFunctionReturn(0); 687340f3b9aSVijay Mahadevan } 688340f3b9aSVijay Mahadevan 6894920ab11SVijay Mahadevan 69085d305f5SVijay Mahadevan /*@ 69185d305f5SVijay Mahadevan DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities 69285d305f5SVijay Mahadevan 69385d305f5SVijay Mahadevan Collective on MPI_Comm 69485d305f5SVijay Mahadevan 69585d305f5SVijay Mahadevan Input Parameter: 69685d305f5SVijay Mahadevan . dm - The DMMoab object 69785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 69885d305f5SVijay Mahadevan . conn - The vertex entity handles 69985d305f5SVijay Mahadevan 70085d305f5SVijay Mahadevan Output Parameter: 70185d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities 70285d305f5SVijay Mahadevan 70385d305f5SVijay Mahadevan Level: beginner 70485d305f5SVijay Mahadevan 70585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity() 70685d305f5SVijay Mahadevan @*/ 707cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscReal *vpos) 7087023aa44SVijay Mahadevan { 7097023aa44SVijay Mahadevan DM_Moab *dmmoab; 7107023aa44SVijay Mahadevan PetscErrorCode ierr; 7117023aa44SVijay Mahadevan moab::ErrorCode merr; 7127023aa44SVijay Mahadevan 7137023aa44SVijay Mahadevan PetscFunctionBegin; 7147023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7157023aa44SVijay Mahadevan PetscValidPointer(conn,3); 7167023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7177023aa44SVijay Mahadevan 7187023aa44SVijay Mahadevan if (!vpos) { 7197ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr); 7207023aa44SVijay Mahadevan } 7217023aa44SVijay Mahadevan 7227023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7237023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 7247023aa44SVijay Mahadevan PetscFunctionReturn(0); 7257023aa44SVijay Mahadevan } 7267023aa44SVijay Mahadevan 7277023aa44SVijay Mahadevan 72885d305f5SVijay Mahadevan /*@ 72985d305f5SVijay Mahadevan DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity 73085d305f5SVijay Mahadevan 73185d305f5SVijay Mahadevan Collective on MPI_Comm 73285d305f5SVijay Mahadevan 73385d305f5SVijay Mahadevan Input Parameter: 73485d305f5SVijay Mahadevan . dm - The DMMoab object 73585d305f5SVijay Mahadevan . vhandle - Vertex entity handle 73685d305f5SVijay Mahadevan 73785d305f5SVijay Mahadevan Output Parameter: 73885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 73985d305f5SVijay Mahadevan . conn - The vertex entity handles 74085d305f5SVijay Mahadevan 74185d305f5SVijay Mahadevan Level: beginner 74285d305f5SVijay Mahadevan 74385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity() 74485d305f5SVijay Mahadevan @*/ 74585d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt* nconn, moab::EntityHandle **conn) 7468d8d51c8SVijay Mahadevan { 7478d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 7488d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 7498d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7508d8d51c8SVijay Mahadevan moab::ErrorCode merr; 7518d8d51c8SVijay Mahadevan 7528d8d51c8SVijay Mahadevan PetscFunctionBegin; 7538d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7548d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 7558d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7568d8d51c8SVijay Mahadevan 7578d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 75885d305f5SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 7598d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 7608d8d51c8SVijay Mahadevan 7618d8d51c8SVijay Mahadevan if (conn) { 7628d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 7638d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 7648d8d51c8SVijay Mahadevan } 7658d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 7668d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7678d8d51c8SVijay Mahadevan } 7688d8d51c8SVijay Mahadevan 7698d8d51c8SVijay Mahadevan 77085d305f5SVijay Mahadevan /*@ 77185d305f5SVijay Mahadevan DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity 77285d305f5SVijay Mahadevan 77385d305f5SVijay Mahadevan Collective on MPI_Comm 77485d305f5SVijay Mahadevan 77585d305f5SVijay Mahadevan Input Parameter: 77685d305f5SVijay Mahadevan . dm - The DMMoab object 77785d305f5SVijay Mahadevan . vhandle - Vertex entity handle 77885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 77985d305f5SVijay Mahadevan . conn - The vertex entity handles 78085d305f5SVijay Mahadevan 78185d305f5SVijay Mahadevan Level: beginner 78285d305f5SVijay Mahadevan 78385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity() 78485d305f5SVijay Mahadevan @*/ 7858d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 7868d8d51c8SVijay Mahadevan { 7878d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7888d8d51c8SVijay Mahadevan 7898d8d51c8SVijay Mahadevan PetscFunctionBegin; 7908d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7918d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 7928d8d51c8SVijay Mahadevan 7938d8d51c8SVijay Mahadevan if (conn) { 7948d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 7958d8d51c8SVijay Mahadevan } 7968d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 7978d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7988d8d51c8SVijay Mahadevan } 7998d8d51c8SVijay Mahadevan 8008d8d51c8SVijay Mahadevan 80185d305f5SVijay Mahadevan /*@ 80285d305f5SVijay Mahadevan DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity 80385d305f5SVijay Mahadevan 80485d305f5SVijay Mahadevan Collective on MPI_Comm 80585d305f5SVijay Mahadevan 80685d305f5SVijay Mahadevan Input Parameter: 80785d305f5SVijay Mahadevan . dm - The DMMoab object 80885d305f5SVijay Mahadevan . ehandle - Vertex entity handle 80985d305f5SVijay Mahadevan 81085d305f5SVijay Mahadevan Output Parameter: 81185d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 81285d305f5SVijay Mahadevan . conn - The vertex entity handles 81385d305f5SVijay Mahadevan 81485d305f5SVijay Mahadevan Level: beginner 81585d305f5SVijay Mahadevan 81685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity() 81785d305f5SVijay Mahadevan @*/ 8187023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 8197023aa44SVijay Mahadevan { 8207023aa44SVijay Mahadevan DM_Moab *dmmoab; 8217023aa44SVijay Mahadevan const moab::EntityHandle *connect; 8227023aa44SVijay Mahadevan moab::ErrorCode merr; 8237023aa44SVijay Mahadevan PetscInt nnodes; 8247023aa44SVijay Mahadevan 8257023aa44SVijay Mahadevan PetscFunctionBegin; 8267023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8277023aa44SVijay Mahadevan PetscValidPointer(conn,4); 8287023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8297023aa44SVijay Mahadevan 8307023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 8317023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 8327023aa44SVijay Mahadevan if (conn) *conn=connect; 8337023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 8347023aa44SVijay Mahadevan PetscFunctionReturn(0); 8357023aa44SVijay Mahadevan } 8367023aa44SVijay Mahadevan 8377023aa44SVijay Mahadevan 83885d305f5SVijay Mahadevan /*@ 83985d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 84085d305f5SVijay Mahadevan 84185d305f5SVijay Mahadevan Collective on MPI_Comm 84285d305f5SVijay Mahadevan 84385d305f5SVijay Mahadevan Input Parameter: 84485d305f5SVijay Mahadevan . dm - The DMMoab object 84585d305f5SVijay Mahadevan . ent - Entity handle 84685d305f5SVijay Mahadevan 84785d305f5SVijay Mahadevan Output Parameter: 84885d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 84985d305f5SVijay Mahadevan 85085d305f5SVijay Mahadevan Level: beginner 85185d305f5SVijay Mahadevan 85285d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices() 85385d305f5SVijay Mahadevan @*/ 85469263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 85569263071SVijay Mahadevan { 85669263071SVijay Mahadevan moab::EntityType etype; 85769263071SVijay Mahadevan DM_Moab *dmmoab; 85869263071SVijay Mahadevan PetscInt edim; 85969263071SVijay Mahadevan 86069263071SVijay Mahadevan PetscFunctionBegin; 86169263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 86269263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 86369263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 86469263071SVijay Mahadevan 86569263071SVijay Mahadevan /* get the entity type and handle accordingly */ 86669263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 86769263071SVijay 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); 86869263071SVijay Mahadevan 86969263071SVijay Mahadevan /* get the entity dimension */ 87069263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 87169263071SVijay Mahadevan 87269263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 87369263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 87449d66b22SVijay Mahadevan *ent_on_boundary=((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE:PETSC_FALSE); 87569263071SVijay Mahadevan } 87669263071SVijay Mahadevan else { 87769263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 8786d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 87969263071SVijay Mahadevan } 88069263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 8816d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 88269263071SVijay Mahadevan } 88369263071SVijay Mahadevan } 88469263071SVijay Mahadevan PetscFunctionReturn(0); 88569263071SVijay Mahadevan } 88669263071SVijay Mahadevan 88769263071SVijay Mahadevan 88885d305f5SVijay Mahadevan /*@ 88985d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 89085d305f5SVijay Mahadevan 89185d305f5SVijay Mahadevan Input Parameter: 89285d305f5SVijay Mahadevan . dm - The DMMoab object 89385d305f5SVijay Mahadevan . nconn - Number of handles 89485d305f5SVijay Mahadevan . cnt - Array of entity handles 89585d305f5SVijay Mahadevan 89685d305f5SVijay Mahadevan Output Parameter: 89785d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 89885d305f5SVijay Mahadevan 89985d305f5SVijay Mahadevan Level: beginner 90085d305f5SVijay Mahadevan 90185d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary() 90285d305f5SVijay Mahadevan @*/ 90369263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 9047023aa44SVijay Mahadevan { 9057023aa44SVijay Mahadevan DM_Moab *dmmoab; 9067023aa44SVijay Mahadevan PetscInt i; 9077023aa44SVijay Mahadevan 9087023aa44SVijay Mahadevan PetscFunctionBegin; 9097023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9107023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 9117023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 9127023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9137023aa44SVijay Mahadevan 9147023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 9156d9eb265SVijay Mahadevan isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE); 9167023aa44SVijay Mahadevan } 9177023aa44SVijay Mahadevan PetscFunctionReturn(0); 9187023aa44SVijay Mahadevan } 9197023aa44SVijay Mahadevan 9207023aa44SVijay Mahadevan 92185d305f5SVijay Mahadevan /*@ 92285d305f5SVijay Mahadevan DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary 92385d305f5SVijay Mahadevan 92485d305f5SVijay Mahadevan Input Parameter: 92585d305f5SVijay Mahadevan . dm - The DMMoab object 92685d305f5SVijay Mahadevan 92785d305f5SVijay Mahadevan Output Parameter: 92885d305f5SVijay Mahadevan . bdvtx - Boundary vertices 92985d305f5SVijay Mahadevan . bdelems - Boundary elements 93085d305f5SVijay Mahadevan . bdfaces - Boundary faces 93185d305f5SVijay Mahadevan 93285d305f5SVijay Mahadevan Level: beginner 93385d305f5SVijay Mahadevan 93485d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary() 93585d305f5SVijay Mahadevan @*/ 9366d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces) 9371cec0304SVijay Mahadevan { 9381cec0304SVijay Mahadevan DM_Moab *dmmoab; 9391cec0304SVijay Mahadevan 9401cec0304SVijay Mahadevan PetscFunctionBegin; 9411cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9421cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9431cec0304SVijay Mahadevan 9446d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 9456d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 9466d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 9471cec0304SVijay Mahadevan PetscFunctionReturn(0); 9481cec0304SVijay Mahadevan } 9491cec0304SVijay Mahadevan 950f6829af0SVijay Mahadevan 951f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 952f6829af0SVijay Mahadevan { 953f6829af0SVijay Mahadevan PetscErrorCode ierr; 95485d305f5SVijay Mahadevan PetscInt i; 955e882eb38SVijay Mahadevan moab::ErrorCode merr; 956f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 957f6829af0SVijay Mahadevan 958f6829af0SVijay Mahadevan PetscFunctionBegin; 959f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 960*304006b3SVijay Mahadevan 961*304006b3SVijay Mahadevan dmmoab->refct--; 962*304006b3SVijay Mahadevan if (!dmmoab->refct) { 963f6829af0SVijay Mahadevan delete dmmoab->vlocal; 964f6829af0SVijay Mahadevan delete dmmoab->vowned; 965f6829af0SVijay Mahadevan delete dmmoab->vghost; 966f6829af0SVijay Mahadevan delete dmmoab->elocal; 967f6829af0SVijay Mahadevan delete dmmoab->eghost; 968f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 969f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 970f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 971f6829af0SVijay Mahadevan 972f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 9737ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr); 9745905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr); 9755905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr); 97685d305f5SVijay Mahadevan if (dmmoab->fieldNames) { 97785d305f5SVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 97885d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 97985d305f5SVijay Mahadevan } 98085d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 98185d305f5SVijay Mahadevan } 982b117cd09SVijay Mahadevan 983b117cd09SVijay Mahadevan if (dmmoab->nhlevels) { 984b117cd09SVijay Mahadevan ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr); 985e882eb38SVijay Mahadevan dmmoab->nhlevels=0; 986e882eb38SVijay Mahadevan if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy; 987e882eb38SVijay Mahadevan dmmoab->hierarchy=NULL; 988b117cd09SVijay Mahadevan } 989e882eb38SVijay Mahadevan 990e882eb38SVijay Mahadevan if (dmmoab->icreatedinstance) { 991e882eb38SVijay Mahadevan merr = dmmoab->mbiface->delete_mesh();MBERRNM(merr); 992e882eb38SVijay Mahadevan delete dmmoab->mbiface; 993e882eb38SVijay Mahadevan } 994e882eb38SVijay Mahadevan dmmoab->mbiface = NULL; 995e882eb38SVijay Mahadevan dmmoab->pcomm = NULL; 996e882eb38SVijay Mahadevan 997f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 998f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 999f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 1000*304006b3SVijay Mahadevan } 1001f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1002f6829af0SVijay Mahadevan } 1003f6829af0SVijay Mahadevan 1004f6829af0SVijay Mahadevan 10054416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject,DM dm) 10062e4e7c01SVijay Mahadevan { 10072e4e7c01SVijay Mahadevan PetscErrorCode ierr; 10082e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 10092e4e7c01SVijay Mahadevan 10102e4e7c01SVijay Mahadevan PetscFunctionBegin; 10112e4e7c01SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1012cc310fddSBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr); 10132e4e7c01SVijay 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); 10142e4e7c01SVijay 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); 10152e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 10162e4e7c01SVijay 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); 10172e4e7c01SVijay 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); 10182e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr); 10192e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr); 10202e4e7c01SVijay Mahadevan PetscFunctionReturn(0); 10212e4e7c01SVijay Mahadevan } 10222e4e7c01SVijay Mahadevan 10232e4e7c01SVijay Mahadevan 1024f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 1025f6829af0SVijay Mahadevan { 1026f6829af0SVijay Mahadevan PetscErrorCode ierr; 1027f6829af0SVijay Mahadevan moab::ErrorCode merr; 1028f6829af0SVijay Mahadevan Vec local, global; 1029f6829af0SVijay Mahadevan IS from,to; 1030f6829af0SVijay Mahadevan moab::Range::iterator iter; 1031*304006b3SVijay Mahadevan PetscInt i,j,f,bs,vent,totsize,*lgmap; 1032f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 1033f6829af0SVijay Mahadevan moab::Range adjs; 1034f6829af0SVijay Mahadevan 1035f6829af0SVijay Mahadevan PetscFunctionBegin; 1036f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1037f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 1038c528d872SBarry Smith if (dmmoab->mbiface == NULL || dmmoab->pcomm == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp."); 1039f6829af0SVijay Mahadevan 1040f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 1041f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 1042f6829af0SVijay Mahadevan { 104349d66b22SVijay Mahadevan //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 104449d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false);MBERRNM(merr); 1045f6829af0SVijay Mahadevan 1046f6829af0SVijay Mahadevan /* filter based on parallel status */ 1047f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 1048f6829af0SVijay Mahadevan 1049f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1050f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 105164e1c140SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_GHOST|PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 1052f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 1053f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 1054f6829af0SVijay Mahadevan 1055f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 1056f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 1057f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 105849d66b22SVijay Mahadevan 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); 1061f6829af0SVijay Mahadevan } 1062f6829af0SVijay Mahadevan 1063f6829af0SVijay Mahadevan { 1064f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 1065f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 1066f6829af0SVijay Mahadevan 1067f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 1068f6829af0SVijay Mahadevan for (i=3;i>0;i--) { 1069f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 107049d66b22SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false);MBERRNM(merr); 1071f6829af0SVijay Mahadevan 1072f6829af0SVijay Mahadevan /* store the current mesh dimension */ 1073f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 1074f6829af0SVijay Mahadevan dmmoab->dim=i; 1075f6829af0SVijay Mahadevan break; 1076f6829af0SVijay Mahadevan } 1077f6829af0SVijay Mahadevan } 1078f6829af0SVijay Mahadevan 1079b117cd09SVijay Mahadevan ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr); 1080b117cd09SVijay Mahadevan 1081f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 1082f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 1083f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1084f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 1085f6829af0SVijay Mahadevan 1086f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 1087f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 108849d66b22SVijay Mahadevan 1089b2566f29SBarry Smith ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 109049d66b22SVijay Mahadevan PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost); 1091f6829af0SVijay Mahadevan } 1092f6829af0SVijay Mahadevan 1093f6829af0SVijay Mahadevan bs = dmmoab->bs; 1094f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 1095f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 1096f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 1097f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 1098f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1099f6829af0SVijay Mahadevan } 1100f6829af0SVijay Mahadevan 1101f6829af0SVijay Mahadevan totsize=dmmoab->vlocal->size(); 110249d66b22SVijay 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); 110349d66b22SVijay Mahadevan ierr = PetscCalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr); 1104f6829af0SVijay Mahadevan { 1105f6829af0SVijay Mahadevan /* first get the local indices */ 1106f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 11073f1c6e43SVijay Mahadevan if (dmmoab->nghost) { /* next get the ghosted indices */ 1108f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1109f6829af0SVijay Mahadevan } 1110f6829af0SVijay Mahadevan 1111f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1112*304006b3SVijay Mahadevan dmmoab->lminmax[0]=dmmoab->lminmax[1]=dmmoab->gsindices[0]; 1113f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1114*304006b3SVijay Mahadevan if(dmmoab->lminmax[0]>dmmoab->gsindices[i]) dmmoab->lminmax[0]=dmmoab->gsindices[i]; 1115*304006b3SVijay Mahadevan if(dmmoab->lminmax[1]<dmmoab->gsindices[i]) dmmoab->lminmax[1]=dmmoab->gsindices[i]; 1116f6829af0SVijay Mahadevan } 1117f6829af0SVijay Mahadevan 1118*304006b3SVijay Mahadevan ierr = MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1119*304006b3SVijay Mahadevan ierr = MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1120f6829af0SVijay Mahadevan 1121f6829af0SVijay Mahadevan /* set the GID map */ 1122f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1123*304006b3SVijay Mahadevan dmmoab->gsindices[i]-=dmmoab->gminmax[0]; /* zero based index needed for IS */ 1124f6829af0SVijay Mahadevan } 1125*304006b3SVijay Mahadevan dmmoab->lminmax[0]-=dmmoab->gminmax[0]; 1126*304006b3SVijay Mahadevan dmmoab->lminmax[1]-=dmmoab->gminmax[0]; 1127f6829af0SVijay Mahadevan 1128*304006b3SVijay 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]); 1129f6829af0SVijay Mahadevan } 113082dfd14aSVijay 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); 1131f6829af0SVijay Mahadevan 1132f6829af0SVijay Mahadevan { 11333f1c6e43SVijay Mahadevan dmmoab->seqstart=((PetscInt)dmmoab->vlocal->front()); 11343f1c6e43SVijay Mahadevan dmmoab->seqend=((PetscInt)dmmoab->vlocal->back()); 1135*304006b3SVijay Mahadevan PetscInfo2(NULL, "SEQUENCE: Local [min, max] - [%D, %D]\n", dmmoab->seqstart, dmmoab->seqend); 11363f1c6e43SVijay Mahadevan 113749d66b22SVijay Mahadevan ierr = PetscMalloc2(dmmoab->seqend-dmmoab->seqstart+1,&dmmoab->gidmap,dmmoab->seqend-dmmoab->seqstart+1,&dmmoab->lidmap);CHKERRQ(ierr); 11383f1c6e43SVijay Mahadevan ierr = PetscMalloc1(totsize*dmmoab->numFields,&lgmap);CHKERRQ(ierr); 1139f6829af0SVijay Mahadevan 1140f6829af0SVijay Mahadevan i=j=0; 1141f6829af0SVijay Mahadevan /* set the owned vertex data first */ 1142f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 11433f1c6e43SVijay Mahadevan vent=(PetscInt)(*iter)-dmmoab->seqstart; 1144f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1145f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1146f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 11473f1c6e43SVijay Mahadevan lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]); 1148f6829af0SVijay Mahadevan } 1149f6829af0SVijay Mahadevan } 1150f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1151f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->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 1160f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1161f6829af0SVijay Mahadevan 1) First create a local and global vector 1162f6829af0SVijay Mahadevan 2) Create a local and global IS 1163f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1164f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1165f6829af0SVijay Mahadevan */ 1166f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 1167f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 1168f6829af0SVijay Mahadevan 1169f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 1170f6829af0SVijay Mahadevan 1171f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 1172f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr); 1173f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr); 1174f6829af0SVijay Mahadevan 11753f1c6e43SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 1176f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr); 1177f6829af0SVijay Mahadevan 1178f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1179f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 11803f1c6e43SVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,lgmap, 1181f6829af0SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 1182f6829af0SVijay Mahadevan } 1183f6829af0SVijay Mahadevan 1184f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 1185f6829af0SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 1186f6829af0SVijay Mahadevan 1187f6829af0SVijay Mahadevan /* clean up IS, Vec */ 11883f1c6e43SVijay Mahadevan ierr = PetscFree(lgmap);CHKERRQ(ierr); 1189f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 1190f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 1191f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 1192f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 1193f6829af0SVijay Mahadevan } 1194f6829af0SVijay Mahadevan 119549d66b22SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 119649d66b22SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 119749d66b22SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1198f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 1199f6829af0SVijay Mahadevan { 1200f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1201f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1202f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1203f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1204f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1205f6829af0SVijay Mahadevan 1206f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 1207f6829af0SVijay 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 1208f6829af0SVijay Mahadevan 1209f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1210f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1211f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 1212f6829af0SVijay Mahadevan 1213f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1214f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 1215755f3dfbSVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 1216f6829af0SVijay Mahadevan } 121749d66b22SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size()); 1218f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1219f6829af0SVijay Mahadevan } 1220f6829af0SVijay Mahadevan 1221*304006b3SVijay Mahadevan 1222*304006b3SVijay Mahadevan #undef __FUNCT__ 1223*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateVertices" 1224*304006b3SVijay Mahadevan /*@ 1225*304006b3SVijay Mahadevan DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM. 1226*304006b3SVijay Mahadevan 1227*304006b3SVijay Mahadevan Collective on MPI_Comm 1228*304006b3SVijay Mahadevan 1229*304006b3SVijay Mahadevan Input Parameters: 1230*304006b3SVijay Mahadevan + dm - The DM object 1231*304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra) 1232*304006b3SVijay Mahadevan . conn - The connectivity of the element 1233*304006b3SVijay Mahadevan . nverts - The number of vertices that form the element 1234*304006b3SVijay Mahadevan 1235*304006b3SVijay Mahadevan Output Parameter: 1236*304006b3SVijay Mahadevan . overts - The list of vertices that were created (can be NULL) 1237*304006b3SVijay Mahadevan 1238*304006b3SVijay Mahadevan Level: beginner 1239*304006b3SVijay Mahadevan 1240*304006b3SVijay Mahadevan .keywords: DM, create vertices 1241*304006b3SVijay Mahadevan 1242*304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateElement() 1243*304006b3SVijay Mahadevan @*/ 1244*304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal* coords, PetscInt nverts, moab::Range* overts) 1245*304006b3SVijay Mahadevan { 1246*304006b3SVijay Mahadevan moab::ErrorCode merr; 1247*304006b3SVijay Mahadevan DM_Moab *dmmoab; 1248*304006b3SVijay Mahadevan moab::Range verts; 1249*304006b3SVijay Mahadevan 1250*304006b3SVijay Mahadevan PetscFunctionBegin; 1251*304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1252*304006b3SVijay Mahadevan PetscValidPointer(coords,2); 1253*304006b3SVijay Mahadevan 1254*304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1255*304006b3SVijay Mahadevan 1256*304006b3SVijay Mahadevan /* Insert new points */ 1257*304006b3SVijay Mahadevan merr = dmmoab->mbiface->create_vertices(&coords[0],nverts,verts);MBERRNM(merr); 1258*304006b3SVijay Mahadevan merr = dmmoab->mbiface->add_entities(dmmoab->fileset,verts);MBERRNM(merr); 1259*304006b3SVijay Mahadevan 1260*304006b3SVijay Mahadevan if (overts) *overts=verts; 1261*304006b3SVijay Mahadevan PetscFunctionReturn(0); 1262*304006b3SVijay Mahadevan } 1263*304006b3SVijay Mahadevan 1264*304006b3SVijay Mahadevan 1265*304006b3SVijay Mahadevan #undef __FUNCT__ 1266*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateElement" 1267*304006b3SVijay Mahadevan /*@ 1268*304006b3SVijay Mahadevan DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM. 1269*304006b3SVijay Mahadevan 1270*304006b3SVijay Mahadevan Collective on MPI_Comm 1271*304006b3SVijay Mahadevan 1272*304006b3SVijay Mahadevan Input Parameters: 1273*304006b3SVijay Mahadevan + dm - The DM object 1274*304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra) 1275*304006b3SVijay Mahadevan . conn - The connectivity of the element 1276*304006b3SVijay Mahadevan . nverts - The number of vertices that form the element 1277*304006b3SVijay Mahadevan 1278*304006b3SVijay Mahadevan Output Parameter: 1279*304006b3SVijay Mahadevan . oelem - The handle to the element created and added to the DM object 1280*304006b3SVijay Mahadevan 1281*304006b3SVijay Mahadevan Level: beginner 1282*304006b3SVijay Mahadevan 1283*304006b3SVijay Mahadevan .keywords: DM, create element 1284*304006b3SVijay Mahadevan 1285*304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateVertices() 1286*304006b3SVijay Mahadevan @*/ 1287*304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle* conn, PetscInt nverts, moab::EntityHandle* oelem) 1288*304006b3SVijay Mahadevan { 1289*304006b3SVijay Mahadevan moab::ErrorCode merr; 1290*304006b3SVijay Mahadevan DM_Moab *dmmoab; 1291*304006b3SVijay Mahadevan moab::EntityHandle elem; 1292*304006b3SVijay Mahadevan 1293*304006b3SVijay Mahadevan PetscFunctionBegin; 1294*304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1295*304006b3SVijay Mahadevan PetscValidPointer(conn,3); 1296*304006b3SVijay Mahadevan 1297*304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1298*304006b3SVijay Mahadevan 1299*304006b3SVijay Mahadevan /* Insert new element */ 1300*304006b3SVijay Mahadevan merr = dmmoab->mbiface->create_element(type,conn,nverts,elem);MBERRNM(merr); 1301*304006b3SVijay Mahadevan merr = dmmoab->mbiface->add_entities(dmmoab->fileset,&elem,1);MBERRNM(merr); 1302*304006b3SVijay Mahadevan 1303*304006b3SVijay Mahadevan if (oelem) *oelem = elem; 1304*304006b3SVijay Mahadevan PetscFunctionReturn(0); 1305*304006b3SVijay Mahadevan } 1306*304006b3SVijay Mahadevan 1307*304006b3SVijay Mahadevan 1308*304006b3SVijay Mahadevan #undef __FUNCT__ 1309*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateSubmesh" 1310*304006b3SVijay Mahadevan /*@ 1311*304006b3SVijay Mahadevan DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent 1312*304006b3SVijay Mahadevan in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to 1313*304006b3SVijay Mahadevan create a DM object on a refined level. 1314*304006b3SVijay Mahadevan 1315*304006b3SVijay Mahadevan Collective on MPI_Comm 1316*304006b3SVijay Mahadevan 1317*304006b3SVijay Mahadevan Input Parameters: 1318*304006b3SVijay Mahadevan + dm - The DM object 1319*304006b3SVijay Mahadevan 1320*304006b3SVijay Mahadevan Output Parameter: 1321*304006b3SVijay Mahadevan . newdm - The sub DM object with updated set information 1322*304006b3SVijay Mahadevan 1323*304006b3SVijay Mahadevan Level: advanced 1324*304006b3SVijay Mahadevan 1325*304006b3SVijay Mahadevan .keywords: DM, sub-DM 1326*304006b3SVijay Mahadevan 1327*304006b3SVijay Mahadevan .seealso: DMCreate(), DMMoabCreateVertices(), DMMoabCreateElement() 1328*304006b3SVijay Mahadevan @*/ 1329*304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm) 1330*304006b3SVijay Mahadevan { 1331*304006b3SVijay Mahadevan DM_Moab *dmmoab; 1332*304006b3SVijay Mahadevan DM_Moab *ndmmoab; 1333*304006b3SVijay Mahadevan moab::ErrorCode merr; 1334*304006b3SVijay Mahadevan PetscErrorCode ierr; 1335*304006b3SVijay Mahadevan 1336*304006b3SVijay Mahadevan PetscFunctionBegin; 1337*304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1338*304006b3SVijay Mahadevan 1339*304006b3SVijay Mahadevan dmmoab = (DM_Moab*) dm->data; 1340*304006b3SVijay Mahadevan 1341*304006b3SVijay Mahadevan /* Create the basic DMMoab object and keep the default parameters created by DM impls */ 1342*304006b3SVijay Mahadevan ierr = DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, dmmoab->pcomm, &dmmoab->ltog_tag, PETSC_NULL, newdm);CHKERRQ(ierr); 1343*304006b3SVijay Mahadevan 1344*304006b3SVijay Mahadevan /* get all the necessary handles from the private DM object */ 1345*304006b3SVijay Mahadevan ndmmoab = (DM_Moab*) (*newdm)->data; 1346*304006b3SVijay Mahadevan 1347*304006b3SVijay Mahadevan /* set the sub-mesh's parent DM reference */ 1348*304006b3SVijay Mahadevan ndmmoab->parent = &dm; 1349*304006b3SVijay Mahadevan 1350*304006b3SVijay Mahadevan /* create a file set to associate all entities in current mesh */ 1351*304006b3SVijay Mahadevan merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset);MBERR("Creating file set failed", merr); 1352*304006b3SVijay Mahadevan 1353*304006b3SVijay Mahadevan /* create a meshset and then add old fileset as child */ 1354*304006b3SVijay Mahadevan merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal);MBERR("Adding child vertices to parent failed", merr); 1355*304006b3SVijay Mahadevan merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal);MBERR("Adding child elements to parent failed", merr); 1356*304006b3SVijay Mahadevan 1357*304006b3SVijay Mahadevan /* preserve the field association between the parent and sub-mesh objects */ 1358*304006b3SVijay Mahadevan ierr = DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames);CHKERRQ(ierr); 1359*304006b3SVijay Mahadevan PetscFunctionReturn(0); 1360*304006b3SVijay Mahadevan } 1361*304006b3SVijay Mahadevan 1362*304006b3SVijay Mahadevan 1363*304006b3SVijay Mahadevan #undef __FUNCT__ 1364*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_Ascii" 1365*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer) 1366*304006b3SVijay Mahadevan { 1367*304006b3SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 1368*304006b3SVijay Mahadevan const char *name; 1369*304006b3SVijay Mahadevan MPI_Comm comm; 1370*304006b3SVijay Mahadevan PetscMPIInt size; 1371*304006b3SVijay Mahadevan PetscErrorCode ierr; 1372*304006b3SVijay Mahadevan 1373*304006b3SVijay Mahadevan PetscFunctionBegin; 1374*304006b3SVijay Mahadevan ierr = PetscObjectGetComm((PetscObject)dm,&comm);CHKERRQ(ierr); 1375*304006b3SVijay Mahadevan ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 1376*304006b3SVijay Mahadevan ierr = PetscObjectGetName((PetscObject) dm, &name);CHKERRQ(ierr); 1377*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1378*304006b3SVijay Mahadevan if (name) {ierr = PetscViewerASCIIPrintf(viewer, "%s in %D dimensions:\n", name, dmmoab->dim);CHKERRQ(ierr);} 1379*304006b3SVijay Mahadevan else {ierr = PetscViewerASCIIPrintf(viewer, "Mesh in %D dimensions:\n", dmmoab->dim);CHKERRQ(ierr);} 1380*304006b3SVijay Mahadevan /* print details about the global mesh */ 1381*304006b3SVijay Mahadevan { 1382*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1383*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "Sizes: cells=%D, vertices=%D, blocks=%D\n", dmmoab->n, dmmoab->nele, dmmoab->bs);CHKERRQ(ierr); 1384*304006b3SVijay Mahadevan /* print boundary data */ 1385*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "Boundary trace:\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr); 1386*304006b3SVijay Mahadevan { 1387*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1388*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "cells=%D, faces=%D, vertices=%D\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr); 1389*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1390*304006b3SVijay Mahadevan } 1391*304006b3SVijay Mahadevan /* print field data */ 1392*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "Fields: %D components\n", dmmoab->numFields);CHKERRQ(ierr); 1393*304006b3SVijay Mahadevan { 1394*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 1395*304006b3SVijay Mahadevan for (int i=0; i<dmmoab->numFields; ++i) { 1396*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPrintf(viewer, "[%D] - %s\n", i, dmmoab->fieldNames[i]);CHKERRQ(ierr); 1397*304006b3SVijay Mahadevan } 1398*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1399*304006b3SVijay Mahadevan } 1400*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1401*304006b3SVijay Mahadevan } 1402*304006b3SVijay Mahadevan ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 1403*304006b3SVijay Mahadevan ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 1404*304006b3SVijay Mahadevan PetscFunctionReturn(0); 1405*304006b3SVijay Mahadevan } 1406*304006b3SVijay Mahadevan 1407*304006b3SVijay Mahadevan #undef __FUNCT__ 1408*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_VTK" 1409*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm,PetscViewer v) 1410*304006b3SVijay Mahadevan { 1411*304006b3SVijay Mahadevan PetscFunctionReturn(0); 1412*304006b3SVijay Mahadevan } 1413*304006b3SVijay Mahadevan 1414*304006b3SVijay Mahadevan #undef __FUNCT__ 1415*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_HDF5" 1416*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm,PetscViewer v) 1417*304006b3SVijay Mahadevan { 1418*304006b3SVijay Mahadevan PetscFunctionReturn(0); 1419*304006b3SVijay Mahadevan } 1420*304006b3SVijay Mahadevan 1421*304006b3SVijay Mahadevan #undef __FUNCT__ 1422*304006b3SVijay Mahadevan #define __FUNCT__ "DMView_Moab" 1423*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm,PetscViewer viewer) 1424*304006b3SVijay Mahadevan { 1425*304006b3SVijay Mahadevan PetscBool iascii, ishdf5, isvtk; 1426*304006b3SVijay Mahadevan PetscErrorCode ierr; 1427*304006b3SVijay Mahadevan 1428*304006b3SVijay Mahadevan PetscFunctionBegin; 1429*304006b3SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1430*304006b3SVijay Mahadevan PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2); 1431*304006b3SVijay Mahadevan ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr); 1432*304006b3SVijay Mahadevan ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERVTK, &isvtk);CHKERRQ(ierr); 1433*304006b3SVijay Mahadevan ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERHDF5, &ishdf5);CHKERRQ(ierr); 1434*304006b3SVijay Mahadevan if (iascii) { 1435*304006b3SVijay Mahadevan ierr = DMMoabView_Ascii(dm, viewer);CHKERRQ(ierr); 1436*304006b3SVijay Mahadevan } else if (ishdf5) { 1437*304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5) 1438*304006b3SVijay Mahadevan ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ);CHKERRQ(ierr); 1439*304006b3SVijay Mahadevan ierr = DMMoabView_HDF5(dm, viewer);CHKERRQ(ierr); 1440*304006b3SVijay Mahadevan ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 1441*304006b3SVijay Mahadevan #else 1442*304006b3SVijay Mahadevan SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5"); 1443*304006b3SVijay Mahadevan #endif 1444*304006b3SVijay Mahadevan } 1445*304006b3SVijay Mahadevan else if (isvtk) { 1446*304006b3SVijay Mahadevan ierr = DMMoabView_VTK(dm, viewer);CHKERRQ(ierr); 1447*304006b3SVijay Mahadevan } 1448*304006b3SVijay Mahadevan PetscFunctionReturn(0); 1449*304006b3SVijay Mahadevan } 1450*304006b3SVijay Mahadevan 1451*304006b3SVijay Mahadevan 1452*304006b3SVijay Mahadevan #undef __FUNCT__ 1453*304006b3SVijay Mahadevan #define __FUNCT__ "DMInitialize_Moab" 1454*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm) 1455*304006b3SVijay Mahadevan { 1456*304006b3SVijay Mahadevan PetscFunctionBegin; 1457*304006b3SVijay Mahadevan dm->ops->view = DMView_Moab; 1458*304006b3SVijay Mahadevan dm->ops->load = NULL /*DMLoad_Moab*/; 1459*304006b3SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1460*304006b3SVijay Mahadevan dm->ops->clone = DMClone_Moab; 1461*304006b3SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1462*304006b3SVijay Mahadevan dm->ops->createdefaultsection = NULL; 1463*304006b3SVijay Mahadevan dm->ops->createdefaultconstraints = NULL; 1464*304006b3SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1465*304006b3SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1466*304006b3SVijay Mahadevan dm->ops->getlocaltoglobalmapping = NULL; 1467*304006b3SVijay Mahadevan dm->ops->createfieldis = NULL; 1468*304006b3SVijay Mahadevan dm->ops->createcoordinatedm = NULL /*DMCreateCoordinateDM_Moab*/; 1469*304006b3SVijay Mahadevan dm->ops->getcoloring = NULL; 1470*304006b3SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1471*304006b3SVijay Mahadevan dm->ops->createinterpolation = DMCreateInterpolation_Moab; 1472*304006b3SVijay Mahadevan dm->ops->getaggregates = NULL; 1473*304006b3SVijay Mahadevan dm->ops->getinjection = NULL /*DMCreateInjection_Moab*/; 1474*304006b3SVijay Mahadevan dm->ops->refine = DMRefine_Moab; 1475*304006b3SVijay Mahadevan dm->ops->coarsen = DMCoarsen_Moab; 1476*304006b3SVijay Mahadevan dm->ops->refinehierarchy = DMRefineHierarchy_Moab; 1477*304006b3SVijay Mahadevan dm->ops->coarsenhierarchy = DMCoarsenHierarchy_Moab; 1478*304006b3SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1479*304006b3SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1480*304006b3SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1481*304006b3SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1482*304006b3SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 1483*304006b3SVijay Mahadevan dm->ops->createsubdm = NULL /*DMCreateSubDM_Moab*/; 1484*304006b3SVijay Mahadevan dm->ops->getdimpoints = NULL /*DMGetDimPoints_Moab*/; 1485*304006b3SVijay Mahadevan dm->ops->locatepoints = NULL /*DMLocatePoints_Moab*/; 1486*304006b3SVijay Mahadevan PetscFunctionReturn(0); 1487*304006b3SVijay Mahadevan } 1488*304006b3SVijay Mahadevan 1489*304006b3SVijay Mahadevan 1490*304006b3SVijay Mahadevan #undef __FUNCT__ 1491*304006b3SVijay Mahadevan #define __FUNCT__ "DMClone_Moab" 1492*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm) 1493*304006b3SVijay Mahadevan { 1494*304006b3SVijay Mahadevan PetscErrorCode ierr; 1495*304006b3SVijay Mahadevan 1496*304006b3SVijay Mahadevan PetscFunctionBegin; 1497*304006b3SVijay Mahadevan ierr = PetscObjectChangeTypeName((PetscObject) *newdm, DMMOAB);CHKERRQ(ierr); 1498*304006b3SVijay Mahadevan 1499*304006b3SVijay Mahadevan /* get all the necessary handles from the private DM object */ 1500*304006b3SVijay Mahadevan (*newdm)->data = (DM_Moab*) dm->data; 1501*304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->refct++; 1502*304006b3SVijay Mahadevan 1503*304006b3SVijay Mahadevan ierr = DMInitialize_Moab(*newdm);CHKERRQ(ierr); 1504*304006b3SVijay Mahadevan PetscFunctionReturn(0); 1505*304006b3SVijay Mahadevan } 1506*304006b3SVijay Mahadevan 1507*304006b3SVijay Mahadevan 1508*304006b3SVijay Mahadevan #undef __FUNCT__ 1509*304006b3SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab" 1510f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1511f6829af0SVijay Mahadevan { 1512f6829af0SVijay Mahadevan PetscErrorCode ierr; 1513f6829af0SVijay Mahadevan 1514f6829af0SVijay Mahadevan PetscFunctionBegin; 1515f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1516f90c3b0eSVijay Mahadevan ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr); 1517f6829af0SVijay Mahadevan 1518f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1519f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1520f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1521f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1522f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1523f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1524f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1525f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1526c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_map = NULL; 1527c528d872SBarry Smith ((DM_Moab*)dm->data)->ltog_sendrecv = NULL; 1528f6829af0SVijay Mahadevan 1529*304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->refct = 1; 1530*304006b3SVijay Mahadevan ((DM_Moab*)dm->data)->parent = NULL; 1531f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1532f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1533f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1534f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1535f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1536f6829af0SVijay Mahadevan 1537*304006b3SVijay Mahadevan ierr = DMInitialize_Moab(dm);CHKERRQ(ierr); 1538f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1539f6829af0SVijay Mahadevan } 1540f6829af0SVijay Mahadevan 1541