xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 69263071456f3176e792c7fb7a818ae842e0b661)
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>
61cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
7032b8ab6SVijay Mahadevan 
8853cdec3SJed Brown #undef __FUNCT__
9853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab"
10853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm)
11853cdec3SJed Brown {
12853cdec3SJed Brown   PetscErrorCode ierr;
13032b8ab6SVijay Mahadevan   DM_Moab         *dmmoab = (DM_Moab*)dm->data;
14853cdec3SJed Brown 
15853cdec3SJed Brown   PetscFunctionBegin;
16853cdec3SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
17032b8ab6SVijay Mahadevan   if (dmmoab->icreatedinstance) {
18032b8ab6SVijay Mahadevan     delete dmmoab->mbiface;
19853cdec3SJed Brown   }
20032b8ab6SVijay Mahadevan   dmmoab->mbiface = NULL;
21032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
22032b8ab6SVijay Mahadevan   delete dmmoab->vlocal;
23032b8ab6SVijay Mahadevan   delete dmmoab->vowned;
24032b8ab6SVijay Mahadevan   delete dmmoab->vghost;
25032b8ab6SVijay Mahadevan   delete dmmoab->elocal;
26032b8ab6SVijay Mahadevan   delete dmmoab->eghost;
271cec0304SVijay Mahadevan   delete dmmoab->bndyvtx;
281cec0304SVijay Mahadevan   delete dmmoab->bndyfaces;
29*69263071SVijay Mahadevan   delete dmmoab->bndyelems;
30fc418013SVijay Mahadevan 
31fc418013SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
32032b8ab6SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
33032b8ab6SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
34853cdec3SJed Brown   ierr = PetscFree(dm->data);CHKERRQ(ierr);
35853cdec3SJed Brown   PetscFunctionReturn(0);
36853cdec3SJed Brown }
37853cdec3SJed Brown 
38aa768e4cSTim Tautges #undef __FUNCT__
39032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
40032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm)
41032b8ab6SVijay Mahadevan {
42032b8ab6SVijay Mahadevan   PetscErrorCode          ierr;
43032b8ab6SVijay Mahadevan   moab::ErrorCode         merr;
44032b8ab6SVijay Mahadevan   Vec                     local, global;
45032b8ab6SVijay Mahadevan   IS                      from;
46032b8ab6SVijay Mahadevan   moab::Range::iterator   iter;
47fc418013SVijay Mahadevan   PetscInt                i,j,bs,gsiz,lsiz;
48032b8ab6SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
49fc418013SVijay Mahadevan   PetscInt                totsize,local_min,local_max,global_min;
501cec0304SVijay Mahadevan   PetscSection            section;
51032b8ab6SVijay Mahadevan 
52*69263071SVijay Mahadevan   moab::Range adj;
53*69263071SVijay Mahadevan 
54032b8ab6SVijay Mahadevan   PetscFunctionBegin;
55032b8ab6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
56032b8ab6SVijay Mahadevan   /* Get the local and shared vertices and cache it */
57032b8ab6SVijay 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.");
58032b8ab6SVijay Mahadevan 
591cec0304SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
60032b8ab6SVijay Mahadevan   if (dmmoab->vlocal->empty()) {
611cec0304SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
62032b8ab6SVijay Mahadevan 
63032b8ab6SVijay Mahadevan     /* filter based on parallel status */
64fc418013SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
65032b8ab6SVijay Mahadevan     *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
66032b8ab6SVijay Mahadevan 
67032b8ab6SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
68032b8ab6SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
69032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
70fc418013SVijay Mahadevan 
71e23c60ebSVijay Mahadevan #if 0
72fc418013SVijay Mahadevan     if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) {
73fc418013SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost);
74fc418013SVijay Mahadevan       dmmoab->vlocal->print(0);
75fc418013SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc);
76fc418013SVijay Mahadevan       dmmoab->vowned->print(0);
77fc418013SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost);
78fc418013SVijay Mahadevan       dmmoab->vghost->print(0);
79fc418013SVijay Mahadevan     }
80fc418013SVijay Mahadevan #endif
81032b8ab6SVijay Mahadevan   }
82032b8ab6SVijay Mahadevan 
83032b8ab6SVijay Mahadevan   /* get the information about the local elements in the mesh */
84032b8ab6SVijay Mahadevan   {
85032b8ab6SVijay Mahadevan     dmmoab->eghost->clear();
86fc418013SVijay Mahadevan 
87fc418013SVijay Mahadevan     /* first decipher the leading dimension */
88fc418013SVijay Mahadevan     for (i=3;i>0;i--) {
89fc418013SVijay Mahadevan       dmmoab->elocal->clear();
90fc418013SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
91fc418013SVijay Mahadevan 
92fc418013SVijay Mahadevan       /* store the current mesh dimension */
93fc418013SVijay Mahadevan       if (dmmoab->elocal->size()) {
94fc418013SVijay Mahadevan         dmmoab->dim=i;
95fc418013SVijay Mahadevan         break;
96fc418013SVijay Mahadevan       }
97fc418013SVijay Mahadevan     }
98fc418013SVijay Mahadevan 
99032b8ab6SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
100032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
101032b8ab6SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
102032b8ab6SVijay Mahadevan 
103032b8ab6SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
104032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
105032b8ab6SVijay Mahadevan   }
106032b8ab6SVijay Mahadevan 
107032b8ab6SVijay Mahadevan   bs = dmmoab->bs;
108032b8ab6SVijay Mahadevan   if (!dmmoab->ltog_tag) {
109db66d124SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
110db66d124SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
111db66d124SVijay Mahadevan        assemble the individual pieces of the mesh */
112032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
113032b8ab6SVijay Mahadevan   }
114032b8ab6SVijay Mahadevan 
115032b8ab6SVijay Mahadevan   totsize=dmmoab->vlocal->size();
116fc418013SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr);
1171cec0304SVijay Mahadevan   {
118032b8ab6SVijay Mahadevan     /* first get the local indices */
119fc418013SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
1204a40b570SVijay Mahadevan     /* next get the ghosted indices */
121fc418013SVijay Mahadevan     if (dmmoab->nghost) {
122fc418013SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1231cec0304SVijay Mahadevan     }
1246e40195eSVijay Mahadevan 
1256e40195eSVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
126fc418013SVijay Mahadevan     local_min=local_max=dmmoab->gsindices[0];
127*69263071SVijay Mahadevan     for (i=0; i<totsize; ++i) {
128fc418013SVijay Mahadevan //      if (dmmoab->pcomm->rank())
129fc418013SVijay Mahadevan //        PetscPrintf(PETSC_COMM_SELF, "[%D] gsindices[%D] = %D\n", dmmoab->pcomm->rank(), i, dmmoab->gsindices[i]);
130fc418013SVijay Mahadevan       if(local_min>dmmoab->gsindices[i]) local_min=dmmoab->gsindices[i];
131fc418013SVijay Mahadevan       if(local_max<dmmoab->gsindices[i]) local_max=dmmoab->gsindices[i];
132fc418013SVijay Mahadevan     }
1336e40195eSVijay Mahadevan 
1346e40195eSVijay Mahadevan     ierr = MPI_Allreduce(&local_min, &global_min, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
135fc418013SVijay Mahadevan     PetscInfo3(dm, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", local_min, local_max, global_min);
136fc418013SVijay Mahadevan //    PetscPrintf(PETSC_COMM_SELF, "[%D] GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", dmmoab->pcomm->rank(), local_min, local_max, global_min);
1371cec0304SVijay Mahadevan   }
138032b8ab6SVijay Mahadevan 
1391cec0304SVijay Mahadevan   {
1401cec0304SVijay Mahadevan     ierr = PetscSectionCreate(((PetscObject)dm)->comm, &section);CHKERRQ(ierr);
1411cec0304SVijay Mahadevan     ierr = PetscSectionSetNumFields(section, dmmoab->nfields);CHKERRQ(ierr);
142fc418013SVijay Mahadevan //    ierr = PetscSectionSetChart(section, dmmoab->gsindices[0], dmmoab->gsindices[dmmoab->nloc-1]+1);CHKERRQ(ierr);
143fc418013SVijay Mahadevan     ierr = PetscSectionSetChart(section, local_min, local_max+1);CHKERRQ(ierr);
144fc418013SVijay Mahadevan     for (j=0; j<totsize; ++j) {
145fc418013SVijay Mahadevan       PetscInt locgid = dmmoab->gsindices[j];
1461cec0304SVijay Mahadevan       for (i=0; i < dmmoab->nfields; ++i) {
1471cec0304SVijay Mahadevan         ierr = PetscSectionSetFieldName(section, i, dmmoab->fields[i]);CHKERRQ(ierr);
1481cec0304SVijay Mahadevan         if (bs>1) {
149fc418013SVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, locgid, i, (locgid-global_min)*dmmoab->nfields+i);CHKERRQ(ierr);
150fc418013SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, locgid, i, (locgid-global_min)*dmmoab->nfields);
1511cec0304SVijay Mahadevan         }
1521cec0304SVijay Mahadevan         else {
153*69263071SVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, locgid, i, dmmoab->n*i+locgid-global_min);CHKERRQ(ierr);
154*69263071SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, locgid, i, i*dmmoab->n);
155*69263071SVijay Mahadevan           PetscPrintf(PETSC_COMM_SELF, "[%D] Local_GID = %D, FDOF = %D, OFF = %D.\n", dmmoab->pcomm->rank(), locgid, dmmoab->n*i+locgid-global_min, i*dmmoab->n );
1561cec0304SVijay Mahadevan         }
1571cec0304SVijay Mahadevan       }
158fc418013SVijay Mahadevan       ierr = PetscSectionSetDof(section, locgid, dmmoab->nfields);CHKERRQ(ierr);
1591cec0304SVijay Mahadevan     }
1601cec0304SVijay Mahadevan     ierr = PetscSectionSetUp(section);CHKERRQ(ierr);
1611cec0304SVijay Mahadevan     ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr);
1621cec0304SVijay Mahadevan   }
1631cec0304SVijay Mahadevan 
1641cec0304SVijay Mahadevan   {
165fc418013SVijay Mahadevan     for (i=0; i<totsize; ++i) {
166fc418013SVijay Mahadevan       dmmoab->gsindices[i]-=global_min;   /* zero based index needed for IS */
167fc418013SVijay Mahadevan //      if (dmmoab->pcomm->rank())
168fc418013SVijay Mahadevan //        PetscPrintf(PETSC_COMM_SELF, "[%D] modified gsindices[%D] = %D\n", dmmoab->pcomm->rank(), i, dmmoab->gsindices[i]);
169fc418013SVijay Mahadevan     }
170fc418013SVijay Mahadevan 
171032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
172032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
173032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
174032b8ab6SVijay Mahadevan 
175032b8ab6SVijay Mahadevan     /* global to local must retrieve ghost points */
176fc418013SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
177032b8ab6SVijay Mahadevan 
178db66d124SVijay Mahadevan     ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr);
179db66d124SVijay Mahadevan     ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr);
180032b8ab6SVijay Mahadevan 
181032b8ab6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
182032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
183032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
184032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
185032b8ab6SVijay Mahadevan   }
186032b8ab6SVijay Mahadevan 
1871cec0304SVijay Mahadevan   /* skin the boundary and store nodes */
1881cec0304SVijay Mahadevan   {
1891cec0304SVijay Mahadevan     // get the skin vertices of those faces and mark them as fixed; we don't want to fix the vertices on a
1901cec0304SVijay Mahadevan     // part boundary, but since we exchanged a layer of ghost faces, those vertices aren't on the skin locally
1911cec0304SVijay Mahadevan     // ok to mark non-owned skin vertices too, I won't move those anyway
1921cec0304SVijay Mahadevan     // use MOAB's skinner class to find the skin
1931cec0304SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1941cec0304SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
1951cec0304SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
196*69263071SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
197*69263071SVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces, NULL, false, true, false, false);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
198*69263071SVijay Mahadevan //    merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, true, *dmmoab->bndyvtx, NULL, true, true, false, false);MBERRNM(merr); // 'true' param indicates we want vertices back, not faces
199*69263071SVijay Mahadevan 
200*69263071SVijay Mahadevan     if (dmmoab->dim == 3) {
201*69263071SVijay Mahadevan       // get the edges from faces and then do the same if needed
202*69263071SVijay Mahadevan     }
203*69263071SVijay Mahadevan 
204*69263071SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
205*69263071SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
206*69263071SVijay Mahadevan //    merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_MULTISHARED,PSTATUS_NOT);MBERRNM(merr);
207*69263071SVijay Mahadevan 
208*69263071SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
209*69263071SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
210*69263071SVijay Mahadevan 
211*69263071SVijay Mahadevan     dmmoab->bndyfaces->print(0);
212*69263071SVijay Mahadevan     dmmoab->bndyvtx->print(0);
213*69263071SVijay Mahadevan     dmmoab->bndyelems->print(0);
214*69263071SVijay Mahadevan 
215*69263071SVijay Mahadevan //    merr = skinner.find_geometric_skin(dmmoab->fileset, *dmmoab->bndyelems, dmmoab->dim);MBERRV(dmmoab->mbiface,merr);
216*69263071SVijay Mahadevan //    merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, dmmoab->bndyvtx, dmmoab->bndyfaces, dmmoab->bndyelems, true, true);MBERRNM(merr);
217*69263071SVijay Mahadevan 
218*69263071SVijay Mahadevan     PetscInfo3(dm, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
2191cec0304SVijay Mahadevan   }
220032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
221032b8ab6SVijay Mahadevan }
222032b8ab6SVijay Mahadevan 
2231cec0304SVijay Mahadevan 
224032b8ab6SVijay Mahadevan #undef __FUNCT__
225aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
226853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
227aa768e4cSTim Tautges {
228aa768e4cSTim Tautges   PetscErrorCode ierr;
229aa768e4cSTim Tautges 
230aa768e4cSTim Tautges   PetscFunctionBegin;
231aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
232032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
233032b8ab6SVijay Mahadevan 
234032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
235032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
236032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
237032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
238032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
239032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
240032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
241032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
242032b8ab6SVijay Mahadevan 
243032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
244032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
245032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
246032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
247032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
248aa768e4cSTim Tautges 
24997ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
25097ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
251032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
252032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
25397ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
254032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
255032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
256032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
257032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
258aa768e4cSTim Tautges   PetscFunctionReturn(0);
259aa768e4cSTim Tautges }
260fd349b41STim Tautges 
261fd349b41STim Tautges #undef __FUNCT__
2621d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
2631d72bce8STim Tautges /*@
2641d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
2651d72bce8STim Tautges 
2661d72bce8STim Tautges   Collective on MPI_Comm
2671d72bce8STim Tautges 
2681d72bce8STim Tautges   Input Parameter:
2691d72bce8STim Tautges . comm - The communicator for the DMMoab object
2701d72bce8STim Tautges 
2711d72bce8STim Tautges   Output Parameter:
272032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2731d72bce8STim Tautges 
2741d72bce8STim Tautges   Level: beginner
2751d72bce8STim Tautges 
2761d72bce8STim Tautges .keywords: DMMoab, create
2771d72bce8STim Tautges @*/
278032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
2791d72bce8STim Tautges {
2801d72bce8STim Tautges   PetscErrorCode ierr;
2811d72bce8STim Tautges 
2821d72bce8STim Tautges   PetscFunctionBegin;
283032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
284032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
285032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
2861d72bce8STim Tautges   PetscFunctionReturn(0);
2871d72bce8STim Tautges }
2881d72bce8STim Tautges 
2891d72bce8STim Tautges #undef __FUNCT__
290aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
2911d72bce8STim Tautges /*@
292a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
2931d72bce8STim Tautges 
2941d72bce8STim Tautges   Collective on MPI_Comm
2951d72bce8STim Tautges 
2961d72bce8STim Tautges   Input Parameter:
2971d72bce8STim Tautges . comm - The communicator for the DMMoab object
298032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
299a4d2169cSTim Tautges          along with the DMMoab
300a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
3011d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
3021d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
3031d72bce8STim Tautges 
3041d72bce8STim Tautges   Output Parameter:
305032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
3061d72bce8STim Tautges 
307032b8ab6SVijay Mahadevan   Level: intermediate
3081d72bce8STim Tautges 
3091d72bce8STim Tautges .keywords: DMMoab, create
3101d72bce8STim Tautges @*/
311032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
3121d72bce8STim Tautges {
3131d72bce8STim Tautges   PetscErrorCode ierr;
314032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
3151cec0304SVijay Mahadevan   moab::EntityHandle partnset;
3161cec0304SVijay Mahadevan   PetscInt rank, nprocs;
317853cdec3SJed Brown   DM_Moab        *dmmoab;
3181d72bce8STim Tautges 
3191d72bce8STim Tautges   PetscFunctionBegin;
320032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
321032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
322032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
323a4d2169cSTim Tautges 
324a4d2169cSTim Tautges   if (!mbiface) {
32572ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
3267d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
3271d72bce8STim Tautges   }
3281cec0304SVijay Mahadevan   else {
3291cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
3307d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
3311cec0304SVijay Mahadevan   }
3321cec0304SVijay Mahadevan 
3331cec0304SVijay Mahadevan   /* create a fileset to store the hierarchy of entities belonging to current DM */
3341cec0304SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr);
3357d89fc02STim Tautges 
336a4d2169cSTim Tautges   if (!pcomm) {
337032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
338032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
339032b8ab6SVijay Mahadevan 
340db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
341db66d124SVijay Mahadevan        to the load_file functions to be populated. */
34272ff976dSVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
343032b8ab6SVijay Mahadevan     MBERR("Creating partition set failed", merr);
344032b8ab6SVijay Mahadevan 
345db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
34672ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
34772ff976dSVijay Mahadevan   }
34872ff976dSVijay Mahadevan   else {
34972ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
350032b8ab6SVijay Mahadevan   }
351032b8ab6SVijay Mahadevan 
3524973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
3534973de03SVijay Mahadevan   dmmoab->bs       = 1;
3544973de03SVijay Mahadevan 
3554973de03SVijay Mahadevan   /* set global ID tag handle */
356032b8ab6SVijay Mahadevan   if (!ltog_tag) {
3574973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
358032b8ab6SVijay Mahadevan   }
359032b8ab6SVijay Mahadevan   else {
360032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
361a4d2169cSTim Tautges   }
362a4d2169cSTim Tautges 
3634973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
364a4d2169cSTim Tautges   if (range) {
3655eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
366a4d2169cSTim Tautges   }
3671d72bce8STim Tautges   PetscFunctionReturn(0);
3681d72bce8STim Tautges }
3691d72bce8STim Tautges 
3701d72bce8STim Tautges #undef __FUNCT__
3711d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
372aa768e4cSTim Tautges /*@
373aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
374aa768e4cSTim Tautges 
375aa768e4cSTim Tautges   Collective on MPI_Comm
376aa768e4cSTim Tautges 
377aa768e4cSTim Tautges   Input Parameter:
378aa768e4cSTim Tautges . dm    - The DMMoab object being set
379aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
380aa768e4cSTim Tautges 
381aa768e4cSTim Tautges   Level: beginner
382aa768e4cSTim Tautges 
383aa768e4cSTim Tautges .keywords: DMMoab, create
384aa768e4cSTim Tautges @*/
3851d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
3861d72bce8STim Tautges {
387032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
388032b8ab6SVijay Mahadevan 
3891d72bce8STim Tautges   PetscFunctionBegin;
3901d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3911cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
392032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
393032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
394032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
3951d72bce8STim Tautges   PetscFunctionReturn(0);
3961d72bce8STim Tautges }
3971d72bce8STim Tautges 
3981d72bce8STim Tautges 
3991d72bce8STim Tautges #undef __FUNCT__
4001d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
401aa768e4cSTim Tautges /*@
402aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
403aa768e4cSTim Tautges 
404aa768e4cSTim Tautges   Collective on MPI_Comm
405aa768e4cSTim Tautges 
406aa768e4cSTim Tautges   Input Parameter:
407aa768e4cSTim Tautges . dm    - The DMMoab object being set
408aa768e4cSTim Tautges 
409aa768e4cSTim Tautges   Output Parameter:
410aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
411aa768e4cSTim Tautges 
412aa768e4cSTim Tautges   Level: beginner
413aa768e4cSTim Tautges 
414aa768e4cSTim Tautges .keywords: DMMoab, create
415aa768e4cSTim Tautges @*/
4161d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
4171d72bce8STim Tautges {
4181d72bce8STim Tautges   PetscFunctionBegin;
4191d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
420032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
4211d72bce8STim Tautges   PetscFunctionReturn(0);
4221d72bce8STim Tautges }
4231d72bce8STim Tautges 
4241d72bce8STim Tautges 
4251d72bce8STim Tautges #undef __FUNCT__
4261d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
427aa768e4cSTim Tautges /*@
428aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
429aa768e4cSTim Tautges 
430aa768e4cSTim Tautges   Collective on MPI_Comm
431aa768e4cSTim Tautges 
432aa768e4cSTim Tautges   Input Parameter:
433aa768e4cSTim Tautges . dm      - The DMMoab object being set
434aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
435aa768e4cSTim Tautges 
436aa768e4cSTim Tautges   Level: beginner
437aa768e4cSTim Tautges 
438aa768e4cSTim Tautges .keywords: DMMoab, create
439aa768e4cSTim Tautges @*/
440a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
4411d72bce8STim Tautges {
442032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
443032b8ab6SVijay Mahadevan 
4441d72bce8STim Tautges   PetscFunctionBegin;
4451d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4461cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
447032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
448032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
449032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4501d72bce8STim Tautges   PetscFunctionReturn(0);
4511d72bce8STim Tautges }
4521d72bce8STim Tautges 
4531d72bce8STim Tautges 
4541d72bce8STim Tautges #undef __FUNCT__
4551d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
456aa768e4cSTim Tautges /*@
457aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
458aa768e4cSTim Tautges 
459aa768e4cSTim Tautges   Collective on MPI_Comm
460aa768e4cSTim Tautges 
461aa768e4cSTim Tautges   Input Parameter:
462aa768e4cSTim Tautges . dm      - The DMMoab object being set
463aa768e4cSTim Tautges 
464aa768e4cSTim Tautges   Output Parameter:
465aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
466aa768e4cSTim Tautges 
467aa768e4cSTim Tautges   Level: beginner
468aa768e4cSTim Tautges 
469aa768e4cSTim Tautges .keywords: DMMoab, create
470aa768e4cSTim Tautges @*/
471a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
4721d72bce8STim Tautges {
4739426e041SSatish Balay   PetscErrorCode   ierr;
474cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
475cabb514dSBarry Smith 
4761d72bce8STim Tautges   PetscFunctionBegin;
4771d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
478cabb514dSBarry 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);
479a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
4801d72bce8STim Tautges   PetscFunctionReturn(0);
4811d72bce8STim Tautges }
4821d72bce8STim Tautges 
4831d72bce8STim Tautges 
4841d72bce8STim Tautges #undef __FUNCT__
4855eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
486aa768e4cSTim Tautges /*@
4875eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
488aa768e4cSTim Tautges 
489aa768e4cSTim Tautges   Collective on MPI_Comm
490aa768e4cSTim Tautges 
491aa768e4cSTim Tautges   Input Parameter:
492aa768e4cSTim Tautges . dm    - The DMMoab object being set
493aa768e4cSTim Tautges . range - The entities treated by this DMMoab
494aa768e4cSTim Tautges 
495aa768e4cSTim Tautges   Level: beginner
496aa768e4cSTim Tautges 
497aa768e4cSTim Tautges .keywords: DMMoab, create
498aa768e4cSTim Tautges @*/
4995eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
5001d72bce8STim Tautges {
501032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
502032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
503032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
504032b8ab6SVijay Mahadevan 
5051d72bce8STim Tautges   PetscFunctionBegin;
5061d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
507032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
508032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
509032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
510032b8ab6SVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
511032b8ab6SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
512032b8ab6SVijay Mahadevan   *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned);
513032b8ab6SVijay Mahadevan   dmmoab->nloc=dmmoab->vowned->size();
514032b8ab6SVijay Mahadevan   dmmoab->nghost=dmmoab->vghost->size();
515032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5161d72bce8STim Tautges   PetscFunctionReturn(0);
5171d72bce8STim Tautges }
5181d72bce8STim Tautges 
5191d72bce8STim Tautges 
5201d72bce8STim Tautges #undef __FUNCT__
5215eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
522aa768e4cSTim Tautges /*@
5235eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
524aa768e4cSTim Tautges 
525aa768e4cSTim Tautges   Collective on MPI_Comm
526aa768e4cSTim Tautges 
527aa768e4cSTim Tautges   Input Parameter:
528aa768e4cSTim Tautges . dm    - The DMMoab object being set
529aa768e4cSTim Tautges 
530aa768e4cSTim Tautges   Output Parameter:
5315eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
5325eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
533aa768e4cSTim Tautges 
534aa768e4cSTim Tautges   Level: beginner
535aa768e4cSTim Tautges 
536aa768e4cSTim Tautges .keywords: DMMoab, create
537aa768e4cSTim Tautges @*/
5381cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
5391d72bce8STim Tautges {
5401d72bce8STim Tautges   PetscFunctionBegin;
5411d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5421cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
5431cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
5441d72bce8STim Tautges   PetscFunctionReturn(0);
5451d72bce8STim Tautges }
5461d72bce8STim Tautges 
5471d72bce8STim Tautges #undef __FUNCT__
5485eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
5495eb88e9dSVijay Mahadevan /*@
5505eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
5515eb88e9dSVijay Mahadevan 
5525eb88e9dSVijay Mahadevan   Collective on MPI_Comm
5535eb88e9dSVijay Mahadevan 
5545eb88e9dSVijay Mahadevan   Input Parameter:
5555eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
5565eb88e9dSVijay Mahadevan 
5575eb88e9dSVijay Mahadevan   Output Parameter:
5585eb88e9dSVijay Mahadevan . range - The entities owned locally
5595eb88e9dSVijay Mahadevan 
5605eb88e9dSVijay Mahadevan   Level: beginner
5615eb88e9dSVijay Mahadevan 
5625eb88e9dSVijay Mahadevan .keywords: DMMoab, create
5635eb88e9dSVijay Mahadevan @*/
5641cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
5655eb88e9dSVijay Mahadevan {
5665eb88e9dSVijay Mahadevan   PetscFunctionBegin;
5675eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5681cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
5691cec0304SVijay Mahadevan   PetscFunctionReturn(0);
5701cec0304SVijay Mahadevan }
5711cec0304SVijay Mahadevan 
5721cec0304SVijay Mahadevan 
5731cec0304SVijay Mahadevan #undef __FUNCT__
5741cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
5751cec0304SVijay Mahadevan /*@
5761cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
5771cec0304SVijay Mahadevan 
5781cec0304SVijay Mahadevan   Collective on MPI_Comm
5791cec0304SVijay Mahadevan 
5801cec0304SVijay Mahadevan   Input Parameter:
5811cec0304SVijay Mahadevan . dm    - The DMMoab object being set
5821cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
5831cec0304SVijay Mahadevan 
5841cec0304SVijay Mahadevan   Level: beginner
5851cec0304SVijay Mahadevan 
5861cec0304SVijay Mahadevan .keywords: DMMoab, create
5871cec0304SVijay Mahadevan @*/
5881cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
5891cec0304SVijay Mahadevan {
5901cec0304SVijay Mahadevan   moab::ErrorCode merr;
5911cec0304SVijay Mahadevan   PetscErrorCode  ierr;
5921cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
5931cec0304SVijay Mahadevan 
5941cec0304SVijay Mahadevan   PetscFunctionBegin;
5951cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5961cec0304SVijay Mahadevan   dmmoab->elocal->clear();
5971cec0304SVijay Mahadevan   dmmoab->eghost->clear();
5981cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
5991cec0304SVijay Mahadevan   PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size());
6001cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
6011cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
6021cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
6031cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
6041cec0304SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele);
6055eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
6065eb88e9dSVijay Mahadevan }
6075eb88e9dSVijay Mahadevan 
6085eb88e9dSVijay Mahadevan 
6095eb88e9dSVijay Mahadevan #undef __FUNCT__
6101d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
611aa768e4cSTim Tautges /*@
612aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
613aa768e4cSTim Tautges 
614aa768e4cSTim Tautges   Collective on MPI_Comm
615aa768e4cSTim Tautges 
616aa768e4cSTim Tautges   Input Parameter:
617aa768e4cSTim Tautges . dm      - The DMMoab object being set
618aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
619aa768e4cSTim Tautges 
620aa768e4cSTim Tautges   Level: beginner
621aa768e4cSTim Tautges 
622aa768e4cSTim Tautges .keywords: DMMoab, create
623aa768e4cSTim Tautges @*/
6241d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
6251d72bce8STim Tautges {
6261d72bce8STim Tautges   PetscFunctionBegin;
6271d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6281d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
6291d72bce8STim Tautges   PetscFunctionReturn(0);
6301d72bce8STim Tautges }
6311d72bce8STim Tautges 
6321d72bce8STim Tautges 
6331d72bce8STim Tautges #undef __FUNCT__
6341d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
635aa768e4cSTim Tautges /*@
636aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
637aa768e4cSTim Tautges 
638aa768e4cSTim Tautges   Collective on MPI_Comm
639aa768e4cSTim Tautges 
640aa768e4cSTim Tautges   Input Parameter:
641aa768e4cSTim Tautges . dm      - The DMMoab object being set
642aa768e4cSTim Tautges 
643aa768e4cSTim Tautges   Output Parameter:
644aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
645aa768e4cSTim Tautges 
646aa768e4cSTim Tautges   Level: beginner
647aa768e4cSTim Tautges 
648aa768e4cSTim Tautges .keywords: DMMoab, create
649aa768e4cSTim Tautges @*/
6501d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
6511d72bce8STim Tautges {
6521d72bce8STim Tautges   PetscFunctionBegin;
6531d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6541d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
6551d72bce8STim Tautges   PetscFunctionReturn(0);
6561d72bce8STim Tautges }
6571d72bce8STim Tautges 
6581d72bce8STim Tautges 
6591d72bce8STim Tautges #undef __FUNCT__
6601d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
661aa768e4cSTim Tautges /*@
662aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
663aa768e4cSTim Tautges 
664aa768e4cSTim Tautges   Collective on MPI_Comm
665aa768e4cSTim Tautges 
666aa768e4cSTim Tautges   Input Parameter:
667aa768e4cSTim Tautges . dm - The DMMoab object being set
668aa768e4cSTim Tautges . bs - The block size used with this DMMoab
669aa768e4cSTim Tautges 
670aa768e4cSTim Tautges   Level: beginner
671aa768e4cSTim Tautges 
672aa768e4cSTim Tautges .keywords: DMMoab, create
673aa768e4cSTim Tautges @*/
6741d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
6751d72bce8STim Tautges {
6761d72bce8STim Tautges   PetscFunctionBegin;
6771d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6781d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
6791d72bce8STim Tautges   PetscFunctionReturn(0);
6801d72bce8STim Tautges }
6811d72bce8STim Tautges 
6821d72bce8STim Tautges 
6831d72bce8STim Tautges #undef __FUNCT__
6841d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
685aa768e4cSTim Tautges /*@
686aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
687aa768e4cSTim Tautges 
688aa768e4cSTim Tautges   Collective on MPI_Comm
689aa768e4cSTim Tautges 
690aa768e4cSTim Tautges   Input Parameter:
691aa768e4cSTim Tautges . dm - The DMMoab object being set
692aa768e4cSTim Tautges 
693aa768e4cSTim Tautges   Output Parameter:
694aa768e4cSTim Tautges . bs - The block size used with this DMMoab
695aa768e4cSTim Tautges 
696aa768e4cSTim Tautges   Level: beginner
697aa768e4cSTim Tautges 
698aa768e4cSTim Tautges .keywords: DMMoab, create
699aa768e4cSTim Tautges @*/
7001d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
7011d72bce8STim Tautges {
7021d72bce8STim Tautges   PetscFunctionBegin;
7031d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7041d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
7051d72bce8STim Tautges   PetscFunctionReturn(0);
7061d72bce8STim Tautges }
7071d72bce8STim Tautges 
7081cec0304SVijay Mahadevan 
7091cec0304SVijay Mahadevan #undef __FUNCT__
7101cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector"
7111cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
7121cec0304SVijay Mahadevan {
7131cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
7141cec0304SVijay Mahadevan   moab::Tag     vtag,ntag;
7151cec0304SVijay Mahadevan   PetscScalar   *varray;
7161cec0304SVijay Mahadevan   moab::ErrorCode merr;
7171cec0304SVijay Mahadevan   PetscErrorCode  ierr;
7181cec0304SVijay Mahadevan   PetscSection section;
7191cec0304SVijay Mahadevan   PetscInt doff;
7201cec0304SVijay Mahadevan   std::string tag_name;
7211cec0304SVijay Mahadevan   moab::Range::iterator iter;
7221cec0304SVijay Mahadevan 
7231cec0304SVijay Mahadevan   PetscFunctionBegin;
7241cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7251cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7261cec0304SVijay Mahadevan 
7271cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
7281cec0304SVijay Mahadevan 
7291cec0304SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
7301cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
7311cec0304SVijay Mahadevan                                           moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
7321cec0304SVijay Mahadevan 
7331cec0304SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
7341cec0304SVijay Mahadevan 
7351cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
7361cec0304SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
7371cec0304SVijay Mahadevan     ierr = DMMoabVecGetArray(dm,fvec,&varray);CHKERRQ(ierr);
7381cec0304SVijay Mahadevan     for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
7391cec0304SVijay Mahadevan       moab::EntityHandle vtx = (*iter);
7401cec0304SVijay Mahadevan 
7411cec0304SVijay Mahadevan       /* get field dof index */
7421cec0304SVijay Mahadevan       ierr = PetscSectionGetFieldOffset(section, vtx, ifield, &doff);
7431cec0304SVijay Mahadevan 
7441cec0304SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
7451cec0304SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr);
7461cec0304SVijay Mahadevan     }
7471cec0304SVijay Mahadevan     ierr = DMMoabVecRestoreArray(dm,fvec,&varray);CHKERRQ(ierr);
7481cec0304SVijay Mahadevan   }
7491cec0304SVijay Mahadevan   else {
7501cec0304SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&varray);CHKERRQ(ierr);
7511cec0304SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
7521cec0304SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
7531cec0304SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr);
7541cec0304SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
7551cec0304SVijay Mahadevan     merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
7561cec0304SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
7571cec0304SVijay Mahadevan   }
7581cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7591cec0304SVijay Mahadevan }
7601cec0304SVijay Mahadevan 
7611cec0304SVijay Mahadevan 
7621cec0304SVijay Mahadevan #undef __FUNCT__
7637023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
7647023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
7657023aa44SVijay Mahadevan {
7667023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
7677023aa44SVijay Mahadevan   PetscErrorCode  ierr;
7687023aa44SVijay Mahadevan   moab::ErrorCode merr;
7697023aa44SVijay Mahadevan 
7707023aa44SVijay Mahadevan   PetscFunctionBegin;
7717023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7727023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
7737023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7747023aa44SVijay Mahadevan 
7757023aa44SVijay Mahadevan   if (!vpos) {
7767023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
7777023aa44SVijay Mahadevan   }
7787023aa44SVijay Mahadevan 
7797023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7807023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
7817023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7827023aa44SVijay Mahadevan }
7837023aa44SVijay Mahadevan 
7847023aa44SVijay Mahadevan 
7857023aa44SVijay Mahadevan #undef __FUNCT__
7867023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
7877023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
7887023aa44SVijay Mahadevan {
7897023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7907023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
7917023aa44SVijay Mahadevan   moab::ErrorCode merr;
7927023aa44SVijay Mahadevan   PetscInt nnodes;
7937023aa44SVijay Mahadevan 
7947023aa44SVijay Mahadevan   PetscFunctionBegin;
7957023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7967023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
7977023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7987023aa44SVijay Mahadevan 
7997023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8007023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
8017023aa44SVijay Mahadevan   if (conn) *conn=connect;
8027023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
8037023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8047023aa44SVijay Mahadevan }
8057023aa44SVijay Mahadevan 
8067023aa44SVijay Mahadevan 
8077023aa44SVijay Mahadevan #undef __FUNCT__
808*69263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
809*69263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
810*69263071SVijay Mahadevan {
811*69263071SVijay Mahadevan   moab::EntityType etype;
812*69263071SVijay Mahadevan   DM_Moab         *dmmoab;
813*69263071SVijay Mahadevan   PetscInt         edim;
814*69263071SVijay Mahadevan 
815*69263071SVijay Mahadevan   PetscFunctionBegin;
816*69263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
817*69263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
818*69263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
819*69263071SVijay Mahadevan 
820*69263071SVijay Mahadevan   /* get the entity type and handle accordingly */
821*69263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
822*69263071SVijay 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);
823*69263071SVijay Mahadevan 
824*69263071SVijay Mahadevan   /* get the entity dimension */
825*69263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
826*69263071SVijay Mahadevan 
827*69263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
828*69263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
829*69263071SVijay Mahadevan     moab::Range::const_iterator giter = dmmoab->bndyvtx->find(ent);
830*69263071SVijay Mahadevan     if (giter != dmmoab->bndyvtx->end()) *ent_on_boundary=PETSC_TRUE;
831*69263071SVijay Mahadevan   }
832*69263071SVijay Mahadevan   else {
833*69263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
834*69263071SVijay Mahadevan       moab::Range::const_iterator geiter = dmmoab->bndyelems->find(ent);
835*69263071SVijay Mahadevan       if (geiter != dmmoab->bndyelems->end()) *ent_on_boundary=PETSC_TRUE;
836*69263071SVijay Mahadevan     }
837*69263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
838*69263071SVijay Mahadevan       moab::Range::const_iterator gfiter = dmmoab->bndyfaces->find(ent);
839*69263071SVijay Mahadevan       if (gfiter != dmmoab->bndyfaces->end()) *ent_on_boundary=PETSC_TRUE;
840*69263071SVijay Mahadevan     }
841*69263071SVijay Mahadevan   }
842*69263071SVijay Mahadevan   PetscFunctionReturn(0);
843*69263071SVijay Mahadevan }
844*69263071SVijay Mahadevan 
845*69263071SVijay Mahadevan 
846*69263071SVijay Mahadevan #undef __FUNCT__
8477023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
848*69263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
8497023aa44SVijay Mahadevan {
8507023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8517023aa44SVijay Mahadevan   PetscInt       i;
8527023aa44SVijay Mahadevan 
8537023aa44SVijay Mahadevan   PetscFunctionBegin;
8547023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8557023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
8567023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
8577023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8587023aa44SVijay Mahadevan 
8597023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
8607023aa44SVijay Mahadevan     moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]);
861*69263071SVijay Mahadevan     if (giter != dmmoab->bndyvtx->end()) isbdvtx[i] = PETSC_TRUE;
8627023aa44SVijay Mahadevan     else isbdvtx[i] = PETSC_FALSE;
8637023aa44SVijay Mahadevan   }
8647023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8657023aa44SVijay Mahadevan }
8667023aa44SVijay Mahadevan 
8677023aa44SVijay Mahadevan 
8687023aa44SVijay Mahadevan #undef __FUNCT__
8691cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities"
870*69263071SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces,moab::Range* bdelems)
8711cec0304SVijay Mahadevan {
8721cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8731cec0304SVijay Mahadevan 
8741cec0304SVijay Mahadevan   PetscFunctionBegin;
8751cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8761cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8771cec0304SVijay Mahadevan 
8781cec0304SVijay Mahadevan   if (bdvtx)  *bdvtx = *dmmoab->bndyvtx;
8791cec0304SVijay Mahadevan   if (bdfaces)  *bdfaces = *dmmoab->bndyfaces;
880*69263071SVijay Mahadevan   if (bdelems)  *bdfaces = *dmmoab->bndyelems;
8811cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8821cec0304SVijay Mahadevan }
8831cec0304SVijay Mahadevan 
8841cec0304SVijay Mahadevan 
8851cec0304SVijay Mahadevan #undef __FUNCT__
8861cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields"
8871cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields)
8881cec0304SVijay Mahadevan {
8891cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8901cec0304SVijay Mahadevan 
8911cec0304SVijay Mahadevan   PetscFunctionBegin;
8921cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8931cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8941cec0304SVijay Mahadevan 
8951cec0304SVijay Mahadevan   dmmoab->fields = fields;
8961cec0304SVijay Mahadevan   dmmoab->nfields = nfields;
8971cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8981cec0304SVijay Mahadevan }
8991cec0304SVijay Mahadevan 
9001cec0304SVijay Mahadevan 
9011cec0304SVijay Mahadevan #undef __FUNCT__
9021cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
9031cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
9041cec0304SVijay Mahadevan {
9051cec0304SVijay Mahadevan   PetscSection section;
906fc418013SVijay Mahadevan   PetscInt gid;
9071cec0304SVijay Mahadevan   PetscErrorCode ierr;
908fc418013SVijay Mahadevan   moab::ErrorCode merr;
909fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
9101cec0304SVijay Mahadevan 
9111cec0304SVijay Mahadevan   PetscFunctionBegin;
9121cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
913fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
914fc418013SVijay Mahadevan 
9151cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
916fc418013SVijay Mahadevan 
917fc418013SVijay Mahadevan   /* first get the global ID for the point */
918fc418013SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&point,1,&gid);MBERRNM(merr);
919fc418013SVijay Mahadevan 
920fc418013SVijay Mahadevan   /* get the dof value for the field */
921fc418013SVijay Mahadevan   ierr = PetscSectionGetFieldDof(section, gid, field, dof);CHKERRQ(ierr);
9221cec0304SVijay Mahadevan   PetscFunctionReturn(0);
9231cec0304SVijay Mahadevan }
9241cec0304SVijay Mahadevan 
9251cec0304SVijay Mahadevan 
9261cec0304SVijay Mahadevan #undef __FUNCT__
9271cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
9281cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
9291cec0304SVijay Mahadevan {
930fc418013SVijay Mahadevan   PetscInt i,gid;
9311cec0304SVijay Mahadevan   PetscSection section;
9321cec0304SVijay Mahadevan   PetscErrorCode  ierr;
933fc418013SVijay Mahadevan   moab::ErrorCode merr;
934fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
9351cec0304SVijay Mahadevan 
9361cec0304SVijay Mahadevan   PetscFunctionBegin;
9371cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
938fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
939fc418013SVijay Mahadevan 
9401cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
9411cec0304SVijay Mahadevan   if (!dof) {
9421cec0304SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
9431cec0304SVijay Mahadevan   }
944fc418013SVijay Mahadevan 
945fc418013SVijay Mahadevan   /* first get the local indices */
946fc418013SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr);
947fc418013SVijay Mahadevan 
9481cec0304SVijay Mahadevan   for (i=0; i<npoints; ++i) {
949fc418013SVijay Mahadevan     gid=dof[i];
950fc418013SVijay Mahadevan     ierr = PetscSectionGetFieldDof(section, gid, field, &dof[i]);CHKERRQ(ierr);
9511cec0304SVijay Mahadevan   }
9521cec0304SVijay Mahadevan   PetscFunctionReturn(0);
9531cec0304SVijay Mahadevan }
9541cec0304SVijay Mahadevan 
9551cec0304SVijay Mahadevan 
956fc418013SVijay Mahadevan #undef __FUNCT__
957fc418013SVijay Mahadevan #define __FUNCT__ "DMMoab_GetWriteOptions_Private"
958fc418013SVijay Mahadevan PetscErrorCode DMMoab_GetWriteOptions_Private(PetscInt fsetid, PetscInt numproc, PetscInt dim, MoabWriteMode mode, PetscInt dbglevel, const char* extra_opts, const char** write_opts)
959fc418013SVijay Mahadevan {
960fc418013SVijay Mahadevan   std::ostringstream str;
961fc418013SVijay Mahadevan 
962fc418013SVijay Mahadevan   PetscFunctionBegin;
963fc418013SVijay Mahadevan 
964fc418013SVijay Mahadevan   // do parallel read unless only one processor
965fc418013SVijay Mahadevan   if (numproc > 1) {
966fc418013SVijay Mahadevan     str << "PARALLEL=" << mode << ";";
967fc418013SVijay Mahadevan     if (fsetid>=0) str << "PARALLEL_COMM=" << fsetid << ";";
968fc418013SVijay Mahadevan   }
969fc418013SVijay Mahadevan 
970fc418013SVijay Mahadevan   if (dbglevel)
971fc418013SVijay Mahadevan     str << "CPUTIME;DEBUG_IO=" << dbglevel << ";";
972fc418013SVijay Mahadevan 
973fc418013SVijay Mahadevan   if (extra_opts)
974fc418013SVijay Mahadevan     str << extra_opts ;
975fc418013SVijay Mahadevan 
976fc418013SVijay Mahadevan   *write_opts = str.str().c_str();
977fc418013SVijay Mahadevan   PetscFunctionReturn(0);
978fc418013SVijay Mahadevan }
979fc418013SVijay Mahadevan 
980fc418013SVijay Mahadevan 
981fc418013SVijay Mahadevan #undef __FUNCT__
982fc418013SVijay Mahadevan #define __FUNCT__ "DMMoabOutput"
983fc418013SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* filename,const char* usrwriteopts)
984fc418013SVijay Mahadevan {
985fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
986fc418013SVijay Mahadevan   PetscInt       dbglevel=0;
987fc418013SVijay Mahadevan   const char *writeopts;
988fc418013SVijay Mahadevan 
989fc418013SVijay Mahadevan   PetscErrorCode ierr;
990fc418013SVijay Mahadevan   moab::ErrorCode merr;
991fc418013SVijay Mahadevan 
992fc418013SVijay Mahadevan   PetscFunctionBegin;
993fc418013SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
994fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
995fc418013SVijay Mahadevan 
996fc418013SVijay Mahadevan   PetscBarrier((PetscObject)dm);
997fc418013SVijay Mahadevan 
998fc418013SVijay Mahadevan   /* TODO: Use command-line options to control by_rank, verbosity, MoabReadMode and extra options */
999fc418013SVijay Mahadevan   ierr  = PetscOptionsBegin(PETSC_COMM_WORLD, "", "Options for reading/writing MOAB based meshes from file", "DMMoab");
1000fc418013SVijay Mahadevan   ierr  = PetscOptionsInt("-dmmb_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "dmmbutil.cxx", dbglevel, &dbglevel, NULL);CHKERRQ(ierr);
1001fc418013SVijay Mahadevan   ierr  = PetscOptionsEnd();
1002fc418013SVijay Mahadevan 
1003fc418013SVijay Mahadevan   /* add mesh loading options specific to the DM */
1004fc418013SVijay Mahadevan   ierr = DMMoab_GetWriteOptions_Private(dmmoab->pcomm->get_id(), dmmoab->pcomm->size(), dmmoab->dim, MOAB_PARWOPTS_WRITE_PART, dbglevel, usrwriteopts, &writeopts);CHKERRQ(ierr);
1005fc418013SVijay Mahadevan   PetscInfo2(dm, "Writing file %s with options: %s\n",filename,writeopts);
1006fc418013SVijay Mahadevan 
1007fc418013SVijay Mahadevan   /* output file, using parallel write */
1008fc418013SVijay Mahadevan   merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr);
1009fc418013SVijay Mahadevan   PetscFunctionReturn(0);
1010fc418013SVijay Mahadevan }
1011fc418013SVijay Mahadevan 
1012