xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 63cd93b22fa1f994eb1c99f2b3baee2e51ca13b2)
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;
81853cdec3SJed Brown   DM_Moab        *dmmoab;
821d72bce8STim Tautges 
831d72bce8STim Tautges   PetscFunctionBegin;
84032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
85032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
86032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
87a4d2169cSTim Tautges 
88a4d2169cSTim Tautges   if (!mbiface) {
8972ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
907d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
911d72bce8STim Tautges   }
921cec0304SVijay Mahadevan   else {
931cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
947d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
951cec0304SVijay Mahadevan   }
961cec0304SVijay Mahadevan 
97b5410836SVijay Mahadevan   /* by default the fileset = root set. This set stores the hierarchy of entities belonging to current DM */
98b5410836SVijay Mahadevan   dmmoab->fileset=0;
997d89fc02STim Tautges 
100a4d2169cSTim Tautges   if (!pcomm) {
101032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
102032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
103032b8ab6SVijay Mahadevan 
104db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
105db66d124SVijay Mahadevan        to the load_file functions to be populated. */
1060c8a2322SVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);MBERR("Creating partition set failed", merr);
107032b8ab6SVijay Mahadevan 
108db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
10972ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
11072ff976dSVijay Mahadevan   }
11172ff976dSVijay Mahadevan   else {
11272ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
113032b8ab6SVijay Mahadevan   }
114032b8ab6SVijay Mahadevan 
1154973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
1164973de03SVijay Mahadevan   dmmoab->bs = 1;
117addae81cSVijay Mahadevan   dmmoab->numFields = 1;
1182e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
1192e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
1202e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
1212e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
1222e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
1232e4e7c01SVijay Mahadevan   dmmoab->write_mode = WRITE_PART;
1244973de03SVijay Mahadevan 
1254973de03SVijay Mahadevan   /* set global ID tag handle */
1261a845d2aSVijay Mahadevan   if (ltog_tag && *ltog_tag) {
1271a845d2aSVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
128032b8ab6SVijay Mahadevan   }
129032b8ab6SVijay Mahadevan   else {
1301a845d2aSVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
1311a845d2aSVijay Mahadevan     if (ltog_tag) *ltog_tag = dmmoab->ltog_tag;
132a4d2169cSTim Tautges   }
133a4d2169cSTim Tautges 
134340f3b9aSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(MATERIAL_SET_TAG_NAME, dmmoab->material_tag);MBERRNM(merr);
135340f3b9aSVijay Mahadevan 
1364973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
137a4d2169cSTim Tautges   if (range) {
1385eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
139a4d2169cSTim Tautges   }
1401d72bce8STim Tautges   PetscFunctionReturn(0);
1411d72bce8STim Tautges }
1421d72bce8STim Tautges 
1431d72bce8STim Tautges #undef __FUNCT__
1441d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
145aa768e4cSTim Tautges /*@
146aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
147aa768e4cSTim Tautges 
148aa768e4cSTim Tautges   Collective on MPI_Comm
149aa768e4cSTim Tautges 
150aa768e4cSTim Tautges   Input Parameter:
151aa768e4cSTim Tautges . dm    - The DMMoab object being set
152aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
153aa768e4cSTim Tautges 
154aa768e4cSTim Tautges   Level: beginner
155aa768e4cSTim Tautges 
156aa768e4cSTim Tautges .keywords: DMMoab, create
157aa768e4cSTim Tautges @*/
1581d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
1591d72bce8STim Tautges {
160032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
161032b8ab6SVijay Mahadevan 
1621d72bce8STim Tautges   PetscFunctionBegin;
1631d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1641cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
165032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
166032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
167032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
1681d72bce8STim Tautges   PetscFunctionReturn(0);
1691d72bce8STim Tautges }
1701d72bce8STim Tautges 
1711d72bce8STim Tautges 
1721d72bce8STim Tautges #undef __FUNCT__
1731d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
174aa768e4cSTim Tautges /*@
175aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
176aa768e4cSTim Tautges 
177aa768e4cSTim Tautges   Collective on MPI_Comm
178aa768e4cSTim Tautges 
179aa768e4cSTim Tautges   Input Parameter:
180aa768e4cSTim Tautges . dm    - The DMMoab object being set
181aa768e4cSTim Tautges 
182aa768e4cSTim Tautges   Output Parameter:
183aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
184aa768e4cSTim Tautges 
185aa768e4cSTim Tautges   Level: beginner
186aa768e4cSTim Tautges 
187aa768e4cSTim Tautges .keywords: DMMoab, create
188aa768e4cSTim Tautges @*/
1891d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
1901d72bce8STim Tautges {
1911d72bce8STim Tautges   PetscFunctionBegin;
1921d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
193032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1941d72bce8STim Tautges   PetscFunctionReturn(0);
1951d72bce8STim Tautges }
1961d72bce8STim Tautges 
1971d72bce8STim Tautges 
1981d72bce8STim Tautges #undef __FUNCT__
1991d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
200aa768e4cSTim Tautges /*@
201aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
202aa768e4cSTim Tautges 
203aa768e4cSTim Tautges   Collective on MPI_Comm
204aa768e4cSTim Tautges 
205aa768e4cSTim Tautges   Input Parameter:
206aa768e4cSTim Tautges . dm      - The DMMoab object being set
207aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
208aa768e4cSTim Tautges 
209aa768e4cSTim Tautges   Level: beginner
210aa768e4cSTim Tautges 
211aa768e4cSTim Tautges .keywords: DMMoab, create
212aa768e4cSTim Tautges @*/
213a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
2141d72bce8STim Tautges {
215032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
216032b8ab6SVijay Mahadevan 
2171d72bce8STim Tautges   PetscFunctionBegin;
2181d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2191cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
220032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
221032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
222032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2231d72bce8STim Tautges   PetscFunctionReturn(0);
2241d72bce8STim Tautges }
2251d72bce8STim Tautges 
2261d72bce8STim Tautges 
2271d72bce8STim Tautges #undef __FUNCT__
2281d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
229aa768e4cSTim Tautges /*@
230aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
231aa768e4cSTim Tautges 
232aa768e4cSTim Tautges   Collective on MPI_Comm
233aa768e4cSTim Tautges 
234aa768e4cSTim Tautges   Input Parameter:
235aa768e4cSTim Tautges . dm      - The DMMoab object being set
236aa768e4cSTim Tautges 
237aa768e4cSTim Tautges   Output Parameter:
238aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
239aa768e4cSTim Tautges 
240aa768e4cSTim Tautges   Level: beginner
241aa768e4cSTim Tautges 
242aa768e4cSTim Tautges .keywords: DMMoab, create
243aa768e4cSTim Tautges @*/
244a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
2451d72bce8STim Tautges {
2469426e041SSatish Balay   PetscErrorCode   ierr;
247cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
248cabb514dSBarry Smith 
2491d72bce8STim Tautges   PetscFunctionBegin;
2501d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
251cabb514dSBarry Smith   ierr = PetscCitationsRegister("@techreport{tautges_moab:_2004,\n  type = {{SAND2004-1592}},\n  title = {{MOAB:} A Mesh-Oriented Database},  institution = {Sandia National Laboratories},\n  author = {Tautges, T. J. and Meyers, R. and Merkley, K. and Stimpson, C. and Ernst, C.},\n  year = {2004},  note = {Report}\n}\n",&cite);CHKERRQ(ierr);
252a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2531d72bce8STim Tautges   PetscFunctionReturn(0);
2541d72bce8STim Tautges }
2551d72bce8STim Tautges 
2561d72bce8STim Tautges 
2571d72bce8STim Tautges #undef __FUNCT__
2585eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
259aa768e4cSTim Tautges /*@
2605eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
261aa768e4cSTim Tautges 
262aa768e4cSTim Tautges   Collective on MPI_Comm
263aa768e4cSTim Tautges 
264aa768e4cSTim Tautges   Input Parameter:
265aa768e4cSTim Tautges . dm    - The DMMoab object being set
266aa768e4cSTim Tautges . range - The entities treated by this DMMoab
267aa768e4cSTim Tautges 
268aa768e4cSTim Tautges   Level: beginner
269aa768e4cSTim Tautges 
270aa768e4cSTim Tautges .keywords: DMMoab, create
271aa768e4cSTim Tautges @*/
2725eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
2731d72bce8STim Tautges {
274032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
275032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
276fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
277032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
278032b8ab6SVijay Mahadevan 
2791d72bce8STim Tautges   PetscFunctionBegin;
2801d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
281032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
282032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
283fd3326ddSVijay Mahadevan 
284032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
285fd3326ddSVijay Mahadevan 
286fd3326ddSVijay Mahadevan   /* filter based on parallel status */
287fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
288fd3326ddSVijay Mahadevan 
289fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
290fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
291fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
292fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
293fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
294fd3326ddSVijay Mahadevan 
295fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
296032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
297032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
298032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
2991d72bce8STim Tautges   PetscFunctionReturn(0);
3001d72bce8STim Tautges }
3011d72bce8STim Tautges 
3021d72bce8STim Tautges 
3031d72bce8STim Tautges #undef __FUNCT__
3048d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices"
3058d8d51c8SVijay Mahadevan /*@
3068d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
3078d8d51c8SVijay Mahadevan 
3088d8d51c8SVijay Mahadevan   Collective on MPI_Comm
3098d8d51c8SVijay Mahadevan 
3108d8d51c8SVijay Mahadevan   Input Parameter:
3118d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3128d8d51c8SVijay Mahadevan 
3138d8d51c8SVijay Mahadevan   Output Parameter:
3148d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3158d8d51c8SVijay Mahadevan 
3168d8d51c8SVijay Mahadevan   Level: beginner
3178d8d51c8SVijay Mahadevan 
3188d8d51c8SVijay Mahadevan .keywords: DMMoab, create
3198d8d51c8SVijay Mahadevan @*/
3208d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
3218d8d51c8SVijay Mahadevan {
3228d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3238d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3248d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3258d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3268d8d51c8SVijay Mahadevan }
3278d8d51c8SVijay Mahadevan 
3288d8d51c8SVijay Mahadevan 
3298d8d51c8SVijay Mahadevan 
3308d8d51c8SVijay Mahadevan #undef __FUNCT__
3315eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
332aa768e4cSTim Tautges /*@
3335eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
334aa768e4cSTim Tautges 
335aa768e4cSTim Tautges   Collective on MPI_Comm
336aa768e4cSTim Tautges 
337aa768e4cSTim Tautges   Input Parameter:
338aa768e4cSTim Tautges . dm    - The DMMoab object being set
339aa768e4cSTim Tautges 
340aa768e4cSTim Tautges   Output Parameter:
3415eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
3425eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
343aa768e4cSTim Tautges 
344aa768e4cSTim Tautges   Level: beginner
345aa768e4cSTim Tautges 
346aa768e4cSTim Tautges .keywords: DMMoab, create
347aa768e4cSTim Tautges @*/
348351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost)
3491d72bce8STim Tautges {
3501d72bce8STim Tautges   PetscFunctionBegin;
3511d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
352351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
353351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3541d72bce8STim Tautges   PetscFunctionReturn(0);
3551d72bce8STim Tautges }
3561d72bce8STim Tautges 
3571d72bce8STim Tautges #undef __FUNCT__
3585eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
3595eb88e9dSVijay Mahadevan /*@
3605eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3615eb88e9dSVijay Mahadevan 
3625eb88e9dSVijay Mahadevan   Collective on MPI_Comm
3635eb88e9dSVijay Mahadevan 
3645eb88e9dSVijay Mahadevan   Input Parameter:
3655eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3665eb88e9dSVijay Mahadevan 
3675eb88e9dSVijay Mahadevan   Output Parameter:
3685eb88e9dSVijay Mahadevan . range - The entities owned locally
3695eb88e9dSVijay Mahadevan 
3705eb88e9dSVijay Mahadevan   Level: beginner
3715eb88e9dSVijay Mahadevan 
3725eb88e9dSVijay Mahadevan .keywords: DMMoab, create
3735eb88e9dSVijay Mahadevan @*/
374351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range)
3755eb88e9dSVijay Mahadevan {
3765eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3775eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
378351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3791cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3801cec0304SVijay Mahadevan }
3811cec0304SVijay Mahadevan 
3821cec0304SVijay Mahadevan 
3831cec0304SVijay Mahadevan #undef __FUNCT__
3841cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
3851cec0304SVijay Mahadevan /*@
3861cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3871cec0304SVijay Mahadevan 
3881cec0304SVijay Mahadevan   Collective on MPI_Comm
3891cec0304SVijay Mahadevan 
3901cec0304SVijay Mahadevan   Input Parameter:
3911cec0304SVijay Mahadevan . dm    - The DMMoab object being set
3921cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
3931cec0304SVijay Mahadevan 
3941cec0304SVijay Mahadevan   Level: beginner
3951cec0304SVijay Mahadevan 
3961cec0304SVijay Mahadevan .keywords: DMMoab, create
3971cec0304SVijay Mahadevan @*/
3981cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
3991cec0304SVijay Mahadevan {
4001cec0304SVijay Mahadevan   moab::ErrorCode merr;
4011cec0304SVijay Mahadevan   PetscErrorCode  ierr;
4021cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
4031cec0304SVijay Mahadevan 
4041cec0304SVijay Mahadevan   PetscFunctionBegin;
4051cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4061cec0304SVijay Mahadevan   dmmoab->elocal->clear();
4071cec0304SVijay Mahadevan   dmmoab->eghost->clear();
4081cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
4091cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
4101cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
4111cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
41241dd5348SVijay Mahadevan   dmmoab->neleghost=dmmoab->eghost->size();
4131cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4148cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
4155eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
4165eb88e9dSVijay Mahadevan }
4175eb88e9dSVijay Mahadevan 
4185eb88e9dSVijay Mahadevan 
4195eb88e9dSVijay Mahadevan #undef __FUNCT__
4201d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
421aa768e4cSTim Tautges /*@
422aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
423aa768e4cSTim Tautges 
424aa768e4cSTim Tautges   Collective on MPI_Comm
425aa768e4cSTim Tautges 
426aa768e4cSTim Tautges   Input Parameter:
427aa768e4cSTim Tautges . dm      - The DMMoab object being set
428aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
429aa768e4cSTim Tautges 
430aa768e4cSTim Tautges   Level: beginner
431aa768e4cSTim Tautges 
432aa768e4cSTim Tautges .keywords: DMMoab, create
433aa768e4cSTim Tautges @*/
4341d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4351d72bce8STim Tautges {
4361d72bce8STim Tautges   PetscFunctionBegin;
4371d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4381d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4391d72bce8STim Tautges   PetscFunctionReturn(0);
4401d72bce8STim Tautges }
4411d72bce8STim Tautges 
4421d72bce8STim Tautges 
4431d72bce8STim Tautges #undef __FUNCT__
4441d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
445aa768e4cSTim Tautges /*@
446aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
447aa768e4cSTim Tautges 
448aa768e4cSTim Tautges   Collective on MPI_Comm
449aa768e4cSTim Tautges 
450aa768e4cSTim Tautges   Input Parameter:
451aa768e4cSTim Tautges . dm      - The DMMoab object being set
452aa768e4cSTim Tautges 
453aa768e4cSTim Tautges   Output Parameter:
454aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
455aa768e4cSTim Tautges 
456aa768e4cSTim Tautges   Level: beginner
457aa768e4cSTim Tautges 
458aa768e4cSTim Tautges .keywords: DMMoab, create
459aa768e4cSTim Tautges @*/
4601d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
4611d72bce8STim Tautges {
4621d72bce8STim Tautges   PetscFunctionBegin;
4631d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4641d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4651d72bce8STim Tautges   PetscFunctionReturn(0);
4661d72bce8STim Tautges }
4671d72bce8STim Tautges 
4681d72bce8STim Tautges 
4691d72bce8STim Tautges #undef __FUNCT__
4701d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
471aa768e4cSTim Tautges /*@
472aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
473aa768e4cSTim Tautges 
474aa768e4cSTim Tautges   Collective on MPI_Comm
475aa768e4cSTim Tautges 
476aa768e4cSTim Tautges   Input Parameter:
477aa768e4cSTim Tautges . dm - The DMMoab object being set
478aa768e4cSTim Tautges . bs - The block size used with this DMMoab
479aa768e4cSTim Tautges 
480aa768e4cSTim Tautges   Level: beginner
481aa768e4cSTim Tautges 
482aa768e4cSTim Tautges .keywords: DMMoab, create
483aa768e4cSTim Tautges @*/
4841d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4851d72bce8STim Tautges {
4861d72bce8STim Tautges   PetscFunctionBegin;
4871d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4881d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4891d72bce8STim Tautges   PetscFunctionReturn(0);
4901d72bce8STim Tautges }
4911d72bce8STim Tautges 
4921d72bce8STim Tautges 
4931d72bce8STim Tautges #undef __FUNCT__
4941d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
495aa768e4cSTim Tautges /*@
496aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
497aa768e4cSTim Tautges 
498aa768e4cSTim Tautges   Collective on MPI_Comm
499aa768e4cSTim Tautges 
500aa768e4cSTim Tautges   Input Parameter:
501aa768e4cSTim Tautges . dm - The DMMoab object being set
502aa768e4cSTim Tautges 
503aa768e4cSTim Tautges   Output Parameter:
504aa768e4cSTim Tautges . bs - The block size used with this DMMoab
505aa768e4cSTim Tautges 
506aa768e4cSTim Tautges   Level: beginner
507aa768e4cSTim Tautges 
508aa768e4cSTim Tautges .keywords: DMMoab, create
509aa768e4cSTim Tautges @*/
5101d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
5111d72bce8STim Tautges {
5121d72bce8STim Tautges   PetscFunctionBegin;
5131d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5141d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
5151d72bce8STim Tautges   PetscFunctionReturn(0);
5161d72bce8STim Tautges }
5171d72bce8STim Tautges 
5181cec0304SVijay Mahadevan 
5191cec0304SVijay Mahadevan #undef __FUNCT__
520212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
521212ad6d1SVijay Mahadevan /*@
522212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
523212ad6d1SVijay Mahadevan 
52400cc10feSVijay Mahadevan   Collective on DM
525212ad6d1SVijay Mahadevan 
526212ad6d1SVijay Mahadevan   Input Parameter:
527212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
528212ad6d1SVijay Mahadevan 
529212ad6d1SVijay Mahadevan   Output Parameter:
53000cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance
53100cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance
532212ad6d1SVijay Mahadevan 
533212ad6d1SVijay Mahadevan   Level: beginner
534212ad6d1SVijay Mahadevan 
535212ad6d1SVijay Mahadevan .keywords: DMMoab, create
536212ad6d1SVijay Mahadevan @*/
53741dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg)
538212ad6d1SVijay Mahadevan {
539212ad6d1SVijay Mahadevan   PetscFunctionBegin;
540212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
54141dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->nele;
54241dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->n;
543212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
544212ad6d1SVijay Mahadevan }
545212ad6d1SVijay Mahadevan 
546212ad6d1SVijay Mahadevan 
547212ad6d1SVijay Mahadevan #undef __FUNCT__
548212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
549212ad6d1SVijay Mahadevan /*@
550212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
551212ad6d1SVijay Mahadevan 
55200cc10feSVijay Mahadevan   Collective on DM
553212ad6d1SVijay Mahadevan 
554212ad6d1SVijay Mahadevan   Input Parameter:
555212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
556212ad6d1SVijay Mahadevan 
557212ad6d1SVijay Mahadevan   Output Parameter:
558b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
55900cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
56000cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
56100cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor
562212ad6d1SVijay Mahadevan 
563212ad6d1SVijay Mahadevan   Level: beginner
564212ad6d1SVijay Mahadevan 
565212ad6d1SVijay Mahadevan .keywords: DMMoab, create
566212ad6d1SVijay Mahadevan @*/
56741dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg)
568212ad6d1SVijay Mahadevan {
569212ad6d1SVijay Mahadevan   PetscFunctionBegin;
570212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
57141dd5348SVijay Mahadevan   if(nel) *nel = ((DM_Moab*)dm->data)->neleloc;
57241dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->neleghost;
57341dd5348SVijay Mahadevan   if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
57441dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
575212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
576212ad6d1SVijay Mahadevan }
577212ad6d1SVijay Mahadevan 
578212ad6d1SVijay Mahadevan 
579212ad6d1SVijay Mahadevan #undef __FUNCT__
58000cc10feSVijay Mahadevan #define __FUNCT__ "DMMoabGetOffset"
58100cc10feSVijay Mahadevan /*@
58200cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
58300cc10feSVijay Mahadevan 
58400cc10feSVijay Mahadevan   Collective on MPI_Comm
58500cc10feSVijay Mahadevan 
58600cc10feSVijay Mahadevan   Input Parameter:
58700cc10feSVijay Mahadevan . dm - The DMMoab object being set
58800cc10feSVijay Mahadevan 
58900cc10feSVijay Mahadevan   Output Parameter:
59000cc10feSVijay Mahadevan . offset - The local offset for the global vector
59100cc10feSVijay Mahadevan 
59200cc10feSVijay Mahadevan   Level: beginner
59300cc10feSVijay Mahadevan 
59400cc10feSVijay Mahadevan .keywords: DMMoab, create
59500cc10feSVijay Mahadevan @*/
59600cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset)
59700cc10feSVijay Mahadevan {
59800cc10feSVijay Mahadevan   PetscFunctionBegin;
59900cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
60000cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
60100cc10feSVijay Mahadevan   PetscFunctionReturn(0);
60200cc10feSVijay Mahadevan }
60300cc10feSVijay Mahadevan 
60400cc10feSVijay Mahadevan 
60500cc10feSVijay Mahadevan #undef __FUNCT__
6064920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension"
6074920ab11SVijay Mahadevan /*@
6084920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
6094920ab11SVijay Mahadevan 
6104920ab11SVijay Mahadevan   Collective on MPI_Comm
6114920ab11SVijay Mahadevan 
6124920ab11SVijay Mahadevan   Input Parameter:
613340f3b9aSVijay Mahadevan . dm - The DMMoab object
6144920ab11SVijay Mahadevan 
6154920ab11SVijay Mahadevan   Output Parameter:
6164920ab11SVijay Mahadevan . dim - The dimension of DM
6174920ab11SVijay Mahadevan 
6184920ab11SVijay Mahadevan   Level: beginner
6194920ab11SVijay Mahadevan 
6204920ab11SVijay Mahadevan .keywords: DMMoab, create
6214920ab11SVijay Mahadevan @*/
6224920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
6234920ab11SVijay Mahadevan {
6244920ab11SVijay Mahadevan   PetscFunctionBegin;
6254920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6264920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
6274920ab11SVijay Mahadevan   PetscFunctionReturn(0);
6284920ab11SVijay Mahadevan }
6294920ab11SVijay Mahadevan 
6304920ab11SVijay Mahadevan 
631340f3b9aSVijay Mahadevan #undef __FUNCT__
632340f3b9aSVijay Mahadevan #define __FUNCT__ "DMMoabGetMaterialBlock"
633340f3b9aSVijay Mahadevan /*@
634340f3b9aSVijay Mahadevan   DMMoabGetMaterialBlock - Get the material ID corresponding to the current entity of the DM Mesh
635340f3b9aSVijay Mahadevan 
636340f3b9aSVijay Mahadevan   Collective on MPI_Comm
637340f3b9aSVijay Mahadevan 
638340f3b9aSVijay Mahadevan   Input Parameter:
639340f3b9aSVijay Mahadevan . dm - The DMMoab object
640340f3b9aSVijay Mahadevan . ehandle - The element entity handle
641340f3b9aSVijay Mahadevan 
642340f3b9aSVijay Mahadevan   Output Parameter:
643340f3b9aSVijay Mahadevan . mat - The material ID for the current entity
644340f3b9aSVijay Mahadevan 
645340f3b9aSVijay Mahadevan   Level: beginner
646340f3b9aSVijay Mahadevan 
647340f3b9aSVijay Mahadevan .keywords: DMMoab, create
648340f3b9aSVijay Mahadevan @*/
649340f3b9aSVijay Mahadevan PetscErrorCode DMMoabGetMaterialBlock(DM dm,const moab::EntityHandle ehandle, PetscInt *mat)
650340f3b9aSVijay Mahadevan {
651340f3b9aSVijay Mahadevan   DM_Moab         *dmmoab;
652340f3b9aSVijay Mahadevan   moab::ErrorCode merr;
653340f3b9aSVijay Mahadevan 
654340f3b9aSVijay Mahadevan   PetscFunctionBegin;
655340f3b9aSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
656340f3b9aSVijay Mahadevan   if (*mat) {
657340f3b9aSVijay Mahadevan     dmmoab = (DM_Moab*)(dm)->data;
658*63cd93b2SVijay Mahadevan     merr=dmmoab->mbiface->tag_get_data(dmmoab->material_tag, &ehandle, 1, mat);MBERRNM(merr);
659340f3b9aSVijay Mahadevan   }
660340f3b9aSVijay Mahadevan   PetscFunctionReturn(0);
661340f3b9aSVijay Mahadevan }
662340f3b9aSVijay Mahadevan 
6634920ab11SVijay Mahadevan 
6644920ab11SVijay Mahadevan #undef __FUNCT__
6657023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
6667023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
6677023aa44SVijay Mahadevan {
6687023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6697023aa44SVijay Mahadevan   PetscErrorCode  ierr;
6707023aa44SVijay Mahadevan   moab::ErrorCode merr;
6717023aa44SVijay Mahadevan 
6727023aa44SVijay Mahadevan   PetscFunctionBegin;
6737023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6747023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
6757023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6767023aa44SVijay Mahadevan 
6777023aa44SVijay Mahadevan   if (!vpos) {
6787023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
6797023aa44SVijay Mahadevan   }
6807023aa44SVijay Mahadevan 
6817023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6827023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
6837023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6847023aa44SVijay Mahadevan }
6857023aa44SVijay Mahadevan 
6867023aa44SVijay Mahadevan 
6877023aa44SVijay Mahadevan #undef __FUNCT__
6888d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity"
6898d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
6908d8d51c8SVijay Mahadevan {
6918d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
6928d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
6938d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
6948d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
6958d8d51c8SVijay Mahadevan 
6968d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6978d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6988d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
6998d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7008d8d51c8SVijay Mahadevan 
7018d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7028d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
7038d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
7048d8d51c8SVijay Mahadevan 
7058d8d51c8SVijay Mahadevan   if (conn) {
7068d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
7078d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
7088d8d51c8SVijay Mahadevan   }
7098d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
7108d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7118d8d51c8SVijay Mahadevan }
7128d8d51c8SVijay Mahadevan 
7138d8d51c8SVijay Mahadevan 
7148d8d51c8SVijay Mahadevan #undef __FUNCT__
7158d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity"
7168d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
7178d8d51c8SVijay Mahadevan {
7188d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
7198d8d51c8SVijay Mahadevan 
7208d8d51c8SVijay Mahadevan   PetscFunctionBegin;
7218d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7228d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
7238d8d51c8SVijay Mahadevan 
7248d8d51c8SVijay Mahadevan   if (conn) {
7258d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
7268d8d51c8SVijay Mahadevan   }
7278d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
7288d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
7298d8d51c8SVijay Mahadevan }
7308d8d51c8SVijay Mahadevan 
7318d8d51c8SVijay Mahadevan 
7328d8d51c8SVijay Mahadevan 
7338d8d51c8SVijay Mahadevan #undef __FUNCT__
7347023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
7357023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
7367023aa44SVijay Mahadevan {
7377023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7387023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
7397023aa44SVijay Mahadevan   moab::ErrorCode merr;
7407023aa44SVijay Mahadevan   PetscInt nnodes;
7417023aa44SVijay Mahadevan 
7427023aa44SVijay Mahadevan   PetscFunctionBegin;
7437023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7447023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
7457023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7467023aa44SVijay Mahadevan 
7477023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7487023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
7497023aa44SVijay Mahadevan   if (conn) *conn=connect;
7507023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
7517023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7527023aa44SVijay Mahadevan }
7537023aa44SVijay Mahadevan 
7547023aa44SVijay Mahadevan 
7557023aa44SVijay Mahadevan #undef __FUNCT__
75669263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
75769263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
75869263071SVijay Mahadevan {
75969263071SVijay Mahadevan   moab::EntityType etype;
76069263071SVijay Mahadevan   DM_Moab         *dmmoab;
76169263071SVijay Mahadevan   PetscInt         edim;
76269263071SVijay Mahadevan 
76369263071SVijay Mahadevan   PetscFunctionBegin;
76469263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
76569263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
76669263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
76769263071SVijay Mahadevan 
76869263071SVijay Mahadevan   /* get the entity type and handle accordingly */
76969263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
77069263071SVijay 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);
77169263071SVijay Mahadevan 
77269263071SVijay Mahadevan   /* get the entity dimension */
77369263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
77469263071SVijay Mahadevan 
77569263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
77669263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
7776d9eb265SVijay Mahadevan     if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
77869263071SVijay Mahadevan   }
77969263071SVijay Mahadevan   else {
78069263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
7816d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
78269263071SVijay Mahadevan     }
78369263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
7846d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
78569263071SVijay Mahadevan     }
78669263071SVijay Mahadevan   }
78769263071SVijay Mahadevan   PetscFunctionReturn(0);
78869263071SVijay Mahadevan }
78969263071SVijay Mahadevan 
79069263071SVijay Mahadevan 
79169263071SVijay Mahadevan #undef __FUNCT__
7927023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
79369263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
7947023aa44SVijay Mahadevan {
7957023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7967023aa44SVijay Mahadevan   PetscInt       i;
7977023aa44SVijay Mahadevan 
7987023aa44SVijay Mahadevan   PetscFunctionBegin;
7997023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8007023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
8017023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
8027023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8037023aa44SVijay Mahadevan 
8047023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
8056d9eb265SVijay Mahadevan     isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
8067023aa44SVijay Mahadevan   }
8077023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8087023aa44SVijay Mahadevan }
8097023aa44SVijay Mahadevan 
8107023aa44SVijay Mahadevan 
8117023aa44SVijay Mahadevan #undef __FUNCT__
8120c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers"
8136d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
8141cec0304SVijay Mahadevan {
8151cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8161cec0304SVijay Mahadevan 
8171cec0304SVijay Mahadevan   PetscFunctionBegin;
8181cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8191cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8201cec0304SVijay Mahadevan 
8216d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
8226d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
8236d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
8241cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8251cec0304SVijay Mahadevan }
8261cec0304SVijay Mahadevan 
827f6829af0SVijay Mahadevan 
828f6829af0SVijay Mahadevan #undef __FUNCT__
829f6829af0SVijay Mahadevan #define __FUNCT__ "DMDestroy_Moab"
830f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
831f6829af0SVijay Mahadevan {
832f6829af0SVijay Mahadevan   PetscErrorCode ierr;
833f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
834f6829af0SVijay Mahadevan 
835f6829af0SVijay Mahadevan   PetscFunctionBegin;
836f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
837f6829af0SVijay Mahadevan   if (dmmoab->icreatedinstance) {
838f6829af0SVijay Mahadevan     delete dmmoab->mbiface;
839f6829af0SVijay Mahadevan   }
840f6829af0SVijay Mahadevan   dmmoab->mbiface = NULL;
841f6829af0SVijay Mahadevan   dmmoab->pcomm = NULL;
842f6829af0SVijay Mahadevan   delete dmmoab->vlocal;
843f6829af0SVijay Mahadevan   delete dmmoab->vowned;
844f6829af0SVijay Mahadevan   delete dmmoab->vghost;
845f6829af0SVijay Mahadevan   delete dmmoab->elocal;
846f6829af0SVijay Mahadevan   delete dmmoab->eghost;
847f6829af0SVijay Mahadevan   delete dmmoab->bndyvtx;
848f6829af0SVijay Mahadevan   delete dmmoab->bndyfaces;
849f6829af0SVijay Mahadevan   delete dmmoab->bndyelems;
850f6829af0SVijay Mahadevan 
851f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
852f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->lidmap);CHKERRQ(ierr);
853f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->gidmap);CHKERRQ(ierr);
854f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->llmap);CHKERRQ(ierr);
855f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->lgmap);CHKERRQ(ierr);
8565905e1eaSVijay Mahadevan   ierr = PetscFree(dmmoab->dfill);CHKERRQ(ierr);
8575905e1eaSVijay Mahadevan   ierr = PetscFree(dmmoab->ofill);CHKERRQ(ierr);
858f6829af0SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
859f6829af0SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
860f6829af0SVijay Mahadevan   ierr = PetscFree(dm->data);CHKERRQ(ierr);
861f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
862f6829af0SVijay Mahadevan }
863f6829af0SVijay Mahadevan 
864f6829af0SVijay Mahadevan 
865f6829af0SVijay Mahadevan #undef __FUNCT__
8662e4e7c01SVijay Mahadevan #define __FUNCT__ "DMSetFromOptions_Moab"
8672e4e7c01SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(DM dm)
8682e4e7c01SVijay Mahadevan {
8692e4e7c01SVijay Mahadevan   PetscErrorCode ierr;
8702e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
8712e4e7c01SVijay Mahadevan 
8722e4e7c01SVijay Mahadevan   PetscFunctionBegin;
8732e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8742e4e7c01SVijay Mahadevan   ierr = PetscOptionsHead("DMMoab Options");CHKERRQ(ierr);
8752e4e7c01SVijay 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);
8762e4e7c01SVijay 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);
8772e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
8782e4e7c01SVijay 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);
8792e4e7c01SVijay 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);
8802e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr);
8812e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr);
8822e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
8832e4e7c01SVijay Mahadevan }
8842e4e7c01SVijay Mahadevan 
8852e4e7c01SVijay Mahadevan 
8862e4e7c01SVijay Mahadevan #undef __FUNCT__
887f6829af0SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
888f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
889f6829af0SVijay Mahadevan {
890f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
891f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
892f6829af0SVijay Mahadevan   Vec                     local, global;
893f6829af0SVijay Mahadevan   IS                      from,to;
894f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
895f6829af0SVijay Mahadevan   PetscInt                i,j,f,bs,gmin,lmin,lmax,vent,totsize;
896f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
897f6829af0SVijay Mahadevan   moab::Range             adjs;
898f6829af0SVijay Mahadevan 
899f6829af0SVijay Mahadevan   PetscFunctionBegin;
900f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
901f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
902f6829af0SVijay 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.");
903f6829af0SVijay Mahadevan 
904f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
905f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
906f6829af0SVijay Mahadevan   {
907f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
908f6829af0SVijay Mahadevan 
909f6829af0SVijay Mahadevan     /* filter based on parallel status */
910f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
911f6829af0SVijay Mahadevan 
912f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
913f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
914f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
915f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
916f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
917f6829af0SVijay Mahadevan 
918f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
919f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
920f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
921f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
922f6829af0SVijay Mahadevan   }
923f6829af0SVijay Mahadevan 
924f6829af0SVijay Mahadevan   {
925f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
926f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
927f6829af0SVijay Mahadevan 
928f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
929f6829af0SVijay Mahadevan     for (i=3;i>0;i--) {
930f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
931f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
932f6829af0SVijay Mahadevan 
933f6829af0SVijay Mahadevan       /* store the current mesh dimension */
934f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
935f6829af0SVijay Mahadevan         dmmoab->dim=i;
936f6829af0SVijay Mahadevan         break;
937f6829af0SVijay Mahadevan       }
938f6829af0SVijay Mahadevan     }
939f6829af0SVijay Mahadevan 
940f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
941f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
942f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
943f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
944f6829af0SVijay Mahadevan 
945f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
946f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
947f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
948f6829af0SVijay Mahadevan   }
949f6829af0SVijay Mahadevan 
950f6829af0SVijay Mahadevan   bs = dmmoab->bs;
951f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
952f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
953f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
954f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
955f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
956f6829af0SVijay Mahadevan   }
957f6829af0SVijay Mahadevan 
958f6829af0SVijay Mahadevan   totsize=dmmoab->vlocal->size();
959f6829af0SVijay 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);
960f6829af0SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr);
961f6829af0SVijay Mahadevan   {
962f6829af0SVijay Mahadevan     /* first get the local indices */
963f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
964f6829af0SVijay Mahadevan     /* next get the ghosted indices */
965f6829af0SVijay Mahadevan     if (dmmoab->nghost) {
966f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
967f6829af0SVijay Mahadevan     }
968f6829af0SVijay Mahadevan 
969f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
970f6829af0SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
971f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
972f6829af0SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
973f6829af0SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
974f6829af0SVijay Mahadevan     }
975f6829af0SVijay Mahadevan 
976f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
977f6829af0SVijay Mahadevan 
978f6829af0SVijay Mahadevan     /* set the GID map */
979f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
980f6829af0SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
981f6829af0SVijay Mahadevan     }
982f6829af0SVijay Mahadevan     lmin-=gmin;
983f6829af0SVijay Mahadevan     lmax-=gmin;
984f6829af0SVijay Mahadevan 
985f6829af0SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
986f6829af0SVijay Mahadevan   }
98782dfd14aSVijay 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);
988f6829af0SVijay Mahadevan 
989f6829af0SVijay Mahadevan   {
990f6829af0SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr);
991f6829af0SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr);
992f6829af0SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->llmap);CHKERRQ(ierr);
993f6829af0SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr);
994f6829af0SVijay Mahadevan 
995f6829af0SVijay Mahadevan     i=j=0;
996f6829af0SVijay Mahadevan     /* set the owned vertex data first */
997f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
998f6829af0SVijay Mahadevan       vent=(PetscInt)(*iter);
999f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1000f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1001f6829af0SVijay Mahadevan       if (bs > 1) {
1002f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1003f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
1004f6829af0SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
1005f6829af0SVijay Mahadevan         }
1006f6829af0SVijay Mahadevan       }
1007f6829af0SVijay Mahadevan       else {
1008f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1009f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
1010f6829af0SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
1011f6829af0SVijay Mahadevan         }
1012f6829af0SVijay Mahadevan       }
1013f6829af0SVijay Mahadevan     }
1014f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
1015f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
1016f6829af0SVijay Mahadevan       vent=(PetscInt)(*iter);
1017f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
1018f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
1019f6829af0SVijay Mahadevan       if (bs > 1) {
1020f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1021f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
1022f6829af0SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
1023f6829af0SVijay Mahadevan         }
1024f6829af0SVijay Mahadevan       }
1025f6829af0SVijay Mahadevan       else {
1026f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
1027f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
1028f6829af0SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
1029f6829af0SVijay Mahadevan         }
1030f6829af0SVijay Mahadevan       }
1031f6829af0SVijay Mahadevan     }
1032f6829af0SVijay Mahadevan 
1033f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
1034f6829af0SVijay Mahadevan        1) First create a local and global vector
1035f6829af0SVijay Mahadevan        2) Create a local and global IS
1036f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1037f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1038f6829af0SVijay Mahadevan     */
1039f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
1040f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
1041f6829af0SVijay Mahadevan 
1042f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
1043f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost);
1044f6829af0SVijay Mahadevan 
1045f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
1046f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
1047f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
1048f6829af0SVijay Mahadevan 
1049f6829af0SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
1050f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
1051f6829af0SVijay Mahadevan 
1052f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1053f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
105482dfd14aSVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,dmmoab->bs,totsize*dmmoab->numFields,dmmoab->lgmap,
1055f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
1056f6829af0SVijay Mahadevan     }
1057f6829af0SVijay Mahadevan 
1058f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
1059f6829af0SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
1060f6829af0SVijay Mahadevan 
1061f6829af0SVijay Mahadevan     /* clean up IS, Vec */
1062f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1063f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1064f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1065f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1066f6829af0SVijay Mahadevan   }
1067f6829af0SVijay Mahadevan 
1068f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
1069f6829af0SVijay Mahadevan   {
1070f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1071f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1072f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1073f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1074f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1075f6829af0SVijay Mahadevan 
1076f6829af0SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
1077f6829af0SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
1078f6829af0SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
1079f6829af0SVijay Mahadevan 
1080f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
1081f6829af0SVijay 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
1082f6829af0SVijay Mahadevan 
1083f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1084f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1085f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
1086f6829af0SVijay Mahadevan 
1087f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1088f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
1089f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
1090f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
1091f6829af0SVijay Mahadevan   }
1092f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1093f6829af0SVijay Mahadevan }
1094f6829af0SVijay Mahadevan 
1095f6829af0SVijay Mahadevan 
1096f6829af0SVijay Mahadevan #undef __FUNCT__
1097f6829af0SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab"
1098f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1099f6829af0SVijay Mahadevan {
1100f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1101f6829af0SVijay Mahadevan 
1102f6829af0SVijay Mahadevan   PetscFunctionBegin;
1103f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1104f90c3b0eSVijay Mahadevan   ierr = PetscNewLog(dm,(DM_Moab**)&dm->data);CHKERRQ(ierr);
1105f6829af0SVijay Mahadevan 
1106f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1107f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1108f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1109f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1110f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1111f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1112f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1113f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1114f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
1115f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
1116f6829af0SVijay Mahadevan 
1117f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1118f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1119f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1120f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1121f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1122f6829af0SVijay Mahadevan 
1123f6829af0SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1124f6829af0SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1125f6829af0SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1126f6829af0SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
1127f6829af0SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
11282e4e7c01SVijay Mahadevan   dm->ops->setfromoptions           = DMSetFromOptions_Moab;
1129f6829af0SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1130f6829af0SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1131f6829af0SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1132f6829af0SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1133f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1134f6829af0SVijay Mahadevan }
1135f6829af0SVijay Mahadevan 
1136