xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 5eb88e9d85d73be3509d48e6bc37881f574c5fe5)
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;
4372ff976dSVijay Mahadevan   PetscInt                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     totsize=dmmoab->vlocal->size();
90032b8ab6SVijay Mahadevan     ierr = PetscMalloc(totsize*sizeof(PetscInt), &gsindices);CHKERRQ(ierr);
91032b8ab6SVijay Mahadevan     /* first get the local indices */
924a40b570SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&gsindices[0]);MBERRNM(merr);
934a40b570SVijay Mahadevan     /* next get the ghosted indices */
944a40b570SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&gsindices[dmmoab->nloc]);MBERRNM(merr);
95032b8ab6SVijay Mahadevan 
96032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
97032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
98032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
99032b8ab6SVijay Mahadevan 
100032b8ab6SVijay Mahadevan     /* global to local must retrieve ghost points */
101032b8ab6SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,gsindices,PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
102032b8ab6SVijay Mahadevan 
103db66d124SVijay Mahadevan     ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr);
104db66d124SVijay Mahadevan     ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr);
105032b8ab6SVijay Mahadevan 
106032b8ab6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
107032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
108032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
109032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
110032b8ab6SVijay Mahadevan     ierr = PetscFree(gsindices);CHKERRQ(ierr);
111032b8ab6SVijay Mahadevan   }
112032b8ab6SVijay Mahadevan 
113032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
114032b8ab6SVijay Mahadevan }
115032b8ab6SVijay Mahadevan 
116032b8ab6SVijay Mahadevan #undef __FUNCT__
117aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
118853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
119aa768e4cSTim Tautges {
120aa768e4cSTim Tautges   PetscErrorCode ierr;
121aa768e4cSTim Tautges 
122aa768e4cSTim Tautges   PetscFunctionBegin;
123aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
124032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
125032b8ab6SVijay Mahadevan 
126032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
127032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
128032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
129032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
130032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
131032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
132032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
133032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
134032b8ab6SVijay Mahadevan 
135032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
136032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
137032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
138032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
139032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
140aa768e4cSTim Tautges 
14197ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
14297ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
143032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
144032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
14597ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
146032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
147032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
148032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
149032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
150aa768e4cSTim Tautges   PetscFunctionReturn(0);
151aa768e4cSTim Tautges }
152fd349b41STim Tautges 
153fd349b41STim Tautges #undef __FUNCT__
1541d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
1551d72bce8STim Tautges /*@
1561d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
1571d72bce8STim Tautges 
1581d72bce8STim Tautges   Collective on MPI_Comm
1591d72bce8STim Tautges 
1601d72bce8STim Tautges   Input Parameter:
1611d72bce8STim Tautges . comm - The communicator for the DMMoab object
1621d72bce8STim Tautges 
1631d72bce8STim Tautges   Output Parameter:
164032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
1651d72bce8STim Tautges 
1661d72bce8STim Tautges   Level: beginner
1671d72bce8STim Tautges 
1681d72bce8STim Tautges .keywords: DMMoab, create
1691d72bce8STim Tautges @*/
170032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
1711d72bce8STim Tautges {
1721d72bce8STim Tautges   PetscErrorCode ierr;
1731d72bce8STim Tautges 
1741d72bce8STim Tautges   PetscFunctionBegin;
175032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
176032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
177032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
1781d72bce8STim Tautges   PetscFunctionReturn(0);
1791d72bce8STim Tautges }
1801d72bce8STim Tautges 
1811d72bce8STim Tautges #undef __FUNCT__
182aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
1831d72bce8STim Tautges /*@
184a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
1851d72bce8STim Tautges 
1861d72bce8STim Tautges   Collective on MPI_Comm
1871d72bce8STim Tautges 
1881d72bce8STim Tautges   Input Parameter:
1891d72bce8STim Tautges . comm - The communicator for the DMMoab object
190032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
191a4d2169cSTim Tautges          along with the DMMoab
192a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
1931d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
1941d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
1951d72bce8STim Tautges 
1961d72bce8STim Tautges   Output Parameter:
197032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
1981d72bce8STim Tautges 
199032b8ab6SVijay Mahadevan   Level: intermediate
2001d72bce8STim Tautges 
2011d72bce8STim Tautges .keywords: DMMoab, create
2021d72bce8STim Tautges @*/
203032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
2041d72bce8STim Tautges {
2051d72bce8STim Tautges   PetscErrorCode ierr;
206032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
207853cdec3SJed Brown   DM_Moab        *dmmoab;
2081d72bce8STim Tautges 
2091d72bce8STim Tautges   PetscFunctionBegin;
210032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
211032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
212032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
213a4d2169cSTim Tautges 
214a4d2169cSTim Tautges   if (!mbiface) {
21572ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
2167d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
2171d72bce8STim Tautges   }
2187d89fc02STim Tautges   else
2197d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
2207d89fc02STim Tautges 
221a4d2169cSTim Tautges   if (!pcomm) {
222032b8ab6SVijay Mahadevan     moab::EntityHandle rootset,partnset;
2231d72bce8STim Tautges     PetscInt rank, nprocs;
224032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
225032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
226032b8ab6SVijay Mahadevan 
227db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
228db66d124SVijay Mahadevan        to the load_file functions to be populated. */
22972ff976dSVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, rootset);
230032b8ab6SVijay Mahadevan     MBERR("Creating root set failed", merr);
23172ff976dSVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
232032b8ab6SVijay Mahadevan     MBERR("Creating partition set failed", merr);
233032b8ab6SVijay Mahadevan 
234db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
23572ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
23672ff976dSVijay Mahadevan   }
23772ff976dSVijay Mahadevan   else {
23872ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
239032b8ab6SVijay Mahadevan   }
240032b8ab6SVijay Mahadevan 
2414973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
2424973de03SVijay Mahadevan   dmmoab->bs       = 1;
2434973de03SVijay Mahadevan 
2444973de03SVijay Mahadevan   /* set global ID tag handle */
245032b8ab6SVijay Mahadevan   if (!ltog_tag) {
2464973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
247032b8ab6SVijay Mahadevan   }
248032b8ab6SVijay Mahadevan   else {
249032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
250a4d2169cSTim Tautges   }
251a4d2169cSTim Tautges 
252*5eb88e9dSVijay Mahadevan   /* create a fileset to store the hierarchy of entities belonging to current DM */
253*5eb88e9dSVijay Mahadevan   merr = mbiface->create_meshset(MESHSET_ORDERED, dmmoab->file_set);MBERRNM(ierr);
254*5eb88e9dSVijay Mahadevan 
2554973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
256a4d2169cSTim Tautges   if (range) {
257*5eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
258a4d2169cSTim Tautges   }
2591d72bce8STim Tautges   PetscFunctionReturn(0);
2601d72bce8STim Tautges }
2611d72bce8STim Tautges 
2621d72bce8STim Tautges #undef __FUNCT__
2631d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
264aa768e4cSTim Tautges /*@
265aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
266aa768e4cSTim Tautges 
267aa768e4cSTim Tautges   Collective on MPI_Comm
268aa768e4cSTim Tautges 
269aa768e4cSTim Tautges   Input Parameter:
270aa768e4cSTim Tautges . dm    - The DMMoab object being set
271aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
272aa768e4cSTim Tautges 
273aa768e4cSTim Tautges   Level: beginner
274aa768e4cSTim Tautges 
275aa768e4cSTim Tautges .keywords: DMMoab, create
276aa768e4cSTim Tautges @*/
2771d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
2781d72bce8STim Tautges {
279032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
280032b8ab6SVijay Mahadevan 
2811d72bce8STim Tautges   PetscFunctionBegin;
2821d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
283032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
284032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
285032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
2861d72bce8STim Tautges   PetscFunctionReturn(0);
2871d72bce8STim Tautges }
2881d72bce8STim Tautges 
2891d72bce8STim Tautges 
2901d72bce8STim Tautges #undef __FUNCT__
2911d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
292aa768e4cSTim Tautges /*@
293aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
294aa768e4cSTim Tautges 
295aa768e4cSTim Tautges   Collective on MPI_Comm
296aa768e4cSTim Tautges 
297aa768e4cSTim Tautges   Input Parameter:
298aa768e4cSTim Tautges . dm    - The DMMoab object being set
299aa768e4cSTim Tautges 
300aa768e4cSTim Tautges   Output Parameter:
301aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
302aa768e4cSTim Tautges 
303aa768e4cSTim Tautges   Level: beginner
304aa768e4cSTim Tautges 
305aa768e4cSTim Tautges .keywords: DMMoab, create
306aa768e4cSTim Tautges @*/
3071d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
3081d72bce8STim Tautges {
3091d72bce8STim Tautges   PetscFunctionBegin;
3101d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
311032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
3121d72bce8STim Tautges   PetscFunctionReturn(0);
3131d72bce8STim Tautges }
3141d72bce8STim Tautges 
3151d72bce8STim Tautges 
3161d72bce8STim Tautges #undef __FUNCT__
3171d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
318aa768e4cSTim Tautges /*@
319aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
320aa768e4cSTim Tautges 
321aa768e4cSTim Tautges   Collective on MPI_Comm
322aa768e4cSTim Tautges 
323aa768e4cSTim Tautges   Input Parameter:
324aa768e4cSTim Tautges . dm      - The DMMoab object being set
325aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
326aa768e4cSTim Tautges 
327aa768e4cSTim Tautges   Level: beginner
328aa768e4cSTim Tautges 
329aa768e4cSTim Tautges .keywords: DMMoab, create
330aa768e4cSTim Tautges @*/
331a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
3321d72bce8STim Tautges {
333032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
334032b8ab6SVijay Mahadevan 
3351d72bce8STim Tautges   PetscFunctionBegin;
3361d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
337032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
338032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
339032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
3401d72bce8STim Tautges   PetscFunctionReturn(0);
3411d72bce8STim Tautges }
3421d72bce8STim Tautges 
3431d72bce8STim Tautges 
3441d72bce8STim Tautges #undef __FUNCT__
3451d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
346aa768e4cSTim Tautges /*@
347aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
348aa768e4cSTim Tautges 
349aa768e4cSTim Tautges   Collective on MPI_Comm
350aa768e4cSTim Tautges 
351aa768e4cSTim Tautges   Input Parameter:
352aa768e4cSTim Tautges . dm      - The DMMoab object being set
353aa768e4cSTim Tautges 
354aa768e4cSTim Tautges   Output Parameter:
355aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
356aa768e4cSTim Tautges 
357aa768e4cSTim Tautges   Level: beginner
358aa768e4cSTim Tautges 
359aa768e4cSTim Tautges .keywords: DMMoab, create
360aa768e4cSTim Tautges @*/
361a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
3621d72bce8STim Tautges {
3639426e041SSatish Balay   PetscErrorCode   ierr;
364cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
365cabb514dSBarry Smith 
3661d72bce8STim Tautges   PetscFunctionBegin;
3671d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
368cabb514dSBarry 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);
369a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
3701d72bce8STim Tautges   PetscFunctionReturn(0);
3711d72bce8STim Tautges }
3721d72bce8STim Tautges 
3731d72bce8STim Tautges 
3741d72bce8STim Tautges #undef __FUNCT__
375*5eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
376aa768e4cSTim Tautges /*@
377*5eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
378aa768e4cSTim Tautges 
379aa768e4cSTim Tautges   Collective on MPI_Comm
380aa768e4cSTim Tautges 
381aa768e4cSTim Tautges   Input Parameter:
382aa768e4cSTim Tautges . dm    - The DMMoab object being set
383aa768e4cSTim Tautges . range - The entities treated by this DMMoab
384aa768e4cSTim Tautges 
385aa768e4cSTim Tautges   Level: beginner
386aa768e4cSTim Tautges 
387aa768e4cSTim Tautges .keywords: DMMoab, create
388aa768e4cSTim Tautges @*/
389*5eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
3901d72bce8STim Tautges {
391032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
392032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
393032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
394032b8ab6SVijay Mahadevan 
3951d72bce8STim Tautges   PetscFunctionBegin;
3961d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
397032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
398032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
399032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
400032b8ab6SVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
401032b8ab6SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
402032b8ab6SVijay Mahadevan   *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned);
403032b8ab6SVijay Mahadevan   dmmoab->nloc=dmmoab->vowned->size();
404032b8ab6SVijay Mahadevan   dmmoab->nghost=dmmoab->vghost->size();
405032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4061d72bce8STim Tautges   PetscFunctionReturn(0);
4071d72bce8STim Tautges }
4081d72bce8STim Tautges 
4091d72bce8STim Tautges 
4101d72bce8STim Tautges #undef __FUNCT__
411*5eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
412aa768e4cSTim Tautges /*@
413*5eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
414aa768e4cSTim Tautges 
415aa768e4cSTim Tautges   Collective on MPI_Comm
416aa768e4cSTim Tautges 
417aa768e4cSTim Tautges   Input Parameter:
418aa768e4cSTim Tautges . dm    - The DMMoab object being set
419aa768e4cSTim Tautges 
420aa768e4cSTim Tautges   Output Parameter:
421*5eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
422*5eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
423aa768e4cSTim Tautges 
424aa768e4cSTim Tautges   Level: beginner
425aa768e4cSTim Tautges 
426aa768e4cSTim Tautges .keywords: DMMoab, create
427aa768e4cSTim Tautges @*/
428*5eb88e9dSVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range **owned,moab::Range **ghost)
4291d72bce8STim Tautges {
4301d72bce8STim Tautges   PetscFunctionBegin;
4311d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
432*5eb88e9dSVijay Mahadevan   if (*owned) *owned = ((DM_Moab*)dm->data)->vowned;
433*5eb88e9dSVijay Mahadevan   if (*ghost) *ghost = ((DM_Moab*)dm->data)->vghost;
4341d72bce8STim Tautges   PetscFunctionReturn(0);
4351d72bce8STim Tautges }
4361d72bce8STim Tautges 
4371d72bce8STim Tautges #undef __FUNCT__
438*5eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
439*5eb88e9dSVijay Mahadevan /*@
440*5eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
441*5eb88e9dSVijay Mahadevan 
442*5eb88e9dSVijay Mahadevan   Collective on MPI_Comm
443*5eb88e9dSVijay Mahadevan 
444*5eb88e9dSVijay Mahadevan   Input Parameter:
445*5eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
446*5eb88e9dSVijay Mahadevan 
447*5eb88e9dSVijay Mahadevan   Output Parameter:
448*5eb88e9dSVijay Mahadevan . range - The entities owned locally
449*5eb88e9dSVijay Mahadevan 
450*5eb88e9dSVijay Mahadevan   Level: beginner
451*5eb88e9dSVijay Mahadevan 
452*5eb88e9dSVijay Mahadevan .keywords: DMMoab, create
453*5eb88e9dSVijay Mahadevan @*/
454*5eb88e9dSVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range **range)
455*5eb88e9dSVijay Mahadevan {
456*5eb88e9dSVijay Mahadevan   PetscFunctionBegin;
457*5eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
458*5eb88e9dSVijay Mahadevan   *range = ((DM_Moab*)dm->data)->elocal;
459*5eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
460*5eb88e9dSVijay Mahadevan }
461*5eb88e9dSVijay Mahadevan 
462*5eb88e9dSVijay Mahadevan 
463*5eb88e9dSVijay Mahadevan #undef __FUNCT__
4641d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
465aa768e4cSTim Tautges /*@
466aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
467aa768e4cSTim Tautges 
468aa768e4cSTim Tautges   Collective on MPI_Comm
469aa768e4cSTim Tautges 
470aa768e4cSTim Tautges   Input Parameter:
471aa768e4cSTim Tautges . dm      - The DMMoab object being set
472aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
473aa768e4cSTim Tautges 
474aa768e4cSTim Tautges   Level: beginner
475aa768e4cSTim Tautges 
476aa768e4cSTim Tautges .keywords: DMMoab, create
477aa768e4cSTim Tautges @*/
4781d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4791d72bce8STim Tautges {
4801d72bce8STim Tautges   PetscFunctionBegin;
4811d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4821d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4831d72bce8STim Tautges   PetscFunctionReturn(0);
4841d72bce8STim Tautges }
4851d72bce8STim Tautges 
4861d72bce8STim Tautges 
4871d72bce8STim Tautges #undef __FUNCT__
4881d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
489aa768e4cSTim Tautges /*@
490aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
491aa768e4cSTim Tautges 
492aa768e4cSTim Tautges   Collective on MPI_Comm
493aa768e4cSTim Tautges 
494aa768e4cSTim Tautges   Input Parameter:
495aa768e4cSTim Tautges . dm      - The DMMoab object being set
496aa768e4cSTim Tautges 
497aa768e4cSTim Tautges   Output Parameter:
498aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
499aa768e4cSTim Tautges 
500aa768e4cSTim Tautges   Level: beginner
501aa768e4cSTim Tautges 
502aa768e4cSTim Tautges .keywords: DMMoab, create
503aa768e4cSTim Tautges @*/
5041d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
5051d72bce8STim Tautges {
5061d72bce8STim Tautges   PetscFunctionBegin;
5071d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5081d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
5091d72bce8STim Tautges   PetscFunctionReturn(0);
5101d72bce8STim Tautges }
5111d72bce8STim Tautges 
5121d72bce8STim Tautges 
5131d72bce8STim Tautges #undef __FUNCT__
5141d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
515aa768e4cSTim Tautges /*@
516aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
517aa768e4cSTim Tautges 
518aa768e4cSTim Tautges   Collective on MPI_Comm
519aa768e4cSTim Tautges 
520aa768e4cSTim Tautges   Input Parameter:
521aa768e4cSTim Tautges . dm - The DMMoab object being set
522aa768e4cSTim Tautges . bs - The block size used with this DMMoab
523aa768e4cSTim Tautges 
524aa768e4cSTim Tautges   Level: beginner
525aa768e4cSTim Tautges 
526aa768e4cSTim Tautges .keywords: DMMoab, create
527aa768e4cSTim Tautges @*/
5281d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
5291d72bce8STim Tautges {
5301d72bce8STim Tautges   PetscFunctionBegin;
5311d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5321d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
5331d72bce8STim Tautges   PetscFunctionReturn(0);
5341d72bce8STim Tautges }
5351d72bce8STim Tautges 
5361d72bce8STim Tautges 
5371d72bce8STim Tautges #undef __FUNCT__
5381d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
539aa768e4cSTim Tautges /*@
540aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
541aa768e4cSTim Tautges 
542aa768e4cSTim Tautges   Collective on MPI_Comm
543aa768e4cSTim Tautges 
544aa768e4cSTim Tautges   Input Parameter:
545aa768e4cSTim Tautges . dm - The DMMoab object being set
546aa768e4cSTim Tautges 
547aa768e4cSTim Tautges   Output Parameter:
548aa768e4cSTim Tautges . bs - The block size used with this DMMoab
549aa768e4cSTim Tautges 
550aa768e4cSTim Tautges   Level: beginner
551aa768e4cSTim Tautges 
552aa768e4cSTim Tautges .keywords: DMMoab, create
553aa768e4cSTim Tautges @*/
5541d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
5551d72bce8STim Tautges {
5561d72bce8STim Tautges   PetscFunctionBegin;
5571d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5581d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
5591d72bce8STim Tautges   PetscFunctionReturn(0);
5601d72bce8STim Tautges }
5611d72bce8STim Tautges 
562