xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 4a40b57043114e997ee4a98c9008bb55006e8e05)
1032b8ab6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I  "petscdm.h"   I*/
2aa768e4cSTim Tautges #include <petsc-private/vecimpl.h> /*I  "petscdm.h"   I*/
31d72bce8STim Tautges 
41d72bce8STim Tautges #include <petscdmmoab.h>
588face26SJed Brown #include <MBTagConventions.hpp>
6032b8ab6SVijay Mahadevan 
7853cdec3SJed Brown #undef __FUNCT__
8853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab"
9853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm)
10853cdec3SJed Brown {
11853cdec3SJed Brown   PetscErrorCode ierr;
12032b8ab6SVijay Mahadevan   DM_Moab         *dmmoab = (DM_Moab*)dm->data;
13853cdec3SJed Brown 
14853cdec3SJed Brown   PetscFunctionBegin;
15853cdec3SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
16032b8ab6SVijay Mahadevan   if (dmmoab->icreatedinstance) {
17032b8ab6SVijay Mahadevan     delete dmmoab->mbiface;
18853cdec3SJed Brown   }
19032b8ab6SVijay Mahadevan   dmmoab->mbiface = NULL;
20032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
21032b8ab6SVijay Mahadevan   delete dmmoab->vlocal;
22032b8ab6SVijay Mahadevan   delete dmmoab->vowned;
23032b8ab6SVijay Mahadevan   delete dmmoab->vghost;
24032b8ab6SVijay Mahadevan   delete dmmoab->elocal;
25032b8ab6SVijay Mahadevan   delete dmmoab->eghost;
26032b8ab6SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
27032b8ab6SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
28853cdec3SJed Brown   ierr = PetscFree(dm->data);CHKERRQ(ierr);
29853cdec3SJed Brown   PetscFunctionReturn(0);
30853cdec3SJed Brown }
31853cdec3SJed Brown 
32aa768e4cSTim Tautges #undef __FUNCT__
33032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
34032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm)
35032b8ab6SVijay Mahadevan {
36032b8ab6SVijay Mahadevan   PetscErrorCode          ierr;
37032b8ab6SVijay Mahadevan   moab::ErrorCode         merr;
38032b8ab6SVijay Mahadevan   Vec                     local, global;
39032b8ab6SVijay Mahadevan   IS                      from;
40032b8ab6SVijay Mahadevan   moab::Range::iterator   iter;
41db66d124SVijay Mahadevan   PetscInt                bs, *gsindices,gsiz,lsiz;
42032b8ab6SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
43032b8ab6SVijay Mahadevan   PetscInt                count,dof,totsize;
44032b8ab6SVijay Mahadevan 
45032b8ab6SVijay Mahadevan   PetscFunctionBegin;
46032b8ab6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
47032b8ab6SVijay Mahadevan   /* Get the local and shared vertices and cache it */
48032b8ab6SVijay 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.");
49032b8ab6SVijay Mahadevan 
50032b8ab6SVijay Mahadevan   /* store the current mesh dimension */
51032b8ab6SVijay Mahadevan   merr = dmmoab->mbiface->get_dimension(dmmoab->dim);MBERRNM(merr);
52032b8ab6SVijay Mahadevan 
53032b8ab6SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh */
54032b8ab6SVijay Mahadevan   if (dmmoab->vlocal->empty()) {
55032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(0,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
56032b8ab6SVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
57032b8ab6SVijay Mahadevan 
58032b8ab6SVijay Mahadevan     /* filter based on parallel status */
59032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
60032b8ab6SVijay Mahadevan     *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
61032b8ab6SVijay Mahadevan 
62032b8ab6SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
63032b8ab6SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
64032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
65032b8ab6SVijay Mahadevan   }
66032b8ab6SVijay Mahadevan 
67032b8ab6SVijay Mahadevan   /* get the information about the local elements in the mesh */
68032b8ab6SVijay Mahadevan   {
69032b8ab6SVijay Mahadevan     dmmoab->elocal->clear();
70032b8ab6SVijay Mahadevan     dmmoab->eghost->clear();
71032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_dimension(0, dmmoab->dim, *dmmoab->elocal, true);CHKERRQ(merr);
72032b8ab6SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
73032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
74032b8ab6SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
75032b8ab6SVijay Mahadevan 
76032b8ab6SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
77032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
78032b8ab6SVijay Mahadevan   }
79032b8ab6SVijay Mahadevan 
80032b8ab6SVijay Mahadevan   bs = dmmoab->bs;
81032b8ab6SVijay Mahadevan   if (!dmmoab->ltog_tag) {
82db66d124SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
83db66d124SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
84db66d124SVijay Mahadevan        assemble the individual pieces of the mesh */
85032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
86032b8ab6SVijay Mahadevan   }
87032b8ab6SVijay Mahadevan 
88032b8ab6SVijay Mahadevan   {
89032b8ab6SVijay Mahadevan     count=0;
90032b8ab6SVijay Mahadevan     totsize=dmmoab->vlocal->size();
91032b8ab6SVijay Mahadevan     ierr = PetscMalloc(totsize*sizeof(PetscInt), &gsindices);CHKERRQ(ierr);
92032b8ab6SVijay Mahadevan     /* first get the local indices */
93*4a40b570SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&gsindices[0]);MBERRNM(merr);
94*4a40b570SVijay Mahadevan     /* next get the ghosted indices */
95*4a40b570SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&gsindices[dmmoab->nloc]);MBERRNM(merr);
96032b8ab6SVijay Mahadevan 
97032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
98032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
99032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
100032b8ab6SVijay Mahadevan 
101032b8ab6SVijay Mahadevan     /* global to local must retrieve ghost points */
102032b8ab6SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,gsindices,PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
103032b8ab6SVijay Mahadevan 
104db66d124SVijay Mahadevan     ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr);
105db66d124SVijay Mahadevan     ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr);
106032b8ab6SVijay Mahadevan 
107032b8ab6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
108032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
109032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
110032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
111032b8ab6SVijay Mahadevan     ierr = PetscFree(gsindices);CHKERRQ(ierr);
112032b8ab6SVijay Mahadevan   }
113032b8ab6SVijay Mahadevan 
114032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
115032b8ab6SVijay Mahadevan }
116032b8ab6SVijay Mahadevan 
117032b8ab6SVijay Mahadevan #undef __FUNCT__
118aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
119853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
120aa768e4cSTim Tautges {
121aa768e4cSTim Tautges   PetscErrorCode ierr;
122aa768e4cSTim Tautges 
123aa768e4cSTim Tautges   PetscFunctionBegin;
124aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
125032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
126032b8ab6SVijay Mahadevan 
127032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
128032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
129032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
130032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
131032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
132032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
133032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
134032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
135032b8ab6SVijay Mahadevan 
136032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
137032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
138032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
139032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
140032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
141aa768e4cSTim Tautges 
14297ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
14397ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
144032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
145032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
14697ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
147032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
148032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
149032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
150032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
151aa768e4cSTim Tautges   PetscFunctionReturn(0);
152aa768e4cSTim Tautges }
153fd349b41STim Tautges 
154fd349b41STim Tautges #undef __FUNCT__
1551d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
1561d72bce8STim Tautges /*@
1571d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
1581d72bce8STim Tautges 
1591d72bce8STim Tautges   Collective on MPI_Comm
1601d72bce8STim Tautges 
1611d72bce8STim Tautges   Input Parameter:
1621d72bce8STim Tautges . comm - The communicator for the DMMoab object
1631d72bce8STim Tautges 
1641d72bce8STim Tautges   Output Parameter:
165032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
1661d72bce8STim Tautges 
1671d72bce8STim Tautges   Level: beginner
1681d72bce8STim Tautges 
1691d72bce8STim Tautges .keywords: DMMoab, create
1701d72bce8STim Tautges @*/
171032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
1721d72bce8STim Tautges {
1731d72bce8STim Tautges   PetscErrorCode ierr;
1741d72bce8STim Tautges 
1751d72bce8STim Tautges   PetscFunctionBegin;
176032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
177032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
178032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
1791d72bce8STim Tautges   PetscFunctionReturn(0);
1801d72bce8STim Tautges }
1811d72bce8STim Tautges 
1821d72bce8STim Tautges #undef __FUNCT__
183aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
1841d72bce8STim Tautges /*@
185a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
1861d72bce8STim Tautges 
1871d72bce8STim Tautges   Collective on MPI_Comm
1881d72bce8STim Tautges 
1891d72bce8STim Tautges   Input Parameter:
1901d72bce8STim Tautges . comm - The communicator for the DMMoab object
191032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
192a4d2169cSTim Tautges          along with the DMMoab
193a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
1941d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
1951d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
1961d72bce8STim Tautges 
1971d72bce8STim Tautges   Output Parameter:
198032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
1991d72bce8STim Tautges 
200032b8ab6SVijay Mahadevan   Level: intermediate
2011d72bce8STim Tautges 
2021d72bce8STim Tautges .keywords: DMMoab, create
2031d72bce8STim Tautges @*/
204032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
2051d72bce8STim Tautges {
2061d72bce8STim Tautges   PetscErrorCode ierr;
207032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
208853cdec3SJed Brown   DM_Moab        *dmmoab;
2091d72bce8STim Tautges 
2101d72bce8STim Tautges   PetscFunctionBegin;
211032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
212032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
213032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
214a4d2169cSTim Tautges 
215a4d2169cSTim Tautges   if (!mbiface) {
216a4d2169cSTim Tautges     mbiface = new moab::Core();
2177d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
2181d72bce8STim Tautges   }
2197d89fc02STim Tautges   else
2207d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
2217d89fc02STim Tautges 
222a4d2169cSTim Tautges   if (!pcomm) {
223032b8ab6SVijay Mahadevan     moab::EntityHandle rootset,partnset;
2241d72bce8STim Tautges     PetscInt rank, nprocs;
225032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
226032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
227032b8ab6SVijay Mahadevan 
228db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
229db66d124SVijay Mahadevan        to the load_file functions to be populated. */
230032b8ab6SVijay Mahadevan     merr = mbiface->create_meshset(moab::MESHSET_SET, rootset);
231032b8ab6SVijay Mahadevan     MBERR("Creating root set failed", merr);
232032b8ab6SVijay Mahadevan     merr = mbiface->create_meshset(moab::MESHSET_SET, partnset);
233032b8ab6SVijay Mahadevan     MBERR("Creating partition set failed", merr);
234032b8ab6SVijay Mahadevan 
235db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
236032b8ab6SVijay Mahadevan     pcomm = moab::ParallelComm::get_pcomm(mbiface, partnset, &comm);
237032b8ab6SVijay Mahadevan   }
238032b8ab6SVijay Mahadevan 
239032b8ab6SVijay Mahadevan   if (!ltog_tag) {
240032b8ab6SVijay Mahadevan     merr = mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, *ltog_tag);MBERRNM(merr);
241032b8ab6SVijay Mahadevan   }
242032b8ab6SVijay Mahadevan   else {
243032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
244a4d2169cSTim Tautges   }
245a4d2169cSTim Tautges 
246db66d124SVijay Mahadevan   /* do the initialization of the DM */
247032b8ab6SVijay Mahadevan   dmmoab->bs       = 1;
248032b8ab6SVijay Mahadevan   ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
249032b8ab6SVijay Mahadevan   dmmoab->ltog_tag = *ltog_tag;
250a4d2169cSTim Tautges   if (range) {
251032b8ab6SVijay Mahadevan     ierr = DMMoabSetRange(*dmb, range);CHKERRQ(ierr);
252a4d2169cSTim Tautges   }
2531d72bce8STim Tautges   PetscFunctionReturn(0);
2541d72bce8STim Tautges }
2551d72bce8STim Tautges 
2561d72bce8STim Tautges #undef __FUNCT__
2571d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
258aa768e4cSTim Tautges /*@
259aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
260aa768e4cSTim Tautges 
261aa768e4cSTim Tautges   Collective on MPI_Comm
262aa768e4cSTim Tautges 
263aa768e4cSTim Tautges   Input Parameter:
264aa768e4cSTim Tautges . dm    - The DMMoab object being set
265aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
266aa768e4cSTim Tautges 
267aa768e4cSTim Tautges   Level: beginner
268aa768e4cSTim Tautges 
269aa768e4cSTim Tautges .keywords: DMMoab, create
270aa768e4cSTim Tautges @*/
2711d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
2721d72bce8STim Tautges {
273032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
274032b8ab6SVijay Mahadevan 
2751d72bce8STim Tautges   PetscFunctionBegin;
2761d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
277032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
278032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
279032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2801d72bce8STim Tautges   PetscFunctionReturn(0);
2811d72bce8STim Tautges }
2821d72bce8STim Tautges 
2831d72bce8STim Tautges 
2841d72bce8STim Tautges #undef __FUNCT__
2851d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
286aa768e4cSTim Tautges /*@
287aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
288aa768e4cSTim Tautges 
289aa768e4cSTim Tautges   Collective on MPI_Comm
290aa768e4cSTim Tautges 
291aa768e4cSTim Tautges   Input Parameter:
292aa768e4cSTim Tautges . dm    - The DMMoab object being set
293aa768e4cSTim Tautges 
294aa768e4cSTim Tautges   Output Parameter:
295aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
296aa768e4cSTim Tautges 
297aa768e4cSTim Tautges   Level: beginner
298aa768e4cSTim Tautges 
299aa768e4cSTim Tautges .keywords: DMMoab, create
300aa768e4cSTim Tautges @*/
3011d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
3021d72bce8STim Tautges {
3031d72bce8STim Tautges   PetscFunctionBegin;
3041d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
305032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
3061d72bce8STim Tautges   PetscFunctionReturn(0);
3071d72bce8STim Tautges }
3081d72bce8STim Tautges 
3091d72bce8STim Tautges 
3101d72bce8STim Tautges #undef __FUNCT__
3111d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
312aa768e4cSTim Tautges /*@
313aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
314aa768e4cSTim Tautges 
315aa768e4cSTim Tautges   Collective on MPI_Comm
316aa768e4cSTim Tautges 
317aa768e4cSTim Tautges   Input Parameter:
318aa768e4cSTim Tautges . dm      - The DMMoab object being set
319aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
320aa768e4cSTim Tautges 
321aa768e4cSTim Tautges   Level: beginner
322aa768e4cSTim Tautges 
323aa768e4cSTim Tautges .keywords: DMMoab, create
324aa768e4cSTim Tautges @*/
325a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
3261d72bce8STim Tautges {
327032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
328032b8ab6SVijay Mahadevan 
3291d72bce8STim Tautges   PetscFunctionBegin;
3301d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
331032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
332032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
333032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
3341d72bce8STim Tautges   PetscFunctionReturn(0);
3351d72bce8STim Tautges }
3361d72bce8STim Tautges 
3371d72bce8STim Tautges 
3381d72bce8STim Tautges #undef __FUNCT__
3391d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
340aa768e4cSTim Tautges /*@
341aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
342aa768e4cSTim Tautges 
343aa768e4cSTim Tautges   Collective on MPI_Comm
344aa768e4cSTim Tautges 
345aa768e4cSTim Tautges   Input Parameter:
346aa768e4cSTim Tautges . dm      - The DMMoab object being set
347aa768e4cSTim Tautges 
348aa768e4cSTim Tautges   Output Parameter:
349aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
350aa768e4cSTim Tautges 
351aa768e4cSTim Tautges   Level: beginner
352aa768e4cSTim Tautges 
353aa768e4cSTim Tautges .keywords: DMMoab, create
354aa768e4cSTim Tautges @*/
355a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
3561d72bce8STim Tautges {
3579426e041SSatish Balay   PetscErrorCode   ierr;
358cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
359cabb514dSBarry Smith 
3601d72bce8STim Tautges   PetscFunctionBegin;
3611d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
362cabb514dSBarry 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);
363a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
3641d72bce8STim Tautges   PetscFunctionReturn(0);
3651d72bce8STim Tautges }
3661d72bce8STim Tautges 
3671d72bce8STim Tautges 
3681d72bce8STim Tautges #undef __FUNCT__
3691d72bce8STim Tautges #define __FUNCT__ "DMMoabSetRange"
370aa768e4cSTim Tautges /*@
371aa768e4cSTim Tautges   DMMoabSetRange - Set the entities having DOFs on this DMMoab
372aa768e4cSTim Tautges 
373aa768e4cSTim Tautges   Collective on MPI_Comm
374aa768e4cSTim Tautges 
375aa768e4cSTim Tautges   Input Parameter:
376aa768e4cSTim Tautges . dm    - The DMMoab object being set
377aa768e4cSTim Tautges . range - The entities treated by this DMMoab
378aa768e4cSTim Tautges 
379aa768e4cSTim Tautges   Level: beginner
380aa768e4cSTim Tautges 
381aa768e4cSTim Tautges .keywords: DMMoab, create
382aa768e4cSTim Tautges @*/
383032b8ab6SVijay Mahadevan PetscErrorCode DMMoabSetRange(DM dm,moab::Range *range)
3841d72bce8STim Tautges {
385032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
386032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
387032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
388032b8ab6SVijay Mahadevan 
3891d72bce8STim Tautges   PetscFunctionBegin;
3901d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
391032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
392032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
393032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
394032b8ab6SVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
395032b8ab6SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
396032b8ab6SVijay Mahadevan   *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned);
397032b8ab6SVijay Mahadevan   dmmoab->nloc=dmmoab->vowned->size();
398032b8ab6SVijay Mahadevan   dmmoab->nghost=dmmoab->vghost->size();
399032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4001d72bce8STim Tautges   PetscFunctionReturn(0);
4011d72bce8STim Tautges }
4021d72bce8STim Tautges 
4031d72bce8STim Tautges 
4041d72bce8STim Tautges #undef __FUNCT__
4051d72bce8STim Tautges #define __FUNCT__ "DMMoabGetRange"
406aa768e4cSTim Tautges /*@
407aa768e4cSTim Tautges   DMMoabGetRange - Get the entities having DOFs on this DMMoab
408aa768e4cSTim Tautges 
409aa768e4cSTim Tautges   Collective on MPI_Comm
410aa768e4cSTim Tautges 
411aa768e4cSTim Tautges   Input Parameter:
412aa768e4cSTim Tautges . dm    - The DMMoab object being set
413aa768e4cSTim Tautges 
414aa768e4cSTim Tautges   Output Parameter:
415aa768e4cSTim Tautges . range - The entities treated by this DMMoab
416aa768e4cSTim Tautges 
417aa768e4cSTim Tautges   Level: beginner
418aa768e4cSTim Tautges 
419aa768e4cSTim Tautges .keywords: DMMoab, create
420aa768e4cSTim Tautges @*/
421032b8ab6SVijay Mahadevan PetscErrorCode DMMoabGetRange(DM dm,moab::Range **range)
4221d72bce8STim Tautges {
4231d72bce8STim Tautges   PetscFunctionBegin;
4241d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
425032b8ab6SVijay Mahadevan   *range = ((DM_Moab*)dm->data)->vowned;
4261d72bce8STim Tautges   PetscFunctionReturn(0);
4271d72bce8STim Tautges }
4281d72bce8STim Tautges 
4291d72bce8STim Tautges #undef __FUNCT__
4301d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
431aa768e4cSTim Tautges /*@
432aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
433aa768e4cSTim Tautges 
434aa768e4cSTim Tautges   Collective on MPI_Comm
435aa768e4cSTim Tautges 
436aa768e4cSTim Tautges   Input Parameter:
437aa768e4cSTim Tautges . dm      - The DMMoab object being set
438aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
439aa768e4cSTim Tautges 
440aa768e4cSTim Tautges   Level: beginner
441aa768e4cSTim Tautges 
442aa768e4cSTim Tautges .keywords: DMMoab, create
443aa768e4cSTim Tautges @*/
4441d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4451d72bce8STim Tautges {
4461d72bce8STim Tautges   PetscFunctionBegin;
4471d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4481d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4491d72bce8STim Tautges   PetscFunctionReturn(0);
4501d72bce8STim Tautges }
4511d72bce8STim Tautges 
4521d72bce8STim Tautges 
4531d72bce8STim Tautges #undef __FUNCT__
4541d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
455aa768e4cSTim Tautges /*@
456aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
457aa768e4cSTim Tautges 
458aa768e4cSTim Tautges   Collective on MPI_Comm
459aa768e4cSTim Tautges 
460aa768e4cSTim Tautges   Input Parameter:
461aa768e4cSTim Tautges . dm      - The DMMoab object being set
462aa768e4cSTim Tautges 
463aa768e4cSTim Tautges   Output Parameter:
464aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
465aa768e4cSTim Tautges 
466aa768e4cSTim Tautges   Level: beginner
467aa768e4cSTim Tautges 
468aa768e4cSTim Tautges .keywords: DMMoab, create
469aa768e4cSTim Tautges @*/
4701d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
4711d72bce8STim Tautges {
4721d72bce8STim Tautges   PetscFunctionBegin;
4731d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4741d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4751d72bce8STim Tautges   PetscFunctionReturn(0);
4761d72bce8STim Tautges }
4771d72bce8STim Tautges 
4781d72bce8STim Tautges 
4791d72bce8STim Tautges #undef __FUNCT__
4801d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
481aa768e4cSTim Tautges /*@
482aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
483aa768e4cSTim Tautges 
484aa768e4cSTim Tautges   Collective on MPI_Comm
485aa768e4cSTim Tautges 
486aa768e4cSTim Tautges   Input Parameter:
487aa768e4cSTim Tautges . dm - The DMMoab object being set
488aa768e4cSTim Tautges . bs - The block size used with this DMMoab
489aa768e4cSTim Tautges 
490aa768e4cSTim Tautges   Level: beginner
491aa768e4cSTim Tautges 
492aa768e4cSTim Tautges .keywords: DMMoab, create
493aa768e4cSTim Tautges @*/
4941d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
4951d72bce8STim Tautges {
4961d72bce8STim Tautges   PetscFunctionBegin;
4971d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4981d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
4991d72bce8STim Tautges   PetscFunctionReturn(0);
5001d72bce8STim Tautges }
5011d72bce8STim Tautges 
5021d72bce8STim Tautges 
5031d72bce8STim Tautges #undef __FUNCT__
5041d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
505aa768e4cSTim Tautges /*@
506aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
507aa768e4cSTim Tautges 
508aa768e4cSTim Tautges   Collective on MPI_Comm
509aa768e4cSTim Tautges 
510aa768e4cSTim Tautges   Input Parameter:
511aa768e4cSTim Tautges . dm - The DMMoab object being set
512aa768e4cSTim Tautges 
513aa768e4cSTim Tautges   Output Parameter:
514aa768e4cSTim Tautges . bs - The block size used with this DMMoab
515aa768e4cSTim Tautges 
516aa768e4cSTim Tautges   Level: beginner
517aa768e4cSTim Tautges 
518aa768e4cSTim Tautges .keywords: DMMoab, create
519aa768e4cSTim Tautges @*/
5201d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
5211d72bce8STim Tautges {
5221d72bce8STim Tautges   PetscFunctionBegin;
5231d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5241d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
5251d72bce8STim Tautges   PetscFunctionReturn(0);
5261d72bce8STim Tautges }
5271d72bce8STim Tautges 
528