xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 2e4e7c01f2fc776e49aa0e3bac11897d06784bfb)
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;
118*2e4e7c01SVijay Mahadevan   dmmoab->rw_dbglevel = 0;
119*2e4e7c01SVijay Mahadevan   dmmoab->partition_by_rank = PETSC_FALSE;
120*2e4e7c01SVijay Mahadevan   dmmoab->extra_read_options[0] = '\0';
121*2e4e7c01SVijay Mahadevan   dmmoab->extra_write_options[0] = '\0';
122*2e4e7c01SVijay Mahadevan   dmmoab->read_mode = READ_PART;
123*2e4e7c01SVijay 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 
1344973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
135a4d2169cSTim Tautges   if (range) {
1365eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
137a4d2169cSTim Tautges   }
1381d72bce8STim Tautges   PetscFunctionReturn(0);
1391d72bce8STim Tautges }
1401d72bce8STim Tautges 
1411d72bce8STim Tautges #undef __FUNCT__
1421d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
143aa768e4cSTim Tautges /*@
144aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
145aa768e4cSTim Tautges 
146aa768e4cSTim Tautges   Collective on MPI_Comm
147aa768e4cSTim Tautges 
148aa768e4cSTim Tautges   Input Parameter:
149aa768e4cSTim Tautges . dm    - The DMMoab object being set
150aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
151aa768e4cSTim Tautges 
152aa768e4cSTim Tautges   Level: beginner
153aa768e4cSTim Tautges 
154aa768e4cSTim Tautges .keywords: DMMoab, create
155aa768e4cSTim Tautges @*/
1561d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
1571d72bce8STim Tautges {
158032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
159032b8ab6SVijay Mahadevan 
1601d72bce8STim Tautges   PetscFunctionBegin;
1611d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1621cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
163032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
164032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
165032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
1661d72bce8STim Tautges   PetscFunctionReturn(0);
1671d72bce8STim Tautges }
1681d72bce8STim Tautges 
1691d72bce8STim Tautges 
1701d72bce8STim Tautges #undef __FUNCT__
1711d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
172aa768e4cSTim Tautges /*@
173aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
174aa768e4cSTim Tautges 
175aa768e4cSTim Tautges   Collective on MPI_Comm
176aa768e4cSTim Tautges 
177aa768e4cSTim Tautges   Input Parameter:
178aa768e4cSTim Tautges . dm    - The DMMoab object being set
179aa768e4cSTim Tautges 
180aa768e4cSTim Tautges   Output Parameter:
181aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
182aa768e4cSTim Tautges 
183aa768e4cSTim Tautges   Level: beginner
184aa768e4cSTim Tautges 
185aa768e4cSTim Tautges .keywords: DMMoab, create
186aa768e4cSTim Tautges @*/
1871d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
1881d72bce8STim Tautges {
1891d72bce8STim Tautges   PetscFunctionBegin;
1901d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
191032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
1921d72bce8STim Tautges   PetscFunctionReturn(0);
1931d72bce8STim Tautges }
1941d72bce8STim Tautges 
1951d72bce8STim Tautges 
1961d72bce8STim Tautges #undef __FUNCT__
1971d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
198aa768e4cSTim Tautges /*@
199aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
200aa768e4cSTim Tautges 
201aa768e4cSTim Tautges   Collective on MPI_Comm
202aa768e4cSTim Tautges 
203aa768e4cSTim Tautges   Input Parameter:
204aa768e4cSTim Tautges . dm      - The DMMoab object being set
205aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
206aa768e4cSTim Tautges 
207aa768e4cSTim Tautges   Level: beginner
208aa768e4cSTim Tautges 
209aa768e4cSTim Tautges .keywords: DMMoab, create
210aa768e4cSTim Tautges @*/
211a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
2121d72bce8STim Tautges {
213032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
214032b8ab6SVijay Mahadevan 
2151d72bce8STim Tautges   PetscFunctionBegin;
2161d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2171cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
218032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
219032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
220032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2211d72bce8STim Tautges   PetscFunctionReturn(0);
2221d72bce8STim Tautges }
2231d72bce8STim Tautges 
2241d72bce8STim Tautges 
2251d72bce8STim Tautges #undef __FUNCT__
2261d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
227aa768e4cSTim Tautges /*@
228aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
229aa768e4cSTim Tautges 
230aa768e4cSTim Tautges   Collective on MPI_Comm
231aa768e4cSTim Tautges 
232aa768e4cSTim Tautges   Input Parameter:
233aa768e4cSTim Tautges . dm      - The DMMoab object being set
234aa768e4cSTim Tautges 
235aa768e4cSTim Tautges   Output Parameter:
236aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
237aa768e4cSTim Tautges 
238aa768e4cSTim Tautges   Level: beginner
239aa768e4cSTim Tautges 
240aa768e4cSTim Tautges .keywords: DMMoab, create
241aa768e4cSTim Tautges @*/
242a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
2431d72bce8STim Tautges {
2449426e041SSatish Balay   PetscErrorCode   ierr;
245cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
246cabb514dSBarry Smith 
2471d72bce8STim Tautges   PetscFunctionBegin;
2481d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
249cabb514dSBarry 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);
250a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
2511d72bce8STim Tautges   PetscFunctionReturn(0);
2521d72bce8STim Tautges }
2531d72bce8STim Tautges 
2541d72bce8STim Tautges 
2551d72bce8STim Tautges #undef __FUNCT__
2565eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
257aa768e4cSTim Tautges /*@
2585eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
259aa768e4cSTim Tautges 
260aa768e4cSTim Tautges   Collective on MPI_Comm
261aa768e4cSTim Tautges 
262aa768e4cSTim Tautges   Input Parameter:
263aa768e4cSTim Tautges . dm    - The DMMoab object being set
264aa768e4cSTim Tautges . range - The entities treated by this DMMoab
265aa768e4cSTim Tautges 
266aa768e4cSTim Tautges   Level: beginner
267aa768e4cSTim Tautges 
268aa768e4cSTim Tautges .keywords: DMMoab, create
269aa768e4cSTim Tautges @*/
2705eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
2711d72bce8STim Tautges {
272032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
273032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
274fd3326ddSVijay Mahadevan   moab::Range     tmpvtxs;
275032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
276032b8ab6SVijay Mahadevan 
2771d72bce8STim Tautges   PetscFunctionBegin;
2781d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
279032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
280032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
281fd3326ddSVijay Mahadevan 
282032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
283fd3326ddSVijay Mahadevan 
284fd3326ddSVijay Mahadevan   /* filter based on parallel status */
285fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
286fd3326ddSVijay Mahadevan 
287fd3326ddSVijay Mahadevan   /* filter all the non-owned and shared entities out of the list */
288fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
289fd3326ddSVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(tmpvtxs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
290fd3326ddSVijay Mahadevan   tmpvtxs = moab::subtract(tmpvtxs, *dmmoab->vghost);
291fd3326ddSVijay Mahadevan   *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, tmpvtxs);
292fd3326ddSVijay Mahadevan 
293fd3326ddSVijay Mahadevan   /* compute and cache the sizes of local and ghosted entities */
294032b8ab6SVijay Mahadevan   dmmoab->nloc = dmmoab->vowned->size();
295032b8ab6SVijay Mahadevan   dmmoab->nghost = dmmoab->vghost->size();
296032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
2971d72bce8STim Tautges   PetscFunctionReturn(0);
2981d72bce8STim Tautges }
2991d72bce8STim Tautges 
3001d72bce8STim Tautges 
3011d72bce8STim Tautges #undef __FUNCT__
3028d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices"
3038d8d51c8SVijay Mahadevan /*@
3048d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
3058d8d51c8SVijay Mahadevan 
3068d8d51c8SVijay Mahadevan   Collective on MPI_Comm
3078d8d51c8SVijay Mahadevan 
3088d8d51c8SVijay Mahadevan   Input Parameter:
3098d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
3108d8d51c8SVijay Mahadevan 
3118d8d51c8SVijay Mahadevan   Output Parameter:
3128d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
3138d8d51c8SVijay Mahadevan 
3148d8d51c8SVijay Mahadevan   Level: beginner
3158d8d51c8SVijay Mahadevan 
3168d8d51c8SVijay Mahadevan .keywords: DMMoab, create
3178d8d51c8SVijay Mahadevan @*/
3188d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
3198d8d51c8SVijay Mahadevan {
3208d8d51c8SVijay Mahadevan   PetscFunctionBegin;
3218d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3228d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
3238d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
3248d8d51c8SVijay Mahadevan }
3258d8d51c8SVijay Mahadevan 
3268d8d51c8SVijay Mahadevan 
3278d8d51c8SVijay Mahadevan 
3288d8d51c8SVijay Mahadevan #undef __FUNCT__
3295eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
330aa768e4cSTim Tautges /*@
3315eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
332aa768e4cSTim Tautges 
333aa768e4cSTim Tautges   Collective on MPI_Comm
334aa768e4cSTim Tautges 
335aa768e4cSTim Tautges   Input Parameter:
336aa768e4cSTim Tautges . dm    - The DMMoab object being set
337aa768e4cSTim Tautges 
338aa768e4cSTim Tautges   Output Parameter:
3395eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
3405eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
341aa768e4cSTim Tautges 
342aa768e4cSTim Tautges   Level: beginner
343aa768e4cSTim Tautges 
344aa768e4cSTim Tautges .keywords: DMMoab, create
345aa768e4cSTim Tautges @*/
346351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,const moab::Range **owned,const moab::Range **ghost)
3471d72bce8STim Tautges {
3481d72bce8STim Tautges   PetscFunctionBegin;
3491d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
350351b8a77SVijay Mahadevan   if (owned) *owned = ((DM_Moab*)dm->data)->vowned;
351351b8a77SVijay Mahadevan   if (ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
3521d72bce8STim Tautges   PetscFunctionReturn(0);
3531d72bce8STim Tautges }
3541d72bce8STim Tautges 
3551d72bce8STim Tautges #undef __FUNCT__
3565eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
3575eb88e9dSVijay Mahadevan /*@
3585eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
3595eb88e9dSVijay Mahadevan 
3605eb88e9dSVijay Mahadevan   Collective on MPI_Comm
3615eb88e9dSVijay Mahadevan 
3625eb88e9dSVijay Mahadevan   Input Parameter:
3635eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
3645eb88e9dSVijay Mahadevan 
3655eb88e9dSVijay Mahadevan   Output Parameter:
3665eb88e9dSVijay Mahadevan . range - The entities owned locally
3675eb88e9dSVijay Mahadevan 
3685eb88e9dSVijay Mahadevan   Level: beginner
3695eb88e9dSVijay Mahadevan 
3705eb88e9dSVijay Mahadevan .keywords: DMMoab, create
3715eb88e9dSVijay Mahadevan @*/
372351b8a77SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,const moab::Range **range)
3735eb88e9dSVijay Mahadevan {
3745eb88e9dSVijay Mahadevan   PetscFunctionBegin;
3755eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
376351b8a77SVijay Mahadevan   if (range) *range = ((DM_Moab*)dm->data)->elocal;
3771cec0304SVijay Mahadevan   PetscFunctionReturn(0);
3781cec0304SVijay Mahadevan }
3791cec0304SVijay Mahadevan 
3801cec0304SVijay Mahadevan 
3811cec0304SVijay Mahadevan #undef __FUNCT__
3821cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
3831cec0304SVijay Mahadevan /*@
3841cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
3851cec0304SVijay Mahadevan 
3861cec0304SVijay Mahadevan   Collective on MPI_Comm
3871cec0304SVijay Mahadevan 
3881cec0304SVijay Mahadevan   Input Parameter:
3891cec0304SVijay Mahadevan . dm    - The DMMoab object being set
3901cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
3911cec0304SVijay Mahadevan 
3921cec0304SVijay Mahadevan   Level: beginner
3931cec0304SVijay Mahadevan 
3941cec0304SVijay Mahadevan .keywords: DMMoab, create
3951cec0304SVijay Mahadevan @*/
3961cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
3971cec0304SVijay Mahadevan {
3981cec0304SVijay Mahadevan   moab::ErrorCode merr;
3991cec0304SVijay Mahadevan   PetscErrorCode  ierr;
4001cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
4011cec0304SVijay Mahadevan 
4021cec0304SVijay Mahadevan   PetscFunctionBegin;
4031cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4041cec0304SVijay Mahadevan   dmmoab->elocal->clear();
4051cec0304SVijay Mahadevan   dmmoab->eghost->clear();
4061cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
4071cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
4081cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
4091cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
41041dd5348SVijay Mahadevan   dmmoab->neleghost=dmmoab->eghost->size();
4111cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4128cbae1a6SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D global elements.\n", dmmoab->neleloc, dmmoab->nele);
4135eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
4145eb88e9dSVijay Mahadevan }
4155eb88e9dSVijay Mahadevan 
4165eb88e9dSVijay Mahadevan 
4175eb88e9dSVijay Mahadevan #undef __FUNCT__
4181d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
419aa768e4cSTim Tautges /*@
420aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
421aa768e4cSTim Tautges 
422aa768e4cSTim Tautges   Collective on MPI_Comm
423aa768e4cSTim Tautges 
424aa768e4cSTim Tautges   Input Parameter:
425aa768e4cSTim Tautges . dm      - The DMMoab object being set
426aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
427aa768e4cSTim Tautges 
428aa768e4cSTim Tautges   Level: beginner
429aa768e4cSTim Tautges 
430aa768e4cSTim Tautges .keywords: DMMoab, create
431aa768e4cSTim Tautges @*/
4321d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4331d72bce8STim Tautges {
4341d72bce8STim Tautges   PetscFunctionBegin;
4351d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4361d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4371d72bce8STim Tautges   PetscFunctionReturn(0);
4381d72bce8STim Tautges }
4391d72bce8STim Tautges 
4401d72bce8STim Tautges 
4411d72bce8STim Tautges #undef __FUNCT__
4421d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
443aa768e4cSTim Tautges /*@
444aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
445aa768e4cSTim Tautges 
446aa768e4cSTim Tautges   Collective on MPI_Comm
447aa768e4cSTim Tautges 
448aa768e4cSTim Tautges   Input Parameter:
449aa768e4cSTim Tautges . dm      - The DMMoab object being set
450aa768e4cSTim Tautges 
451aa768e4cSTim Tautges   Output Parameter:
452aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
453aa768e4cSTim Tautges 
454aa768e4cSTim Tautges   Level: beginner
455aa768e4cSTim Tautges 
456aa768e4cSTim Tautges .keywords: DMMoab, create
457aa768e4cSTim Tautges @*/
4581d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
4591d72bce8STim Tautges {
4601d72bce8STim Tautges   PetscFunctionBegin;
4611d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4621d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4631d72bce8STim Tautges   PetscFunctionReturn(0);
4641d72bce8STim Tautges }
4651d72bce8STim Tautges 
4661d72bce8STim Tautges 
4671d72bce8STim Tautges #undef __FUNCT__
4681d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
469aa768e4cSTim Tautges /*@
470aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
471aa768e4cSTim Tautges 
472aa768e4cSTim Tautges   Collective on MPI_Comm
473aa768e4cSTim Tautges 
474aa768e4cSTim Tautges   Input Parameter:
475aa768e4cSTim Tautges . dm - The DMMoab object being set
476aa768e4cSTim Tautges . bs - The block size used with this DMMoab
477aa768e4cSTim Tautges 
478aa768e4cSTim Tautges   Level: beginner
479aa768e4cSTim Tautges 
480aa768e4cSTim Tautges .keywords: DMMoab, create
481aa768e4cSTim Tautges @*/
4821d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4831d72bce8STim Tautges {
4841d72bce8STim Tautges   PetscFunctionBegin;
4851d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4861d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4871d72bce8STim Tautges   PetscFunctionReturn(0);
4881d72bce8STim Tautges }
4891d72bce8STim Tautges 
4901d72bce8STim Tautges 
4911d72bce8STim Tautges #undef __FUNCT__
4921d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
493aa768e4cSTim Tautges /*@
494aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
495aa768e4cSTim Tautges 
496aa768e4cSTim Tautges   Collective on MPI_Comm
497aa768e4cSTim Tautges 
498aa768e4cSTim Tautges   Input Parameter:
499aa768e4cSTim Tautges . dm - The DMMoab object being set
500aa768e4cSTim Tautges 
501aa768e4cSTim Tautges   Output Parameter:
502aa768e4cSTim Tautges . bs - The block size used with this DMMoab
503aa768e4cSTim Tautges 
504aa768e4cSTim Tautges   Level: beginner
505aa768e4cSTim Tautges 
506aa768e4cSTim Tautges .keywords: DMMoab, create
507aa768e4cSTim Tautges @*/
5081d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
5091d72bce8STim Tautges {
5101d72bce8STim Tautges   PetscFunctionBegin;
5111d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5121d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
5131d72bce8STim Tautges   PetscFunctionReturn(0);
5141d72bce8STim Tautges }
5151d72bce8STim Tautges 
5161cec0304SVijay Mahadevan 
5171cec0304SVijay Mahadevan #undef __FUNCT__
518212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
519212ad6d1SVijay Mahadevan /*@
520212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
521212ad6d1SVijay Mahadevan 
52200cc10feSVijay Mahadevan   Collective on DM
523212ad6d1SVijay Mahadevan 
524212ad6d1SVijay Mahadevan   Input Parameter:
525212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
526212ad6d1SVijay Mahadevan 
527212ad6d1SVijay Mahadevan   Output Parameter:
52800cc10feSVijay Mahadevan . neg - The number of global elements in the DMMoab instance
52900cc10feSVijay Mahadevan . nvg - The number of global vertices in the DMMoab instance
530212ad6d1SVijay Mahadevan 
531212ad6d1SVijay Mahadevan   Level: beginner
532212ad6d1SVijay Mahadevan 
533212ad6d1SVijay Mahadevan .keywords: DMMoab, create
534212ad6d1SVijay Mahadevan @*/
53541dd5348SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *neg,PetscInt *nvg)
536212ad6d1SVijay Mahadevan {
537212ad6d1SVijay Mahadevan   PetscFunctionBegin;
538212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
53941dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->nele;
54041dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->n;
541212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
542212ad6d1SVijay Mahadevan }
543212ad6d1SVijay Mahadevan 
544212ad6d1SVijay Mahadevan 
545212ad6d1SVijay Mahadevan #undef __FUNCT__
546212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
547212ad6d1SVijay Mahadevan /*@
548212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
549212ad6d1SVijay Mahadevan 
55000cc10feSVijay Mahadevan   Collective on DM
551212ad6d1SVijay Mahadevan 
552212ad6d1SVijay Mahadevan   Input Parameter:
553212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
554212ad6d1SVijay Mahadevan 
555212ad6d1SVijay Mahadevan   Output Parameter:
556b8ecf6d3SVijay Mahadevan + nel - The number of owned elements in this processor
55700cc10feSVijay Mahadevan . neg - The number of ghosted elements in this processor
55800cc10feSVijay Mahadevan . nvl - The number of owned vertices in this processor
55900cc10feSVijay Mahadevan . nvg - The number of ghosted vertices in this processor
560212ad6d1SVijay Mahadevan 
561212ad6d1SVijay Mahadevan   Level: beginner
562212ad6d1SVijay Mahadevan 
563212ad6d1SVijay Mahadevan .keywords: DMMoab, create
564212ad6d1SVijay Mahadevan @*/
56541dd5348SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nel,PetscInt *neg,PetscInt *nvl,PetscInt *nvg)
566212ad6d1SVijay Mahadevan {
567212ad6d1SVijay Mahadevan   PetscFunctionBegin;
568212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
56941dd5348SVijay Mahadevan   if(nel) *nel = ((DM_Moab*)dm->data)->neleloc;
57041dd5348SVijay Mahadevan   if(neg) *neg = ((DM_Moab*)dm->data)->neleghost;
57141dd5348SVijay Mahadevan   if(nvl) *nvl = ((DM_Moab*)dm->data)->nloc;
57241dd5348SVijay Mahadevan   if(nvg) *nvg = ((DM_Moab*)dm->data)->nghost;
573212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
574212ad6d1SVijay Mahadevan }
575212ad6d1SVijay Mahadevan 
576212ad6d1SVijay Mahadevan 
577212ad6d1SVijay Mahadevan #undef __FUNCT__
57800cc10feSVijay Mahadevan #define __FUNCT__ "DMMoabGetOffset"
57900cc10feSVijay Mahadevan /*@
58000cc10feSVijay Mahadevan   DMMoabGetOffset - Get the local offset for the global vector
58100cc10feSVijay Mahadevan 
58200cc10feSVijay Mahadevan   Collective on MPI_Comm
58300cc10feSVijay Mahadevan 
58400cc10feSVijay Mahadevan   Input Parameter:
58500cc10feSVijay Mahadevan . dm - The DMMoab object being set
58600cc10feSVijay Mahadevan 
58700cc10feSVijay Mahadevan   Output Parameter:
58800cc10feSVijay Mahadevan . offset - The local offset for the global vector
58900cc10feSVijay Mahadevan 
59000cc10feSVijay Mahadevan   Level: beginner
59100cc10feSVijay Mahadevan 
59200cc10feSVijay Mahadevan .keywords: DMMoab, create
59300cc10feSVijay Mahadevan @*/
59400cc10feSVijay Mahadevan PetscErrorCode DMMoabGetOffset(DM dm,PetscInt *offset)
59500cc10feSVijay Mahadevan {
59600cc10feSVijay Mahadevan   PetscFunctionBegin;
59700cc10feSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
59800cc10feSVijay Mahadevan   *offset = ((DM_Moab*)dm->data)->vstart;
59900cc10feSVijay Mahadevan   PetscFunctionReturn(0);
60000cc10feSVijay Mahadevan }
60100cc10feSVijay Mahadevan 
60200cc10feSVijay Mahadevan 
60300cc10feSVijay Mahadevan #undef __FUNCT__
6044920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension"
6054920ab11SVijay Mahadevan /*@
6064920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
6074920ab11SVijay Mahadevan 
6084920ab11SVijay Mahadevan   Collective on MPI_Comm
6094920ab11SVijay Mahadevan 
6104920ab11SVijay Mahadevan   Input Parameter:
6114920ab11SVijay Mahadevan . dm - The DMMoab object being set
6124920ab11SVijay Mahadevan 
6134920ab11SVijay Mahadevan   Output Parameter:
6144920ab11SVijay Mahadevan . dim - The dimension of DM
6154920ab11SVijay Mahadevan 
6164920ab11SVijay Mahadevan   Level: beginner
6174920ab11SVijay Mahadevan 
6184920ab11SVijay Mahadevan .keywords: DMMoab, create
6194920ab11SVijay Mahadevan @*/
6204920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
6214920ab11SVijay Mahadevan {
6224920ab11SVijay Mahadevan   PetscFunctionBegin;
6234920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6244920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
6254920ab11SVijay Mahadevan   PetscFunctionReturn(0);
6264920ab11SVijay Mahadevan }
6274920ab11SVijay Mahadevan 
6284920ab11SVijay Mahadevan 
6294920ab11SVijay Mahadevan 
6304920ab11SVijay Mahadevan #undef __FUNCT__
6317023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
6327023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
6337023aa44SVijay Mahadevan {
6347023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
6357023aa44SVijay Mahadevan   PetscErrorCode  ierr;
6367023aa44SVijay Mahadevan   moab::ErrorCode merr;
6377023aa44SVijay Mahadevan 
6387023aa44SVijay Mahadevan   PetscFunctionBegin;
6397023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6407023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
6417023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6427023aa44SVijay Mahadevan 
6437023aa44SVijay Mahadevan   if (!vpos) {
6447023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
6457023aa44SVijay Mahadevan   }
6467023aa44SVijay Mahadevan 
6477023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6487023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
6497023aa44SVijay Mahadevan   PetscFunctionReturn(0);
6507023aa44SVijay Mahadevan }
6517023aa44SVijay Mahadevan 
6527023aa44SVijay Mahadevan 
6537023aa44SVijay Mahadevan #undef __FUNCT__
6548d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity"
6558d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
6568d8d51c8SVijay Mahadevan {
6578d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
6588d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
6598d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
6608d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
6618d8d51c8SVijay Mahadevan 
6628d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6638d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6648d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
6658d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6668d8d51c8SVijay Mahadevan 
6678d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
6688d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
6698d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
6708d8d51c8SVijay Mahadevan 
6718d8d51c8SVijay Mahadevan   if (conn) {
6728d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
6738d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
6748d8d51c8SVijay Mahadevan   }
6758d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
6768d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
6778d8d51c8SVijay Mahadevan }
6788d8d51c8SVijay Mahadevan 
6798d8d51c8SVijay Mahadevan 
6808d8d51c8SVijay Mahadevan #undef __FUNCT__
6818d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity"
6828d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
6838d8d51c8SVijay Mahadevan {
6848d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
6858d8d51c8SVijay Mahadevan 
6868d8d51c8SVijay Mahadevan   PetscFunctionBegin;
6878d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6888d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
6898d8d51c8SVijay Mahadevan 
6908d8d51c8SVijay Mahadevan   if (conn) {
6918d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
6928d8d51c8SVijay Mahadevan   }
6938d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
6948d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
6958d8d51c8SVijay Mahadevan }
6968d8d51c8SVijay Mahadevan 
6978d8d51c8SVijay Mahadevan 
6988d8d51c8SVijay Mahadevan 
6998d8d51c8SVijay Mahadevan #undef __FUNCT__
7007023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
7017023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
7027023aa44SVijay Mahadevan {
7037023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7047023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
7057023aa44SVijay Mahadevan   moab::ErrorCode merr;
7067023aa44SVijay Mahadevan   PetscInt nnodes;
7077023aa44SVijay Mahadevan 
7087023aa44SVijay Mahadevan   PetscFunctionBegin;
7097023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7107023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
7117023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7127023aa44SVijay Mahadevan 
7137023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7147023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
7157023aa44SVijay Mahadevan   if (conn) *conn=connect;
7167023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
7177023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7187023aa44SVijay Mahadevan }
7197023aa44SVijay Mahadevan 
7207023aa44SVijay Mahadevan 
7217023aa44SVijay Mahadevan #undef __FUNCT__
72269263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
72369263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
72469263071SVijay Mahadevan {
72569263071SVijay Mahadevan   moab::EntityType etype;
72669263071SVijay Mahadevan   DM_Moab         *dmmoab;
72769263071SVijay Mahadevan   PetscInt         edim;
72869263071SVijay Mahadevan 
72969263071SVijay Mahadevan   PetscFunctionBegin;
73069263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
73169263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
73269263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
73369263071SVijay Mahadevan 
73469263071SVijay Mahadevan   /* get the entity type and handle accordingly */
73569263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
73669263071SVijay 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);
73769263071SVijay Mahadevan 
73869263071SVijay Mahadevan   /* get the entity dimension */
73969263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
74069263071SVijay Mahadevan 
74169263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
74269263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
7436d9eb265SVijay Mahadevan     if (dmmoab->bndyvtx->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
74469263071SVijay Mahadevan   }
74569263071SVijay Mahadevan   else {
74669263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
7476d9eb265SVijay Mahadevan       if (dmmoab->bndyelems->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
74869263071SVijay Mahadevan     }
74969263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
7506d9eb265SVijay Mahadevan       if (dmmoab->bndyfaces->index(ent) >= 0) *ent_on_boundary=PETSC_TRUE;
75169263071SVijay Mahadevan     }
75269263071SVijay Mahadevan   }
75369263071SVijay Mahadevan   PetscFunctionReturn(0);
75469263071SVijay Mahadevan }
75569263071SVijay Mahadevan 
75669263071SVijay Mahadevan 
75769263071SVijay Mahadevan #undef __FUNCT__
7587023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
75969263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
7607023aa44SVijay Mahadevan {
7617023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7627023aa44SVijay Mahadevan   PetscInt       i;
7637023aa44SVijay Mahadevan 
7647023aa44SVijay Mahadevan   PetscFunctionBegin;
7657023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7667023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
7677023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
7687023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7697023aa44SVijay Mahadevan 
7707023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
7716d9eb265SVijay Mahadevan     isbdvtx[i]=(dmmoab->bndyvtx->index(cnt[i]) >= 0 ? PETSC_TRUE:PETSC_FALSE);
7727023aa44SVijay Mahadevan   }
7737023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7747023aa44SVijay Mahadevan }
7757023aa44SVijay Mahadevan 
7767023aa44SVijay Mahadevan 
7777023aa44SVijay Mahadevan #undef __FUNCT__
7780c8a2322SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryMarkers"
7796d9eb265SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryMarkers(DM dm,const moab::Range **bdvtx,const moab::Range** bdelems,const moab::Range** bdfaces)
7801cec0304SVijay Mahadevan {
7811cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
7821cec0304SVijay Mahadevan 
7831cec0304SVijay Mahadevan   PetscFunctionBegin;
7841cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7851cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7861cec0304SVijay Mahadevan 
7876d9eb265SVijay Mahadevan   if (bdvtx)  *bdvtx = dmmoab->bndyvtx;
7886d9eb265SVijay Mahadevan   if (bdfaces)  *bdfaces = dmmoab->bndyfaces;
7896d9eb265SVijay Mahadevan   if (bdelems)  *bdfaces = dmmoab->bndyelems;
7901cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7911cec0304SVijay Mahadevan }
7921cec0304SVijay Mahadevan 
793f6829af0SVijay Mahadevan 
794f6829af0SVijay Mahadevan #undef __FUNCT__
795f6829af0SVijay Mahadevan #define __FUNCT__ "DMDestroy_Moab"
796f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMDestroy_Moab(DM dm)
797f6829af0SVijay Mahadevan {
798f6829af0SVijay Mahadevan   PetscErrorCode ierr;
799f6829af0SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
800f6829af0SVijay Mahadevan 
801f6829af0SVijay Mahadevan   PetscFunctionBegin;
802f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
803f6829af0SVijay Mahadevan   if (dmmoab->icreatedinstance) {
804f6829af0SVijay Mahadevan     delete dmmoab->mbiface;
805f6829af0SVijay Mahadevan   }
806f6829af0SVijay Mahadevan   dmmoab->mbiface = NULL;
807f6829af0SVijay Mahadevan   dmmoab->pcomm = NULL;
808f6829af0SVijay Mahadevan   delete dmmoab->vlocal;
809f6829af0SVijay Mahadevan   delete dmmoab->vowned;
810f6829af0SVijay Mahadevan   delete dmmoab->vghost;
811f6829af0SVijay Mahadevan   delete dmmoab->elocal;
812f6829af0SVijay Mahadevan   delete dmmoab->eghost;
813f6829af0SVijay Mahadevan   delete dmmoab->bndyvtx;
814f6829af0SVijay Mahadevan   delete dmmoab->bndyfaces;
815f6829af0SVijay Mahadevan   delete dmmoab->bndyelems;
816f6829af0SVijay Mahadevan 
817f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
818f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->lidmap);CHKERRQ(ierr);
819f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->gidmap);CHKERRQ(ierr);
820f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->llmap);CHKERRQ(ierr);
821f6829af0SVijay Mahadevan   ierr = PetscFree(dmmoab->lgmap);CHKERRQ(ierr);
822f6829af0SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
823f6829af0SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
824f6829af0SVijay Mahadevan   ierr = PetscFree(dm->data);CHKERRQ(ierr);
825f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
826f6829af0SVijay Mahadevan }
827f6829af0SVijay Mahadevan 
828f6829af0SVijay Mahadevan 
829f6829af0SVijay Mahadevan #undef __FUNCT__
830*2e4e7c01SVijay Mahadevan #define __FUNCT__ "DMSetFromOptions_Moab"
831*2e4e7c01SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetFromOptions_Moab(DM dm)
832*2e4e7c01SVijay Mahadevan {
833*2e4e7c01SVijay Mahadevan   PetscErrorCode ierr;
834*2e4e7c01SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
835*2e4e7c01SVijay Mahadevan 
836*2e4e7c01SVijay Mahadevan   PetscFunctionBegin;
837*2e4e7c01SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
838*2e4e7c01SVijay Mahadevan   ierr = PetscOptionsHead("DMMoab Options");CHKERRQ(ierr);
839*2e4e7c01SVijay 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);
840*2e4e7c01SVijay 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);
841*2e4e7c01SVijay Mahadevan   /* TODO: typically, the read options are needed before a DM is completely created and available in which case, the options wont be available ?? */
842*2e4e7c01SVijay 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);
843*2e4e7c01SVijay 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);
844*2e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_read_mode", "MOAB parallel read mode", "DMView", MoabReadModes, (PetscEnum)dmmoab->read_mode, (PetscEnum*)&dmmoab->read_mode, NULL);CHKERRQ(ierr);
845*2e4e7c01SVijay Mahadevan   ierr  = PetscOptionsEnum("-dm_moab_write_mode", "MOAB parallel write mode", "DMView", MoabWriteModes, (PetscEnum)dmmoab->write_mode, (PetscEnum*)&dmmoab->write_mode, NULL);CHKERRQ(ierr);
846*2e4e7c01SVijay Mahadevan   PetscFunctionReturn(0);
847*2e4e7c01SVijay Mahadevan }
848*2e4e7c01SVijay Mahadevan 
849*2e4e7c01SVijay Mahadevan 
850*2e4e7c01SVijay Mahadevan #undef __FUNCT__
851f6829af0SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
852f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMSetUp_Moab(DM dm)
853f6829af0SVijay Mahadevan {
854f6829af0SVijay Mahadevan   PetscErrorCode          ierr;
855f6829af0SVijay Mahadevan   moab::ErrorCode         merr;
856f6829af0SVijay Mahadevan   Vec                     local, global;
857f6829af0SVijay Mahadevan   IS                      from,to;
858f6829af0SVijay Mahadevan   moab::Range::iterator   iter;
859f6829af0SVijay Mahadevan   PetscInt                i,j,f,bs,gmin,lmin,lmax,vent,totsize;
860f6829af0SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
861f6829af0SVijay Mahadevan   moab::Range             adjs;
862f6829af0SVijay Mahadevan 
863f6829af0SVijay Mahadevan   PetscFunctionBegin;
864f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
865f6829af0SVijay Mahadevan   /* Get the local and shared vertices and cache it */
866f6829af0SVijay 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.");
867f6829af0SVijay Mahadevan 
868f6829af0SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
869f6829af0SVijay Mahadevan   if (dmmoab->vlocal->empty())
870f6829af0SVijay Mahadevan   {
871f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
872f6829af0SVijay Mahadevan 
873f6829af0SVijay Mahadevan     /* filter based on parallel status */
874f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
875f6829af0SVijay Mahadevan 
876f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
877f6829af0SVijay Mahadevan     adjs = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
878f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(adjs,PSTATUS_INTERFACE,PSTATUS_OR,-1,dmmoab->vghost);MBERRNM(merr);
879f6829af0SVijay Mahadevan     adjs = moab::subtract(adjs, *dmmoab->vghost);
880f6829af0SVijay Mahadevan     *dmmoab->vlocal = moab::subtract(*dmmoab->vlocal, adjs);
881f6829af0SVijay Mahadevan 
882f6829af0SVijay Mahadevan     /* compute and cache the sizes of local and ghosted entities */
883f6829af0SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
884f6829af0SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
885f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
886f6829af0SVijay Mahadevan   }
887f6829af0SVijay Mahadevan 
888f6829af0SVijay Mahadevan   {
889f6829af0SVijay Mahadevan     /* get the information about the local elements in the mesh */
890f6829af0SVijay Mahadevan     dmmoab->eghost->clear();
891f6829af0SVijay Mahadevan 
892f6829af0SVijay Mahadevan     /* first decipher the leading dimension */
893f6829af0SVijay Mahadevan     for (i=3;i>0;i--) {
894f6829af0SVijay Mahadevan       dmmoab->elocal->clear();
895f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
896f6829af0SVijay Mahadevan 
897f6829af0SVijay Mahadevan       /* store the current mesh dimension */
898f6829af0SVijay Mahadevan       if (dmmoab->elocal->size()) {
899f6829af0SVijay Mahadevan         dmmoab->dim=i;
900f6829af0SVijay Mahadevan         break;
901f6829af0SVijay Mahadevan       }
902f6829af0SVijay Mahadevan     }
903f6829af0SVijay Mahadevan 
904f6829af0SVijay Mahadevan     /* filter the ghosted and owned element list */
905f6829af0SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
906f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
907f6829af0SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
908f6829af0SVijay Mahadevan 
909f6829af0SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
910f6829af0SVijay Mahadevan     dmmoab->neleghost = dmmoab->eghost->size();
911f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
912f6829af0SVijay Mahadevan   }
913f6829af0SVijay Mahadevan 
914f6829af0SVijay Mahadevan   bs = dmmoab->bs;
915f6829af0SVijay Mahadevan   if (!dmmoab->ltog_tag) {
916f6829af0SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
917f6829af0SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
918f6829af0SVijay Mahadevan        assemble the individual pieces of the mesh */
919f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
920f6829af0SVijay Mahadevan   }
921f6829af0SVijay Mahadevan 
922f6829af0SVijay Mahadevan   totsize=dmmoab->vlocal->size();
923f6829af0SVijay 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);
924f6829af0SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr);
925f6829af0SVijay Mahadevan   {
926f6829af0SVijay Mahadevan     /* first get the local indices */
927f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
928f6829af0SVijay Mahadevan     /* next get the ghosted indices */
929f6829af0SVijay Mahadevan     if (dmmoab->nghost) {
930f6829af0SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
931f6829af0SVijay Mahadevan     }
932f6829af0SVijay Mahadevan 
933f6829af0SVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
934f6829af0SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
935f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
936f6829af0SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
937f6829af0SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
938f6829af0SVijay Mahadevan     }
939f6829af0SVijay Mahadevan 
940f6829af0SVijay Mahadevan     ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
941f6829af0SVijay Mahadevan 
942f6829af0SVijay Mahadevan     /* set the GID map */
943f6829af0SVijay Mahadevan     for (i=0; i<totsize; ++i) {
944f6829af0SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
945f6829af0SVijay Mahadevan     }
946f6829af0SVijay Mahadevan     lmin-=gmin;
947f6829af0SVijay Mahadevan     lmax-=gmin;
948f6829af0SVijay Mahadevan 
949f6829af0SVijay Mahadevan     PetscInfo3(NULL, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
950f6829af0SVijay Mahadevan   }
951f6829af0SVijay Mahadevan 
952f6829af0SVijay Mahadevan   {
953f6829af0SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->gidmap);CHKERRQ(ierr);
954f6829af0SVijay Mahadevan     ierr = PetscMalloc(((PetscInt)(dmmoab->vlocal->back())+1)*sizeof(PetscInt), &dmmoab->lidmap);CHKERRQ(ierr);
955f6829af0SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->llmap);CHKERRQ(ierr);
956f6829af0SVijay Mahadevan     ierr = PetscMalloc(totsize*dmmoab->numFields*sizeof(PetscInt), &dmmoab->lgmap);CHKERRQ(ierr);
957f6829af0SVijay Mahadevan 
958f6829af0SVijay Mahadevan     i=j=0;
959f6829af0SVijay Mahadevan     /* set the owned vertex data first */
960f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
961f6829af0SVijay Mahadevan       vent=(PetscInt)(*iter);
962f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
963f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
964f6829af0SVijay Mahadevan       if (bs > 1) {
965f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
966f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
967f6829af0SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
968f6829af0SVijay Mahadevan         }
969f6829af0SVijay Mahadevan       }
970f6829af0SVijay Mahadevan       else {
971f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
972f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
973f6829af0SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
974f6829af0SVijay Mahadevan         }
975f6829af0SVijay Mahadevan       }
976f6829af0SVijay Mahadevan     }
977f6829af0SVijay Mahadevan     /* next arrange all the ghosted data information */
978f6829af0SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
979f6829af0SVijay Mahadevan       vent=(PetscInt)(*iter);
980f6829af0SVijay Mahadevan       dmmoab->gidmap[vent]=dmmoab->gsindices[i];
981f6829af0SVijay Mahadevan       dmmoab->lidmap[vent]=i;
982f6829af0SVijay Mahadevan       if (bs > 1) {
983f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
984f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=dmmoab->gsindices[i]*dmmoab->numFields+f;
985f6829af0SVijay Mahadevan           dmmoab->llmap[j]=i*dmmoab->numFields+f;
986f6829af0SVijay Mahadevan         }
987f6829af0SVijay Mahadevan       }
988f6829af0SVijay Mahadevan       else {
989f6829af0SVijay Mahadevan         for (f=0;f<dmmoab->numFields;f++,j++) {
990f6829af0SVijay Mahadevan           dmmoab->lgmap[j]=totsize*f+dmmoab->gsindices[i];
991f6829af0SVijay Mahadevan           dmmoab->llmap[j]=totsize*f+i;
992f6829af0SVijay Mahadevan         }
993f6829af0SVijay Mahadevan       }
994f6829af0SVijay Mahadevan     }
995f6829af0SVijay Mahadevan 
996f6829af0SVijay Mahadevan     /* We need to create the Global to Local Vector Scatter Contexts
997f6829af0SVijay Mahadevan        1) First create a local and global vector
998f6829af0SVijay Mahadevan        2) Create a local and global IS
999f6829af0SVijay Mahadevan        3) Create VecScatter and LtoGMapping objects
1000f6829af0SVijay Mahadevan        4) Cleanup the IS and Vec objects
1001f6829af0SVijay Mahadevan     */
1002f6829af0SVijay Mahadevan     ierr = DMCreateGlobalVector(dm, &global);CHKERRQ(ierr);
1003f6829af0SVijay Mahadevan     ierr = DMCreateLocalVector(dm, &local);CHKERRQ(ierr);
1004f6829af0SVijay Mahadevan 
1005f6829af0SVijay Mahadevan     ierr = VecGetOwnershipRange(global, &dmmoab->vstart, &dmmoab->vend);CHKERRQ(ierr);
1006f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Total-size = %D\t Owned = %D, Ghosted = %D.\n", totsize, dmmoab->nloc, dmmoab->nghost);
1007f6829af0SVijay Mahadevan 
1008f6829af0SVijay Mahadevan     /* global to local must retrieve ghost points */
1009f6829af0SVijay Mahadevan     ierr = ISCreateStride(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,dmmoab->vstart,1,&from);CHKERRQ(ierr);
1010f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(from,bs);CHKERRQ(ierr);
1011f6829af0SVijay Mahadevan 
1012f6829af0SVijay Mahadevan     ierr = ISCreateGeneral(((PetscObject)dm)->comm,dmmoab->nloc*dmmoab->numFields,&dmmoab->lgmap[0],PETSC_COPY_VALUES,&to);CHKERRQ(ierr);
1013f6829af0SVijay Mahadevan     ierr = ISSetBlockSize(to,bs);CHKERRQ(ierr);
1014f6829af0SVijay Mahadevan 
1015f6829af0SVijay Mahadevan     if (!dmmoab->ltog_map) {
1016f6829af0SVijay Mahadevan       /* create to the local to global mapping for vectors in order to use VecSetValuesLocal */
1017f6829af0SVijay Mahadevan       ierr = ISLocalToGlobalMappingCreate(((PetscObject)dm)->comm,totsize*dmmoab->numFields,dmmoab->lgmap,
1018f6829af0SVijay Mahadevan                                           PETSC_COPY_VALUES,&dmmoab->ltog_map);CHKERRQ(ierr);
1019f6829af0SVijay Mahadevan     }
1020f6829af0SVijay Mahadevan 
1021f6829af0SVijay Mahadevan     /* now create the scatter object from local to global vector */
1022f6829af0SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,to,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
1023f6829af0SVijay Mahadevan 
1024f6829af0SVijay Mahadevan     /* clean up IS, Vec */
1025f6829af0SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
1026f6829af0SVijay Mahadevan     ierr = ISDestroy(&to);CHKERRQ(ierr);
1027f6829af0SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
1028f6829af0SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
1029f6829af0SVijay Mahadevan   }
1030f6829af0SVijay Mahadevan 
1031f6829af0SVijay Mahadevan   /* skin the boundary and store nodes */
1032f6829af0SVijay Mahadevan   {
1033f6829af0SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
1034f6829af0SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
1035f6829af0SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
1036f6829af0SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1037f6829af0SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1038f6829af0SVijay Mahadevan 
1039f6829af0SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
1040f6829af0SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
1041f6829af0SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
1042f6829af0SVijay Mahadevan 
1043f6829af0SVijay Mahadevan     /* get the entities on the skin - only the faces */
1044f6829af0SVijay 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
1045f6829af0SVijay Mahadevan 
1046f6829af0SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
1047f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
1048f6829af0SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
1049f6829af0SVijay Mahadevan 
1050f6829af0SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
1051f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
1052f6829af0SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
1053f6829af0SVijay Mahadevan     PetscInfo3(NULL, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
1054f6829af0SVijay Mahadevan   }
1055f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1056f6829af0SVijay Mahadevan }
1057f6829af0SVijay Mahadevan 
1058f6829af0SVijay Mahadevan 
1059f6829af0SVijay Mahadevan #undef __FUNCT__
1060f6829af0SVijay Mahadevan #define __FUNCT__ "DMCreate_Moab"
1061f6829af0SVijay Mahadevan PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
1062f6829af0SVijay Mahadevan {
1063f6829af0SVijay Mahadevan   PetscErrorCode ierr;
1064f6829af0SVijay Mahadevan 
1065f6829af0SVijay Mahadevan   PetscFunctionBegin;
1066f6829af0SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1067f6829af0SVijay Mahadevan   ierr = PetscNewLog(dm,DM_Moab,&dm->data);CHKERRQ(ierr);
1068f6829af0SVijay Mahadevan 
1069f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
1070f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->numFields = 1;
1071f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
1072f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
1073f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
1074f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
1075f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
1076f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->neleghost = 0;
1077f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
1078f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
1079f6829af0SVijay Mahadevan 
1080f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
1081f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
1082f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
1083f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
1084f6829af0SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
1085f6829af0SVijay Mahadevan 
1086f6829af0SVijay Mahadevan   dm->ops->createglobalvector       = DMCreateGlobalVector_Moab;
1087f6829af0SVijay Mahadevan   dm->ops->createlocalvector        = DMCreateLocalVector_Moab;
1088f6829af0SVijay Mahadevan   dm->ops->creatematrix             = DMCreateMatrix_Moab;
1089f6829af0SVijay Mahadevan   dm->ops->setup                    = DMSetUp_Moab;
1090f6829af0SVijay Mahadevan   dm->ops->destroy                  = DMDestroy_Moab;
1091*2e4e7c01SVijay Mahadevan   dm->ops->setfromoptions           = DMSetFromOptions_Moab;
1092f6829af0SVijay Mahadevan   dm->ops->globaltolocalbegin       = DMGlobalToLocalBegin_Moab;
1093f6829af0SVijay Mahadevan   dm->ops->globaltolocalend         = DMGlobalToLocalEnd_Moab;
1094f6829af0SVijay Mahadevan   dm->ops->localtoglobalbegin       = DMLocalToGlobalBegin_Moab;
1095f6829af0SVijay Mahadevan   dm->ops->localtoglobalend         = DMLocalToGlobalEnd_Moab;
1096f6829af0SVijay Mahadevan   PetscFunctionReturn(0);
1097f6829af0SVijay Mahadevan }
1098f6829af0SVijay Mahadevan 
1099