xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision d8d19677bbccf95218448bee62e6b87f4513e133)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
21d72bce8STim Tautges 
31d72bce8STim Tautges #include <petscdmmoab.h>
488face26SJed Brown #include <MBTagConventions.hpp>
59daf19fdSVijay Mahadevan #include <moab/NestedRefine.hpp>
61cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
7032b8ab6SVijay Mahadevan 
8c6ef30f9SVijay Mahadevan /*MC
9c6ef30f9SVijay Mahadevan   DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database.
10c6ef30f9SVijay Mahadevan                     Direct access to the MOAB Interface and other mesh manipulation related objects are available
11c6ef30f9SVijay Mahadevan                     through public API. Ability to create global and local representation of Vecs containing all
12c6ef30f9SVijay Mahadevan                     unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided
13c6ef30f9SVijay Mahadevan                     along with utility functions to traverse the mesh and assemble a discrete system via
14c6ef30f9SVijay Mahadevan                     field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are
15c6ef30f9SVijay Mahadevan                     available.
16c6ef30f9SVijay Mahadevan 
17a8d69d7bSBarry Smith   Reference: https://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html
18c6ef30f9SVijay Mahadevan 
19c6ef30f9SVijay Mahadevan   Level: intermediate
20c6ef30f9SVijay Mahadevan 
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 /* Un-implemented routines */
43304006b3SVijay Mahadevan /*
441bb6d2a8SBarry Smith PETSC_EXTERN PetscErrorCode DMCreatelocalsection_Moab(DM dm);
45304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat);
46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer);
47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd);
48304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm);
49304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS);
50304006b3SVijay Mahadevan */
51c6ef30f9SVijay Mahadevan 
52cab5ea25SPierre Jolivet /*@C
531d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
541d72bce8STim Tautges 
55d083f849SBarry Smith   Collective
561d72bce8STim Tautges 
571d72bce8STim Tautges   Input Parameter:
581d72bce8STim Tautges . comm - The communicator for the DMMoab object
591d72bce8STim Tautges 
601d72bce8STim Tautges   Output Parameter:
61032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
621d72bce8STim Tautges 
631d72bce8STim Tautges   Level: beginner
641d72bce8STim Tautges 
651d72bce8STim Tautges @*/
66032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
671d72bce8STim Tautges {
681d72bce8STim Tautges   PetscErrorCode ierr;
691d72bce8STim Tautges 
701d72bce8STim Tautges   PetscFunctionBegin;
71032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 2);
72032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
73032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
741d72bce8STim Tautges   PetscFunctionReturn(0);
751d72bce8STim Tautges }
761d72bce8STim Tautges 
77cab5ea25SPierre Jolivet /*@C
78b117cd09SVijay Mahadevan   DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data
791d72bce8STim Tautges 
80d083f849SBarry Smith   Collective
811d72bce8STim Tautges 
82*d8d19677SJose E. Roman   Input Parameters:
83a2b725a8SWilliam Gropp + comm - The communicator for the DMMoab object
84032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
85a4d2169cSTim Tautges          along with the DMMoab
86a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
871d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
88a2b725a8SWilliam Gropp - range - If non-NULL, contains range of entities to which DOFs will be assigned
891d72bce8STim Tautges 
901d72bce8STim Tautges   Output Parameter:
91032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
921d72bce8STim Tautges 
93032b8ab6SVijay Mahadevan   Level: intermediate
941d72bce8STim Tautges 
951d72bce8STim Tautges @*/
969daf19fdSVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
971d72bce8STim Tautges {
981d72bce8STim Tautges   PetscErrorCode ierr;
99032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
10085d305f5SVijay Mahadevan   DM             dmmb;
101853cdec3SJed Brown   DM_Moab        *dmmoab;
1021d72bce8STim Tautges 
1031d72bce8STim Tautges   PetscFunctionBegin;
104032b8ab6SVijay Mahadevan   PetscValidPointer(dmb, 6);
10585d305f5SVijay Mahadevan 
10685d305f5SVijay Mahadevan   ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr);
10785d305f5SVijay Mahadevan   dmmoab = (DM_Moab*)(dmmb)->data;
108a4d2169cSTim Tautges 
109a4d2169cSTim Tautges   if (!mbiface) {
11072ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
1117d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1121d72bce8STim Tautges   }
1131cec0304SVijay Mahadevan   else {
1141cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
1157d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1161cec0304SVijay Mahadevan   }
1171cec0304SVijay Mahadevan 
118b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
119b5410836SVijay Mahadevan   dmmoab->fileset = 0;
120b117cd09SVijay Mahadevan   dmmoab->hlevel = 0;
12149d66b22SVijay Mahadevan   dmmoab->nghostrings = 0;
1227d89fc02STim Tautges 
1239daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1249daf19fdSVijay Mahadevan   moab::EntityHandle partnset;
125032b8ab6SVijay Mahadevan 
126db66d124SVijay Mahadevan   /* Create root sets for each mesh.  Then pass these
127db66d124SVijay Mahadevan       to the load_file functions to be populated. */
1280c8a2322SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset); MBERR("Creating partition set failed", merr);
129032b8ab6SVijay Mahadevan 
130db66d124SVijay Mahadevan   /* Create the parallel communicator object with the partition handle associated with MOAB */
13172ff976dSVijay Mahadevan   dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
1329daf19fdSVijay Mahadevan #endif
133032b8ab6SVijay Mahadevan 
1344973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1354973de03SVijay Mahadevan   dmmoab->bs = 1;
136addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1373f1c6e43SVijay Mahadevan   ierr = PetscMalloc(dmmoab->numFields * sizeof(char*), &dmmoab->fieldNames);CHKERRQ(ierr);
1383f1c6e43SVijay Mahadevan   ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr);
1392e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
1402e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
1412e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
1422e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1432e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
1442e4e7c01SVijay Mahadevan   dmmoab->write_mode = WRITE_PART;
1454973de03SVijay Mahadevan 
1464973de03SVijay Mahadevan   /* set global ID tag handle */
1471a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
14885d305f5SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr);
149032b8ab6SVijay Mahadevan   }
150032b8ab6SVijay Mahadevan   else {
1511a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr);
1521a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
153a4d2169cSTim Tautges   }
154a4d2169cSTim Tautges 
155340f3b9aSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag); MBERRNM(merr);
156340f3b9aSVijay Mahadevan 
1574973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
158a4d2169cSTim Tautges   if (range) {
15985d305f5SVijay Mahadevan     ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr);
160a4d2169cSTim Tautges   }
16185d305f5SVijay Mahadevan   *dmb = dmmb;
1621d72bce8STim Tautges   PetscFunctionReturn(0);
1631d72bce8STim Tautges }
1641d72bce8STim Tautges 
1659daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1661d72bce8STim Tautges 
167cab5ea25SPierre Jolivet /*@C
168aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
169aa768e4cSTim Tautges 
170d083f849SBarry Smith   Collective
171aa768e4cSTim Tautges 
172aa768e4cSTim Tautges   Input Parameter:
173aa768e4cSTim Tautges . dm    - The DMMoab object being set
174aa768e4cSTim Tautges 
175aa768e4cSTim Tautges   Output Parameter:
176aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
177aa768e4cSTim Tautges 
178aa768e4cSTim Tautges   Level: beginner
179aa768e4cSTim Tautges 
180aa768e4cSTim Tautges @*/
1811d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm, moab::ParallelComm **pcomm)
1821d72bce8STim Tautges {
1831d72bce8STim Tautges   PetscFunctionBegin;
1841d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
185032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1861d72bce8STim Tautges   PetscFunctionReturn(0);
1871d72bce8STim Tautges }
1881d72bce8STim Tautges 
1899daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */
1909daf19fdSVijay Mahadevan 
191cab5ea25SPierre Jolivet /*@C
192aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
193aa768e4cSTim Tautges 
194d083f849SBarry Smith   Collective
195aa768e4cSTim Tautges 
196*d8d19677SJose E. Roman   Input Parameters:
197a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
198a2b725a8SWilliam Gropp - mbiface - The MOAB instance being set on this DMMoab
199aa768e4cSTim Tautges 
200aa768e4cSTim Tautges   Level: beginner
201aa768e4cSTim Tautges 
202aa768e4cSTim Tautges @*/
203a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm, moab::Interface *mbiface)
2041d72bce8STim Tautges {
205032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
206032b8ab6SVijay Mahadevan 
2071d72bce8STim Tautges   PetscFunctionBegin;
2081d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
2091cec0304SVijay Mahadevan   PetscValidPointer(mbiface, 2);
2109daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
211032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
2129daf19fdSVijay Mahadevan #endif
213032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
214032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2151d72bce8STim Tautges   PetscFunctionReturn(0);
2161d72bce8STim Tautges }
2171d72bce8STim Tautges 
218cab5ea25SPierre Jolivet /*@C
219aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
220aa768e4cSTim Tautges 
221d083f849SBarry Smith   Collective
222aa768e4cSTim Tautges 
223aa768e4cSTim Tautges   Input Parameter:
224aa768e4cSTim Tautges . dm      - The DMMoab object being set
225aa768e4cSTim Tautges 
226aa768e4cSTim Tautges   Output Parameter:
227aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
228aa768e4cSTim Tautges 
229aa768e4cSTim Tautges   Level: beginner
230aa768e4cSTim Tautges 
231aa768e4cSTim Tautges @*/
232a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm, moab::Interface **mbiface)
2331d72bce8STim Tautges {
2349426e041SSatish Balay   PetscErrorCode   ierr;
235cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
236cabb514dSBarry Smith 
2371d72bce8STim Tautges   PetscFunctionBegin;
2381d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
239cabb514dSBarry 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);
240a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2411d72bce8STim Tautges   PetscFunctionReturn(0);
2421d72bce8STim Tautges }
2431d72bce8STim Tautges 
244cab5ea25SPierre Jolivet /*@C
2455eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
246aa768e4cSTim Tautges 
247d083f849SBarry Smith   Collective
248aa768e4cSTim Tautges 
249*d8d19677SJose E. Roman   Input Parameters:
250a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
251a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
252aa768e4cSTim Tautges 
253aa768e4cSTim Tautges   Level: beginner
254aa768e4cSTim Tautges 
255aa768e4cSTim Tautges @*/
2565eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm, moab::Range *range)
2571d72bce8STim Tautges {
258fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
259032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
260032b8ab6SVijay Mahadevan 
2611d72bce8STim Tautges   PetscFunctionBegin;
2621d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
263032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
264032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
265fd3326ddSVijay Mahadevan 
266032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
267fd3326ddSVijay Mahadevan 
2689daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2699daf19fdSVijay Mahadevan   moab::ErrorCode merr;
270fd3326ddSVijay Mahadevan   /* filter based on parallel status */
271fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr);
272fd3326ddSVijay Mahadevan 
273fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
274fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
275fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs, PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr);
276fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
277fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
2789daf19fdSVijay Mahadevan #else
2799daf19fdSVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
2809daf19fdSVijay Mahadevan #endif
281fd3326ddSVijay Mahadevan 
282fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
283032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
284032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
2859daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
2869daf19fdSVijay Mahadevan   PetscErrorCode  ierr;
287820f2d46SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRMPI(ierr);
2889daf19fdSVijay Mahadevan #else
2899daf19fdSVijay Mahadevan   dmmoab->n = dmmoab->nloc;
2909daf19fdSVijay Mahadevan #endif
2911d72bce8STim Tautges   PetscFunctionReturn(0);
2921d72bce8STim Tautges }
2931d72bce8STim Tautges 
294cab5ea25SPierre Jolivet /*@C
2958d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
2968d8d51c8SVijay Mahadevan 
297d083f849SBarry Smith   Collective
2988d8d51c8SVijay Mahadevan 
2998d8d51c8SVijay Mahadevan   Input Parameter:
3008d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3018d8d51c8SVijay Mahadevan 
3028d8d51c8SVijay Mahadevan   Output Parameter:
3038d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3048d8d51c8SVijay Mahadevan 
3058d8d51c8SVijay Mahadevan   Level: beginner
3068d8d51c8SVijay Mahadevan 
3078d8d51c8SVijay Mahadevan @*/
3088d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm, moab::Range *local)
3098d8d51c8SVijay Mahadevan {
3108d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3118d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3128d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3138d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3148d8d51c8SVijay Mahadevan }
3158d8d51c8SVijay Mahadevan 
316cab5ea25SPierre Jolivet /*@C
3175eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
318aa768e4cSTim Tautges 
319d083f849SBarry Smith   Collective
320aa768e4cSTim Tautges 
321aa768e4cSTim Tautges   Input Parameter:
322aa768e4cSTim Tautges . dm    - The DMMoab object being set
323aa768e4cSTim Tautges 
324a2b725a8SWilliam Gropp   Output Parameters:
325a2b725a8SWilliam Gropp + owned - The owned vertex entities in this DMMoab
326a2b725a8SWilliam Gropp - ghost - The ghosted entities (non-owned) stored locally in this partition
327aa768e4cSTim Tautges 
328aa768e4cSTim Tautges   Level: beginner
329aa768e4cSTim Tautges 
330aa768e4cSTim Tautges @*/
331351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm, const moab::Range **owned, const moab::Range **ghost)
3321d72bce8STim Tautges {
3331d72bce8STim Tautges   PetscFunctionBegin;
3341d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
335351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
336351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3371d72bce8STim Tautges   PetscFunctionReturn(0);
3381d72bce8STim Tautges }
3391d72bce8STim Tautges 
340cab5ea25SPierre Jolivet /*@C
3415eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3425eb88e9dSVijay Mahadevan 
343d083f849SBarry Smith   Collective
3445eb88e9dSVijay Mahadevan 
3455eb88e9dSVijay Mahadevan   Input Parameter:
3465eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3475eb88e9dSVijay Mahadevan 
3485eb88e9dSVijay Mahadevan   Output Parameter:
3495eb88e9dSVijay Mahadevan . range - The entities owned locally
3505eb88e9dSVijay Mahadevan 
3515eb88e9dSVijay Mahadevan   Level: beginner
3525eb88e9dSVijay Mahadevan 
3535eb88e9dSVijay Mahadevan @*/
354351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm, const moab::Range **range)
3555eb88e9dSVijay Mahadevan {
3565eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3575eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
358351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3591cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3601cec0304SVijay Mahadevan }
3611cec0304SVijay Mahadevan 
362cab5ea25SPierre Jolivet /*@C
3631cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3641cec0304SVijay Mahadevan 
365d083f849SBarry Smith   Collective
3661cec0304SVijay Mahadevan 
367a2b725a8SWilliam Gropp   Input Parameters:
368a2b725a8SWilliam Gropp + dm    - The DMMoab object being set
369a2b725a8SWilliam Gropp - range - The entities treated by this DMMoab
3701cec0304SVijay Mahadevan 
3711cec0304SVijay Mahadevan   Level: beginner
3721cec0304SVijay Mahadevan 
3731cec0304SVijay Mahadevan @*/
3741cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm, moab::Range *range)
3751cec0304SVijay Mahadevan {
3761cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
3771cec0304SVijay Mahadevan 
3781cec0304SVijay Mahadevan   PetscFunctionBegin;
3791cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
3801cec0304SVijay Mahadevan   dmmoab->elocal->clear();
3811cec0304SVijay Mahadevan   dmmoab->eghost->clear();
3821cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
3839daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3849daf19fdSVijay Mahadevan   moab::ErrorCode merr;
3851cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
3861cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
3879daf19fdSVijay Mahadevan #endif
3881cec0304SVijay Mahadevan   dmmoab->neleloc = dmmoab->elocal->size();
38941dd5348SVijay Mahadevan   dmmoab->neleghost = dmmoab->eghost->size();
3909daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
3919daf19fdSVijay Mahadevan   PetscErrorCode  ierr;
392820f2d46SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRMPI(ierr);
3938cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
3949daf19fdSVijay Mahadevan #else
3959daf19fdSVijay Mahadevan   dmmoab->nele = dmmoab->neleloc;
3969daf19fdSVijay Mahadevan #endif
3975eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
3985eb88e9dSVijay Mahadevan }
3995eb88e9dSVijay Mahadevan 
400cab5ea25SPierre Jolivet /*@C
401aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
402aa768e4cSTim Tautges 
403d083f849SBarry Smith   Collective
404aa768e4cSTim Tautges 
405a2b725a8SWilliam Gropp   Input Parameters:
406a2b725a8SWilliam Gropp + dm      - The DMMoab object being set
407a2b725a8SWilliam Gropp - ltogtag - The MOAB tag used for local to global ids
408aa768e4cSTim Tautges 
409aa768e4cSTim Tautges   Level: beginner
410aa768e4cSTim Tautges 
411aa768e4cSTim Tautges @*/
4121d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm, moab::Tag ltogtag)
4131d72bce8STim Tautges {
4141d72bce8STim Tautges   PetscFunctionBegin;
4151d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4161d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4171d72bce8STim Tautges   PetscFunctionReturn(0);
4181d72bce8STim Tautges }
4191d72bce8STim Tautges 
420cab5ea25SPierre Jolivet /*@C
421aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
422aa768e4cSTim Tautges 
423d083f849SBarry Smith   Collective
424aa768e4cSTim Tautges 
425aa768e4cSTim Tautges   Input Parameter:
426aa768e4cSTim Tautges . dm      - The DMMoab object being set
427aa768e4cSTim Tautges 
428aa768e4cSTim Tautges   Output Parameter:
429aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
430aa768e4cSTim Tautges 
431aa768e4cSTim Tautges   Level: beginner
432aa768e4cSTim Tautges 
433aa768e4cSTim Tautges @*/
4341d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm, moab::Tag *ltog_tag)
4351d72bce8STim Tautges {
4361d72bce8STim Tautges   PetscFunctionBegin;
4371d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4381d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4391d72bce8STim Tautges   PetscFunctionReturn(0);
4401d72bce8STim Tautges }
4411d72bce8STim Tautges 
442cab5ea25SPierre Jolivet /*@C
443aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
444aa768e4cSTim Tautges 
445d083f849SBarry Smith   Collective
446aa768e4cSTim Tautges 
447*d8d19677SJose E. Roman   Input Parameters:
448a2b725a8SWilliam Gropp + dm - The DMMoab object being set
449a2b725a8SWilliam Gropp - bs - The block size used with this DMMoab
450aa768e4cSTim Tautges 
451aa768e4cSTim Tautges   Level: beginner
452aa768e4cSTim Tautges 
453aa768e4cSTim Tautges @*/
4541d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm, PetscInt bs)
4551d72bce8STim Tautges {
4561d72bce8STim Tautges   PetscFunctionBegin;
4571d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4581d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4591d72bce8STim Tautges   PetscFunctionReturn(0);
4601d72bce8STim Tautges }
4611d72bce8STim Tautges 
462cab5ea25SPierre Jolivet /*@C
463aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
464aa768e4cSTim Tautges 
465d083f849SBarry Smith   Collective
466aa768e4cSTim Tautges 
467aa768e4cSTim Tautges   Input Parameter:
468aa768e4cSTim Tautges . dm - The DMMoab object being set
469aa768e4cSTim Tautges 
470aa768e4cSTim Tautges   Output Parameter:
471aa768e4cSTim Tautges . bs - The block size used with this DMMoab
472aa768e4cSTim Tautges 
473aa768e4cSTim Tautges   Level: beginner
474aa768e4cSTim Tautges 
475aa768e4cSTim Tautges @*/
4761d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm, PetscInt *bs)
4771d72bce8STim Tautges {
4781d72bce8STim Tautges   PetscFunctionBegin;
4791d72bce8STim Tautges   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4801d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
4811d72bce8STim Tautges   PetscFunctionReturn(0);
4821d72bce8STim Tautges }
4831d72bce8STim Tautges 
484cab5ea25SPierre Jolivet /*@C
485212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
486212ad6d1SVijay Mahadevan 
487d083f849SBarry Smith   Collective on dm
488212ad6d1SVijay Mahadevan 
489212ad6d1SVijay Mahadevan   Input Parameter:
490212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
491212ad6d1SVijay Mahadevan 
492*d8d19677SJose E. Roman   Output Parameters:
493a2b725a8SWilliam Gropp + neg - The number of global elements in the DMMoab instance
494a2b725a8SWilliam Gropp - nvg - The number of global vertices in the DMMoab instance
495212ad6d1SVijay Mahadevan 
496212ad6d1SVijay Mahadevan   Level: beginner
497212ad6d1SVijay Mahadevan 
498212ad6d1SVijay Mahadevan @*/
49941dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm, PetscInt *neg, PetscInt *nvg)
500212ad6d1SVijay Mahadevan {
501212ad6d1SVijay Mahadevan   PetscFunctionBegin;
502212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
50341dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab*)dm->data)->nele;
50441dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab*)dm->data)->n;
505212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
506212ad6d1SVijay Mahadevan }
507212ad6d1SVijay Mahadevan 
508cab5ea25SPierre Jolivet /*@C
509212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
510212ad6d1SVijay Mahadevan 
511d083f849SBarry Smith   Collective on dm
512212ad6d1SVijay Mahadevan 
513212ad6d1SVijay Mahadevan   Input Parameter:
514212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
515212ad6d1SVijay Mahadevan 
516*d8d19677SJose E. Roman   Output Parameters:
517b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
51800cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
51900cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
520a2b725a8SWilliam Gropp - nvg - The number of ghosted vertices in this processor
521212ad6d1SVijay Mahadevan 
522212ad6d1SVijay Mahadevan   Level: beginner
523212ad6d1SVijay Mahadevan 
524212ad6d1SVijay Mahadevan @*/
52541dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm, PetscInt *nel, PetscInt *neg, PetscInt *nvl, PetscInt *nvg)
526212ad6d1SVijay Mahadevan {
527212ad6d1SVijay Mahadevan   PetscFunctionBegin;
528212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
52941dd5348SVijay Mahadevan   if (nel) *nel = ((DM_Moab*)dm->data)->neleloc;
53041dd5348SVijay Mahadevan   if (neg) *neg = ((DM_Moab*)dm->data)->neleghost;
53141dd5348SVijay Mahadevan   if (nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
53241dd5348SVijay Mahadevan   if (nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
533212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
534212ad6d1SVijay Mahadevan }
535212ad6d1SVijay Mahadevan 
536cab5ea25SPierre Jolivet /*@C
53700cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
53800cc10feSVijay Mahadevan 
539d083f849SBarry Smith   Collective
54000cc10feSVijay Mahadevan 
54100cc10feSVijay Mahadevan   Input Parameter:
54200cc10feSVijay Mahadevan . dm - The DMMoab object being set
54300cc10feSVijay Mahadevan 
54400cc10feSVijay Mahadevan   Output Parameter:
54500cc10feSVijay Mahadevan . offset - The local offset for the global vector
54600cc10feSVijay Mahadevan 
54700cc10feSVijay Mahadevan   Level: beginner
54800cc10feSVijay Mahadevan 
54900cc10feSVijay Mahadevan @*/
55000cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm, PetscInt *offset)
55100cc10feSVijay Mahadevan {
55200cc10feSVijay Mahadevan   PetscFunctionBegin;
55300cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
55400cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
55500cc10feSVijay Mahadevan   PetscFunctionReturn(0);
55600cc10feSVijay Mahadevan }
55700cc10feSVijay Mahadevan 
558cab5ea25SPierre Jolivet /*@C
5594920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5604920ab11SVijay Mahadevan 
561d083f849SBarry Smith   Collective
5624920ab11SVijay Mahadevan 
5634920ab11SVijay Mahadevan   Input Parameter:
564340f3b9aSVijay Mahadevan . dm - The DMMoab object
5654920ab11SVijay Mahadevan 
5664920ab11SVijay Mahadevan   Output Parameter:
5674920ab11SVijay Mahadevan . dim - The dimension of DM
5684920ab11SVijay Mahadevan 
5694920ab11SVijay Mahadevan   Level: beginner
5704920ab11SVijay Mahadevan 
5714920ab11SVijay Mahadevan @*/
5724920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm, PetscInt *dim)
5734920ab11SVijay Mahadevan {
5744920ab11SVijay Mahadevan   PetscFunctionBegin;
5754920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
5764920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
5774920ab11SVijay Mahadevan   PetscFunctionReturn(0);
5784920ab11SVijay Mahadevan }
5794920ab11SVijay Mahadevan 
580cab5ea25SPierre Jolivet /*@C
581755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
582755f3dfbSVijay Mahadevan   generated through uniform refinement.
583755f3dfbSVijay Mahadevan 
584d083f849SBarry Smith   Collective on dm
585755f3dfbSVijay Mahadevan 
586755f3dfbSVijay Mahadevan   Input Parameter:
587755f3dfbSVijay Mahadevan . dm - The DMMoab object being set
588755f3dfbSVijay Mahadevan 
589755f3dfbSVijay Mahadevan   Output Parameter:
590755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level
591755f3dfbSVijay Mahadevan 
592755f3dfbSVijay Mahadevan   Level: beginner
593755f3dfbSVijay Mahadevan 
594755f3dfbSVijay Mahadevan @*/
595755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm, PetscInt *nlevel)
596755f3dfbSVijay Mahadevan {
597755f3dfbSVijay Mahadevan   PetscFunctionBegin;
598755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
599755f3dfbSVijay Mahadevan   if (nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel;
600755f3dfbSVijay Mahadevan   PetscFunctionReturn(0);
601755f3dfbSVijay Mahadevan }
602755f3dfbSVijay Mahadevan 
603cab5ea25SPierre Jolivet /*@C
604340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
605340f3b9aSVijay Mahadevan 
606d083f849SBarry Smith   Collective
607340f3b9aSVijay Mahadevan 
608*d8d19677SJose E. Roman   Input Parameters:
609a2b725a8SWilliam Gropp + dm - The DMMoab object
610a2b725a8SWilliam Gropp - ehandle - The element entity handle
611340f3b9aSVijay Mahadevan 
612340f3b9aSVijay Mahadevan   Output Parameter:
613340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
614340f3b9aSVijay Mahadevan 
615340f3b9aSVijay Mahadevan   Level: beginner
616340f3b9aSVijay Mahadevan 
617340f3b9aSVijay Mahadevan @*/
618340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm, const moab::EntityHandle ehandle, PetscInt *mat)
619340f3b9aSVijay Mahadevan {
620340f3b9aSVijay Mahadevan   DM_Moab         *dmmoab;
621340f3b9aSVijay Mahadevan 
622340f3b9aSVijay Mahadevan   PetscFunctionBegin;
623340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
624340f3b9aSVijay Mahadevan   if (*mat) {
625340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab*)(dm)->data;
626a044f6b6SVijay Mahadevan     *mat = dmmoab->materials[dmmoab->elocal->index(ehandle)];
627340f3b9aSVijay Mahadevan   }
628340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
629340f3b9aSVijay Mahadevan }
630340f3b9aSVijay Mahadevan 
631cab5ea25SPierre Jolivet /*@C
63285d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
63385d305f5SVijay Mahadevan 
634d083f849SBarry Smith   Collective
63585d305f5SVijay Mahadevan 
636*d8d19677SJose E. Roman   Input Parameters:
637a2b725a8SWilliam Gropp + dm - The DMMoab object
63885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
639a2b725a8SWilliam Gropp - conn - The vertex entity handles
64085d305f5SVijay Mahadevan 
64185d305f5SVijay Mahadevan   Output Parameter:
64285d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
64385d305f5SVijay Mahadevan 
64485d305f5SVijay Mahadevan   Level: beginner
64585d305f5SVijay Mahadevan 
64685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity()
64785d305f5SVijay Mahadevan @*/
648cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm, PetscInt nconn, const moab::EntityHandle *conn, PetscReal *vpos)
6497023aa44SVijay Mahadevan {
6507023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6517023aa44SVijay Mahadevan   moab::ErrorCode merr;
6527023aa44SVijay Mahadevan 
6537023aa44SVijay Mahadevan   PetscFunctionBegin;
6547023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6557023aa44SVijay Mahadevan   PetscValidPointer(conn, 3);
6569c368985SVijay Mahadevan   PetscValidPointer(vpos, 4);
6577023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6587023aa44SVijay Mahadevan 
6597023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6609c368985SVijay Mahadevan   if (dmmoab->hlevel) {
6619c368985SVijay Mahadevan     merr = dmmoab->hierarchy->get_coordinates(const_cast<moab::EntityHandle*>(conn), nconn, dmmoab->hlevel, vpos);MBERRNM(merr);
6629c368985SVijay Mahadevan   }
6639c368985SVijay Mahadevan   else {
6647023aa44SVijay Mahadevan     merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
6659c368985SVijay Mahadevan   }
6667023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6677023aa44SVijay Mahadevan }
6687023aa44SVijay Mahadevan 
669cab5ea25SPierre Jolivet /*@C
67085d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
67185d305f5SVijay Mahadevan 
672d083f849SBarry Smith   Collective
67385d305f5SVijay Mahadevan 
674*d8d19677SJose E. Roman   Input Parameters:
675a2b725a8SWilliam Gropp + dm - The DMMoab object
676a2b725a8SWilliam Gropp - vhandle - Vertex entity handle
67785d305f5SVijay Mahadevan 
678*d8d19677SJose E. Roman   Output Parameters:
679a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
680a2b725a8SWilliam Gropp - conn - The vertex entity handles
68185d305f5SVijay Mahadevan 
68285d305f5SVijay Mahadevan   Level: beginner
68385d305f5SVijay Mahadevan 
68485d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity()
68585d305f5SVijay Mahadevan @*/
68685d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm, moab::EntityHandle vhandle, PetscInt* nconn, moab::EntityHandle **conn)
6878d8d51c8SVijay Mahadevan {
6888d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
6898d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities, connect;
6908d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
6918d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
6928d8d51c8SVijay Mahadevan 
6938d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6948d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
6958d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
6968d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6978d8d51c8SVijay Mahadevan 
6988d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
69985d305f5SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION); MBERRNM(merr);
7008d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0], adj_entities.size(), connect); MBERRNM(merr);
7018d8d51c8SVijay Mahadevan 
7028d8d51c8SVijay Mahadevan   if (conn) {
7038d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle) * connect.size(), conn);CHKERRQ(ierr);
704580bdb30SBarry Smith     ierr = PetscArraycpy(*conn, &connect[0], connect.size());CHKERRQ(ierr);
7058d8d51c8SVijay Mahadevan   }
7068d8d51c8SVijay Mahadevan   if (nconn) *nconn = connect.size();
7078d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7088d8d51c8SVijay Mahadevan }
7098d8d51c8SVijay Mahadevan 
710cab5ea25SPierre Jolivet /*@C
71185d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
71285d305f5SVijay Mahadevan 
713d083f849SBarry Smith   Collective
71485d305f5SVijay Mahadevan 
715*d8d19677SJose E. Roman   Input Parameters:
716a2b725a8SWilliam Gropp + dm - The DMMoab object
71785d305f5SVijay Mahadevan . vhandle - Vertex entity handle
71885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
719a2b725a8SWilliam Gropp - conn - The vertex entity handles
72085d305f5SVijay Mahadevan 
72185d305f5SVijay Mahadevan   Level: beginner
72285d305f5SVijay Mahadevan 
72385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity()
72485d305f5SVijay Mahadevan @*/
7258d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, moab::EntityHandle **conn)
7268d8d51c8SVijay Mahadevan {
7278d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7288d8d51c8SVijay Mahadevan 
7298d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7308d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7318d8d51c8SVijay Mahadevan   PetscValidPointer(conn, 4);
7328d8d51c8SVijay Mahadevan 
7338d8d51c8SVijay Mahadevan   if (conn) {
7348d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
7358d8d51c8SVijay Mahadevan   }
7368d8d51c8SVijay Mahadevan   if (nconn) *nconn = 0;
7378d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7388d8d51c8SVijay Mahadevan }
7398d8d51c8SVijay Mahadevan 
740cab5ea25SPierre Jolivet /*@C
74185d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
74285d305f5SVijay Mahadevan 
743d083f849SBarry Smith   Collective
74485d305f5SVijay Mahadevan 
745*d8d19677SJose E. Roman   Input Parameters:
746a2b725a8SWilliam Gropp + dm - The DMMoab object
747a2b725a8SWilliam Gropp - ehandle - Vertex entity handle
74885d305f5SVijay Mahadevan 
749*d8d19677SJose E. Roman   Output Parameters:
750a2b725a8SWilliam Gropp + nconn - Number of entities whose coordinates are needed
751a2b725a8SWilliam Gropp - conn - The vertex entity handles
75285d305f5SVijay Mahadevan 
75385d305f5SVijay Mahadevan   Level: beginner
75485d305f5SVijay Mahadevan 
75585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity()
75685d305f5SVijay Mahadevan @*/
7577023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm, moab::EntityHandle ehandle, PetscInt* nconn, const moab::EntityHandle **conn)
7587023aa44SVijay Mahadevan {
7597023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7607023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
7619c368985SVijay Mahadevan   std::vector<moab::EntityHandle> vconn;
7627023aa44SVijay Mahadevan   moab::ErrorCode merr;
7637023aa44SVijay Mahadevan   PetscInt nnodes;
7647023aa44SVijay Mahadevan 
7657023aa44SVijay Mahadevan   PetscFunctionBegin;
7667023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
7677023aa44SVijay Mahadevan   PetscValidPointer(conn, 4);
7687023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7697023aa44SVijay Mahadevan 
7707023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7717023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes); MBERRNM(merr);
7727023aa44SVijay Mahadevan   if (conn) *conn = connect;
7737023aa44SVijay Mahadevan   if (nconn) *nconn = nnodes;
7747023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7757023aa44SVijay Mahadevan }
7767023aa44SVijay Mahadevan 
777cab5ea25SPierre Jolivet /*@C
77885d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
77985d305f5SVijay Mahadevan 
780d083f849SBarry Smith   Collective
78185d305f5SVijay Mahadevan 
782*d8d19677SJose E. Roman   Input Parameters:
783a2b725a8SWilliam Gropp + dm - The DMMoab object
784a2b725a8SWilliam Gropp - ent - Entity handle
78585d305f5SVijay Mahadevan 
78685d305f5SVijay Mahadevan   Output Parameter:
78785d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
78885d305f5SVijay Mahadevan 
78985d305f5SVijay Mahadevan   Level: beginner
79085d305f5SVijay Mahadevan 
79185d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices()
79285d305f5SVijay Mahadevan @*/
79369263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm, const moab::EntityHandle ent, PetscBool* ent_on_boundary)
79469263071SVijay Mahadevan {
79569263071SVijay Mahadevan   moab::EntityType etype;
79669263071SVijay Mahadevan   DM_Moab         *dmmoab;
79769263071SVijay Mahadevan   PetscInt         edim;
79869263071SVijay Mahadevan 
79969263071SVijay Mahadevan   PetscFunctionBegin;
80069263071SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
80169263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary, 3);
80269263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
80369263071SVijay Mahadevan 
80469263071SVijay Mahadevan   /* get the entity type and handle accordingly */
80569263071SVijay Mahadevan   etype = dmmoab->mbiface->type_from_handle(ent);
80669263071SVijay 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);
80769263071SVijay Mahadevan 
80869263071SVijay Mahadevan   /* get the entity dimension */
80969263071SVijay Mahadevan   edim = dmmoab->mbiface->dimension_from_handle(ent);
81069263071SVijay Mahadevan 
81169263071SVijay Mahadevan   *ent_on_boundary = PETSC_FALSE;
81269263071SVijay Mahadevan   if (etype == moab::MBVERTEX && edim == 0) {
81349d66b22SVijay Mahadevan     *ent_on_boundary = ((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE : PETSC_FALSE);
81469263071SVijay Mahadevan   }
81569263071SVijay Mahadevan   else {
81669263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
8176d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
81869263071SVijay Mahadevan     }
81969263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
8206d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary = PETSC_TRUE;
82169263071SVijay Mahadevan     }
82269263071SVijay Mahadevan   }
82369263071SVijay Mahadevan   PetscFunctionReturn(0);
82469263071SVijay Mahadevan }
82569263071SVijay Mahadevan 
826cab5ea25SPierre Jolivet /*@C
8274597dd3dSJose E. Roman   DMMoabCheckBoundaryVertices - Check whether a given entity is on the boundary (vertex, edge, face, element)
82885d305f5SVijay Mahadevan 
82985d305f5SVijay Mahadevan   Input Parameter:
830a2b725a8SWilliam Gropp + dm - The DMMoab object
83185d305f5SVijay Mahadevan . nconn - Number of handles
832a2b725a8SWilliam Gropp - cnt - Array of entity handles
83385d305f5SVijay Mahadevan 
83485d305f5SVijay Mahadevan   Output Parameter:
83585d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
83685d305f5SVijay Mahadevan 
83785d305f5SVijay Mahadevan   Level: beginner
83885d305f5SVijay Mahadevan 
83985d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary()
84085d305f5SVijay Mahadevan @*/
84169263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm, PetscInt nconn, const moab::EntityHandle *cnt, PetscBool* isbdvtx)
8427023aa44SVijay Mahadevan {
8437023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8447023aa44SVijay Mahadevan   PetscInt       i;
8457023aa44SVijay Mahadevan 
8467023aa44SVijay Mahadevan   PetscFunctionBegin;
8477023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8487023aa44SVijay Mahadevan   PetscValidPointer(cnt, 3);
8497023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx, 4);
8507023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8517023aa44SVijay Mahadevan 
8527023aa44SVijay Mahadevan   for (i = 0; i < nconn; ++i) {
8536d9eb265SVijay Mahadevan     isbdvtx[i] = (dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE : PETSC_FALSE);
8547023aa44SVijay Mahadevan   }
8557023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8567023aa44SVijay Mahadevan }
8577023aa44SVijay Mahadevan 
858cab5ea25SPierre Jolivet /*@C
85985d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
86085d305f5SVijay Mahadevan 
86185d305f5SVijay Mahadevan   Input Parameter:
86285d305f5SVijay Mahadevan . dm - The DMMoab object
86385d305f5SVijay Mahadevan 
864*d8d19677SJose E. Roman   Output Parameters:
865a2b725a8SWilliam Gropp + bdvtx - Boundary vertices
86685d305f5SVijay Mahadevan . bdelems - Boundary elements
867a2b725a8SWilliam Gropp - bdfaces - Boundary faces
86885d305f5SVijay Mahadevan 
86985d305f5SVijay Mahadevan   Level: beginner
87085d305f5SVijay Mahadevan 
87185d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary()
87285d305f5SVijay Mahadevan @*/
8736d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm, const moab::Range **bdvtx, const moab::Range** bdelems, const moab::Range** bdfaces)
8741cec0304SVijay Mahadevan {
8751cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8761cec0304SVijay Mahadevan 
8771cec0304SVijay Mahadevan   PetscFunctionBegin;
8781cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
8791cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8801cec0304SVijay Mahadevan 
8816d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
8826d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
8836d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
8841cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8851cec0304SVijay Mahadevan }
8861cec0304SVijay Mahadevan 
887f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
888f6829af0SVijay Mahadevan {
889f6829af0SVijay Mahadevan   PetscErrorCode  ierr;
89085d305f5SVijay Mahadevan   PetscInt        i;
891e882eb38SVijay Mahadevan   moab::ErrorCode merr;
892f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
893f6829af0SVijay Mahadevan 
894f6829af0SVijay Mahadevan   PetscFunctionBegin;
895f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
896304006b3SVijay Mahadevan 
897304006b3SVijay Mahadevan   dmmoab->refct--;
898304006b3SVijay Mahadevan   if (!dmmoab->refct) {
899f6829af0SVijay Mahadevan     delete dmmoab->vlocal;
900f6829af0SVijay Mahadevan     delete dmmoab->vowned;
901f6829af0SVijay Mahadevan     delete dmmoab->vghost;
902f6829af0SVijay Mahadevan     delete dmmoab->elocal;
903f6829af0SVijay Mahadevan     delete dmmoab->eghost;
904f6829af0SVijay Mahadevan     delete dmmoab->bndyvtx;
905f6829af0SVijay Mahadevan     delete dmmoab->bndyfaces;
906f6829af0SVijay Mahadevan     delete dmmoab->bndyelems;
907f6829af0SVijay Mahadevan 
908f6829af0SVijay Mahadevan     ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
9097ae5e5b6SVijay Mahadevan     ierr = PetscFree2(dmmoab->gidmap, dmmoab->lidmap);CHKERRQ(ierr);
9105905e1eaSVijay Mahadevan     ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr);
9115905e1eaSVijay Mahadevan     ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr);
9129c368985SVijay Mahadevan     ierr = PetscFree(dmmoab->materials);CHKERRQ(ierr);
91385d305f5SVijay Mahadevan     if (dmmoab->fieldNames) {
91485d305f5SVijay Mahadevan       for (i = 0; i < dmmoab->numFields; i++) {
91585d305f5SVijay Mahadevan         ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
91685d305f5SVijay Mahadevan       }
91785d305f5SVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
91885d305f5SVijay Mahadevan     }
919b117cd09SVijay Mahadevan 
920b117cd09SVijay Mahadevan     if (dmmoab->nhlevels) {
921b117cd09SVijay Mahadevan       ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr);
922e882eb38SVijay Mahadevan       dmmoab->nhlevels = 0;
923e882eb38SVijay Mahadevan       if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
924e882eb38SVijay Mahadevan       dmmoab->hierarchy = NULL;
925b117cd09SVijay Mahadevan     }
926e882eb38SVijay Mahadevan 
927e882eb38SVijay Mahadevan     if (dmmoab->icreatedinstance) {
9289c368985SVijay Mahadevan       delete dmmoab->pcomm;
929e882eb38SVijay Mahadevan       merr = dmmoab->mbiface->delete_mesh(); MBERRNM(merr);
930e882eb38SVijay Mahadevan       delete dmmoab->mbiface;
931e882eb38SVijay Mahadevan     }
932e882eb38SVijay Mahadevan     dmmoab->mbiface = NULL;
9339daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
934e882eb38SVijay Mahadevan     dmmoab->pcomm = NULL;
9359daf19fdSVijay Mahadevan #endif
936f6829af0SVijay Mahadevan     ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
937f6829af0SVijay Mahadevan     ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
938f6829af0SVijay Mahadevan     ierr = PetscFree(dm->data);CHKERRQ(ierr);
939304006b3SVijay Mahadevan   }
940f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
941f6829af0SVijay Mahadevan }
942f6829af0SVijay Mahadevan 
9434416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject, DM dm)
9442e4e7c01SVijay Mahadevan {
9452e4e7c01SVijay Mahadevan   PetscErrorCode ierr;
9462e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
9472e4e7c01SVijay Mahadevan 
9482e4e7c01SVijay Mahadevan   PetscFunctionBegin;
9492e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
950cc310fddSBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject, "DMMoab Options");CHKERRQ(ierr);
9515a856986SBarry Smith   ierr  = PetscOptionsBoundedInt("-dm_moab_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "DMView", dmmoab->rw_dbglevel, &dmmoab->rw_dbglevel, NULL,0);CHKERRQ(ierr);
9522e4e7c01SVijay 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);
9532e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
954589a23caSBarry Smith   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, sizeof(dmmoab->extra_read_options), NULL);CHKERRQ(ierr);
955589a23caSBarry Smith   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, sizeof(dmmoab->extra_write_options), NULL);CHKERRQ(ierr);
9562e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr);
9572e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr);
9582e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
9592e4e7c01SVijay Mahadevan }
9602e4e7c01SVijay Mahadevan 
961f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
962f6829af0SVijay Mahadevan {
963f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
964f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
965f6829af0SVijay Mahadevan   Vec                     local, global;
966f6829af0SVijay Mahadevan   IS                      from, to;
967f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
968304006b3SVijay Mahadevan   PetscInt                i, j, f, bs, vent, totsize, *lgmap;
969f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
970f6829af0SVijay Mahadevan   moab::Range             adjs;
971f6829af0SVijay Mahadevan 
972f6829af0SVijay Mahadevan   PetscFunctionBegin;
973f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
974f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
9759daf19fdSVijay Mahadevan   if (dmmoab->mbiface == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp.");
9769daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
9779daf19fdSVijay Mahadevan   if (dmmoab->pcomm == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp.");
9789daf19fdSVijay Mahadevan #endif
979f6829af0SVijay Mahadevan 
980f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
981f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
982f6829af0SVijay Mahadevan   {
98349d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
98449d66b22SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false); MBERRNM(merr);
985f6829af0SVijay Mahadevan 
9869daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
987f6829af0SVijay Mahadevan     /* filter based on parallel status */
988f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal, PSTATUS_NOT_OWNED, PSTATUS_NOT, -1, dmmoab->vowned); MBERRNM(merr);
989f6829af0SVijay Mahadevan 
990f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
9919c368985SVijay Mahadevan     // *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
992f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
99364e1c140SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs, PSTATUS_GHOST | PSTATUS_INTERFACE, PSTATUS_OR, -1, dmmoab->vghost); MBERRNM(merr);
994f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
995f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
9969daf19fdSVijay Mahadevan #else
9979daf19fdSVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
9989daf19fdSVijay Mahadevan #endif
999f6829af0SVijay Mahadevan 
1000f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
1001f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
1002f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
100349d66b22SVijay Mahadevan 
10049daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1005820f2d46SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRMPI(ierr);
100649d66b22SVijay Mahadevan     PetscInfo4(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost);
10079daf19fdSVijay Mahadevan #else
10089daf19fdSVijay Mahadevan     dmmoab->n = dmmoab->nloc;
10099daf19fdSVijay Mahadevan #endif
1010f6829af0SVijay Mahadevan   }
1011f6829af0SVijay Mahadevan 
1012f6829af0SVijay Mahadevan   {
1013f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1014f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1015f6829af0SVijay Mahadevan 
1016f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1017f6829af0SVijay Mahadevan     for (i = 3; i > 0; i--) {
1018f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
101949d66b22SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false); MBERRNM(merr);
1020f6829af0SVijay Mahadevan 
1021f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1022f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1023f6829af0SVijay Mahadevan         dmmoab->dim = i;
1024f6829af0SVijay Mahadevan         break;
1025f6829af0SVijay Mahadevan       }
1026f6829af0SVijay Mahadevan     }
1027f6829af0SVijay Mahadevan 
1028b117cd09SVijay Mahadevan     ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr);
1029b117cd09SVijay Mahadevan 
10309daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1031f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1032f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
1033f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
1034f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
10359daf19fdSVijay Mahadevan #endif
1036f6829af0SVijay Mahadevan 
1037f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
1038f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
103949d66b22SVijay Mahadevan 
10409daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1041820f2d46SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRMPI(ierr);
104249d66b22SVijay Mahadevan     PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost);
10439daf19fdSVijay Mahadevan #else
10449daf19fdSVijay Mahadevan     dmmoab->nele = dmmoab->neleloc;
10459daf19fdSVijay Mahadevan #endif
1046f6829af0SVijay Mahadevan   }
1047f6829af0SVijay Mahadevan 
1048f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1049f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1050f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1051f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1052f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
1053f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag); MBERRNM(merr);
1054f6829af0SVijay Mahadevan   }
1055f6829af0SVijay Mahadevan 
1056f6829af0SVijay Mahadevan   totsize = dmmoab->vlocal->size();
105749d66b22SVijay 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);
105849d66b22SVijay Mahadevan   ierr = PetscCalloc1(totsize, &dmmoab->gsindices);CHKERRQ(ierr);
1059f6829af0SVijay Mahadevan   {
1060f6829af0SVijay Mahadevan     /* first get the local indices */
1061f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vowned, &dmmoab->gsindices[0]); MBERRNM(merr);
10623f1c6e43SVijay Mahadevan     if (dmmoab->nghost) {  /* next get the ghosted indices */
1063f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag, *dmmoab->vghost, &dmmoab->gsindices[dmmoab->nloc]); MBERRNM(merr);
1064f6829af0SVijay Mahadevan     }
1065f6829af0SVijay Mahadevan 
1066f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1067304006b3SVijay Mahadevan     dmmoab->lminmax[0] = dmmoab->lminmax[1] = dmmoab->gsindices[0];
1068f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1069304006b3SVijay Mahadevan       if (dmmoab->lminmax[0] > dmmoab->gsindices[i]) dmmoab->lminmax[0] = dmmoab->gsindices[i];
1070304006b3SVijay Mahadevan       if (dmmoab->lminmax[1] < dmmoab->gsindices[i]) dmmoab->lminmax[1] = dmmoab->gsindices[i];
1071f6829af0SVijay Mahadevan     }
1072f6829af0SVijay Mahadevan 
1073820f2d46SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRMPI(ierr);
1074820f2d46SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm);CHKERRMPI(ierr);
1075f6829af0SVijay Mahadevan 
1076f6829af0SVijay Mahadevan     /* set the GID map */
1077f6829af0SVijay Mahadevan     for (i = 0; i < totsize; ++i) {
1078304006b3SVijay Mahadevan       dmmoab->gsindices[i] -= dmmoab->gminmax[0]; /* zero based index needed for IS */
10799c368985SVijay Mahadevan 
1080f6829af0SVijay Mahadevan     }
1081304006b3SVijay Mahadevan     dmmoab->lminmax[0] -= dmmoab->gminmax[0];
1082304006b3SVijay Mahadevan     dmmoab->lminmax[1] -= dmmoab->gminmax[0];
1083f6829af0SVijay Mahadevan 
1084304006b3SVijay 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]);
1085f6829af0SVijay Mahadevan   }
108682dfd14aSVijay 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);
1087f6829af0SVijay Mahadevan 
1088f6829af0SVijay Mahadevan   {
10899c368985SVijay Mahadevan     dmmoab->seqstart = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->front());
10909c368985SVijay Mahadevan     dmmoab->seqend = dmmoab->mbiface->id_from_handle(dmmoab->vlocal->back());
1091304006b3SVijay Mahadevan     PetscInfo2(NULL, "SEQUENCE: Local [min, max] - [%D, %D]\n", dmmoab->seqstart, dmmoab->seqend);
10923f1c6e43SVijay Mahadevan 
109349d66b22SVijay Mahadevan     ierr = PetscMalloc2(dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->gidmap, dmmoab->seqend - dmmoab->seqstart + 1, &dmmoab->lidmap);CHKERRQ(ierr);
10943f1c6e43SVijay Mahadevan     ierr = PetscMalloc1(totsize * dmmoab->numFields, &lgmap);CHKERRQ(ierr);
1095f6829af0SVijay Mahadevan 
1096f6829af0SVijay Mahadevan     i = j = 0;
1097f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1098f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++, i++) {
1099e92d1c7cSVijay Mahadevan       vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1100f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1101f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1102f6829af0SVijay Mahadevan       for (f = 0; f < dmmoab->numFields; f++, j++) {
11033f1c6e43SVijay Mahadevan         lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1104f6829af0SVijay Mahadevan       }
1105f6829af0SVijay Mahadevan     }
1106f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1107f6829af0SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++, i++) {
1108e92d1c7cSVijay Mahadevan       vent = dmmoab->mbiface->id_from_handle(*iter) - dmmoab->seqstart;
1109f6829af0SVijay Mahadevan       dmmoab->gidmap[vent] = dmmoab->gsindices[i];
1110f6829af0SVijay Mahadevan       dmmoab->lidmap[vent] = i;
1111f6829af0SVijay Mahadevan       for (f = 0; f < dmmoab->numFields; f++, j++) {
11123f1c6e43SVijay Mahadevan         lgmap[j] = (bs > 1 ? dmmoab->gsindices[i] * dmmoab->numFields + f : totsize * f + dmmoab->gsindices[i]);
1113f6829af0SVijay Mahadevan       }
1114f6829af0SVijay Mahadevan     }
1115f6829af0SVijay Mahadevan 
1116f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1117f6829af0SVijay Mahadevan        1) First create a local and global vector
1118f6829af0SVijay Mahadevan        2) Create a local and global IS
1119f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1120f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1121f6829af0SVijay Mahadevan     */
1122f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
1123f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
1124f6829af0SVijay Mahadevan 
1125f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
1126f6829af0SVijay Mahadevan 
1127f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
1128f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, dmmoab->vstart, 1, &from);CHKERRQ(ierr);
1129f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from, bs);CHKERRQ(ierr);
1130f6829af0SVijay Mahadevan 
11313f1c6e43SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm, dmmoab->nloc * dmmoab->numFields, &lgmap[0], PETSC_COPY_VALUES, &to);CHKERRQ(ierr);
1132f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to, bs);CHKERRQ(ierr);
1133f6829af0SVijay Mahadevan 
1134f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1135f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11363f1c6e43SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm, dmmoab->bs, totsize * dmmoab->numFields, lgmap,
1137f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES, &dmmoab->ltog_map);CHKERRQ(ierr);
1138f6829af0SVijay Mahadevan     }
1139f6829af0SVijay Mahadevan 
1140f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
11419448b7f1SJunchao Zhang     ierr = VecScatterCreate(local, from, global, to, &dmmoab->ltog_sendrecv);CHKERRQ(ierr);
1142f6829af0SVijay Mahadevan 
1143f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11443f1c6e43SVijay Mahadevan     ierr = PetscFree(lgmap);CHKERRQ(ierr);
1145f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1146f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1147f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1148f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1149f6829af0SVijay Mahadevan   }
1150f6829af0SVijay Mahadevan 
115149d66b22SVijay Mahadevan   dmmoab->bndyvtx = new moab::Range();
115249d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
115349d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1154f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
11559c368985SVijay Mahadevan   if (!dmmoab->hlevel) {
1156f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1157f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1158f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1159f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1160f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1161f6829af0SVijay Mahadevan 
1162f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
11632417220eSVijay 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
1164f6829af0SVijay Mahadevan 
11659daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1166f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1167f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
11682417220eSVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_INTERFACE, PSTATUS_NOT); MBERRNM(merr);
11699daf19fdSVijay Mahadevan #endif
1170f6829af0SVijay Mahadevan 
1171f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1172f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false); MBERRNM(ierr);
1173755f3dfbSVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION); MBERRNM(ierr);
1174f6829af0SVijay Mahadevan   }
11759c368985SVijay Mahadevan   else {
11769c368985SVijay Mahadevan     /* Let us query the hierarchy manager and get the results directly for this level */
11779c368985SVijay Mahadevan     for (moab::Range::iterator iter = dmmoab->elocal->begin(); iter != dmmoab->elocal->end(); iter++) {
11789c368985SVijay Mahadevan       moab::EntityHandle elemHandle = *iter;
11799c368985SVijay Mahadevan       if (dmmoab->hierarchy->is_entity_on_boundary(elemHandle)) {
11809c368985SVijay Mahadevan         dmmoab->bndyelems->insert(elemHandle);
11819c368985SVijay Mahadevan         /* For this boundary element, query the vertices and add them to the list */
11829c368985SVijay Mahadevan         std::vector<moab::EntityHandle> connect;
11839c368985SVijay Mahadevan         merr = dmmoab->hierarchy->get_connectivity(elemHandle, dmmoab->hlevel, connect); MBERRNM(ierr);
11849c368985SVijay Mahadevan         for (unsigned iv=0; iv < connect.size(); ++iv)
11859c368985SVijay Mahadevan           if (dmmoab->hierarchy->is_entity_on_boundary(connect[iv]))
11869c368985SVijay Mahadevan             dmmoab->bndyvtx->insert(connect[iv]);
11879c368985SVijay Mahadevan         /* Next, let us query the boundary faces and add them also to the list */
11889c368985SVijay Mahadevan         std::vector<moab::EntityHandle> faces;
11899c368985SVijay Mahadevan         merr = dmmoab->hierarchy->get_adjacencies(elemHandle, dmmoab->dim-1, faces); MBERRNM(ierr);
11909c368985SVijay Mahadevan         for (unsigned ifa=0; ifa < faces.size(); ++ifa)
11919c368985SVijay Mahadevan           if (dmmoab->hierarchy->is_entity_on_boundary(faces[ifa]))
11929c368985SVijay Mahadevan             dmmoab->bndyfaces->insert(faces[ifa]);
11939c368985SVijay Mahadevan       }
11949c368985SVijay Mahadevan     }
11959c368985SVijay Mahadevan #ifdef MOAB_HAVE_MPI
11969c368985SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
11979c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyvtx,   PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
11989c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
11999c368985SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
12009c368985SVijay Mahadevan #endif
12019c368985SVijay Mahadevan 
12029c368985SVijay Mahadevan   }
120349d66b22SVijay Mahadevan   PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size());
1204a044f6b6SVijay Mahadevan 
1205a044f6b6SVijay Mahadevan   /* Get the material sets and populate the data for all locally owned elements */
1206a044f6b6SVijay Mahadevan   {
1207a044f6b6SVijay Mahadevan     ierr = PetscCalloc1(dmmoab->elocal->size(), &dmmoab->materials);CHKERRQ(ierr);
1208a044f6b6SVijay Mahadevan     /* Get the count of entities of particular type from dmmoab->elocal
1209a044f6b6SVijay Mahadevan        -- Then, for each non-zero type, loop through and query the fileset to get the material tag data */
1210a044f6b6SVijay Mahadevan     moab::Range msets;
1211a044f6b6SVijay 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);
1212a044f6b6SVijay Mahadevan     if (msets.size() == 0) {
1213a044f6b6SVijay Mahadevan       PetscInfo(NULL, "No material sets found in the fileset.");
1214a044f6b6SVijay Mahadevan     }
1215a044f6b6SVijay Mahadevan 
1216a044f6b6SVijay Mahadevan     for (unsigned i=0; i < msets.size(); ++i) {
1217a044f6b6SVijay Mahadevan       moab::Range msetelems;
1218a044f6b6SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(msets[i], dmmoab->dim, msetelems, true);MB_CHK_ERR(merr);
1219aedf4482SVijay Mahadevan #ifdef MOAB_HAVE_MPI
1220aedf4482SVijay Mahadevan       /* filter all the non-owned and shared entities out of the list */
1221aedf4482SVijay Mahadevan       merr = dmmoab->pcomm->filter_pstatus(msetelems, PSTATUS_NOT_OWNED, PSTATUS_NOT); MBERRNM(merr);
1222aedf4482SVijay Mahadevan #endif
1223a044f6b6SVijay Mahadevan 
1224a044f6b6SVijay Mahadevan       int partID;
1225a044f6b6SVijay Mahadevan       moab::EntityHandle mset=msets[i];
1226a044f6b6SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &mset, 1, &partID);MB_CHK_ERR(merr);
1227a044f6b6SVijay Mahadevan 
1228a044f6b6SVijay Mahadevan       for (unsigned j=0; j < msetelems.size(); ++j)
1229a044f6b6SVijay Mahadevan         dmmoab->materials[dmmoab->elocal->index(msetelems[j])]=partID;
1230a044f6b6SVijay Mahadevan     }
1231a044f6b6SVijay Mahadevan   }
1232a044f6b6SVijay Mahadevan 
1233f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1234f6829af0SVijay Mahadevan }
1235f6829af0SVijay Mahadevan 
1236cab5ea25SPierre Jolivet /*@C
1237304006b3SVijay Mahadevan   DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM.
1238304006b3SVijay Mahadevan 
1239d083f849SBarry Smith   Collective
1240304006b3SVijay Mahadevan 
1241304006b3SVijay Mahadevan   Input Parameters:
1242304006b3SVijay Mahadevan + dm - The DM object
1243304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1244304006b3SVijay Mahadevan . conn - The connectivity of the element
1245a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1246304006b3SVijay Mahadevan 
1247304006b3SVijay Mahadevan   Output Parameter:
1248304006b3SVijay Mahadevan . overts  - The list of vertices that were created (can be NULL)
1249304006b3SVijay Mahadevan 
1250304006b3SVijay Mahadevan   Level: beginner
1251304006b3SVijay Mahadevan 
1252304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateElement()
1253304006b3SVijay Mahadevan @*/
1254304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal* coords, PetscInt nverts, moab::Range* overts)
1255304006b3SVijay Mahadevan {
1256304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1257304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1258304006b3SVijay Mahadevan   moab::Range         verts;
1259304006b3SVijay Mahadevan 
1260304006b3SVijay Mahadevan   PetscFunctionBegin;
1261304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1262304006b3SVijay Mahadevan   PetscValidPointer(coords, 2);
1263304006b3SVijay Mahadevan 
1264304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1265304006b3SVijay Mahadevan 
1266304006b3SVijay Mahadevan   /* Insert new points */
1267304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_vertices(&coords[0], nverts, verts); MBERRNM(merr);
1268304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, verts); MBERRNM(merr);
1269304006b3SVijay Mahadevan 
1270304006b3SVijay Mahadevan   if (overts) *overts = verts;
1271304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1272304006b3SVijay Mahadevan }
1273304006b3SVijay Mahadevan 
1274cab5ea25SPierre Jolivet /*@C
1275304006b3SVijay Mahadevan   DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM.
1276304006b3SVijay Mahadevan 
1277d083f849SBarry Smith   Collective
1278304006b3SVijay Mahadevan 
1279304006b3SVijay Mahadevan   Input Parameters:
1280304006b3SVijay Mahadevan + dm - The DM object
1281304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1282304006b3SVijay Mahadevan . conn - The connectivity of the element
1283a2b725a8SWilliam Gropp - nverts - The number of vertices that form the element
1284304006b3SVijay Mahadevan 
1285304006b3SVijay Mahadevan   Output Parameter:
1286304006b3SVijay Mahadevan . oelem  - The handle to the element created and added to the DM object
1287304006b3SVijay Mahadevan 
1288304006b3SVijay Mahadevan   Level: beginner
1289304006b3SVijay Mahadevan 
1290304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateVertices()
1291304006b3SVijay Mahadevan @*/
1292304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle* conn, PetscInt nverts, moab::EntityHandle* oelem)
1293304006b3SVijay Mahadevan {
1294304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1295304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1296304006b3SVijay Mahadevan   moab::EntityHandle  elem;
1297304006b3SVijay Mahadevan 
1298304006b3SVijay Mahadevan   PetscFunctionBegin;
1299304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1300304006b3SVijay Mahadevan   PetscValidPointer(conn, 3);
1301304006b3SVijay Mahadevan 
1302304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1303304006b3SVijay Mahadevan 
1304304006b3SVijay Mahadevan   /* Insert new element */
1305304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_element(type, conn, nverts, elem); MBERRNM(merr);
1306304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset, &elem, 1); MBERRNM(merr);
1307304006b3SVijay Mahadevan 
1308304006b3SVijay Mahadevan   if (oelem) *oelem = elem;
1309304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1310304006b3SVijay Mahadevan }
1311304006b3SVijay Mahadevan 
1312cab5ea25SPierre Jolivet /*@C
1313304006b3SVijay Mahadevan   DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent
1314304006b3SVijay Mahadevan   in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to
1315304006b3SVijay Mahadevan   create a DM object on a refined level.
1316304006b3SVijay Mahadevan 
1317d083f849SBarry Smith   Collective
1318304006b3SVijay Mahadevan 
1319304006b3SVijay Mahadevan   Input Parameters:
1320a2b725a8SWilliam Gropp . dm - The DM object
1321304006b3SVijay Mahadevan 
1322304006b3SVijay Mahadevan   Output Parameter:
1323304006b3SVijay Mahadevan . newdm  - The sub DM object with updated set information
1324304006b3SVijay Mahadevan 
1325304006b3SVijay Mahadevan   Level: advanced
1326304006b3SVijay Mahadevan 
1327304006b3SVijay Mahadevan .seealso: DMCreate(), DMMoabCreateVertices(), DMMoabCreateElement()
1328304006b3SVijay Mahadevan @*/
1329304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm)
1330304006b3SVijay Mahadevan {
1331304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1332304006b3SVijay Mahadevan   DM_Moab            *ndmmoab;
1333304006b3SVijay Mahadevan   moab::ErrorCode    merr;
1334304006b3SVijay Mahadevan   PetscErrorCode     ierr;
1335304006b3SVijay Mahadevan 
1336304006b3SVijay Mahadevan   PetscFunctionBegin;
1337304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1338304006b3SVijay Mahadevan 
1339304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1340304006b3SVijay Mahadevan 
1341304006b3SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
13429daf19fdSVijay Mahadevan   ierr = DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, PETSC_NULL, newdm);CHKERRQ(ierr);
1343304006b3SVijay Mahadevan 
1344304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1345304006b3SVijay Mahadevan   ndmmoab = (DM_Moab*) (*newdm)->data;
1346304006b3SVijay Mahadevan 
1347304006b3SVijay Mahadevan   /* set the sub-mesh's parent DM reference */
1348304006b3SVijay Mahadevan   ndmmoab->parent = &dm;
1349304006b3SVijay Mahadevan 
1350304006b3SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
1351304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset); MBERR("Creating file set failed", merr);
1352304006b3SVijay Mahadevan 
1353304006b3SVijay Mahadevan   /* create a meshset and then add old fileset as child */
1354304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal); MBERR("Adding child vertices to parent failed", merr);
1355304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal); MBERR("Adding child elements to parent failed", merr);
1356304006b3SVijay Mahadevan 
1357304006b3SVijay Mahadevan   /* preserve the field association between the parent and sub-mesh objects */
1358304006b3SVijay Mahadevan   ierr = DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames);CHKERRQ(ierr);
1359304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1360304006b3SVijay Mahadevan }
1361304006b3SVijay Mahadevan 
1362304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer)
1363304006b3SVijay Mahadevan {
1364304006b3SVijay Mahadevan   DM_Moab          *dmmoab = (DM_Moab*)(dm)->data;
1365304006b3SVijay Mahadevan   const char       *name;
1366304006b3SVijay Mahadevan   MPI_Comm          comm;
1367304006b3SVijay Mahadevan   PetscMPIInt       size;
1368304006b3SVijay Mahadevan   PetscErrorCode    ierr;
1369304006b3SVijay Mahadevan 
1370304006b3SVijay Mahadevan   PetscFunctionBegin;
1371304006b3SVijay Mahadevan   ierr = PetscObjectGetComm((PetscObject)dm, &comm);CHKERRQ(ierr);
1372ffc4695bSBarry Smith   ierr = MPI_Comm_size(comm, &size);CHKERRMPI(ierr);
1373304006b3SVijay Mahadevan   ierr = PetscObjectGetName((PetscObject) dm, &name);CHKERRQ(ierr);
1374304006b3SVijay Mahadevan   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1375304006b3SVijay Mahadevan   if (name) {ierr = PetscViewerASCIIPrintf(viewer, "%s in %D dimensions:\n", name, dmmoab->dim);CHKERRQ(ierr);}
1376304006b3SVijay Mahadevan   else      {ierr = PetscViewerASCIIPrintf(viewer, "Mesh in %D dimensions:\n", dmmoab->dim);CHKERRQ(ierr);}
1377304006b3SVijay Mahadevan   /* print details about the global mesh */
1378304006b3SVijay Mahadevan   {
1379304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
13809c368985SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Sizes: cells=%D, vertices=%D, blocks=%D\n", dmmoab->nele, dmmoab->n, dmmoab->bs);CHKERRQ(ierr);
1381304006b3SVijay Mahadevan     /* print boundary data */
1382304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Boundary trace:\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr);
1383304006b3SVijay Mahadevan     {
1384304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1385304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPrintf(viewer, "cells=%D, faces=%D, vertices=%D\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr);
1386304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1387304006b3SVijay Mahadevan     }
1388304006b3SVijay Mahadevan     /* print field data */
1389304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Fields: %D components\n", dmmoab->numFields);CHKERRQ(ierr);
1390304006b3SVijay Mahadevan     {
1391304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1392304006b3SVijay Mahadevan       for (int i = 0; i < dmmoab->numFields; ++i) {
1393304006b3SVijay Mahadevan         ierr = PetscViewerASCIIPrintf(viewer, "[%D] - %s\n", i, dmmoab->fieldNames[i]);CHKERRQ(ierr);
1394304006b3SVijay Mahadevan       }
1395304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1396304006b3SVijay Mahadevan     }
1397304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1398304006b3SVijay Mahadevan   }
1399304006b3SVijay Mahadevan   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1400304006b3SVijay Mahadevan   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
1401304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1402304006b3SVijay Mahadevan }
1403304006b3SVijay Mahadevan 
1404304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm, PetscViewer v)
1405304006b3SVijay Mahadevan {
1406304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1407304006b3SVijay Mahadevan }
1408304006b3SVijay Mahadevan 
1409304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm, PetscViewer v)
1410304006b3SVijay Mahadevan {
1411304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1412304006b3SVijay Mahadevan }
1413304006b3SVijay Mahadevan 
1414304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm, PetscViewer viewer)
1415304006b3SVijay Mahadevan {
1416304006b3SVijay Mahadevan   PetscBool      iascii, ishdf5, isvtk;
1417304006b3SVijay Mahadevan   PetscErrorCode ierr;
1418304006b3SVijay Mahadevan 
1419304006b3SVijay Mahadevan   PetscFunctionBegin;
1420304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1421304006b3SVijay Mahadevan   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
1422304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr);
1423304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERVTK,   &isvtk);CHKERRQ(ierr);
1424304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERHDF5,  &ishdf5);CHKERRQ(ierr);
1425304006b3SVijay Mahadevan   if (iascii) {
1426304006b3SVijay Mahadevan     ierr = DMMoabView_Ascii(dm, viewer);CHKERRQ(ierr);
1427304006b3SVijay Mahadevan   } else if (ishdf5) {
1428304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5)
1429304006b3SVijay Mahadevan     ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ);CHKERRQ(ierr);
1430304006b3SVijay Mahadevan     ierr = DMMoabView_HDF5(dm, viewer);CHKERRQ(ierr);
1431304006b3SVijay Mahadevan     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
1432304006b3SVijay Mahadevan #else
1433304006b3SVijay Mahadevan     SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1434304006b3SVijay Mahadevan #endif
1435304006b3SVijay Mahadevan   }
1436304006b3SVijay Mahadevan   else if (isvtk) {
1437304006b3SVijay Mahadevan     ierr = DMMoabView_VTK(dm, viewer);CHKERRQ(ierr);
1438304006b3SVijay Mahadevan   }
1439304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1440304006b3SVijay Mahadevan }
1441304006b3SVijay Mahadevan 
1442304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm)
1443304006b3SVijay Mahadevan {
1444304006b3SVijay Mahadevan   PetscFunctionBegin;
1445304006b3SVijay Mahadevan   dm->ops->view                            = DMView_Moab;
1446304006b3SVijay Mahadevan   dm->ops->load                            = NULL /* DMLoad_Moab */;
1447304006b3SVijay Mahadevan   dm->ops->setfromoptions                  = DMSetFromOptions_Moab;
1448304006b3SVijay Mahadevan   dm->ops->clone                           = DMClone_Moab;
1449304006b3SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
14501bb6d2a8SBarry Smith   dm->ops->createlocalsection            = NULL;
1451304006b3SVijay Mahadevan   dm->ops->createdefaultconstraints        = NULL;
1452304006b3SVijay Mahadevan   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
1453304006b3SVijay Mahadevan   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
1454304006b3SVijay Mahadevan   dm->ops->getlocaltoglobalmapping         = NULL;
1455304006b3SVijay Mahadevan   dm->ops->createfieldis                   = NULL;
1456304006b3SVijay Mahadevan   dm->ops->createcoordinatedm              = NULL /* DMCreateCoordinateDM_Moab */;
1457304006b3SVijay Mahadevan   dm->ops->getcoloring                     = NULL;
1458304006b3SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
1459304006b3SVijay Mahadevan   dm->ops->createinterpolation             = DMCreateInterpolation_Moab;
14605a84ad33SLisandro Dalcin   dm->ops->createinjection                 = NULL /* DMCreateInjection_Moab */;
1461304006b3SVijay Mahadevan   dm->ops->refine                          = DMRefine_Moab;
1462304006b3SVijay Mahadevan   dm->ops->coarsen                         = DMCoarsen_Moab;
1463304006b3SVijay Mahadevan   dm->ops->refinehierarchy                 = DMRefineHierarchy_Moab;
1464304006b3SVijay Mahadevan   dm->ops->coarsenhierarchy                = DMCoarsenHierarchy_Moab;
1465304006b3SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
1466304006b3SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
1467304006b3SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
1468304006b3SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
1469304006b3SVijay Mahadevan   dm->ops->destroy                         = DMDestroy_Moab;
1470304006b3SVijay Mahadevan   dm->ops->createsubdm                     = NULL /* DMCreateSubDM_Moab */;
1471304006b3SVijay Mahadevan   dm->ops->getdimpoints                    = NULL /* DMGetDimPoints_Moab */;
1472304006b3SVijay Mahadevan   dm->ops->locatepoints                    = NULL /* DMLocatePoints_Moab */;
1473304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1474304006b3SVijay Mahadevan }
1475304006b3SVijay Mahadevan 
1476304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm)
1477304006b3SVijay Mahadevan {
1478304006b3SVijay Mahadevan   PetscErrorCode     ierr;
1479304006b3SVijay Mahadevan 
1480304006b3SVijay Mahadevan   PetscFunctionBegin;
1481304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1482304006b3SVijay Mahadevan   (*newdm)->data = (DM_Moab*) dm->data;
1483304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct++;
1484304006b3SVijay Mahadevan 
1485d57f96a3SLisandro Dalcin   ierr = PetscObjectChangeTypeName((PetscObject) *newdm, DMMOAB);CHKERRQ(ierr);
1486304006b3SVijay Mahadevan   ierr = DMInitialize_Moab(*newdm);CHKERRQ(ierr);
1487304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1488304006b3SVijay Mahadevan }
1489304006b3SVijay Mahadevan 
1490f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1491f6829af0SVijay Mahadevan {
1492f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1493f6829af0SVijay Mahadevan 
1494f6829af0SVijay Mahadevan   PetscFunctionBegin;
1495f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1496f90c3b0eSVijay Mahadevan   ierr = PetscNewLog(dm, (DM_Moab**)&dm->data);CHKERRQ(ierr);
1497f6829af0SVijay Mahadevan 
1498f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1499f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1500f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1501f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1502f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1503f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1504f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1505f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1506c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_map = NULL;
1507c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_sendrecv = NULL;
1508f6829af0SVijay Mahadevan 
1509304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct = 1;
1510304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->parent = NULL;
1511f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1512f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1513f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1514f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1515f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1516f6829af0SVijay Mahadevan 
1517304006b3SVijay Mahadevan   ierr = DMInitialize_Moab(dm);CHKERRQ(ierr);
1518f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1519f6829af0SVijay Mahadevan }
1520f6829af0SVijay Mahadevan 
1521