1b8ecf6d3SVijay Mahadevan #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 7fd349b41STim Tautges 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 24c6ef30f9SVijay Mahadevan 25fd349b41STim Tautges #undef __FUNCT__ 261d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate" 271d72bce8STim Tautges /*@ 281d72bce8STim Tautges DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance 291d72bce8STim Tautges 301d72bce8STim Tautges Collective on MPI_Comm 311d72bce8STim Tautges 321d72bce8STim Tautges Input Parameter: 331d72bce8STim Tautges . comm - The communicator for the DMMoab object 341d72bce8STim Tautges 351d72bce8STim Tautges Output Parameter: 36032b8ab6SVijay Mahadevan . dmb - The DMMoab object 371d72bce8STim Tautges 381d72bce8STim Tautges Level: beginner 391d72bce8STim Tautges 401d72bce8STim Tautges .keywords: DMMoab, create 411d72bce8STim Tautges @*/ 42032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) 431d72bce8STim Tautges { 441d72bce8STim Tautges PetscErrorCode ierr; 451d72bce8STim Tautges 461d72bce8STim Tautges PetscFunctionBegin; 47032b8ab6SVijay Mahadevan PetscValidPointer(dmb,2); 48032b8ab6SVijay Mahadevan ierr = DMCreate(comm, dmb);CHKERRQ(ierr); 49032b8ab6SVijay Mahadevan ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr); 501d72bce8STim Tautges PetscFunctionReturn(0); 511d72bce8STim Tautges } 521d72bce8STim Tautges 531d72bce8STim Tautges #undef __FUNCT__ 54aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab" 551d72bce8STim Tautges /*@ 56a4d2169cSTim Tautges DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data 571d72bce8STim Tautges 581d72bce8STim Tautges Collective on MPI_Comm 591d72bce8STim Tautges 601d72bce8STim Tautges Input Parameter: 611d72bce8STim Tautges . comm - The communicator for the DMMoab object 62032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed 63a4d2169cSTim Tautges along with the DMMoab 64a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator 651d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag 661d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned 671d72bce8STim Tautges 681d72bce8STim Tautges Output Parameter: 69032b8ab6SVijay Mahadevan . dmb - The DMMoab object 701d72bce8STim Tautges 71032b8ab6SVijay Mahadevan Level: intermediate 721d72bce8STim Tautges 731d72bce8STim Tautges .keywords: DMMoab, create 741d72bce8STim Tautges @*/ 75032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) 761d72bce8STim Tautges { 771d72bce8STim Tautges PetscErrorCode ierr; 78032b8ab6SVijay Mahadevan moab::ErrorCode merr; 791cec0304SVijay Mahadevan moab::EntityHandle partnset; 801cec0304SVijay Mahadevan PetscInt rank, nprocs; 81853cdec3SJed Brown DM_Moab *dmmoab; 821d72bce8STim Tautges 831d72bce8STim Tautges PetscFunctionBegin; 84032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 85032b8ab6SVijay Mahadevan ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr); 86032b8ab6SVijay Mahadevan dmmoab = (DM_Moab*)(*dmb)->data; 87a4d2169cSTim Tautges 88a4d2169cSTim Tautges if (!mbiface) { 8972ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 907d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 911d72bce8STim Tautges } 921cec0304SVijay Mahadevan else { 931cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 947d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 951cec0304SVijay Mahadevan } 961cec0304SVijay Mahadevan 97b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 98b5410836SVijay Mahadevan dmmoab->fileset=0; 997d89fc02STim Tautges 100a4d2169cSTim Tautges if (!pcomm) { 101032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 102032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 103032b8ab6SVijay Mahadevan 104db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 105db66d124SVijay Mahadevan to the load_file functions to be populated. */ 1060c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr); 107032b8ab6SVijay Mahadevan 108db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 10972ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 11072ff976dSVijay Mahadevan } 11172ff976dSVijay Mahadevan else { 11272ff976dSVijay Mahadevan ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr); 113032b8ab6SVijay Mahadevan } 114032b8ab6SVijay Mahadevan 1154973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 1164973de03SVijay Mahadevan dmmoab->bs = 1; 117addae81cSVijay Mahadevan dmmoab->numFields = 1; 1182e4e7c01SVijay Mahadevan dmmoab->rw_dbglevel = 0; 1192e4e7c01SVijay Mahadevan dmmoab->partition_by_rank = PETSC_FALSE; 1202e4e7c01SVijay Mahadevan dmmoab->extra_read_options[0] = '\0'; 1212e4e7c01SVijay Mahadevan dmmoab->extra_write_options[0] = '\0'; 1222e4e7c01SVijay Mahadevan dmmoab->read_mode = READ_PART; 1232e4e7c01SVijay Mahadevan dmmoab->write_mode = WRITE_PART; 1244973de03SVijay Mahadevan 1254973de03SVijay Mahadevan /* set global ID tag handle */ 1261a845d2aSVijay Mahadevan if (ltog_tag && *ltog_tag) { 1271a845d2aSVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr); 128032b8ab6SVijay Mahadevan } 129032b8ab6SVijay Mahadevan else { 1301a845d2aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1311a845d2aSVijay Mahadevan if (ltog_tag) *ltog_tag = dmmoab->ltog_tag; 132a4d2169cSTim Tautges } 133a4d2169cSTim Tautges 134340f3b9aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr); 135340f3b9aSVijay Mahadevan 1364973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 137a4d2169cSTim Tautges if (range) { 1385eb88e9dSVijay Mahadevan ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr); 139a4d2169cSTim Tautges } 1401d72bce8STim Tautges PetscFunctionReturn(0); 1411d72bce8STim Tautges } 1421d72bce8STim Tautges 1431d72bce8STim Tautges #undef __FUNCT__ 1441d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 145aa768e4cSTim Tautges /*@ 146aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 147aa768e4cSTim Tautges 148aa768e4cSTim Tautges Collective on MPI_Comm 149aa768e4cSTim Tautges 150aa768e4cSTim Tautges Input Parameter: 151aa768e4cSTim Tautges . dm - The DMMoab object being set 152aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 153aa768e4cSTim Tautges 154aa768e4cSTim Tautges Level: beginner 155aa768e4cSTim Tautges 156aa768e4cSTim Tautges .keywords: DMMoab, create 157aa768e4cSTim Tautges @*/ 1581d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 1591d72bce8STim Tautges { 160032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 161032b8ab6SVijay Mahadevan 1621d72bce8STim Tautges PetscFunctionBegin; 1631d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1641cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 165032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 166032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 167032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 1681d72bce8STim Tautges PetscFunctionReturn(0); 1691d72bce8STim Tautges } 1701d72bce8STim Tautges 1711d72bce8STim Tautges 1721d72bce8STim Tautges #undef __FUNCT__ 1731d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 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 1971d72bce8STim Tautges 1981d72bce8STim Tautges #undef __FUNCT__ 1991d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 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); 220032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 221032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 222032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2231d72bce8STim Tautges PetscFunctionReturn(0); 2241d72bce8STim Tautges } 2251d72bce8STim Tautges 2261d72bce8STim Tautges 2271d72bce8STim Tautges #undef __FUNCT__ 2281d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 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 2571d72bce8STim Tautges #undef __FUNCT__ 2585eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 259aa768e4cSTim Tautges /*@ 2605eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 261aa768e4cSTim Tautges 262aa768e4cSTim Tautges Collective on MPI_Comm 263aa768e4cSTim Tautges 264aa768e4cSTim Tautges Input Parameter: 265aa768e4cSTim Tautges . dm - The DMMoab object being set 266aa768e4cSTim Tautges . range - The entities treated by this DMMoab 267aa768e4cSTim Tautges 268aa768e4cSTim Tautges Level: beginner 269aa768e4cSTim Tautges 270aa768e4cSTim Tautges .keywords: DMMoab, create 271aa768e4cSTim Tautges @*/ 2725eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 2731d72bce8STim Tautges { 274032b8ab6SVijay Mahadevan moab::ErrorCode merr; 275032b8ab6SVijay Mahadevan PetscErrorCode ierr; 276fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 277032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 278032b8ab6SVijay Mahadevan 2791d72bce8STim Tautges PetscFunctionBegin; 2801d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 281032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 282032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 283fd3326ddSVijay Mahadevan 284032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 285fd3326ddSVijay Mahadevan 286fd3326ddSVijay Mahadevan /* filter based on parallel status */ 287fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 288fd3326ddSVijay Mahadevan 289fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 290fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 291fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 292fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 293fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 294fd3326ddSVijay Mahadevan 295fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 296032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 297032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 298032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 2991d72bce8STim Tautges PetscFunctionReturn(0); 3001d72bce8STim Tautges } 3011d72bce8STim Tautges 3021d72bce8STim Tautges 3031d72bce8STim Tautges #undef __FUNCT__ 3048d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices" 3058d8d51c8SVijay Mahadevan /*@ 3068d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 3078d8d51c8SVijay Mahadevan 3088d8d51c8SVijay Mahadevan Collective on MPI_Comm 3098d8d51c8SVijay Mahadevan 3108d8d51c8SVijay Mahadevan Input Parameter: 3118d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 3128d8d51c8SVijay Mahadevan 3138d8d51c8SVijay Mahadevan Output Parameter: 3148d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 3158d8d51c8SVijay Mahadevan 3168d8d51c8SVijay Mahadevan Level: beginner 3178d8d51c8SVijay Mahadevan 3188d8d51c8SVijay Mahadevan .keywords: DMMoab, create 3198d8d51c8SVijay Mahadevan @*/ 3208d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 3218d8d51c8SVijay Mahadevan { 3228d8d51c8SVijay Mahadevan PetscFunctionBegin; 3238d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3248d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 3258d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3268d8d51c8SVijay Mahadevan } 3278d8d51c8SVijay Mahadevan 3288d8d51c8SVijay Mahadevan 3298d8d51c8SVijay Mahadevan 3308d8d51c8SVijay Mahadevan #undef __FUNCT__ 3315eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 332aa768e4cSTim Tautges /*@ 3335eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 334aa768e4cSTim Tautges 335aa768e4cSTim Tautges Collective on MPI_Comm 336aa768e4cSTim Tautges 337aa768e4cSTim Tautges Input Parameter: 338aa768e4cSTim Tautges . dm - The DMMoab object being set 339aa768e4cSTim Tautges 340aa768e4cSTim Tautges Output Parameter: 3415eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 3425eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 343aa768e4cSTim Tautges 344aa768e4cSTim Tautges Level: beginner 345aa768e4cSTim Tautges 346aa768e4cSTim Tautges .keywords: DMMoab, create 347aa768e4cSTim Tautges @*/ 348351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost) 3491d72bce8STim Tautges { 3501d72bce8STim Tautges PetscFunctionBegin; 3511d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 352351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 353351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3541d72bce8STim Tautges PetscFunctionReturn(0); 3551d72bce8STim Tautges } 3561d72bce8STim Tautges 3571d72bce8STim Tautges #undef __FUNCT__ 3585eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 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 #undef __FUNCT__ 3841cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 3851cec0304SVijay Mahadevan /*@ 3861cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 3871cec0304SVijay Mahadevan 3881cec0304SVijay Mahadevan Collective on MPI_Comm 3891cec0304SVijay Mahadevan 3901cec0304SVijay Mahadevan Input Parameter: 3911cec0304SVijay Mahadevan . dm - The DMMoab object being set 3921cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 3931cec0304SVijay Mahadevan 3941cec0304SVijay Mahadevan Level: beginner 3951cec0304SVijay Mahadevan 3961cec0304SVijay Mahadevan .keywords: DMMoab, create 3971cec0304SVijay Mahadevan @*/ 3981cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 3991cec0304SVijay Mahadevan { 4001cec0304SVijay Mahadevan moab::ErrorCode merr; 4011cec0304SVijay Mahadevan PetscErrorCode ierr; 4021cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 4031cec0304SVijay Mahadevan 4041cec0304SVijay Mahadevan PetscFunctionBegin; 4051cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4061cec0304SVijay Mahadevan dmmoab->elocal->clear(); 4071cec0304SVijay Mahadevan dmmoab->eghost->clear(); 4081cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 4091cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 4101cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 4111cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 41241dd5348SVijay Mahadevan dmmoab->neleghost=dmmoab->eghost->size(); 4131cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4148cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 4155eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 4165eb88e9dSVijay Mahadevan } 4175eb88e9dSVijay Mahadevan 4185eb88e9dSVijay Mahadevan 4195eb88e9dSVijay Mahadevan #undef __FUNCT__ 4201d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 421aa768e4cSTim Tautges /*@ 422aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 423aa768e4cSTim Tautges 424aa768e4cSTim Tautges Collective on MPI_Comm 425aa768e4cSTim Tautges 426aa768e4cSTim Tautges Input Parameter: 427aa768e4cSTim Tautges . dm - The DMMoab object being set 428aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 429aa768e4cSTim Tautges 430aa768e4cSTim Tautges Level: beginner 431aa768e4cSTim Tautges 432aa768e4cSTim Tautges .keywords: DMMoab, create 433aa768e4cSTim Tautges @*/ 4341d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 4351d72bce8STim Tautges { 4361d72bce8STim Tautges PetscFunctionBegin; 4371d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4381d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4391d72bce8STim Tautges PetscFunctionReturn(0); 4401d72bce8STim Tautges } 4411d72bce8STim Tautges 4421d72bce8STim Tautges 4431d72bce8STim Tautges #undef __FUNCT__ 4441d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 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 4691d72bce8STim Tautges #undef __FUNCT__ 4701d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 471aa768e4cSTim Tautges /*@ 472aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 473aa768e4cSTim Tautges 474aa768e4cSTim Tautges Collective on MPI_Comm 475aa768e4cSTim Tautges 476aa768e4cSTim Tautges Input Parameter: 477aa768e4cSTim Tautges . dm - The DMMoab object being set 478aa768e4cSTim Tautges . bs - The block size used with this DMMoab 479aa768e4cSTim Tautges 480aa768e4cSTim Tautges Level: beginner 481aa768e4cSTim Tautges 482aa768e4cSTim Tautges .keywords: DMMoab, create 483aa768e4cSTim Tautges @*/ 4841d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 4851d72bce8STim Tautges { 4861d72bce8STim Tautges PetscFunctionBegin; 4871d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4881d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4891d72bce8STim Tautges PetscFunctionReturn(0); 4901d72bce8STim Tautges } 4911d72bce8STim Tautges 4921d72bce8STim Tautges 4931d72bce8STim Tautges #undef __FUNCT__ 4941d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 495aa768e4cSTim Tautges /*@ 496aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 497aa768e4cSTim Tautges 498aa768e4cSTim Tautges Collective on MPI_Comm 499aa768e4cSTim Tautges 500aa768e4cSTim Tautges Input Parameter: 501aa768e4cSTim Tautges . dm - The DMMoab object being set 502aa768e4cSTim Tautges 503aa768e4cSTim Tautges Output Parameter: 504aa768e4cSTim Tautges . bs - The block size used with this DMMoab 505aa768e4cSTim Tautges 506aa768e4cSTim Tautges Level: beginner 507aa768e4cSTim Tautges 508aa768e4cSTim Tautges .keywords: DMMoab, create 509aa768e4cSTim Tautges @*/ 5101d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 5111d72bce8STim Tautges { 5121d72bce8STim Tautges PetscFunctionBegin; 5131d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5141d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 5151d72bce8STim Tautges PetscFunctionReturn(0); 5161d72bce8STim Tautges } 5171d72bce8STim Tautges 5181cec0304SVijay Mahadevan 5191cec0304SVijay Mahadevan #undef __FUNCT__ 520212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize" 521212ad6d1SVijay Mahadevan /*@ 522212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 523212ad6d1SVijay Mahadevan 52400cc10feSVijay Mahadevan Collective on DM 525212ad6d1SVijay Mahadevan 526212ad6d1SVijay Mahadevan Input Parameter: 527212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 528212ad6d1SVijay Mahadevan 529212ad6d1SVijay Mahadevan Output Parameter: 53000cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance 53100cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance 532212ad6d1SVijay Mahadevan 533212ad6d1SVijay Mahadevan Level: beginner 534212ad6d1SVijay Mahadevan 535212ad6d1SVijay Mahadevan .keywords: DMMoab, create 536212ad6d1SVijay Mahadevan @*/ 53741dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg) 538212ad6d1SVijay Mahadevan { 539212ad6d1SVijay Mahadevan PetscFunctionBegin; 540212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 54141dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->nele; 54241dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->n; 543212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 544212ad6d1SVijay Mahadevan } 545212ad6d1SVijay Mahadevan 546212ad6d1SVijay Mahadevan 547212ad6d1SVijay Mahadevan #undef __FUNCT__ 548212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize" 549212ad6d1SVijay Mahadevan /*@ 550212ad6d1SVijay Mahadevan DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab 551212ad6d1SVijay Mahadevan 55200cc10feSVijay Mahadevan Collective on DM 553212ad6d1SVijay Mahadevan 554212ad6d1SVijay Mahadevan Input Parameter: 555212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 556212ad6d1SVijay Mahadevan 557212ad6d1SVijay Mahadevan Output Parameter: 558b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor 55900cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor 56000cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor 56100cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor 562212ad6d1SVijay Mahadevan 563212ad6d1SVijay Mahadevan Level: beginner 564212ad6d1SVijay Mahadevan 565212ad6d1SVijay Mahadevan .keywords: DMMoab, create 566212ad6d1SVijay Mahadevan @*/ 56741dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg) 568212ad6d1SVijay Mahadevan { 569212ad6d1SVijay Mahadevan PetscFunctionBegin; 570212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 57141dd5348SVijay Mahadevan if(nel) *nel = ((DM_Moab*)dm->data)->neleloc; 57241dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->neleghost; 57341dd5348SVijay Mahadevan if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc; 57441dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost; 575212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 576212ad6d1SVijay Mahadevan } 577212ad6d1SVijay Mahadevan 578212ad6d1SVijay Mahadevan 579212ad6d1SVijay Mahadevan #undef __FUNCT__ 58000cc10feSVijay Mahadevan #define __FUNCT__ "DMMoabGetOffset" 58100cc10feSVijay Mahadevan /*@ 58200cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 58300cc10feSVijay Mahadevan 58400cc10feSVijay Mahadevan Collective on MPI_Comm 58500cc10feSVijay Mahadevan 58600cc10feSVijay Mahadevan Input Parameter: 58700cc10feSVijay Mahadevan . dm - The DMMoab object being set 58800cc10feSVijay Mahadevan 58900cc10feSVijay Mahadevan Output Parameter: 59000cc10feSVijay Mahadevan . offset - The local offset for the global vector 59100cc10feSVijay Mahadevan 59200cc10feSVijay Mahadevan Level: beginner 59300cc10feSVijay Mahadevan 59400cc10feSVijay Mahadevan .keywords: DMMoab, create 59500cc10feSVijay Mahadevan @*/ 59600cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset) 59700cc10feSVijay Mahadevan { 59800cc10feSVijay Mahadevan PetscFunctionBegin; 59900cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 60000cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 60100cc10feSVijay Mahadevan PetscFunctionReturn(0); 60200cc10feSVijay Mahadevan } 60300cc10feSVijay Mahadevan 60400cc10feSVijay Mahadevan 60500cc10feSVijay Mahadevan #undef __FUNCT__ 6064920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension" 6074920ab11SVijay Mahadevan /*@ 6084920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 6094920ab11SVijay Mahadevan 6104920ab11SVijay Mahadevan Collective on MPI_Comm 6114920ab11SVijay Mahadevan 6124920ab11SVijay Mahadevan Input Parameter: 613340f3b9aSVijay Mahadevan . dm - The DMMoab object 6144920ab11SVijay Mahadevan 6154920ab11SVijay Mahadevan Output Parameter: 6164920ab11SVijay Mahadevan . dim - The dimension of DM 6174920ab11SVijay Mahadevan 6184920ab11SVijay Mahadevan Level: beginner 6194920ab11SVijay Mahadevan 6204920ab11SVijay Mahadevan .keywords: DMMoab, create 6214920ab11SVijay Mahadevan @*/ 6224920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 6234920ab11SVijay Mahadevan { 6244920ab11SVijay Mahadevan PetscFunctionBegin; 6254920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6264920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 6274920ab11SVijay Mahadevan PetscFunctionReturn(0); 6284920ab11SVijay Mahadevan } 6294920ab11SVijay Mahadevan 6304920ab11SVijay Mahadevan 631340f3b9aSVijay Mahadevan #undef __FUNCT__ 632340f3b9aSVijay Mahadevan #define __FUNCT__ "DMMoabGetMaterialBlock" 633340f3b9aSVijay Mahadevan /*@ 634340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 635340f3b9aSVijay Mahadevan 636340f3b9aSVijay Mahadevan Collective on MPI_Comm 637340f3b9aSVijay Mahadevan 638340f3b9aSVijay Mahadevan Input Parameter: 639340f3b9aSVijay Mahadevan . dm - The DMMoab object 640340f3b9aSVijay Mahadevan . ehandle - The element entity handle 641340f3b9aSVijay Mahadevan 642340f3b9aSVijay Mahadevan Output Parameter: 643340f3b9aSVijay Mahadevan . mat - The material ID for the current entity 644340f3b9aSVijay Mahadevan 645340f3b9aSVijay Mahadevan Level: beginner 646340f3b9aSVijay Mahadevan 647340f3b9aSVijay Mahadevan .keywords: DMMoab, create 648340f3b9aSVijay Mahadevan @*/ 649340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat) 650340f3b9aSVijay Mahadevan { 651340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 652340f3b9aSVijay Mahadevan moab::ErrorCode merr; 653340f3b9aSVijay Mahadevan 654340f3b9aSVijay Mahadevan PetscFunctionBegin; 655340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 656340f3b9aSVijay Mahadevan if (*mat) { 657340f3b9aSVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 658*63cd93b2SVijay Mahadevan merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr); 659340f3b9aSVijay Mahadevan } 660340f3b9aSVijay Mahadevan PetscFunctionReturn(0); 661340f3b9aSVijay Mahadevan } 662340f3b9aSVijay Mahadevan 6634920ab11SVijay Mahadevan 6644920ab11SVijay Mahadevan #undef __FUNCT__ 6657023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 6667023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos) 6677023aa44SVijay Mahadevan { 6687023aa44SVijay Mahadevan DM_Moab *dmmoab; 6697023aa44SVijay Mahadevan PetscErrorCode ierr; 6707023aa44SVijay Mahadevan moab::ErrorCode merr; 6717023aa44SVijay Mahadevan 6727023aa44SVijay Mahadevan PetscFunctionBegin; 6737023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6747023aa44SVijay Mahadevan PetscValidPointer(conn,3); 6757023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6767023aa44SVijay Mahadevan 6777023aa44SVijay Mahadevan if (!vpos) { 6787023aa44SVijay Mahadevan ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr); 6797023aa44SVijay Mahadevan } 6807023aa44SVijay Mahadevan 6817023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 6827023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 6837023aa44SVijay Mahadevan PetscFunctionReturn(0); 6847023aa44SVijay Mahadevan } 6857023aa44SVijay Mahadevan 6867023aa44SVijay Mahadevan 6877023aa44SVijay Mahadevan #undef __FUNCT__ 6888d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity" 6898d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 6908d8d51c8SVijay Mahadevan { 6918d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 6928d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 6938d8d51c8SVijay Mahadevan PetscErrorCode ierr; 6948d8d51c8SVijay Mahadevan moab::ErrorCode merr; 6958d8d51c8SVijay Mahadevan 6968d8d51c8SVijay Mahadevan PetscFunctionBegin; 6978d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6988d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 6998d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7008d8d51c8SVijay Mahadevan 7018d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7028d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 7038d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 7048d8d51c8SVijay Mahadevan 7058d8d51c8SVijay Mahadevan if (conn) { 7068d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 7078d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 7088d8d51c8SVijay Mahadevan } 7098d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 7108d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7118d8d51c8SVijay Mahadevan } 7128d8d51c8SVijay Mahadevan 7138d8d51c8SVijay Mahadevan 7148d8d51c8SVijay Mahadevan #undef __FUNCT__ 7158d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity" 7168d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 7178d8d51c8SVijay Mahadevan { 7188d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7198d8d51c8SVijay Mahadevan 7208d8d51c8SVijay Mahadevan PetscFunctionBegin; 7218d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7228d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 7238d8d51c8SVijay Mahadevan 7248d8d51c8SVijay Mahadevan if (conn) { 7258d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 7268d8d51c8SVijay Mahadevan } 7278d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 7288d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7298d8d51c8SVijay Mahadevan } 7308d8d51c8SVijay Mahadevan 7318d8d51c8SVijay Mahadevan 7328d8d51c8SVijay Mahadevan 7338d8d51c8SVijay Mahadevan #undef __FUNCT__ 7347023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 7357023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 7367023aa44SVijay Mahadevan { 7377023aa44SVijay Mahadevan DM_Moab *dmmoab; 7387023aa44SVijay Mahadevan const moab::EntityHandle *connect; 7397023aa44SVijay Mahadevan moab::ErrorCode merr; 7407023aa44SVijay Mahadevan PetscInt nnodes; 7417023aa44SVijay Mahadevan 7427023aa44SVijay Mahadevan PetscFunctionBegin; 7437023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7447023aa44SVijay Mahadevan PetscValidPointer(conn,4); 7457023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7467023aa44SVijay Mahadevan 7477023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7487023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 7497023aa44SVijay Mahadevan if (conn) *conn=connect; 7507023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 7517023aa44SVijay Mahadevan PetscFunctionReturn(0); 7527023aa44SVijay Mahadevan } 7537023aa44SVijay Mahadevan 7547023aa44SVijay Mahadevan 7557023aa44SVijay Mahadevan #undef __FUNCT__ 75669263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 75769263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 75869263071SVijay Mahadevan { 75969263071SVijay Mahadevan moab::EntityType etype; 76069263071SVijay Mahadevan DM_Moab *dmmoab; 76169263071SVijay Mahadevan PetscInt edim; 76269263071SVijay Mahadevan 76369263071SVijay Mahadevan PetscFunctionBegin; 76469263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 76569263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 76669263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 76769263071SVijay Mahadevan 76869263071SVijay Mahadevan /* get the entity type and handle accordingly */ 76969263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 77069263071SVijay 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); 77169263071SVijay Mahadevan 77269263071SVijay Mahadevan /* get the entity dimension */ 77369263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 77469263071SVijay Mahadevan 77569263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 77669263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 7776d9eb265SVijay Mahadevan if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 77869263071SVijay Mahadevan } 77969263071SVijay Mahadevan else { 78069263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 7816d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 78269263071SVijay Mahadevan } 78369263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 7846d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 78569263071SVijay Mahadevan } 78669263071SVijay Mahadevan } 78769263071SVijay Mahadevan PetscFunctionReturn(0); 78869263071SVijay Mahadevan } 78969263071SVijay Mahadevan 79069263071SVijay Mahadevan 79169263071SVijay Mahadevan #undef __FUNCT__ 7927023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 79369263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 7947023aa44SVijay Mahadevan { 7957023aa44SVijay Mahadevan DM_Moab *dmmoab; 7967023aa44SVijay Mahadevan PetscInt i; 7977023aa44SVijay Mahadevan 7987023aa44SVijay Mahadevan PetscFunctionBegin; 7997023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8007023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 8017023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 8027023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8037023aa44SVijay Mahadevan 8047023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 8056d9eb265SVijay Mahadevan isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE); 8067023aa44SVijay Mahadevan } 8077023aa44SVijay Mahadevan PetscFunctionReturn(0); 8087023aa44SVijay Mahadevan } 8097023aa44SVijay Mahadevan 8107023aa44SVijay Mahadevan 8117023aa44SVijay Mahadevan #undef __FUNCT__ 8120c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers" 8136d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces) 8141cec0304SVijay Mahadevan { 8151cec0304SVijay Mahadevan DM_Moab *dmmoab; 8161cec0304SVijay Mahadevan 8171cec0304SVijay Mahadevan PetscFunctionBegin; 8181cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8191cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8201cec0304SVijay Mahadevan 8216d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 8226d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 8236d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 8241cec0304SVijay Mahadevan PetscFunctionReturn(0); 8251cec0304SVijay Mahadevan } 8261cec0304SVijay Mahadevan 827f6829af0SVijay Mahadevan 828f6829af0SVijay Mahadevan #undef __FUNCT__ 829f6829af0SVijay Mahadevan #define __FUNCT__ "DMDestroy_Moab" 830f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 831f6829af0SVijay Mahadevan { 832f6829af0SVijay Mahadevan PetscErrorCode ierr; 833f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 834f6829af0SVijay Mahadevan 835f6829af0SVijay Mahadevan PetscFunctionBegin; 836f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 837f6829af0SVijay Mahadevan if (dmmoab->icreatedinstance) { 838f6829af0SVijay Mahadevan delete dmmoab->mbiface; 839f6829af0SVijay Mahadevan } 840f6829af0SVijay Mahadevan dmmoab->mbiface = NULL; 841f6829af0SVijay Mahadevan dmmoab->pcomm = NULL; 842f6829af0SVijay Mahadevan delete dmmoab->vlocal; 843f6829af0SVijay Mahadevan delete dmmoab->vowned; 844f6829af0SVijay Mahadevan delete dmmoab->vghost; 845f6829af0SVijay Mahadevan delete dmmoab->elocal; 846f6829af0SVijay Mahadevan delete dmmoab->eghost; 847f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 848f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 849f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 850f6829af0SVijay Mahadevan 851f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 852f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->lidmap);CHKERRQ(ierr); 853f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gidmap);CHKERRQ(ierr); 854f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->llmap);CHKERRQ(ierr); 855f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->lgmap);CHKERRQ(ierr); 8565905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr); 8575905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr); 858f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 859f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 860f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 861f6829af0SVijay Mahadevan PetscFunctionReturn(0); 862f6829af0SVijay Mahadevan } 863f6829af0SVijay Mahadevan 864f6829af0SVijay Mahadevan 865f6829af0SVijay Mahadevan #undef __FUNCT__ 8662e4e7c01SVijay Mahadevan #define __FUNCT__ "DMSetFromOptions_Moab" 8672e4e7c01SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(DM dm) 8682e4e7c01SVijay Mahadevan { 8692e4e7c01SVijay Mahadevan PetscErrorCode ierr; 8702e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 8712e4e7c01SVijay Mahadevan 8722e4e7c01SVijay Mahadevan PetscFunctionBegin; 8732e4e7c01SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8742e4e7c01SVijay Mahadevan ierr = PetscOptionsHead("DMMoab Options");CHKERRQ(ierr); 8752e4e7c01SVijay 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); 8762e4e7c01SVijay 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); 8772e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 8782e4e7c01SVijay 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); 8792e4e7c01SVijay 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); 8802e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr); 8812e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr); 8822e4e7c01SVijay Mahadevan PetscFunctionReturn(0); 8832e4e7c01SVijay Mahadevan } 8842e4e7c01SVijay Mahadevan 8852e4e7c01SVijay Mahadevan 8862e4e7c01SVijay Mahadevan #undef __FUNCT__ 887f6829af0SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab" 888f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 889f6829af0SVijay Mahadevan { 890f6829af0SVijay Mahadevan PetscErrorCode ierr; 891f6829af0SVijay Mahadevan moab::ErrorCode merr; 892f6829af0SVijay Mahadevan Vec local, global; 893f6829af0SVijay Mahadevan IS from,to; 894f6829af0SVijay Mahadevan moab::Range::iterator iter; 895f6829af0SVijay Mahadevan PetscInt i,j,f,bs,gmin,lmin,lmax,vent,totsize; 896f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 897f6829af0SVijay Mahadevan moab::Range adjs; 898f6829af0SVijay Mahadevan 899f6829af0SVijay Mahadevan PetscFunctionBegin; 900f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 901f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 902f6829af0SVijay Mahadevan if (dmmoab->mbiface == PETSC_NULL || dmmoab->pcomm == PETSC_NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp."); 903f6829af0SVijay Mahadevan 904f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 905f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 906f6829af0SVijay Mahadevan { 907f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 908f6829af0SVijay Mahadevan 909f6829af0SVijay Mahadevan /* filter based on parallel status */ 910f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 911f6829af0SVijay Mahadevan 912f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 913f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 914f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 915f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 916f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 917f6829af0SVijay Mahadevan 918f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 919f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 920f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 921f6829af0SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 922f6829af0SVijay Mahadevan } 923f6829af0SVijay Mahadevan 924f6829af0SVijay Mahadevan { 925f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 926f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 927f6829af0SVijay Mahadevan 928f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 929f6829af0SVijay Mahadevan for (i=3;i>0;i--) { 930f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 931f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 932f6829af0SVijay Mahadevan 933f6829af0SVijay Mahadevan /* store the current mesh dimension */ 934f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 935f6829af0SVijay Mahadevan dmmoab->dim=i; 936f6829af0SVijay Mahadevan break; 937f6829af0SVijay Mahadevan } 938f6829af0SVijay Mahadevan } 939f6829af0SVijay Mahadevan 940f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 941f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 942f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 943f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 944f6829af0SVijay Mahadevan 945f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 946f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 947f6829af0SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 948f6829af0SVijay Mahadevan } 949f6829af0SVijay Mahadevan 950f6829af0SVijay Mahadevan bs = dmmoab->bs; 951f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 952f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 953f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 954f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 955f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 956f6829af0SVijay Mahadevan } 957f6829af0SVijay Mahadevan 958f6829af0SVijay Mahadevan totsize=dmmoab->vlocal->size(); 959f6829af0SVijay Mahadevan if (totsize != dmmoab->nloc+dmmoab->nghost) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.",totsize,dmmoab->nloc+dmmoab->nghost); 960f6829af0SVijay Mahadevan ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr); 961f6829af0SVijay Mahadevan { 962f6829af0SVijay Mahadevan /* first get the local indices */ 963f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 964f6829af0SVijay Mahadevan /* next get the ghosted indices */ 965f6829af0SVijay Mahadevan if (dmmoab->nghost) { 966f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 967f6829af0SVijay Mahadevan } 968f6829af0SVijay Mahadevan 969f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 970f6829af0SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 971f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 972f6829af0SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 973f6829af0SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 974f6829af0SVijay Mahadevan } 975f6829af0SVijay Mahadevan 976f6829af0SVijay Mahadevan ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 977f6829af0SVijay Mahadevan 978f6829af0SVijay Mahadevan /* set the GID map */ 979f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 980f6829af0SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 981f6829af0SVijay Mahadevan } 982f6829af0SVijay Mahadevan lmin-=gmin; 983f6829af0SVijay Mahadevan lmax-=gmin; 984f6829af0SVijay Mahadevan 985f6829af0SVijay Mahadevan PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 986f6829af0SVijay Mahadevan } 98782dfd14aSVijay 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); 988f6829af0SVijay Mahadevan 989f6829af0SVijay Mahadevan { 990f6829af0SVijay Mahadevan ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr); 991f6829af0SVijay Mahadevan ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr); 992f6829af0SVijay Mahadevan ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->llmap);CHKERRQ(ierr); 993f6829af0SVijay Mahadevan ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr); 994f6829af0SVijay Mahadevan 995f6829af0SVijay Mahadevan i=j=0; 996f6829af0SVijay Mahadevan /* set the owned vertex data first */ 997f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 998f6829af0SVijay Mahadevan vent=(PetscInt)(*iter); 999f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1000f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1001f6829af0SVijay Mahadevan if (bs > 1) { 1002f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1003f6829af0SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 1004f6829af0SVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 1005f6829af0SVijay Mahadevan } 1006f6829af0SVijay Mahadevan } 1007f6829af0SVijay Mahadevan else { 1008f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1009f6829af0SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 1010f6829af0SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 1011f6829af0SVijay Mahadevan } 1012f6829af0SVijay Mahadevan } 1013f6829af0SVijay Mahadevan } 1014f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1015f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 1016f6829af0SVijay Mahadevan vent=(PetscInt)(*iter); 1017f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1018f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1019f6829af0SVijay Mahadevan if (bs > 1) { 1020f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1021f6829af0SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 1022f6829af0SVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 1023f6829af0SVijay Mahadevan } 1024f6829af0SVijay Mahadevan } 1025f6829af0SVijay Mahadevan else { 1026f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1027f6829af0SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 1028f6829af0SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 1029f6829af0SVijay Mahadevan } 1030f6829af0SVijay Mahadevan } 1031f6829af0SVijay Mahadevan } 1032f6829af0SVijay Mahadevan 1033f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1034f6829af0SVijay Mahadevan 1) First create a local and global vector 1035f6829af0SVijay Mahadevan 2) Create a local and global IS 1036f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1037f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1038f6829af0SVijay Mahadevan */ 1039f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 1040f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 1041f6829af0SVijay Mahadevan 1042f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 1043f6829af0SVijay Mahadevan PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost); 1044f6829af0SVijay Mahadevan 1045f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 1046f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr); 1047f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr); 1048f6829af0SVijay Mahadevan 1049f6829af0SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 1050f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr); 1051f6829af0SVijay Mahadevan 1052f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1053f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 105482dfd14aSVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,dmmoab->lgmap, 1055f6829af0SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 1056f6829af0SVijay Mahadevan } 1057f6829af0SVijay Mahadevan 1058f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 1059f6829af0SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 1060f6829af0SVijay Mahadevan 1061f6829af0SVijay Mahadevan /* clean up IS, Vec */ 1062f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 1063f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 1064f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 1065f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 1066f6829af0SVijay Mahadevan } 1067f6829af0SVijay Mahadevan 1068f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 1069f6829af0SVijay Mahadevan { 1070f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1071f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1072f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1073f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1074f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1075f6829af0SVijay Mahadevan 1076f6829af0SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 1077f6829af0SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 1078f6829af0SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1079f6829af0SVijay Mahadevan 1080f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 1081f6829af0SVijay 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 1082f6829af0SVijay Mahadevan 1083f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1084f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1085f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 1086f6829af0SVijay Mahadevan 1087f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1088f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 1089f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 1090f6829af0SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 1091f6829af0SVijay Mahadevan } 1092f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1093f6829af0SVijay Mahadevan } 1094f6829af0SVijay Mahadevan 1095f6829af0SVijay Mahadevan 1096f6829af0SVijay Mahadevan #undef __FUNCT__ 1097f6829af0SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab" 1098f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1099f6829af0SVijay Mahadevan { 1100f6829af0SVijay Mahadevan PetscErrorCode ierr; 1101f6829af0SVijay Mahadevan 1102f6829af0SVijay Mahadevan PetscFunctionBegin; 1103f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1104f90c3b0eSVijay Mahadevan ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr); 1105f6829af0SVijay Mahadevan 1106f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1107f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1108f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1109f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1110f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1111f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1112f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1113f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1114f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 1115f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 1116f6829af0SVijay Mahadevan 1117f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1118f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1119f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1120f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1121f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1122f6829af0SVijay Mahadevan 1123f6829af0SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1124f6829af0SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1125f6829af0SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1126f6829af0SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1127f6829af0SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 11282e4e7c01SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1129f6829af0SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1130f6829af0SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1131f6829af0SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1132f6829af0SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1133f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1134f6829af0SVijay Mahadevan } 1135f6829af0SVijay Mahadevan 1136