xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 304006b37668cad3f6c43c04b9f2c4dc2eda5f97)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
21d72bce8STim Tautges 
31d72bce8STim Tautges #include <petscdmmoab.h>
488face26SJed Brown #include <MBTagConventions.hpp>
51cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
6032b8ab6SVijay Mahadevan 
7c6ef30f9SVijay Mahadevan /*MC
8c6ef30f9SVijay Mahadevan   DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database.
9c6ef30f9SVijay Mahadevan                     Direct access to the MOAB Interface and other mesh manipulation related objects are available
10c6ef30f9SVijay Mahadevan                     through public API. Ability to create global and local representation of Vecs containing all
11c6ef30f9SVijay Mahadevan                     unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided
12c6ef30f9SVijay Mahadevan                     along with utility functions to traverse the mesh and assemble a discrete system via
13c6ef30f9SVijay Mahadevan                     field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are
14c6ef30f9SVijay Mahadevan                     available.
15c6ef30f9SVijay Mahadevan 
16c6ef30f9SVijay Mahadevan   Reference: http://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html
17c6ef30f9SVijay Mahadevan 
18c6ef30f9SVijay Mahadevan   Level: intermediate
19c6ef30f9SVijay Mahadevan 
20c6ef30f9SVijay Mahadevan .seealso: DMType, DMMoabCreate(), DMCreate(), DMSetType(), DMMoabCreateMoab()
21c6ef30f9SVijay Mahadevan M*/
22c6ef30f9SVijay Mahadevan 
23*304006b3SVijay Mahadevan /* External function declarations here */
24*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInterpolation_Moab(DM dmCoarse, DM dmFine, Mat *interpolation, Vec *scaling);
25*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultConstraints_Moab(DM dm);
26*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm,  Mat *J);
27*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateCoordinateDM_Moab(DM dm, DM *cdm);
28*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefine_Moab(DM dm, MPI_Comm comm, DM *dmRefined);
29*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsen_Moab(DM dm, MPI_Comm comm, DM *dmCoarsened);
30*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMRefineHierarchy_Moab(DM dm, PetscInt nlevels, DM dmRefined[]);
31*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCoarsenHierarchy_Moab(DM dm,PetscInt nlevels,DM dmCoarsened[]);
32*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm);
33*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateGlobalVector_Moab(DM,Vec *);
34*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateLocalVector_Moab(DM,Vec *);
35*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateMatrix_Moab(DM dm,Mat *J);
36*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalBegin_Moab(DM,Vec,InsertMode,Vec);
37*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGlobalToLocalEnd_Moab(DM,Vec,InsertMode,Vec);
38*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalBegin_Moab(DM,Vec,InsertMode,Vec);
39*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocalToGlobalEnd_Moab(DM,Vec,InsertMode,Vec);
40*304006b3SVijay Mahadevan 
41*304006b3SVijay Mahadevan 
42*304006b3SVijay Mahadevan /* Un-implemented routines */
43*304006b3SVijay Mahadevan /*
44*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateDefaultSection_Moab(DM dm);
45*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateInjection_Moab(DM dmCoarse, DM dmFine, Mat *mat);
46*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLoad_Moab(DM dm, PetscViewer viewer);
47*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMGetDimPoints_Moab(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd);
48*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreateSubDM_Moab(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm);
49*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMLocatePoints_Moab(DM dm, Vec v, IS *cellIS);
50*304006b3SVijay Mahadevan */
51c6ef30f9SVijay Mahadevan 
521d72bce8STim Tautges /*@
531d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
541d72bce8STim Tautges 
551d72bce8STim Tautges   Collective on MPI_Comm
561d72bce8STim Tautges 
571d72bce8STim Tautges   Input Parameter:
581d72bce8STim Tautges . comm - The communicator for the DMMoab object
591d72bce8STim Tautges 
601d72bce8STim Tautges   Output Parameter:
61032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
621d72bce8STim Tautges 
631d72bce8STim Tautges   Level: beginner
641d72bce8STim Tautges 
651d72bce8STim Tautges .keywords: DMMoab, create
661d72bce8STim Tautges @*/
67032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
681d72bce8STim Tautges {
691d72bce8STim Tautges   PetscErrorCode ierr;
701d72bce8STim Tautges 
711d72bce8STim Tautges   PetscFunctionBegin;
72032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
73032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
74032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
751d72bce8STim Tautges   PetscFunctionReturn(0);
761d72bce8STim Tautges }
771d72bce8STim Tautges 
781d72bce8STim Tautges /*@
79b117cd09SVijay Mahadevan   DMMoabCreateMoab - Creates a DMMoab object, optionally from an instance and other data
801d72bce8STim Tautges 
811d72bce8STim Tautges   Collective on MPI_Comm
821d72bce8STim Tautges 
831d72bce8STim Tautges   Input Parameter:
841d72bce8STim Tautges . comm - The communicator for the DMMoab object
85032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
86a4d2169cSTim Tautges          along with the DMMoab
87a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
881d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
891d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
901d72bce8STim Tautges 
911d72bce8STim Tautges   Output Parameter:
92032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
931d72bce8STim Tautges 
94032b8ab6SVijay Mahadevan   Level: intermediate
951d72bce8STim Tautges 
961d72bce8STim Tautges .keywords: DMMoab, create
971d72bce8STim Tautges @*/
98032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
991d72bce8STim Tautges {
1001d72bce8STim Tautges   PetscErrorCode ierr;
101032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
1021cec0304SVijay Mahadevan   moab::EntityHandle partnset;
1031cec0304SVijay Mahadevan   PetscInt rank, nprocs;
10485d305f5SVijay Mahadevan   DM             dmmb;
105853cdec3SJed Brown   DM_Moab        *dmmoab;
1061d72bce8STim Tautges 
1071d72bce8STim Tautges   PetscFunctionBegin;
108032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
10985d305f5SVijay Mahadevan 
11085d305f5SVijay Mahadevan   ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr);
11185d305f5SVijay Mahadevan   dmmoab = (DM_Moab*)(dmmb)->data;
112a4d2169cSTim Tautges 
113a4d2169cSTim Tautges   if (!mbiface) {
11472ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
1157d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
1161d72bce8STim Tautges   }
1171cec0304SVijay Mahadevan   else {
1181cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
1197d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
1201cec0304SVijay Mahadevan   }
1211cec0304SVijay Mahadevan 
122b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
123b5410836SVijay Mahadevan   dmmoab->fileset=0;
124b117cd09SVijay Mahadevan   dmmoab->hlevel=0;
12549d66b22SVijay Mahadevan   dmmoab->nghostrings=0;
1267d89fc02STim Tautges 
127a4d2169cSTim Tautges   if (!pcomm) {
128032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
129032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
130032b8ab6SVijay Mahadevan 
131db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
132db66d124SVijay Mahadevan        to the load_file functions to be populated. */
1330c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
134032b8ab6SVijay Mahadevan 
135db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
13672ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
13772ff976dSVijay Mahadevan   }
13872ff976dSVijay Mahadevan   else {
13985d305f5SVijay Mahadevan     ierr = DMMoabSetParallelComm(dmmb, pcomm);CHKERRQ(ierr);
140032b8ab6SVijay Mahadevan   }
141032b8ab6SVijay Mahadevan 
1424973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1434973de03SVijay Mahadevan   dmmoab->bs = 1;
144addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1453f1c6e43SVijay Mahadevan   ierr = PetscMalloc(dmmoab->numFields*sizeof(char*),&dmmoab->fieldNames);CHKERRQ(ierr);
1463f1c6e43SVijay Mahadevan   ierr = PetscStrallocpy("DEFAULT", (char**) &dmmoab->fieldNames[0]);CHKERRQ(ierr);
1472e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
1482e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
1492e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
1502e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1512e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
1522e4e7c01SVijay Mahadevan   dmmoab->write_mode = WRITE_PART;
1534973de03SVijay Mahadevan 
1544973de03SVijay Mahadevan   /* set global ID tag handle */
1551a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
15685d305f5SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr);
157032b8ab6SVijay Mahadevan   }
158032b8ab6SVijay Mahadevan   else {
1591a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1601a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
161a4d2169cSTim Tautges   }
162a4d2169cSTim Tautges 
163340f3b9aSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr);
164340f3b9aSVijay Mahadevan 
1654973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
166a4d2169cSTim Tautges   if (range) {
16785d305f5SVijay Mahadevan     ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr);
168a4d2169cSTim Tautges   }
16985d305f5SVijay Mahadevan   *dmb=dmmb;
1701d72bce8STim Tautges   PetscFunctionReturn(0);
1711d72bce8STim Tautges }
1721d72bce8STim Tautges 
173*304006b3SVijay Mahadevan 
174*304006b3SVijay Mahadevan #undef __FUNCT__
175*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabSetParallelComm"
176aa768e4cSTim Tautges /*@
177aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
178aa768e4cSTim Tautges 
179aa768e4cSTim Tautges   Collective on MPI_Comm
180aa768e4cSTim Tautges 
181aa768e4cSTim Tautges   Input Parameter:
182aa768e4cSTim Tautges . dm    - The DMMoab object being set
183aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
184aa768e4cSTim Tautges 
185aa768e4cSTim Tautges   Level: beginner
186aa768e4cSTim Tautges 
187aa768e4cSTim Tautges .keywords: DMMoab, create
188aa768e4cSTim Tautges @*/
1891d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
1901d72bce8STim Tautges {
191032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
192032b8ab6SVijay Mahadevan 
1931d72bce8STim Tautges   PetscFunctionBegin;
1941d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1951cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
196032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
197032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
198032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
1991d72bce8STim Tautges   PetscFunctionReturn(0);
2001d72bce8STim Tautges }
2011d72bce8STim Tautges 
2021d72bce8STim Tautges 
203aa768e4cSTim Tautges /*@
204aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
205aa768e4cSTim Tautges 
206aa768e4cSTim Tautges   Collective on MPI_Comm
207aa768e4cSTim Tautges 
208aa768e4cSTim Tautges   Input Parameter:
209aa768e4cSTim Tautges . dm    - The DMMoab object being set
210aa768e4cSTim Tautges 
211aa768e4cSTim Tautges   Output Parameter:
212aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
213aa768e4cSTim Tautges 
214aa768e4cSTim Tautges   Level: beginner
215aa768e4cSTim Tautges 
216aa768e4cSTim Tautges .keywords: DMMoab, create
217aa768e4cSTim Tautges @*/
2181d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
2191d72bce8STim Tautges {
2201d72bce8STim Tautges   PetscFunctionBegin;
2211d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
222032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
2231d72bce8STim Tautges   PetscFunctionReturn(0);
2241d72bce8STim Tautges }
2251d72bce8STim Tautges 
2261d72bce8STim Tautges 
227aa768e4cSTim Tautges /*@
228aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
229aa768e4cSTim Tautges 
230aa768e4cSTim Tautges   Collective on MPI_Comm
231aa768e4cSTim Tautges 
232aa768e4cSTim Tautges   Input Parameter:
233aa768e4cSTim Tautges . dm      - The DMMoab object being set
234aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
235aa768e4cSTim Tautges 
236aa768e4cSTim Tautges   Level: beginner
237aa768e4cSTim Tautges 
238aa768e4cSTim Tautges .keywords: DMMoab, create
239aa768e4cSTim Tautges @*/
240a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
2411d72bce8STim Tautges {
242032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
243032b8ab6SVijay Mahadevan 
2441d72bce8STim Tautges   PetscFunctionBegin;
2451d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2461cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
247032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
248032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
249032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2501d72bce8STim Tautges   PetscFunctionReturn(0);
2511d72bce8STim Tautges }
2521d72bce8STim Tautges 
2531d72bce8STim Tautges 
254aa768e4cSTim Tautges /*@
255aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
256aa768e4cSTim Tautges 
257aa768e4cSTim Tautges   Collective on MPI_Comm
258aa768e4cSTim Tautges 
259aa768e4cSTim Tautges   Input Parameter:
260aa768e4cSTim Tautges . dm      - The DMMoab object being set
261aa768e4cSTim Tautges 
262aa768e4cSTim Tautges   Output Parameter:
263aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
264aa768e4cSTim Tautges 
265aa768e4cSTim Tautges   Level: beginner
266aa768e4cSTim Tautges 
267aa768e4cSTim Tautges .keywords: DMMoab, create
268aa768e4cSTim Tautges @*/
269a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
2701d72bce8STim Tautges {
2719426e041SSatish Balay   PetscErrorCode   ierr;
272cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
273cabb514dSBarry Smith 
2741d72bce8STim Tautges   PetscFunctionBegin;
2751d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
276cabb514dSBarry 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);
277a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2781d72bce8STim Tautges   PetscFunctionReturn(0);
2791d72bce8STim Tautges }
2801d72bce8STim Tautges 
2811d72bce8STim Tautges 
282aa768e4cSTim Tautges /*@
2835eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
284aa768e4cSTim Tautges 
285aa768e4cSTim Tautges   Collective on MPI_Comm
286aa768e4cSTim Tautges 
287aa768e4cSTim Tautges   Input Parameter:
288aa768e4cSTim Tautges . dm    - The DMMoab object being set
289aa768e4cSTim Tautges . range - The entities treated by this DMMoab
290aa768e4cSTim Tautges 
291aa768e4cSTim Tautges   Level: beginner
292aa768e4cSTim Tautges 
293aa768e4cSTim Tautges .keywords: DMMoab, create
294aa768e4cSTim Tautges @*/
2955eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
2961d72bce8STim Tautges {
297032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
298032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
299fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
300032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
301032b8ab6SVijay Mahadevan 
3021d72bce8STim Tautges   PetscFunctionBegin;
3031d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
304032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
305032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
306fd3326ddSVijay Mahadevan 
307032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
308fd3326ddSVijay Mahadevan 
309fd3326ddSVijay Mahadevan   /* filter based on parallel status */
310fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
311fd3326ddSVijay Mahadevan 
312fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
313fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
314fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
315fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
316fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
317fd3326ddSVijay Mahadevan 
318fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
319032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
320032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
321b2566f29SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
3221d72bce8STim Tautges   PetscFunctionReturn(0);
3231d72bce8STim Tautges }
3241d72bce8STim Tautges 
3251d72bce8STim Tautges 
3268d8d51c8SVijay Mahadevan /*@
3278d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
3288d8d51c8SVijay Mahadevan 
3298d8d51c8SVijay Mahadevan   Collective on MPI_Comm
3308d8d51c8SVijay Mahadevan 
3318d8d51c8SVijay Mahadevan   Input Parameter:
3328d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3338d8d51c8SVijay Mahadevan 
3348d8d51c8SVijay Mahadevan   Output Parameter:
3358d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3368d8d51c8SVijay Mahadevan 
3378d8d51c8SVijay Mahadevan   Level: beginner
3388d8d51c8SVijay Mahadevan 
3398d8d51c8SVijay Mahadevan .keywords: DMMoab, create
3408d8d51c8SVijay Mahadevan @*/
3418d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
3428d8d51c8SVijay Mahadevan {
3438d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3448d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3458d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3468d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3478d8d51c8SVijay Mahadevan }
3488d8d51c8SVijay Mahadevan 
3498d8d51c8SVijay Mahadevan 
3508d8d51c8SVijay Mahadevan 
351aa768e4cSTim Tautges /*@
3525eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
353aa768e4cSTim Tautges 
354aa768e4cSTim Tautges   Collective on MPI_Comm
355aa768e4cSTim Tautges 
356aa768e4cSTim Tautges   Input Parameter:
357aa768e4cSTim Tautges . dm    - The DMMoab object being set
358aa768e4cSTim Tautges 
359aa768e4cSTim Tautges   Output Parameter:
3605eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
3615eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
362aa768e4cSTim Tautges 
363aa768e4cSTim Tautges   Level: beginner
364aa768e4cSTim Tautges 
365aa768e4cSTim Tautges .keywords: DMMoab, create
366aa768e4cSTim Tautges @*/
367351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost)
3681d72bce8STim Tautges {
3691d72bce8STim Tautges   PetscFunctionBegin;
3701d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
371351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
372351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3731d72bce8STim Tautges   PetscFunctionReturn(0);
3741d72bce8STim Tautges }
3751d72bce8STim Tautges 
3765eb88e9dSVijay Mahadevan /*@
3775eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3785eb88e9dSVijay Mahadevan 
3795eb88e9dSVijay Mahadevan   Collective on MPI_Comm
3805eb88e9dSVijay Mahadevan 
3815eb88e9dSVijay Mahadevan   Input Parameter:
3825eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3835eb88e9dSVijay Mahadevan 
3845eb88e9dSVijay Mahadevan   Output Parameter:
3855eb88e9dSVijay Mahadevan . range - The entities owned locally
3865eb88e9dSVijay Mahadevan 
3875eb88e9dSVijay Mahadevan   Level: beginner
3885eb88e9dSVijay Mahadevan 
3895eb88e9dSVijay Mahadevan .keywords: DMMoab, create
3905eb88e9dSVijay Mahadevan @*/
391351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range)
3925eb88e9dSVijay Mahadevan {
3935eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3945eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
395351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3961cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3971cec0304SVijay Mahadevan }
3981cec0304SVijay Mahadevan 
3991cec0304SVijay Mahadevan 
4001cec0304SVijay Mahadevan /*@
4011cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
4021cec0304SVijay Mahadevan 
4031cec0304SVijay Mahadevan   Collective on MPI_Comm
4041cec0304SVijay Mahadevan 
4051cec0304SVijay Mahadevan   Input Parameter:
4061cec0304SVijay Mahadevan . dm    - The DMMoab object being set
4071cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
4081cec0304SVijay Mahadevan 
4091cec0304SVijay Mahadevan   Level: beginner
4101cec0304SVijay Mahadevan 
4111cec0304SVijay Mahadevan .keywords: DMMoab, create
4121cec0304SVijay Mahadevan @*/
4131cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
4141cec0304SVijay Mahadevan {
4151cec0304SVijay Mahadevan   moab::ErrorCode merr;
4161cec0304SVijay Mahadevan   PetscErrorCode  ierr;
4171cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
4181cec0304SVijay Mahadevan 
4191cec0304SVijay Mahadevan   PetscFunctionBegin;
4201cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4211cec0304SVijay Mahadevan   dmmoab->elocal->clear();
4221cec0304SVijay Mahadevan   dmmoab->eghost->clear();
4231cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
4241cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
4251cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
4261cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
42741dd5348SVijay Mahadevan   dmmoab->neleghost=dmmoab->eghost->size();
428b2566f29SBarry Smith   ierr = MPIU_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4298cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
4305eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
4315eb88e9dSVijay Mahadevan }
4325eb88e9dSVijay Mahadevan 
4335eb88e9dSVijay Mahadevan 
434aa768e4cSTim Tautges /*@
435aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
436aa768e4cSTim Tautges 
437aa768e4cSTim Tautges   Collective on MPI_Comm
438aa768e4cSTim Tautges 
439aa768e4cSTim Tautges   Input Parameter:
440aa768e4cSTim Tautges . dm      - The DMMoab object being set
441aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
442aa768e4cSTim Tautges 
443aa768e4cSTim Tautges   Level: beginner
444aa768e4cSTim Tautges 
445aa768e4cSTim Tautges .keywords: DMMoab, create
446aa768e4cSTim Tautges @*/
4471d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4481d72bce8STim Tautges {
4491d72bce8STim Tautges   PetscFunctionBegin;
4501d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4511d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4521d72bce8STim Tautges   PetscFunctionReturn(0);
4531d72bce8STim Tautges }
4541d72bce8STim Tautges 
4551d72bce8STim Tautges 
456aa768e4cSTim Tautges /*@
457aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
458aa768e4cSTim Tautges 
459aa768e4cSTim Tautges   Collective on MPI_Comm
460aa768e4cSTim Tautges 
461aa768e4cSTim Tautges   Input Parameter:
462aa768e4cSTim Tautges . dm      - The DMMoab object being set
463aa768e4cSTim Tautges 
464aa768e4cSTim Tautges   Output Parameter:
465aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
466aa768e4cSTim Tautges 
467aa768e4cSTim Tautges   Level: beginner
468aa768e4cSTim Tautges 
469aa768e4cSTim Tautges .keywords: DMMoab, create
470aa768e4cSTim Tautges @*/
4711d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
4721d72bce8STim Tautges {
4731d72bce8STim Tautges   PetscFunctionBegin;
4741d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4751d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4761d72bce8STim Tautges   PetscFunctionReturn(0);
4771d72bce8STim Tautges }
4781d72bce8STim Tautges 
4791d72bce8STim Tautges 
480aa768e4cSTim Tautges /*@
481aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
482aa768e4cSTim Tautges 
483aa768e4cSTim Tautges   Collective on MPI_Comm
484aa768e4cSTim Tautges 
485aa768e4cSTim Tautges   Input Parameter:
486aa768e4cSTim Tautges . dm - The DMMoab object being set
487aa768e4cSTim Tautges . bs - The block size used with this DMMoab
488aa768e4cSTim Tautges 
489aa768e4cSTim Tautges   Level: beginner
490aa768e4cSTim Tautges 
491aa768e4cSTim Tautges .keywords: DMMoab, create
492aa768e4cSTim Tautges @*/
4931d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4941d72bce8STim Tautges {
4951d72bce8STim Tautges   PetscFunctionBegin;
4961d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4971d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4981d72bce8STim Tautges   PetscFunctionReturn(0);
4991d72bce8STim Tautges }
5001d72bce8STim Tautges 
5011d72bce8STim Tautges 
502aa768e4cSTim Tautges /*@
503aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
504aa768e4cSTim Tautges 
505aa768e4cSTim Tautges   Collective on MPI_Comm
506aa768e4cSTim Tautges 
507aa768e4cSTim Tautges   Input Parameter:
508aa768e4cSTim Tautges . dm - The DMMoab object being set
509aa768e4cSTim Tautges 
510aa768e4cSTim Tautges   Output Parameter:
511aa768e4cSTim Tautges . bs - The block size used with this DMMoab
512aa768e4cSTim Tautges 
513aa768e4cSTim Tautges   Level: beginner
514aa768e4cSTim Tautges 
515aa768e4cSTim Tautges .keywords: DMMoab, create
516aa768e4cSTim Tautges @*/
5171d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
5181d72bce8STim Tautges {
5191d72bce8STim Tautges   PetscFunctionBegin;
5201d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5211d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
5221d72bce8STim Tautges   PetscFunctionReturn(0);
5231d72bce8STim Tautges }
5241d72bce8STim Tautges 
5251cec0304SVijay Mahadevan 
526212ad6d1SVijay Mahadevan /*@
527212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
528212ad6d1SVijay Mahadevan 
52900cc10feSVijay Mahadevan   Collective on DM
530212ad6d1SVijay Mahadevan 
531212ad6d1SVijay Mahadevan   Input Parameter:
532212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
533212ad6d1SVijay Mahadevan 
534212ad6d1SVijay Mahadevan   Output Parameter:
53500cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance
53600cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance
537212ad6d1SVijay Mahadevan 
538212ad6d1SVijay Mahadevan   Level: beginner
539212ad6d1SVijay Mahadevan 
540212ad6d1SVijay Mahadevan .keywords: DMMoab, create
541212ad6d1SVijay Mahadevan @*/
54241dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg)
543212ad6d1SVijay Mahadevan {
544212ad6d1SVijay Mahadevan   PetscFunctionBegin;
545212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
54641dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->nele;
54741dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->n;
548212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
549212ad6d1SVijay Mahadevan }
550212ad6d1SVijay Mahadevan 
551212ad6d1SVijay Mahadevan 
552212ad6d1SVijay Mahadevan /*@
553212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
554212ad6d1SVijay Mahadevan 
55500cc10feSVijay Mahadevan   Collective on DM
556212ad6d1SVijay Mahadevan 
557212ad6d1SVijay Mahadevan   Input Parameter:
558212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
559212ad6d1SVijay Mahadevan 
560212ad6d1SVijay Mahadevan   Output Parameter:
561b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
56200cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
56300cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
56400cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor
565212ad6d1SVijay Mahadevan 
566212ad6d1SVijay Mahadevan   Level: beginner
567212ad6d1SVijay Mahadevan 
568212ad6d1SVijay Mahadevan .keywords: DMMoab, create
569212ad6d1SVijay Mahadevan @*/
57041dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg)
571212ad6d1SVijay Mahadevan {
572212ad6d1SVijay Mahadevan   PetscFunctionBegin;
573212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
57441dd5348SVijay Mahadevan   if(nel) *nel = ((DM_Moab*)dm->data)->neleloc;
57541dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->neleghost;
57641dd5348SVijay Mahadevan   if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
57741dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
578212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
579212ad6d1SVijay Mahadevan }
580212ad6d1SVijay Mahadevan 
581212ad6d1SVijay Mahadevan 
58200cc10feSVijay Mahadevan /*@
58300cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
58400cc10feSVijay Mahadevan 
58500cc10feSVijay Mahadevan   Collective on MPI_Comm
58600cc10feSVijay Mahadevan 
58700cc10feSVijay Mahadevan   Input Parameter:
58800cc10feSVijay Mahadevan . dm - The DMMoab object being set
58900cc10feSVijay Mahadevan 
59000cc10feSVijay Mahadevan   Output Parameter:
59100cc10feSVijay Mahadevan . offset - The local offset for the global vector
59200cc10feSVijay Mahadevan 
59300cc10feSVijay Mahadevan   Level: beginner
59400cc10feSVijay Mahadevan 
59500cc10feSVijay Mahadevan .keywords: DMMoab, create
59600cc10feSVijay Mahadevan @*/
59700cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset)
59800cc10feSVijay Mahadevan {
59900cc10feSVijay Mahadevan   PetscFunctionBegin;
60000cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
60100cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
60200cc10feSVijay Mahadevan   PetscFunctionReturn(0);
60300cc10feSVijay Mahadevan }
60400cc10feSVijay Mahadevan 
60500cc10feSVijay Mahadevan 
6064920ab11SVijay Mahadevan /*@
6074920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
6084920ab11SVijay Mahadevan 
6094920ab11SVijay Mahadevan   Collective on MPI_Comm
6104920ab11SVijay Mahadevan 
6114920ab11SVijay Mahadevan   Input Parameter:
612340f3b9aSVijay Mahadevan . dm - The DMMoab object
6134920ab11SVijay Mahadevan 
6144920ab11SVijay Mahadevan   Output Parameter:
6154920ab11SVijay Mahadevan . dim - The dimension of DM
6164920ab11SVijay Mahadevan 
6174920ab11SVijay Mahadevan   Level: beginner
6184920ab11SVijay Mahadevan 
6194920ab11SVijay Mahadevan .keywords: DMMoab, create
6204920ab11SVijay Mahadevan @*/
6214920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
6224920ab11SVijay Mahadevan {
6234920ab11SVijay Mahadevan   PetscFunctionBegin;
6244920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6254920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
6264920ab11SVijay Mahadevan   PetscFunctionReturn(0);
6274920ab11SVijay Mahadevan }
6284920ab11SVijay Mahadevan 
6294920ab11SVijay Mahadevan 
630755f3dfbSVijay Mahadevan #undef __FUNCT__
631755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetHierarchyLevel"
632755f3dfbSVijay Mahadevan /*@
633755f3dfbSVijay Mahadevan   DMMoabGetHierarchyLevel - Get the current level of the mesh hierarchy
634755f3dfbSVijay Mahadevan   generated through uniform refinement.
635755f3dfbSVijay Mahadevan 
636755f3dfbSVijay Mahadevan   Collective on DM
637755f3dfbSVijay Mahadevan 
638755f3dfbSVijay Mahadevan   Input Parameter:
639755f3dfbSVijay Mahadevan . dm - The DMMoab object being set
640755f3dfbSVijay Mahadevan 
641755f3dfbSVijay Mahadevan   Output Parameter:
642755f3dfbSVijay Mahadevan . nvg - The current mesh hierarchy level
643755f3dfbSVijay Mahadevan 
644755f3dfbSVijay Mahadevan   Level: beginner
645755f3dfbSVijay Mahadevan 
646755f3dfbSVijay Mahadevan .keywords: DMMoab, multigrid
647755f3dfbSVijay Mahadevan @*/
648755f3dfbSVijay Mahadevan PetscErrorCode DMMoabGetHierarchyLevel(DM dm,PetscInt *nlevel)
649755f3dfbSVijay Mahadevan {
650755f3dfbSVijay Mahadevan   PetscFunctionBegin;
651755f3dfbSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
652755f3dfbSVijay Mahadevan   if(nlevel) *nlevel = ((DM_Moab*)dm->data)->hlevel;
653755f3dfbSVijay Mahadevan   PetscFunctionReturn(0);
654755f3dfbSVijay Mahadevan }
655755f3dfbSVijay Mahadevan 
656755f3dfbSVijay Mahadevan 
657755f3dfbSVijay Mahadevan #undef __FUNCT__
658755f3dfbSVijay Mahadevan #define __FUNCT__ "DMMoabGetMaterialBlock"
659340f3b9aSVijay Mahadevan /*@
660340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
661340f3b9aSVijay Mahadevan 
662340f3b9aSVijay Mahadevan   Collective on MPI_Comm
663340f3b9aSVijay Mahadevan 
664340f3b9aSVijay Mahadevan   Input Parameter:
665340f3b9aSVijay Mahadevan . dm - The DMMoab object
666340f3b9aSVijay Mahadevan . ehandle - The element entity handle
667340f3b9aSVijay Mahadevan 
668340f3b9aSVijay Mahadevan   Output Parameter:
669340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
670340f3b9aSVijay Mahadevan 
671340f3b9aSVijay Mahadevan   Level: beginner
672340f3b9aSVijay Mahadevan 
673340f3b9aSVijay Mahadevan .keywords: DMMoab, create
674340f3b9aSVijay Mahadevan @*/
675340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat)
676340f3b9aSVijay Mahadevan {
677340f3b9aSVijay Mahadevan   DM_Moab         *dmmoab;
678340f3b9aSVijay Mahadevan   moab::ErrorCode merr;
679340f3b9aSVijay Mahadevan 
680340f3b9aSVijay Mahadevan   PetscFunctionBegin;
681340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
682340f3b9aSVijay Mahadevan   if (*mat) {
683340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab*)(dm)->data;
68463cd93b2SVijay Mahadevan     merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr);
685340f3b9aSVijay Mahadevan   }
686340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
687340f3b9aSVijay Mahadevan }
688340f3b9aSVijay Mahadevan 
6894920ab11SVijay Mahadevan 
69085d305f5SVijay Mahadevan /*@
69185d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
69285d305f5SVijay Mahadevan 
69385d305f5SVijay Mahadevan   Collective on MPI_Comm
69485d305f5SVijay Mahadevan 
69585d305f5SVijay Mahadevan   Input Parameter:
69685d305f5SVijay Mahadevan . dm - The DMMoab object
69785d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
69885d305f5SVijay Mahadevan . conn - The vertex entity handles
69985d305f5SVijay Mahadevan 
70085d305f5SVijay Mahadevan   Output Parameter:
70185d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
70285d305f5SVijay Mahadevan 
70385d305f5SVijay Mahadevan   Level: beginner
70485d305f5SVijay Mahadevan 
70585d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity()
70685d305f5SVijay Mahadevan @*/
707cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscReal *vpos)
7087023aa44SVijay Mahadevan {
7097023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
7107023aa44SVijay Mahadevan   PetscErrorCode  ierr;
7117023aa44SVijay Mahadevan   moab::ErrorCode merr;
7127023aa44SVijay Mahadevan 
7137023aa44SVijay Mahadevan   PetscFunctionBegin;
7147023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7157023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
7167023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7177023aa44SVijay Mahadevan 
7187023aa44SVijay Mahadevan   if (!vpos) {
7197ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr);
7207023aa44SVijay Mahadevan   }
7217023aa44SVijay Mahadevan 
7227023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7237023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
7247023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7257023aa44SVijay Mahadevan }
7267023aa44SVijay Mahadevan 
7277023aa44SVijay Mahadevan 
72885d305f5SVijay Mahadevan /*@
72985d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
73085d305f5SVijay Mahadevan 
73185d305f5SVijay Mahadevan   Collective on MPI_Comm
73285d305f5SVijay Mahadevan 
73385d305f5SVijay Mahadevan   Input Parameter:
73485d305f5SVijay Mahadevan . dm - The DMMoab object
73585d305f5SVijay Mahadevan . vhandle - Vertex entity handle
73685d305f5SVijay Mahadevan 
73785d305f5SVijay Mahadevan   Output Parameter:
73885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
73985d305f5SVijay Mahadevan . conn - The vertex entity handles
74085d305f5SVijay Mahadevan 
74185d305f5SVijay Mahadevan   Level: beginner
74285d305f5SVijay Mahadevan 
74385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity()
74485d305f5SVijay Mahadevan @*/
74585d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt* nconn, moab::EntityHandle **conn)
7468d8d51c8SVijay Mahadevan {
7478d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
7488d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
7498d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7508d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
7518d8d51c8SVijay Mahadevan 
7528d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7538d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7548d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
7558d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7568d8d51c8SVijay Mahadevan 
7578d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
75885d305f5SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
7598d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
7608d8d51c8SVijay Mahadevan 
7618d8d51c8SVijay Mahadevan   if (conn) {
7628d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
7638d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
7648d8d51c8SVijay Mahadevan   }
7658d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
7668d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7678d8d51c8SVijay Mahadevan }
7688d8d51c8SVijay Mahadevan 
7698d8d51c8SVijay Mahadevan 
77085d305f5SVijay Mahadevan /*@
77185d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
77285d305f5SVijay Mahadevan 
77385d305f5SVijay Mahadevan   Collective on MPI_Comm
77485d305f5SVijay Mahadevan 
77585d305f5SVijay Mahadevan   Input Parameter:
77685d305f5SVijay Mahadevan . dm - The DMMoab object
77785d305f5SVijay Mahadevan . vhandle - Vertex entity handle
77885d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
77985d305f5SVijay Mahadevan . conn - The vertex entity handles
78085d305f5SVijay Mahadevan 
78185d305f5SVijay Mahadevan   Level: beginner
78285d305f5SVijay Mahadevan 
78385d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity()
78485d305f5SVijay Mahadevan @*/
7858d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
7868d8d51c8SVijay Mahadevan {
7878d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7888d8d51c8SVijay Mahadevan 
7898d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7908d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7918d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
7928d8d51c8SVijay Mahadevan 
7938d8d51c8SVijay Mahadevan   if (conn) {
7948d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
7958d8d51c8SVijay Mahadevan   }
7968d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
7978d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7988d8d51c8SVijay Mahadevan }
7998d8d51c8SVijay Mahadevan 
8008d8d51c8SVijay Mahadevan 
80185d305f5SVijay Mahadevan /*@
80285d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
80385d305f5SVijay Mahadevan 
80485d305f5SVijay Mahadevan   Collective on MPI_Comm
80585d305f5SVijay Mahadevan 
80685d305f5SVijay Mahadevan   Input Parameter:
80785d305f5SVijay Mahadevan . dm - The DMMoab object
80885d305f5SVijay Mahadevan . ehandle - Vertex entity handle
80985d305f5SVijay Mahadevan 
81085d305f5SVijay Mahadevan   Output Parameter:
81185d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
81285d305f5SVijay Mahadevan . conn - The vertex entity handles
81385d305f5SVijay Mahadevan 
81485d305f5SVijay Mahadevan   Level: beginner
81585d305f5SVijay Mahadevan 
81685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity()
81785d305f5SVijay Mahadevan @*/
8187023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
8197023aa44SVijay Mahadevan {
8207023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8217023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
8227023aa44SVijay Mahadevan   moab::ErrorCode merr;
8237023aa44SVijay Mahadevan   PetscInt nnodes;
8247023aa44SVijay Mahadevan 
8257023aa44SVijay Mahadevan   PetscFunctionBegin;
8267023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8277023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
8287023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8297023aa44SVijay Mahadevan 
8307023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8317023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
8327023aa44SVijay Mahadevan   if (conn) *conn=connect;
8337023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
8347023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8357023aa44SVijay Mahadevan }
8367023aa44SVijay Mahadevan 
8377023aa44SVijay Mahadevan 
83885d305f5SVijay Mahadevan /*@
83985d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
84085d305f5SVijay Mahadevan 
84185d305f5SVijay Mahadevan   Collective on MPI_Comm
84285d305f5SVijay Mahadevan 
84385d305f5SVijay Mahadevan   Input Parameter:
84485d305f5SVijay Mahadevan . dm - The DMMoab object
84585d305f5SVijay Mahadevan . ent - Entity handle
84685d305f5SVijay Mahadevan 
84785d305f5SVijay Mahadevan   Output Parameter:
84885d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
84985d305f5SVijay Mahadevan 
85085d305f5SVijay Mahadevan   Level: beginner
85185d305f5SVijay Mahadevan 
85285d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices()
85385d305f5SVijay Mahadevan @*/
85469263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
85569263071SVijay Mahadevan {
85669263071SVijay Mahadevan   moab::EntityType etype;
85769263071SVijay Mahadevan   DM_Moab         *dmmoab;
85869263071SVijay Mahadevan   PetscInt         edim;
85969263071SVijay Mahadevan 
86069263071SVijay Mahadevan   PetscFunctionBegin;
86169263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
86269263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
86369263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
86469263071SVijay Mahadevan 
86569263071SVijay Mahadevan   /* get the entity type and handle accordingly */
86669263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
86769263071SVijay 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);
86869263071SVijay Mahadevan 
86969263071SVijay Mahadevan   /* get the entity dimension */
87069263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
87169263071SVijay Mahadevan 
87269263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
87369263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
87449d66b22SVijay Mahadevan     *ent_on_boundary=((dmmoab->bndyvtx->index(ent) >= 0) ? PETSC_TRUE:PETSC_FALSE);
87569263071SVijay Mahadevan   }
87669263071SVijay Mahadevan   else {
87769263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
8786d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
87969263071SVijay Mahadevan     }
88069263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
8816d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
88269263071SVijay Mahadevan     }
88369263071SVijay Mahadevan   }
88469263071SVijay Mahadevan   PetscFunctionReturn(0);
88569263071SVijay Mahadevan }
88669263071SVijay Mahadevan 
88769263071SVijay Mahadevan 
88885d305f5SVijay Mahadevan /*@
88985d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
89085d305f5SVijay Mahadevan 
89185d305f5SVijay Mahadevan   Input Parameter:
89285d305f5SVijay Mahadevan . dm - The DMMoab object
89385d305f5SVijay Mahadevan . nconn - Number of handles
89485d305f5SVijay Mahadevan . cnt - Array of entity handles
89585d305f5SVijay Mahadevan 
89685d305f5SVijay Mahadevan   Output Parameter:
89785d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
89885d305f5SVijay Mahadevan 
89985d305f5SVijay Mahadevan   Level: beginner
90085d305f5SVijay Mahadevan 
90185d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary()
90285d305f5SVijay Mahadevan @*/
90369263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
9047023aa44SVijay Mahadevan {
9057023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9067023aa44SVijay Mahadevan   PetscInt       i;
9077023aa44SVijay Mahadevan 
9087023aa44SVijay Mahadevan   PetscFunctionBegin;
9097023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9107023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
9117023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
9127023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9137023aa44SVijay Mahadevan 
9147023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
9156d9eb265SVijay Mahadevan     isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
9167023aa44SVijay Mahadevan   }
9177023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9187023aa44SVijay Mahadevan }
9197023aa44SVijay Mahadevan 
9207023aa44SVijay Mahadevan 
92185d305f5SVijay Mahadevan /*@
92285d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
92385d305f5SVijay Mahadevan 
92485d305f5SVijay Mahadevan   Input Parameter:
92585d305f5SVijay Mahadevan . dm - The DMMoab object
92685d305f5SVijay Mahadevan 
92785d305f5SVijay Mahadevan   Output Parameter:
92885d305f5SVijay Mahadevan . bdvtx - Boundary vertices
92985d305f5SVijay Mahadevan . bdelems - Boundary elements
93085d305f5SVijay Mahadevan . bdfaces - Boundary faces
93185d305f5SVijay Mahadevan 
93285d305f5SVijay Mahadevan   Level: beginner
93385d305f5SVijay Mahadevan 
93485d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary()
93585d305f5SVijay Mahadevan @*/
9366d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
9371cec0304SVijay Mahadevan {
9381cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
9391cec0304SVijay Mahadevan 
9401cec0304SVijay Mahadevan   PetscFunctionBegin;
9411cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9421cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9431cec0304SVijay Mahadevan 
9446d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
9456d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
9466d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
9471cec0304SVijay Mahadevan   PetscFunctionReturn(0);
9481cec0304SVijay Mahadevan }
9491cec0304SVijay Mahadevan 
950f6829af0SVijay Mahadevan 
951f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
952f6829af0SVijay Mahadevan {
953f6829af0SVijay Mahadevan   PetscErrorCode  ierr;
95485d305f5SVijay Mahadevan   PetscInt        i;
955e882eb38SVijay Mahadevan   moab::ErrorCode merr;
956f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
957f6829af0SVijay Mahadevan 
958f6829af0SVijay Mahadevan   PetscFunctionBegin;
959f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
960*304006b3SVijay Mahadevan 
961*304006b3SVijay Mahadevan   dmmoab->refct--;
962*304006b3SVijay Mahadevan   if (!dmmoab->refct) {
963f6829af0SVijay Mahadevan     delete dmmoab->vlocal;
964f6829af0SVijay Mahadevan     delete dmmoab->vowned;
965f6829af0SVijay Mahadevan     delete dmmoab->vghost;
966f6829af0SVijay Mahadevan     delete dmmoab->elocal;
967f6829af0SVijay Mahadevan     delete dmmoab->eghost;
968f6829af0SVijay Mahadevan     delete dmmoab->bndyvtx;
969f6829af0SVijay Mahadevan     delete dmmoab->bndyfaces;
970f6829af0SVijay Mahadevan     delete dmmoab->bndyelems;
971f6829af0SVijay Mahadevan 
972f6829af0SVijay Mahadevan     ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
9737ae5e5b6SVijay Mahadevan     ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr);
9745905e1eaSVijay Mahadevan     ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr);
9755905e1eaSVijay Mahadevan     ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr);
97685d305f5SVijay Mahadevan     if (dmmoab->fieldNames) {
97785d305f5SVijay Mahadevan       for(i=0; i<dmmoab->numFields; i++) {
97885d305f5SVijay Mahadevan         ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
97985d305f5SVijay Mahadevan       }
98085d305f5SVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
98185d305f5SVijay Mahadevan     }
982b117cd09SVijay Mahadevan 
983b117cd09SVijay Mahadevan     if (dmmoab->nhlevels) {
984b117cd09SVijay Mahadevan       ierr = PetscFree(dmmoab->hsets);CHKERRQ(ierr);
985e882eb38SVijay Mahadevan       dmmoab->nhlevels=0;
986e882eb38SVijay Mahadevan       if (!dmmoab->hlevel && dmmoab->icreatedinstance) delete dmmoab->hierarchy;
987e882eb38SVijay Mahadevan       dmmoab->hierarchy=NULL;
988b117cd09SVijay Mahadevan     }
989e882eb38SVijay Mahadevan 
990e882eb38SVijay Mahadevan     if (dmmoab->icreatedinstance) {
991e882eb38SVijay Mahadevan       merr = dmmoab->mbiface->delete_mesh();MBERRNM(merr);
992e882eb38SVijay Mahadevan       delete dmmoab->mbiface;
993e882eb38SVijay Mahadevan     }
994e882eb38SVijay Mahadevan     dmmoab->mbiface = NULL;
995e882eb38SVijay Mahadevan     dmmoab->pcomm = NULL;
996e882eb38SVijay Mahadevan 
997f6829af0SVijay Mahadevan     ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
998f6829af0SVijay Mahadevan     ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
999f6829af0SVijay Mahadevan     ierr = PetscFree(dm->data);CHKERRQ(ierr);
1000*304006b3SVijay Mahadevan   }
1001f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1002f6829af0SVijay Mahadevan }
1003f6829af0SVijay Mahadevan 
1004f6829af0SVijay Mahadevan 
10054416b707SBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptionItems *PetscOptionsObject,DM dm)
10062e4e7c01SVijay Mahadevan {
10072e4e7c01SVijay Mahadevan   PetscErrorCode ierr;
10082e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
10092e4e7c01SVijay Mahadevan 
10102e4e7c01SVijay Mahadevan   PetscFunctionBegin;
10112e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1012cc310fddSBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr);
10132e4e7c01SVijay 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);
10142e4e7c01SVijay 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);
10152e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
10162e4e7c01SVijay 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);
10172e4e7c01SVijay 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);
10182e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr);
10192e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr);
10202e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
10212e4e7c01SVijay Mahadevan }
10222e4e7c01SVijay Mahadevan 
10232e4e7c01SVijay Mahadevan 
1024f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
1025f6829af0SVijay Mahadevan {
1026f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
1027f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
1028f6829af0SVijay Mahadevan   Vec                     local, global;
1029f6829af0SVijay Mahadevan   IS                      from,to;
1030f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
1031*304006b3SVijay Mahadevan   PetscInt                i,j,f,bs,vent,totsize,*lgmap;
1032f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
1033f6829af0SVijay Mahadevan   moab::Range             adjs;
1034f6829af0SVijay Mahadevan 
1035f6829af0SVijay Mahadevan   PetscFunctionBegin;
1036f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1037f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
1038c528d872SBarry Smith   if (dmmoab->mbiface == NULL || dmmoab->pcomm == NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp.");
1039f6829af0SVijay Mahadevan 
1040f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
1041f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
1042f6829af0SVijay Mahadevan   {
104349d66b22SVijay Mahadevan     //merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
104449d66b22SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, 0, *dmmoab->vlocal, false);MBERRNM(merr);
1045f6829af0SVijay Mahadevan 
1046f6829af0SVijay Mahadevan     /* filter based on parallel status */
1047f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
1048f6829af0SVijay Mahadevan 
1049f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1050f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
105164e1c140SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_GHOST|PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
1052f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
1053f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
1054f6829af0SVijay Mahadevan 
1055f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
1056f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
1057f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
105849d66b22SVijay Mahadevan 
1059b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
106049d66b22SVijay Mahadevan     PetscInfo4(NULL, "Filset ID: %u, Vertices: local - %D, owned - %D, ghosted - %D.\n", dmmoab->fileset, dmmoab->vlocal->size(), dmmoab->nloc, dmmoab->nghost);
1061f6829af0SVijay Mahadevan   }
1062f6829af0SVijay Mahadevan 
1063f6829af0SVijay Mahadevan   {
1064f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1065f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1066f6829af0SVijay Mahadevan 
1067f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1068f6829af0SVijay Mahadevan     for (i=3;i>0;i--) {
1069f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
107049d66b22SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, false);MBERRNM(merr);
1071f6829af0SVijay Mahadevan 
1072f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1073f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1074f6829af0SVijay Mahadevan         dmmoab->dim=i;
1075f6829af0SVijay Mahadevan         break;
1076f6829af0SVijay Mahadevan       }
1077f6829af0SVijay Mahadevan     }
1078f6829af0SVijay Mahadevan 
1079b117cd09SVijay Mahadevan     ierr = DMSetDimension(dm, dmmoab->dim);CHKERRQ(ierr);
1080b117cd09SVijay Mahadevan 
1081f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1082f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
1083f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1084f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
1085f6829af0SVijay Mahadevan 
1086f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
1087f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
108849d66b22SVijay Mahadevan 
1089b2566f29SBarry Smith     ierr = MPIU_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
109049d66b22SVijay Mahadevan     PetscInfo3(NULL, "%d-dim elements: owned - %D, ghosted - %D.\n", dmmoab->dim, dmmoab->neleloc, dmmoab->neleghost);
1091f6829af0SVijay Mahadevan   }
1092f6829af0SVijay Mahadevan 
1093f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1094f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1095f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1096f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1097f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
1098f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1099f6829af0SVijay Mahadevan   }
1100f6829af0SVijay Mahadevan 
1101f6829af0SVijay Mahadevan   totsize=dmmoab->vlocal->size();
110249d66b22SVijay 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);
110349d66b22SVijay Mahadevan   ierr = PetscCalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr);
1104f6829af0SVijay Mahadevan   {
1105f6829af0SVijay Mahadevan     /* first get the local indices */
1106f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
11073f1c6e43SVijay Mahadevan     if (dmmoab->nghost) {  /* next get the ghosted indices */
1108f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1109f6829af0SVijay Mahadevan     }
1110f6829af0SVijay Mahadevan 
1111f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1112*304006b3SVijay Mahadevan     dmmoab->lminmax[0]=dmmoab->lminmax[1]=dmmoab->gsindices[0];
1113f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
1114*304006b3SVijay Mahadevan       if(dmmoab->lminmax[0]>dmmoab->gsindices[i]) dmmoab->lminmax[0]=dmmoab->gsindices[i];
1115*304006b3SVijay Mahadevan       if(dmmoab->lminmax[1]<dmmoab->gsindices[i]) dmmoab->lminmax[1]=dmmoab->gsindices[i];
1116f6829af0SVijay Mahadevan     }
1117f6829af0SVijay Mahadevan 
1118*304006b3SVijay Mahadevan     ierr = MPIU_Allreduce(&dmmoab->lminmax[0], &dmmoab->gminmax[0], 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1119*304006b3SVijay Mahadevan     ierr = MPIU_Allreduce(&dmmoab->lminmax[1], &dmmoab->gminmax[1], 1, MPI_INT, MPI_MAX, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1120f6829af0SVijay Mahadevan 
1121f6829af0SVijay Mahadevan     /* set the GID map */
1122f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
1123*304006b3SVijay Mahadevan       dmmoab->gsindices[i]-=dmmoab->gminmax[0];   /* zero based index needed for IS */
1124f6829af0SVijay Mahadevan     }
1125*304006b3SVijay Mahadevan     dmmoab->lminmax[0]-=dmmoab->gminmax[0];
1126*304006b3SVijay Mahadevan     dmmoab->lminmax[1]-=dmmoab->gminmax[0];
1127f6829af0SVijay Mahadevan 
1128*304006b3SVijay 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]);
1129f6829af0SVijay Mahadevan   }
113082dfd14aSVijay 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);
1131f6829af0SVijay Mahadevan 
1132f6829af0SVijay Mahadevan   {
11333f1c6e43SVijay Mahadevan     dmmoab->seqstart=((PetscInt)dmmoab->vlocal->front());
11343f1c6e43SVijay Mahadevan     dmmoab->seqend=((PetscInt)dmmoab->vlocal->back());
1135*304006b3SVijay Mahadevan     PetscInfo2(NULL, "SEQUENCE: Local [min, max] - [%D, %D]\n", dmmoab->seqstart, dmmoab->seqend);
11363f1c6e43SVijay Mahadevan 
113749d66b22SVijay Mahadevan     ierr = PetscMalloc2(dmmoab->seqend-dmmoab->seqstart+1,&dmmoab->gidmap,dmmoab->seqend-dmmoab->seqstart+1,&dmmoab->lidmap);CHKERRQ(ierr);
11383f1c6e43SVijay Mahadevan     ierr = PetscMalloc1(totsize*dmmoab->numFields,&lgmap);CHKERRQ(ierr);
1139f6829af0SVijay Mahadevan 
1140f6829af0SVijay Mahadevan     i=j=0;
1141f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1142f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
11433f1c6e43SVijay Mahadevan       vent=(PetscInt)(*iter)-dmmoab->seqstart;
1144f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1145f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1146f6829af0SVijay Mahadevan       for (f=0;f<dmmoab->numFields;f++,j++) {
11473f1c6e43SVijay Mahadevan         lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]);
1148f6829af0SVijay Mahadevan       }
1149f6829af0SVijay Mahadevan     }
1150f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1151f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
11523f1c6e43SVijay Mahadevan       vent=(PetscInt)(*iter)-dmmoab->seqstart;
1153f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1154f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1155f6829af0SVijay Mahadevan       for (f=0;f<dmmoab->numFields;f++,j++) {
11563f1c6e43SVijay Mahadevan         lgmap[j]=(bs > 1 ? dmmoab->gsindices[i]*dmmoab->numFields+f : totsize*f+dmmoab->gsindices[i]);
1157f6829af0SVijay Mahadevan       }
1158f6829af0SVijay Mahadevan     }
1159f6829af0SVijay Mahadevan 
1160f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1161f6829af0SVijay Mahadevan        1) First create a local and global vector
1162f6829af0SVijay Mahadevan        2) Create a local and global IS
1163f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1164f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1165f6829af0SVijay Mahadevan     */
1166f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
1167f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
1168f6829af0SVijay Mahadevan 
1169f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
1170f6829af0SVijay Mahadevan 
1171f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
1172f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
1173f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
1174f6829af0SVijay Mahadevan 
11753f1c6e43SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
1176f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
1177f6829af0SVijay Mahadevan 
1178f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1179f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
11803f1c6e43SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,lgmap,
1181f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
1182f6829af0SVijay Mahadevan     }
1183f6829af0SVijay Mahadevan 
1184f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
1185f6829af0SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
1186f6829af0SVijay Mahadevan 
1187f6829af0SVijay Mahadevan     /* clean up IS, Vec */
11883f1c6e43SVijay Mahadevan     ierr = PetscFree(lgmap);CHKERRQ(ierr);
1189f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1190f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1191f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1192f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1193f6829af0SVijay Mahadevan   }
1194f6829af0SVijay Mahadevan 
119549d66b22SVijay Mahadevan   dmmoab->bndyvtx = new moab::Range();
119649d66b22SVijay Mahadevan   dmmoab->bndyfaces = new moab::Range();
119749d66b22SVijay Mahadevan   dmmoab->bndyelems = new moab::Range();
1198f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
1199f6829af0SVijay Mahadevan   {
1200f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1201f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1202f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1203f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1204f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1205f6829af0SVijay Mahadevan 
1206f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
1207f6829af0SVijay 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
1208f6829af0SVijay Mahadevan 
1209f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1210f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1211f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
1212f6829af0SVijay Mahadevan 
1213f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1214f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
1215755f3dfbSVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyvtx, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
1216f6829af0SVijay Mahadevan   }
121749d66b22SVijay Mahadevan   PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyfaces->size(), dmmoab->bndyelems->size());
1218f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1219f6829af0SVijay Mahadevan }
1220f6829af0SVijay Mahadevan 
1221*304006b3SVijay Mahadevan 
1222*304006b3SVijay Mahadevan #undef __FUNCT__
1223*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateVertices"
1224*304006b3SVijay Mahadevan /*@
1225*304006b3SVijay Mahadevan   DMMoabCreateVertices - Creates and adds several vertices to the primary set represented by the DM.
1226*304006b3SVijay Mahadevan 
1227*304006b3SVijay Mahadevan   Collective on MPI_Comm
1228*304006b3SVijay Mahadevan 
1229*304006b3SVijay Mahadevan   Input Parameters:
1230*304006b3SVijay Mahadevan + dm - The DM object
1231*304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1232*304006b3SVijay Mahadevan . conn - The connectivity of the element
1233*304006b3SVijay Mahadevan . nverts - The number of vertices that form the element
1234*304006b3SVijay Mahadevan 
1235*304006b3SVijay Mahadevan   Output Parameter:
1236*304006b3SVijay Mahadevan . overts  - The list of vertices that were created (can be NULL)
1237*304006b3SVijay Mahadevan 
1238*304006b3SVijay Mahadevan   Level: beginner
1239*304006b3SVijay Mahadevan 
1240*304006b3SVijay Mahadevan .keywords: DM, create vertices
1241*304006b3SVijay Mahadevan 
1242*304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateElement()
1243*304006b3SVijay Mahadevan @*/
1244*304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateVertices(DM dm, const PetscReal* coords, PetscInt nverts, moab::Range* overts)
1245*304006b3SVijay Mahadevan {
1246*304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1247*304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1248*304006b3SVijay Mahadevan   moab::Range         verts;
1249*304006b3SVijay Mahadevan 
1250*304006b3SVijay Mahadevan   PetscFunctionBegin;
1251*304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1252*304006b3SVijay Mahadevan   PetscValidPointer(coords,2);
1253*304006b3SVijay Mahadevan 
1254*304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1255*304006b3SVijay Mahadevan 
1256*304006b3SVijay Mahadevan   /* Insert new points */
1257*304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_vertices(&coords[0],nverts,verts);MBERRNM(merr);
1258*304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset,verts);MBERRNM(merr);
1259*304006b3SVijay Mahadevan 
1260*304006b3SVijay Mahadevan   if (overts) *overts=verts;
1261*304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1262*304006b3SVijay Mahadevan }
1263*304006b3SVijay Mahadevan 
1264*304006b3SVijay Mahadevan 
1265*304006b3SVijay Mahadevan #undef __FUNCT__
1266*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateElement"
1267*304006b3SVijay Mahadevan /*@
1268*304006b3SVijay Mahadevan   DMMoabCreateElement - Adds an element of specified type to the primary set represented by the DM.
1269*304006b3SVijay Mahadevan 
1270*304006b3SVijay Mahadevan   Collective on MPI_Comm
1271*304006b3SVijay Mahadevan 
1272*304006b3SVijay Mahadevan   Input Parameters:
1273*304006b3SVijay Mahadevan + dm - The DM object
1274*304006b3SVijay Mahadevan . type - The type of element to create and add (Edge/Tri/Quad/Tet/Hex/Prism/Pyramid/Polygon/Polyhedra)
1275*304006b3SVijay Mahadevan . conn - The connectivity of the element
1276*304006b3SVijay Mahadevan . nverts - The number of vertices that form the element
1277*304006b3SVijay Mahadevan 
1278*304006b3SVijay Mahadevan   Output Parameter:
1279*304006b3SVijay Mahadevan . oelem  - The handle to the element created and added to the DM object
1280*304006b3SVijay Mahadevan 
1281*304006b3SVijay Mahadevan   Level: beginner
1282*304006b3SVijay Mahadevan 
1283*304006b3SVijay Mahadevan .keywords: DM, create element
1284*304006b3SVijay Mahadevan 
1285*304006b3SVijay Mahadevan .seealso: DMMoabCreateSubmesh(), DMMoabCreateVertices()
1286*304006b3SVijay Mahadevan @*/
1287*304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateElement(DM dm, const moab::EntityType type, const moab::EntityHandle* conn, PetscInt nverts, moab::EntityHandle* oelem)
1288*304006b3SVijay Mahadevan {
1289*304006b3SVijay Mahadevan   moab::ErrorCode     merr;
1290*304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1291*304006b3SVijay Mahadevan   moab::EntityHandle  elem;
1292*304006b3SVijay Mahadevan 
1293*304006b3SVijay Mahadevan   PetscFunctionBegin;
1294*304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1295*304006b3SVijay Mahadevan   PetscValidPointer(conn,3);
1296*304006b3SVijay Mahadevan 
1297*304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1298*304006b3SVijay Mahadevan 
1299*304006b3SVijay Mahadevan   /* Insert new element */
1300*304006b3SVijay Mahadevan   merr = dmmoab->mbiface->create_element(type,conn,nverts,elem);MBERRNM(merr);
1301*304006b3SVijay Mahadevan   merr = dmmoab->mbiface->add_entities(dmmoab->fileset,&elem,1);MBERRNM(merr);
1302*304006b3SVijay Mahadevan 
1303*304006b3SVijay Mahadevan   if (oelem) *oelem = elem;
1304*304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1305*304006b3SVijay Mahadevan }
1306*304006b3SVijay Mahadevan 
1307*304006b3SVijay Mahadevan 
1308*304006b3SVijay Mahadevan #undef __FUNCT__
1309*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabCreateSubmesh"
1310*304006b3SVijay Mahadevan /*@
1311*304006b3SVijay Mahadevan   DMMoabCreateSubmesh - Creates a sub-DM object with a set that contains all vertices/elements of the parent
1312*304006b3SVijay Mahadevan   in addition to providing support for dynamic mesh modifications. This is useful for AMR calculations to
1313*304006b3SVijay Mahadevan   create a DM object on a refined level.
1314*304006b3SVijay Mahadevan 
1315*304006b3SVijay Mahadevan   Collective on MPI_Comm
1316*304006b3SVijay Mahadevan 
1317*304006b3SVijay Mahadevan   Input Parameters:
1318*304006b3SVijay Mahadevan + dm - The DM object
1319*304006b3SVijay Mahadevan 
1320*304006b3SVijay Mahadevan   Output Parameter:
1321*304006b3SVijay Mahadevan . newdm  - The sub DM object with updated set information
1322*304006b3SVijay Mahadevan 
1323*304006b3SVijay Mahadevan   Level: advanced
1324*304006b3SVijay Mahadevan 
1325*304006b3SVijay Mahadevan .keywords: DM, sub-DM
1326*304006b3SVijay Mahadevan 
1327*304006b3SVijay Mahadevan .seealso: DMCreate(), DMMoabCreateVertices(), DMMoabCreateElement()
1328*304006b3SVijay Mahadevan @*/
1329*304006b3SVijay Mahadevan PetscErrorCode DMMoabCreateSubmesh(DM dm, DM *newdm)
1330*304006b3SVijay Mahadevan {
1331*304006b3SVijay Mahadevan   DM_Moab            *dmmoab;
1332*304006b3SVijay Mahadevan   DM_Moab            *ndmmoab;
1333*304006b3SVijay Mahadevan   moab::ErrorCode    merr;
1334*304006b3SVijay Mahadevan   PetscErrorCode     ierr;
1335*304006b3SVijay Mahadevan 
1336*304006b3SVijay Mahadevan   PetscFunctionBegin;
1337*304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1338*304006b3SVijay Mahadevan 
1339*304006b3SVijay Mahadevan   dmmoab = (DM_Moab*) dm->data;
1340*304006b3SVijay Mahadevan 
1341*304006b3SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
1342*304006b3SVijay Mahadevan   ierr = DMMoabCreateMoab(((PetscObject)dm)->comm, dmmoab->mbiface, dmmoab->pcomm, &dmmoab->ltog_tag, PETSC_NULL, newdm);CHKERRQ(ierr);
1343*304006b3SVijay Mahadevan 
1344*304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1345*304006b3SVijay Mahadevan   ndmmoab = (DM_Moab*) (*newdm)->data;
1346*304006b3SVijay Mahadevan 
1347*304006b3SVijay Mahadevan   /* set the sub-mesh's parent DM reference */
1348*304006b3SVijay Mahadevan   ndmmoab->parent = &dm;
1349*304006b3SVijay Mahadevan 
1350*304006b3SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
1351*304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->create_meshset(moab::MESHSET_SET, ndmmoab->fileset);MBERR("Creating file set failed", merr);
1352*304006b3SVijay Mahadevan 
1353*304006b3SVijay Mahadevan   /* create a meshset and then add old fileset as child */
1354*304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->vlocal);MBERR("Adding child vertices to parent failed", merr);
1355*304006b3SVijay Mahadevan   merr = ndmmoab->mbiface->add_entities(ndmmoab->fileset, *dmmoab->elocal);MBERR("Adding child elements to parent failed", merr);
1356*304006b3SVijay Mahadevan 
1357*304006b3SVijay Mahadevan   /* preserve the field association between the parent and sub-mesh objects */
1358*304006b3SVijay Mahadevan   ierr = DMMoabSetFieldNames(*newdm, dmmoab->numFields, dmmoab->fieldNames);CHKERRQ(ierr);
1359*304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1360*304006b3SVijay Mahadevan }
1361*304006b3SVijay Mahadevan 
1362*304006b3SVijay Mahadevan 
1363*304006b3SVijay Mahadevan #undef __FUNCT__
1364*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_Ascii"
1365*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_Ascii(DM dm, PetscViewer viewer)
1366*304006b3SVijay Mahadevan {
1367*304006b3SVijay Mahadevan   DM_Moab          *dmmoab = (DM_Moab*)(dm)->data;
1368*304006b3SVijay Mahadevan   const char       *name;
1369*304006b3SVijay Mahadevan   MPI_Comm          comm;
1370*304006b3SVijay Mahadevan   PetscMPIInt       size;
1371*304006b3SVijay Mahadevan   PetscErrorCode    ierr;
1372*304006b3SVijay Mahadevan 
1373*304006b3SVijay Mahadevan   PetscFunctionBegin;
1374*304006b3SVijay Mahadevan   ierr = PetscObjectGetComm((PetscObject)dm,&comm);CHKERRQ(ierr);
1375*304006b3SVijay Mahadevan   ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr);
1376*304006b3SVijay Mahadevan   ierr = PetscObjectGetName((PetscObject) dm, &name);CHKERRQ(ierr);
1377*304006b3SVijay Mahadevan   ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1378*304006b3SVijay Mahadevan   if (name) {ierr = PetscViewerASCIIPrintf(viewer, "%s in %D dimensions:\n", name, dmmoab->dim);CHKERRQ(ierr);}
1379*304006b3SVijay Mahadevan   else      {ierr = PetscViewerASCIIPrintf(viewer, "Mesh in %D dimensions:\n", dmmoab->dim);CHKERRQ(ierr);}
1380*304006b3SVijay Mahadevan   /* print details about the global mesh */
1381*304006b3SVijay Mahadevan   {
1382*304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1383*304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Sizes: cells=%D, vertices=%D, blocks=%D\n", dmmoab->n, dmmoab->nele, dmmoab->bs);CHKERRQ(ierr);
1384*304006b3SVijay Mahadevan     /* print boundary data */
1385*304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Boundary trace:\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr);
1386*304006b3SVijay Mahadevan     {
1387*304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1388*304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPrintf(viewer, "cells=%D, faces=%D, vertices=%D\n", dmmoab->bndyelems->size(), dmmoab->bndyfaces->size(), dmmoab->bndyvtx->size());CHKERRQ(ierr);
1389*304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1390*304006b3SVijay Mahadevan     }
1391*304006b3SVijay Mahadevan     /* print field data */
1392*304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPrintf(viewer, "Fields: %D components\n", dmmoab->numFields);CHKERRQ(ierr);
1393*304006b3SVijay Mahadevan     {
1394*304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
1395*304006b3SVijay Mahadevan       for (int i=0; i<dmmoab->numFields; ++i) {
1396*304006b3SVijay Mahadevan         ierr = PetscViewerASCIIPrintf(viewer, "[%D] - %s\n", i, dmmoab->fieldNames[i]);CHKERRQ(ierr);
1397*304006b3SVijay Mahadevan       }
1398*304006b3SVijay Mahadevan       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1399*304006b3SVijay Mahadevan     }
1400*304006b3SVijay Mahadevan     ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1401*304006b3SVijay Mahadevan   }
1402*304006b3SVijay Mahadevan   ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
1403*304006b3SVijay Mahadevan   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
1404*304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1405*304006b3SVijay Mahadevan }
1406*304006b3SVijay Mahadevan 
1407*304006b3SVijay Mahadevan #undef __FUNCT__
1408*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_VTK"
1409*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_VTK(DM dm,PetscViewer v)
1410*304006b3SVijay Mahadevan {
1411*304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1412*304006b3SVijay Mahadevan }
1413*304006b3SVijay Mahadevan 
1414*304006b3SVijay Mahadevan #undef __FUNCT__
1415*304006b3SVijay Mahadevan #define __FUNCT__ "DMMoabView_HDF5"
1416*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMMoabView_HDF5(DM dm,PetscViewer v)
1417*304006b3SVijay Mahadevan {
1418*304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1419*304006b3SVijay Mahadevan }
1420*304006b3SVijay Mahadevan 
1421*304006b3SVijay Mahadevan #undef __FUNCT__
1422*304006b3SVijay Mahadevan #define __FUNCT__ "DMView_Moab"
1423*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMView_Moab(DM dm,PetscViewer viewer)
1424*304006b3SVijay Mahadevan {
1425*304006b3SVijay Mahadevan   PetscBool      iascii, ishdf5, isvtk;
1426*304006b3SVijay Mahadevan   PetscErrorCode ierr;
1427*304006b3SVijay Mahadevan 
1428*304006b3SVijay Mahadevan   PetscFunctionBegin;
1429*304006b3SVijay Mahadevan   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
1430*304006b3SVijay Mahadevan   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
1431*304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERASCII, &iascii);CHKERRQ(ierr);
1432*304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERVTK,   &isvtk);CHKERRQ(ierr);
1433*304006b3SVijay Mahadevan   ierr = PetscObjectTypeCompare((PetscObject) viewer, PETSCVIEWERHDF5,  &ishdf5);CHKERRQ(ierr);
1434*304006b3SVijay Mahadevan   if (iascii) {
1435*304006b3SVijay Mahadevan     ierr = DMMoabView_Ascii(dm, viewer);CHKERRQ(ierr);
1436*304006b3SVijay Mahadevan   } else if (ishdf5) {
1437*304006b3SVijay Mahadevan #if defined(PETSC_HAVE_HDF5) && defined(MOAB_HAVE_HDF5)
1438*304006b3SVijay Mahadevan     ierr = PetscViewerPushFormat(viewer, PETSC_VIEWER_HDF5_VIZ);CHKERRQ(ierr);
1439*304006b3SVijay Mahadevan     ierr = DMMoabView_HDF5(dm, viewer);CHKERRQ(ierr);
1440*304006b3SVijay Mahadevan     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
1441*304006b3SVijay Mahadevan #else
1442*304006b3SVijay Mahadevan     SETERRQ(PetscObjectComm((PetscObject) dm), PETSC_ERR_SUP, "HDF5 not supported in this build.\nPlease reconfigure using --download-hdf5");
1443*304006b3SVijay Mahadevan #endif
1444*304006b3SVijay Mahadevan   }
1445*304006b3SVijay Mahadevan   else if (isvtk) {
1446*304006b3SVijay Mahadevan     ierr = DMMoabView_VTK(dm, viewer);CHKERRQ(ierr);
1447*304006b3SVijay Mahadevan   }
1448*304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1449*304006b3SVijay Mahadevan }
1450*304006b3SVijay Mahadevan 
1451*304006b3SVijay Mahadevan 
1452*304006b3SVijay Mahadevan #undef __FUNCT__
1453*304006b3SVijay Mahadevan #define __FUNCT__ "DMInitialize_Moab"
1454*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMInitialize_Moab(DM dm)
1455*304006b3SVijay Mahadevan {
1456*304006b3SVijay Mahadevan   PetscFunctionBegin;
1457*304006b3SVijay Mahadevan   dm->ops->view                            = DMView_Moab;
1458*304006b3SVijay Mahadevan   dm->ops->load                            = NULL /*DMLoad_Moab*/;
1459*304006b3SVijay Mahadevan   dm->ops->setfromoptions                  = DMSetFromOptions_Moab;
1460*304006b3SVijay Mahadevan   dm->ops->clone                           = DMClone_Moab;
1461*304006b3SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
1462*304006b3SVijay Mahadevan   dm->ops->createdefaultsection            = NULL;
1463*304006b3SVijay Mahadevan   dm->ops->createdefaultconstraints        = NULL;
1464*304006b3SVijay Mahadevan   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
1465*304006b3SVijay Mahadevan   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
1466*304006b3SVijay Mahadevan   dm->ops->getlocaltoglobalmapping         = NULL;
1467*304006b3SVijay Mahadevan   dm->ops->createfieldis                   = NULL;
1468*304006b3SVijay Mahadevan   dm->ops->createcoordinatedm              = NULL /*DMCreateCoordinateDM_Moab*/;
1469*304006b3SVijay Mahadevan   dm->ops->getcoloring                     = NULL;
1470*304006b3SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
1471*304006b3SVijay Mahadevan   dm->ops->createinterpolation             = DMCreateInterpolation_Moab;
1472*304006b3SVijay Mahadevan   dm->ops->getaggregates                   = NULL;
1473*304006b3SVijay Mahadevan   dm->ops->getinjection                    = NULL /*DMCreateInjection_Moab*/;
1474*304006b3SVijay Mahadevan   dm->ops->refine                          = DMRefine_Moab;
1475*304006b3SVijay Mahadevan   dm->ops->coarsen                         = DMCoarsen_Moab;
1476*304006b3SVijay Mahadevan   dm->ops->refinehierarchy                 = DMRefineHierarchy_Moab;
1477*304006b3SVijay Mahadevan   dm->ops->coarsenhierarchy                = DMCoarsenHierarchy_Moab;
1478*304006b3SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
1479*304006b3SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
1480*304006b3SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
1481*304006b3SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
1482*304006b3SVijay Mahadevan   dm->ops->destroy                         = DMDestroy_Moab;
1483*304006b3SVijay Mahadevan   dm->ops->createsubdm                     = NULL /*DMCreateSubDM_Moab*/;
1484*304006b3SVijay Mahadevan   dm->ops->getdimpoints                    = NULL /*DMGetDimPoints_Moab*/;
1485*304006b3SVijay Mahadevan   dm->ops->locatepoints                    = NULL /*DMLocatePoints_Moab*/;
1486*304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1487*304006b3SVijay Mahadevan }
1488*304006b3SVijay Mahadevan 
1489*304006b3SVijay Mahadevan 
1490*304006b3SVijay Mahadevan #undef __FUNCT__
1491*304006b3SVijay Mahadevan #define __FUNCT__ "DMClone_Moab"
1492*304006b3SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMClone_Moab(DM dm, DM *newdm)
1493*304006b3SVijay Mahadevan {
1494*304006b3SVijay Mahadevan   PetscErrorCode     ierr;
1495*304006b3SVijay Mahadevan 
1496*304006b3SVijay Mahadevan   PetscFunctionBegin;
1497*304006b3SVijay Mahadevan   ierr = PetscObjectChangeTypeName((PetscObject) *newdm, DMMOAB);CHKERRQ(ierr);
1498*304006b3SVijay Mahadevan 
1499*304006b3SVijay Mahadevan   /* get all the necessary handles from the private DM object */
1500*304006b3SVijay Mahadevan   (*newdm)->data = (DM_Moab*) dm->data;
1501*304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct++;
1502*304006b3SVijay Mahadevan 
1503*304006b3SVijay Mahadevan   ierr = DMInitialize_Moab(*newdm);CHKERRQ(ierr);
1504*304006b3SVijay Mahadevan   PetscFunctionReturn(0);
1505*304006b3SVijay Mahadevan }
1506*304006b3SVijay Mahadevan 
1507*304006b3SVijay Mahadevan 
1508*304006b3SVijay Mahadevan #undef __FUNCT__
1509*304006b3SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab"
1510f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1511f6829af0SVijay Mahadevan {
1512f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1513f6829af0SVijay Mahadevan 
1514f6829af0SVijay Mahadevan   PetscFunctionBegin;
1515f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1516f90c3b0eSVijay Mahadevan   ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr);
1517f6829af0SVijay Mahadevan 
1518f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1519f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1520f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1521f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1522f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1523f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1524f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1525f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1526c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_map = NULL;
1527c528d872SBarry Smith   ((DM_Moab*)dm->data)->ltog_sendrecv = NULL;
1528f6829af0SVijay Mahadevan 
1529*304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->refct = 1;
1530*304006b3SVijay Mahadevan   ((DM_Moab*)dm->data)->parent = NULL;
1531f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1532f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1533f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1534f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1535f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1536f6829af0SVijay Mahadevan 
1537*304006b3SVijay Mahadevan   ierr = DMInitialize_Moab(dm);CHKERRQ(ierr);
1538f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1539f6829af0SVijay Mahadevan }
1540f6829af0SVijay Mahadevan 
1541