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; 8185d305f5SVijay Mahadevan DM dmmb; 82853cdec3SJed Brown DM_Moab *dmmoab; 831d72bce8STim Tautges 841d72bce8STim Tautges PetscFunctionBegin; 85032b8ab6SVijay Mahadevan PetscValidPointer(dmb,6); 8685d305f5SVijay Mahadevan 8785d305f5SVijay Mahadevan ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr); 8885d305f5SVijay Mahadevan dmmoab = (DM_Moab*)(dmmb)->data; 89a4d2169cSTim Tautges 90a4d2169cSTim Tautges if (!mbiface) { 9172ff976dSVijay Mahadevan dmmoab->mbiface = new moab::Core(); 927d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_TRUE; 931d72bce8STim Tautges } 941cec0304SVijay Mahadevan else { 951cec0304SVijay Mahadevan dmmoab->mbiface = mbiface; 967d89fc02STim Tautges dmmoab->icreatedinstance = PETSC_FALSE; 971cec0304SVijay Mahadevan } 981cec0304SVijay Mahadevan 99b5410836SVijay Mahadevan /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */ 100b5410836SVijay Mahadevan dmmoab->fileset=0; 1017d89fc02STim Tautges 102a4d2169cSTim Tautges if (!pcomm) { 103032b8ab6SVijay Mahadevan ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr); 104032b8ab6SVijay Mahadevan ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr); 105032b8ab6SVijay Mahadevan 106db66d124SVijay Mahadevan /* Create root sets for each mesh. Then pass these 107db66d124SVijay Mahadevan to the load_file functions to be populated. */ 1080c8a2322SVijay Mahadevan merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr); 109032b8ab6SVijay Mahadevan 110db66d124SVijay Mahadevan /* Create the parallel communicator object with the partition handle associated with MOAB */ 11172ff976dSVijay Mahadevan dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm); 11272ff976dSVijay Mahadevan } 11372ff976dSVijay Mahadevan else { 11485d305f5SVijay Mahadevan ierr = DMMoabSetParallelComm(dmmb, pcomm);CHKERRQ(ierr); 115032b8ab6SVijay Mahadevan } 116032b8ab6SVijay Mahadevan 1174973de03SVijay Mahadevan /* do the remaining initializations for DMMoab */ 1184973de03SVijay Mahadevan dmmoab->bs = 1; 119addae81cSVijay Mahadevan dmmoab->numFields = 1; 1202e4e7c01SVijay Mahadevan dmmoab->rw_dbglevel = 0; 1212e4e7c01SVijay Mahadevan dmmoab->partition_by_rank = PETSC_FALSE; 1222e4e7c01SVijay Mahadevan dmmoab->extra_read_options[0] = '\0'; 1232e4e7c01SVijay Mahadevan dmmoab->extra_write_options[0] = '\0'; 1242e4e7c01SVijay Mahadevan dmmoab->read_mode = READ_PART; 1252e4e7c01SVijay Mahadevan dmmoab->write_mode = WRITE_PART; 1264973de03SVijay Mahadevan 1274973de03SVijay Mahadevan /* set global ID tag handle */ 1281a845d2aSVijay Mahadevan if (ltog_tag && *ltog_tag) { 12985d305f5SVijay Mahadevan ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr); 130032b8ab6SVijay Mahadevan } 131032b8ab6SVijay Mahadevan else { 1321a845d2aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1331a845d2aSVijay Mahadevan if (ltog_tag) *ltog_tag = dmmoab->ltog_tag; 134a4d2169cSTim Tautges } 135a4d2169cSTim Tautges 136340f3b9aSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr); 137340f3b9aSVijay Mahadevan 1384973de03SVijay Mahadevan /* set the local range of entities (vertices) of interest */ 139a4d2169cSTim Tautges if (range) { 14085d305f5SVijay Mahadevan ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr); 141a4d2169cSTim Tautges } 14285d305f5SVijay Mahadevan *dmb=dmmb; 1431d72bce8STim Tautges PetscFunctionReturn(0); 1441d72bce8STim Tautges } 1451d72bce8STim Tautges 1461d72bce8STim Tautges #undef __FUNCT__ 1471d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm" 148aa768e4cSTim Tautges /*@ 149aa768e4cSTim Tautges DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab 150aa768e4cSTim Tautges 151aa768e4cSTim Tautges Collective on MPI_Comm 152aa768e4cSTim Tautges 153aa768e4cSTim Tautges Input Parameter: 154aa768e4cSTim Tautges . dm - The DMMoab object being set 155aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab 156aa768e4cSTim Tautges 157aa768e4cSTim Tautges Level: beginner 158aa768e4cSTim Tautges 159aa768e4cSTim Tautges .keywords: DMMoab, create 160aa768e4cSTim Tautges @*/ 1611d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm) 1621d72bce8STim Tautges { 163032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 164032b8ab6SVijay Mahadevan 1651d72bce8STim Tautges PetscFunctionBegin; 1661d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1671cec0304SVijay Mahadevan PetscValidPointer(pcomm,2); 168032b8ab6SVijay Mahadevan dmmoab->pcomm = pcomm; 169032b8ab6SVijay Mahadevan dmmoab->mbiface = pcomm->get_moab(); 170032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 1711d72bce8STim Tautges PetscFunctionReturn(0); 1721d72bce8STim Tautges } 1731d72bce8STim Tautges 1741d72bce8STim Tautges 1751d72bce8STim Tautges #undef __FUNCT__ 1761d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm" 177aa768e4cSTim Tautges /*@ 178aa768e4cSTim Tautges DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab 179aa768e4cSTim Tautges 180aa768e4cSTim Tautges Collective on MPI_Comm 181aa768e4cSTim Tautges 182aa768e4cSTim Tautges Input Parameter: 183aa768e4cSTim Tautges . dm - The DMMoab object being set 184aa768e4cSTim Tautges 185aa768e4cSTim Tautges Output Parameter: 186aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab 187aa768e4cSTim Tautges 188aa768e4cSTim Tautges Level: beginner 189aa768e4cSTim Tautges 190aa768e4cSTim Tautges .keywords: DMMoab, create 191aa768e4cSTim Tautges @*/ 1921d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm) 1931d72bce8STim Tautges { 1941d72bce8STim Tautges PetscFunctionBegin; 1951d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 196032b8ab6SVijay Mahadevan *pcomm = ((DM_Moab*)(dm)->data)->pcomm; 1971d72bce8STim Tautges PetscFunctionReturn(0); 1981d72bce8STim Tautges } 1991d72bce8STim Tautges 2001d72bce8STim Tautges 2011d72bce8STim Tautges #undef __FUNCT__ 2021d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface" 203aa768e4cSTim Tautges /*@ 204aa768e4cSTim Tautges DMMoabSetInterface - Set the MOAB instance 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 . mbiface - The MOAB instance being set on this DMMoab 211aa768e4cSTim Tautges 212aa768e4cSTim Tautges Level: beginner 213aa768e4cSTim Tautges 214aa768e4cSTim Tautges .keywords: DMMoab, create 215aa768e4cSTim Tautges @*/ 216a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface) 2171d72bce8STim Tautges { 218032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 219032b8ab6SVijay Mahadevan 2201d72bce8STim Tautges PetscFunctionBegin; 2211d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2221cec0304SVijay Mahadevan PetscValidPointer(mbiface,2); 223032b8ab6SVijay Mahadevan dmmoab->pcomm = NULL; 224032b8ab6SVijay Mahadevan dmmoab->mbiface = mbiface; 225032b8ab6SVijay Mahadevan dmmoab->icreatedinstance = PETSC_FALSE; 2261d72bce8STim Tautges PetscFunctionReturn(0); 2271d72bce8STim Tautges } 2281d72bce8STim Tautges 2291d72bce8STim Tautges 2301d72bce8STim Tautges #undef __FUNCT__ 2311d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface" 232aa768e4cSTim Tautges /*@ 233aa768e4cSTim Tautges DMMoabGetInterface - Get the MOAB instance used with this DMMoab 234aa768e4cSTim Tautges 235aa768e4cSTim Tautges Collective on MPI_Comm 236aa768e4cSTim Tautges 237aa768e4cSTim Tautges Input Parameter: 238aa768e4cSTim Tautges . dm - The DMMoab object being set 239aa768e4cSTim Tautges 240aa768e4cSTim Tautges Output Parameter: 241aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab 242aa768e4cSTim Tautges 243aa768e4cSTim Tautges Level: beginner 244aa768e4cSTim Tautges 245aa768e4cSTim Tautges .keywords: DMMoab, create 246aa768e4cSTim Tautges @*/ 247a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface) 2481d72bce8STim Tautges { 2499426e041SSatish Balay PetscErrorCode ierr; 250cabb514dSBarry Smith static PetscBool cite = PETSC_FALSE; 251cabb514dSBarry Smith 2521d72bce8STim Tautges PetscFunctionBegin; 2531d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 254cabb514dSBarry 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); 255a4d2169cSTim Tautges *mbiface = ((DM_Moab*)dm->data)->mbiface; 2561d72bce8STim Tautges PetscFunctionReturn(0); 2571d72bce8STim Tautges } 2581d72bce8STim Tautges 2591d72bce8STim Tautges 2601d72bce8STim Tautges #undef __FUNCT__ 2615eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices" 262aa768e4cSTim Tautges /*@ 2635eb88e9dSVijay Mahadevan DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab 264aa768e4cSTim Tautges 265aa768e4cSTim Tautges Collective on MPI_Comm 266aa768e4cSTim Tautges 267aa768e4cSTim Tautges Input Parameter: 268aa768e4cSTim Tautges . dm - The DMMoab object being set 269aa768e4cSTim Tautges . range - The entities treated by this DMMoab 270aa768e4cSTim Tautges 271aa768e4cSTim Tautges Level: beginner 272aa768e4cSTim Tautges 273aa768e4cSTim Tautges .keywords: DMMoab, create 274aa768e4cSTim Tautges @*/ 2755eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range) 2761d72bce8STim Tautges { 277032b8ab6SVijay Mahadevan moab::ErrorCode merr; 278032b8ab6SVijay Mahadevan PetscErrorCode ierr; 279fd3326ddSVijay Mahadevan moab::Range tmpvtxs; 280032b8ab6SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 281032b8ab6SVijay Mahadevan 2821d72bce8STim Tautges PetscFunctionBegin; 2831d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 284032b8ab6SVijay Mahadevan dmmoab->vlocal->clear(); 285032b8ab6SVijay Mahadevan dmmoab->vowned->clear(); 286fd3326ddSVijay Mahadevan 287032b8ab6SVijay Mahadevan dmmoab->vlocal->insert(range->begin(), range->end()); 288fd3326ddSVijay Mahadevan 289fd3326ddSVijay Mahadevan /* filter based on parallel status */ 290fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 291fd3326ddSVijay Mahadevan 292fd3326ddSVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 293fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 294fd3326ddSVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 295fd3326ddSVijay Mahadevan tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost); 296fd3326ddSVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs); 297fd3326ddSVijay Mahadevan 298fd3326ddSVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 299032b8ab6SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 300032b8ab6SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 301032b8ab6SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 3021d72bce8STim Tautges PetscFunctionReturn(0); 3031d72bce8STim Tautges } 3041d72bce8STim Tautges 3051d72bce8STim Tautges 3061d72bce8STim Tautges #undef __FUNCT__ 3078d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices" 3088d8d51c8SVijay Mahadevan /*@ 3098d8d51c8SVijay Mahadevan DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab 3108d8d51c8SVijay Mahadevan 3118d8d51c8SVijay Mahadevan Collective on MPI_Comm 3128d8d51c8SVijay Mahadevan 3138d8d51c8SVijay Mahadevan Input Parameter: 3148d8d51c8SVijay Mahadevan . dm - The DMMoab object being set 3158d8d51c8SVijay Mahadevan 3168d8d51c8SVijay Mahadevan Output Parameter: 3178d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted) 3188d8d51c8SVijay Mahadevan 3198d8d51c8SVijay Mahadevan Level: beginner 3208d8d51c8SVijay Mahadevan 3218d8d51c8SVijay Mahadevan .keywords: DMMoab, create 3228d8d51c8SVijay Mahadevan @*/ 3238d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local) 3248d8d51c8SVijay Mahadevan { 3258d8d51c8SVijay Mahadevan PetscFunctionBegin; 3268d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3278d8d51c8SVijay Mahadevan if (local) *local = *((DM_Moab*)dm->data)->vlocal; 3288d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 3298d8d51c8SVijay Mahadevan } 3308d8d51c8SVijay Mahadevan 3318d8d51c8SVijay Mahadevan 3328d8d51c8SVijay Mahadevan 3338d8d51c8SVijay Mahadevan #undef __FUNCT__ 3345eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices" 335aa768e4cSTim Tautges /*@ 3365eb88e9dSVijay Mahadevan DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab 337aa768e4cSTim Tautges 338aa768e4cSTim Tautges Collective on MPI_Comm 339aa768e4cSTim Tautges 340aa768e4cSTim Tautges Input Parameter: 341aa768e4cSTim Tautges . dm - The DMMoab object being set 342aa768e4cSTim Tautges 343aa768e4cSTim Tautges Output Parameter: 3445eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab 3455eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition 346aa768e4cSTim Tautges 347aa768e4cSTim Tautges Level: beginner 348aa768e4cSTim Tautges 349aa768e4cSTim Tautges .keywords: DMMoab, create 350aa768e4cSTim Tautges @*/ 351351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost) 3521d72bce8STim Tautges { 3531d72bce8STim Tautges PetscFunctionBegin; 3541d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 355351b8a77SVijay Mahadevan if (owned) *owned = ((DM_Moab*)dm->data)->vowned; 356351b8a77SVijay Mahadevan if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost; 3571d72bce8STim Tautges PetscFunctionReturn(0); 3581d72bce8STim Tautges } 3591d72bce8STim Tautges 3601d72bce8STim Tautges #undef __FUNCT__ 3615eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements" 3625eb88e9dSVijay Mahadevan /*@ 3635eb88e9dSVijay Mahadevan DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned 3645eb88e9dSVijay Mahadevan 3655eb88e9dSVijay Mahadevan Collective on MPI_Comm 3665eb88e9dSVijay Mahadevan 3675eb88e9dSVijay Mahadevan Input Parameter: 3685eb88e9dSVijay Mahadevan . dm - The DMMoab object being set 3695eb88e9dSVijay Mahadevan 3705eb88e9dSVijay Mahadevan Output Parameter: 3715eb88e9dSVijay Mahadevan . range - The entities owned locally 3725eb88e9dSVijay Mahadevan 3735eb88e9dSVijay Mahadevan Level: beginner 3745eb88e9dSVijay Mahadevan 3755eb88e9dSVijay Mahadevan .keywords: DMMoab, create 3765eb88e9dSVijay Mahadevan @*/ 377351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range) 3785eb88e9dSVijay Mahadevan { 3795eb88e9dSVijay Mahadevan PetscFunctionBegin; 3805eb88e9dSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 381351b8a77SVijay Mahadevan if (range) *range = ((DM_Moab*)dm->data)->elocal; 3821cec0304SVijay Mahadevan PetscFunctionReturn(0); 3831cec0304SVijay Mahadevan } 3841cec0304SVijay Mahadevan 3851cec0304SVijay Mahadevan 3861cec0304SVijay Mahadevan #undef __FUNCT__ 3871cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements" 3881cec0304SVijay Mahadevan /*@ 3891cec0304SVijay Mahadevan DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab 3901cec0304SVijay Mahadevan 3911cec0304SVijay Mahadevan Collective on MPI_Comm 3921cec0304SVijay Mahadevan 3931cec0304SVijay Mahadevan Input Parameter: 3941cec0304SVijay Mahadevan . dm - The DMMoab object being set 3951cec0304SVijay Mahadevan . range - The entities treated by this DMMoab 3961cec0304SVijay Mahadevan 3971cec0304SVijay Mahadevan Level: beginner 3981cec0304SVijay Mahadevan 3991cec0304SVijay Mahadevan .keywords: DMMoab, create 4001cec0304SVijay Mahadevan @*/ 4011cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range) 4021cec0304SVijay Mahadevan { 4031cec0304SVijay Mahadevan moab::ErrorCode merr; 4041cec0304SVijay Mahadevan PetscErrorCode ierr; 4051cec0304SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)(dm)->data; 4061cec0304SVijay Mahadevan 4071cec0304SVijay Mahadevan PetscFunctionBegin; 4081cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4091cec0304SVijay Mahadevan dmmoab->elocal->clear(); 4101cec0304SVijay Mahadevan dmmoab->eghost->clear(); 4111cec0304SVijay Mahadevan dmmoab->elocal->insert(range->begin(), range->end()); 4121cec0304SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 4131cec0304SVijay Mahadevan *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal); 4141cec0304SVijay Mahadevan dmmoab->neleloc=dmmoab->elocal->size(); 41541dd5348SVijay Mahadevan dmmoab->neleghost=dmmoab->eghost->size(); 4161cec0304SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 4178cbae1a6SVijay Mahadevan PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele); 4185eb88e9dSVijay Mahadevan PetscFunctionReturn(0); 4195eb88e9dSVijay Mahadevan } 4205eb88e9dSVijay Mahadevan 4215eb88e9dSVijay Mahadevan 4225eb88e9dSVijay Mahadevan #undef __FUNCT__ 4231d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag" 424aa768e4cSTim Tautges /*@ 425aa768e4cSTim Tautges DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering 426aa768e4cSTim Tautges 427aa768e4cSTim Tautges Collective on MPI_Comm 428aa768e4cSTim Tautges 429aa768e4cSTim Tautges Input Parameter: 430aa768e4cSTim Tautges . dm - The DMMoab object being set 431aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 432aa768e4cSTim Tautges 433aa768e4cSTim Tautges Level: beginner 434aa768e4cSTim Tautges 435aa768e4cSTim Tautges .keywords: DMMoab, create 436aa768e4cSTim Tautges @*/ 4371d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag) 4381d72bce8STim Tautges { 4391d72bce8STim Tautges PetscFunctionBegin; 4401d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4411d72bce8STim Tautges ((DM_Moab*)dm->data)->ltog_tag = ltogtag; 4421d72bce8STim Tautges PetscFunctionReturn(0); 4431d72bce8STim Tautges } 4441d72bce8STim Tautges 4451d72bce8STim Tautges 4461d72bce8STim Tautges #undef __FUNCT__ 4471d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag" 448aa768e4cSTim Tautges /*@ 449aa768e4cSTim Tautges DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering 450aa768e4cSTim Tautges 451aa768e4cSTim Tautges Collective on MPI_Comm 452aa768e4cSTim Tautges 453aa768e4cSTim Tautges Input Parameter: 454aa768e4cSTim Tautges . dm - The DMMoab object being set 455aa768e4cSTim Tautges 456aa768e4cSTim Tautges Output Parameter: 457aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids 458aa768e4cSTim Tautges 459aa768e4cSTim Tautges Level: beginner 460aa768e4cSTim Tautges 461aa768e4cSTim Tautges .keywords: DMMoab, create 462aa768e4cSTim Tautges @*/ 4631d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag) 4641d72bce8STim Tautges { 4651d72bce8STim Tautges PetscFunctionBegin; 4661d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4671d72bce8STim Tautges *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag; 4681d72bce8STim Tautges PetscFunctionReturn(0); 4691d72bce8STim Tautges } 4701d72bce8STim Tautges 4711d72bce8STim Tautges 4721d72bce8STim Tautges #undef __FUNCT__ 4731d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize" 474aa768e4cSTim Tautges /*@ 475aa768e4cSTim Tautges DMMoabSetBlockSize - Set the block size used with this DMMoab 476aa768e4cSTim Tautges 477aa768e4cSTim Tautges Collective on MPI_Comm 478aa768e4cSTim Tautges 479aa768e4cSTim Tautges Input Parameter: 480aa768e4cSTim Tautges . dm - The DMMoab object being set 481aa768e4cSTim Tautges . bs - The block size used with this DMMoab 482aa768e4cSTim Tautges 483aa768e4cSTim Tautges Level: beginner 484aa768e4cSTim Tautges 485aa768e4cSTim Tautges .keywords: DMMoab, create 486aa768e4cSTim Tautges @*/ 4871d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs) 4881d72bce8STim Tautges { 4891d72bce8STim Tautges PetscFunctionBegin; 4901d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4911d72bce8STim Tautges ((DM_Moab*)dm->data)->bs = bs; 4921d72bce8STim Tautges PetscFunctionReturn(0); 4931d72bce8STim Tautges } 4941d72bce8STim Tautges 4951d72bce8STim Tautges 4961d72bce8STim Tautges #undef __FUNCT__ 4971d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize" 498aa768e4cSTim Tautges /*@ 499aa768e4cSTim Tautges DMMoabGetBlockSize - Get the block size used with this DMMoab 500aa768e4cSTim Tautges 501aa768e4cSTim Tautges Collective on MPI_Comm 502aa768e4cSTim Tautges 503aa768e4cSTim Tautges Input Parameter: 504aa768e4cSTim Tautges . dm - The DMMoab object being set 505aa768e4cSTim Tautges 506aa768e4cSTim Tautges Output Parameter: 507aa768e4cSTim Tautges . bs - The block size used with this DMMoab 508aa768e4cSTim Tautges 509aa768e4cSTim Tautges Level: beginner 510aa768e4cSTim Tautges 511aa768e4cSTim Tautges .keywords: DMMoab, create 512aa768e4cSTim Tautges @*/ 5131d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs) 5141d72bce8STim Tautges { 5151d72bce8STim Tautges PetscFunctionBegin; 5161d72bce8STim Tautges PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5171d72bce8STim Tautges *bs = ((DM_Moab*)dm->data)->bs; 5181d72bce8STim Tautges PetscFunctionReturn(0); 5191d72bce8STim Tautges } 5201d72bce8STim Tautges 5211cec0304SVijay Mahadevan 5221cec0304SVijay Mahadevan #undef __FUNCT__ 523212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize" 524212ad6d1SVijay Mahadevan /*@ 525212ad6d1SVijay Mahadevan DMMoabGetSize - Get the global vertex size used with this DMMoab 526212ad6d1SVijay Mahadevan 52700cc10feSVijay Mahadevan Collective on DM 528212ad6d1SVijay Mahadevan 529212ad6d1SVijay Mahadevan Input Parameter: 530212ad6d1SVijay Mahadevan . dm - The DMMoab object being set 531212ad6d1SVijay Mahadevan 532212ad6d1SVijay Mahadevan Output Parameter: 53300cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance 53400cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance 535212ad6d1SVijay Mahadevan 536212ad6d1SVijay Mahadevan Level: beginner 537212ad6d1SVijay Mahadevan 538212ad6d1SVijay Mahadevan .keywords: DMMoab, create 539212ad6d1SVijay Mahadevan @*/ 54041dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg) 541212ad6d1SVijay Mahadevan { 542212ad6d1SVijay Mahadevan PetscFunctionBegin; 543212ad6d1SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 54441dd5348SVijay Mahadevan if(neg) *neg = ((DM_Moab*)dm->data)->nele; 54541dd5348SVijay Mahadevan if(nvg) *nvg = ((DM_Moab*)dm->data)->n; 546212ad6d1SVijay Mahadevan PetscFunctionReturn(0); 547212ad6d1SVijay Mahadevan } 548212ad6d1SVijay Mahadevan 549212ad6d1SVijay Mahadevan 550212ad6d1SVijay Mahadevan #undef __FUNCT__ 551212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize" 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 582212ad6d1SVijay Mahadevan #undef __FUNCT__ 58300cc10feSVijay Mahadevan #define __FUNCT__ "DMMoabGetOffset" 58400cc10feSVijay Mahadevan /*@ 58500cc10feSVijay Mahadevan DMMoabGetOffset - Get the local offset for the global vector 58600cc10feSVijay Mahadevan 58700cc10feSVijay Mahadevan Collective on MPI_Comm 58800cc10feSVijay Mahadevan 58900cc10feSVijay Mahadevan Input Parameter: 59000cc10feSVijay Mahadevan . dm - The DMMoab object being set 59100cc10feSVijay Mahadevan 59200cc10feSVijay Mahadevan Output Parameter: 59300cc10feSVijay Mahadevan . offset - The local offset for the global vector 59400cc10feSVijay Mahadevan 59500cc10feSVijay Mahadevan Level: beginner 59600cc10feSVijay Mahadevan 59700cc10feSVijay Mahadevan .keywords: DMMoab, create 59800cc10feSVijay Mahadevan @*/ 59900cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset) 60000cc10feSVijay Mahadevan { 60100cc10feSVijay Mahadevan PetscFunctionBegin; 60200cc10feSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 60300cc10feSVijay Mahadevan *offset = ((DM_Moab*)dm->data)->vstart; 60400cc10feSVijay Mahadevan PetscFunctionReturn(0); 60500cc10feSVijay Mahadevan } 60600cc10feSVijay Mahadevan 60700cc10feSVijay Mahadevan 60800cc10feSVijay Mahadevan #undef __FUNCT__ 6094920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension" 6104920ab11SVijay Mahadevan /*@ 6114920ab11SVijay Mahadevan DMMoabGetDimension - Get the dimension of the DM Mesh 6124920ab11SVijay Mahadevan 6134920ab11SVijay Mahadevan Collective on MPI_Comm 6144920ab11SVijay Mahadevan 6154920ab11SVijay Mahadevan Input Parameter: 616340f3b9aSVijay Mahadevan . dm - The DMMoab object 6174920ab11SVijay Mahadevan 6184920ab11SVijay Mahadevan Output Parameter: 6194920ab11SVijay Mahadevan . dim - The dimension of DM 6204920ab11SVijay Mahadevan 6214920ab11SVijay Mahadevan Level: beginner 6224920ab11SVijay Mahadevan 6234920ab11SVijay Mahadevan .keywords: DMMoab, create 6244920ab11SVijay Mahadevan @*/ 6254920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim) 6264920ab11SVijay Mahadevan { 6274920ab11SVijay Mahadevan PetscFunctionBegin; 6284920ab11SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6294920ab11SVijay Mahadevan *dim = ((DM_Moab*)dm->data)->dim; 6304920ab11SVijay Mahadevan PetscFunctionReturn(0); 6314920ab11SVijay Mahadevan } 6324920ab11SVijay Mahadevan 6334920ab11SVijay Mahadevan 634340f3b9aSVijay Mahadevan #undef __FUNCT__ 635340f3b9aSVijay Mahadevan #define __FUNCT__ "DMMoabGetMaterialBlock" 636340f3b9aSVijay Mahadevan /*@ 637340f3b9aSVijay Mahadevan DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh 638340f3b9aSVijay Mahadevan 639340f3b9aSVijay Mahadevan Collective on MPI_Comm 640340f3b9aSVijay Mahadevan 641340f3b9aSVijay Mahadevan Input Parameter: 642340f3b9aSVijay Mahadevan . dm - The DMMoab object 643340f3b9aSVijay Mahadevan . ehandle - The element entity handle 644340f3b9aSVijay Mahadevan 645340f3b9aSVijay Mahadevan Output Parameter: 646340f3b9aSVijay Mahadevan . mat - The material ID for the current entity 647340f3b9aSVijay Mahadevan 648340f3b9aSVijay Mahadevan Level: beginner 649340f3b9aSVijay Mahadevan 650340f3b9aSVijay Mahadevan .keywords: DMMoab, create 651340f3b9aSVijay Mahadevan @*/ 652340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat) 653340f3b9aSVijay Mahadevan { 654340f3b9aSVijay Mahadevan DM_Moab *dmmoab; 655340f3b9aSVijay Mahadevan moab::ErrorCode merr; 656340f3b9aSVijay Mahadevan 657340f3b9aSVijay Mahadevan PetscFunctionBegin; 658340f3b9aSVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 659340f3b9aSVijay Mahadevan if (*mat) { 660340f3b9aSVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 66163cd93b2SVijay Mahadevan merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr); 662340f3b9aSVijay Mahadevan } 663340f3b9aSVijay Mahadevan PetscFunctionReturn(0); 664340f3b9aSVijay Mahadevan } 665340f3b9aSVijay Mahadevan 6664920ab11SVijay Mahadevan 6674920ab11SVijay Mahadevan #undef __FUNCT__ 6687023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates" 66985d305f5SVijay Mahadevan /*@ 67085d305f5SVijay Mahadevan DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities 67185d305f5SVijay Mahadevan 67285d305f5SVijay Mahadevan Collective on MPI_Comm 67385d305f5SVijay Mahadevan 67485d305f5SVijay Mahadevan Input Parameter: 67585d305f5SVijay Mahadevan . dm - The DMMoab object 67685d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 67785d305f5SVijay Mahadevan . conn - The vertex entity handles 67885d305f5SVijay Mahadevan 67985d305f5SVijay Mahadevan Output Parameter: 68085d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities 68185d305f5SVijay Mahadevan 68285d305f5SVijay Mahadevan Level: beginner 68385d305f5SVijay Mahadevan 68485d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity() 68585d305f5SVijay Mahadevan @*/ 686cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscReal *vpos) 6877023aa44SVijay Mahadevan { 6887023aa44SVijay Mahadevan DM_Moab *dmmoab; 6897023aa44SVijay Mahadevan PetscErrorCode ierr; 6907023aa44SVijay Mahadevan moab::ErrorCode merr; 6917023aa44SVijay Mahadevan 6927023aa44SVijay Mahadevan PetscFunctionBegin; 6937023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 6947023aa44SVijay Mahadevan PetscValidPointer(conn,3); 6957023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 6967023aa44SVijay Mahadevan 6977023aa44SVijay Mahadevan if (!vpos) { 6987ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr); 6997023aa44SVijay Mahadevan } 7007023aa44SVijay Mahadevan 7017023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 7027023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr); 7037023aa44SVijay Mahadevan PetscFunctionReturn(0); 7047023aa44SVijay Mahadevan } 7057023aa44SVijay Mahadevan 7067023aa44SVijay Mahadevan 7077023aa44SVijay Mahadevan #undef __FUNCT__ 7088d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity" 70985d305f5SVijay Mahadevan /*@ 71085d305f5SVijay Mahadevan DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity 71185d305f5SVijay Mahadevan 71285d305f5SVijay Mahadevan Collective on MPI_Comm 71385d305f5SVijay Mahadevan 71485d305f5SVijay Mahadevan Input Parameter: 71585d305f5SVijay Mahadevan . dm - The DMMoab object 71685d305f5SVijay Mahadevan . vhandle - Vertex entity handle 71785d305f5SVijay Mahadevan 71885d305f5SVijay Mahadevan Output Parameter: 71985d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 72085d305f5SVijay Mahadevan . conn - The vertex entity handles 72185d305f5SVijay Mahadevan 72285d305f5SVijay Mahadevan Level: beginner 72385d305f5SVijay Mahadevan 72485d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity() 72585d305f5SVijay Mahadevan @*/ 72685d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt* nconn, moab::EntityHandle **conn) 7278d8d51c8SVijay Mahadevan { 7288d8d51c8SVijay Mahadevan DM_Moab *dmmoab; 7298d8d51c8SVijay Mahadevan std::vector<moab::EntityHandle> adj_entities,connect; 7308d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7318d8d51c8SVijay Mahadevan moab::ErrorCode merr; 7328d8d51c8SVijay Mahadevan 7338d8d51c8SVijay Mahadevan PetscFunctionBegin; 7348d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7358d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 7368d8d51c8SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 7378d8d51c8SVijay Mahadevan 7388d8d51c8SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 73985d305f5SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr); 7408d8d51c8SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr); 7418d8d51c8SVijay Mahadevan 7428d8d51c8SVijay Mahadevan if (conn) { 7438d8d51c8SVijay Mahadevan ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr); 7448d8d51c8SVijay Mahadevan ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr); 7458d8d51c8SVijay Mahadevan } 7468d8d51c8SVijay Mahadevan if (nconn) *nconn=connect.size(); 7478d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7488d8d51c8SVijay Mahadevan } 7498d8d51c8SVijay Mahadevan 7508d8d51c8SVijay Mahadevan 7518d8d51c8SVijay Mahadevan #undef __FUNCT__ 7528d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity" 75385d305f5SVijay Mahadevan /*@ 75485d305f5SVijay Mahadevan DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity 75585d305f5SVijay Mahadevan 75685d305f5SVijay Mahadevan Collective on MPI_Comm 75785d305f5SVijay Mahadevan 75885d305f5SVijay Mahadevan Input Parameter: 75985d305f5SVijay Mahadevan . dm - The DMMoab object 76085d305f5SVijay Mahadevan . vhandle - Vertex entity handle 76185d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 76285d305f5SVijay Mahadevan . conn - The vertex entity handles 76385d305f5SVijay Mahadevan 76485d305f5SVijay Mahadevan Level: beginner 76585d305f5SVijay Mahadevan 76685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity() 76785d305f5SVijay Mahadevan @*/ 7688d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn) 7698d8d51c8SVijay Mahadevan { 7708d8d51c8SVijay Mahadevan PetscErrorCode ierr; 7718d8d51c8SVijay Mahadevan 7728d8d51c8SVijay Mahadevan PetscFunctionBegin; 7738d8d51c8SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7748d8d51c8SVijay Mahadevan PetscValidPointer(conn,4); 7758d8d51c8SVijay Mahadevan 7768d8d51c8SVijay Mahadevan if (conn) { 7778d8d51c8SVijay Mahadevan ierr = PetscFree(*conn);CHKERRQ(ierr); 7788d8d51c8SVijay Mahadevan } 7798d8d51c8SVijay Mahadevan if (nconn) *nconn=0; 7808d8d51c8SVijay Mahadevan PetscFunctionReturn(0); 7818d8d51c8SVijay Mahadevan } 7828d8d51c8SVijay Mahadevan 7838d8d51c8SVijay Mahadevan 7848d8d51c8SVijay Mahadevan #undef __FUNCT__ 7857023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity" 78685d305f5SVijay Mahadevan /*@ 78785d305f5SVijay Mahadevan DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity 78885d305f5SVijay Mahadevan 78985d305f5SVijay Mahadevan Collective on MPI_Comm 79085d305f5SVijay Mahadevan 79185d305f5SVijay Mahadevan Input Parameter: 79285d305f5SVijay Mahadevan . dm - The DMMoab object 79385d305f5SVijay Mahadevan . ehandle - Vertex entity handle 79485d305f5SVijay Mahadevan 79585d305f5SVijay Mahadevan Output Parameter: 79685d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed 79785d305f5SVijay Mahadevan . conn - The vertex entity handles 79885d305f5SVijay Mahadevan 79985d305f5SVijay Mahadevan Level: beginner 80085d305f5SVijay Mahadevan 80185d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity() 80285d305f5SVijay Mahadevan @*/ 8037023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn) 8047023aa44SVijay Mahadevan { 8057023aa44SVijay Mahadevan DM_Moab *dmmoab; 8067023aa44SVijay Mahadevan const moab::EntityHandle *connect; 8077023aa44SVijay Mahadevan moab::ErrorCode merr; 8087023aa44SVijay Mahadevan PetscInt nnodes; 8097023aa44SVijay Mahadevan 8107023aa44SVijay Mahadevan PetscFunctionBegin; 8117023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8127023aa44SVijay Mahadevan PetscValidPointer(conn,4); 8137023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 8147023aa44SVijay Mahadevan 8157023aa44SVijay Mahadevan /* Get connectivity information in MOAB canonical ordering */ 8167023aa44SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr); 8177023aa44SVijay Mahadevan if (conn) *conn=connect; 8187023aa44SVijay Mahadevan if (nconn) *nconn=nnodes; 8197023aa44SVijay Mahadevan PetscFunctionReturn(0); 8207023aa44SVijay Mahadevan } 8217023aa44SVijay Mahadevan 8227023aa44SVijay Mahadevan 8237023aa44SVijay Mahadevan #undef __FUNCT__ 82469263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary" 82585d305f5SVijay Mahadevan /*@ 82685d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 82785d305f5SVijay Mahadevan 82885d305f5SVijay Mahadevan Collective on MPI_Comm 82985d305f5SVijay Mahadevan 83085d305f5SVijay Mahadevan Input Parameter: 83185d305f5SVijay Mahadevan . dm - The DMMoab object 83285d305f5SVijay Mahadevan . ent - Entity handle 83385d305f5SVijay Mahadevan 83485d305f5SVijay Mahadevan Output Parameter: 83585d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 83685d305f5SVijay Mahadevan 83785d305f5SVijay Mahadevan Level: beginner 83885d305f5SVijay Mahadevan 83985d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices() 84085d305f5SVijay Mahadevan @*/ 84169263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary) 84269263071SVijay Mahadevan { 84369263071SVijay Mahadevan moab::EntityType etype; 84469263071SVijay Mahadevan DM_Moab *dmmoab; 84569263071SVijay Mahadevan PetscInt edim; 84669263071SVijay Mahadevan 84769263071SVijay Mahadevan PetscFunctionBegin; 84869263071SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 84969263071SVijay Mahadevan PetscValidPointer(ent_on_boundary,3); 85069263071SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 85169263071SVijay Mahadevan 85269263071SVijay Mahadevan /* get the entity type and handle accordingly */ 85369263071SVijay Mahadevan etype=dmmoab->mbiface->type_from_handle(ent); 85469263071SVijay 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); 85569263071SVijay Mahadevan 85669263071SVijay Mahadevan /* get the entity dimension */ 85769263071SVijay Mahadevan edim=dmmoab->mbiface->dimension_from_handle(ent); 85869263071SVijay Mahadevan 85969263071SVijay Mahadevan *ent_on_boundary=PETSC_FALSE; 86069263071SVijay Mahadevan if(etype == moab::MBVERTEX && edim == 0) { 8616d9eb265SVijay Mahadevan if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 86269263071SVijay Mahadevan } 86369263071SVijay Mahadevan else { 86469263071SVijay Mahadevan if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */ 8656d9eb265SVijay Mahadevan if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 86669263071SVijay Mahadevan } 86769263071SVijay Mahadevan else { /* next check the lower-dimensional faces */ 8686d9eb265SVijay Mahadevan if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE; 86969263071SVijay Mahadevan } 87069263071SVijay Mahadevan } 87169263071SVijay Mahadevan PetscFunctionReturn(0); 87269263071SVijay Mahadevan } 87369263071SVijay Mahadevan 87469263071SVijay Mahadevan 87569263071SVijay Mahadevan #undef __FUNCT__ 8767023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices" 87785d305f5SVijay Mahadevan /*@ 87885d305f5SVijay Mahadevan DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element) 87985d305f5SVijay Mahadevan 88085d305f5SVijay Mahadevan Input Parameter: 88185d305f5SVijay Mahadevan . dm - The DMMoab object 88285d305f5SVijay Mahadevan . nconn - Number of handles 88385d305f5SVijay Mahadevan . cnt - Array of entity handles 88485d305f5SVijay Mahadevan 88585d305f5SVijay Mahadevan Output Parameter: 88685d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise 88785d305f5SVijay Mahadevan 88885d305f5SVijay Mahadevan Level: beginner 88985d305f5SVijay Mahadevan 89085d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary() 89185d305f5SVijay Mahadevan @*/ 89269263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx) 8937023aa44SVijay Mahadevan { 8947023aa44SVijay Mahadevan DM_Moab *dmmoab; 8957023aa44SVijay Mahadevan PetscInt i; 8967023aa44SVijay Mahadevan 8977023aa44SVijay Mahadevan PetscFunctionBegin; 8987023aa44SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8997023aa44SVijay Mahadevan PetscValidPointer(cnt,3); 9007023aa44SVijay Mahadevan PetscValidPointer(isbdvtx,4); 9017023aa44SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9027023aa44SVijay Mahadevan 9037023aa44SVijay Mahadevan for (i=0; i < nconn; ++i) { 9046d9eb265SVijay Mahadevan isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE); 9057023aa44SVijay Mahadevan } 9067023aa44SVijay Mahadevan PetscFunctionReturn(0); 9077023aa44SVijay Mahadevan } 9087023aa44SVijay Mahadevan 9097023aa44SVijay Mahadevan 9107023aa44SVijay Mahadevan #undef __FUNCT__ 9110c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers" 91285d305f5SVijay Mahadevan /*@ 91385d305f5SVijay Mahadevan DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary 91485d305f5SVijay Mahadevan 91585d305f5SVijay Mahadevan Input Parameter: 91685d305f5SVijay Mahadevan . dm - The DMMoab object 91785d305f5SVijay Mahadevan 91885d305f5SVijay Mahadevan Output Parameter: 91985d305f5SVijay Mahadevan . bdvtx - Boundary vertices 92085d305f5SVijay Mahadevan . bdelems - Boundary elements 92185d305f5SVijay Mahadevan . bdfaces - Boundary faces 92285d305f5SVijay Mahadevan 92385d305f5SVijay Mahadevan Level: beginner 92485d305f5SVijay Mahadevan 92585d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary() 92685d305f5SVijay Mahadevan @*/ 9276d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces) 9281cec0304SVijay Mahadevan { 9291cec0304SVijay Mahadevan DM_Moab *dmmoab; 9301cec0304SVijay Mahadevan 9311cec0304SVijay Mahadevan PetscFunctionBegin; 9321cec0304SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 9331cec0304SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 9341cec0304SVijay Mahadevan 9356d9eb265SVijay Mahadevan if (bdvtx) *bdvtx = dmmoab->bndyvtx; 9366d9eb265SVijay Mahadevan if (bdfaces) *bdfaces = dmmoab->bndyfaces; 9376d9eb265SVijay Mahadevan if (bdelems) *bdfaces = dmmoab->bndyelems; 9381cec0304SVijay Mahadevan PetscFunctionReturn(0); 9391cec0304SVijay Mahadevan } 9401cec0304SVijay Mahadevan 941f6829af0SVijay Mahadevan 942f6829af0SVijay Mahadevan #undef __FUNCT__ 943f6829af0SVijay Mahadevan #define __FUNCT__ "DMDestroy_Moab" 944f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) 945f6829af0SVijay Mahadevan { 946f6829af0SVijay Mahadevan PetscErrorCode ierr; 94785d305f5SVijay Mahadevan PetscInt i; 948f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 949f6829af0SVijay Mahadevan 950f6829af0SVijay Mahadevan PetscFunctionBegin; 951f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 952f6829af0SVijay Mahadevan if (dmmoab->icreatedinstance) { 953f6829af0SVijay Mahadevan delete dmmoab->mbiface; 954f6829af0SVijay Mahadevan } 955f6829af0SVijay Mahadevan dmmoab->mbiface = NULL; 956f6829af0SVijay Mahadevan dmmoab->pcomm = NULL; 957f6829af0SVijay Mahadevan delete dmmoab->vlocal; 958f6829af0SVijay Mahadevan delete dmmoab->vowned; 959f6829af0SVijay Mahadevan delete dmmoab->vghost; 960f6829af0SVijay Mahadevan delete dmmoab->elocal; 961f6829af0SVijay Mahadevan delete dmmoab->eghost; 962f6829af0SVijay Mahadevan delete dmmoab->bndyvtx; 963f6829af0SVijay Mahadevan delete dmmoab->bndyfaces; 964f6829af0SVijay Mahadevan delete dmmoab->bndyelems; 965f6829af0SVijay Mahadevan 966f6829af0SVijay Mahadevan ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr); 9677ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr); 9687ae5e5b6SVijay Mahadevan ierr = PetscFree2(dmmoab->lgmap,dmmoab->llmap);CHKERRQ(ierr); 9695905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr); 9705905e1eaSVijay Mahadevan ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr); 97185d305f5SVijay Mahadevan if (dmmoab->fieldNames) { 97285d305f5SVijay Mahadevan for(i=0; i<dmmoab->numFields; i++) { 97385d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr); 97485d305f5SVijay Mahadevan } 97585d305f5SVijay Mahadevan ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr); 97685d305f5SVijay Mahadevan } 977f6829af0SVijay Mahadevan ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 978f6829af0SVijay Mahadevan ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr); 979f6829af0SVijay Mahadevan ierr = PetscFree(dm->data);CHKERRQ(ierr); 980f6829af0SVijay Mahadevan PetscFunctionReturn(0); 981f6829af0SVijay Mahadevan } 982f6829af0SVijay Mahadevan 983f6829af0SVijay Mahadevan 984f6829af0SVijay Mahadevan #undef __FUNCT__ 9852e4e7c01SVijay Mahadevan #define __FUNCT__ "DMSetFromOptions_Moab" 986*cc310fddSBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptions *PetscOptionsObject,DM dm) 9872e4e7c01SVijay Mahadevan { 9882e4e7c01SVijay Mahadevan PetscErrorCode ierr; 9892e4e7c01SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 9902e4e7c01SVijay Mahadevan 9912e4e7c01SVijay Mahadevan PetscFunctionBegin; 9922e4e7c01SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 993*cc310fddSBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr); 9942e4e7c01SVijay 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); 9952e4e7c01SVijay 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); 9962e4e7c01SVijay Mahadevan /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */ 9972e4e7c01SVijay 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); 9982e4e7c01SVijay 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); 9992e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr); 10002e4e7c01SVijay Mahadevan ierr = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr); 10012e4e7c01SVijay Mahadevan PetscFunctionReturn(0); 10022e4e7c01SVijay Mahadevan } 10032e4e7c01SVijay Mahadevan 10042e4e7c01SVijay Mahadevan 10052e4e7c01SVijay Mahadevan #undef __FUNCT__ 1006f6829af0SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab" 1007f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) 1008f6829af0SVijay Mahadevan { 1009f6829af0SVijay Mahadevan PetscErrorCode ierr; 1010f6829af0SVijay Mahadevan moab::ErrorCode merr; 1011f6829af0SVijay Mahadevan Vec local, global; 1012f6829af0SVijay Mahadevan IS from,to; 1013f6829af0SVijay Mahadevan moab::Range::iterator iter; 1014f6829af0SVijay Mahadevan PetscInt i,j,f,bs,gmin,lmin,lmax,vent,totsize; 1015f6829af0SVijay Mahadevan DM_Moab *dmmoab = (DM_Moab*)dm->data; 1016f6829af0SVijay Mahadevan moab::Range adjs; 1017f6829af0SVijay Mahadevan 1018f6829af0SVijay Mahadevan PetscFunctionBegin; 1019f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1020f6829af0SVijay Mahadevan /* Get the local and shared vertices and cache it */ 1021f6829af0SVijay 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."); 1022f6829af0SVijay Mahadevan 1023f6829af0SVijay Mahadevan /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */ 1024f6829af0SVijay Mahadevan if (dmmoab->vlocal->empty()) 1025f6829af0SVijay Mahadevan { 1026f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr); 1027f6829af0SVijay Mahadevan 1028f6829af0SVijay Mahadevan /* filter based on parallel status */ 1029f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr); 1030f6829af0SVijay Mahadevan 1031f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1032f6829af0SVijay Mahadevan adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned); 1033f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr); 1034f6829af0SVijay Mahadevan adjs = moab::subtract(adjs, *dmmoab->vghost); 1035f6829af0SVijay Mahadevan *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs); 1036f6829af0SVijay Mahadevan 1037f6829af0SVijay Mahadevan /* compute and cache the sizes of local and ghosted entities */ 1038f6829af0SVijay Mahadevan dmmoab->nloc = dmmoab->vowned->size(); 1039f6829af0SVijay Mahadevan dmmoab->nghost = dmmoab->vghost->size(); 1040f6829af0SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1041f6829af0SVijay Mahadevan } 1042f6829af0SVijay Mahadevan 1043f6829af0SVijay Mahadevan { 1044f6829af0SVijay Mahadevan /* get the information about the local elements in the mesh */ 1045f6829af0SVijay Mahadevan dmmoab->eghost->clear(); 1046f6829af0SVijay Mahadevan 1047f6829af0SVijay Mahadevan /* first decipher the leading dimension */ 1048f6829af0SVijay Mahadevan for (i=3;i>0;i--) { 1049f6829af0SVijay Mahadevan dmmoab->elocal->clear(); 1050f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr); 1051f6829af0SVijay Mahadevan 1052f6829af0SVijay Mahadevan /* store the current mesh dimension */ 1053f6829af0SVijay Mahadevan if (dmmoab->elocal->size()) { 1054f6829af0SVijay Mahadevan dmmoab->dim=i; 1055f6829af0SVijay Mahadevan break; 1056f6829af0SVijay Mahadevan } 1057f6829af0SVijay Mahadevan } 1058f6829af0SVijay Mahadevan 1059f6829af0SVijay Mahadevan /* filter the ghosted and owned element list */ 1060f6829af0SVijay Mahadevan *dmmoab->eghost = *dmmoab->elocal; 1061f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1062f6829af0SVijay Mahadevan *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal); 1063f6829af0SVijay Mahadevan 1064f6829af0SVijay Mahadevan dmmoab->neleloc = dmmoab->elocal->size(); 1065f6829af0SVijay Mahadevan dmmoab->neleghost = dmmoab->eghost->size(); 1066f6829af0SVijay Mahadevan ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1067f6829af0SVijay Mahadevan } 1068f6829af0SVijay Mahadevan 1069f6829af0SVijay Mahadevan bs = dmmoab->bs; 1070f6829af0SVijay Mahadevan if (!dmmoab->ltog_tag) { 1071f6829af0SVijay Mahadevan /* Get the global ID tag. The global ID tag is applied to each 1072f6829af0SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 1073f6829af0SVijay Mahadevan assemble the individual pieces of the mesh */ 1074f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr); 1075f6829af0SVijay Mahadevan } 1076f6829af0SVijay Mahadevan 1077f6829af0SVijay Mahadevan totsize=dmmoab->vlocal->size(); 1078f6829af0SVijay 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); 10797ae5e5b6SVijay Mahadevan ierr = PetscMalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr); 1080f6829af0SVijay Mahadevan { 1081f6829af0SVijay Mahadevan /* first get the local indices */ 1082f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr); 1083f6829af0SVijay Mahadevan /* next get the ghosted indices */ 1084f6829af0SVijay Mahadevan if (dmmoab->nghost) { 1085f6829af0SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr); 1086f6829af0SVijay Mahadevan } 1087f6829af0SVijay Mahadevan 1088f6829af0SVijay Mahadevan /* find out the local and global minima of GLOBAL_ID */ 1089f6829af0SVijay Mahadevan lmin=lmax=dmmoab->gsindices[0]; 1090f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1091f6829af0SVijay Mahadevan if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i]; 1092f6829af0SVijay Mahadevan if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i]; 1093f6829af0SVijay Mahadevan } 1094f6829af0SVijay Mahadevan 1095f6829af0SVijay Mahadevan ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr); 1096f6829af0SVijay Mahadevan 1097f6829af0SVijay Mahadevan /* set the GID map */ 1098f6829af0SVijay Mahadevan for (i=0; i<totsize; ++i) { 1099f6829af0SVijay Mahadevan dmmoab->gsindices[i]-=gmin; /* zero based index needed for IS */ 1100f6829af0SVijay Mahadevan } 1101f6829af0SVijay Mahadevan lmin-=gmin; 1102f6829af0SVijay Mahadevan lmax-=gmin; 1103f6829af0SVijay Mahadevan 1104f6829af0SVijay Mahadevan PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin); 1105f6829af0SVijay Mahadevan } 110682dfd14aSVijay 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); 1107f6829af0SVijay Mahadevan 1108f6829af0SVijay Mahadevan { 11097ae5e5b6SVijay Mahadevan i=(PetscInt)dmmoab->vlocal->back()+1; 11107ae5e5b6SVijay Mahadevan //i=(PetscInt)(dmmoab->vlocal->back()-dmmoab->vlocal->front())+1; 11117ae5e5b6SVijay Mahadevan j=totsize*dmmoab->numFields; 11127ae5e5b6SVijay Mahadevan ierr = PetscMalloc2(i,&dmmoab->gidmap,i,&dmmoab->lidmap);CHKERRQ(ierr); 11137ae5e5b6SVijay Mahadevan ierr = PetscMalloc2(j,&dmmoab->lgmap,j,&dmmoab->llmap);CHKERRQ(ierr); 1114f6829af0SVijay Mahadevan 1115f6829af0SVijay Mahadevan i=j=0; 1116f6829af0SVijay Mahadevan /* set the owned vertex data first */ 1117f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) { 1118f6829af0SVijay Mahadevan vent=(PetscInt)(*iter); 1119f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1120f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1121f6829af0SVijay Mahadevan if (bs > 1) { 1122f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1123f6829af0SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 1124f6829af0SVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 1125f6829af0SVijay Mahadevan } 1126f6829af0SVijay Mahadevan } 1127f6829af0SVijay Mahadevan else { 1128f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1129f6829af0SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 1130f6829af0SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 1131f6829af0SVijay Mahadevan } 1132f6829af0SVijay Mahadevan } 1133f6829af0SVijay Mahadevan } 1134f6829af0SVijay Mahadevan /* next arrange all the ghosted data information */ 1135f6829af0SVijay Mahadevan for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) { 1136f6829af0SVijay Mahadevan vent=(PetscInt)(*iter); 1137f6829af0SVijay Mahadevan dmmoab->gidmap[vent]=dmmoab->gsindices[i]; 1138f6829af0SVijay Mahadevan dmmoab->lidmap[vent]=i; 1139f6829af0SVijay Mahadevan if (bs > 1) { 1140f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1141f6829af0SVijay Mahadevan dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f; 1142f6829af0SVijay Mahadevan dmmoab->llmap[j]=i*dmmoab->numFields+f; 1143f6829af0SVijay Mahadevan } 1144f6829af0SVijay Mahadevan } 1145f6829af0SVijay Mahadevan else { 1146f6829af0SVijay Mahadevan for (f=0;f<dmmoab->numFields;f++,j++) { 1147f6829af0SVijay Mahadevan dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i]; 1148f6829af0SVijay Mahadevan dmmoab->llmap[j]=totsize*f+i; 1149f6829af0SVijay Mahadevan } 1150f6829af0SVijay Mahadevan } 1151f6829af0SVijay Mahadevan } 1152f6829af0SVijay Mahadevan 1153f6829af0SVijay Mahadevan /* We need to create the Global to Local Vector Scatter Contexts 1154f6829af0SVijay Mahadevan 1) First create a local and global vector 1155f6829af0SVijay Mahadevan 2) Create a local and global IS 1156f6829af0SVijay Mahadevan 3) Create VecScatter and LtoGMapping objects 1157f6829af0SVijay Mahadevan 4) Cleanup the IS and Vec objects 1158f6829af0SVijay Mahadevan */ 1159f6829af0SVijay Mahadevan ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr); 1160f6829af0SVijay Mahadevan ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr); 1161f6829af0SVijay Mahadevan 1162f6829af0SVijay Mahadevan ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr); 1163f6829af0SVijay Mahadevan PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost); 1164f6829af0SVijay Mahadevan 1165f6829af0SVijay Mahadevan /* global to local must retrieve ghost points */ 1166f6829af0SVijay Mahadevan ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr); 1167f6829af0SVijay Mahadevan ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr); 1168f6829af0SVijay Mahadevan 1169f6829af0SVijay Mahadevan ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr); 1170f6829af0SVijay Mahadevan ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr); 1171f6829af0SVijay Mahadevan 1172f6829af0SVijay Mahadevan if (!dmmoab->ltog_map) { 1173f6829af0SVijay Mahadevan /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */ 117482dfd14aSVijay Mahadevan ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,dmmoab->lgmap, 1175f6829af0SVijay Mahadevan PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr); 1176f6829af0SVijay Mahadevan } 1177f6829af0SVijay Mahadevan 1178f6829af0SVijay Mahadevan /* now create the scatter object from local to global vector */ 1179f6829af0SVijay Mahadevan ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr); 1180f6829af0SVijay Mahadevan 1181f6829af0SVijay Mahadevan /* clean up IS, Vec */ 1182f6829af0SVijay Mahadevan ierr = ISDestroy(&from);CHKERRQ(ierr); 1183f6829af0SVijay Mahadevan ierr = ISDestroy(&to);CHKERRQ(ierr); 1184f6829af0SVijay Mahadevan ierr = VecDestroy(&local);CHKERRQ(ierr); 1185f6829af0SVijay Mahadevan ierr = VecDestroy(&global);CHKERRQ(ierr); 1186f6829af0SVijay Mahadevan } 1187f6829af0SVijay Mahadevan 1188f6829af0SVijay Mahadevan /* skin the boundary and store nodes */ 1189f6829af0SVijay Mahadevan { 1190f6829af0SVijay Mahadevan /* get the skin vertices of boundary faces for the current partition and then filter 1191f6829af0SVijay Mahadevan the local, boundary faces, vertices and elements alone via PSTATUS flags; 1192f6829af0SVijay Mahadevan this should not give us any ghosted boundary, but if user needs such a functionality 1193f6829af0SVijay Mahadevan it would be easy to add it based on the find_skin query below */ 1194f6829af0SVijay Mahadevan moab::Skinner skinner(dmmoab->mbiface); 1195f6829af0SVijay Mahadevan 1196f6829af0SVijay Mahadevan dmmoab->bndyvtx = new moab::Range(); 1197f6829af0SVijay Mahadevan dmmoab->bndyfaces = new moab::Range(); 1198f6829af0SVijay Mahadevan dmmoab->bndyelems = new moab::Range(); 1199f6829af0SVijay Mahadevan 1200f6829af0SVijay Mahadevan /* get the entities on the skin - only the faces */ 1201f6829af0SVijay 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 1202f6829af0SVijay Mahadevan 1203f6829af0SVijay Mahadevan /* filter all the non-owned and shared entities out of the list */ 1204f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr); 1205f6829af0SVijay Mahadevan merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr); 1206f6829af0SVijay Mahadevan 1207f6829af0SVijay Mahadevan /* get all the nodes via connectivity and the parent elements via adjacency information */ 1208f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr); 1209f6829af0SVijay Mahadevan merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr); 1210f6829af0SVijay Mahadevan PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size()); 1211f6829af0SVijay Mahadevan } 1212f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1213f6829af0SVijay Mahadevan } 1214f6829af0SVijay Mahadevan 1215f6829af0SVijay Mahadevan #undef __FUNCT__ 1216f6829af0SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab" 1217f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) 1218f6829af0SVijay Mahadevan { 1219f6829af0SVijay Mahadevan PetscErrorCode ierr; 1220f6829af0SVijay Mahadevan 1221f6829af0SVijay Mahadevan PetscFunctionBegin; 1222f6829af0SVijay Mahadevan PetscValidHeaderSpecific(dm,DM_CLASSID,1); 1223f90c3b0eSVijay Mahadevan ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr); 1224f6829af0SVijay Mahadevan 1225f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->bs = 1; 1226f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->numFields = 1; 1227f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->n = 0; 1228f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nloc = 0; 1229f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nghost = 0; 1230f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->nele = 0; 1231f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleloc = 0; 1232f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->neleghost = 0; 1233f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL; 1234f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL; 1235f6829af0SVijay Mahadevan 1236f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vlocal = new moab::Range(); 1237f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vowned = new moab::Range(); 1238f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->vghost = new moab::Range(); 1239f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->elocal = new moab::Range(); 1240f6829af0SVijay Mahadevan ((DM_Moab*)dm->data)->eghost = new moab::Range(); 1241f6829af0SVijay Mahadevan 1242f6829af0SVijay Mahadevan dm->ops->createglobalvector = DMCreateGlobalVector_Moab; 1243f6829af0SVijay Mahadevan dm->ops->createlocalvector = DMCreateLocalVector_Moab; 1244f6829af0SVijay Mahadevan dm->ops->creatematrix = DMCreateMatrix_Moab; 1245f6829af0SVijay Mahadevan dm->ops->setup = DMSetUp_Moab; 1246f6829af0SVijay Mahadevan dm->ops->destroy = DMDestroy_Moab; 12472e4e7c01SVijay Mahadevan dm->ops->setfromoptions = DMSetFromOptions_Moab; 1248f6829af0SVijay Mahadevan dm->ops->globaltolocalbegin = DMGlobalToLocalBegin_Moab; 1249f6829af0SVijay Mahadevan dm->ops->globaltolocalend = DMGlobalToLocalEnd_Moab; 1250f6829af0SVijay Mahadevan dm->ops->localtoglobalbegin = DMLocalToGlobalBegin_Moab; 1251f6829af0SVijay Mahadevan dm->ops->localtoglobalend = DMLocalToGlobalEnd_Moab; 1252f6829af0SVijay Mahadevan PetscFunctionReturn(0); 1253f6829af0SVijay Mahadevan } 1254f6829af0SVijay Mahadevan 1255