xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 4dfa11a44d5adf2389f1d3acbc8f3c1116dc6c3a)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
21d72bce8STim Tautges 
31d72bce8STim Tautges #include <petscdmmoab.h>
488face26SJed Brown #include <MBTagConventions.hpp>
59daf19fdSVijay Mahadevan #include <moab/NestedRefine.hpp>
61cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
7032b8ab6SVijay Mahadevan 
8c6ef30f9SVijay Mahadevan /*MC
9c6ef30f9SVijay Mahadevan   DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database.
10c6ef30f9SVijay Mahadevan                     Direct access to the MOAB Interface and other mesh manipulation related objects are available
11c6ef30f9SVijay Mahadevan                     through public API. Ability to create global and local representation of Vecs containing all
12c6ef30f9SVijay Mahadevan                     unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided
13c6ef30f9SVijay Mahadevan                     along with utility functions to traverse the mesh and assemble a discrete system via
14c6ef30f9SVijay Mahadevan                     field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are
15c6ef30f9SVijay Mahadevan                     available.
16c6ef30f9SVijay Mahadevan 
17a8d69d7bSBarry Smith   Reference: https://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html
18c6ef30f9SVijay Mahadevan 
19c6ef30f9SVijay Mahadevan   Level: intermediate
20c6ef30f9SVijay Mahadevan 
21db781477SPatrick Sanan .seealso: `DMType`, `DMMoabCreate()`, `DMCreate()`, `DMSetType()`, `DMMoabCreateMoab()`
22c6ef30f9SVijay Mahadevan M*/
23c6ef30f9SVijay Mahadevan 
24304006b3SVijay Mahadevan /* External function declarations here */
25304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling);
26304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm);
27304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
28304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm);
29304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined);
30304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened);
31304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]);
32304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm, PetscInt nlevels, DM dmCoarsened[]);
33304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm);
34304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM, Vec *);
35304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM, Vec *);
36304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
37304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM, Vec, InsertMode, Vec);
38304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM, Vec, InsertMode, Vec);
39304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM, Vec, InsertMode, Vec);
40304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM, Vec, InsertMode, Vec);
41304006b3SVijay Mahadevan 
42304006b3SVijay Mahadevan /* Un-implemented routines */
43304006b3SVijay Mahadevan /*
441bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMCreatelocalsection_Moab(DM dm);
45304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat);
46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer);
47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd);
48304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm);
49304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS);
50304006b3SVijay Mahadevan */
51c6ef30f9SVijay Mahadevan 
52cab5ea25SPierre Jolivet /*@C
531d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
541d72bce8STim Tautges 
55d083f849SBarry Smith   Collective
561d72bce8STim Tautges 
571d72bce8STim Tautges   Input Parameter:
581d72bce8STim Tautges . comm - The communicator for the DMMoab object
591d72bce8STim Tautges 
601d72bce8STim Tautges   Output Parameter:
61032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
621d72bce8STim Tautges 
631d72bce8STim Tautges   Level: beginner
641d72bce8STim Tautges 
651d72bce8STim Tautges @*/
669371c9d4SSatish Balay PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb) {
671d72bce8STim Tautges   PetscFunctionBegin;
68032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 2);
699566063dSJacob Faibussowitsch   PetscCall(DMCreate(comm, dmb));
709566063dSJacob Faibussowitsch   PetscCall(DMSetType(*dmb, DMMOAB));
711d72bce8STim Tautges   PetscFunctionReturn(0);
721d72bce8STim Tautges }
731d72bce8STim Tautges 
74cab5ea25SPierre Jolivet /*@C
75b117cd09SVijay Mahadevan   DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data
761d72bce8STim Tautges 
77d083f849SBarry Smith   Collective
781d72bce8STim Tautges 
79d8d19677SJose E. Roman   Input Parameters:
80a2b725a8SWilliam Gropp + comm - The communicator for the DMMoab object
81032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
82a4d2169cSTim Tautges          along with the DMMoab
831d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
84a2b725a8SWilliam Gropp - range - If non-NULL, contains range of entities to which DOFs will be assigned
851d72bce8STim Tautges 
861d72bce8STim Tautges   Output Parameter:
87032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
881d72bce8STim Tautges 
89032b8ab6SVijay Mahadevan   Level: intermediate
901d72bce8STim Tautges 
911d72bce8STim Tautges @*/
929371c9d4SSatish Balay PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb) {
93032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
9485d305f5SVijay Mahadevan   DM              dmmb;
95853cdec3SJed Brown   DM_Moab        *dmmoab;
961d72bce8STim Tautges 
971d72bce8STim Tautges   PetscFunctionBegin;
98032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 6);
9985d305f5SVijay Mahadevan 
1009566063dSJacob Faibussowitsch   PetscCall(DMMoabCreate(comm, &dmmb));
10185d305f5SVijay Mahadevan   dmmoab = (DM_Moab *)(dmmb)->data;
102a4d2169cSTim Tautges 
103a4d2169cSTim Tautges   if (!mbiface) {
10472ff976dSVijay Mahadevan     dmmoab->mbiface          = new moab::Core();
1057d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1069371c9d4SSatish Balay   } else {
1071cec0304SVijay Mahadevan     dmmoab->mbiface          = mbiface;
1087d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1091cec0304SVijay Mahadevan   }
1101cec0304SVijay Mahadevan 
111b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
112b5410836SVijay Mahadevan   dmmoab->fileset     = 0;
113b117cd09SVijay Mahadevan   dmmoab->hlevel      = 0;
11449d66b22SVijay Mahadevan   dmmoab->nghostrings = 0;
1157d89fc02STim Tautges 
1169daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1179daf19fdSVijay Mahadevan   moab::EntityHandle partnset;
118032b8ab6SVijay Mahadevan 
119db66d124SVijay Mahadevan   /* Create root sets for each mesh.  Then pass these
120db66d124SVijay Mahadevan       to the load_file functions to be populated. */
1219371c9d4SSatish Balay   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
1229371c9d4SSatish Balay   MBERR("Creating partition set failed", merr);
123032b8ab6SVijay Mahadevan 
124db66d124SVijay Mahadevan   /* Create the parallel communicator object with the partition handle associated with MOAB */
12572ff976dSVijay Mahadevan   dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
1269daf19fdSVijay Mahadevan #endif
127032b8ab6SVijay Mahadevan 
1284973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1294973de03SVijay Mahadevan   dmmoab->bs        = 1;
130addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1319566063dSJacob Faibussowitsch   PetscCall(PetscMalloc(dmmoab->numFields * sizeof(char *), &dmmoab->fieldNames));
1329566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy("DEFAULT", (char **)&dmmoab->fieldNames[0]));
1332e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel            = 0;
1342e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank      = PETSC_FALSE;
1352e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0]  = '\0';
1362e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1372e4e7c01SVijay Mahadevan   dmmoab->read_mode              = READ_PART;
1382e4e7c01SVijay Mahadevan   dmmoab->write_mode             = WRITE_PART;
1394973de03SVijay Mahadevan 
1404973de03SVijay Mahadevan   /* set global ID tag handle */
1411a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
1429566063dSJacob Faibussowitsch     PetscCall(DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag));
1439371c9d4SSatish Balay   } else {
1449371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);
1459371c9d4SSatish Balay     MBERRNM(merr);
1461a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
147a4d2169cSTim Tautges   }
148a4d2169cSTim Tautges 
1499371c9d4SSatish Balay   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);
1509371c9d4SSatish Balay   MBERRNM(merr);
151340f3b9aSVijay Mahadevan 
1524973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
15348a46eb9SPierre Jolivet   if (range) PetscCall(DMMoabSetLocalVertices(dmmb, range));
15485d305f5SVijay Mahadevan   *dmb = dmmb;
1551d72bce8STim Tautges   PetscFunctionReturn(0);
1561d72bce8STim Tautges }
1571d72bce8STim Tautges 
1589daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1591d72bce8STim Tautges 
160cab5ea25SPierre Jolivet /*@C
161aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
162aa768e4cSTim Tautges 
163d083f849SBarry Smith   Collective
164aa768e4cSTim Tautges 
165aa768e4cSTim Tautges   Input Parameter:
166aa768e4cSTim Tautges . dm    - The DMMoab object being set
167aa768e4cSTim Tautges 
168aa768e4cSTim Tautges   Output Parameter:
169aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
170aa768e4cSTim Tautges 
171aa768e4cSTim Tautges   Level: beginner
172aa768e4cSTim Tautges 
173aa768e4cSTim Tautges @*/
1749371c9d4SSatish Balay PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm) {
1751d72bce8STim Tautges   PetscFunctionBegin;
1761d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
177032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab *)(dm)->data)->pcomm;
1781d72bce8STim Tautges   PetscFunctionReturn(0);
1791d72bce8STim Tautges }
1801d72bce8STim Tautges 
1819daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */
1829daf19fdSVijay Mahadevan 
183cab5ea25SPierre Jolivet /*@C
184aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
185aa768e4cSTim Tautges 
186d083f849SBarry Smith   Collective
187aa768e4cSTim Tautges 
188d8d19677SJose E. Roman   Input Parameters:
189a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
190a2b725a8SWilliam Gropp - mbiface - The MOAB instance being set on this DMMoab
191aa768e4cSTim Tautges 
192aa768e4cSTim Tautges   Level: beginner
193aa768e4cSTim Tautges 
194aa768e4cSTim Tautges @*/
1959371c9d4SSatish Balay PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface) {
196032b8ab6SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)(dm)->data;
197032b8ab6SVijay Mahadevan 
1981d72bce8STim Tautges   PetscFunctionBegin;
1991d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2001cec0304SVijay Mahadevan   PetscValidPointer(mbiface, 2);
2019daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
202032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
2039daf19fdSVijay Mahadevan #endif
204032b8ab6SVijay Mahadevan   dmmoab->mbiface          = mbiface;
205032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2061d72bce8STim Tautges   PetscFunctionReturn(0);
2071d72bce8STim Tautges }
2081d72bce8STim Tautges 
209cab5ea25SPierre Jolivet /*@C
210aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
211aa768e4cSTim Tautges 
212d083f849SBarry Smith   Collective
213aa768e4cSTim Tautges 
214aa768e4cSTim Tautges   Input Parameter:
215aa768e4cSTim Tautges . dm      - The DMMoab object being set
216aa768e4cSTim Tautges 
217aa768e4cSTim Tautges   Output Parameter:
218aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
219aa768e4cSTim Tautges 
220aa768e4cSTim Tautges   Level: beginner
221aa768e4cSTim Tautges 
222aa768e4cSTim Tautges @*/
2239371c9d4SSatish Balay PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface) {
224cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
225cabb514dSBarry Smith 
2261d72bce8STim Tautges   PetscFunctionBegin;
2271d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2289371c9d4SSatish Balay   PetscCall(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, "
2299371c9d4SSatish Balay                                    "K. and Stimpson, C. and Ernst, C.},\n  year = {2004},  note = {Report}\n}\n",
2309371c9d4SSatish Balay                                    &cite));
231a4d2169cSTim Tautges   *mbiface = ((DM_Moab *)dm->data)->mbiface;
2321d72bce8STim Tautges   PetscFunctionReturn(0);
2331d72bce8STim Tautges }
2341d72bce8STim Tautges 
235cab5ea25SPierre Jolivet /*@C
2365eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
237aa768e4cSTim Tautges 
238d083f849SBarry Smith   Collective
239aa768e4cSTim Tautges 
240d8d19677SJose E. Roman   Input Parameters:
241a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
242a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
243aa768e4cSTim Tautges 
244aa768e4cSTim Tautges   Level: beginner
245aa768e4cSTim Tautges 
246aa768e4cSTim Tautges @*/
2479371c9d4SSatish Balay PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range) {
248fd3326ddSVijay Mahadevan   moab::Range tmpvtxs;
249032b8ab6SVijay Mahadevan   DM_Moab    *dmmoab = (DM_Moab *)(dm)->data;
250032b8ab6SVijay Mahadevan 
2511d72bce8STim Tautges   PetscFunctionBegin;
2521d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
253032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
254032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
255fd3326ddSVijay Mahadevan 
256032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
257fd3326ddSVijay Mahadevan 
2589daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2599daf19fdSVijay Mahadevan   moab::ErrorCode merr;
260fd3326ddSVijay Mahadevan   /* filter based on parallel status */
2619371c9d4SSatish Balay   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned);
2629371c9d4SSatish Balay   MBERRNM(merr);
263fd3326ddSVijay Mahadevan 
264fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
265fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
2669371c9d4SSatish Balay   merr    = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost);
2679371c9d4SSatish Balay   MBERRNM(merr);
268fd3326ddSVijay Mahadevan   tmpvtxs         = moab::subtract(tmpvtxs, *dmmoab->vghost);
269fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
2709daf19fdSVijay Mahadevan #else
2719daf19fdSVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
2729daf19fdSVijay Mahadevan #endif
273fd3326ddSVijay Mahadevan 
274fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
275032b8ab6SVijay Mahadevan   dmmoab->nloc   = dmmoab->vowned->size();
276032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
2779daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2781c2dc1cbSBarry Smith   PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
2799daf19fdSVijay Mahadevan #else
2809daf19fdSVijay Mahadevan   dmmoab->n       = dmmoab->nloc;
2819daf19fdSVijay Mahadevan #endif
2821d72bce8STim Tautges   PetscFunctionReturn(0);
2831d72bce8STim Tautges }
2841d72bce8STim Tautges 
285cab5ea25SPierre Jolivet /*@C
2868d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
2878d8d51c8SVijay Mahadevan 
288d083f849SBarry Smith   Collective
2898d8d51c8SVijay Mahadevan 
2908d8d51c8SVijay Mahadevan   Input Parameter:
2918d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
2928d8d51c8SVijay Mahadevan 
2938d8d51c8SVijay Mahadevan   Output Parameter:
2948d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
2958d8d51c8SVijay Mahadevan 
2968d8d51c8SVijay Mahadevan   Level: beginner
2978d8d51c8SVijay Mahadevan 
2988d8d51c8SVijay Mahadevan @*/
2999371c9d4SSatish Balay PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local) {
3008d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3018d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3028d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab *)dm->data)->vlocal;
3038d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3048d8d51c8SVijay Mahadevan }
3058d8d51c8SVijay Mahadevan 
306cab5ea25SPierre Jolivet /*@C
3075eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
308aa768e4cSTim Tautges 
309d083f849SBarry Smith   Collective
310aa768e4cSTim Tautges 
311aa768e4cSTim Tautges   Input Parameter:
312aa768e4cSTim Tautges . dm    - The DMMoab object being set
313aa768e4cSTim Tautges 
314a2b725a8SWilliam Gropp   Output Parameters:
315a2b725a8SWilliam Gropp + owned - The owned vertex entities in this DMMoab
316a2b725a8SWilliam Gropp - ghost - The ghosted entities (non-owned) stored locally in this partition
317aa768e4cSTim Tautges 
318aa768e4cSTim Tautges   Level: beginner
319aa768e4cSTim Tautges 
320aa768e4cSTim Tautges @*/
3219371c9d4SSatish Balay PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost) {
3221d72bce8STim Tautges   PetscFunctionBegin;
3231d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
324351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab *)dm->data)->vowned;
325351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab *)dm->data)->vghost;
3261d72bce8STim Tautges   PetscFunctionReturn(0);
3271d72bce8STim Tautges }
3281d72bce8STim Tautges 
329cab5ea25SPierre Jolivet /*@C
3305eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3315eb88e9dSVijay Mahadevan 
332d083f849SBarry Smith   Collective
3335eb88e9dSVijay Mahadevan 
3345eb88e9dSVijay Mahadevan   Input Parameter:
3355eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3365eb88e9dSVijay Mahadevan 
3375eb88e9dSVijay Mahadevan   Output Parameter:
3385eb88e9dSVijay Mahadevan . range - The entities owned locally
3395eb88e9dSVijay Mahadevan 
3405eb88e9dSVijay Mahadevan   Level: beginner
3415eb88e9dSVijay Mahadevan 
3425eb88e9dSVijay Mahadevan @*/
3439371c9d4SSatish Balay PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range) {
3445eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3455eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
346351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab *)dm->data)->elocal;
3471cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3481cec0304SVijay Mahadevan }
3491cec0304SVijay Mahadevan 
350cab5ea25SPierre Jolivet /*@C
3511cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3521cec0304SVijay Mahadevan 
353d083f849SBarry Smith   Collective
3541cec0304SVijay Mahadevan 
355a2b725a8SWilliam Gropp   Input Parameters:
356a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
357a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
3581cec0304SVijay Mahadevan 
3591cec0304SVijay Mahadevan   Level: beginner
3601cec0304SVijay Mahadevan 
3611cec0304SVijay Mahadevan @*/
3629371c9d4SSatish Balay PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range) {
3631cec0304SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)(dm)->data;
3641cec0304SVijay Mahadevan 
3651cec0304SVijay Mahadevan   PetscFunctionBegin;
3661cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3671cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3681cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3691cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3709daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3719daf19fdSVijay Mahadevan   moab::ErrorCode merr;
3729371c9d4SSatish Balay   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT);
3739371c9d4SSatish Balay   MBERRNM(merr);
3741cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3759daf19fdSVijay Mahadevan #endif
3761cec0304SVijay Mahadevan   dmmoab->neleloc   = dmmoab->elocal->size();
37741dd5348SVijay Mahadevan   dmmoab->neleghost = dmmoab->eghost->size();
3789daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3791c2dc1cbSBarry Smith   PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
38063a3b9bcSJacob Faibussowitsch   PetscInfo(dm, "Created %" PetscInt_FMT " local and %" PetscInt_FMT " global elements.\n", dmmoab->neleloc, dmmoab->nele);
3819daf19fdSVijay Mahadevan #else
3829daf19fdSVijay Mahadevan   dmmoab->nele    = dmmoab->neleloc;
3839daf19fdSVijay Mahadevan #endif
3845eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
3855eb88e9dSVijay Mahadevan }
3865eb88e9dSVijay Mahadevan 
387cab5ea25SPierre Jolivet /*@C
388aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
389aa768e4cSTim Tautges 
390d083f849SBarry Smith   Collective
391aa768e4cSTim Tautges 
392a2b725a8SWilliam Gropp   Input Parameters:
393a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
394a2b725a8SWilliam Gropp - ltogtag - The MOAB tag used for local to global ids
395aa768e4cSTim Tautges 
396aa768e4cSTim Tautges   Level: beginner
397aa768e4cSTim Tautges 
398aa768e4cSTim Tautges @*/
3999371c9d4SSatish Balay PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag) {
4001d72bce8STim Tautges   PetscFunctionBegin;
4011d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4021d72bce8STim Tautges   ((DM_Moab *)dm->data)->ltog_tag = ltogtag;
4031d72bce8STim Tautges   PetscFunctionReturn(0);
4041d72bce8STim Tautges }
4051d72bce8STim Tautges 
406cab5ea25SPierre Jolivet /*@C
407aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
408aa768e4cSTim Tautges 
409d083f849SBarry Smith   Collective
410aa768e4cSTim Tautges 
411aa768e4cSTim Tautges   Input Parameter:
412aa768e4cSTim Tautges . dm      - The DMMoab object being set
413aa768e4cSTim Tautges 
414aa768e4cSTim Tautges   Output Parameter:
415aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
416aa768e4cSTim Tautges 
417aa768e4cSTim Tautges   Level: beginner
418aa768e4cSTim Tautges 
419aa768e4cSTim Tautges @*/
4209371c9d4SSatish Balay PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag) {
4211d72bce8STim Tautges   PetscFunctionBegin;
4221d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4231d72bce8STim Tautges   *ltog_tag = ((DM_Moab *)dm->data)->ltog_tag;
4241d72bce8STim Tautges   PetscFunctionReturn(0);
4251d72bce8STim Tautges }
4261d72bce8STim Tautges 
427cab5ea25SPierre Jolivet /*@C
428aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
429aa768e4cSTim Tautges 
430d083f849SBarry Smith   Collective
431aa768e4cSTim Tautges 
432d8d19677SJose E. Roman   Input Parameters:
433a2b725a8SWilliam Gropp + dm - The DMMoab object being set
434a2b725a8SWilliam Gropp - bs - The block size used with this DMMoab
435aa768e4cSTim Tautges 
436aa768e4cSTim Tautges   Level: beginner
437aa768e4cSTim Tautges 
438aa768e4cSTim Tautges @*/
4399371c9d4SSatish Balay PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs) {
4401d72bce8STim Tautges   PetscFunctionBegin;
4411d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4421d72bce8STim Tautges   ((DM_Moab *)dm->data)->bs = bs;
4431d72bce8STim Tautges   PetscFunctionReturn(0);
4441d72bce8STim Tautges }
4451d72bce8STim Tautges 
446cab5ea25SPierre Jolivet /*@C
447aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
448aa768e4cSTim Tautges 
449d083f849SBarry Smith   Collective
450aa768e4cSTim Tautges 
451aa768e4cSTim Tautges   Input Parameter:
452aa768e4cSTim Tautges . dm - The DMMoab object being set
453aa768e4cSTim Tautges 
454aa768e4cSTim Tautges   Output Parameter:
455aa768e4cSTim Tautges . bs - The block size used with this DMMoab
456aa768e4cSTim Tautges 
457aa768e4cSTim Tautges   Level: beginner
458aa768e4cSTim Tautges 
459aa768e4cSTim Tautges @*/
4609371c9d4SSatish Balay PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs) {
4611d72bce8STim Tautges   PetscFunctionBegin;
4621d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4631d72bce8STim Tautges   *bs = ((DM_Moab *)dm->data)->bs;
4641d72bce8STim Tautges   PetscFunctionReturn(0);
4651d72bce8STim Tautges }
4661d72bce8STim Tautges 
467cab5ea25SPierre Jolivet /*@C
468212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
469212ad6d1SVijay Mahadevan 
470d083f849SBarry Smith   Collective on dm
471212ad6d1SVijay Mahadevan 
472212ad6d1SVijay Mahadevan   Input Parameter:
473212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
474212ad6d1SVijay Mahadevan 
475d8d19677SJose E. Roman   Output Parameters:
476a2b725a8SWilliam Gropp + neg - The number of global elements in the DMMoab instance
477a2b725a8SWilliam Gropp - nvg - The number of global vertices in the DMMoab instance
478212ad6d1SVijay Mahadevan 
479212ad6d1SVijay Mahadevan   Level: beginner
480212ad6d1SVijay Mahadevan 
481212ad6d1SVijay Mahadevan @*/
4829371c9d4SSatish Balay PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg) {
483212ad6d1SVijay Mahadevan   PetscFunctionBegin;
484212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
48541dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab *)dm->data)->nele;
48641dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab *)dm->data)->n;
487212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
488212ad6d1SVijay Mahadevan }
489212ad6d1SVijay Mahadevan 
490cab5ea25SPierre Jolivet /*@C
491212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
492212ad6d1SVijay Mahadevan 
493d083f849SBarry Smith   Collective on dm
494212ad6d1SVijay Mahadevan 
495212ad6d1SVijay Mahadevan   Input Parameter:
496212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
497212ad6d1SVijay Mahadevan 
498d8d19677SJose E. Roman   Output Parameters:
499b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
50000cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
50100cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
502a2b725a8SWilliam Gropp - nvg - The number of ghosted vertices in this processor
503212ad6d1SVijay Mahadevan 
504212ad6d1SVijay Mahadevan   Level: beginner
505212ad6d1SVijay Mahadevan 
506212ad6d1SVijay Mahadevan @*/
5079371c9d4SSatish Balay PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg) {
508212ad6d1SVijay Mahadevan   PetscFunctionBegin;
509212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
51041dd5348SVijay Mahadevan   if (nel) *nel = ((DM_Moab *)dm->data)->neleloc;
51141dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab *)dm->data)->neleghost;
51241dd5348SVijay Mahadevan   if (nvl) *nvl = ((DM_Moab *)dm->data)->nloc;
51341dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab *)dm->data)->nghost;
514212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
515212ad6d1SVijay Mahadevan }
516212ad6d1SVijay Mahadevan 
517cab5ea25SPierre Jolivet /*@C
51800cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
51900cc10feSVijay Mahadevan 
520d083f849SBarry Smith   Collective
52100cc10feSVijay Mahadevan 
52200cc10feSVijay Mahadevan   Input Parameter:
52300cc10feSVijay Mahadevan . dm - The DMMoab object being set
52400cc10feSVijay Mahadevan 
52500cc10feSVijay Mahadevan   Output Parameter:
52600cc10feSVijay Mahadevan . offset - The local offset for the global vector
52700cc10feSVijay Mahadevan 
52800cc10feSVijay Mahadevan   Level: beginner
52900cc10feSVijay Mahadevan 
53000cc10feSVijay Mahadevan @*/
5319371c9d4SSatish Balay PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset) {
53200cc10feSVijay Mahadevan   PetscFunctionBegin;
53300cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
53400cc10feSVijay Mahadevan   *offset = ((DM_Moab *)dm->data)->vstart;
53500cc10feSVijay Mahadevan   PetscFunctionReturn(0);
53600cc10feSVijay Mahadevan }
53700cc10feSVijay Mahadevan 
538cab5ea25SPierre Jolivet /*@C
5394920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5404920ab11SVijay Mahadevan 
541d083f849SBarry Smith   Collective
5424920ab11SVijay Mahadevan 
5434920ab11SVijay Mahadevan   Input Parameter:
544340f3b9aSVijay Mahadevan . dm - The DMMoab object
5454920ab11SVijay Mahadevan 
5464920ab11SVijay Mahadevan   Output Parameter:
5474920ab11SVijay Mahadevan . dim - The dimension of DM
5484920ab11SVijay Mahadevan 
5494920ab11SVijay Mahadevan   Level: beginner
5504920ab11SVijay Mahadevan 
5514920ab11SVijay Mahadevan @*/
5529371c9d4SSatish Balay PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim) {
5534920ab11SVijay Mahadevan   PetscFunctionBegin;
5544920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5554920ab11SVijay Mahadevan   *dim = ((DM_Moab *)dm->data)->dim;
5564920ab11SVijay Mahadevan   PetscFunctionReturn(0);
5574920ab11SVijay Mahadevan }
5584920ab11SVijay Mahadevan 
559cab5ea25SPierre Jolivet /*@C
560755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
561755f3dfbSVijay Mahadevan   generated through uniform refinement.
562755f3dfbSVijay Mahadevan 
563d083f849SBarry Smith   Collective on dm
564755f3dfbSVijay Mahadevan 
565755f3dfbSVijay Mahadevan   Input Parameter:
566755f3dfbSVijay Mahadevan . dm - The DMMoab object being set
567755f3dfbSVijay Mahadevan 
568755f3dfbSVijay Mahadevan   Output Parameter:
569755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level
570755f3dfbSVijay Mahadevan 
571755f3dfbSVijay Mahadevan   Level: beginner
572755f3dfbSVijay Mahadevan 
573755f3dfbSVijay Mahadevan @*/
5749371c9d4SSatish Balay PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel) {
575755f3dfbSVijay Mahadevan   PetscFunctionBegin;
576755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
577755f3dfbSVijay Mahadevan   if (nlevel) *nlevel = ((DM_Moab *)dm->data)->hlevel;
578755f3dfbSVijay Mahadevan   PetscFunctionReturn(0);
579755f3dfbSVijay Mahadevan }
580755f3dfbSVijay Mahadevan 
581cab5ea25SPierre Jolivet /*@C
582340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
583340f3b9aSVijay Mahadevan 
584d083f849SBarry Smith   Collective
585340f3b9aSVijay Mahadevan 
586d8d19677SJose E. Roman   Input Parameters:
587a2b725a8SWilliam Gropp + dm - The DMMoab object
588a2b725a8SWilliam Gropp - ehandle - The element entity handle
589340f3b9aSVijay Mahadevan 
590340f3b9aSVijay Mahadevan   Output Parameter:
591340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
592340f3b9aSVijay Mahadevan 
593340f3b9aSVijay Mahadevan   Level: beginner
594340f3b9aSVijay Mahadevan 
595340f3b9aSVijay Mahadevan @*/
5969371c9d4SSatish Balay PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat) {
597340f3b9aSVijay Mahadevan   DM_Moab *dmmoab;
598340f3b9aSVijay Mahadevan 
599340f3b9aSVijay Mahadevan   PetscFunctionBegin;
600340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
601340f3b9aSVijay Mahadevan   if (*mat) {
602340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab *)(dm)->data;
603a044f6b6SVijay Mahadevan     *mat   = dmmoab->materials[dmmoab->elocal->index(ehandle)];
604340f3b9aSVijay Mahadevan   }
605340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
606340f3b9aSVijay Mahadevan }
607340f3b9aSVijay Mahadevan 
608cab5ea25SPierre Jolivet /*@C
60985d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
61085d305f5SVijay Mahadevan 
611d083f849SBarry Smith   Collective
61285d305f5SVijay Mahadevan 
613d8d19677SJose E. Roman   Input Parameters:
614a2b725a8SWilliam Gropp + dm - The DMMoab object
61585d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
616a2b725a8SWilliam Gropp - conn - The vertex entity handles
61785d305f5SVijay Mahadevan 
61885d305f5SVijay Mahadevan   Output Parameter:
61985d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
62085d305f5SVijay Mahadevan 
62185d305f5SVijay Mahadevan   Level: beginner
62285d305f5SVijay Mahadevan 
623db781477SPatrick Sanan .seealso: `DMMoabGetVertexConnectivity()`
62485d305f5SVijay Mahadevan @*/
6259371c9d4SSatish Balay PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos) {
6267023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
6277023aa44SVijay Mahadevan   moab::ErrorCode merr;
6287023aa44SVijay Mahadevan 
6297023aa44SVijay Mahadevan   PetscFunctionBegin;
6307023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6317023aa44SVijay Mahadevan   PetscValidPointer(conn, 3);
6329c368985SVijay Mahadevan   PetscValidPointer(vpos, 4);
6337023aa44SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
6347023aa44SVijay Mahadevan 
6357023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6369c368985SVijay Mahadevan   if (dmmoab->hlevel) {
6379371c9d4SSatish Balay     merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle *>(conn), nconn, dmmoab->hlevel, vpos);
6389371c9d4SSatish Balay     MBERRNM(merr);
6399371c9d4SSatish Balay   } else {
6409371c9d4SSatish Balay     merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);
6419371c9d4SSatish Balay     MBERRNM(merr);
6429c368985SVijay Mahadevan   }
6437023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6447023aa44SVijay Mahadevan }
6457023aa44SVijay Mahadevan 
646cab5ea25SPierre Jolivet /*@C
64785d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
64885d305f5SVijay Mahadevan 
649d083f849SBarry Smith   Collective
65085d305f5SVijay Mahadevan 
651d8d19677SJose E. Roman   Input Parameters:
652a2b725a8SWilliam Gropp + dm - The DMMoab object
653a2b725a8SWilliam Gropp - vhandle - Vertex entity handle
65485d305f5SVijay Mahadevan 
655d8d19677SJose E. Roman   Output Parameters:
656a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
657a2b725a8SWilliam Gropp - conn - The vertex entity handles
65885d305f5SVijay Mahadevan 
65985d305f5SVijay Mahadevan   Level: beginner
66085d305f5SVijay Mahadevan 
661db781477SPatrick Sanan .seealso: `DMMoabGetVertexCoordinates()`, `DMMoabRestoreVertexConnectivity()`
66285d305f5SVijay Mahadevan @*/
6639371c9d4SSatish Balay PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt *nconn, moab::EntityHandle **conn) {
6648d8d51c8SVijay Mahadevan   DM_Moab                        *dmmoab;
6658d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities, connect;
6668d8d51c8SVijay Mahadevan   moab::ErrorCode                 merr;
6678d8d51c8SVijay Mahadevan 
6688d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6698d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6708d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
6718d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
6728d8d51c8SVijay Mahadevan 
6738d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6749371c9d4SSatish Balay   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);
6759371c9d4SSatish Balay   MBERRNM(merr);
6769371c9d4SSatish Balay   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect);
6779371c9d4SSatish Balay   MBERRNM(merr);
6788d8d51c8SVijay Mahadevan 
6798d8d51c8SVijay Mahadevan   if (conn) {
6809566063dSJacob Faibussowitsch     PetscCall(PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn));
6819566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(*conn, &connect[0], connect.size()));
6828d8d51c8SVijay Mahadevan   }
6838d8d51c8SVijay Mahadevan   if (nconn) *nconn = connect.size();
6848d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
6858d8d51c8SVijay Mahadevan }
6868d8d51c8SVijay Mahadevan 
687cab5ea25SPierre Jolivet /*@C
68885d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
68985d305f5SVijay Mahadevan 
690d083f849SBarry Smith   Collective
69185d305f5SVijay Mahadevan 
692d8d19677SJose E. Roman   Input Parameters:
693a2b725a8SWilliam Gropp + dm - The DMMoab object
69485d305f5SVijay Mahadevan . vhandle - Vertex entity handle
69585d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
696a2b725a8SWilliam Gropp - conn - The vertex entity handles
69785d305f5SVijay Mahadevan 
69885d305f5SVijay Mahadevan   Level: beginner
69985d305f5SVijay Mahadevan 
700db781477SPatrick Sanan .seealso: `DMMoabGetVertexCoordinates()`, `DMMoabGetVertexConnectivity()`
70185d305f5SVijay Mahadevan @*/
7029371c9d4SSatish Balay PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt *nconn, moab::EntityHandle **conn) {
7038d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7048d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7058d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
7068d8d51c8SVijay Mahadevan 
70748a46eb9SPierre Jolivet   if (conn) PetscCall(PetscFree(*conn));
7088d8d51c8SVijay Mahadevan   if (nconn) *nconn = 0;
7098d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7108d8d51c8SVijay Mahadevan }
7118d8d51c8SVijay Mahadevan 
712cab5ea25SPierre Jolivet /*@C
71385d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
71485d305f5SVijay Mahadevan 
715d083f849SBarry Smith   Collective
71685d305f5SVijay Mahadevan 
717d8d19677SJose E. Roman   Input Parameters:
718a2b725a8SWilliam Gropp + dm - The DMMoab object
719a2b725a8SWilliam Gropp - ehandle - Vertex entity handle
72085d305f5SVijay Mahadevan 
721d8d19677SJose E. Roman   Output Parameters:
722a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
723a2b725a8SWilliam Gropp - conn - The vertex entity handles
72485d305f5SVijay Mahadevan 
72585d305f5SVijay Mahadevan   Level: beginner
72685d305f5SVijay Mahadevan 
727db781477SPatrick Sanan .seealso: `DMMoabGetVertexCoordinates()`, `DMMoabGetVertexConnectivity()`, `DMMoabRestoreVertexConnectivity()`
72885d305f5SVijay Mahadevan @*/
7299371c9d4SSatish Balay PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt *nconn, const moab::EntityHandle **conn) {
7307023aa44SVijay Mahadevan   DM_Moab                        *dmmoab;
7317023aa44SVijay Mahadevan   const moab::EntityHandle       *connect;
7329c368985SVijay Mahadevan   std::vector<moab::EntityHandle> vconn;
7337023aa44SVijay Mahadevan   moab::ErrorCode                 merr;
7347023aa44SVijay Mahadevan   PetscInt                        nnodes;
7357023aa44SVijay Mahadevan 
7367023aa44SVijay Mahadevan   PetscFunctionBegin;
7377023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7387023aa44SVijay Mahadevan   PetscValidPointer(conn, 4);
7397023aa44SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
7407023aa44SVijay Mahadevan 
7417023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7429371c9d4SSatish Balay   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);
7439371c9d4SSatish Balay   MBERRNM(merr);
7447023aa44SVijay Mahadevan   if (conn) *conn = connect;
7457023aa44SVijay Mahadevan   if (nconn) *nconn = nnodes;
7467023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7477023aa44SVijay Mahadevan }
7487023aa44SVijay Mahadevan 
749cab5ea25SPierre Jolivet /*@C
75085d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
75185d305f5SVijay Mahadevan 
752d083f849SBarry Smith   Collective
75385d305f5SVijay Mahadevan 
754d8d19677SJose E. Roman   Input Parameters:
755a2b725a8SWilliam Gropp + dm - The DMMoab object
756a2b725a8SWilliam Gropp - ent - Entity handle
75785d305f5SVijay Mahadevan 
75885d305f5SVijay Mahadevan   Output Parameter:
75985d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
76085d305f5SVijay Mahadevan 
76185d305f5SVijay Mahadevan   Level: beginner
76285d305f5SVijay Mahadevan 
763db781477SPatrick Sanan .seealso: `DMMoabCheckBoundaryVertices()`
76485d305f5SVijay Mahadevan @*/
7659371c9d4SSatish Balay PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool *ent_on_boundary) {
76669263071SVijay Mahadevan   moab::EntityType etype;
76769263071SVijay Mahadevan   DM_Moab         *dmmoab;
76869263071SVijay Mahadevan   PetscInt         edim;
76969263071SVijay Mahadevan 
77069263071SVijay Mahadevan   PetscFunctionBegin;
77169263071SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
77269263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary, 3);
77369263071SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
77469263071SVijay Mahadevan 
77569263071SVijay Mahadevan   /* get the entity type and handle accordingly */
77669263071SVijay Mahadevan   etype = dmmoab->mbiface->type_from_handle(ent);
7771dca8a05SBarry Smith   PetscCheck(etype < moab::MBPOLYHEDRON, PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %" PetscInt_FMT, etype);
77869263071SVijay Mahadevan 
77969263071SVijay Mahadevan   /* get the entity dimension */
78069263071SVijay Mahadevan   edim = dmmoab->mbiface->dimension_from_handle(ent);
78169263071SVijay Mahadevan 
78269263071SVijay Mahadevan   *ent_on_boundary = PETSC_FALSE;
78369263071SVijay Mahadevan   if (etype == moab::MBVERTEX && edim == 0) {
78449d66b22SVijay Mahadevan     *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE);
7859371c9d4SSatish Balay   } else {
78669263071SVijay Mahadevan     if (edim == dmmoab->dim) { /* check the higher-dimensional elements first */
7876d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
7889371c9d4SSatish Balay     } else { /* next check the lower-dimensional faces */
7896d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
79069263071SVijay Mahadevan     }
79169263071SVijay Mahadevan   }
79269263071SVijay Mahadevan   PetscFunctionReturn(0);
79369263071SVijay Mahadevan }
79469263071SVijay Mahadevan 
795cab5ea25SPierre Jolivet /*@C
7964597dd3dSJose E. Roman   DMMoabCheckBoundaryVertices - Check whether a given entity is on the boundary (vertex, edge, face, element)
79785d305f5SVijay Mahadevan 
79897bb3fdcSJose E. Roman   Input Parameters:
799a2b725a8SWilliam Gropp + dm - The DMMoab object
80085d305f5SVijay Mahadevan . nconn - Number of handles
801a2b725a8SWilliam Gropp - cnt - Array of entity handles
80285d305f5SVijay Mahadevan 
80385d305f5SVijay Mahadevan   Output Parameter:
80485d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
80585d305f5SVijay Mahadevan 
80685d305f5SVijay Mahadevan   Level: beginner
80785d305f5SVijay Mahadevan 
808db781477SPatrick Sanan .seealso: `DMMoabIsEntityOnBoundary()`
80985d305f5SVijay Mahadevan @*/
8109371c9d4SSatish Balay PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool *isbdvtx) {
8117023aa44SVijay Mahadevan   DM_Moab *dmmoab;
8127023aa44SVijay Mahadevan   PetscInt i;
8137023aa44SVijay Mahadevan 
8147023aa44SVijay Mahadevan   PetscFunctionBegin;
8157023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8167023aa44SVijay Mahadevan   PetscValidPointer(cnt, 3);
8177023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx, 4);
8187023aa44SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
8197023aa44SVijay Mahadevan 
820ad540459SPierre Jolivet   for (i = 0; i < nconn; ++i) isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE);
8217023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8227023aa44SVijay Mahadevan }
8237023aa44SVijay Mahadevan 
824cab5ea25SPierre Jolivet /*@C
82585d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
82685d305f5SVijay Mahadevan 
82785d305f5SVijay Mahadevan   Input Parameter:
82885d305f5SVijay Mahadevan . dm - The DMMoab object
82985d305f5SVijay Mahadevan 
830d8d19677SJose E. Roman   Output Parameters:
831a2b725a8SWilliam Gropp + bdvtx - Boundary vertices
83285d305f5SVijay Mahadevan . bdelems - Boundary elements
833a2b725a8SWilliam Gropp - bdfaces - Boundary faces
83485d305f5SVijay Mahadevan 
83585d305f5SVijay Mahadevan   Level: beginner
83685d305f5SVijay Mahadevan 
837db781477SPatrick Sanan .seealso: `DMMoabCheckBoundaryVertices()`, `DMMoabIsEntityOnBoundary()`
83885d305f5SVijay Mahadevan @*/
8399371c9d4SSatish Balay PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range **bdelems, const moab::Range **bdfaces) {
8401cec0304SVijay Mahadevan   DM_Moab *dmmoab;
8411cec0304SVijay Mahadevan 
8421cec0304SVijay Mahadevan   PetscFunctionBegin;
8431cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8441cec0304SVijay Mahadevan   dmmoab = (DM_Moab *)(dm)->data;
8451cec0304SVijay Mahadevan 
8466d9eb265SVijay Mahadevan   if (bdvtx) *bdvtx = dmmoab->bndyvtx;
8476d9eb265SVijay Mahadevan   if (bdfaces) *bdfaces = dmmoab->bndyfaces;
8486d9eb265SVijay Mahadevan   if (bdelems) *bdfaces = dmmoab->bndyelems;
8491cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8501cec0304SVijay Mahadevan }
8511cec0304SVijay Mahadevan 
8529371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm) {
85385d305f5SVijay Mahadevan   PetscInt        i;
854e882eb38SVijay Mahadevan   moab::ErrorCode merr;
855f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab *)dm->data;
856f6829af0SVijay Mahadevan 
857f6829af0SVijay Mahadevan   PetscFunctionBegin;
858f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
859304006b3SVijay Mahadevan 
860304006b3SVijay Mahadevan   dmmoab->refct--;
861304006b3SVijay Mahadevan   if (!dmmoab->refct) {
862f6829af0SVijay Mahadevan     delete dmmoab->vlocal;
863f6829af0SVijay Mahadevan     delete dmmoab->vowned;
864f6829af0SVijay Mahadevan     delete dmmoab->vghost;
865f6829af0SVijay Mahadevan     delete dmmoab->elocal;
866f6829af0SVijay Mahadevan     delete dmmoab->eghost;
867f6829af0SVijay Mahadevan     delete dmmoab->bndyvtx;
868f6829af0SVijay Mahadevan     delete dmmoab->bndyfaces;
869f6829af0SVijay Mahadevan     delete dmmoab->bndyelems;
870f6829af0SVijay Mahadevan 
8719566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->gsindices));
8729566063dSJacob Faibussowitsch     PetscCall(PetscFree2(dmmoab->gidmap, dmmoab->lidmap));
8739566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->dfill));
8749566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->ofill));
8759566063dSJacob Faibussowitsch     PetscCall(PetscFree(dmmoab->materials));
87685d305f5SVijay Mahadevan     if (dmmoab->fieldNames) {
87748a46eb9SPierre Jolivet       for (i = 0; i < dmmoab->numFields; i++) PetscCall(PetscFree(dmmoab->fieldNames[i]));
8789566063dSJacob Faibussowitsch       PetscCall(PetscFree(dmmoab->fieldNames));
87985d305f5SVijay Mahadevan     }
880b117cd09SVijay Mahadevan 
881b117cd09SVijay Mahadevan     if (dmmoab->nhlevels) {
8829566063dSJacob Faibussowitsch       PetscCall(PetscFree(dmmoab->hsets));
883e882eb38SVijay Mahadevan       dmmoab->nhlevels = 0;
884e882eb38SVijay Mahadevan       if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
885e882eb38SVijay Mahadevan       dmmoab->hierarchy = NULL;
886b117cd09SVijay Mahadevan     }
887e882eb38SVijay Mahadevan 
888e882eb38SVijay Mahadevan     if (dmmoab->icreatedinstance) {
8899c368985SVijay Mahadevan       delete dmmoab->pcomm;
8909371c9d4SSatish Balay       merr = dmmoab->mbiface->delete_mesh();
8919371c9d4SSatish Balay       MBERRNM(merr);
892e882eb38SVijay Mahadevan       delete dmmoab->mbiface;
893e882eb38SVijay Mahadevan     }
894e882eb38SVijay Mahadevan     dmmoab->mbiface = NULL;
8959daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
896e882eb38SVijay Mahadevan     dmmoab->pcomm = NULL;
8979daf19fdSVijay Mahadevan #endif
8989566063dSJacob Faibussowitsch     PetscCall(VecScatterDestroy(&dmmoab->ltog_sendrecv));
8999566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map));
9009566063dSJacob Faibussowitsch     PetscCall(PetscFree(dm->data));
901304006b3SVijay Mahadevan   }
902f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
903f6829af0SVijay Mahadevan }
904f6829af0SVijay Mahadevan 
9059371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(DM dm, PetscOptionItems *PetscOptionsObject) {
9062e4e7c01SVijay Mahadevan   DM_Moab *dmmoab = (DM_Moab *)dm->data;
9072e4e7c01SVijay Mahadevan 
9082e4e7c01SVijay Mahadevan   PetscFunctionBegin;
909d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "DMMoab Options");
9109566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBoundedInt("-dm_moab_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "DMView", dmmoab->rw_dbglevel, &dmmoab->rw_dbglevel, NULL, 0));
9119566063dSJacob Faibussowitsch   PetscCall(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));
9122e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
9139566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-dm_moab_read_opts", "Extra options to enable MOAB reader to load DM from file", "DMView", dmmoab->extra_read_options, dmmoab->extra_read_options, sizeof(dmmoab->extra_read_options), NULL));
9149566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-dm_moab_write_opts", "Extra options to enable MOAB writer to serialize DM to file", "DMView", dmmoab->extra_write_options, dmmoab->extra_write_options, sizeof(dmmoab->extra_write_options), NULL));
9159566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum *)&dmmoab->read_mode, NULL));
9169566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum *)&dmmoab->write_mode, NULL));
917d0609cedSBarry Smith   PetscOptionsHeadEnd();
9182e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
9192e4e7c01SVijay Mahadevan }
9202e4e7c01SVijay Mahadevan 
9219371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm) {
922f6829af0SVijay Mahadevan   moab::ErrorCode       merr;
923f6829af0SVijay Mahadevan   Vec                   local, global;
924f6829af0SVijay Mahadevan   IS                    from, to;
925f6829af0SVijay Mahadevan   moab::Range::iterator iter;
926304006b3SVijay Mahadevan   PetscInt              i, j, f, bs, vent, totsize, *lgmap;
927f6829af0SVijay Mahadevan   DM_Moab              *dmmoab = (DM_Moab *)dm->data;
928f6829af0SVijay Mahadevan   moab::Range           adjs;
929f6829af0SVijay Mahadevan 
930f6829af0SVijay Mahadevan   PetscFunctionBegin;
931f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
932f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
93308401ef6SPierre Jolivet   PetscCheck(dmmoab->mbiface != NULL, PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp.");
9349daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
93508401ef6SPierre Jolivet   PetscCheck(dmmoab->pcomm != NULL, PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp.");
9369daf19fdSVijay Mahadevan #endif
937f6829af0SVijay Mahadevan 
938f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
9399371c9d4SSatish Balay   if (dmmoab->vlocal->empty()) {
94049d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
9419371c9d4SSatish Balay     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false);
9429371c9d4SSatish Balay     MBERRNM(merr);
943f6829af0SVijay Mahadevan 
9449daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
945f6829af0SVijay Mahadevan     /* filter based on parallel status */
9469371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned);
9479371c9d4SSatish Balay     MBERRNM(merr);
948f6829af0SVijay Mahadevan 
949f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
9509c368985SVijay Mahadevan     // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
951f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
9529371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost);
9539371c9d4SSatish Balay     MBERRNM(merr);
954f6829af0SVijay Mahadevan     adjs            = moab::subtract(adjs, *dmmoab->vghost);
955f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
9569daf19fdSVijay Mahadevan #else
9579daf19fdSVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
9589daf19fdSVijay Mahadevan #endif
959f6829af0SVijay Mahadevan 
960f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
961f6829af0SVijay Mahadevan     dmmoab->nloc   = dmmoab->vowned->size();
962f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
96349d66b22SVijay Mahadevan 
9649daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
9651c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
96663a3b9bcSJacob Faibussowitsch     PetscInfo(NULL, "Filset ID: %lu, Vertices: local - %zu, owned - %" PetscInt_FMT ", ghosted - %" PetscInt_FMT ".\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost);
9679daf19fdSVijay Mahadevan #else
9689daf19fdSVijay Mahadevan     dmmoab->n       = dmmoab->nloc;
9699daf19fdSVijay Mahadevan #endif
970f6829af0SVijay Mahadevan   }
971f6829af0SVijay Mahadevan 
972f6829af0SVijay Mahadevan   {
973f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
974f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
975f6829af0SVijay Mahadevan 
976f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
977f6829af0SVijay Mahadevan     for (i = 3; i > 0; i--) {
978f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
9799371c9d4SSatish Balay       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false);
9809371c9d4SSatish Balay       MBERRNM(merr);
981f6829af0SVijay Mahadevan 
982f6829af0SVijay Mahadevan       /* store the current mesh dimension */
983f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
984f6829af0SVijay Mahadevan         dmmoab->dim = i;
985f6829af0SVijay Mahadevan         break;
986f6829af0SVijay Mahadevan       }
987f6829af0SVijay Mahadevan     }
988f6829af0SVijay Mahadevan 
9899566063dSJacob Faibussowitsch     PetscCall(DMSetDimension(dm, dmmoab->dim));
990b117cd09SVijay Mahadevan 
9919daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
992f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
993f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
9949371c9d4SSatish Balay     merr            = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT);
9959371c9d4SSatish Balay     MBERRNM(merr);
996f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
9979daf19fdSVijay Mahadevan #endif
998f6829af0SVijay Mahadevan 
999f6829af0SVijay Mahadevan     dmmoab->neleloc   = dmmoab->elocal->size();
1000f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
100149d66b22SVijay Mahadevan 
10029daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
10031c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm));
100463a3b9bcSJacob Faibussowitsch     PetscInfo(NULL, "%d-dim elements: owned - %" PetscInt_FMT ", ghosted - %" PetscInt_FMT ".\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost);
10059daf19fdSVijay Mahadevan #else
10069daf19fdSVijay Mahadevan     dmmoab->nele    = dmmoab->neleloc;
10079daf19fdSVijay Mahadevan #endif
1008f6829af0SVijay Mahadevan   }
1009f6829af0SVijay Mahadevan 
1010f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1011f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1012f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1013f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1014f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
10159371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);
10169371c9d4SSatish Balay     MBERRNM(merr);
1017f6829af0SVijay Mahadevan   }
1018f6829af0SVijay Mahadevan 
1019f6829af0SVijay Mahadevan   totsize = dmmoab->vlocal->size();
10201dca8a05SBarry Smith   PetscCheck(totsize == dmmoab->nloc + dmmoab->nghost, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %" PetscInt_FMT " != %" PetscInt_FMT ".", totsize, dmmoab->nloc + dmmoab->nghost);
10219566063dSJacob Faibussowitsch   PetscCall(PetscCalloc1(totsize, &dmmoab->gsindices));
1022f6829af0SVijay Mahadevan   {
1023f6829af0SVijay Mahadevan     /* first get the local indices */
10249371c9d4SSatish Balay     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]);
10259371c9d4SSatish Balay     MBERRNM(merr);
10263f1c6e43SVijay Mahadevan     if (dmmoab->nghost) { /* next get the ghosted indices */
10279371c9d4SSatish Balay       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]);
10289371c9d4SSatish Balay       MBERRNM(merr);
1029f6829af0SVijay Mahadevan     }
1030f6829af0SVijay Mahadevan 
1031f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1032304006b3SVijay Mahadevan     dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0];
1033f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1034304006b3SVijay Mahadevan       if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i];
1035304006b3SVijay Mahadevan       if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i];
1036f6829af0SVijay Mahadevan     }
1037f6829af0SVijay Mahadevan 
10381c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm));
10391c2dc1cbSBarry Smith     PetscCall(MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm));
1040f6829af0SVijay Mahadevan 
1041f6829af0SVijay Mahadevan     /* set the GID map */
10429371c9d4SSatish Balay     for (i = 0; i < totsize; ++i) { dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */ }
1043304006b3SVijay Mahadevan     dmmoab->lminmax[0] -= dmmoab->gminmax[0];
1044304006b3SVijay Mahadevan     dmmoab->lminmax[1] -= dmmoab->gminmax[0];
1045f6829af0SVijay Mahadevan 
104663a3b9bcSJacob Faibussowitsch     PetscInfo(NULL, "GLOBAL_ID: Local [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "], Global [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "]\n", dmmoab->lminmax[0], dmmoab->lminmax[1], dmmoab->gminmax[0], dmmoab->gminmax[1]);
1047f6829af0SVijay Mahadevan   }
10489371c9d4SSatish Balay   PetscCheck(dmmoab->bs == dmmoab->numFields || dmmoab->bs == 1, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between block size and number of component fields. %" PetscInt_FMT " != 1 OR %" PetscInt_FMT " != %" PetscInt_FMT ".", dmmoab->bs, dmmoab->bs,
10499371c9d4SSatish Balay              dmmoab->numFields);
1050f6829af0SVijay Mahadevan 
1051f6829af0SVijay Mahadevan   {
10529c368985SVijay Mahadevan     dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front());
10539c368985SVijay Mahadevan     dmmoab->seqend   = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back());
105463a3b9bcSJacob Faibussowitsch     PetscInfo(NULL, "SEQUENCE: Local [min, max] - [%" PetscInt_FMT ", %" PetscInt_FMT "]\n", dmmoab->seqstart, dmmoab->seqend);
10553f1c6e43SVijay Mahadevan 
10569566063dSJacob Faibussowitsch     PetscCall(PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap));
10579566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(totsize * dmmoab->numFields, &lgmap));
1058f6829af0SVijay Mahadevan 
1059f6829af0SVijay Mahadevan     i = j = 0;
1060f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1061f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) {
1062e92d1c7cSVijay Mahadevan       vent                 = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1063f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1064f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1065ad540459SPierre Jolivet       for (f = 0; f < dmmoab->numFields; f++, j++) lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1066f6829af0SVijay Mahadevan     }
1067f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1068f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) {
1069e92d1c7cSVijay Mahadevan       vent                 = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1070f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1071f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1072ad540459SPierre Jolivet       for (f = 0; f < dmmoab->numFields; f++, j++) lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1073f6829af0SVijay Mahadevan     }
1074f6829af0SVijay Mahadevan 
1075f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1076f6829af0SVijay Mahadevan        1) First create a local and global vector
1077f6829af0SVijay Mahadevan        2) Create a local and global IS
1078f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1079f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1080f6829af0SVijay Mahadevan     */
10819566063dSJacob Faibussowitsch     PetscCall(DMCreateGlobalVector(dm, &global));
10829566063dSJacob Faibussowitsch     PetscCall(DMCreateLocalVector(dm, &local));
1083f6829af0SVijay Mahadevan 
10849566063dSJacob Faibussowitsch     PetscCall(VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend));
1085f6829af0SVijay Mahadevan 
1086f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
10879566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from));
10889566063dSJacob Faibussowitsch     PetscCall(ISSetBlockSize(from, bs));
1089f6829af0SVijay Mahadevan 
10909566063dSJacob Faibussowitsch     PetscCall(ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to));
10919566063dSJacob Faibussowitsch     PetscCall(ISSetBlockSize(to, bs));
1092f6829af0SVijay Mahadevan 
1093f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1094f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
10959566063dSJacob Faibussowitsch       PetscCall(ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap, PETSC_COPY_VALUES, &dmmoab->ltog_map));
1096f6829af0SVijay Mahadevan     }
1097f6829af0SVijay Mahadevan 
1098f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
10999566063dSJacob Faibussowitsch     PetscCall(VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv));
1100f6829af0SVijay Mahadevan 
1101f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11029566063dSJacob Faibussowitsch     PetscCall(PetscFree(lgmap));
11039566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&from));
11049566063dSJacob Faibussowitsch     PetscCall(ISDestroy(&to));
11059566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&local));
11069566063dSJacob Faibussowitsch     PetscCall(VecDestroy(&global));
1107f6829af0SVijay Mahadevan   }
1108f6829af0SVijay Mahadevan 
110949d66b22SVijay Mahadevan   dmmoab->bndyvtx   = new moab::Range();
111049d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
111149d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1112f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
11139c368985SVijay Mahadevan   if (!dmmoab->hlevel) {
1114f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1115f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1116f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1117f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1118f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1119f6829af0SVijay Mahadevan 
1120f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
11219371c9d4SSatish Balay     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, true, true, false);
11229371c9d4SSatish Balay     MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
1123f6829af0SVijay Mahadevan 
11249daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1125f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
11269371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT);
11279371c9d4SSatish Balay     MBERRNM(merr);
11289371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT);
11299371c9d4SSatish Balay     MBERRNM(merr);
11309daf19fdSVijay Mahadevan #endif
1131f6829af0SVijay Mahadevan 
1132f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
11339371c9d4SSatish Balay     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);
11349371c9d4SSatish Balay     MBERRNM(merr);
11359371c9d4SSatish Balay     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);
11369371c9d4SSatish Balay     MBERRNM(merr);
11379371c9d4SSatish Balay   } else {
11389c368985SVijay Mahadevan     /* Let us query the hierarchy manager and get the results directly for this level */
11399c368985SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) {
11409c368985SVijay Mahadevan       moab::EntityHandle elemHandle = *iter;
11419c368985SVijay Mahadevan       if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) {
11429c368985SVijay Mahadevan         dmmoab->bndyelems->insert(elemHandle);
11439c368985SVijay Mahadevan         /* For this boundary element, query the vertices and add them to the list */
11449c368985SVijay Mahadevan         std::vector<moab::EntityHandle> connect;
11459371c9d4SSatish Balay         merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect);
11469371c9d4SSatish Balay         MBERRNM(merr);
11479c368985SVijay Mahadevan         for (unsigned iv = 0; iv < connect.size(); ++iv)
11489371c9d4SSatish Balay           if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv])) dmmoab->bndyvtx->insert(connect[iv]);
11499c368985SVijay Mahadevan         /* Next, let us query the boundary faces and add them also to the list */
11509c368985SVijay Mahadevan         std::vector<moab::EntityHandle> faces;
11519371c9d4SSatish Balay         merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim - 1, faces);
11529371c9d4SSatish Balay         MBERRNM(merr);
11539c368985SVijay Mahadevan         for (unsigned ifa = 0; ifa < faces.size(); ++ifa)
11549371c9d4SSatish Balay           if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa])) dmmoab->bndyfaces->insert(faces[ifa]);
11559c368985SVijay Mahadevan       }
11569c368985SVijay Mahadevan     }
11579c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI
11589c368985SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
11599371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx, PSTATUS_NOT_OWNED, PSTATUS_NOT);
11609371c9d4SSatish Balay     MBERRNM(merr);
11619371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT);
11629371c9d4SSatish Balay     MBERRNM(merr);
11639371c9d4SSatish Balay     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT);
11649371c9d4SSatish Balay     MBERRNM(merr);
11659c368985SVijay Mahadevan #endif
11669c368985SVijay Mahadevan   }
116763a3b9bcSJacob Faibussowitsch   PetscInfo(NULL, "Found %zu boundary vertices, %zu boundary faces and %zu boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size());
1168a044f6b6SVijay Mahadevan 
1169a044f6b6SVijay Mahadevan   /* Get the material sets and populate the data for all locally owned elements */
1170a044f6b6SVijay Mahadevan   {
11719566063dSJacob Faibussowitsch     PetscCall(PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials));
1172a044f6b6SVijay Mahadevan     /* Get the count of entities of particular type from dmmoab->elocal
1173a044f6b6SVijay Mahadevan        -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */
1174a044f6b6SVijay Mahadevan     moab::Range msets;
11759371c9d4SSatish Balay     merr = dmmoab->mbiface->get_entities_by_type_and_tag(dmmoab->fileset, moab::MBENTITYSET, &dmmoab->material_tag, NULL, 1, msets, moab::Interface::UNION);
11769371c9d4SSatish Balay     MB_CHK_ERR(merr);
1177ad540459SPierre Jolivet     if (msets.size() == 0) PetscInfo(NULL, "No material sets found in the fileset.");
1178a044f6b6SVijay Mahadevan 
1179a044f6b6SVijay Mahadevan     for (unsigned i = 0; i < msets.size(); ++i) {
1180a044f6b6SVijay Mahadevan       moab::Range msetelems;
11819371c9d4SSatish Balay       merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);
11829371c9d4SSatish Balay       MB_CHK_ERR(merr);
1183aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI
1184aedf4482SVijay Mahadevan       /* filter all the non-owned and shared entities out of the list */
11859371c9d4SSatish Balay       merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT);
11869371c9d4SSatish Balay       MBERRNM(merr);
1187aedf4482SVijay Mahadevan #endif
1188a044f6b6SVijay Mahadevan 
1189a044f6b6SVijay Mahadevan       int                partID;
1190a044f6b6SVijay Mahadevan       moab::EntityHandle mset = msets[i];
11919371c9d4SSatish Balay       merr                    = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);
11929371c9d4SSatish Balay       MB_CHK_ERR(merr);
1193a044f6b6SVijay Mahadevan 
11949371c9d4SSatish Balay       for (unsigned j = 0; j < msetelems.size(); ++j) dmmoab->materials[dmmoab->elocal->index(msetelems[j])] = partID;
1195a044f6b6SVijay Mahadevan     }
1196a044f6b6SVijay Mahadevan   }
1197a044f6b6SVijay Mahadevan 
1198f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1199f6829af0SVijay Mahadevan }
1200f6829af0SVijay Mahadevan 
1201cab5ea25SPierre Jolivet /*@C
1202304006b3SVijay Mahadevan   DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM.
1203304006b3SVijay Mahadevan 
1204d083f849SBarry Smith   Collective
1205304006b3SVijay Mahadevan 
1206304006b3SVijay Mahadevan   Input Parameters:
1207304006b3SVijay Mahadevan + dm - The DM object
1208304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1209304006b3SVijay Mahadevan . conn - The connectivity of the element
1210a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1211304006b3SVijay Mahadevan 
1212304006b3SVijay Mahadevan   Output Parameter:
1213304006b3SVijay Mahadevan . overts  - The list of vertices that were created (can be NULL)
1214304006b3SVijay Mahadevan 
1215304006b3SVijay Mahadevan   Level: beginner
1216304006b3SVijay Mahadevan 
1217db781477SPatrick Sanan .seealso: `DMMoabCreateSubmesh()`, `DMMoabCreateElement()`
1218304006b3SVijay Mahadevan @*/
12199371c9d4SSatish Balay PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal *coords, PetscInt nverts, moab::Range *overts) {
1220304006b3SVijay Mahadevan   moab::ErrorCode merr;
1221304006b3SVijay Mahadevan   DM_Moab        *dmmoab;
1222304006b3SVijay Mahadevan   moab::Range     verts;
1223304006b3SVijay Mahadevan 
1224304006b3SVijay Mahadevan   PetscFunctionBegin;
1225304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1226304006b3SVijay Mahadevan   PetscValidPointer(coords, 2);
1227304006b3SVijay Mahadevan 
1228304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1229304006b3SVijay Mahadevan 
1230304006b3SVijay Mahadevan   /* Insert new points */
12319371c9d4SSatish Balay   merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts);
12329371c9d4SSatish Balay   MBERRNM(merr);
12339371c9d4SSatish Balay   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts);
12349371c9d4SSatish Balay   MBERRNM(merr);
1235304006b3SVijay Mahadevan 
1236304006b3SVijay Mahadevan   if (overts) *overts = verts;
1237304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1238304006b3SVijay Mahadevan }
1239304006b3SVijay Mahadevan 
1240cab5ea25SPierre Jolivet /*@C
1241304006b3SVijay Mahadevan   DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM.
1242304006b3SVijay Mahadevan 
1243d083f849SBarry Smith   Collective
1244304006b3SVijay Mahadevan 
1245304006b3SVijay Mahadevan   Input Parameters:
1246304006b3SVijay Mahadevan + dm - The DM object
1247304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1248304006b3SVijay Mahadevan . conn - The connectivity of the element
1249a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1250304006b3SVijay Mahadevan 
1251304006b3SVijay Mahadevan   Output Parameter:
1252304006b3SVijay Mahadevan . oelem  - The handle to the element created and added to the DM object
1253304006b3SVijay Mahadevan 
1254304006b3SVijay Mahadevan   Level: beginner
1255304006b3SVijay Mahadevan 
1256db781477SPatrick Sanan .seealso: `DMMoabCreateSubmesh()`, `DMMoabCreateVertices()`
1257304006b3SVijay Mahadevan @*/
12589371c9d4SSatish Balay PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle *conn, PetscInt nverts, moab::EntityHandle *oelem) {
1259304006b3SVijay Mahadevan   moab::ErrorCode    merr;
1260304006b3SVijay Mahadevan   DM_Moab           *dmmoab;
1261304006b3SVijay Mahadevan   moab::EntityHandle elem;
1262304006b3SVijay Mahadevan 
1263304006b3SVijay Mahadevan   PetscFunctionBegin;
1264304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1265304006b3SVijay Mahadevan   PetscValidPointer(conn, 3);
1266304006b3SVijay Mahadevan 
1267304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1268304006b3SVijay Mahadevan 
1269304006b3SVijay Mahadevan   /* Insert new element */
12709371c9d4SSatish Balay   merr = dmmoab->mbiface->create_element(type, conn, nverts, elem);
12719371c9d4SSatish Balay   MBERRNM(merr);
12729371c9d4SSatish Balay   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1);
12739371c9d4SSatish Balay   MBERRNM(merr);
1274304006b3SVijay Mahadevan 
1275304006b3SVijay Mahadevan   if (oelem) *oelem = elem;
1276304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1277304006b3SVijay Mahadevan }
1278304006b3SVijay Mahadevan 
1279cab5ea25SPierre Jolivet /*@C
1280304006b3SVijay Mahadevan   DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent
1281304006b3SVijay Mahadevan   in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to
1282304006b3SVijay Mahadevan   create a DM object on a refined level.
1283304006b3SVijay Mahadevan 
1284d083f849SBarry Smith   Collective
1285304006b3SVijay Mahadevan 
1286304006b3SVijay Mahadevan   Input Parameters:
1287a2b725a8SWilliam Gropp . dm - The DM object
1288304006b3SVijay Mahadevan 
1289304006b3SVijay Mahadevan   Output Parameter:
1290304006b3SVijay Mahadevan . newdm  - The sub DM object with updated set information
1291304006b3SVijay Mahadevan 
1292304006b3SVijay Mahadevan   Level: advanced
1293304006b3SVijay Mahadevan 
1294db781477SPatrick Sanan .seealso: `DMCreate()`, `DMMoabCreateVertices()`, `DMMoabCreateElement()`
1295304006b3SVijay Mahadevan @*/
12969371c9d4SSatish Balay PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm) {
1297304006b3SVijay Mahadevan   DM_Moab        *dmmoab;
1298304006b3SVijay Mahadevan   DM_Moab        *ndmmoab;
1299304006b3SVijay Mahadevan   moab::ErrorCode merr;
1300304006b3SVijay Mahadevan 
1301304006b3SVijay Mahadevan   PetscFunctionBegin;
1302304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1303304006b3SVijay Mahadevan 
1304304006b3SVijay Mahadevan   dmmoab = (DM_Moab *)dm->data;
1305304006b3SVijay Mahadevan 
1306304006b3SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
13079566063dSJacob Faibussowitsch   PetscCall(DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, PETSC_NULL, newdm));
1308304006b3SVijay Mahadevan 
1309304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1310304006b3SVijay Mahadevan   ndmmoab = (DM_Moab *)(*newdm)->data;
1311304006b3SVijay Mahadevan 
1312304006b3SVijay Mahadevan   /* set the sub-mesh's parent DM reference */
1313304006b3SVijay Mahadevan   ndmmoab->parent = &dm;
1314304006b3SVijay Mahadevan 
1315304006b3SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
13169371c9d4SSatish Balay   merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset);
13179371c9d4SSatish Balay   MBERR("Creating file set failed", merr);
1318304006b3SVijay Mahadevan 
1319304006b3SVijay Mahadevan   /* create a meshset and then add old fileset as child */
13209371c9d4SSatish Balay   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal);
13219371c9d4SSatish Balay   MBERR("Adding child vertices to parent failed", merr);
13229371c9d4SSatish Balay   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal);
13239371c9d4SSatish Balay   MBERR("Adding child elements to parent failed", merr);
1324304006b3SVijay Mahadevan 
1325304006b3SVijay Mahadevan   /* preserve the field association between the parent and sub-mesh objects */
13269566063dSJacob Faibussowitsch   PetscCall(DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames));
1327304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1328304006b3SVijay Mahadevan }
1329304006b3SVijay Mahadevan 
13309371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer) {
1331304006b3SVijay Mahadevan   DM_Moab    *dmmoab = (DM_Moab *)(dm)->data;
1332304006b3SVijay Mahadevan   const char *name;
1333304006b3SVijay Mahadevan   MPI_Comm    comm;
1334304006b3SVijay Mahadevan   PetscMPIInt size;
1335304006b3SVijay Mahadevan 
1336304006b3SVijay Mahadevan   PetscFunctionBegin;
13379566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)dm, &comm));
13389566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
13399566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetName((PetscObject)dm, &name));
13409566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPushTab(viewer));
134163a3b9bcSJacob Faibussowitsch   if (name) PetscCall(PetscViewerASCIIPrintf(viewer, "%s in %" PetscInt_FMT " dimensions:\n", name, dmmoab->dim));
134263a3b9bcSJacob Faibussowitsch   else PetscCall(PetscViewerASCIIPrintf(viewer, "Mesh in %" PetscInt_FMT " dimensions:\n", dmmoab->dim));
1343304006b3SVijay Mahadevan   /* print details about the global mesh */
1344304006b3SVijay Mahadevan   {
13459566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
134663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Sizes: cells=%" PetscInt_FMT ", vertices=%" PetscInt_FMT ", blocks=%" PetscInt_FMT "\n", dmmoab->nele, dmmoab->n, dmmoab->bs));
1347304006b3SVijay Mahadevan     /* print boundary data */
134863a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Boundary trace:\n"));
1349304006b3SVijay Mahadevan     {
13509566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
135163a3b9bcSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "cells=%zu, faces=%zu, vertices=%zu\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size()));
13529566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
1353304006b3SVijay Mahadevan     }
1354304006b3SVijay Mahadevan     /* print field data */
135563a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Fields: %" PetscInt_FMT " components\n", dmmoab->numFields));
1356304006b3SVijay Mahadevan     {
13579566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPushTab(viewer));
135848a46eb9SPierre Jolivet       for (int i = 0; i < dmmoab->numFields; ++i) PetscCall(PetscViewerASCIIPrintf(viewer, "[%" PetscInt_FMT "] - %s\n", i, dmmoab->fieldNames[i]));
13599566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPopTab(viewer));
1360304006b3SVijay Mahadevan     }
13619566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
1362304006b3SVijay Mahadevan   }
13639566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIPopTab(viewer));
13649566063dSJacob Faibussowitsch   PetscCall(PetscViewerFlush(viewer));
1365304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1366304006b3SVijay Mahadevan }
1367304006b3SVijay Mahadevan 
13689371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v) {
1369304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1370304006b3SVijay Mahadevan }
1371304006b3SVijay Mahadevan 
13729371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v) {
1373304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1374304006b3SVijay Mahadevan }
1375304006b3SVijay Mahadevan 
13769371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer) {
1377304006b3SVijay Mahadevan   PetscBool iascii, ishdf5, isvtk;
1378304006b3SVijay Mahadevan 
1379304006b3SVijay Mahadevan   PetscFunctionBegin;
1380304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1381304006b3SVijay Mahadevan   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
13829566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
13839566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERVTK, &isvtk));
13849566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERHDF5, &ishdf5));
1385304006b3SVijay Mahadevan   if (iascii) {
13869566063dSJacob Faibussowitsch     PetscCall(DMMoabView_Ascii(dm, viewer));
1387304006b3SVijay Mahadevan   } else if (ishdf5) {
1388304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5)
13899566063dSJacob Faibussowitsch     PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ));
13909566063dSJacob Faibussowitsch     PetscCall(DMMoabView_HDF5(dm, viewer));
13919566063dSJacob Faibussowitsch     PetscCall(PetscViewerPopFormat(viewer));
1392304006b3SVijay Mahadevan #else
1393304006b3SVijay Mahadevan     SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1394304006b3SVijay Mahadevan #endif
13959371c9d4SSatish Balay   } else if (isvtk) {
13969566063dSJacob Faibussowitsch     PetscCall(DMMoabView_VTK(dm, viewer));
1397304006b3SVijay Mahadevan   }
1398304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1399304006b3SVijay Mahadevan }
1400304006b3SVijay Mahadevan 
14019371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm) {
1402304006b3SVijay Mahadevan   PetscFunctionBegin;
1403304006b3SVijay Mahadevan   dm->ops->view                     = DMView_Moab;
1404304006b3SVijay Mahadevan   dm->ops->load                     = NULL /* DMLoad_Moab */;
1405304006b3SVijay Mahadevan   dm->ops->setfromoptions           = DMSetFromOptions_Moab;
1406304006b3SVijay Mahadevan   dm->ops->clone                    = DMClone_Moab;
1407304006b3SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
14081bb6d2a8SBarry Smith   dm->ops->createlocalsection       = NULL;
1409304006b3SVijay Mahadevan   dm->ops->createdefaultconstraints = NULL;
1410304006b3SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1411304006b3SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1412304006b3SVijay Mahadevan   dm->ops->getlocaltoglobalmapping  = NULL;
1413304006b3SVijay Mahadevan   dm->ops->createfieldis            = NULL;
1414304006b3SVijay Mahadevan   dm->ops->createcoordinatedm       = NULL /* DMCreateCoordinateDM_Moab */;
1415304006b3SVijay Mahadevan   dm->ops->getcoloring              = NULL;
1416304006b3SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1417304006b3SVijay Mahadevan   dm->ops->createinterpolation      = DMCreateInterpolation_Moab;
14185a84ad33SLisandro Dalcin   dm->ops->createinjection          = NULL /* DMCreateInjection_Moab */;
1419304006b3SVijay Mahadevan   dm->ops->refine                   = DMRefine_Moab;
1420304006b3SVijay Mahadevan   dm->ops->coarsen                  = DMCoarsen_Moab;
1421304006b3SVijay Mahadevan   dm->ops->refinehierarchy          = DMRefineHierarchy_Moab;
1422304006b3SVijay Mahadevan   dm->ops->coarsenhierarchy         = DMCoarsenHierarchy_Moab;
1423304006b3SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1424304006b3SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1425304006b3SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1426304006b3SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1427304006b3SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
1428304006b3SVijay Mahadevan   dm->ops->createsubdm              = NULL /* DMCreateSubDM_Moab */;
1429304006b3SVijay Mahadevan   dm->ops->getdimpoints             = NULL /* DMGetDimPoints_Moab */;
1430304006b3SVijay Mahadevan   dm->ops->locatepoints             = NULL /* DMLocatePoints_Moab */;
1431304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1432304006b3SVijay Mahadevan }
1433304006b3SVijay Mahadevan 
14349371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm) {
1435304006b3SVijay Mahadevan   PetscFunctionBegin;
1436304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1437304006b3SVijay Mahadevan   (*newdm)->data = (DM_Moab *)dm->data;
1438304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->refct++;
1439304006b3SVijay Mahadevan 
14409566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)*newdm, DMMOAB));
14419566063dSJacob Faibussowitsch   PetscCall(DMInitialize_Moab(*newdm));
1442304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1443304006b3SVijay Mahadevan }
1444304006b3SVijay Mahadevan 
14459371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm) {
1446f6829af0SVijay Mahadevan   PetscFunctionBegin;
1447f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1448*4dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew((DM_Moab **)&dm->data));
1449f6829af0SVijay Mahadevan 
1450f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->bs            = 1;
1451f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->numFields     = 1;
1452f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->n             = 0;
1453f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nloc          = 0;
1454f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nghost        = 0;
1455f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->nele          = 0;
1456f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->neleloc       = 0;
1457f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->neleghost     = 0;
1458c528d872SBarry Smith   ((DM_Moab *)dm->data)->ltog_map      = NULL;
1459c528d872SBarry Smith   ((DM_Moab *)dm->data)->ltog_sendrecv = NULL;
1460f6829af0SVijay Mahadevan 
1461304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->refct  = 1;
1462304006b3SVijay Mahadevan   ((DM_Moab *)dm->data)->parent = NULL;
1463f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vlocal = new moab::Range();
1464f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vowned = new moab::Range();
1465f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->vghost = new moab::Range();
1466f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->elocal = new moab::Range();
1467f6829af0SVijay Mahadevan   ((DM_Moab *)dm->data)->eghost = new moab::Range();
1468f6829af0SVijay Mahadevan 
14699566063dSJacob Faibussowitsch   PetscCall(DMInitialize_Moab(dm));
1470f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1471f6829af0SVijay Mahadevan }
1472