xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 9daf19fd0d22011a060902ed53673b48ac0c4e7d)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
21d72bce8STim Tautges 
31d72bce8STim Tautges #include <petscdmmoab.h>
488face26SJed Brown #include <MBTagConventions.hpp>
5*9daf19fdSVijay Mahadevan #include <moab/NestedRefine.hpp>
61cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
7032b8ab6SVijay Mahadevan 
8c6ef30f9SVijay Mahadevan /*MC
9c6ef30f9SVijay Mahadevan   DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database.
10c6ef30f9SVijay Mahadevan                     Direct access to the MOAB Interface and other mesh manipulation related objects are available
11c6ef30f9SVijay Mahadevan                     through public API. Ability to create global and local representation of Vecs containing all
12c6ef30f9SVijay Mahadevan                     unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided
13c6ef30f9SVijay Mahadevan                     along with utility functions to traverse the mesh and assemble a discrete system via
14c6ef30f9SVijay Mahadevan                     field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are
15c6ef30f9SVijay Mahadevan                     available.
16c6ef30f9SVijay Mahadevan 
17c6ef30f9SVijay Mahadevan   Reference: http://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html
18c6ef30f9SVijay Mahadevan 
19c6ef30f9SVijay Mahadevan   Level: intermediate
20c6ef30f9SVijay Mahadevan 
21c6ef30f9SVijay Mahadevan .seealso: DMType, DMMoabCreate(), DMCreate(), DMSetType(), DMMoabCreateMoab()
22c6ef30f9SVijay Mahadevan M*/
23c6ef30f9SVijay Mahadevan 
24304006b3SVijay Mahadevan /* External function declarations here */
25304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling);
26304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm);
27304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm,  Mat *J);
28304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm);
29304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined);
30304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened);
31304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]);
32304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm,PetscInt nlevels,DM dmCoarsened[]);
33304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm);
34304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM,Vec *);
35304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM,Vec *);
36304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm,Mat *J);
37304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM,Vec,InsertMode,Vec);
38304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM,Vec,InsertMode,Vec);
39304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM,Vec,InsertMode,Vec);
40304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM,Vec,InsertMode,Vec);
41304006b3SVijay Mahadevan 
42304006b3SVijay Mahadevan 
43304006b3SVijay Mahadevan /* Un-implemented routines */
44304006b3SVijay Mahadevan /*
45304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultSection_Moab(DM dm);
46304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat);
47304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer);
48304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd);
49304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm);
50304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS);
51304006b3SVijay Mahadevan */
52c6ef30f9SVijay Mahadevan 
531d72bce8STim Tautges /*@
541d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
551d72bce8STim Tautges 
561d72bce8STim Tautges   Collective on MPI_Comm
571d72bce8STim Tautges 
581d72bce8STim Tautges   Input Parameter:
591d72bce8STim Tautges . comm - The communicator for the DMMoab object
601d72bce8STim Tautges 
611d72bce8STim Tautges   Output Parameter:
62032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
631d72bce8STim Tautges 
641d72bce8STim Tautges   Level: beginner
651d72bce8STim Tautges 
661d72bce8STim Tautges .keywords: DMMoab, create
671d72bce8STim Tautges @*/
68032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
691d72bce8STim Tautges {
701d72bce8STim Tautges   PetscErrorCode ierr;
711d72bce8STim Tautges 
721d72bce8STim Tautges   PetscFunctionBegin;
73032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
74032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
75032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
761d72bce8STim Tautges   PetscFunctionReturn(0);
771d72bce8STim Tautges }
781d72bce8STim Tautges 
791d72bce8STim Tautges /*@
80b117cd09SVijay Mahadevan   DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data
811d72bce8STim Tautges 
821d72bce8STim Tautges   Collective on MPI_Comm
831d72bce8STim Tautges 
841d72bce8STim Tautges   Input Parameter:
851d72bce8STim Tautges . comm - The communicator for the DMMoab object
86032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
87a4d2169cSTim Tautges          along with the DMMoab
88a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
891d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
901d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
911d72bce8STim Tautges 
921d72bce8STim Tautges   Output Parameter:
93032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
941d72bce8STim Tautges 
95032b8ab6SVijay Mahadevan   Level: intermediate
961d72bce8STim Tautges 
971d72bce8STim Tautges .keywords: DMMoab, create
981d72bce8STim Tautges @*/
99*9daf19fdSVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
1001d72bce8STim Tautges {
1011d72bce8STim Tautges   PetscErrorCode ierr;
102032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
10385d305f5SVijay Mahadevan   DM             dmmb;
104853cdec3SJed Brown   DM_Moab        *dmmoab;
1051d72bce8STim Tautges 
1061d72bce8STim Tautges   PetscFunctionBegin;
107032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
10885d305f5SVijay Mahadevan 
10985d305f5SVijay Mahadevan   ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr);
11085d305f5SVijay Mahadevan   dmmoab = (DM_Moab*)(dmmb)->data;
111a4d2169cSTim Tautges 
112a4d2169cSTim Tautges   if (!mbiface) {
11372ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
1147d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1151d72bce8STim Tautges   }
1161cec0304SVijay Mahadevan   else {
1171cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
1187d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1191cec0304SVijay Mahadevan   }
1201cec0304SVijay Mahadevan 
121b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
122b5410836SVijay Mahadevan   dmmoab->fileset=0;
123b117cd09SVijay Mahadevan   dmmoab->hlevel=0;
12449d66b22SVijay Mahadevan   dmmoab->nghostrings=0;
1257d89fc02STim Tautges 
126*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
127*9daf19fdSVijay Mahadevan   moab::EntityHandle partnset;
128*9daf19fdSVijay Mahadevan   PetscInt rank, nprocs;
129032b8ab6SVijay Mahadevan   ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
130032b8ab6SVijay Mahadevan   ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
131032b8ab6SVijay Mahadevan 
132db66d124SVijay Mahadevan   /* Create root sets for each mesh.  Then pass these
133db66d124SVijay Mahadevan       to the load_file functions to be populated. */
1340c8a2322SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
135032b8ab6SVijay Mahadevan 
136db66d124SVijay Mahadevan   /* Create the parallel communicator object with the partition handle associated with MOAB */
13772ff976dSVijay Mahadevan   dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
138*9daf19fdSVijay Mahadevan #endif
139032b8ab6SVijay Mahadevan 
1404973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1414973de03SVijay Mahadevan   dmmoab->bs = 1;
142addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1433f1c6e43SVijay Mahadevan   ierr = PetscMalloc(dmmoab->numFields*sizeof(char*),&dmmoab->fieldNames);CHKERRQ(ierr);
1443f1c6e43SVijay Mahadevan   ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr);
1452e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
1462e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
1472e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
1482e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1492e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
1502e4e7c01SVijay Mahadevan   dmmoab->write_mode = WRITE_PART;
1514973de03SVijay Mahadevan 
1524973de03SVijay Mahadevan   /* set global ID tag handle */
1531a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
15485d305f5SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr);
155032b8ab6SVijay Mahadevan   }
156032b8ab6SVijay Mahadevan   else {
1571a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1581a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
159a4d2169cSTim Tautges   }
160a4d2169cSTim Tautges 
161340f3b9aSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr);
162340f3b9aSVijay Mahadevan 
1634973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
164a4d2169cSTim Tautges   if (range) {
16585d305f5SVijay Mahadevan     ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr);
166a4d2169cSTim Tautges   }
16785d305f5SVijay Mahadevan   *dmb=dmmb;
1681d72bce8STim Tautges   PetscFunctionReturn(0);
1691d72bce8STim Tautges }
1701d72bce8STim Tautges 
171304006b3SVijay Mahadevan 
172*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1731d72bce8STim Tautges 
174aa768e4cSTim Tautges /*@
175aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
176aa768e4cSTim Tautges 
177aa768e4cSTim Tautges   Collective on MPI_Comm
178aa768e4cSTim Tautges 
179aa768e4cSTim Tautges   Input Parameter:
180aa768e4cSTim Tautges . dm    - The DMMoab object being set
181aa768e4cSTim Tautges 
182aa768e4cSTim Tautges   Output Parameter:
183aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
184aa768e4cSTim Tautges 
185aa768e4cSTim Tautges   Level: beginner
186aa768e4cSTim Tautges 
187aa768e4cSTim Tautges .keywords: DMMoab, create
188aa768e4cSTim Tautges @*/
1891d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
1901d72bce8STim Tautges {
1911d72bce8STim Tautges   PetscFunctionBegin;
1921d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
193032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1941d72bce8STim Tautges   PetscFunctionReturn(0);
1951d72bce8STim Tautges }
1961d72bce8STim Tautges 
197*9daf19fdSVijay Mahadevan #endif /* MOAB_HAVE_MPI */
198*9daf19fdSVijay Mahadevan 
1991d72bce8STim Tautges 
200aa768e4cSTim Tautges /*@
201aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
202aa768e4cSTim Tautges 
203aa768e4cSTim Tautges   Collective on MPI_Comm
204aa768e4cSTim Tautges 
205aa768e4cSTim Tautges   Input Parameter:
206aa768e4cSTim Tautges . dm      - The DMMoab object being set
207aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
208aa768e4cSTim Tautges 
209aa768e4cSTim Tautges   Level: beginner
210aa768e4cSTim Tautges 
211aa768e4cSTim Tautges .keywords: DMMoab, create
212aa768e4cSTim Tautges @*/
213a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
2141d72bce8STim Tautges {
215032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
216032b8ab6SVijay Mahadevan 
2171d72bce8STim Tautges   PetscFunctionBegin;
2181d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2191cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
220*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
221032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
222*9daf19fdSVijay Mahadevan #endif
223032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
224032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2251d72bce8STim Tautges   PetscFunctionReturn(0);
2261d72bce8STim Tautges }
2271d72bce8STim Tautges 
2281d72bce8STim Tautges 
229aa768e4cSTim Tautges /*@
230aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
231aa768e4cSTim Tautges 
232aa768e4cSTim Tautges   Collective on MPI_Comm
233aa768e4cSTim Tautges 
234aa768e4cSTim Tautges   Input Parameter:
235aa768e4cSTim Tautges . dm      - The DMMoab object being set
236aa768e4cSTim Tautges 
237aa768e4cSTim Tautges   Output Parameter:
238aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
239aa768e4cSTim Tautges 
240aa768e4cSTim Tautges   Level: beginner
241aa768e4cSTim Tautges 
242aa768e4cSTim Tautges .keywords: DMMoab, create
243aa768e4cSTim Tautges @*/
244a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
2451d72bce8STim Tautges {
2469426e041SSatish Balay   PetscErrorCode   ierr;
247cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
248cabb514dSBarry Smith 
2491d72bce8STim Tautges   PetscFunctionBegin;
2501d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
251cabb514dSBarry Smith   ierr = PetscCitationsRegister("@techreport{tautges_moab:_2004,\n  type = {{SAND2004-1592}},\n  title = {{MOAB:} A Mesh-Oriented Database},  institution = {Sandia National Laboratories},\n  author = {Tautges, T. J. and Meyers, R. and Merkley, K. and Stimpson, C. and Ernst, C.},\n  year = {2004},  note = {Report}\n}\n",&cite);CHKERRQ(ierr);
252a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2531d72bce8STim Tautges   PetscFunctionReturn(0);
2541d72bce8STim Tautges }
2551d72bce8STim Tautges 
2561d72bce8STim Tautges 
257aa768e4cSTim Tautges /*@
2585eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
259aa768e4cSTim Tautges 
260aa768e4cSTim Tautges   Collective on MPI_Comm
261aa768e4cSTim Tautges 
262aa768e4cSTim Tautges   Input Parameter:
263aa768e4cSTim Tautges . dm    - The DMMoab object being set
264aa768e4cSTim Tautges . range - The entities treated by this DMMoab
265aa768e4cSTim Tautges 
266aa768e4cSTim Tautges   Level: beginner
267aa768e4cSTim Tautges 
268aa768e4cSTim Tautges .keywords: DMMoab, create
269aa768e4cSTim Tautges @*/
2705eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
2711d72bce8STim Tautges {
272fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
273032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
274032b8ab6SVijay Mahadevan 
2751d72bce8STim Tautges   PetscFunctionBegin;
2761d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
277032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
278032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
279fd3326ddSVijay Mahadevan 
280032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
281fd3326ddSVijay Mahadevan 
282*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
283*9daf19fdSVijay Mahadevan   moab::ErrorCode merr;
284fd3326ddSVijay Mahadevan   /* filter based on parallel status */
285fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
286fd3326ddSVijay Mahadevan 
287fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
288fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
289fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
290fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
291fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
292*9daf19fdSVijay Mahadevan #else
293*9daf19fdSVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
294*9daf19fdSVijay Mahadevan #endif
295fd3326ddSVijay Mahadevan 
296fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
297032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
298032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
299*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
300*9daf19fdSVijay Mahadevan   PetscErrorCode  ierr;
301b2566f29SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
302*9daf19fdSVijay Mahadevan #else
303*9daf19fdSVijay Mahadevan   dmmoab->n=dmmoab->nloc;
304*9daf19fdSVijay Mahadevan #endif
3051d72bce8STim Tautges   PetscFunctionReturn(0);
3061d72bce8STim Tautges }
3071d72bce8STim Tautges 
3081d72bce8STim Tautges 
3098d8d51c8SVijay Mahadevan /*@
3108d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
3118d8d51c8SVijay Mahadevan 
3128d8d51c8SVijay Mahadevan   Collective on MPI_Comm
3138d8d51c8SVijay Mahadevan 
3148d8d51c8SVijay Mahadevan   Input Parameter:
3158d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3168d8d51c8SVijay Mahadevan 
3178d8d51c8SVijay Mahadevan   Output Parameter:
3188d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3198d8d51c8SVijay Mahadevan 
3208d8d51c8SVijay Mahadevan   Level: beginner
3218d8d51c8SVijay Mahadevan 
3228d8d51c8SVijay Mahadevan .keywords: DMMoab, create
3238d8d51c8SVijay Mahadevan @*/
3248d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
3258d8d51c8SVijay Mahadevan {
3268d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3278d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3288d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3298d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3308d8d51c8SVijay Mahadevan }
3318d8d51c8SVijay Mahadevan 
3328d8d51c8SVijay Mahadevan 
3338d8d51c8SVijay Mahadevan 
334aa768e4cSTim Tautges /*@
3355eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
336aa768e4cSTim Tautges 
337aa768e4cSTim Tautges   Collective on MPI_Comm
338aa768e4cSTim Tautges 
339aa768e4cSTim Tautges   Input Parameter:
340aa768e4cSTim Tautges . dm    - The DMMoab object being set
341aa768e4cSTim Tautges 
342aa768e4cSTim Tautges   Output Parameter:
3435eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
3445eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
345aa768e4cSTim Tautges 
346aa768e4cSTim Tautges   Level: beginner
347aa768e4cSTim Tautges 
348aa768e4cSTim Tautges .keywords: DMMoab, create
349aa768e4cSTim Tautges @*/
350351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost)
3511d72bce8STim Tautges {
3521d72bce8STim Tautges   PetscFunctionBegin;
3531d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
354351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
355351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3561d72bce8STim Tautges   PetscFunctionReturn(0);
3571d72bce8STim Tautges }
3581d72bce8STim Tautges 
3595eb88e9dSVijay Mahadevan /*@
3605eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3615eb88e9dSVijay Mahadevan 
3625eb88e9dSVijay Mahadevan   Collective on MPI_Comm
3635eb88e9dSVijay Mahadevan 
3645eb88e9dSVijay Mahadevan   Input Parameter:
3655eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3665eb88e9dSVijay Mahadevan 
3675eb88e9dSVijay Mahadevan   Output Parameter:
3685eb88e9dSVijay Mahadevan . range - The entities owned locally
3695eb88e9dSVijay Mahadevan 
3705eb88e9dSVijay Mahadevan   Level: beginner
3715eb88e9dSVijay Mahadevan 
3725eb88e9dSVijay Mahadevan .keywords: DMMoab, create
3735eb88e9dSVijay Mahadevan @*/
374351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range)
3755eb88e9dSVijay Mahadevan {
3765eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3775eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
378351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3791cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3801cec0304SVijay Mahadevan }
3811cec0304SVijay Mahadevan 
3821cec0304SVijay Mahadevan 
3831cec0304SVijay Mahadevan /*@
3841cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3851cec0304SVijay Mahadevan 
3861cec0304SVijay Mahadevan   Collective on MPI_Comm
3871cec0304SVijay Mahadevan 
3881cec0304SVijay Mahadevan   Input Parameter:
3891cec0304SVijay Mahadevan . dm    - The DMMoab object being set
3901cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
3911cec0304SVijay Mahadevan 
3921cec0304SVijay Mahadevan   Level: beginner
3931cec0304SVijay Mahadevan 
3941cec0304SVijay Mahadevan .keywords: DMMoab, create
3951cec0304SVijay Mahadevan @*/
3961cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
3971cec0304SVijay Mahadevan {
3981cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
3991cec0304SVijay Mahadevan 
4001cec0304SVijay Mahadevan   PetscFunctionBegin;
4011cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4021cec0304SVijay Mahadevan   dmmoab->elocal->clear();
4031cec0304SVijay Mahadevan   dmmoab->eghost->clear();
4041cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
405*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
406*9daf19fdSVijay Mahadevan   moab::ErrorCode merr;
4071cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
4081cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
409*9daf19fdSVijay Mahadevan #endif
4101cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
41141dd5348SVijay Mahadevan   dmmoab->neleghost=dmmoab->eghost->size();
412*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
413*9daf19fdSVijay Mahadevan   PetscErrorCode  ierr;
414*9daf19fdSVijay Mahadevan   ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4158cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
416*9daf19fdSVijay Mahadevan #else
417*9daf19fdSVijay Mahadevan   dmmoab->nele=dmmoab->neleloc;
418*9daf19fdSVijay Mahadevan #endif
4195eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
4205eb88e9dSVijay Mahadevan }
4215eb88e9dSVijay Mahadevan 
4225eb88e9dSVijay Mahadevan 
423aa768e4cSTim Tautges /*@
424aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
425aa768e4cSTim Tautges 
426aa768e4cSTim Tautges   Collective on MPI_Comm
427aa768e4cSTim Tautges 
428aa768e4cSTim Tautges   Input Parameter:
429aa768e4cSTim Tautges . dm      - The DMMoab object being set
430aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
431aa768e4cSTim Tautges 
432aa768e4cSTim Tautges   Level: beginner
433aa768e4cSTim Tautges 
434aa768e4cSTim Tautges .keywords: DMMoab, create
435aa768e4cSTim Tautges @*/
4361d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4371d72bce8STim Tautges {
4381d72bce8STim Tautges   PetscFunctionBegin;
4391d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4401d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4411d72bce8STim Tautges   PetscFunctionReturn(0);
4421d72bce8STim Tautges }
4431d72bce8STim Tautges 
4441d72bce8STim Tautges 
445aa768e4cSTim Tautges /*@
446aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
447aa768e4cSTim Tautges 
448aa768e4cSTim Tautges   Collective on MPI_Comm
449aa768e4cSTim Tautges 
450aa768e4cSTim Tautges   Input Parameter:
451aa768e4cSTim Tautges . dm      - The DMMoab object being set
452aa768e4cSTim Tautges 
453aa768e4cSTim Tautges   Output Parameter:
454aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
455aa768e4cSTim Tautges 
456aa768e4cSTim Tautges   Level: beginner
457aa768e4cSTim Tautges 
458aa768e4cSTim Tautges .keywords: DMMoab, create
459aa768e4cSTim Tautges @*/
4601d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
4611d72bce8STim Tautges {
4621d72bce8STim Tautges   PetscFunctionBegin;
4631d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4641d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4651d72bce8STim Tautges   PetscFunctionReturn(0);
4661d72bce8STim Tautges }
4671d72bce8STim Tautges 
4681d72bce8STim Tautges 
469aa768e4cSTim Tautges /*@
470aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
471aa768e4cSTim Tautges 
472aa768e4cSTim Tautges   Collective on MPI_Comm
473aa768e4cSTim Tautges 
474aa768e4cSTim Tautges   Input Parameter:
475aa768e4cSTim Tautges . dm - The DMMoab object being set
476aa768e4cSTim Tautges . bs - The block size used with this DMMoab
477aa768e4cSTim Tautges 
478aa768e4cSTim Tautges   Level: beginner
479aa768e4cSTim Tautges 
480aa768e4cSTim Tautges .keywords: DMMoab, create
481aa768e4cSTim Tautges @*/
4821d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4831d72bce8STim Tautges {
4841d72bce8STim Tautges   PetscFunctionBegin;
4851d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4861d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4871d72bce8STim Tautges   PetscFunctionReturn(0);
4881d72bce8STim Tautges }
4891d72bce8STim Tautges 
4901d72bce8STim Tautges 
491aa768e4cSTim Tautges /*@
492aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
493aa768e4cSTim Tautges 
494aa768e4cSTim Tautges   Collective on MPI_Comm
495aa768e4cSTim Tautges 
496aa768e4cSTim Tautges   Input Parameter:
497aa768e4cSTim Tautges . dm - The DMMoab object being set
498aa768e4cSTim Tautges 
499aa768e4cSTim Tautges   Output Parameter:
500aa768e4cSTim Tautges . bs - The block size used with this DMMoab
501aa768e4cSTim Tautges 
502aa768e4cSTim Tautges   Level: beginner
503aa768e4cSTim Tautges 
504aa768e4cSTim Tautges .keywords: DMMoab, create
505aa768e4cSTim Tautges @*/
5061d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
5071d72bce8STim Tautges {
5081d72bce8STim Tautges   PetscFunctionBegin;
5091d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5101d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
5111d72bce8STim Tautges   PetscFunctionReturn(0);
5121d72bce8STim Tautges }
5131d72bce8STim Tautges 
5141cec0304SVijay Mahadevan 
515212ad6d1SVijay Mahadevan /*@
516212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
517212ad6d1SVijay Mahadevan 
51800cc10feSVijay Mahadevan   Collective on DM
519212ad6d1SVijay Mahadevan 
520212ad6d1SVijay Mahadevan   Input Parameter:
521212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
522212ad6d1SVijay Mahadevan 
523212ad6d1SVijay Mahadevan   Output Parameter:
52400cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance
52500cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance
526212ad6d1SVijay Mahadevan 
527212ad6d1SVijay Mahadevan   Level: beginner
528212ad6d1SVijay Mahadevan 
529212ad6d1SVijay Mahadevan .keywords: DMMoab, create
530212ad6d1SVijay Mahadevan @*/
53141dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg)
532212ad6d1SVijay Mahadevan {
533212ad6d1SVijay Mahadevan   PetscFunctionBegin;
534212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
53541dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->nele;
53641dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->n;
537212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
538212ad6d1SVijay Mahadevan }
539212ad6d1SVijay Mahadevan 
540212ad6d1SVijay Mahadevan 
541212ad6d1SVijay Mahadevan /*@
542212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
543212ad6d1SVijay Mahadevan 
54400cc10feSVijay Mahadevan   Collective on DM
545212ad6d1SVijay Mahadevan 
546212ad6d1SVijay Mahadevan   Input Parameter:
547212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
548212ad6d1SVijay Mahadevan 
549212ad6d1SVijay Mahadevan   Output Parameter:
550b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
55100cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
55200cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
55300cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor
554212ad6d1SVijay Mahadevan 
555212ad6d1SVijay Mahadevan   Level: beginner
556212ad6d1SVijay Mahadevan 
557212ad6d1SVijay Mahadevan .keywords: DMMoab, create
558212ad6d1SVijay Mahadevan @*/
55941dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg)
560212ad6d1SVijay Mahadevan {
561212ad6d1SVijay Mahadevan   PetscFunctionBegin;
562212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
56341dd5348SVijay Mahadevan   if(nel) *nel = ((DM_Moab*)dm->data)->neleloc;
56441dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->neleghost;
56541dd5348SVijay Mahadevan   if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
56641dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
567212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
568212ad6d1SVijay Mahadevan }
569212ad6d1SVijay Mahadevan 
570212ad6d1SVijay Mahadevan 
57100cc10feSVijay Mahadevan /*@
57200cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
57300cc10feSVijay Mahadevan 
57400cc10feSVijay Mahadevan   Collective on MPI_Comm
57500cc10feSVijay Mahadevan 
57600cc10feSVijay Mahadevan   Input Parameter:
57700cc10feSVijay Mahadevan . dm - The DMMoab object being set
57800cc10feSVijay Mahadevan 
57900cc10feSVijay Mahadevan   Output Parameter:
58000cc10feSVijay Mahadevan . offset - The local offset for the global vector
58100cc10feSVijay Mahadevan 
58200cc10feSVijay Mahadevan   Level: beginner
58300cc10feSVijay Mahadevan 
58400cc10feSVijay Mahadevan .keywords: DMMoab, create
58500cc10feSVijay Mahadevan @*/
58600cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset)
58700cc10feSVijay Mahadevan {
58800cc10feSVijay Mahadevan   PetscFunctionBegin;
58900cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
59000cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
59100cc10feSVijay Mahadevan   PetscFunctionReturn(0);
59200cc10feSVijay Mahadevan }
59300cc10feSVijay Mahadevan 
59400cc10feSVijay Mahadevan 
5954920ab11SVijay Mahadevan /*@
5964920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
5974920ab11SVijay Mahadevan 
5984920ab11SVijay Mahadevan   Collective on MPI_Comm
5994920ab11SVijay Mahadevan 
6004920ab11SVijay Mahadevan   Input Parameter:
601340f3b9aSVijay Mahadevan . dm - The DMMoab object
6024920ab11SVijay Mahadevan 
6034920ab11SVijay Mahadevan   Output Parameter:
6044920ab11SVijay Mahadevan . dim - The dimension of DM
6054920ab11SVijay Mahadevan 
6064920ab11SVijay Mahadevan   Level: beginner
6074920ab11SVijay Mahadevan 
6084920ab11SVijay Mahadevan .keywords: DMMoab, create
6094920ab11SVijay Mahadevan @*/
6104920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
6114920ab11SVijay Mahadevan {
6124920ab11SVijay Mahadevan   PetscFunctionBegin;
6134920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6144920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
6154920ab11SVijay Mahadevan   PetscFunctionReturn(0);
6164920ab11SVijay Mahadevan }
6174920ab11SVijay Mahadevan 
6184920ab11SVijay Mahadevan 
619755f3dfbSVijay Mahadevan #undef __FUNCT__
620755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetHierarchyLevel"
621755f3dfbSVijay Mahadevan /*@
622755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
623755f3dfbSVijay Mahadevan   generated through uniform refinement.
624755f3dfbSVijay Mahadevan 
625755f3dfbSVijay Mahadevan   Collective on DM
626755f3dfbSVijay Mahadevan 
627755f3dfbSVijay Mahadevan   Input Parameter:
628755f3dfbSVijay Mahadevan . dm - The DMMoab object being set
629755f3dfbSVijay Mahadevan 
630755f3dfbSVijay Mahadevan   Output Parameter:
631755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level
632755f3dfbSVijay Mahadevan 
633755f3dfbSVijay Mahadevan   Level: beginner
634755f3dfbSVijay Mahadevan 
635755f3dfbSVijay Mahadevan .keywords: DMMoab, multigrid
636755f3dfbSVijay Mahadevan @*/
637755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm,PetscInt *nlevel)
638755f3dfbSVijay Mahadevan {
639755f3dfbSVijay Mahadevan   PetscFunctionBegin;
640755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
641755f3dfbSVijay Mahadevan   if(nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel;
642755f3dfbSVijay Mahadevan   PetscFunctionReturn(0);
643755f3dfbSVijay Mahadevan }
644755f3dfbSVijay Mahadevan 
645755f3dfbSVijay Mahadevan 
646755f3dfbSVijay Mahadevan #undef __FUNCT__
647755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetMaterialBlock"
648340f3b9aSVijay Mahadevan /*@
649340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
650340f3b9aSVijay Mahadevan 
651340f3b9aSVijay Mahadevan   Collective on MPI_Comm
652340f3b9aSVijay Mahadevan 
653340f3b9aSVijay Mahadevan   Input Parameter:
654340f3b9aSVijay Mahadevan . dm - The DMMoab object
655340f3b9aSVijay Mahadevan . ehandle - The element entity handle
656340f3b9aSVijay Mahadevan 
657340f3b9aSVijay Mahadevan   Output Parameter:
658340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
659340f3b9aSVijay Mahadevan 
660340f3b9aSVijay Mahadevan   Level: beginner
661340f3b9aSVijay Mahadevan 
662340f3b9aSVijay Mahadevan .keywords: DMMoab, create
663340f3b9aSVijay Mahadevan @*/
664340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat)
665340f3b9aSVijay Mahadevan {
666340f3b9aSVijay Mahadevan   DM_Moab         *dmmoab;
667340f3b9aSVijay Mahadevan   moab::ErrorCode merr;
668340f3b9aSVijay Mahadevan 
669340f3b9aSVijay Mahadevan   PetscFunctionBegin;
670340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
671340f3b9aSVijay Mahadevan   if (*mat) {
672340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab*)(dm)->data;
67363cd93b2SVijay Mahadevan     merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr);
674340f3b9aSVijay Mahadevan   }
675340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
676340f3b9aSVijay Mahadevan }
677340f3b9aSVijay Mahadevan 
6784920ab11SVijay Mahadevan 
67985d305f5SVijay Mahadevan /*@
68085d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
68185d305f5SVijay Mahadevan 
68285d305f5SVijay Mahadevan   Collective on MPI_Comm
68385d305f5SVijay Mahadevan 
68485d305f5SVijay Mahadevan   Input Parameter:
68585d305f5SVijay Mahadevan . dm - The DMMoab object
68685d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
68785d305f5SVijay Mahadevan . conn - The vertex entity handles
68885d305f5SVijay Mahadevan 
68985d305f5SVijay Mahadevan   Output Parameter:
69085d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
69185d305f5SVijay Mahadevan 
69285d305f5SVijay Mahadevan   Level: beginner
69385d305f5SVijay Mahadevan 
69485d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity()
69585d305f5SVijay Mahadevan @*/
696cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscReal *vpos)
6977023aa44SVijay Mahadevan {
6987023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6997023aa44SVijay Mahadevan   PetscErrorCode  ierr;
7007023aa44SVijay Mahadevan   moab::ErrorCode merr;
7017023aa44SVijay Mahadevan 
7027023aa44SVijay Mahadevan   PetscFunctionBegin;
7037023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7047023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
7057023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7067023aa44SVijay Mahadevan 
7077023aa44SVijay Mahadevan   if (!vpos) {
7087ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr);
7097023aa44SVijay Mahadevan   }
7107023aa44SVijay Mahadevan 
7117023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7127023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
7137023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7147023aa44SVijay Mahadevan }
7157023aa44SVijay Mahadevan 
7167023aa44SVijay Mahadevan 
71785d305f5SVijay Mahadevan /*@
71885d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
71985d305f5SVijay Mahadevan 
72085d305f5SVijay Mahadevan   Collective on MPI_Comm
72185d305f5SVijay Mahadevan 
72285d305f5SVijay Mahadevan   Input Parameter:
72385d305f5SVijay Mahadevan . dm - The DMMoab object
72485d305f5SVijay Mahadevan . vhandle - Vertex entity handle
72585d305f5SVijay Mahadevan 
72685d305f5SVijay Mahadevan   Output Parameter:
72785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
72885d305f5SVijay Mahadevan . conn - The vertex entity handles
72985d305f5SVijay Mahadevan 
73085d305f5SVijay Mahadevan   Level: beginner
73185d305f5SVijay Mahadevan 
73285d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity()
73385d305f5SVijay Mahadevan @*/
73485d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt* nconn, moab::EntityHandle **conn)
7358d8d51c8SVijay Mahadevan {
7368d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
7378d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
7388d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7398d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
7408d8d51c8SVijay Mahadevan 
7418d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7428d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7438d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
7448d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7458d8d51c8SVijay Mahadevan 
7468d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
74785d305f5SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
7488d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
7498d8d51c8SVijay Mahadevan 
7508d8d51c8SVijay Mahadevan   if (conn) {
7518d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
7528d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
7538d8d51c8SVijay Mahadevan   }
7548d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
7558d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7568d8d51c8SVijay Mahadevan }
7578d8d51c8SVijay Mahadevan 
7588d8d51c8SVijay Mahadevan 
75985d305f5SVijay Mahadevan /*@
76085d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
76185d305f5SVijay Mahadevan 
76285d305f5SVijay Mahadevan   Collective on MPI_Comm
76385d305f5SVijay Mahadevan 
76485d305f5SVijay Mahadevan   Input Parameter:
76585d305f5SVijay Mahadevan . dm - The DMMoab object
76685d305f5SVijay Mahadevan . vhandle - Vertex entity handle
76785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
76885d305f5SVijay Mahadevan . conn - The vertex entity handles
76985d305f5SVijay Mahadevan 
77085d305f5SVijay Mahadevan   Level: beginner
77185d305f5SVijay Mahadevan 
77285d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity()
77385d305f5SVijay Mahadevan @*/
7748d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
7758d8d51c8SVijay Mahadevan {
7768d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7778d8d51c8SVijay Mahadevan 
7788d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7798d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7808d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
7818d8d51c8SVijay Mahadevan 
7828d8d51c8SVijay Mahadevan   if (conn) {
7838d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
7848d8d51c8SVijay Mahadevan   }
7858d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
7868d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7878d8d51c8SVijay Mahadevan }
7888d8d51c8SVijay Mahadevan 
7898d8d51c8SVijay Mahadevan 
79085d305f5SVijay Mahadevan /*@
79185d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
79285d305f5SVijay Mahadevan 
79385d305f5SVijay Mahadevan   Collective on MPI_Comm
79485d305f5SVijay Mahadevan 
79585d305f5SVijay Mahadevan   Input Parameter:
79685d305f5SVijay Mahadevan . dm - The DMMoab object
79785d305f5SVijay Mahadevan . ehandle - Vertex entity handle
79885d305f5SVijay Mahadevan 
79985d305f5SVijay Mahadevan   Output Parameter:
80085d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
80185d305f5SVijay Mahadevan . conn - The vertex entity handles
80285d305f5SVijay Mahadevan 
80385d305f5SVijay Mahadevan   Level: beginner
80485d305f5SVijay Mahadevan 
80585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity()
80685d305f5SVijay Mahadevan @*/
8077023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
8087023aa44SVijay Mahadevan {
8097023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8107023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
8117023aa44SVijay Mahadevan   moab::ErrorCode merr;
8127023aa44SVijay Mahadevan   PetscInt nnodes;
8137023aa44SVijay Mahadevan 
8147023aa44SVijay Mahadevan   PetscFunctionBegin;
8157023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8167023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
8177023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8187023aa44SVijay Mahadevan 
8197023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8207023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
8217023aa44SVijay Mahadevan   if (conn) *conn=connect;
8227023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
8237023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8247023aa44SVijay Mahadevan }
8257023aa44SVijay Mahadevan 
8267023aa44SVijay Mahadevan 
82785d305f5SVijay Mahadevan /*@
82885d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
82985d305f5SVijay Mahadevan 
83085d305f5SVijay Mahadevan   Collective on MPI_Comm
83185d305f5SVijay Mahadevan 
83285d305f5SVijay Mahadevan   Input Parameter:
83385d305f5SVijay Mahadevan . dm - The DMMoab object
83485d305f5SVijay Mahadevan . ent - Entity handle
83585d305f5SVijay Mahadevan 
83685d305f5SVijay Mahadevan   Output Parameter:
83785d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
83885d305f5SVijay Mahadevan 
83985d305f5SVijay Mahadevan   Level: beginner
84085d305f5SVijay Mahadevan 
84185d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices()
84285d305f5SVijay Mahadevan @*/
84369263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
84469263071SVijay Mahadevan {
84569263071SVijay Mahadevan   moab::EntityType etype;
84669263071SVijay Mahadevan   DM_Moab         *dmmoab;
84769263071SVijay Mahadevan   PetscInt         edim;
84869263071SVijay Mahadevan 
84969263071SVijay Mahadevan   PetscFunctionBegin;
85069263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
85169263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
85269263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
85369263071SVijay Mahadevan 
85469263071SVijay Mahadevan   /* get the entity type and handle accordingly */
85569263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
85669263071SVijay 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);
85769263071SVijay Mahadevan 
85869263071SVijay Mahadevan   /* get the entity dimension */
85969263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
86069263071SVijay Mahadevan 
86169263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
86269263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
86349d66b22SVijay Mahadevan     *ent_on_boundary=((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE:PETSC_FALSE);
86469263071SVijay Mahadevan   }
86569263071SVijay Mahadevan   else {
86669263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
8676d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
86869263071SVijay Mahadevan     }
86969263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
8706d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
87169263071SVijay Mahadevan     }
87269263071SVijay Mahadevan   }
87369263071SVijay Mahadevan   PetscFunctionReturn(0);
87469263071SVijay Mahadevan }
87569263071SVijay Mahadevan 
87669263071SVijay Mahadevan 
87785d305f5SVijay Mahadevan /*@
87885d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
87985d305f5SVijay Mahadevan 
88085d305f5SVijay Mahadevan   Input Parameter:
88185d305f5SVijay Mahadevan . dm - The DMMoab object
88285d305f5SVijay Mahadevan . nconn - Number of handles
88385d305f5SVijay Mahadevan . cnt - Array of entity handles
88485d305f5SVijay Mahadevan 
88585d305f5SVijay Mahadevan   Output Parameter:
88685d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
88785d305f5SVijay Mahadevan 
88885d305f5SVijay Mahadevan   Level: beginner
88985d305f5SVijay Mahadevan 
89085d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary()
89185d305f5SVijay Mahadevan @*/
89269263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
8937023aa44SVijay Mahadevan {
8947023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8957023aa44SVijay Mahadevan   PetscInt       i;
8967023aa44SVijay Mahadevan 
8977023aa44SVijay Mahadevan   PetscFunctionBegin;
8987023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8997023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
9007023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
9017023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9027023aa44SVijay Mahadevan 
9037023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
9046d9eb265SVijay Mahadevan     isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
9057023aa44SVijay Mahadevan   }
9067023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9077023aa44SVijay Mahadevan }
9087023aa44SVijay Mahadevan 
9097023aa44SVijay Mahadevan 
91085d305f5SVijay Mahadevan /*@
91185d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
91285d305f5SVijay Mahadevan 
91385d305f5SVijay Mahadevan   Input Parameter:
91485d305f5SVijay Mahadevan . dm - The DMMoab object
91585d305f5SVijay Mahadevan 
91685d305f5SVijay Mahadevan   Output Parameter:
91785d305f5SVijay Mahadevan . bdvtx - Boundary vertices
91885d305f5SVijay Mahadevan . bdelems - Boundary elements
91985d305f5SVijay Mahadevan . bdfaces - Boundary faces
92085d305f5SVijay Mahadevan 
92185d305f5SVijay Mahadevan   Level: beginner
92285d305f5SVijay Mahadevan 
92385d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary()
92485d305f5SVijay Mahadevan @*/
9256d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
9261cec0304SVijay Mahadevan {
9271cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
9281cec0304SVijay Mahadevan 
9291cec0304SVijay Mahadevan   PetscFunctionBegin;
9301cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9311cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9321cec0304SVijay Mahadevan 
9336d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
9346d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
9356d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
9361cec0304SVijay Mahadevan   PetscFunctionReturn(0);
9371cec0304SVijay Mahadevan }
9381cec0304SVijay Mahadevan 
939f6829af0SVijay Mahadevan 
940f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
941f6829af0SVijay Mahadevan {
942f6829af0SVijay Mahadevan   PetscErrorCode  ierr;
94385d305f5SVijay Mahadevan   PetscInt        i;
944e882eb38SVijay Mahadevan   moab::ErrorCode merr;
945f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
946f6829af0SVijay Mahadevan 
947f6829af0SVijay Mahadevan   PetscFunctionBegin;
948f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
949304006b3SVijay Mahadevan 
950304006b3SVijay Mahadevan   dmmoab->refct--;
951304006b3SVijay Mahadevan   if (!dmmoab->refct) {
952f6829af0SVijay Mahadevan     delete dmmoab->vlocal;
953f6829af0SVijay Mahadevan     delete dmmoab->vowned;
954f6829af0SVijay Mahadevan     delete dmmoab->vghost;
955f6829af0SVijay Mahadevan     delete dmmoab->elocal;
956f6829af0SVijay Mahadevan     delete dmmoab->eghost;
957f6829af0SVijay Mahadevan     delete dmmoab->bndyvtx;
958f6829af0SVijay Mahadevan     delete dmmoab->bndyfaces;
959f6829af0SVijay Mahadevan     delete dmmoab->bndyelems;
960f6829af0SVijay Mahadevan 
961f6829af0SVijay Mahadevan     ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
9627ae5e5b6SVijay Mahadevan     ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr);
9635905e1eaSVijay Mahadevan     ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr);
9645905e1eaSVijay Mahadevan     ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr);
96585d305f5SVijay Mahadevan     if (dmmoab->fieldNames) {
96685d305f5SVijay Mahadevan       for(i=0; i<dmmoab->numFields; i++) {
96785d305f5SVijay Mahadevan         ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
96885d305f5SVijay Mahadevan       }
96985d305f5SVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
97085d305f5SVijay Mahadevan     }
971b117cd09SVijay Mahadevan 
972b117cd09SVijay Mahadevan     if (dmmoab->nhlevels) {
973b117cd09SVijay Mahadevan       ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr);
974e882eb38SVijay Mahadevan       dmmoab->nhlevels=0;
975e882eb38SVijay Mahadevan       if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
976e882eb38SVijay Mahadevan       dmmoab->hierarchy=NULL;
977b117cd09SVijay Mahadevan     }
978e882eb38SVijay Mahadevan 
979e882eb38SVijay Mahadevan     if (dmmoab->icreatedinstance) {
980e882eb38SVijay Mahadevan       merr = dmmoab->mbiface->delete_mesh();MBERRNM(merr);
981e882eb38SVijay Mahadevan       delete dmmoab->mbiface;
982e882eb38SVijay Mahadevan     }
983e882eb38SVijay Mahadevan     dmmoab->mbiface = NULL;
984*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
985e882eb38SVijay Mahadevan     dmmoab->pcomm = NULL;
986*9daf19fdSVijay Mahadevan #endif
987f6829af0SVijay Mahadevan     ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
988f6829af0SVijay Mahadevan     ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
989f6829af0SVijay Mahadevan     ierr = PetscFree(dm->data);CHKERRQ(ierr);
990304006b3SVijay Mahadevan   }
991f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
992f6829af0SVijay Mahadevan }
993f6829af0SVijay Mahadevan 
994f6829af0SVijay Mahadevan 
9954416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject,DM dm)
9962e4e7c01SVijay Mahadevan {
9972e4e7c01SVijay Mahadevan   PetscErrorCode ierr;
9982e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
9992e4e7c01SVijay Mahadevan 
10002e4e7c01SVijay Mahadevan   PetscFunctionBegin;
10012e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1002cc310fddSBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr);
10032e4e7c01SVijay Mahadevan   ierr  = PetscOptionsInt("-dm_moab_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "DMView", dmmoab->rw_dbglevel, &dmmoab->rw_dbglevel, NULL);CHKERRQ(ierr);
10042e4e7c01SVijay 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);
10052e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
10062e4e7c01SVijay Mahadevan   ierr  = PetscOptionsString("-dm_moab_read_opts", "Extra options to enable MOAB reader to load DM from file", "DMView", dmmoab->extra_read_options, dmmoab->extra_read_options, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr);
10072e4e7c01SVijay Mahadevan   ierr  = PetscOptionsString("-dm_moab_write_opts", "Extra options to enable MOAB writer to serialize DM to file", "DMView", dmmoab->extra_write_options, dmmoab->extra_write_options, PETSC_MAX_PATH_LEN, NULL);CHKERRQ(ierr);
10082e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr);
10092e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr);
10102e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
10112e4e7c01SVijay Mahadevan }
10122e4e7c01SVijay Mahadevan 
10132e4e7c01SVijay Mahadevan 
1014f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
1015f6829af0SVijay Mahadevan {
1016f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
1017f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
1018f6829af0SVijay Mahadevan   Vec                     local, global;
1019f6829af0SVijay Mahadevan   IS                      from,to;
1020f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
1021304006b3SVijay Mahadevan   PetscInt                i,j,f,bs,vent,totsize,*lgmap;
1022f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
1023f6829af0SVijay Mahadevan   moab::Range             adjs;
1024f6829af0SVijay Mahadevan 
1025f6829af0SVijay Mahadevan   PetscFunctionBegin;
1026f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1027f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
1028*9daf19fdSVijay Mahadevan   if (dmmoab->mbiface == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface before calling SetUp.");
1029*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1030*9daf19fdSVijay Mahadevan   if (dmmoab->pcomm == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB ParallelComm object before calling SetUp.");
1031*9daf19fdSVijay Mahadevan #endif
1032f6829af0SVijay Mahadevan 
1033f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
1034f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
1035f6829af0SVijay Mahadevan   {
103649d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
103749d66b22SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false);MBERRNM(merr);
1038f6829af0SVijay Mahadevan 
1039*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1040f6829af0SVijay Mahadevan     /* filter based on parallel status */
1041f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
1042f6829af0SVijay Mahadevan 
1043f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1044f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
104564e1c140SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_GHOST|PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
1046f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
1047f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
1048*9daf19fdSVijay Mahadevan #else
1049*9daf19fdSVijay Mahadevan     *dmmoab->vowned=*dmmoab->vlocal;
1050*9daf19fdSVijay Mahadevan #endif
1051f6829af0SVijay Mahadevan 
1052f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
1053f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
1054f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
105549d66b22SVijay Mahadevan 
1056*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1057b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
105849d66b22SVijay Mahadevan     PetscInfo4(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost);
1059*9daf19fdSVijay Mahadevan #else
1060*9daf19fdSVijay Mahadevan     dmmoab->n=dmmoab->nloc;
1061*9daf19fdSVijay Mahadevan #endif
1062f6829af0SVijay Mahadevan   }
1063f6829af0SVijay Mahadevan 
1064f6829af0SVijay Mahadevan   {
1065f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1066f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1067f6829af0SVijay Mahadevan 
1068f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1069f6829af0SVijay Mahadevan     for (i=3;i>0;i--) {
1070f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
107149d66b22SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false);MBERRNM(merr);
1072f6829af0SVijay Mahadevan 
1073f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1074f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1075f6829af0SVijay Mahadevan         dmmoab->dim=i;
1076f6829af0SVijay Mahadevan         break;
1077f6829af0SVijay Mahadevan       }
1078f6829af0SVijay Mahadevan     }
1079f6829af0SVijay Mahadevan 
1080b117cd09SVijay Mahadevan     ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr);
1081b117cd09SVijay Mahadevan 
1082*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1083f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1084f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
1085f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1086f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
1087*9daf19fdSVijay Mahadevan #endif
1088f6829af0SVijay Mahadevan 
1089f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
1090f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
109149d66b22SVijay Mahadevan 
1092*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1093b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
109449d66b22SVijay Mahadevan     PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost);
1095*9daf19fdSVijay Mahadevan #else
1096*9daf19fdSVijay Mahadevan     dmmoab->nele=dmmoab->neleloc;
1097*9daf19fdSVijay Mahadevan #endif
1098f6829af0SVijay Mahadevan   }
1099f6829af0SVijay Mahadevan 
1100f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1101f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1102f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1103f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1104f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
1105f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1106f6829af0SVijay Mahadevan   }
1107f6829af0SVijay Mahadevan 
1108f6829af0SVijay Mahadevan   totsize=dmmoab->vlocal->size();
110949d66b22SVijay 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);
111049d66b22SVijay Mahadevan   ierr = PetscCalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr);
1111f6829af0SVijay Mahadevan   {
1112f6829af0SVijay Mahadevan     /* first get the local indices */
1113f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
11143f1c6e43SVijay Mahadevan     if (dmmoab->nghost) {  /* next get the ghosted indices */
1115f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1116f6829af0SVijay Mahadevan     }
1117f6829af0SVijay Mahadevan 
1118f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1119304006b3SVijay Mahadevan     dmmoab->lminmax[0]=dmmoab->lminmax[1]=dmmoab->gsindices[0];
1120f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
1121304006b3SVijay Mahadevan       if(dmmoab->lminmax[0]>dmmoab->gsindices[i]) dmmoab->lminmax[0]=dmmoab->gsindices[i];
1122304006b3SVijay Mahadevan       if(dmmoab->lminmax[1]<dmmoab->gsindices[i]) dmmoab->lminmax[1]=dmmoab->gsindices[i];
1123f6829af0SVijay Mahadevan     }
1124f6829af0SVijay Mahadevan 
1125304006b3SVijay Mahadevan     ierr = MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1126304006b3SVijay Mahadevan     ierr = MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1127f6829af0SVijay Mahadevan 
1128f6829af0SVijay Mahadevan     /* set the GID map */
1129f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
1130304006b3SVijay Mahadevan       dmmoab->gsindices[i]-=dmmoab->gminmax[0];   /* zero based index needed for IS */
1131f6829af0SVijay Mahadevan     }
1132304006b3SVijay Mahadevan     dmmoab->lminmax[0]-=dmmoab->gminmax[0];
1133304006b3SVijay Mahadevan     dmmoab->lminmax[1]-=dmmoab->gminmax[0];
1134f6829af0SVijay Mahadevan 
1135304006b3SVijay 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]);
1136f6829af0SVijay Mahadevan   }
113782dfd14aSVijay 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);
1138f6829af0SVijay Mahadevan 
1139f6829af0SVijay Mahadevan   {
11403f1c6e43SVijay Mahadevan     dmmoab->seqstart=((PetscInt)dmmoab->vlocal->front());
11413f1c6e43SVijay Mahadevan     dmmoab->seqend=((PetscInt)dmmoab->vlocal->back());
1142304006b3SVijay Mahadevan     PetscInfo2(NULL, "SEQUENCE: Local [min, max] - [%D, %D]\n", dmmoab->seqstart, dmmoab->seqend);
11433f1c6e43SVijay Mahadevan 
114449d66b22SVijay Mahadevan     ierr = PetscMalloc2(dmmoab->seqend-dmmoab->seqstart+1,&dmmoab->gidmap,dmmoab->seqend-dmmoab->seqstart+1,&dmmoab->lidmap);CHKERRQ(ierr);
11453f1c6e43SVijay Mahadevan     ierr = PetscMalloc1(totsize*dmmoab->numFields,&lgmap);CHKERRQ(ierr);
1146f6829af0SVijay Mahadevan 
1147f6829af0SVijay Mahadevan     i=j=0;
1148f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1149f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
11503f1c6e43SVijay Mahadevan       vent=(PetscInt)(*iter)-dmmoab->seqstart;
1151f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1152f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1153f6829af0SVijay Mahadevan       for (f=0;f<dmmoab->numFields;f++,j++) {
11543f1c6e43SVijay Mahadevan         lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]);
1155f6829af0SVijay Mahadevan       }
1156f6829af0SVijay Mahadevan     }
1157f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1158f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
11593f1c6e43SVijay Mahadevan       vent=(PetscInt)(*iter)-dmmoab->seqstart;
1160f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1161f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1162f6829af0SVijay Mahadevan       for (f=0;f<dmmoab->numFields;f++,j++) {
11633f1c6e43SVijay Mahadevan         lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]);
1164f6829af0SVijay Mahadevan       }
1165f6829af0SVijay Mahadevan     }
1166f6829af0SVijay Mahadevan 
1167f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1168f6829af0SVijay Mahadevan        1) First create a local and global vector
1169f6829af0SVijay Mahadevan        2) Create a local and global IS
1170f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1171f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1172f6829af0SVijay Mahadevan     */
1173f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
1174f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
1175f6829af0SVijay Mahadevan 
1176f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
1177f6829af0SVijay Mahadevan 
1178f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
1179f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
1180f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
1181f6829af0SVijay Mahadevan 
11823f1c6e43SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
1183f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
1184f6829af0SVijay Mahadevan 
1185f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1186f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11873f1c6e43SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,lgmap,
1188f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
1189f6829af0SVijay Mahadevan     }
1190f6829af0SVijay Mahadevan 
1191f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
1192f6829af0SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
1193f6829af0SVijay Mahadevan 
1194f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11953f1c6e43SVijay Mahadevan     ierr = PetscFree(lgmap);CHKERRQ(ierr);
1196f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1197f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1198f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1199f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1200f6829af0SVijay Mahadevan   }
1201f6829af0SVijay Mahadevan 
120249d66b22SVijay Mahadevan   dmmoab->bndyvtx = new moab::Range();
120349d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
120449d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1205f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
1206f6829af0SVijay Mahadevan   {
1207f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1208f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1209f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1210f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1211f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1212f6829af0SVijay Mahadevan 
1213f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
1214f6829af0SVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, false, true, false);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
1215f6829af0SVijay Mahadevan 
1216*9daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI
1217f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1218f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1219f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
1220*9daf19fdSVijay Mahadevan #endif
1221f6829af0SVijay Mahadevan 
1222f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1223f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
1224755f3dfbSVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
1225f6829af0SVijay Mahadevan   }
122649d66b22SVijay Mahadevan   PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size());
1227f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1228f6829af0SVijay Mahadevan }
1229f6829af0SVijay Mahadevan 
1230304006b3SVijay Mahadevan 
1231304006b3SVijay Mahadevan #undef __FUNCT__
1232304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateVertices"
1233304006b3SVijay Mahadevan /*@
1234304006b3SVijay Mahadevan   DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM.
1235304006b3SVijay Mahadevan 
1236304006b3SVijay Mahadevan   Collective on MPI_Comm
1237304006b3SVijay Mahadevan 
1238304006b3SVijay Mahadevan   Input Parameters:
1239304006b3SVijay Mahadevan + dm - The DM object
1240304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1241304006b3SVijay Mahadevan . conn - The connectivity of the element
1242304006b3SVijay Mahadevan . nverts - The number of vertices that form the element
1243304006b3SVijay Mahadevan 
1244304006b3SVijay Mahadevan   Output Parameter:
1245304006b3SVijay Mahadevan . overts  - The list of vertices that were created (can be NULL)
1246304006b3SVijay Mahadevan 
1247304006b3SVijay Mahadevan   Level: beginner
1248304006b3SVijay Mahadevan 
1249304006b3SVijay Mahadevan .keywords: DM, create vertices
1250304006b3SVijay Mahadevan 
1251304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateElement()
1252304006b3SVijay Mahadevan @*/
1253304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal* coords, PetscInt nverts, moab::Range* overts)
1254304006b3SVijay Mahadevan {
1255304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1256304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1257304006b3SVijay Mahadevan   moab::Range         verts;
1258304006b3SVijay Mahadevan 
1259304006b3SVijay Mahadevan   PetscFunctionBegin;
1260304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1261304006b3SVijay Mahadevan   PetscValidPointer(coords,2);
1262304006b3SVijay Mahadevan 
1263304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1264304006b3SVijay Mahadevan 
1265304006b3SVijay Mahadevan   /* Insert new points */
1266304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_vertices(&coords[0],nverts,verts);MBERRNM(merr);
1267304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset,verts);MBERRNM(merr);
1268304006b3SVijay Mahadevan 
1269304006b3SVijay Mahadevan   if (overts) *overts=verts;
1270304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1271304006b3SVijay Mahadevan }
1272304006b3SVijay Mahadevan 
1273304006b3SVijay Mahadevan 
1274304006b3SVijay Mahadevan #undef __FUNCT__
1275304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateElement"
1276304006b3SVijay Mahadevan /*@
1277304006b3SVijay Mahadevan   DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM.
1278304006b3SVijay Mahadevan 
1279304006b3SVijay Mahadevan   Collective on MPI_Comm
1280304006b3SVijay Mahadevan 
1281304006b3SVijay Mahadevan   Input Parameters:
1282304006b3SVijay Mahadevan + dm - The DM object
1283304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1284304006b3SVijay Mahadevan . conn - The connectivity of the element
1285304006b3SVijay Mahadevan . nverts - The number of vertices that form the element
1286304006b3SVijay Mahadevan 
1287304006b3SVijay Mahadevan   Output Parameter:
1288304006b3SVijay Mahadevan . oelem  - The handle to the element created and added to the DM object
1289304006b3SVijay Mahadevan 
1290304006b3SVijay Mahadevan   Level: beginner
1291304006b3SVijay Mahadevan 
1292304006b3SVijay Mahadevan .keywords: DM, create element
1293304006b3SVijay Mahadevan 
1294304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateVertices()
1295304006b3SVijay Mahadevan @*/
1296304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle* conn, PetscInt nverts, moab::EntityHandle* oelem)
1297304006b3SVijay Mahadevan {
1298304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1299304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1300304006b3SVijay Mahadevan   moab::EntityHandle  elem;
1301304006b3SVijay Mahadevan 
1302304006b3SVijay Mahadevan   PetscFunctionBegin;
1303304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1304304006b3SVijay Mahadevan   PetscValidPointer(conn,3);
1305304006b3SVijay Mahadevan 
1306304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1307304006b3SVijay Mahadevan 
1308304006b3SVijay Mahadevan   /* Insert new element */
1309304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_element(type,conn,nverts,elem);MBERRNM(merr);
1310304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset,&elem,1);MBERRNM(merr);
1311304006b3SVijay Mahadevan 
1312304006b3SVijay Mahadevan   if (oelem) *oelem = elem;
1313304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1314304006b3SVijay Mahadevan }
1315304006b3SVijay Mahadevan 
1316304006b3SVijay Mahadevan 
1317304006b3SVijay Mahadevan #undef __FUNCT__
1318304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateSubmesh"
1319304006b3SVijay Mahadevan /*@
1320304006b3SVijay Mahadevan   DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent
1321304006b3SVijay Mahadevan   in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to
1322304006b3SVijay Mahadevan   create a DM object on a refined level.
1323304006b3SVijay Mahadevan 
1324304006b3SVijay Mahadevan   Collective on MPI_Comm
1325304006b3SVijay Mahadevan 
1326304006b3SVijay Mahadevan   Input Parameters:
1327304006b3SVijay Mahadevan + dm - The DM object
1328304006b3SVijay Mahadevan 
1329304006b3SVijay Mahadevan   Output Parameter:
1330304006b3SVijay Mahadevan . newdm  - The sub DM object with updated set information
1331304006b3SVijay Mahadevan 
1332304006b3SVijay Mahadevan   Level: advanced
1333304006b3SVijay Mahadevan 
1334304006b3SVijay Mahadevan .keywords: DM, sub-DM
1335304006b3SVijay Mahadevan 
1336304006b3SVijay Mahadevan .seealso: DMCreate(), DMMoabCreateVertices(), DMMoabCreateElement()
1337304006b3SVijay Mahadevan @*/
1338304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm)
1339304006b3SVijay Mahadevan {
1340304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1341304006b3SVijay Mahadevan   DM_Moab            *ndmmoab;
1342304006b3SVijay Mahadevan   moab::ErrorCode    merr;
1343304006b3SVijay Mahadevan   PetscErrorCode     ierr;
1344304006b3SVijay Mahadevan 
1345304006b3SVijay Mahadevan   PetscFunctionBegin;
1346304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1347304006b3SVijay Mahadevan 
1348304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1349304006b3SVijay Mahadevan 
1350304006b3SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
1351*9daf19fdSVijay Mahadevan   ierr = DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, &dmmoab->ltog_tag, PETSC_NULL, newdm);CHKERRQ(ierr);
1352304006b3SVijay Mahadevan 
1353304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1354304006b3SVijay Mahadevan   ndmmoab = (DM_Moab*) (*newdm)->data;
1355304006b3SVijay Mahadevan 
1356304006b3SVijay Mahadevan   /* set the sub-mesh's parent DM reference */
1357304006b3SVijay Mahadevan   ndmmoab->parent = &dm;
1358304006b3SVijay Mahadevan 
1359304006b3SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
1360304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset);MBERR("Creating file set failed", merr);
1361304006b3SVijay Mahadevan 
1362304006b3SVijay Mahadevan   /* create a meshset and then add old fileset as child */
1363304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal);MBERR("Adding child vertices to parent failed", merr);
1364304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal);MBERR("Adding child elements to parent failed", merr);
1365304006b3SVijay Mahadevan 
1366304006b3SVijay Mahadevan   /* preserve the field association between the parent and sub-mesh objects */
1367304006b3SVijay Mahadevan   ierr = DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames);CHKERRQ(ierr);
1368304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1369304006b3SVijay Mahadevan }
1370304006b3SVijay Mahadevan 
1371304006b3SVijay Mahadevan 
1372304006b3SVijay Mahadevan #undef __FUNCT__
1373304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_Ascii"
1374304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer)
1375304006b3SVijay Mahadevan {
1376304006b3SVijay Mahadevan   DM_Moab          *dmmoab = (DM_Moab*)(dm)->data;
1377304006b3SVijay Mahadevan   const char       *name;
1378304006b3SVijay Mahadevan   MPI_Comm          comm;
1379304006b3SVijay Mahadevan   PetscMPIInt       size;
1380304006b3SVijay Mahadevan   PetscErrorCode    ierr;
1381304006b3SVijay Mahadevan 
1382304006b3SVijay Mahadevan   PetscFunctionBegin;
1383304006b3SVijay Mahadevan   ierr = PetscObjectGetComm((PetscObject)dm,&comm);CHKERRQ(ierr);
1384304006b3SVijay Mahadevan   ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr);
1385304006b3SVijay Mahadevan   ierr = PetscObjectGetName((PetscObject) dm, &name);CHKERRQ(ierr);
1386304006b3SVijay Mahadevan   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1387304006b3SVijay Mahadevan   if (name) {ierr = PetscViewerASCIIPrintf(viewer, "%s in %D dimensions:\n", name, dmmoab->dim);CHKERRQ(ierr);}
1388304006b3SVijay Mahadevan   else      {ierr = PetscViewerASCIIPrintf(viewer, "Mesh in %D dimensions:\n", dmmoab->dim);CHKERRQ(ierr);}
1389304006b3SVijay Mahadevan   /* print details about the global mesh */
1390304006b3SVijay Mahadevan   {
1391304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1392304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Sizes: cells=%D, vertices=%D, blocks=%D\n", dmmoab->n, dmmoab->nele, dmmoab->bs);CHKERRQ(ierr);
1393304006b3SVijay Mahadevan     /* print boundary data */
1394304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Boundary trace:\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr);
1395304006b3SVijay Mahadevan     {
1396304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1397304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPrintf(viewer, "cells=%D, faces=%D, vertices=%D\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr);
1398304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1399304006b3SVijay Mahadevan     }
1400304006b3SVijay Mahadevan     /* print field data */
1401304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Fields: %D components\n", dmmoab->numFields);CHKERRQ(ierr);
1402304006b3SVijay Mahadevan     {
1403304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1404304006b3SVijay Mahadevan       for (int i=0; i<dmmoab->numFields; ++i) {
1405304006b3SVijay Mahadevan         ierr = PetscViewerASCIIPrintf(viewer, "[%D] - %s\n", i, dmmoab->fieldNames[i]);CHKERRQ(ierr);
1406304006b3SVijay Mahadevan       }
1407304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1408304006b3SVijay Mahadevan     }
1409304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1410304006b3SVijay Mahadevan   }
1411304006b3SVijay Mahadevan   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1412304006b3SVijay Mahadevan   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
1413304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1414304006b3SVijay Mahadevan }
1415304006b3SVijay Mahadevan 
1416304006b3SVijay Mahadevan #undef __FUNCT__
1417304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_VTK"
1418304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm,PetscViewer v)
1419304006b3SVijay Mahadevan {
1420304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1421304006b3SVijay Mahadevan }
1422304006b3SVijay Mahadevan 
1423304006b3SVijay Mahadevan #undef __FUNCT__
1424304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_HDF5"
1425304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm,PetscViewer v)
1426304006b3SVijay Mahadevan {
1427304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1428304006b3SVijay Mahadevan }
1429304006b3SVijay Mahadevan 
1430304006b3SVijay Mahadevan #undef __FUNCT__
1431304006b3SVijay Mahadevan #define __FUNCT__ "DMView_Moab"
1432304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm,PetscViewer viewer)
1433304006b3SVijay Mahadevan {
1434304006b3SVijay Mahadevan   PetscBool      iascii, ishdf5, isvtk;
1435304006b3SVijay Mahadevan   PetscErrorCode ierr;
1436304006b3SVijay Mahadevan 
1437304006b3SVijay Mahadevan   PetscFunctionBegin;
1438304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1439304006b3SVijay Mahadevan   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
1440304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr);
1441304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERVTK,   &isvtk);CHKERRQ(ierr);
1442304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERHDF5,  &ishdf5);CHKERRQ(ierr);
1443304006b3SVijay Mahadevan   if (iascii) {
1444304006b3SVijay Mahadevan     ierr = DMMoabView_Ascii(dm, viewer);CHKERRQ(ierr);
1445304006b3SVijay Mahadevan   } else if (ishdf5) {
1446304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5)
1447304006b3SVijay Mahadevan     ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ);CHKERRQ(ierr);
1448304006b3SVijay Mahadevan     ierr = DMMoabView_HDF5(dm, viewer);CHKERRQ(ierr);
1449304006b3SVijay Mahadevan     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
1450304006b3SVijay Mahadevan #else
1451304006b3SVijay Mahadevan     SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1452304006b3SVijay Mahadevan #endif
1453304006b3SVijay Mahadevan   }
1454304006b3SVijay Mahadevan   else if (isvtk) {
1455304006b3SVijay Mahadevan     ierr = DMMoabView_VTK(dm, viewer);CHKERRQ(ierr);
1456304006b3SVijay Mahadevan   }
1457304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1458304006b3SVijay Mahadevan }
1459304006b3SVijay Mahadevan 
1460304006b3SVijay Mahadevan 
1461304006b3SVijay Mahadevan #undef __FUNCT__
1462304006b3SVijay Mahadevan #define __FUNCT__ "DMInitialize_Moab"
1463304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm)
1464304006b3SVijay Mahadevan {
1465304006b3SVijay Mahadevan   PetscFunctionBegin;
1466304006b3SVijay Mahadevan   dm->ops->view                            = DMView_Moab;
1467304006b3SVijay Mahadevan   dm->ops->load                            = NULL /*DMLoad_Moab*/;
1468304006b3SVijay Mahadevan   dm->ops->setfromoptions                  = DMSetFromOptions_Moab;
1469304006b3SVijay Mahadevan   dm->ops->clone                           = DMClone_Moab;
1470304006b3SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
1471304006b3SVijay Mahadevan   dm->ops->createdefaultsection            = NULL;
1472304006b3SVijay Mahadevan   dm->ops->createdefaultconstraints        = NULL;
1473304006b3SVijay Mahadevan   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
1474304006b3SVijay Mahadevan   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
1475304006b3SVijay Mahadevan   dm->ops->getlocaltoglobalmapping         = NULL;
1476304006b3SVijay Mahadevan   dm->ops->createfieldis                   = NULL;
1477304006b3SVijay Mahadevan   dm->ops->createcoordinatedm              = NULL /*DMCreateCoordinateDM_Moab*/;
1478304006b3SVijay Mahadevan   dm->ops->getcoloring                     = NULL;
1479304006b3SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
1480304006b3SVijay Mahadevan   dm->ops->createinterpolation             = DMCreateInterpolation_Moab;
1481304006b3SVijay Mahadevan   dm->ops->getaggregates                   = NULL;
1482304006b3SVijay Mahadevan   dm->ops->getinjection                    = NULL /*DMCreateInjection_Moab*/;
1483304006b3SVijay Mahadevan   dm->ops->refine                          = DMRefine_Moab;
1484304006b3SVijay Mahadevan   dm->ops->coarsen                         = DMCoarsen_Moab;
1485304006b3SVijay Mahadevan   dm->ops->refinehierarchy                 = DMRefineHierarchy_Moab;
1486304006b3SVijay Mahadevan   dm->ops->coarsenhierarchy                = DMCoarsenHierarchy_Moab;
1487304006b3SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
1488304006b3SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
1489304006b3SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
1490304006b3SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
1491304006b3SVijay Mahadevan   dm->ops->destroy                         = DMDestroy_Moab;
1492304006b3SVijay Mahadevan   dm->ops->createsubdm                     = NULL /*DMCreateSubDM_Moab*/;
1493304006b3SVijay Mahadevan   dm->ops->getdimpoints                    = NULL /*DMGetDimPoints_Moab*/;
1494304006b3SVijay Mahadevan   dm->ops->locatepoints                    = NULL /*DMLocatePoints_Moab*/;
1495304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1496304006b3SVijay Mahadevan }
1497304006b3SVijay Mahadevan 
1498304006b3SVijay Mahadevan 
1499304006b3SVijay Mahadevan #undef __FUNCT__
1500304006b3SVijay Mahadevan #define __FUNCT__ "DMClone_Moab"
1501304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm)
1502304006b3SVijay Mahadevan {
1503304006b3SVijay Mahadevan   PetscErrorCode     ierr;
1504304006b3SVijay Mahadevan 
1505304006b3SVijay Mahadevan   PetscFunctionBegin;
1506304006b3SVijay Mahadevan   ierr = PetscObjectChangeTypeName((PetscObject) *newdm, DMMOAB);CHKERRQ(ierr);
1507304006b3SVijay Mahadevan 
1508304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1509304006b3SVijay Mahadevan   (*newdm)->data = (DM_Moab*) dm->data;
1510304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct++;
1511304006b3SVijay Mahadevan 
1512304006b3SVijay Mahadevan   ierr = DMInitialize_Moab(*newdm);CHKERRQ(ierr);
1513304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1514304006b3SVijay Mahadevan }
1515304006b3SVijay Mahadevan 
1516304006b3SVijay Mahadevan 
1517304006b3SVijay Mahadevan #undef __FUNCT__
1518304006b3SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab"
1519f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1520f6829af0SVijay Mahadevan {
1521f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1522f6829af0SVijay Mahadevan 
1523f6829af0SVijay Mahadevan   PetscFunctionBegin;
1524f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1525f90c3b0eSVijay Mahadevan   ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr);
1526f6829af0SVijay Mahadevan 
1527f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1528f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1529f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1530f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1531f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1532f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1533f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1534f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1535c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_map = NULL;
1536c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_sendrecv = NULL;
1537f6829af0SVijay Mahadevan 
1538304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct = 1;
1539304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->parent = NULL;
1540f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1541f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1542f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1543f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1544f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1545f6829af0SVijay Mahadevan 
1546304006b3SVijay Mahadevan   ierr = DMInitialize_Moab(dm);CHKERRQ(ierr);
1547f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1548f6829af0SVijay Mahadevan }
1549f6829af0SVijay Mahadevan 
1550