xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision db66d124cedba962fb8ceb469cd36885b3f01337)
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;
41*db66d124SVijay 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) {
82*db66d124SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
83*db66d124SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
84*db66d124SVijay 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 */
93032b8ab6SVijay Mahadevan     for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
94032b8ab6SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&(*iter),1,&dof);MBERRNM(merr);
95032b8ab6SVijay Mahadevan       gsindices[count++] = (dof);
96032b8ab6SVijay Mahadevan     }
97032b8ab6SVijay Mahadevan     /* now get the ghosted indices */
98032b8ab6SVijay Mahadevan     for(iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++) {
99032b8ab6SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&(*iter),1,&dof);MBERRNM(merr);
100032b8ab6SVijay Mahadevan       gsindices[count++] = (dof);
101032b8ab6SVijay Mahadevan     }
102032b8ab6SVijay Mahadevan 
103032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
104032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
105032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
106032b8ab6SVijay Mahadevan 
107032b8ab6SVijay Mahadevan     /* global to local must retrieve ghost points */
108032b8ab6SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,gsindices,PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
109032b8ab6SVijay Mahadevan 
110*db66d124SVijay Mahadevan     ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr);
111*db66d124SVijay Mahadevan     ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr);
112032b8ab6SVijay Mahadevan 
113032b8ab6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
114032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
115032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
116032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
117032b8ab6SVijay Mahadevan     ierr = PetscFree(gsindices);CHKERRQ(ierr);
118032b8ab6SVijay Mahadevan   }
119032b8ab6SVijay Mahadevan 
120032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
121032b8ab6SVijay Mahadevan }
122032b8ab6SVijay Mahadevan 
123032b8ab6SVijay Mahadevan #undef __FUNCT__
124aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
125853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
126aa768e4cSTim Tautges {
127aa768e4cSTim Tautges   PetscErrorCode ierr;
128aa768e4cSTim Tautges 
129aa768e4cSTim Tautges   PetscFunctionBegin;
130aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
131032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
132032b8ab6SVijay Mahadevan 
133032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
134032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
135032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
136032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
137032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
138032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
139032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
140032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
141032b8ab6SVijay Mahadevan 
142032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
143032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
144032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
145032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
146032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
147aa768e4cSTim Tautges 
14897ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
14997ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
150032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
151032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
15297ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
153032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
154032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
155032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
156032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
157aa768e4cSTim Tautges   PetscFunctionReturn(0);
158aa768e4cSTim Tautges }
159fd349b41STim Tautges 
160fd349b41STim Tautges #undef __FUNCT__
1611d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
1621d72bce8STim Tautges /*@
1631d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
1641d72bce8STim Tautges 
1651d72bce8STim Tautges   Collective on MPI_Comm
1661d72bce8STim Tautges 
1671d72bce8STim Tautges   Input Parameter:
1681d72bce8STim Tautges . comm - The communicator for the DMMoab object
1691d72bce8STim Tautges 
1701d72bce8STim Tautges   Output Parameter:
171032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
1721d72bce8STim Tautges 
1731d72bce8STim Tautges   Level: beginner
1741d72bce8STim Tautges 
1751d72bce8STim Tautges .keywords: DMMoab, create
1761d72bce8STim Tautges @*/
177032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
1781d72bce8STim Tautges {
1791d72bce8STim Tautges   PetscErrorCode ierr;
1801d72bce8STim Tautges 
1811d72bce8STim Tautges   PetscFunctionBegin;
182032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
183032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
184032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
1851d72bce8STim Tautges   PetscFunctionReturn(0);
1861d72bce8STim Tautges }
1871d72bce8STim Tautges 
1881d72bce8STim Tautges #undef __FUNCT__
189aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
1901d72bce8STim Tautges /*@
191a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
1921d72bce8STim Tautges 
1931d72bce8STim Tautges   Collective on MPI_Comm
1941d72bce8STim Tautges 
1951d72bce8STim Tautges   Input Parameter:
1961d72bce8STim Tautges . comm - The communicator for the DMMoab object
197032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
198a4d2169cSTim Tautges          along with the DMMoab
199a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
2001d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
2011d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
2021d72bce8STim Tautges 
2031d72bce8STim Tautges   Output Parameter:
204032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2051d72bce8STim Tautges 
206032b8ab6SVijay Mahadevan   Level: intermediate
2071d72bce8STim Tautges 
2081d72bce8STim Tautges .keywords: DMMoab, create
2091d72bce8STim Tautges @*/
210032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
2111d72bce8STim Tautges {
2121d72bce8STim Tautges   PetscErrorCode ierr;
213032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
214853cdec3SJed Brown   DM_Moab        *dmmoab;
2151d72bce8STim Tautges 
2161d72bce8STim Tautges   PetscFunctionBegin;
217032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
218032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
219032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
220a4d2169cSTim Tautges 
221a4d2169cSTim Tautges   if (!mbiface) {
222a4d2169cSTim Tautges     mbiface = new moab::Core();
2237d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
2241d72bce8STim Tautges   }
2257d89fc02STim Tautges   else
2267d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
2277d89fc02STim Tautges 
228a4d2169cSTim Tautges   if (!pcomm) {
229032b8ab6SVijay Mahadevan     moab::EntityHandle rootset,partnset;
2301d72bce8STim Tautges     PetscInt rank, nprocs;
231032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
232032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
233032b8ab6SVijay Mahadevan 
234*db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
235*db66d124SVijay Mahadevan        to the load_file functions to be populated. */
236032b8ab6SVijay Mahadevan     merr = mbiface->create_meshset(moab::MESHSET_SET, rootset);
237032b8ab6SVijay Mahadevan     MBERR("Creating root set failed", merr);
238032b8ab6SVijay Mahadevan     merr = mbiface->create_meshset(moab::MESHSET_SET, partnset);
239032b8ab6SVijay Mahadevan     MBERR("Creating partition set failed", merr);
240032b8ab6SVijay Mahadevan 
241*db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
242032b8ab6SVijay Mahadevan     pcomm = moab::ParallelComm::get_pcomm(mbiface, partnset, &comm);
243032b8ab6SVijay Mahadevan   }
244032b8ab6SVijay Mahadevan 
245032b8ab6SVijay Mahadevan   if (!ltog_tag) {
246032b8ab6SVijay Mahadevan     merr = mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, *ltog_tag);MBERRNM(merr);
247032b8ab6SVijay Mahadevan   }
248032b8ab6SVijay Mahadevan   else {
249032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
250a4d2169cSTim Tautges   }
251a4d2169cSTim Tautges 
252*db66d124SVijay Mahadevan   /* do the initialization of the DM */
253032b8ab6SVijay Mahadevan   dmmoab->bs       = 1;
254032b8ab6SVijay Mahadevan   ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
255032b8ab6SVijay Mahadevan   dmmoab->ltog_tag = *ltog_tag;
256a4d2169cSTim Tautges   if (range) {
257032b8ab6SVijay Mahadevan     ierr = DMMoabSetRange(*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__
3751d72bce8STim Tautges #define __FUNCT__ "DMMoabSetRange"
376aa768e4cSTim Tautges /*@
377aa768e4cSTim Tautges   DMMoabSetRange - 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 @*/
389032b8ab6SVijay Mahadevan PetscErrorCode DMMoabSetRange(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__
4111d72bce8STim Tautges #define __FUNCT__ "DMMoabGetRange"
412aa768e4cSTim Tautges /*@
413aa768e4cSTim Tautges   DMMoabGetRange - 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:
421aa768e4cSTim Tautges . range - The entities treated by this DMMoab
422aa768e4cSTim Tautges 
423aa768e4cSTim Tautges   Level: beginner
424aa768e4cSTim Tautges 
425aa768e4cSTim Tautges .keywords: DMMoab, create
426aa768e4cSTim Tautges @*/
427032b8ab6SVijay Mahadevan PetscErrorCode DMMoabGetRange(DM dm,moab::Range **range)
4281d72bce8STim Tautges {
4291d72bce8STim Tautges   PetscFunctionBegin;
4301d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
431032b8ab6SVijay Mahadevan   *range = ((DM_Moab*)dm->data)->vowned;
4321d72bce8STim Tautges   PetscFunctionReturn(0);
4331d72bce8STim Tautges }
4341d72bce8STim Tautges 
4351d72bce8STim Tautges #undef __FUNCT__
4361d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
437aa768e4cSTim Tautges /*@
438aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
439aa768e4cSTim Tautges 
440aa768e4cSTim Tautges   Collective on MPI_Comm
441aa768e4cSTim Tautges 
442aa768e4cSTim Tautges   Input Parameter:
443aa768e4cSTim Tautges . dm      - The DMMoab object being set
444aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
445aa768e4cSTim Tautges 
446aa768e4cSTim Tautges   Level: beginner
447aa768e4cSTim Tautges 
448aa768e4cSTim Tautges .keywords: DMMoab, create
449aa768e4cSTim Tautges @*/
4501d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
4511d72bce8STim Tautges {
4521d72bce8STim Tautges   PetscFunctionBegin;
4531d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4541d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
4551d72bce8STim Tautges   PetscFunctionReturn(0);
4561d72bce8STim Tautges }
4571d72bce8STim Tautges 
4581d72bce8STim Tautges 
4591d72bce8STim Tautges #undef __FUNCT__
4601d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
461aa768e4cSTim Tautges /*@
462aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
463aa768e4cSTim Tautges 
464aa768e4cSTim Tautges   Collective on MPI_Comm
465aa768e4cSTim Tautges 
466aa768e4cSTim Tautges   Input Parameter:
467aa768e4cSTim Tautges . dm      - The DMMoab object being set
468aa768e4cSTim Tautges 
469aa768e4cSTim Tautges   Output Parameter:
470aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
471aa768e4cSTim Tautges 
472aa768e4cSTim Tautges   Level: beginner
473aa768e4cSTim Tautges 
474aa768e4cSTim Tautges .keywords: DMMoab, create
475aa768e4cSTim Tautges @*/
4761d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
4771d72bce8STim Tautges {
4781d72bce8STim Tautges   PetscFunctionBegin;
4791d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4801d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
4811d72bce8STim Tautges   PetscFunctionReturn(0);
4821d72bce8STim Tautges }
4831d72bce8STim Tautges 
4841d72bce8STim Tautges 
4851d72bce8STim Tautges #undef __FUNCT__
4861d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
487aa768e4cSTim Tautges /*@
488aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
489aa768e4cSTim Tautges 
490aa768e4cSTim Tautges   Collective on MPI_Comm
491aa768e4cSTim Tautges 
492aa768e4cSTim Tautges   Input Parameter:
493aa768e4cSTim Tautges . dm - The DMMoab object being set
494aa768e4cSTim Tautges . bs - The block size used with this DMMoab
495aa768e4cSTim Tautges 
496aa768e4cSTim Tautges   Level: beginner
497aa768e4cSTim Tautges 
498aa768e4cSTim Tautges .keywords: DMMoab, create
499aa768e4cSTim Tautges @*/
5001d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
5011d72bce8STim Tautges {
5021d72bce8STim Tautges   PetscFunctionBegin;
5031d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5041d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
5051d72bce8STim Tautges   PetscFunctionReturn(0);
5061d72bce8STim Tautges }
5071d72bce8STim Tautges 
5081d72bce8STim Tautges 
5091d72bce8STim Tautges #undef __FUNCT__
5101d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
511aa768e4cSTim Tautges /*@
512aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
513aa768e4cSTim Tautges 
514aa768e4cSTim Tautges   Collective on MPI_Comm
515aa768e4cSTim Tautges 
516aa768e4cSTim Tautges   Input Parameter:
517aa768e4cSTim Tautges . dm - The DMMoab object being set
518aa768e4cSTim Tautges 
519aa768e4cSTim Tautges   Output Parameter:
520aa768e4cSTim Tautges . bs - The block size used with this DMMoab
521aa768e4cSTim Tautges 
522aa768e4cSTim Tautges   Level: beginner
523aa768e4cSTim Tautges 
524aa768e4cSTim Tautges .keywords: DMMoab, create
525aa768e4cSTim Tautges @*/
5261d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
5271d72bce8STim Tautges {
5281d72bce8STim Tautges   PetscFunctionBegin;
5291d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5301d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
5311d72bce8STim Tautges   PetscFunctionReturn(0);
5321d72bce8STim Tautges }
5331d72bce8STim Tautges 
534