xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision aedf4482a357cdf7562ec586739bcf784744929d)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
21d72bce8STim Tautges 
31d72bce8STim Tautges #include <petscdmmoab.h>
488face26SJed Brown #include <MBTagConventions.hpp>
59daf19fdSVijay Mahadevan #include <moab/NestedRefine.hpp>
61cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
7032b8ab6SVijay Mahadevan 
8c6ef30f9SVijay Mahadevan /*MC
9c6ef30f9SVijay Mahadevan   DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database.
10c6ef30f9SVijay Mahadevan                     Direct access to the MOAB Interface and other mesh manipulation related objects are available
11c6ef30f9SVijay Mahadevan                     through public API. Ability to create global and local representation of Vecs containing all
12c6ef30f9SVijay Mahadevan                     unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided
13c6ef30f9SVijay Mahadevan                     along with utility functions to traverse the mesh and assemble a discrete system via
14c6ef30f9SVijay Mahadevan                     field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are
15c6ef30f9SVijay Mahadevan                     available.
16c6ef30f9SVijay Mahadevan 
17c6ef30f9SVijay Mahadevan   Reference: http://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html
18c6ef30f9SVijay Mahadevan 
19c6ef30f9SVijay Mahadevan   Level: intermediate
20c6ef30f9SVijay Mahadevan 
21c6ef30f9SVijay Mahadevan .seealso: DMType, DMMoabCreate(), DMCreate(), DMSetType(), DMMoabCreateMoab()
22c6ef30f9SVijay Mahadevan M*/
23c6ef30f9SVijay Mahadevan 
24304006b3SVijay Mahadevan /* External function declarations here */
25304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling);
26304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm);
27304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm,  Mat *J);
28304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm);
29304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined);
30304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened);
31304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]);
32304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm, PetscInt nlevels, DM dmCoarsened[]);
33304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm);
34304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM, Vec *);
35304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM, Vec *);
36304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm, Mat *J);
37304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM, Vec, InsertMode, Vec);
38304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM, Vec, InsertMode, Vec);
39304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM, Vec, InsertMode, Vec);
40304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM, Vec, InsertMode, Vec);
41304006b3SVijay Mahadevan 
42304006b3SVijay Mahadevan 
43304006b3SVijay Mahadevan /* Un-implemented routines */
44304006b3SVijay Mahadevan /*
45304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultSection_Moab(DM dm);
46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat);
47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer);
48304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd);
49304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm);
50304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS);
51304006b3SVijay Mahadevan */
52c6ef30f9SVijay Mahadevan 
531d72bce8STim Tautges /*@
541d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
551d72bce8STim Tautges 
561d72bce8STim Tautges   Collective on MPI_Comm
571d72bce8STim Tautges 
581d72bce8STim Tautges   Input Parameter:
591d72bce8STim Tautges . comm - The communicator for the DMMoab object
601d72bce8STim Tautges 
611d72bce8STim Tautges   Output Parameter:
62032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
631d72bce8STim Tautges 
641d72bce8STim Tautges   Level: beginner
651d72bce8STim Tautges 
661d72bce8STim Tautges .keywords: DMMoab, create
671d72bce8STim Tautges @*/
68032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
691d72bce8STim Tautges {
701d72bce8STim Tautges   PetscErrorCode ierr;
711d72bce8STim Tautges 
721d72bce8STim Tautges   PetscFunctionBegin;
73032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 2);
74032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
75032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
761d72bce8STim Tautges   PetscFunctionReturn(0);
771d72bce8STim Tautges }
781d72bce8STim Tautges 
791d72bce8STim Tautges /*@
80b117cd09SVijay Mahadevan   DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data
811d72bce8STim Tautges 
821d72bce8STim Tautges   Collective on MPI_Comm
831d72bce8STim Tautges 
841d72bce8STim Tautges   Input Parameter:
851d72bce8STim Tautges . comm - The communicator for the DMMoab object
86032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
87a4d2169cSTim Tautges          along with the DMMoab
88a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
891d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
901d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
911d72bce8STim Tautges 
921d72bce8STim Tautges   Output Parameter:
93032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
941d72bce8STim Tautges 
95032b8ab6SVijay Mahadevan   Level: intermediate
961d72bce8STim Tautges 
971d72bce8STim Tautges .keywords: DMMoab, create
981d72bce8STim Tautges @*/
999daf19fdSVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
1001d72bce8STim Tautges {
1011d72bce8STim Tautges   PetscErrorCode ierr;
102032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
10385d305f5SVijay Mahadevan   DM             dmmb;
104853cdec3SJed Brown   DM_Moab        *dmmoab;
1051d72bce8STim Tautges 
1061d72bce8STim Tautges   PetscFunctionBegin;
107032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 6);
10885d305f5SVijay Mahadevan 
10985d305f5SVijay Mahadevan   ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr);
11085d305f5SVijay Mahadevan   dmmoab = (DM_Moab*)(dmmb)->data;
111a4d2169cSTim Tautges 
112a4d2169cSTim Tautges   if (!mbiface) {
11372ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
1147d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1151d72bce8STim Tautges   }
1161cec0304SVijay Mahadevan   else {
1171cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
1187d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1191cec0304SVijay Mahadevan   }
1201cec0304SVijay Mahadevan 
121b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
122b5410836SVijay Mahadevan   dmmoab->fileset = 0;
123b117cd09SVijay Mahadevan   dmmoab->hlevel = 0;
12449d66b22SVijay Mahadevan   dmmoab->nghostrings = 0;
1257d89fc02STim Tautges 
1269daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1279daf19fdSVijay Mahadevan   moab::EntityHandle partnset;
128032b8ab6SVijay Mahadevan 
129db66d124SVijay Mahadevan   /* Create root sets for each mesh.  Then pass these
130db66d124SVijay Mahadevan       to the load_file functions to be populated. */
1310c8a2322SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); MBERR("Creating partition set failed", merr);
132032b8ab6SVijay Mahadevan 
133db66d124SVijay Mahadevan   /* Create the parallel communicator object with the partition handle associated with MOAB */
13472ff976dSVijay Mahadevan   dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
1359daf19fdSVijay Mahadevan #endif
136032b8ab6SVijay Mahadevan 
1374973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1384973de03SVijay Mahadevan   dmmoab->bs = 1;
139addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1403f1c6e43SVijay Mahadevan   ierr = PetscMalloc(dmmoab->numFields * sizeof(char*), &dmmoab->fieldNames);CHKERRQ(ierr);
1413f1c6e43SVijay Mahadevan   ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr);
1422e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
1432e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
1442e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
1452e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1462e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
1472e4e7c01SVijay Mahadevan   dmmoab->write_mode = WRITE_PART;
1484973de03SVijay Mahadevan 
1494973de03SVijay Mahadevan   /* set global ID tag handle */
1501a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
15185d305f5SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr);
152032b8ab6SVijay Mahadevan   }
153032b8ab6SVijay Mahadevan   else {
1541a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr);
1551a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
156a4d2169cSTim Tautges   }
157a4d2169cSTim Tautges 
158340f3b9aSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag); MBERRNM(merr);
159340f3b9aSVijay Mahadevan 
1604973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
161a4d2169cSTim Tautges   if (range) {
16285d305f5SVijay Mahadevan     ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr);
163a4d2169cSTim Tautges   }
16485d305f5SVijay Mahadevan   *dmb = dmmb;
1651d72bce8STim Tautges   PetscFunctionReturn(0);
1661d72bce8STim Tautges }
1671d72bce8STim Tautges 
168304006b3SVijay Mahadevan 
1699daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1701d72bce8STim Tautges 
171aa768e4cSTim Tautges /*@
172aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
173aa768e4cSTim Tautges 
174aa768e4cSTim Tautges   Collective on MPI_Comm
175aa768e4cSTim Tautges 
176aa768e4cSTim Tautges   Input Parameter:
177aa768e4cSTim Tautges . dm    - The DMMoab object being set
178aa768e4cSTim Tautges 
179aa768e4cSTim Tautges   Output Parameter:
180aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
181aa768e4cSTim Tautges 
182aa768e4cSTim Tautges   Level: beginner
183aa768e4cSTim Tautges 
184aa768e4cSTim Tautges .keywords: DMMoab, create
185aa768e4cSTim Tautges @*/
1861d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm)
1871d72bce8STim Tautges {
1881d72bce8STim Tautges   PetscFunctionBegin;
1891d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
190032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1911d72bce8STim Tautges   PetscFunctionReturn(0);
1921d72bce8STim Tautges }
1931d72bce8STim Tautges 
1949daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */
1959daf19fdSVijay Mahadevan 
1961d72bce8STim Tautges 
197aa768e4cSTim Tautges /*@
198aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
199aa768e4cSTim Tautges 
200aa768e4cSTim Tautges   Collective on MPI_Comm
201aa768e4cSTim Tautges 
202aa768e4cSTim Tautges   Input Parameter:
203aa768e4cSTim Tautges . dm      - The DMMoab object being set
204aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
205aa768e4cSTim Tautges 
206aa768e4cSTim Tautges   Level: beginner
207aa768e4cSTim Tautges 
208aa768e4cSTim Tautges .keywords: DMMoab, create
209aa768e4cSTim Tautges @*/
210a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface)
2111d72bce8STim Tautges {
212032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
213032b8ab6SVijay Mahadevan 
2141d72bce8STim Tautges   PetscFunctionBegin;
2151d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2161cec0304SVijay Mahadevan   PetscValidPointer(mbiface, 2);
2179daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
218032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
2199daf19fdSVijay Mahadevan #endif
220032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
221032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2221d72bce8STim Tautges   PetscFunctionReturn(0);
2231d72bce8STim Tautges }
2241d72bce8STim Tautges 
2251d72bce8STim Tautges 
226aa768e4cSTim Tautges /*@
227aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
228aa768e4cSTim Tautges 
229aa768e4cSTim Tautges   Collective on MPI_Comm
230aa768e4cSTim Tautges 
231aa768e4cSTim Tautges   Input Parameter:
232aa768e4cSTim Tautges . dm      - The DMMoab object being set
233aa768e4cSTim Tautges 
234aa768e4cSTim Tautges   Output Parameter:
235aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
236aa768e4cSTim Tautges 
237aa768e4cSTim Tautges   Level: beginner
238aa768e4cSTim Tautges 
239aa768e4cSTim Tautges .keywords: DMMoab, create
240aa768e4cSTim Tautges @*/
241a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface)
2421d72bce8STim Tautges {
2439426e041SSatish Balay   PetscErrorCode   ierr;
244cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
245cabb514dSBarry Smith 
2461d72bce8STim Tautges   PetscFunctionBegin;
2471d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
248cabb514dSBarry Smith   ierr = PetscCitationsRegister("@techreport{tautges_moab:_2004,\n  type = {{SAND2004-1592}},\n  title = {{MOAB:} A Mesh-Oriented Database},  institution = {Sandia National Laboratories},\n  author = {Tautges, T. J. and Meyers, R. and Merkley, K. and Stimpson, C. and Ernst, C.},\n  year = {2004},  note = {Report}\n}\n", &cite);CHKERRQ(ierr);
249a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2501d72bce8STim Tautges   PetscFunctionReturn(0);
2511d72bce8STim Tautges }
2521d72bce8STim Tautges 
2531d72bce8STim Tautges 
254aa768e4cSTim Tautges /*@
2555eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
256aa768e4cSTim Tautges 
257aa768e4cSTim Tautges   Collective on MPI_Comm
258aa768e4cSTim Tautges 
259aa768e4cSTim Tautges   Input Parameter:
260aa768e4cSTim Tautges . dm    - The DMMoab object being set
261aa768e4cSTim Tautges . range - The entities treated by this DMMoab
262aa768e4cSTim Tautges 
263aa768e4cSTim Tautges   Level: beginner
264aa768e4cSTim Tautges 
265aa768e4cSTim Tautges .keywords: DMMoab, create
266aa768e4cSTim Tautges @*/
2675eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range)
2681d72bce8STim Tautges {
269fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
270032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
271032b8ab6SVijay Mahadevan 
2721d72bce8STim Tautges   PetscFunctionBegin;
2731d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
274032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
275032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
276fd3326ddSVijay Mahadevan 
277032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
278fd3326ddSVijay Mahadevan 
2799daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2809daf19fdSVijay Mahadevan   moab::ErrorCode merr;
281fd3326ddSVijay Mahadevan   /* filter based on parallel status */
282fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr);
283fd3326ddSVijay Mahadevan 
284fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
285fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
286fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr);
287fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
288fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
2899daf19fdSVijay Mahadevan #else
2909daf19fdSVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
2919daf19fdSVijay Mahadevan #endif
292fd3326ddSVijay Mahadevan 
293fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
294032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
295032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
2969daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2979daf19fdSVijay Mahadevan   PetscErrorCode  ierr;
298b2566f29SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
2999daf19fdSVijay Mahadevan #else
3009daf19fdSVijay Mahadevan   dmmoab->n = dmmoab->nloc;
3019daf19fdSVijay Mahadevan #endif
3021d72bce8STim Tautges   PetscFunctionReturn(0);
3031d72bce8STim Tautges }
3041d72bce8STim Tautges 
3051d72bce8STim Tautges 
3068d8d51c8SVijay Mahadevan /*@
3078d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
3088d8d51c8SVijay Mahadevan 
3098d8d51c8SVijay Mahadevan   Collective on MPI_Comm
3108d8d51c8SVijay Mahadevan 
3118d8d51c8SVijay Mahadevan   Input Parameter:
3128d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3138d8d51c8SVijay Mahadevan 
3148d8d51c8SVijay Mahadevan   Output Parameter:
3158d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3168d8d51c8SVijay Mahadevan 
3178d8d51c8SVijay Mahadevan   Level: beginner
3188d8d51c8SVijay Mahadevan 
3198d8d51c8SVijay Mahadevan .keywords: DMMoab, create
3208d8d51c8SVijay Mahadevan @*/
3218d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local)
3228d8d51c8SVijay Mahadevan {
3238d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3248d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3258d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3268d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3278d8d51c8SVijay Mahadevan }
3288d8d51c8SVijay Mahadevan 
3298d8d51c8SVijay Mahadevan 
3308d8d51c8SVijay Mahadevan 
331aa768e4cSTim Tautges /*@
3325eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
333aa768e4cSTim Tautges 
334aa768e4cSTim Tautges   Collective on MPI_Comm
335aa768e4cSTim Tautges 
336aa768e4cSTim Tautges   Input Parameter:
337aa768e4cSTim Tautges . dm    - The DMMoab object being set
338aa768e4cSTim Tautges 
339aa768e4cSTim Tautges   Output Parameter:
3405eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
3415eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
342aa768e4cSTim Tautges 
343aa768e4cSTim Tautges   Level: beginner
344aa768e4cSTim Tautges 
345aa768e4cSTim Tautges .keywords: DMMoab, create
346aa768e4cSTim Tautges @*/
347351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost)
3481d72bce8STim Tautges {
3491d72bce8STim Tautges   PetscFunctionBegin;
3501d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
351351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
352351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3531d72bce8STim Tautges   PetscFunctionReturn(0);
3541d72bce8STim Tautges }
3551d72bce8STim Tautges 
3565eb88e9dSVijay Mahadevan /*@
3575eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3585eb88e9dSVijay Mahadevan 
3595eb88e9dSVijay Mahadevan   Collective on MPI_Comm
3605eb88e9dSVijay Mahadevan 
3615eb88e9dSVijay Mahadevan   Input Parameter:
3625eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3635eb88e9dSVijay Mahadevan 
3645eb88e9dSVijay Mahadevan   Output Parameter:
3655eb88e9dSVijay Mahadevan . range - The entities owned locally
3665eb88e9dSVijay Mahadevan 
3675eb88e9dSVijay Mahadevan   Level: beginner
3685eb88e9dSVijay Mahadevan 
3695eb88e9dSVijay Mahadevan .keywords: DMMoab, create
3705eb88e9dSVijay Mahadevan @*/
371351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range)
3725eb88e9dSVijay Mahadevan {
3735eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3745eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
375351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3761cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3771cec0304SVijay Mahadevan }
3781cec0304SVijay Mahadevan 
3791cec0304SVijay Mahadevan 
3801cec0304SVijay Mahadevan /*@
3811cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3821cec0304SVijay Mahadevan 
3831cec0304SVijay Mahadevan   Collective on MPI_Comm
3841cec0304SVijay Mahadevan 
3851cec0304SVijay Mahadevan   Input Parameter:
3861cec0304SVijay Mahadevan . dm    - The DMMoab object being set
3871cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
3881cec0304SVijay Mahadevan 
3891cec0304SVijay Mahadevan   Level: beginner
3901cec0304SVijay Mahadevan 
3911cec0304SVijay Mahadevan .keywords: DMMoab, create
3921cec0304SVijay Mahadevan @*/
3931cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range)
3941cec0304SVijay Mahadevan {
3951cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
3961cec0304SVijay Mahadevan 
3971cec0304SVijay Mahadevan   PetscFunctionBegin;
3981cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3991cec0304SVijay Mahadevan   dmmoab->elocal->clear();
4001cec0304SVijay Mahadevan   dmmoab->eghost->clear();
4011cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
4029daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
4039daf19fdSVijay Mahadevan   moab::ErrorCode merr;
4041cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
4051cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
4069daf19fdSVijay Mahadevan #endif
4071cec0304SVijay Mahadevan   dmmoab->neleloc = dmmoab->elocal->size();
40841dd5348SVijay Mahadevan   dmmoab->neleghost = dmmoab->eghost->size();
4099daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
4109daf19fdSVijay Mahadevan   PetscErrorCode  ierr;
4119daf19fdSVijay Mahadevan   ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4128cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
4139daf19fdSVijay Mahadevan #else
4149daf19fdSVijay Mahadevan   dmmoab->nele = dmmoab->neleloc;
4159daf19fdSVijay Mahadevan #endif
4165eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
4175eb88e9dSVijay Mahadevan }
4185eb88e9dSVijay Mahadevan 
4195eb88e9dSVijay Mahadevan 
420aa768e4cSTim Tautges /*@
421aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
422aa768e4cSTim Tautges 
423aa768e4cSTim Tautges   Collective on MPI_Comm
424aa768e4cSTim Tautges 
425aa768e4cSTim Tautges   Input Parameter:
426aa768e4cSTim Tautges . dm      - The DMMoab object being set
427aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
428aa768e4cSTim Tautges 
429aa768e4cSTim Tautges   Level: beginner
430aa768e4cSTim Tautges 
431aa768e4cSTim Tautges .keywords: DMMoab, create
432aa768e4cSTim Tautges @*/
4331d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag)
4341d72bce8STim Tautges {
4351d72bce8STim Tautges   PetscFunctionBegin;
4361d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4371d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4381d72bce8STim Tautges   PetscFunctionReturn(0);
4391d72bce8STim Tautges }
4401d72bce8STim Tautges 
4411d72bce8STim Tautges 
442aa768e4cSTim Tautges /*@
443aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
444aa768e4cSTim Tautges 
445aa768e4cSTim Tautges   Collective on MPI_Comm
446aa768e4cSTim Tautges 
447aa768e4cSTim Tautges   Input Parameter:
448aa768e4cSTim Tautges . dm      - The DMMoab object being set
449aa768e4cSTim Tautges 
450aa768e4cSTim Tautges   Output Parameter:
451aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
452aa768e4cSTim Tautges 
453aa768e4cSTim Tautges   Level: beginner
454aa768e4cSTim Tautges 
455aa768e4cSTim Tautges .keywords: DMMoab, create
456aa768e4cSTim Tautges @*/
4571d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag)
4581d72bce8STim Tautges {
4591d72bce8STim Tautges   PetscFunctionBegin;
4601d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4611d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4621d72bce8STim Tautges   PetscFunctionReturn(0);
4631d72bce8STim Tautges }
4641d72bce8STim Tautges 
4651d72bce8STim Tautges 
466aa768e4cSTim Tautges /*@
467aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
468aa768e4cSTim Tautges 
469aa768e4cSTim Tautges   Collective on MPI_Comm
470aa768e4cSTim Tautges 
471aa768e4cSTim Tautges   Input Parameter:
472aa768e4cSTim Tautges . dm - The DMMoab object being set
473aa768e4cSTim Tautges . bs - The block size used with this DMMoab
474aa768e4cSTim Tautges 
475aa768e4cSTim Tautges   Level: beginner
476aa768e4cSTim Tautges 
477aa768e4cSTim Tautges .keywords: DMMoab, create
478aa768e4cSTim Tautges @*/
4791d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs)
4801d72bce8STim Tautges {
4811d72bce8STim Tautges   PetscFunctionBegin;
4821d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4831d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4841d72bce8STim Tautges   PetscFunctionReturn(0);
4851d72bce8STim Tautges }
4861d72bce8STim Tautges 
4871d72bce8STim Tautges 
488aa768e4cSTim Tautges /*@
489aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
490aa768e4cSTim Tautges 
491aa768e4cSTim Tautges   Collective on MPI_Comm
492aa768e4cSTim Tautges 
493aa768e4cSTim Tautges   Input Parameter:
494aa768e4cSTim Tautges . dm - The DMMoab object being set
495aa768e4cSTim Tautges 
496aa768e4cSTim Tautges   Output Parameter:
497aa768e4cSTim Tautges . bs - The block size used with this DMMoab
498aa768e4cSTim Tautges 
499aa768e4cSTim Tautges   Level: beginner
500aa768e4cSTim Tautges 
501aa768e4cSTim Tautges .keywords: DMMoab, create
502aa768e4cSTim Tautges @*/
5031d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs)
5041d72bce8STim Tautges {
5051d72bce8STim Tautges   PetscFunctionBegin;
5061d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5071d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
5081d72bce8STim Tautges   PetscFunctionReturn(0);
5091d72bce8STim Tautges }
5101d72bce8STim Tautges 
5111cec0304SVijay Mahadevan 
512212ad6d1SVijay Mahadevan /*@
513212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
514212ad6d1SVijay Mahadevan 
51500cc10feSVijay Mahadevan   Collective on DM
516212ad6d1SVijay Mahadevan 
517212ad6d1SVijay Mahadevan   Input Parameter:
518212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
519212ad6d1SVijay Mahadevan 
520212ad6d1SVijay Mahadevan   Output Parameter:
52100cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance
52200cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance
523212ad6d1SVijay Mahadevan 
524212ad6d1SVijay Mahadevan   Level: beginner
525212ad6d1SVijay Mahadevan 
526212ad6d1SVijay Mahadevan .keywords: DMMoab, create
527212ad6d1SVijay Mahadevan @*/
52841dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg)
529212ad6d1SVijay Mahadevan {
530212ad6d1SVijay Mahadevan   PetscFunctionBegin;
531212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
53241dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab*)dm->data)->nele;
53341dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab*)dm->data)->n;
534212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
535212ad6d1SVijay Mahadevan }
536212ad6d1SVijay Mahadevan 
537212ad6d1SVijay Mahadevan 
538212ad6d1SVijay Mahadevan /*@
539212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
540212ad6d1SVijay Mahadevan 
54100cc10feSVijay Mahadevan   Collective on DM
542212ad6d1SVijay Mahadevan 
543212ad6d1SVijay Mahadevan   Input Parameter:
544212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
545212ad6d1SVijay Mahadevan 
546212ad6d1SVijay Mahadevan   Output Parameter:
547b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
54800cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
54900cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
55000cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor
551212ad6d1SVijay Mahadevan 
552212ad6d1SVijay Mahadevan   Level: beginner
553212ad6d1SVijay Mahadevan 
554212ad6d1SVijay Mahadevan .keywords: DMMoab, create
555212ad6d1SVijay Mahadevan @*/
55641dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg)
557212ad6d1SVijay Mahadevan {
558212ad6d1SVijay Mahadevan   PetscFunctionBegin;
559212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
56041dd5348SVijay Mahadevan   if (nel) *nel = ((DM_Moab*)dm->data)->neleloc;
56141dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab*)dm->data)->neleghost;
56241dd5348SVijay Mahadevan   if (nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
56341dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
564212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
565212ad6d1SVijay Mahadevan }
566212ad6d1SVijay Mahadevan 
567212ad6d1SVijay Mahadevan 
56800cc10feSVijay Mahadevan /*@
56900cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
57000cc10feSVijay Mahadevan 
57100cc10feSVijay Mahadevan   Collective on MPI_Comm
57200cc10feSVijay Mahadevan 
57300cc10feSVijay Mahadevan   Input Parameter:
57400cc10feSVijay Mahadevan . dm - The DMMoab object being set
57500cc10feSVijay Mahadevan 
57600cc10feSVijay Mahadevan   Output Parameter:
57700cc10feSVijay Mahadevan . offset - The local offset for the global vector
57800cc10feSVijay Mahadevan 
57900cc10feSVijay Mahadevan   Level: beginner
58000cc10feSVijay Mahadevan 
58100cc10feSVijay Mahadevan .keywords: DMMoab, create
58200cc10feSVijay Mahadevan @*/
58300cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset)
58400cc10feSVijay Mahadevan {
58500cc10feSVijay Mahadevan   PetscFunctionBegin;
58600cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
58700cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
58800cc10feSVijay Mahadevan   PetscFunctionReturn(0);
58900cc10feSVijay Mahadevan }
59000cc10feSVijay Mahadevan 
59100cc10feSVijay Mahadevan 
5924920ab11SVijay Mahadevan /*@
5934920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5944920ab11SVijay Mahadevan 
5954920ab11SVijay Mahadevan   Collective on MPI_Comm
5964920ab11SVijay Mahadevan 
5974920ab11SVijay Mahadevan   Input Parameter:
598340f3b9aSVijay Mahadevan . dm - The DMMoab object
5994920ab11SVijay Mahadevan 
6004920ab11SVijay Mahadevan   Output Parameter:
6014920ab11SVijay Mahadevan . dim - The dimension of DM
6024920ab11SVijay Mahadevan 
6034920ab11SVijay Mahadevan   Level: beginner
6044920ab11SVijay Mahadevan 
6054920ab11SVijay Mahadevan .keywords: DMMoab, create
6064920ab11SVijay Mahadevan @*/
6074920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim)
6084920ab11SVijay Mahadevan {
6094920ab11SVijay Mahadevan   PetscFunctionBegin;
6104920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6114920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
6124920ab11SVijay Mahadevan   PetscFunctionReturn(0);
6134920ab11SVijay Mahadevan }
6144920ab11SVijay Mahadevan 
6154920ab11SVijay Mahadevan 
616755f3dfbSVijay Mahadevan #undef __FUNCT__
617755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetHierarchyLevel"
618755f3dfbSVijay Mahadevan /*@
619755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
620755f3dfbSVijay Mahadevan   generated through uniform refinement.
621755f3dfbSVijay Mahadevan 
622755f3dfbSVijay Mahadevan   Collective on DM
623755f3dfbSVijay Mahadevan 
624755f3dfbSVijay Mahadevan   Input Parameter:
625755f3dfbSVijay Mahadevan . dm - The DMMoab object being set
626755f3dfbSVijay Mahadevan 
627755f3dfbSVijay Mahadevan   Output Parameter:
628755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level
629755f3dfbSVijay Mahadevan 
630755f3dfbSVijay Mahadevan   Level: beginner
631755f3dfbSVijay Mahadevan 
632755f3dfbSVijay Mahadevan .keywords: DMMoab, multigrid
633755f3dfbSVijay Mahadevan @*/
634755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel)
635755f3dfbSVijay Mahadevan {
636755f3dfbSVijay Mahadevan   PetscFunctionBegin;
637755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
638755f3dfbSVijay Mahadevan   if (nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel;
639755f3dfbSVijay Mahadevan   PetscFunctionReturn(0);
640755f3dfbSVijay Mahadevan }
641755f3dfbSVijay Mahadevan 
642755f3dfbSVijay Mahadevan 
643755f3dfbSVijay Mahadevan #undef __FUNCT__
644755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetMaterialBlock"
645340f3b9aSVijay Mahadevan /*@
646340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
647340f3b9aSVijay Mahadevan 
648340f3b9aSVijay Mahadevan   Collective on MPI_Comm
649340f3b9aSVijay Mahadevan 
650340f3b9aSVijay Mahadevan   Input Parameter:
651340f3b9aSVijay Mahadevan . dm - The DMMoab object
652340f3b9aSVijay Mahadevan . ehandle - The element entity handle
653340f3b9aSVijay Mahadevan 
654340f3b9aSVijay Mahadevan   Output Parameter:
655340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
656340f3b9aSVijay Mahadevan 
657340f3b9aSVijay Mahadevan   Level: beginner
658340f3b9aSVijay Mahadevan 
659340f3b9aSVijay Mahadevan .keywords: DMMoab, create
660340f3b9aSVijay Mahadevan @*/
661340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat)
662340f3b9aSVijay Mahadevan {
663340f3b9aSVijay Mahadevan   DM_Moab         *dmmoab;
664340f3b9aSVijay Mahadevan 
665340f3b9aSVijay Mahadevan   PetscFunctionBegin;
666340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
667340f3b9aSVijay Mahadevan   if (*mat) {
668340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab*)(dm)->data;
669a044f6b6SVijay Mahadevan     *mat = dmmoab->materials[dmmoab->elocal->index(ehandle)];
670340f3b9aSVijay Mahadevan   }
671340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
672340f3b9aSVijay Mahadevan }
673340f3b9aSVijay Mahadevan 
6744920ab11SVijay Mahadevan 
67585d305f5SVijay Mahadevan /*@
67685d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
67785d305f5SVijay Mahadevan 
67885d305f5SVijay Mahadevan   Collective on MPI_Comm
67985d305f5SVijay Mahadevan 
68085d305f5SVijay Mahadevan   Input Parameter:
68185d305f5SVijay Mahadevan . dm - The DMMoab object
68285d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
68385d305f5SVijay Mahadevan . conn - The vertex entity handles
68485d305f5SVijay Mahadevan 
68585d305f5SVijay Mahadevan   Output Parameter:
68685d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
68785d305f5SVijay Mahadevan 
68885d305f5SVijay Mahadevan   Level: beginner
68985d305f5SVijay Mahadevan 
69085d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity()
69185d305f5SVijay Mahadevan @*/
692cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos)
6937023aa44SVijay Mahadevan {
6947023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6957023aa44SVijay Mahadevan   moab::ErrorCode merr;
6967023aa44SVijay Mahadevan 
6977023aa44SVijay Mahadevan   PetscFunctionBegin;
6987023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6997023aa44SVijay Mahadevan   PetscValidPointer(conn, 3);
7009c368985SVijay Mahadevan   PetscValidPointer(vpos, 4);
7017023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7027023aa44SVijay Mahadevan 
7037023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7049c368985SVijay Mahadevan   if (dmmoab->hlevel) {
7059c368985SVijay Mahadevan     merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle*>(conn), nconn, dmmoab->hlevel, vpos);MBERRNM(merr);
7069c368985SVijay Mahadevan   }
7079c368985SVijay Mahadevan   else {
7087023aa44SVijay Mahadevan     merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
7099c368985SVijay Mahadevan   }
7107023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7117023aa44SVijay Mahadevan }
7127023aa44SVijay Mahadevan 
7137023aa44SVijay Mahadevan 
71485d305f5SVijay Mahadevan /*@
71585d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
71685d305f5SVijay Mahadevan 
71785d305f5SVijay Mahadevan   Collective on MPI_Comm
71885d305f5SVijay Mahadevan 
71985d305f5SVijay Mahadevan   Input Parameter:
72085d305f5SVijay Mahadevan . dm - The DMMoab object
72185d305f5SVijay Mahadevan . vhandle - Vertex entity handle
72285d305f5SVijay Mahadevan 
72385d305f5SVijay Mahadevan   Output Parameter:
72485d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
72585d305f5SVijay Mahadevan . conn - The vertex entity handles
72685d305f5SVijay Mahadevan 
72785d305f5SVijay Mahadevan   Level: beginner
72885d305f5SVijay Mahadevan 
72985d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity()
73085d305f5SVijay Mahadevan @*/
73185d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt* nconn, moab::EntityHandle **conn)
7328d8d51c8SVijay Mahadevan {
7338d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
7348d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities, connect;
7358d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7368d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
7378d8d51c8SVijay Mahadevan 
7388d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7398d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7408d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
7418d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7428d8d51c8SVijay Mahadevan 
7438d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
74485d305f5SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION); MBERRNM(merr);
7458d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect); MBERRNM(merr);
7468d8d51c8SVijay Mahadevan 
7478d8d51c8SVijay Mahadevan   if (conn) {
7488d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn);CHKERRQ(ierr);
7498d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle) * connect.size());CHKERRQ(ierr);
7508d8d51c8SVijay Mahadevan   }
7518d8d51c8SVijay Mahadevan   if (nconn) *nconn = connect.size();
7528d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7538d8d51c8SVijay Mahadevan }
7548d8d51c8SVijay Mahadevan 
7558d8d51c8SVijay Mahadevan 
75685d305f5SVijay Mahadevan /*@
75785d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
75885d305f5SVijay Mahadevan 
75985d305f5SVijay Mahadevan   Collective on MPI_Comm
76085d305f5SVijay Mahadevan 
76185d305f5SVijay Mahadevan   Input Parameter:
76285d305f5SVijay Mahadevan . dm - The DMMoab object
76385d305f5SVijay Mahadevan . vhandle - Vertex entity handle
76485d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
76585d305f5SVijay Mahadevan . conn - The vertex entity handles
76685d305f5SVijay Mahadevan 
76785d305f5SVijay Mahadevan   Level: beginner
76885d305f5SVijay Mahadevan 
76985d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity()
77085d305f5SVijay Mahadevan @*/
7718d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, moab::EntityHandle **conn)
7728d8d51c8SVijay Mahadevan {
7738d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7748d8d51c8SVijay Mahadevan 
7758d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7768d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7778d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
7788d8d51c8SVijay Mahadevan 
7798d8d51c8SVijay Mahadevan   if (conn) {
7808d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
7818d8d51c8SVijay Mahadevan   }
7828d8d51c8SVijay Mahadevan   if (nconn) *nconn = 0;
7838d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7848d8d51c8SVijay Mahadevan }
7858d8d51c8SVijay Mahadevan 
7868d8d51c8SVijay Mahadevan 
78785d305f5SVijay Mahadevan /*@
78885d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
78985d305f5SVijay Mahadevan 
79085d305f5SVijay Mahadevan   Collective on MPI_Comm
79185d305f5SVijay Mahadevan 
79285d305f5SVijay Mahadevan   Input Parameter:
79385d305f5SVijay Mahadevan . dm - The DMMoab object
79485d305f5SVijay Mahadevan . ehandle - Vertex entity handle
79585d305f5SVijay Mahadevan 
79685d305f5SVijay Mahadevan   Output Parameter:
79785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
79885d305f5SVijay Mahadevan . conn - The vertex entity handles
79985d305f5SVijay Mahadevan 
80085d305f5SVijay Mahadevan   Level: beginner
80185d305f5SVijay Mahadevan 
80285d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity()
80385d305f5SVijay Mahadevan @*/
8047023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, const moab::EntityHandle **conn)
8057023aa44SVijay Mahadevan {
8067023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8077023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
8089c368985SVijay Mahadevan   std::vector<moab::EntityHandle> vconn;
8097023aa44SVijay Mahadevan   moab::ErrorCode merr;
8107023aa44SVijay Mahadevan   PetscInt nnodes;
8117023aa44SVijay Mahadevan 
8127023aa44SVijay Mahadevan   PetscFunctionBegin;
8137023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8147023aa44SVijay Mahadevan   PetscValidPointer(conn, 4);
8157023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8167023aa44SVijay Mahadevan 
8177023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8187023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes); MBERRNM(merr);
8197023aa44SVijay Mahadevan   if (conn) *conn = connect;
8207023aa44SVijay Mahadevan   if (nconn) *nconn = nnodes;
8217023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8227023aa44SVijay Mahadevan }
8237023aa44SVijay Mahadevan 
8247023aa44SVijay Mahadevan 
82585d305f5SVijay Mahadevan /*@
82685d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
82785d305f5SVijay Mahadevan 
82885d305f5SVijay Mahadevan   Collective on MPI_Comm
82985d305f5SVijay Mahadevan 
83085d305f5SVijay Mahadevan   Input Parameter:
83185d305f5SVijay Mahadevan . dm - The DMMoab object
83285d305f5SVijay Mahadevan . ent - Entity handle
83385d305f5SVijay Mahadevan 
83485d305f5SVijay Mahadevan   Output Parameter:
83585d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
83685d305f5SVijay Mahadevan 
83785d305f5SVijay Mahadevan   Level: beginner
83885d305f5SVijay Mahadevan 
83985d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices()
84085d305f5SVijay Mahadevan @*/
84169263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool* ent_on_boundary)
84269263071SVijay Mahadevan {
84369263071SVijay Mahadevan   moab::EntityType etype;
84469263071SVijay Mahadevan   DM_Moab         *dmmoab;
84569263071SVijay Mahadevan   PetscInt         edim;
84669263071SVijay Mahadevan 
84769263071SVijay Mahadevan   PetscFunctionBegin;
84869263071SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
84969263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary, 3);
85069263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
85169263071SVijay Mahadevan 
85269263071SVijay Mahadevan   /* get the entity type and handle accordingly */
85369263071SVijay Mahadevan   etype = dmmoab->mbiface->type_from_handle(ent);
85469263071SVijay Mahadevan   if (etype >= moab::MBPOLYHEDRON) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %D\n", etype);
85569263071SVijay Mahadevan 
85669263071SVijay Mahadevan   /* get the entity dimension */
85769263071SVijay Mahadevan   edim = dmmoab->mbiface->dimension_from_handle(ent);
85869263071SVijay Mahadevan 
85969263071SVijay Mahadevan   *ent_on_boundary = PETSC_FALSE;
86069263071SVijay Mahadevan   if (etype == moab::MBVERTEX && edim == 0) {
86149d66b22SVijay Mahadevan     *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE);
86269263071SVijay Mahadevan   }
86369263071SVijay Mahadevan   else {
86469263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
8656d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
86669263071SVijay Mahadevan     }
86769263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
8686d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
86969263071SVijay Mahadevan     }
87069263071SVijay Mahadevan   }
87169263071SVijay Mahadevan   PetscFunctionReturn(0);
87269263071SVijay Mahadevan }
87369263071SVijay Mahadevan 
87469263071SVijay Mahadevan 
87585d305f5SVijay Mahadevan /*@
87685d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
87785d305f5SVijay Mahadevan 
87885d305f5SVijay Mahadevan   Input Parameter:
87985d305f5SVijay Mahadevan . dm - The DMMoab object
88085d305f5SVijay Mahadevan . nconn - Number of handles
88185d305f5SVijay Mahadevan . cnt - Array of entity handles
88285d305f5SVijay Mahadevan 
88385d305f5SVijay Mahadevan   Output Parameter:
88485d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
88585d305f5SVijay Mahadevan 
88685d305f5SVijay Mahadevan   Level: beginner
88785d305f5SVijay Mahadevan 
88885d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary()
88985d305f5SVijay Mahadevan @*/
89069263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool* isbdvtx)
8917023aa44SVijay Mahadevan {
8927023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8937023aa44SVijay Mahadevan   PetscInt       i;
8947023aa44SVijay Mahadevan 
8957023aa44SVijay Mahadevan   PetscFunctionBegin;
8967023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8977023aa44SVijay Mahadevan   PetscValidPointer(cnt, 3);
8987023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx, 4);
8997023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9007023aa44SVijay Mahadevan 
9017023aa44SVijay Mahadevan   for (i = 0; i < nconn; ++i) {
9026d9eb265SVijay Mahadevan     isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE);
9037023aa44SVijay Mahadevan   }
9047023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9057023aa44SVijay Mahadevan }
9067023aa44SVijay Mahadevan 
9077023aa44SVijay Mahadevan 
90885d305f5SVijay Mahadevan /*@
90985d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
91085d305f5SVijay Mahadevan 
91185d305f5SVijay Mahadevan   Input Parameter:
91285d305f5SVijay Mahadevan . dm - The DMMoab object
91385d305f5SVijay Mahadevan 
91485d305f5SVijay Mahadevan   Output Parameter:
91585d305f5SVijay Mahadevan . bdvtx - Boundary vertices
91685d305f5SVijay Mahadevan . bdelems - Boundary elements
91785d305f5SVijay Mahadevan . bdfaces - Boundary faces
91885d305f5SVijay Mahadevan 
91985d305f5SVijay Mahadevan   Level: beginner
92085d305f5SVijay Mahadevan 
92185d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary()
92285d305f5SVijay Mahadevan @*/
9236d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range** bdelems, const moab::Range** bdfaces)
9241cec0304SVijay Mahadevan {
9251cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
9261cec0304SVijay Mahadevan 
9271cec0304SVijay Mahadevan   PetscFunctionBegin;
9281cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
9291cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9301cec0304SVijay Mahadevan 
9316d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
9326d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
9336d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
9341cec0304SVijay Mahadevan   PetscFunctionReturn(0);
9351cec0304SVijay Mahadevan }
9361cec0304SVijay Mahadevan 
937f6829af0SVijay Mahadevan 
938f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
939f6829af0SVijay Mahadevan {
940f6829af0SVijay Mahadevan   PetscErrorCode  ierr;
94185d305f5SVijay Mahadevan   PetscInt        i;
942e882eb38SVijay Mahadevan   moab::ErrorCode merr;
943f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
944f6829af0SVijay Mahadevan 
945f6829af0SVijay Mahadevan   PetscFunctionBegin;
946f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
947304006b3SVijay Mahadevan 
948304006b3SVijay Mahadevan   dmmoab->refct--;
949304006b3SVijay Mahadevan   if (!dmmoab->refct) {
950f6829af0SVijay Mahadevan     delete dmmoab->vlocal;
951f6829af0SVijay Mahadevan     delete dmmoab->vowned;
952f6829af0SVijay Mahadevan     delete dmmoab->vghost;
953f6829af0SVijay Mahadevan     delete dmmoab->elocal;
954f6829af0SVijay Mahadevan     delete dmmoab->eghost;
955f6829af0SVijay Mahadevan     delete dmmoab->bndyvtx;
956f6829af0SVijay Mahadevan     delete dmmoab->bndyfaces;
957f6829af0SVijay Mahadevan     delete dmmoab->bndyelems;
958f6829af0SVijay Mahadevan 
959f6829af0SVijay Mahadevan     ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
9607ae5e5b6SVijay Mahadevan     ierr = PetscFree2(dmmoab->gidmap, dmmoab->lidmap);CHKERRQ(ierr);
9615905e1eaSVijay Mahadevan     ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr);
9625905e1eaSVijay Mahadevan     ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr);
9639c368985SVijay Mahadevan     ierr = PetscFree(dmmoab->materials);CHKERRQ(ierr);
96485d305f5SVijay Mahadevan     if (dmmoab->fieldNames) {
96585d305f5SVijay Mahadevan       for (i = 0; i < dmmoab->numFields; i++) {
96685d305f5SVijay Mahadevan         ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
96785d305f5SVijay Mahadevan       }
96885d305f5SVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
96985d305f5SVijay Mahadevan     }
970b117cd09SVijay Mahadevan 
971b117cd09SVijay Mahadevan     if (dmmoab->nhlevels) {
972b117cd09SVijay Mahadevan       ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr);
973e882eb38SVijay Mahadevan       dmmoab->nhlevels = 0;
974e882eb38SVijay Mahadevan       if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
975e882eb38SVijay Mahadevan       dmmoab->hierarchy = NULL;
976b117cd09SVijay Mahadevan     }
977e882eb38SVijay Mahadevan 
978e882eb38SVijay Mahadevan     if (dmmoab->icreatedinstance) {
9799c368985SVijay Mahadevan       delete dmmoab->pcomm;
980e882eb38SVijay Mahadevan       merr = dmmoab->mbiface->delete_mesh(); MBERRNM(merr);
981e882eb38SVijay Mahadevan       delete dmmoab->mbiface;
982e882eb38SVijay Mahadevan     }
983e882eb38SVijay Mahadevan     dmmoab->mbiface = NULL;
9849daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
985e882eb38SVijay Mahadevan     dmmoab->pcomm = NULL;
9869daf19fdSVijay Mahadevan #endif
987f6829af0SVijay Mahadevan     ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
988f6829af0SVijay Mahadevan     ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
989f6829af0SVijay Mahadevan     ierr = PetscFree(dm->data);CHKERRQ(ierr);
990304006b3SVijay Mahadevan   }
991f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
992f6829af0SVijay Mahadevan }
993f6829af0SVijay Mahadevan 
994f6829af0SVijay Mahadevan 
99563d025dbSVijay Mahadevan #undef __FUNCT__
99663d025dbSVijay Mahadevan #define __FUNCT__ "DMSetFromOptions_Moab"
9974416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject, DM dm)
9982e4e7c01SVijay Mahadevan {
9992e4e7c01SVijay Mahadevan   PetscErrorCode ierr;
10002e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
10012e4e7c01SVijay Mahadevan 
10022e4e7c01SVijay Mahadevan   PetscFunctionBegin;
10032e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1004cc310fddSBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject, "DMMoab Options");CHKERRQ(ierr);
10052e4e7c01SVijay Mahadevan   ierr  = PetscOptionsInt("-dm_moab_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "DMView", dmmoab->rw_dbglevel, &dmmoab->rw_dbglevel, NULL);CHKERRQ(ierr);
10062e4e7c01SVijay Mahadevan   ierr  = PetscOptionsBool("-dm_moab_partiton_by_rank", "Use partition by rank when reading MOAB meshes from file", "DMView", dmmoab->partition_by_rank, &dmmoab->partition_by_rank, NULL);CHKERRQ(ierr);
10072e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
10082e4e7c01SVijay Mahadevan   ierr  = PetscOptionsString("-dm_moab_read_opts", "Extra options to enable MOAB reader to load DM from file", "DMView", dmmoab->extra_read_options, dmmoab->extra_read_options, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr);
10092e4e7c01SVijay Mahadevan   ierr  = PetscOptionsString("-dm_moab_write_opts", "Extra options to enable MOAB writer to serialize DM to file", "DMView", dmmoab->extra_write_options, dmmoab->extra_write_options, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr);
10102e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr);
10112e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr);
10122e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
10132e4e7c01SVijay Mahadevan }
10142e4e7c01SVijay Mahadevan 
10152e4e7c01SVijay Mahadevan 
1016f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
1017f6829af0SVijay Mahadevan {
1018f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
1019f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
1020f6829af0SVijay Mahadevan   Vec                     local, global;
1021f6829af0SVijay Mahadevan   IS                      from, to;
1022f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
1023304006b3SVijay Mahadevan   PetscInt                i, j, f, bs, vent, totsize, *lgmap;
1024f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
1025f6829af0SVijay Mahadevan   moab::Range             adjs;
1026f6829af0SVijay Mahadevan 
1027f6829af0SVijay Mahadevan   PetscFunctionBegin;
1028f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1029f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
10309daf19fdSVijay Mahadevan   if (dmmoab->mbiface == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp.");
10319daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
10329daf19fdSVijay Mahadevan   if (dmmoab->pcomm == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp.");
10339daf19fdSVijay Mahadevan #endif
1034f6829af0SVijay Mahadevan 
1035f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
1036f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
1037f6829af0SVijay Mahadevan   {
103849d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
103949d66b22SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false); MBERRNM(merr);
1040f6829af0SVijay Mahadevan 
10419daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1042f6829af0SVijay Mahadevan     /* filter based on parallel status */
1043f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr);
1044f6829af0SVijay Mahadevan 
1045f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
10469c368985SVijay Mahadevan     // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
1047f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
104864e1c140SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr);
1049f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
1050f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
10519daf19fdSVijay Mahadevan #else
10529daf19fdSVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
10539daf19fdSVijay Mahadevan #endif
1054f6829af0SVijay Mahadevan 
1055f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
1056f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
1057f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
105849d66b22SVijay Mahadevan 
10599daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1060b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
106149d66b22SVijay Mahadevan     PetscInfo4(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost);
10629daf19fdSVijay Mahadevan #else
10639daf19fdSVijay Mahadevan     dmmoab->n = dmmoab->nloc;
10649daf19fdSVijay Mahadevan #endif
1065f6829af0SVijay Mahadevan   }
1066f6829af0SVijay Mahadevan 
1067f6829af0SVijay Mahadevan   {
1068f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1069f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1070f6829af0SVijay Mahadevan 
1071f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1072f6829af0SVijay Mahadevan     for (i = 3; i > 0; i--) {
1073f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
107449d66b22SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false); MBERRNM(merr);
1075f6829af0SVijay Mahadevan 
1076f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1077f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1078f6829af0SVijay Mahadevan         dmmoab->dim = i;
1079f6829af0SVijay Mahadevan         break;
1080f6829af0SVijay Mahadevan       }
1081f6829af0SVijay Mahadevan     }
1082f6829af0SVijay Mahadevan 
1083b117cd09SVijay Mahadevan     ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr);
1084b117cd09SVijay Mahadevan 
10859daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1086f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1087f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
1088f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
1089f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
10909daf19fdSVijay Mahadevan #endif
1091f6829af0SVijay Mahadevan 
1092f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
1093f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
109449d66b22SVijay Mahadevan 
10959daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1096b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
109749d66b22SVijay Mahadevan     PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost);
10989daf19fdSVijay Mahadevan #else
10999daf19fdSVijay Mahadevan     dmmoab->nele = dmmoab->neleloc;
11009daf19fdSVijay Mahadevan #endif
1101f6829af0SVijay Mahadevan   }
1102f6829af0SVijay Mahadevan 
1103f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1104f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1105f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1106f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1107f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
1108f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr);
1109f6829af0SVijay Mahadevan   }
1110f6829af0SVijay Mahadevan 
1111f6829af0SVijay Mahadevan   totsize = dmmoab->vlocal->size();
111249d66b22SVijay Mahadevan   if (totsize != dmmoab->nloc + dmmoab->nghost) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.", totsize, dmmoab->nloc + dmmoab->nghost);
111349d66b22SVijay Mahadevan   ierr = PetscCalloc1(totsize, &dmmoab->gsindices);CHKERRQ(ierr);
1114f6829af0SVijay Mahadevan   {
1115f6829af0SVijay Mahadevan     /* first get the local indices */
1116f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]); MBERRNM(merr);
11173f1c6e43SVijay Mahadevan     if (dmmoab->nghost) {  /* next get the ghosted indices */
1118f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]); MBERRNM(merr);
1119f6829af0SVijay Mahadevan     }
1120f6829af0SVijay Mahadevan 
1121f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1122304006b3SVijay Mahadevan     dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0];
1123f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1124304006b3SVijay Mahadevan       if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i];
1125304006b3SVijay Mahadevan       if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i];
1126f6829af0SVijay Mahadevan     }
1127f6829af0SVijay Mahadevan 
1128304006b3SVijay Mahadevan     ierr = MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1129304006b3SVijay Mahadevan     ierr = MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1130f6829af0SVijay Mahadevan 
1131f6829af0SVijay Mahadevan     /* set the GID map */
1132f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1133304006b3SVijay Mahadevan       dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */
11349c368985SVijay Mahadevan 
1135f6829af0SVijay Mahadevan     }
1136304006b3SVijay Mahadevan     dmmoab->lminmax[0] -= dmmoab->gminmax[0];
1137304006b3SVijay Mahadevan     dmmoab->lminmax[1] -= dmmoab->gminmax[0];
1138f6829af0SVijay Mahadevan 
1139304006b3SVijay Mahadevan     PetscInfo4(NULL, "GLOBAL_ID: Local [min, max] - [%D, %D], Global [min, max] - [%D, %D]\n", dmmoab->lminmax[0], dmmoab->lminmax[1], dmmoab->gminmax[0], dmmoab->gminmax[1]);
1140f6829af0SVijay Mahadevan   }
114182dfd14aSVijay Mahadevan   if (!(dmmoab->bs == dmmoab->numFields || dmmoab->bs == 1)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mismatch between block size and number of component fields. %D != 1 OR %D != %D.", dmmoab->bs, dmmoab->bs, dmmoab->numFields);
1142f6829af0SVijay Mahadevan 
1143f6829af0SVijay Mahadevan   {
11449c368985SVijay Mahadevan     dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front());
11459c368985SVijay Mahadevan     dmmoab->seqend = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back());
1146304006b3SVijay Mahadevan     PetscInfo2(NULL, "SEQUENCE: Local [min, max] - [%D, %D]\n", dmmoab->seqstart, dmmoab->seqend);
11473f1c6e43SVijay Mahadevan 
114849d66b22SVijay Mahadevan     ierr = PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap);CHKERRQ(ierr);
11493f1c6e43SVijay Mahadevan     ierr = PetscMalloc1(totsize * dmmoab->numFields, &lgmap);CHKERRQ(ierr);
1150f6829af0SVijay Mahadevan 
1151f6829af0SVijay Mahadevan     i = j = 0;
1152f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1153f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) {
1154e92d1c7cSVijay Mahadevan       vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1155f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1156f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1157f6829af0SVijay Mahadevan       for (f = 0; f < dmmoab->numFields; f++, j++) {
11583f1c6e43SVijay Mahadevan         lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1159f6829af0SVijay Mahadevan       }
1160f6829af0SVijay Mahadevan     }
1161f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1162f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) {
1163e92d1c7cSVijay Mahadevan       vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1164f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1165f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1166f6829af0SVijay Mahadevan       for (f = 0; f < dmmoab->numFields; f++, j++) {
11673f1c6e43SVijay Mahadevan         lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1168f6829af0SVijay Mahadevan       }
1169f6829af0SVijay Mahadevan     }
1170f6829af0SVijay Mahadevan 
1171f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1172f6829af0SVijay Mahadevan        1) First create a local and global vector
1173f6829af0SVijay Mahadevan        2) Create a local and global IS
1174f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1175f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1176f6829af0SVijay Mahadevan     */
1177f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
1178f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
1179f6829af0SVijay Mahadevan 
1180f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
1181f6829af0SVijay Mahadevan 
1182f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
1183f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from);CHKERRQ(ierr);
1184f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from, bs);CHKERRQ(ierr);
1185f6829af0SVijay Mahadevan 
11863f1c6e43SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to);CHKERRQ(ierr);
1187f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to, bs);CHKERRQ(ierr);
1188f6829af0SVijay Mahadevan 
1189f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1190f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11913f1c6e43SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap,
1192f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES, &dmmoab->ltog_map);CHKERRQ(ierr);
1193f6829af0SVijay Mahadevan     }
1194f6829af0SVijay Mahadevan 
1195f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
1196f6829af0SVijay Mahadevan     ierr = VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv);CHKERRQ(ierr);
1197f6829af0SVijay Mahadevan 
1198f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11993f1c6e43SVijay Mahadevan     ierr = PetscFree(lgmap);CHKERRQ(ierr);
1200f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1201f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1202f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1203f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1204f6829af0SVijay Mahadevan   }
1205f6829af0SVijay Mahadevan 
120649d66b22SVijay Mahadevan   dmmoab->bndyvtx = new moab::Range();
120749d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
120849d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1209f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
12109c368985SVijay Mahadevan   if (!dmmoab->hlevel) {
1211f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1212f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1213f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1214f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1215f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1216f6829af0SVijay Mahadevan 
1217f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
12182417220eSVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, true, true, false); MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
1219f6829af0SVijay Mahadevan 
12209daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1221f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1222f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
12232417220eSVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT); MBERRNM(merr);
12249daf19fdSVijay Mahadevan #endif
1225f6829af0SVijay Mahadevan 
1226f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1227f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false); MBERRNM(ierr);
1228755f3dfbSVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION); MBERRNM(ierr);
1229f6829af0SVijay Mahadevan   }
12309c368985SVijay Mahadevan   else {
12319c368985SVijay Mahadevan     /* Let us query the hierarchy manager and get the results directly for this level */
12329c368985SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) {
12339c368985SVijay Mahadevan       moab::EntityHandle elemHandle = *iter;
12349c368985SVijay Mahadevan       if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) {
12359c368985SVijay Mahadevan         dmmoab->bndyelems->insert(elemHandle);
12369c368985SVijay Mahadevan         /* For this boundary element, query the vertices and add them to the list */
12379c368985SVijay Mahadevan         std::vector<moab::EntityHandle> connect;
12389c368985SVijay Mahadevan         merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect); MBERRNM(ierr);
12399c368985SVijay Mahadevan         for (unsigned iv=0; iv < connect.size(); ++iv)
12409c368985SVijay Mahadevan           if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv]))
12419c368985SVijay Mahadevan             dmmoab->bndyvtx->insert(connect[iv]);
12429c368985SVijay Mahadevan         /* Next, let us query the boundary faces and add them also to the list */
12439c368985SVijay Mahadevan         std::vector<moab::EntityHandle> faces;
12449c368985SVijay Mahadevan         merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim-1, faces); MBERRNM(ierr);
12459c368985SVijay Mahadevan         for (unsigned ifa=0; ifa < faces.size(); ++ifa)
12469c368985SVijay Mahadevan           if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa]))
12479c368985SVijay Mahadevan             dmmoab->bndyfaces->insert(faces[ifa]);
12489c368985SVijay Mahadevan       }
12499c368985SVijay Mahadevan     }
12509c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI
12519c368985SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
12529c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx,   PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
12539c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
12549c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
12559c368985SVijay Mahadevan #endif
12569c368985SVijay Mahadevan 
12579c368985SVijay Mahadevan   }
125849d66b22SVijay Mahadevan   PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size());
1259a044f6b6SVijay Mahadevan 
1260a044f6b6SVijay Mahadevan   /* Get the material sets and populate the data for all locally owned elements */
1261a044f6b6SVijay Mahadevan   {
1262a044f6b6SVijay Mahadevan     ierr = PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials);CHKERRQ(ierr);
1263a044f6b6SVijay Mahadevan     /* Get the count of entities of particular type from dmmoab->elocal
1264a044f6b6SVijay Mahadevan        -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */
1265a044f6b6SVijay Mahadevan     moab::Range msets;
1266a044f6b6SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type_and_tag(dmmoab->fileset, moab::MBENTITYSET, &dmmoab->material_tag, NULL, 1, msets, moab::Interface::UNION);MB_CHK_ERR(merr);
1267a044f6b6SVijay Mahadevan     if (msets.size() == 0) {
1268a044f6b6SVijay Mahadevan       PetscInfo(NULL, "No material sets found in the fileset.");
1269a044f6b6SVijay Mahadevan     }
1270a044f6b6SVijay Mahadevan 
1271a044f6b6SVijay Mahadevan     for (unsigned i=0; i < msets.size(); ++i) {
1272a044f6b6SVijay Mahadevan       moab::Range msetelems;
1273a044f6b6SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);MB_CHK_ERR(merr);
1274*aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI
1275*aedf4482SVijay Mahadevan       /* filter all the non-owned and shared entities out of the list */
1276*aedf4482SVijay Mahadevan       merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
1277*aedf4482SVijay Mahadevan #endif
1278a044f6b6SVijay Mahadevan 
1279a044f6b6SVijay Mahadevan       int partID;
1280a044f6b6SVijay Mahadevan       moab::EntityHandle mset=msets[i];
1281a044f6b6SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);MB_CHK_ERR(merr);
1282a044f6b6SVijay Mahadevan 
1283a044f6b6SVijay Mahadevan       for (unsigned j=0; j < msetelems.size(); ++j)
1284a044f6b6SVijay Mahadevan         dmmoab->materials[dmmoab->elocal->index(msetelems[j])]=partID;
1285a044f6b6SVijay Mahadevan     }
1286a044f6b6SVijay Mahadevan   }
1287a044f6b6SVijay Mahadevan 
1288f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1289f6829af0SVijay Mahadevan }
1290f6829af0SVijay Mahadevan 
1291304006b3SVijay Mahadevan 
1292304006b3SVijay Mahadevan #undef __FUNCT__
1293304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateVertices"
1294304006b3SVijay Mahadevan /*@
1295304006b3SVijay Mahadevan   DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM.
1296304006b3SVijay Mahadevan 
1297304006b3SVijay Mahadevan   Collective on MPI_Comm
1298304006b3SVijay Mahadevan 
1299304006b3SVijay Mahadevan   Input Parameters:
1300304006b3SVijay Mahadevan + dm - The DM object
1301304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1302304006b3SVijay Mahadevan . conn - The connectivity of the element
1303304006b3SVijay Mahadevan . nverts - The number of vertices that form the element
1304304006b3SVijay Mahadevan 
1305304006b3SVijay Mahadevan   Output Parameter:
1306304006b3SVijay Mahadevan . overts  - The list of vertices that were created (can be NULL)
1307304006b3SVijay Mahadevan 
1308304006b3SVijay Mahadevan   Level: beginner
1309304006b3SVijay Mahadevan 
1310304006b3SVijay Mahadevan .keywords: DM, create vertices
1311304006b3SVijay Mahadevan 
1312304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateElement()
1313304006b3SVijay Mahadevan @*/
1314304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal* coords, PetscInt nverts, moab::Range* overts)
1315304006b3SVijay Mahadevan {
1316304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1317304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1318304006b3SVijay Mahadevan   moab::Range         verts;
1319304006b3SVijay Mahadevan 
1320304006b3SVijay Mahadevan   PetscFunctionBegin;
1321304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1322304006b3SVijay Mahadevan   PetscValidPointer(coords, 2);
1323304006b3SVijay Mahadevan 
1324304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1325304006b3SVijay Mahadevan 
1326304006b3SVijay Mahadevan   /* Insert new points */
1327304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts); MBERRNM(merr);
1328304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts); MBERRNM(merr);
1329304006b3SVijay Mahadevan 
1330304006b3SVijay Mahadevan   if (overts) *overts = verts;
1331304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1332304006b3SVijay Mahadevan }
1333304006b3SVijay Mahadevan 
1334304006b3SVijay Mahadevan 
1335304006b3SVijay Mahadevan #undef __FUNCT__
1336304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateElement"
1337304006b3SVijay Mahadevan /*@
1338304006b3SVijay Mahadevan   DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM.
1339304006b3SVijay Mahadevan 
1340304006b3SVijay Mahadevan   Collective on MPI_Comm
1341304006b3SVijay Mahadevan 
1342304006b3SVijay Mahadevan   Input Parameters:
1343304006b3SVijay Mahadevan + dm - The DM object
1344304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1345304006b3SVijay Mahadevan . conn - The connectivity of the element
1346304006b3SVijay Mahadevan . nverts - The number of vertices that form the element
1347304006b3SVijay Mahadevan 
1348304006b3SVijay Mahadevan   Output Parameter:
1349304006b3SVijay Mahadevan . oelem  - The handle to the element created and added to the DM object
1350304006b3SVijay Mahadevan 
1351304006b3SVijay Mahadevan   Level: beginner
1352304006b3SVijay Mahadevan 
1353304006b3SVijay Mahadevan .keywords: DM, create element
1354304006b3SVijay Mahadevan 
1355304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateVertices()
1356304006b3SVijay Mahadevan @*/
1357304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle* conn, PetscInt nverts, moab::EntityHandle* oelem)
1358304006b3SVijay Mahadevan {
1359304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1360304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1361304006b3SVijay Mahadevan   moab::EntityHandle  elem;
1362304006b3SVijay Mahadevan 
1363304006b3SVijay Mahadevan   PetscFunctionBegin;
1364304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1365304006b3SVijay Mahadevan   PetscValidPointer(conn, 3);
1366304006b3SVijay Mahadevan 
1367304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1368304006b3SVijay Mahadevan 
1369304006b3SVijay Mahadevan   /* Insert new element */
1370304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_element(type, conn, nverts, elem); MBERRNM(merr);
1371304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1); MBERRNM(merr);
1372304006b3SVijay Mahadevan 
1373304006b3SVijay Mahadevan   if (oelem) *oelem = elem;
1374304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1375304006b3SVijay Mahadevan }
1376304006b3SVijay Mahadevan 
1377304006b3SVijay Mahadevan 
1378304006b3SVijay Mahadevan #undef __FUNCT__
1379304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateSubmesh"
1380304006b3SVijay Mahadevan /*@
1381304006b3SVijay Mahadevan   DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent
1382304006b3SVijay Mahadevan   in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to
1383304006b3SVijay Mahadevan   create a DM object on a refined level.
1384304006b3SVijay Mahadevan 
1385304006b3SVijay Mahadevan   Collective on MPI_Comm
1386304006b3SVijay Mahadevan 
1387304006b3SVijay Mahadevan   Input Parameters:
1388304006b3SVijay Mahadevan + dm - The DM object
1389304006b3SVijay Mahadevan 
1390304006b3SVijay Mahadevan   Output Parameter:
1391304006b3SVijay Mahadevan . newdm  - The sub DM object with updated set information
1392304006b3SVijay Mahadevan 
1393304006b3SVijay Mahadevan   Level: advanced
1394304006b3SVijay Mahadevan 
1395304006b3SVijay Mahadevan .keywords: DM, sub-DM
1396304006b3SVijay Mahadevan 
1397304006b3SVijay Mahadevan .seealso: DMCreate(), DMMoabCreateVertices(), DMMoabCreateElement()
1398304006b3SVijay Mahadevan @*/
1399304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm)
1400304006b3SVijay Mahadevan {
1401304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1402304006b3SVijay Mahadevan   DM_Moab            *ndmmoab;
1403304006b3SVijay Mahadevan   moab::ErrorCode    merr;
1404304006b3SVijay Mahadevan   PetscErrorCode     ierr;
1405304006b3SVijay Mahadevan 
1406304006b3SVijay Mahadevan   PetscFunctionBegin;
1407304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1408304006b3SVijay Mahadevan 
1409304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1410304006b3SVijay Mahadevan 
1411304006b3SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
14129daf19fdSVijay Mahadevan   ierr = DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, PETSC_NULL, newdm);CHKERRQ(ierr);
1413304006b3SVijay Mahadevan 
1414304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1415304006b3SVijay Mahadevan   ndmmoab = (DM_Moab*) (*newdm)->data;
1416304006b3SVijay Mahadevan 
1417304006b3SVijay Mahadevan   /* set the sub-mesh's parent DM reference */
1418304006b3SVijay Mahadevan   ndmmoab->parent = &dm;
1419304006b3SVijay Mahadevan 
1420304006b3SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
1421304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset); MBERR("Creating file set failed", merr);
1422304006b3SVijay Mahadevan 
1423304006b3SVijay Mahadevan   /* create a meshset and then add old fileset as child */
1424304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal); MBERR("Adding child vertices to parent failed", merr);
1425304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal); MBERR("Adding child elements to parent failed", merr);
1426304006b3SVijay Mahadevan 
1427304006b3SVijay Mahadevan   /* preserve the field association between the parent and sub-mesh objects */
1428304006b3SVijay Mahadevan   ierr = DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames);CHKERRQ(ierr);
1429304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1430304006b3SVijay Mahadevan }
1431304006b3SVijay Mahadevan 
1432304006b3SVijay Mahadevan 
1433304006b3SVijay Mahadevan #undef __FUNCT__
1434304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_Ascii"
1435304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer)
1436304006b3SVijay Mahadevan {
1437304006b3SVijay Mahadevan   DM_Moab          *dmmoab = (DM_Moab*)(dm)->data;
1438304006b3SVijay Mahadevan   const char       *name;
1439304006b3SVijay Mahadevan   MPI_Comm          comm;
1440304006b3SVijay Mahadevan   PetscMPIInt       size;
1441304006b3SVijay Mahadevan   PetscErrorCode    ierr;
1442304006b3SVijay Mahadevan 
1443304006b3SVijay Mahadevan   PetscFunctionBegin;
1444304006b3SVijay Mahadevan   ierr = PetscObjectGetComm((PetscObject)dm, &comm);CHKERRQ(ierr);
1445304006b3SVijay Mahadevan   ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr);
1446304006b3SVijay Mahadevan   ierr = PetscObjectGetName((PetscObject) dm, &name);CHKERRQ(ierr);
1447304006b3SVijay Mahadevan   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1448304006b3SVijay Mahadevan   if (name) {ierr = PetscViewerASCIIPrintf(viewer, "%s in %D dimensions:\n", name, dmmoab->dim);CHKERRQ(ierr);}
1449304006b3SVijay Mahadevan   else      {ierr = PetscViewerASCIIPrintf(viewer, "Mesh in %D dimensions:\n", dmmoab->dim);CHKERRQ(ierr);}
1450304006b3SVijay Mahadevan   /* print details about the global mesh */
1451304006b3SVijay Mahadevan   {
1452304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
14539c368985SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Sizes: cells=%D, vertices=%D, blocks=%D\n", dmmoab->nele, dmmoab->n, dmmoab->bs);CHKERRQ(ierr);
1454304006b3SVijay Mahadevan     /* print boundary data */
1455304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Boundary trace:\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr);
1456304006b3SVijay Mahadevan     {
1457304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1458304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPrintf(viewer, "cells=%D, faces=%D, vertices=%D\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr);
1459304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1460304006b3SVijay Mahadevan     }
1461304006b3SVijay Mahadevan     /* print field data */
1462304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Fields: %D components\n", dmmoab->numFields);CHKERRQ(ierr);
1463304006b3SVijay Mahadevan     {
1464304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1465304006b3SVijay Mahadevan       for (int i = 0; i < dmmoab->numFields; ++i) {
1466304006b3SVijay Mahadevan         ierr = PetscViewerASCIIPrintf(viewer, "[%D] - %s\n", i, dmmoab->fieldNames[i]);CHKERRQ(ierr);
1467304006b3SVijay Mahadevan       }
1468304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1469304006b3SVijay Mahadevan     }
1470304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1471304006b3SVijay Mahadevan   }
1472304006b3SVijay Mahadevan   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1473304006b3SVijay Mahadevan   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
1474304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1475304006b3SVijay Mahadevan }
1476304006b3SVijay Mahadevan 
1477304006b3SVijay Mahadevan #undef __FUNCT__
1478304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_VTK"
1479304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v)
1480304006b3SVijay Mahadevan {
1481304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1482304006b3SVijay Mahadevan }
1483304006b3SVijay Mahadevan 
1484304006b3SVijay Mahadevan #undef __FUNCT__
1485304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_HDF5"
1486304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v)
1487304006b3SVijay Mahadevan {
1488304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1489304006b3SVijay Mahadevan }
1490304006b3SVijay Mahadevan 
1491304006b3SVijay Mahadevan #undef __FUNCT__
1492304006b3SVijay Mahadevan #define __FUNCT__ "DMView_Moab"
1493304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer)
1494304006b3SVijay Mahadevan {
1495304006b3SVijay Mahadevan   PetscBool      iascii, ishdf5, isvtk;
1496304006b3SVijay Mahadevan   PetscErrorCode ierr;
1497304006b3SVijay Mahadevan 
1498304006b3SVijay Mahadevan   PetscFunctionBegin;
1499304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1500304006b3SVijay Mahadevan   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
1501304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr);
1502304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERVTK,   &isvtk);CHKERRQ(ierr);
1503304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERHDF5,  &ishdf5);CHKERRQ(ierr);
1504304006b3SVijay Mahadevan   if (iascii) {
1505304006b3SVijay Mahadevan     ierr = DMMoabView_Ascii(dm, viewer);CHKERRQ(ierr);
1506304006b3SVijay Mahadevan   } else if (ishdf5) {
1507304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5)
1508304006b3SVijay Mahadevan     ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ);CHKERRQ(ierr);
1509304006b3SVijay Mahadevan     ierr = DMMoabView_HDF5(dm, viewer);CHKERRQ(ierr);
1510304006b3SVijay Mahadevan     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
1511304006b3SVijay Mahadevan #else
1512304006b3SVijay Mahadevan     SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1513304006b3SVijay Mahadevan #endif
1514304006b3SVijay Mahadevan   }
1515304006b3SVijay Mahadevan   else if (isvtk) {
1516304006b3SVijay Mahadevan     ierr = DMMoabView_VTK(dm, viewer);CHKERRQ(ierr);
1517304006b3SVijay Mahadevan   }
1518304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1519304006b3SVijay Mahadevan }
1520304006b3SVijay Mahadevan 
1521304006b3SVijay Mahadevan 
1522304006b3SVijay Mahadevan #undef __FUNCT__
1523304006b3SVijay Mahadevan #define __FUNCT__ "DMInitialize_Moab"
1524304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm)
1525304006b3SVijay Mahadevan {
1526304006b3SVijay Mahadevan   PetscFunctionBegin;
1527304006b3SVijay Mahadevan   dm->ops->view                            = DMView_Moab;
1528304006b3SVijay Mahadevan   dm->ops->load                            = NULL /*DMLoad_Moab*/;
1529304006b3SVijay Mahadevan   dm->ops->setfromoptions                  = DMSetFromOptions_Moab;
1530304006b3SVijay Mahadevan   dm->ops->clone                           = DMClone_Moab;
1531304006b3SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
1532304006b3SVijay Mahadevan   dm->ops->createdefaultsection            = NULL;
1533304006b3SVijay Mahadevan   dm->ops->createdefaultconstraints        = NULL;
1534304006b3SVijay Mahadevan   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
1535304006b3SVijay Mahadevan   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
1536304006b3SVijay Mahadevan   dm->ops->getlocaltoglobalmapping         = NULL;
1537304006b3SVijay Mahadevan   dm->ops->createfieldis                   = NULL;
1538304006b3SVijay Mahadevan   dm->ops->createcoordinatedm              = NULL /*DMCreateCoordinateDM_Moab*/;
1539304006b3SVijay Mahadevan   dm->ops->getcoloring                     = NULL;
1540304006b3SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
1541304006b3SVijay Mahadevan   dm->ops->createinterpolation             = DMCreateInterpolation_Moab;
1542304006b3SVijay Mahadevan   dm->ops->getaggregates                   = NULL;
1543304006b3SVijay Mahadevan   dm->ops->getinjection                    = NULL /*DMCreateInjection_Moab*/;
1544304006b3SVijay Mahadevan   dm->ops->refine                          = DMRefine_Moab;
1545304006b3SVijay Mahadevan   dm->ops->coarsen                         = DMCoarsen_Moab;
1546304006b3SVijay Mahadevan   dm->ops->refinehierarchy                 = DMRefineHierarchy_Moab;
1547304006b3SVijay Mahadevan   dm->ops->coarsenhierarchy                = DMCoarsenHierarchy_Moab;
1548304006b3SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
1549304006b3SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
1550304006b3SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
1551304006b3SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
1552304006b3SVijay Mahadevan   dm->ops->destroy                         = DMDestroy_Moab;
1553304006b3SVijay Mahadevan   dm->ops->createsubdm                     = NULL /*DMCreateSubDM_Moab*/;
1554304006b3SVijay Mahadevan   dm->ops->getdimpoints                    = NULL /*DMGetDimPoints_Moab*/;
1555304006b3SVijay Mahadevan   dm->ops->locatepoints                    = NULL /*DMLocatePoints_Moab*/;
1556304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1557304006b3SVijay Mahadevan }
1558304006b3SVijay Mahadevan 
1559304006b3SVijay Mahadevan 
1560304006b3SVijay Mahadevan #undef __FUNCT__
1561304006b3SVijay Mahadevan #define __FUNCT__ "DMClone_Moab"
1562304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm)
1563304006b3SVijay Mahadevan {
1564304006b3SVijay Mahadevan   PetscErrorCode     ierr;
1565304006b3SVijay Mahadevan 
1566304006b3SVijay Mahadevan   PetscFunctionBegin;
1567304006b3SVijay Mahadevan   ierr = PetscObjectChangeTypeName((PetscObject) * newdm, DMMOAB);CHKERRQ(ierr);
1568304006b3SVijay Mahadevan 
1569304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1570304006b3SVijay Mahadevan   (*newdm)->data = (DM_Moab*) dm->data;
1571304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct++;
1572304006b3SVijay Mahadevan 
1573304006b3SVijay Mahadevan   ierr = DMInitialize_Moab(*newdm);CHKERRQ(ierr);
1574304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1575304006b3SVijay Mahadevan }
1576304006b3SVijay Mahadevan 
1577304006b3SVijay Mahadevan 
1578304006b3SVijay Mahadevan #undef __FUNCT__
1579304006b3SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab"
1580f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1581f6829af0SVijay Mahadevan {
1582f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1583f6829af0SVijay Mahadevan 
1584f6829af0SVijay Mahadevan   PetscFunctionBegin;
1585f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1586f90c3b0eSVijay Mahadevan   ierr = PetscNewLog(dm, (DM_Moab**)&dm->data);CHKERRQ(ierr);
1587f6829af0SVijay Mahadevan 
1588f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1589f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1590f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1591f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1592f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1593f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1594f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1595f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1596c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_map = NULL;
1597c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_sendrecv = NULL;
1598f6829af0SVijay Mahadevan 
1599304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct = 1;
1600304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->parent = NULL;
1601f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1602f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1603f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1604f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1605f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1606f6829af0SVijay Mahadevan 
1607304006b3SVijay Mahadevan   ierr = DMInitialize_Moab(dm);CHKERRQ(ierr);
1608f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1609f6829af0SVijay Mahadevan }
1610f6829af0SVijay Mahadevan 
1611