xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision cc310fdddfd1255ff354b307e63afef1e66c265d)
1b8ecf6d3SVijay Mahadevan #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 
7fd349b41STim Tautges 
8c6ef30f9SVijay Mahadevan /*MC
9c6ef30f9SVijay Mahadevan   DMMOAB = "moab" - A DM object that encapsulates an unstructured mesh described by the MOAB mesh database.
10c6ef30f9SVijay Mahadevan                     Direct access to the MOAB Interface and other mesh manipulation related objects are available
11c6ef30f9SVijay Mahadevan                     through public API. Ability to create global and local representation of Vecs containing all
12c6ef30f9SVijay Mahadevan                     unknowns in the interior and shared boundary via a transparent tag-data wrapper is provided
13c6ef30f9SVijay Mahadevan                     along with utility functions to traverse the mesh and assemble a discrete system via
14c6ef30f9SVijay Mahadevan                     field-based/blocked Vec(Get/Set) methods. Input from and output to different formats are
15c6ef30f9SVijay Mahadevan                     available.
16c6ef30f9SVijay Mahadevan 
17c6ef30f9SVijay Mahadevan   Reference: http://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html
18c6ef30f9SVijay Mahadevan 
19c6ef30f9SVijay Mahadevan   Level: intermediate
20c6ef30f9SVijay Mahadevan 
21c6ef30f9SVijay Mahadevan .seealso: DMType, DMMoabCreate(), DMCreate(), DMSetType(), DMMoabCreateMoab()
22c6ef30f9SVijay Mahadevan M*/
23c6ef30f9SVijay Mahadevan 
24c6ef30f9SVijay Mahadevan 
25fd349b41STim Tautges #undef __FUNCT__
261d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
271d72bce8STim Tautges /*@
281d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
291d72bce8STim Tautges 
301d72bce8STim Tautges   Collective on MPI_Comm
311d72bce8STim Tautges 
321d72bce8STim Tautges   Input Parameter:
331d72bce8STim Tautges . comm - The communicator for the DMMoab object
341d72bce8STim Tautges 
351d72bce8STim Tautges   Output Parameter:
36032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
371d72bce8STim Tautges 
381d72bce8STim Tautges   Level: beginner
391d72bce8STim Tautges 
401d72bce8STim Tautges .keywords: DMMoab, create
411d72bce8STim Tautges @*/
42032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
431d72bce8STim Tautges {
441d72bce8STim Tautges   PetscErrorCode ierr;
451d72bce8STim Tautges 
461d72bce8STim Tautges   PetscFunctionBegin;
47032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
48032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
49032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
501d72bce8STim Tautges   PetscFunctionReturn(0);
511d72bce8STim Tautges }
521d72bce8STim Tautges 
531d72bce8STim Tautges #undef __FUNCT__
54aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
551d72bce8STim Tautges /*@
56a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
571d72bce8STim Tautges 
581d72bce8STim Tautges   Collective on MPI_Comm
591d72bce8STim Tautges 
601d72bce8STim Tautges   Input Parameter:
611d72bce8STim Tautges . comm - The communicator for the DMMoab object
62032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
63a4d2169cSTim Tautges          along with the DMMoab
64a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
651d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
661d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
671d72bce8STim Tautges 
681d72bce8STim Tautges   Output Parameter:
69032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
701d72bce8STim Tautges 
71032b8ab6SVijay Mahadevan   Level: intermediate
721d72bce8STim Tautges 
731d72bce8STim Tautges .keywords: DMMoab, create
741d72bce8STim Tautges @*/
75032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
761d72bce8STim Tautges {
771d72bce8STim Tautges   PetscErrorCode ierr;
78032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
791cec0304SVijay Mahadevan   moab::EntityHandle partnset;
801cec0304SVijay Mahadevan   PetscInt rank, nprocs;
8185d305f5SVijay Mahadevan   DM             dmmb;
82853cdec3SJed Brown   DM_Moab        *dmmoab;
831d72bce8STim Tautges 
841d72bce8STim Tautges   PetscFunctionBegin;
85032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
8685d305f5SVijay Mahadevan 
8785d305f5SVijay Mahadevan   ierr = DMMoabCreate(comm, &dmmb);CHKERRQ(ierr);
8885d305f5SVijay Mahadevan   dmmoab = (DM_Moab*)(dmmb)->data;
89a4d2169cSTim Tautges 
90a4d2169cSTim Tautges   if (!mbiface) {
9172ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
927d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
931d72bce8STim Tautges   }
941cec0304SVijay Mahadevan   else {
951cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
967d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
971cec0304SVijay Mahadevan   }
981cec0304SVijay Mahadevan 
99b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
100b5410836SVijay Mahadevan   dmmoab->fileset=0;
1017d89fc02STim Tautges 
102a4d2169cSTim Tautges   if (!pcomm) {
103032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
104032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
105032b8ab6SVijay Mahadevan 
106db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
107db66d124SVijay Mahadevan        to the load_file functions to be populated. */
1080c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
109032b8ab6SVijay Mahadevan 
110db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
11172ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
11272ff976dSVijay Mahadevan   }
11372ff976dSVijay Mahadevan   else {
11485d305f5SVijay Mahadevan     ierr = DMMoabSetParallelComm(dmmb, pcomm);CHKERRQ(ierr);
115032b8ab6SVijay Mahadevan   }
116032b8ab6SVijay Mahadevan 
1174973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1184973de03SVijay Mahadevan   dmmoab->bs = 1;
119addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1202e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
1212e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
1222e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
1232e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1242e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
1252e4e7c01SVijay Mahadevan   dmmoab->write_mode = WRITE_PART;
1264973de03SVijay Mahadevan 
1274973de03SVijay Mahadevan   /* set global ID tag handle */
1281a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
12985d305f5SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(dmmb, *ltog_tag);CHKERRQ(ierr);
130032b8ab6SVijay Mahadevan   }
131032b8ab6SVijay Mahadevan   else {
1321a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1331a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
134a4d2169cSTim Tautges   }
135a4d2169cSTim Tautges 
136340f3b9aSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr);
137340f3b9aSVijay Mahadevan 
1384973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
139a4d2169cSTim Tautges   if (range) {
14085d305f5SVijay Mahadevan     ierr = DMMoabSetLocalVertices(dmmb, range);CHKERRQ(ierr);
141a4d2169cSTim Tautges   }
14285d305f5SVijay Mahadevan   *dmb=dmmb;
1431d72bce8STim Tautges   PetscFunctionReturn(0);
1441d72bce8STim Tautges }
1451d72bce8STim Tautges 
1461d72bce8STim Tautges #undef __FUNCT__
1471d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
148aa768e4cSTim Tautges /*@
149aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
150aa768e4cSTim Tautges 
151aa768e4cSTim Tautges   Collective on MPI_Comm
152aa768e4cSTim Tautges 
153aa768e4cSTim Tautges   Input Parameter:
154aa768e4cSTim Tautges . dm    - The DMMoab object being set
155aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
156aa768e4cSTim Tautges 
157aa768e4cSTim Tautges   Level: beginner
158aa768e4cSTim Tautges 
159aa768e4cSTim Tautges .keywords: DMMoab, create
160aa768e4cSTim Tautges @*/
1611d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
1621d72bce8STim Tautges {
163032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
164032b8ab6SVijay Mahadevan 
1651d72bce8STim Tautges   PetscFunctionBegin;
1661d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1671cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
168032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
169032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
170032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
1711d72bce8STim Tautges   PetscFunctionReturn(0);
1721d72bce8STim Tautges }
1731d72bce8STim Tautges 
1741d72bce8STim Tautges 
1751d72bce8STim Tautges #undef __FUNCT__
1761d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
177aa768e4cSTim Tautges /*@
178aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
179aa768e4cSTim Tautges 
180aa768e4cSTim Tautges   Collective on MPI_Comm
181aa768e4cSTim Tautges 
182aa768e4cSTim Tautges   Input Parameter:
183aa768e4cSTim Tautges . dm    - The DMMoab object being set
184aa768e4cSTim Tautges 
185aa768e4cSTim Tautges   Output Parameter:
186aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
187aa768e4cSTim Tautges 
188aa768e4cSTim Tautges   Level: beginner
189aa768e4cSTim Tautges 
190aa768e4cSTim Tautges .keywords: DMMoab, create
191aa768e4cSTim Tautges @*/
1921d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
1931d72bce8STim Tautges {
1941d72bce8STim Tautges   PetscFunctionBegin;
1951d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
196032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1971d72bce8STim Tautges   PetscFunctionReturn(0);
1981d72bce8STim Tautges }
1991d72bce8STim Tautges 
2001d72bce8STim Tautges 
2011d72bce8STim Tautges #undef __FUNCT__
2021d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
203aa768e4cSTim Tautges /*@
204aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance 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 . mbiface - The MOAB instance being set on this DMMoab
211aa768e4cSTim Tautges 
212aa768e4cSTim Tautges   Level: beginner
213aa768e4cSTim Tautges 
214aa768e4cSTim Tautges .keywords: DMMoab, create
215aa768e4cSTim Tautges @*/
216a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
2171d72bce8STim Tautges {
218032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
219032b8ab6SVijay Mahadevan 
2201d72bce8STim Tautges   PetscFunctionBegin;
2211d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2221cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
223032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
224032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
225032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2261d72bce8STim Tautges   PetscFunctionReturn(0);
2271d72bce8STim Tautges }
2281d72bce8STim Tautges 
2291d72bce8STim Tautges 
2301d72bce8STim Tautges #undef __FUNCT__
2311d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
232aa768e4cSTim Tautges /*@
233aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
234aa768e4cSTim Tautges 
235aa768e4cSTim Tautges   Collective on MPI_Comm
236aa768e4cSTim Tautges 
237aa768e4cSTim Tautges   Input Parameter:
238aa768e4cSTim Tautges . dm      - The DMMoab object being set
239aa768e4cSTim Tautges 
240aa768e4cSTim Tautges   Output Parameter:
241aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
242aa768e4cSTim Tautges 
243aa768e4cSTim Tautges   Level: beginner
244aa768e4cSTim Tautges 
245aa768e4cSTim Tautges .keywords: DMMoab, create
246aa768e4cSTim Tautges @*/
247a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
2481d72bce8STim Tautges {
2499426e041SSatish Balay   PetscErrorCode   ierr;
250cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
251cabb514dSBarry Smith 
2521d72bce8STim Tautges   PetscFunctionBegin;
2531d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
254cabb514dSBarry 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);
255a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2561d72bce8STim Tautges   PetscFunctionReturn(0);
2571d72bce8STim Tautges }
2581d72bce8STim Tautges 
2591d72bce8STim Tautges 
2601d72bce8STim Tautges #undef __FUNCT__
2615eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
262aa768e4cSTim Tautges /*@
2635eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
264aa768e4cSTim Tautges 
265aa768e4cSTim Tautges   Collective on MPI_Comm
266aa768e4cSTim Tautges 
267aa768e4cSTim Tautges   Input Parameter:
268aa768e4cSTim Tautges . dm    - The DMMoab object being set
269aa768e4cSTim Tautges . range - The entities treated by this DMMoab
270aa768e4cSTim Tautges 
271aa768e4cSTim Tautges   Level: beginner
272aa768e4cSTim Tautges 
273aa768e4cSTim Tautges .keywords: DMMoab, create
274aa768e4cSTim Tautges @*/
2755eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
2761d72bce8STim Tautges {
277032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
278032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
279fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
280032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
281032b8ab6SVijay Mahadevan 
2821d72bce8STim Tautges   PetscFunctionBegin;
2831d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
284032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
285032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
286fd3326ddSVijay Mahadevan 
287032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
288fd3326ddSVijay Mahadevan 
289fd3326ddSVijay Mahadevan   /* filter based on parallel status */
290fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
291fd3326ddSVijay Mahadevan 
292fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
293fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
294fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
295fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
296fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
297fd3326ddSVijay Mahadevan 
298fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
299032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
300032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
301032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
3021d72bce8STim Tautges   PetscFunctionReturn(0);
3031d72bce8STim Tautges }
3041d72bce8STim Tautges 
3051d72bce8STim Tautges 
3061d72bce8STim Tautges #undef __FUNCT__
3078d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices"
3088d8d51c8SVijay Mahadevan /*@
3098d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
3108d8d51c8SVijay Mahadevan 
3118d8d51c8SVijay Mahadevan   Collective on MPI_Comm
3128d8d51c8SVijay Mahadevan 
3138d8d51c8SVijay Mahadevan   Input Parameter:
3148d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3158d8d51c8SVijay Mahadevan 
3168d8d51c8SVijay Mahadevan   Output Parameter:
3178d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3188d8d51c8SVijay Mahadevan 
3198d8d51c8SVijay Mahadevan   Level: beginner
3208d8d51c8SVijay Mahadevan 
3218d8d51c8SVijay Mahadevan .keywords: DMMoab, create
3228d8d51c8SVijay Mahadevan @*/
3238d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
3248d8d51c8SVijay Mahadevan {
3258d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3268d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3278d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3288d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3298d8d51c8SVijay Mahadevan }
3308d8d51c8SVijay Mahadevan 
3318d8d51c8SVijay Mahadevan 
3328d8d51c8SVijay Mahadevan 
3338d8d51c8SVijay Mahadevan #undef __FUNCT__
3345eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
335aa768e4cSTim Tautges /*@
3365eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
337aa768e4cSTim Tautges 
338aa768e4cSTim Tautges   Collective on MPI_Comm
339aa768e4cSTim Tautges 
340aa768e4cSTim Tautges   Input Parameter:
341aa768e4cSTim Tautges . dm    - The DMMoab object being set
342aa768e4cSTim Tautges 
343aa768e4cSTim Tautges   Output Parameter:
3445eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
3455eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
346aa768e4cSTim Tautges 
347aa768e4cSTim Tautges   Level: beginner
348aa768e4cSTim Tautges 
349aa768e4cSTim Tautges .keywords: DMMoab, create
350aa768e4cSTim Tautges @*/
351351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost)
3521d72bce8STim Tautges {
3531d72bce8STim Tautges   PetscFunctionBegin;
3541d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
355351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
356351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3571d72bce8STim Tautges   PetscFunctionReturn(0);
3581d72bce8STim Tautges }
3591d72bce8STim Tautges 
3601d72bce8STim Tautges #undef __FUNCT__
3615eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
3625eb88e9dSVijay Mahadevan /*@
3635eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3645eb88e9dSVijay Mahadevan 
3655eb88e9dSVijay Mahadevan   Collective on MPI_Comm
3665eb88e9dSVijay Mahadevan 
3675eb88e9dSVijay Mahadevan   Input Parameter:
3685eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3695eb88e9dSVijay Mahadevan 
3705eb88e9dSVijay Mahadevan   Output Parameter:
3715eb88e9dSVijay Mahadevan . range - The entities owned locally
3725eb88e9dSVijay Mahadevan 
3735eb88e9dSVijay Mahadevan   Level: beginner
3745eb88e9dSVijay Mahadevan 
3755eb88e9dSVijay Mahadevan .keywords: DMMoab, create
3765eb88e9dSVijay Mahadevan @*/
377351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range)
3785eb88e9dSVijay Mahadevan {
3795eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3805eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
381351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3821cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3831cec0304SVijay Mahadevan }
3841cec0304SVijay Mahadevan 
3851cec0304SVijay Mahadevan 
3861cec0304SVijay Mahadevan #undef __FUNCT__
3871cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
3881cec0304SVijay Mahadevan /*@
3891cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3901cec0304SVijay Mahadevan 
3911cec0304SVijay Mahadevan   Collective on MPI_Comm
3921cec0304SVijay Mahadevan 
3931cec0304SVijay Mahadevan   Input Parameter:
3941cec0304SVijay Mahadevan . dm    - The DMMoab object being set
3951cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
3961cec0304SVijay Mahadevan 
3971cec0304SVijay Mahadevan   Level: beginner
3981cec0304SVijay Mahadevan 
3991cec0304SVijay Mahadevan .keywords: DMMoab, create
4001cec0304SVijay Mahadevan @*/
4011cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
4021cec0304SVijay Mahadevan {
4031cec0304SVijay Mahadevan   moab::ErrorCode merr;
4041cec0304SVijay Mahadevan   PetscErrorCode  ierr;
4051cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
4061cec0304SVijay Mahadevan 
4071cec0304SVijay Mahadevan   PetscFunctionBegin;
4081cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4091cec0304SVijay Mahadevan   dmmoab->elocal->clear();
4101cec0304SVijay Mahadevan   dmmoab->eghost->clear();
4111cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
4121cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
4131cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
4141cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
41541dd5348SVijay Mahadevan   dmmoab->neleghost=dmmoab->eghost->size();
4161cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4178cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
4185eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
4195eb88e9dSVijay Mahadevan }
4205eb88e9dSVijay Mahadevan 
4215eb88e9dSVijay Mahadevan 
4225eb88e9dSVijay Mahadevan #undef __FUNCT__
4231d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
424aa768e4cSTim Tautges /*@
425aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
426aa768e4cSTim Tautges 
427aa768e4cSTim Tautges   Collective on MPI_Comm
428aa768e4cSTim Tautges 
429aa768e4cSTim Tautges   Input Parameter:
430aa768e4cSTim Tautges . dm      - The DMMoab object being set
431aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
432aa768e4cSTim Tautges 
433aa768e4cSTim Tautges   Level: beginner
434aa768e4cSTim Tautges 
435aa768e4cSTim Tautges .keywords: DMMoab, create
436aa768e4cSTim Tautges @*/
4371d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4381d72bce8STim Tautges {
4391d72bce8STim Tautges   PetscFunctionBegin;
4401d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4411d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4421d72bce8STim Tautges   PetscFunctionReturn(0);
4431d72bce8STim Tautges }
4441d72bce8STim Tautges 
4451d72bce8STim Tautges 
4461d72bce8STim Tautges #undef __FUNCT__
4471d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
448aa768e4cSTim Tautges /*@
449aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
450aa768e4cSTim Tautges 
451aa768e4cSTim Tautges   Collective on MPI_Comm
452aa768e4cSTim Tautges 
453aa768e4cSTim Tautges   Input Parameter:
454aa768e4cSTim Tautges . dm      - The DMMoab object being set
455aa768e4cSTim Tautges 
456aa768e4cSTim Tautges   Output Parameter:
457aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
458aa768e4cSTim Tautges 
459aa768e4cSTim Tautges   Level: beginner
460aa768e4cSTim Tautges 
461aa768e4cSTim Tautges .keywords: DMMoab, create
462aa768e4cSTim Tautges @*/
4631d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
4641d72bce8STim Tautges {
4651d72bce8STim Tautges   PetscFunctionBegin;
4661d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4671d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4681d72bce8STim Tautges   PetscFunctionReturn(0);
4691d72bce8STim Tautges }
4701d72bce8STim Tautges 
4711d72bce8STim Tautges 
4721d72bce8STim Tautges #undef __FUNCT__
4731d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
474aa768e4cSTim Tautges /*@
475aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
476aa768e4cSTim Tautges 
477aa768e4cSTim Tautges   Collective on MPI_Comm
478aa768e4cSTim Tautges 
479aa768e4cSTim Tautges   Input Parameter:
480aa768e4cSTim Tautges . dm - The DMMoab object being set
481aa768e4cSTim Tautges . bs - The block size used with this DMMoab
482aa768e4cSTim Tautges 
483aa768e4cSTim Tautges   Level: beginner
484aa768e4cSTim Tautges 
485aa768e4cSTim Tautges .keywords: DMMoab, create
486aa768e4cSTim Tautges @*/
4871d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4881d72bce8STim Tautges {
4891d72bce8STim Tautges   PetscFunctionBegin;
4901d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4911d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4921d72bce8STim Tautges   PetscFunctionReturn(0);
4931d72bce8STim Tautges }
4941d72bce8STim Tautges 
4951d72bce8STim Tautges 
4961d72bce8STim Tautges #undef __FUNCT__
4971d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
498aa768e4cSTim Tautges /*@
499aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
500aa768e4cSTim Tautges 
501aa768e4cSTim Tautges   Collective on MPI_Comm
502aa768e4cSTim Tautges 
503aa768e4cSTim Tautges   Input Parameter:
504aa768e4cSTim Tautges . dm - The DMMoab object being set
505aa768e4cSTim Tautges 
506aa768e4cSTim Tautges   Output Parameter:
507aa768e4cSTim Tautges . bs - The block size used with this DMMoab
508aa768e4cSTim Tautges 
509aa768e4cSTim Tautges   Level: beginner
510aa768e4cSTim Tautges 
511aa768e4cSTim Tautges .keywords: DMMoab, create
512aa768e4cSTim Tautges @*/
5131d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
5141d72bce8STim Tautges {
5151d72bce8STim Tautges   PetscFunctionBegin;
5161d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5171d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
5181d72bce8STim Tautges   PetscFunctionReturn(0);
5191d72bce8STim Tautges }
5201d72bce8STim Tautges 
5211cec0304SVijay Mahadevan 
5221cec0304SVijay Mahadevan #undef __FUNCT__
523212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
524212ad6d1SVijay Mahadevan /*@
525212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
526212ad6d1SVijay Mahadevan 
52700cc10feSVijay Mahadevan   Collective on DM
528212ad6d1SVijay Mahadevan 
529212ad6d1SVijay Mahadevan   Input Parameter:
530212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
531212ad6d1SVijay Mahadevan 
532212ad6d1SVijay Mahadevan   Output Parameter:
53300cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance
53400cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance
535212ad6d1SVijay Mahadevan 
536212ad6d1SVijay Mahadevan   Level: beginner
537212ad6d1SVijay Mahadevan 
538212ad6d1SVijay Mahadevan .keywords: DMMoab, create
539212ad6d1SVijay Mahadevan @*/
54041dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg)
541212ad6d1SVijay Mahadevan {
542212ad6d1SVijay Mahadevan   PetscFunctionBegin;
543212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
54441dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->nele;
54541dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->n;
546212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
547212ad6d1SVijay Mahadevan }
548212ad6d1SVijay Mahadevan 
549212ad6d1SVijay Mahadevan 
550212ad6d1SVijay Mahadevan #undef __FUNCT__
551212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
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 
582212ad6d1SVijay Mahadevan #undef __FUNCT__
58300cc10feSVijay Mahadevan #define __FUNCT__ "DMMoabGetOffset"
58400cc10feSVijay Mahadevan /*@
58500cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
58600cc10feSVijay Mahadevan 
58700cc10feSVijay Mahadevan   Collective on MPI_Comm
58800cc10feSVijay Mahadevan 
58900cc10feSVijay Mahadevan   Input Parameter:
59000cc10feSVijay Mahadevan . dm - The DMMoab object being set
59100cc10feSVijay Mahadevan 
59200cc10feSVijay Mahadevan   Output Parameter:
59300cc10feSVijay Mahadevan . offset - The local offset for the global vector
59400cc10feSVijay Mahadevan 
59500cc10feSVijay Mahadevan   Level: beginner
59600cc10feSVijay Mahadevan 
59700cc10feSVijay Mahadevan .keywords: DMMoab, create
59800cc10feSVijay Mahadevan @*/
59900cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset)
60000cc10feSVijay Mahadevan {
60100cc10feSVijay Mahadevan   PetscFunctionBegin;
60200cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
60300cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
60400cc10feSVijay Mahadevan   PetscFunctionReturn(0);
60500cc10feSVijay Mahadevan }
60600cc10feSVijay Mahadevan 
60700cc10feSVijay Mahadevan 
60800cc10feSVijay Mahadevan #undef __FUNCT__
6094920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension"
6104920ab11SVijay Mahadevan /*@
6114920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
6124920ab11SVijay Mahadevan 
6134920ab11SVijay Mahadevan   Collective on MPI_Comm
6144920ab11SVijay Mahadevan 
6154920ab11SVijay Mahadevan   Input Parameter:
616340f3b9aSVijay Mahadevan . dm - The DMMoab object
6174920ab11SVijay Mahadevan 
6184920ab11SVijay Mahadevan   Output Parameter:
6194920ab11SVijay Mahadevan . dim - The dimension of DM
6204920ab11SVijay Mahadevan 
6214920ab11SVijay Mahadevan   Level: beginner
6224920ab11SVijay Mahadevan 
6234920ab11SVijay Mahadevan .keywords: DMMoab, create
6244920ab11SVijay Mahadevan @*/
6254920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
6264920ab11SVijay Mahadevan {
6274920ab11SVijay Mahadevan   PetscFunctionBegin;
6284920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6294920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
6304920ab11SVijay Mahadevan   PetscFunctionReturn(0);
6314920ab11SVijay Mahadevan }
6324920ab11SVijay Mahadevan 
6334920ab11SVijay Mahadevan 
634340f3b9aSVijay Mahadevan #undef __FUNCT__
635340f3b9aSVijay Mahadevan #define __FUNCT__ "DMMoabGetMaterialBlock"
636340f3b9aSVijay Mahadevan /*@
637340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
638340f3b9aSVijay Mahadevan 
639340f3b9aSVijay Mahadevan   Collective on MPI_Comm
640340f3b9aSVijay Mahadevan 
641340f3b9aSVijay Mahadevan   Input Parameter:
642340f3b9aSVijay Mahadevan . dm - The DMMoab object
643340f3b9aSVijay Mahadevan . ehandle - The element entity handle
644340f3b9aSVijay Mahadevan 
645340f3b9aSVijay Mahadevan   Output Parameter:
646340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
647340f3b9aSVijay Mahadevan 
648340f3b9aSVijay Mahadevan   Level: beginner
649340f3b9aSVijay Mahadevan 
650340f3b9aSVijay Mahadevan .keywords: DMMoab, create
651340f3b9aSVijay Mahadevan @*/
652340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat)
653340f3b9aSVijay Mahadevan {
654340f3b9aSVijay Mahadevan   DM_Moab         *dmmoab;
655340f3b9aSVijay Mahadevan   moab::ErrorCode merr;
656340f3b9aSVijay Mahadevan 
657340f3b9aSVijay Mahadevan   PetscFunctionBegin;
658340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
659340f3b9aSVijay Mahadevan   if (*mat) {
660340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab*)(dm)->data;
66163cd93b2SVijay Mahadevan     merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr);
662340f3b9aSVijay Mahadevan   }
663340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
664340f3b9aSVijay Mahadevan }
665340f3b9aSVijay Mahadevan 
6664920ab11SVijay Mahadevan 
6674920ab11SVijay Mahadevan #undef __FUNCT__
6687023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
66985d305f5SVijay Mahadevan /*@
67085d305f5SVijay Mahadevan   DMMoabGetVertexCoordinates - Get the coordinates corresponding to the requested vertex entities
67185d305f5SVijay Mahadevan 
67285d305f5SVijay Mahadevan   Collective on MPI_Comm
67385d305f5SVijay Mahadevan 
67485d305f5SVijay Mahadevan   Input Parameter:
67585d305f5SVijay Mahadevan . dm - The DMMoab object
67685d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
67785d305f5SVijay Mahadevan . conn - The vertex entity handles
67885d305f5SVijay Mahadevan 
67985d305f5SVijay Mahadevan   Output Parameter:
68085d305f5SVijay Mahadevan . vpos - The coordinates of the requested vertex entities
68185d305f5SVijay Mahadevan 
68285d305f5SVijay Mahadevan   Level: beginner
68385d305f5SVijay Mahadevan 
68485d305f5SVijay Mahadevan .seealso: DMMoabGetVertexConnectivity()
68585d305f5SVijay Mahadevan @*/
686cade3ad9SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscReal *vpos)
6877023aa44SVijay Mahadevan {
6887023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6897023aa44SVijay Mahadevan   PetscErrorCode  ierr;
6907023aa44SVijay Mahadevan   moab::ErrorCode merr;
6917023aa44SVijay Mahadevan 
6927023aa44SVijay Mahadevan   PetscFunctionBegin;
6937023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6947023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
6957023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6967023aa44SVijay Mahadevan 
6977023aa44SVijay Mahadevan   if (!vpos) {
6987ae5e5b6SVijay Mahadevan     ierr = PetscMalloc1(nconn*3, &vpos);CHKERRQ(ierr);
6997023aa44SVijay Mahadevan   }
7007023aa44SVijay Mahadevan 
7017023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7027023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
7037023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7047023aa44SVijay Mahadevan }
7057023aa44SVijay Mahadevan 
7067023aa44SVijay Mahadevan 
7077023aa44SVijay Mahadevan #undef __FUNCT__
7088d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity"
70985d305f5SVijay Mahadevan /*@
71085d305f5SVijay Mahadevan   DMMoabGetVertexConnectivity - Get the vertex adjacency for the given entity
71185d305f5SVijay Mahadevan 
71285d305f5SVijay Mahadevan   Collective on MPI_Comm
71385d305f5SVijay Mahadevan 
71485d305f5SVijay Mahadevan   Input Parameter:
71585d305f5SVijay Mahadevan . dm - The DMMoab object
71685d305f5SVijay Mahadevan . vhandle - Vertex entity handle
71785d305f5SVijay Mahadevan 
71885d305f5SVijay Mahadevan   Output Parameter:
71985d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
72085d305f5SVijay Mahadevan . conn - The vertex entity handles
72185d305f5SVijay Mahadevan 
72285d305f5SVijay Mahadevan   Level: beginner
72385d305f5SVijay Mahadevan 
72485d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabRestoreVertexConnectivity()
72585d305f5SVijay Mahadevan @*/
72685d305f5SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle vhandle,PetscInt* nconn, moab::EntityHandle **conn)
7278d8d51c8SVijay Mahadevan {
7288d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
7298d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
7308d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7318d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
7328d8d51c8SVijay Mahadevan 
7338d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7348d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7358d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
7368d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7378d8d51c8SVijay Mahadevan 
7388d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
73985d305f5SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&vhandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
7408d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
7418d8d51c8SVijay Mahadevan 
7428d8d51c8SVijay Mahadevan   if (conn) {
7438d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
7448d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
7458d8d51c8SVijay Mahadevan   }
7468d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
7478d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7488d8d51c8SVijay Mahadevan }
7498d8d51c8SVijay Mahadevan 
7508d8d51c8SVijay Mahadevan 
7518d8d51c8SVijay Mahadevan #undef __FUNCT__
7528d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity"
75385d305f5SVijay Mahadevan /*@
75485d305f5SVijay Mahadevan   DMMoabRestoreVertexConnectivity - Restore the vertex connectivity for the given entity
75585d305f5SVijay Mahadevan 
75685d305f5SVijay Mahadevan   Collective on MPI_Comm
75785d305f5SVijay Mahadevan 
75885d305f5SVijay Mahadevan   Input Parameter:
75985d305f5SVijay Mahadevan . dm - The DMMoab object
76085d305f5SVijay Mahadevan . vhandle - Vertex entity handle
76185d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
76285d305f5SVijay Mahadevan . conn - The vertex entity handles
76385d305f5SVijay Mahadevan 
76485d305f5SVijay Mahadevan   Level: beginner
76585d305f5SVijay Mahadevan 
76685d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity()
76785d305f5SVijay Mahadevan @*/
7688d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
7698d8d51c8SVijay Mahadevan {
7708d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7718d8d51c8SVijay Mahadevan 
7728d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7738d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7748d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
7758d8d51c8SVijay Mahadevan 
7768d8d51c8SVijay Mahadevan   if (conn) {
7778d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
7788d8d51c8SVijay Mahadevan   }
7798d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
7808d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7818d8d51c8SVijay Mahadevan }
7828d8d51c8SVijay Mahadevan 
7838d8d51c8SVijay Mahadevan 
7848d8d51c8SVijay Mahadevan #undef __FUNCT__
7857023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
78685d305f5SVijay Mahadevan /*@
78785d305f5SVijay Mahadevan   DMMoabGetElementConnectivity - Get the vertex adjacency for the given entity
78885d305f5SVijay Mahadevan 
78985d305f5SVijay Mahadevan   Collective on MPI_Comm
79085d305f5SVijay Mahadevan 
79185d305f5SVijay Mahadevan   Input Parameter:
79285d305f5SVijay Mahadevan . dm - The DMMoab object
79385d305f5SVijay Mahadevan . ehandle - Vertex entity handle
79485d305f5SVijay Mahadevan 
79585d305f5SVijay Mahadevan   Output Parameter:
79685d305f5SVijay Mahadevan . nconn - Number of entities whose coordinates are needed
79785d305f5SVijay Mahadevan . conn - The vertex entity handles
79885d305f5SVijay Mahadevan 
79985d305f5SVijay Mahadevan   Level: beginner
80085d305f5SVijay Mahadevan 
80185d305f5SVijay Mahadevan .seealso: DMMoabGetVertexCoordinates(), DMMoabGetVertexConnectivity(), DMMoabRestoreVertexConnectivity()
80285d305f5SVijay Mahadevan @*/
8037023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
8047023aa44SVijay Mahadevan {
8057023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8067023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
8077023aa44SVijay Mahadevan   moab::ErrorCode merr;
8087023aa44SVijay Mahadevan   PetscInt nnodes;
8097023aa44SVijay Mahadevan 
8107023aa44SVijay Mahadevan   PetscFunctionBegin;
8117023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8127023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
8137023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8147023aa44SVijay Mahadevan 
8157023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8167023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
8177023aa44SVijay Mahadevan   if (conn) *conn=connect;
8187023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
8197023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8207023aa44SVijay Mahadevan }
8217023aa44SVijay Mahadevan 
8227023aa44SVijay Mahadevan 
8237023aa44SVijay Mahadevan #undef __FUNCT__
82469263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
82585d305f5SVijay Mahadevan /*@
82685d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
82785d305f5SVijay Mahadevan 
82885d305f5SVijay Mahadevan   Collective on MPI_Comm
82985d305f5SVijay Mahadevan 
83085d305f5SVijay Mahadevan   Input Parameter:
83185d305f5SVijay Mahadevan . dm - The DMMoab object
83285d305f5SVijay Mahadevan . ent - Entity handle
83385d305f5SVijay Mahadevan 
83485d305f5SVijay Mahadevan   Output Parameter:
83585d305f5SVijay Mahadevan . ent_on_boundary - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
83685d305f5SVijay Mahadevan 
83785d305f5SVijay Mahadevan   Level: beginner
83885d305f5SVijay Mahadevan 
83985d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices()
84085d305f5SVijay Mahadevan @*/
84169263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
84269263071SVijay Mahadevan {
84369263071SVijay Mahadevan   moab::EntityType etype;
84469263071SVijay Mahadevan   DM_Moab         *dmmoab;
84569263071SVijay Mahadevan   PetscInt         edim;
84669263071SVijay Mahadevan 
84769263071SVijay Mahadevan   PetscFunctionBegin;
84869263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
84969263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
85069263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
85169263071SVijay Mahadevan 
85269263071SVijay Mahadevan   /* get the entity type and handle accordingly */
85369263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
85469263071SVijay Mahadevan   if(etype >= moab::MBPOLYHEDRON) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Entity type on the boundary skin is invalid. EntityType = %D\n",etype);
85569263071SVijay Mahadevan 
85669263071SVijay Mahadevan   /* get the entity dimension */
85769263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
85869263071SVijay Mahadevan 
85969263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
86069263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
8616d9eb265SVijay Mahadevan     if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
86269263071SVijay Mahadevan   }
86369263071SVijay Mahadevan   else {
86469263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
8656d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
86669263071SVijay Mahadevan     }
86769263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
8686d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
86969263071SVijay Mahadevan     }
87069263071SVijay Mahadevan   }
87169263071SVijay Mahadevan   PetscFunctionReturn(0);
87269263071SVijay Mahadevan }
87369263071SVijay Mahadevan 
87469263071SVijay Mahadevan 
87569263071SVijay Mahadevan #undef __FUNCT__
8767023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
87785d305f5SVijay Mahadevan /*@
87885d305f5SVijay Mahadevan   DMMoabIsEntityOnBoundary - Check whether a given entity is on the boundary (vertex, edge, face, element)
87985d305f5SVijay Mahadevan 
88085d305f5SVijay Mahadevan   Input Parameter:
88185d305f5SVijay Mahadevan . dm - The DMMoab object
88285d305f5SVijay Mahadevan . nconn - Number of handles
88385d305f5SVijay Mahadevan . cnt - Array of entity handles
88485d305f5SVijay Mahadevan 
88585d305f5SVijay Mahadevan   Output Parameter:
88685d305f5SVijay Mahadevan . isbdvtx - Array of boundary markers - PETSC_TRUE if entity on boundary; PETSC_FALSE otherwise
88785d305f5SVijay Mahadevan 
88885d305f5SVijay Mahadevan   Level: beginner
88985d305f5SVijay Mahadevan 
89085d305f5SVijay Mahadevan .seealso: DMMoabIsEntityOnBoundary()
89185d305f5SVijay Mahadevan @*/
89269263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
8937023aa44SVijay Mahadevan {
8947023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8957023aa44SVijay Mahadevan   PetscInt       i;
8967023aa44SVijay Mahadevan 
8977023aa44SVijay Mahadevan   PetscFunctionBegin;
8987023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8997023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
9007023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
9017023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9027023aa44SVijay Mahadevan 
9037023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
9046d9eb265SVijay Mahadevan     isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
9057023aa44SVijay Mahadevan   }
9067023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9077023aa44SVijay Mahadevan }
9087023aa44SVijay Mahadevan 
9097023aa44SVijay Mahadevan 
9107023aa44SVijay Mahadevan #undef __FUNCT__
9110c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers"
91285d305f5SVijay Mahadevan /*@
91385d305f5SVijay Mahadevan   DMMoabGetBoundaryMarkers - Return references to the vertices, faces, elements on the boundary
91485d305f5SVijay Mahadevan 
91585d305f5SVijay Mahadevan   Input Parameter:
91685d305f5SVijay Mahadevan . dm - The DMMoab object
91785d305f5SVijay Mahadevan 
91885d305f5SVijay Mahadevan   Output Parameter:
91985d305f5SVijay Mahadevan . bdvtx - Boundary vertices
92085d305f5SVijay Mahadevan . bdelems - Boundary elements
92185d305f5SVijay Mahadevan . bdfaces - Boundary faces
92285d305f5SVijay Mahadevan 
92385d305f5SVijay Mahadevan   Level: beginner
92485d305f5SVijay Mahadevan 
92585d305f5SVijay Mahadevan .seealso: DMMoabCheckBoundaryVertices(), DMMoabIsEntityOnBoundary()
92685d305f5SVijay Mahadevan @*/
9276d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
9281cec0304SVijay Mahadevan {
9291cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
9301cec0304SVijay Mahadevan 
9311cec0304SVijay Mahadevan   PetscFunctionBegin;
9321cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9331cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9341cec0304SVijay Mahadevan 
9356d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
9366d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
9376d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
9381cec0304SVijay Mahadevan   PetscFunctionReturn(0);
9391cec0304SVijay Mahadevan }
9401cec0304SVijay Mahadevan 
941f6829af0SVijay Mahadevan 
942f6829af0SVijay Mahadevan #undef __FUNCT__
943f6829af0SVijay Mahadevan #define __FUNCT__ "DMDestroy_Moab"
944f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
945f6829af0SVijay Mahadevan {
946f6829af0SVijay Mahadevan   PetscErrorCode ierr;
94785d305f5SVijay Mahadevan   PetscInt       i;
948f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
949f6829af0SVijay Mahadevan 
950f6829af0SVijay Mahadevan   PetscFunctionBegin;
951f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
952f6829af0SVijay Mahadevan   if (dmmoab->icreatedinstance) {
953f6829af0SVijay Mahadevan     delete dmmoab->mbiface;
954f6829af0SVijay Mahadevan   }
955f6829af0SVijay Mahadevan   dmmoab->mbiface = NULL;
956f6829af0SVijay Mahadevan   dmmoab->pcomm = NULL;
957f6829af0SVijay Mahadevan   delete dmmoab->vlocal;
958f6829af0SVijay Mahadevan   delete dmmoab->vowned;
959f6829af0SVijay Mahadevan   delete dmmoab->vghost;
960f6829af0SVijay Mahadevan   delete dmmoab->elocal;
961f6829af0SVijay Mahadevan   delete dmmoab->eghost;
962f6829af0SVijay Mahadevan   delete dmmoab->bndyvtx;
963f6829af0SVijay Mahadevan   delete dmmoab->bndyfaces;
964f6829af0SVijay Mahadevan   delete dmmoab->bndyelems;
965f6829af0SVijay Mahadevan 
966f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
9677ae5e5b6SVijay Mahadevan   ierr = PetscFree2(dmmoab->gidmap,dmmoab->lidmap);CHKERRQ(ierr);
9687ae5e5b6SVijay Mahadevan   ierr = PetscFree2(dmmoab->lgmap,dmmoab->llmap);CHKERRQ(ierr);
9695905e1eaSVijay Mahadevan   ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr);
9705905e1eaSVijay Mahadevan   ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr);
97185d305f5SVijay Mahadevan   if (dmmoab->fieldNames) {
97285d305f5SVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
97385d305f5SVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
97485d305f5SVijay Mahadevan     }
97585d305f5SVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
97685d305f5SVijay Mahadevan   }
977f6829af0SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
978f6829af0SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
979f6829af0SVijay Mahadevan   ierr = PetscFree(dm->data);CHKERRQ(ierr);
980f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
981f6829af0SVijay Mahadevan }
982f6829af0SVijay Mahadevan 
983f6829af0SVijay Mahadevan 
984f6829af0SVijay Mahadevan #undef __FUNCT__
9852e4e7c01SVijay Mahadevan #define __FUNCT__ "DMSetFromOptions_Moab"
986*cc310fddSBarry Smith PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(PetscOptions *PetscOptionsObject,DM dm)
9872e4e7c01SVijay Mahadevan {
9882e4e7c01SVijay Mahadevan   PetscErrorCode ierr;
9892e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
9902e4e7c01SVijay Mahadevan 
9912e4e7c01SVijay Mahadevan   PetscFunctionBegin;
9922e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
993*cc310fddSBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject,"DMMoab Options");CHKERRQ(ierr);
9942e4e7c01SVijay 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);
9952e4e7c01SVijay 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);
9962e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
9972e4e7c01SVijay 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);
9982e4e7c01SVijay 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);
9992e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr);
10002e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr);
10012e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
10022e4e7c01SVijay Mahadevan }
10032e4e7c01SVijay Mahadevan 
10042e4e7c01SVijay Mahadevan 
10052e4e7c01SVijay Mahadevan #undef __FUNCT__
1006f6829af0SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
1007f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
1008f6829af0SVijay Mahadevan {
1009f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
1010f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
1011f6829af0SVijay Mahadevan   Vec                     local, global;
1012f6829af0SVijay Mahadevan   IS                      from,to;
1013f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
1014f6829af0SVijay Mahadevan   PetscInt                i,j,f,bs,gmin,lmin,lmax,vent,totsize;
1015f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
1016f6829af0SVijay Mahadevan   moab::Range             adjs;
1017f6829af0SVijay Mahadevan 
1018f6829af0SVijay Mahadevan   PetscFunctionBegin;
1019f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1020f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
1021f6829af0SVijay Mahadevan   if (dmmoab->mbiface == PETSC_NULL || dmmoab->pcomm == PETSC_NULL) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ORDER, "Set the MOAB Interface and ParallelComm objects before calling SetUp.");
1022f6829af0SVijay Mahadevan 
1023f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
1024f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
1025f6829af0SVijay Mahadevan   {
1026f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
1027f6829af0SVijay Mahadevan 
1028f6829af0SVijay Mahadevan     /* filter based on parallel status */
1029f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
1030f6829af0SVijay Mahadevan 
1031f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1032f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
1033f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
1034f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
1035f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
1036f6829af0SVijay Mahadevan 
1037f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
1038f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
1039f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
1040f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1041f6829af0SVijay Mahadevan   }
1042f6829af0SVijay Mahadevan 
1043f6829af0SVijay Mahadevan   {
1044f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
1045f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
1046f6829af0SVijay Mahadevan 
1047f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
1048f6829af0SVijay Mahadevan     for (i=3;i>0;i--) {
1049f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
1050f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
1051f6829af0SVijay Mahadevan 
1052f6829af0SVijay Mahadevan       /* store the current mesh dimension */
1053f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
1054f6829af0SVijay Mahadevan         dmmoab->dim=i;
1055f6829af0SVijay Mahadevan         break;
1056f6829af0SVijay Mahadevan       }
1057f6829af0SVijay Mahadevan     }
1058f6829af0SVijay Mahadevan 
1059f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
1060f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
1061f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1062f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
1063f6829af0SVijay Mahadevan 
1064f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
1065f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
1066f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1067f6829af0SVijay Mahadevan   }
1068f6829af0SVijay Mahadevan 
1069f6829af0SVijay Mahadevan   bs = dmmoab->bs;
1070f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
1071f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
1072f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
1073f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
1074f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1075f6829af0SVijay Mahadevan   }
1076f6829af0SVijay Mahadevan 
1077f6829af0SVijay Mahadevan   totsize=dmmoab->vlocal->size();
1078f6829af0SVijay Mahadevan   if (totsize != dmmoab->nloc+dmmoab->nghost) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Mismatch between local and owned+ghost vertices. %D != %D.",totsize,dmmoab->nloc+dmmoab->nghost);
10797ae5e5b6SVijay Mahadevan   ierr = PetscMalloc1(totsize,&dmmoab->gsindices);CHKERRQ(ierr);
1080f6829af0SVijay Mahadevan   {
1081f6829af0SVijay Mahadevan     /* first get the local indices */
1082f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
1083f6829af0SVijay Mahadevan     /* next get the ghosted indices */
1084f6829af0SVijay Mahadevan     if (dmmoab->nghost) {
1085f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1086f6829af0SVijay Mahadevan     }
1087f6829af0SVijay Mahadevan 
1088f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1089f6829af0SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
1090f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
1091f6829af0SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
1092f6829af0SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
1093f6829af0SVijay Mahadevan     }
1094f6829af0SVijay Mahadevan 
1095f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1096f6829af0SVijay Mahadevan 
1097f6829af0SVijay Mahadevan     /* set the GID map */
1098f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
1099f6829af0SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
1100f6829af0SVijay Mahadevan     }
1101f6829af0SVijay Mahadevan     lmin-=gmin;
1102f6829af0SVijay Mahadevan     lmax-=gmin;
1103f6829af0SVijay Mahadevan 
1104f6829af0SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
1105f6829af0SVijay Mahadevan   }
110682dfd14aSVijay 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);
1107f6829af0SVijay Mahadevan 
1108f6829af0SVijay Mahadevan   {
11097ae5e5b6SVijay Mahadevan     i=(PetscInt)dmmoab->vlocal->back()+1;
11107ae5e5b6SVijay Mahadevan     //i=(PetscInt)(dmmoab->vlocal->back()-dmmoab->vlocal->front())+1;
11117ae5e5b6SVijay Mahadevan     j=totsize*dmmoab->numFields;
11127ae5e5b6SVijay Mahadevan     ierr = PetscMalloc2(i,&dmmoab->gidmap,i,&dmmoab->lidmap);CHKERRQ(ierr);
11137ae5e5b6SVijay Mahadevan     ierr = PetscMalloc2(j,&dmmoab->lgmap,j,&dmmoab->llmap);CHKERRQ(ierr);
1114f6829af0SVijay Mahadevan 
1115f6829af0SVijay Mahadevan     i=j=0;
1116f6829af0SVijay Mahadevan     /* set the owned vertex data first */
1117f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
1118f6829af0SVijay Mahadevan       vent=(PetscInt)(*iter);
1119f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1120f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1121f6829af0SVijay Mahadevan       if (bs > 1) {
1122f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1123f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
1124f6829af0SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
1125f6829af0SVijay Mahadevan         }
1126f6829af0SVijay Mahadevan       }
1127f6829af0SVijay Mahadevan       else {
1128f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1129f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
1130f6829af0SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
1131f6829af0SVijay Mahadevan         }
1132f6829af0SVijay Mahadevan       }
1133f6829af0SVijay Mahadevan     }
1134f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1135f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
1136f6829af0SVijay Mahadevan       vent=(PetscInt)(*iter);
1137f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1138f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1139f6829af0SVijay Mahadevan       if (bs > 1) {
1140f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1141f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
1142f6829af0SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
1143f6829af0SVijay Mahadevan         }
1144f6829af0SVijay Mahadevan       }
1145f6829af0SVijay Mahadevan       else {
1146f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1147f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
1148f6829af0SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
1149f6829af0SVijay Mahadevan         }
1150f6829af0SVijay Mahadevan       }
1151f6829af0SVijay Mahadevan     }
1152f6829af0SVijay Mahadevan 
1153f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1154f6829af0SVijay Mahadevan        1) First create a local and global vector
1155f6829af0SVijay Mahadevan        2) Create a local and global IS
1156f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1157f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1158f6829af0SVijay Mahadevan     */
1159f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
1160f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
1161f6829af0SVijay Mahadevan 
1162f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
1163f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost);
1164f6829af0SVijay Mahadevan 
1165f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
1166f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
1167f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
1168f6829af0SVijay Mahadevan 
1169f6829af0SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
1170f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
1171f6829af0SVijay Mahadevan 
1172f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1173f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
117482dfd14aSVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,dmmoab->lgmap,
1175f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
1176f6829af0SVijay Mahadevan     }
1177f6829af0SVijay Mahadevan 
1178f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
1179f6829af0SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
1180f6829af0SVijay Mahadevan 
1181f6829af0SVijay Mahadevan     /* clean up IS, Vec */
1182f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1183f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1184f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1185f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1186f6829af0SVijay Mahadevan   }
1187f6829af0SVijay Mahadevan 
1188f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
1189f6829af0SVijay Mahadevan   {
1190f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1191f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1192f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1193f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1194f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1195f6829af0SVijay Mahadevan 
1196f6829af0SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
1197f6829af0SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
1198f6829af0SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
1199f6829af0SVijay Mahadevan 
1200f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
1201f6829af0SVijay 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
1202f6829af0SVijay Mahadevan 
1203f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1204f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1205f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
1206f6829af0SVijay Mahadevan 
1207f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1208f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
1209f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
1210f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
1211f6829af0SVijay Mahadevan   }
1212f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1213f6829af0SVijay Mahadevan }
1214f6829af0SVijay Mahadevan 
1215f6829af0SVijay Mahadevan #undef __FUNCT__
1216f6829af0SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab"
1217f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1218f6829af0SVijay Mahadevan {
1219f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1220f6829af0SVijay Mahadevan 
1221f6829af0SVijay Mahadevan   PetscFunctionBegin;
1222f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1223f90c3b0eSVijay Mahadevan   ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr);
1224f6829af0SVijay Mahadevan 
1225f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1226f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1227f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1228f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1229f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1230f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1231f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1232f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1233f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
1234f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
1235f6829af0SVijay Mahadevan 
1236f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1237f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1238f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1239f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1240f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1241f6829af0SVijay Mahadevan 
1242f6829af0SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1243f6829af0SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1244f6829af0SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1245f6829af0SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
1246f6829af0SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
12472e4e7c01SVijay Mahadevan   dm->ops->setfromoptions           = DMSetFromOptions_Moab;
1248f6829af0SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1249f6829af0SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1250f6829af0SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1251f6829af0SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1252f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1253f6829af0SVijay Mahadevan }
1254f6829af0SVijay Mahadevan 
1255