xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 324f1edfa1c27a5f313d88127d17fd9181f21be7)
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;
14212ad6d1SVijay Mahadevan   PetscSection   section;
15853cdec3SJed Brown 
16853cdec3SJed Brown   PetscFunctionBegin;
17853cdec3SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
18212ad6d1SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
19212ad6d1SVijay Mahadevan   ierr = PetscSectionDestroy(&section);CHKERRQ(ierr);
20032b8ab6SVijay Mahadevan   if (dmmoab->icreatedinstance) {
21032b8ab6SVijay Mahadevan     delete dmmoab->mbiface;
22853cdec3SJed Brown   }
23032b8ab6SVijay Mahadevan   dmmoab->mbiface = NULL;
24032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
25032b8ab6SVijay Mahadevan   delete dmmoab->vlocal;
26032b8ab6SVijay Mahadevan   delete dmmoab->vowned;
27032b8ab6SVijay Mahadevan   delete dmmoab->vghost;
28032b8ab6SVijay Mahadevan   delete dmmoab->elocal;
29032b8ab6SVijay Mahadevan   delete dmmoab->eghost;
301cec0304SVijay Mahadevan   delete dmmoab->bndyvtx;
311cec0304SVijay Mahadevan   delete dmmoab->bndyfaces;
3269263071SVijay Mahadevan   delete dmmoab->bndyelems;
33fc418013SVijay Mahadevan 
34fc418013SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
35032b8ab6SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
36032b8ab6SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
37853cdec3SJed Brown   ierr = PetscFree(dm->data);CHKERRQ(ierr);
38853cdec3SJed Brown   PetscFunctionReturn(0);
39853cdec3SJed Brown }
40853cdec3SJed Brown 
41aa768e4cSTim Tautges #undef __FUNCT__
42032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
43032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm)
44032b8ab6SVijay Mahadevan {
45032b8ab6SVijay Mahadevan   PetscErrorCode          ierr;
46032b8ab6SVijay Mahadevan   moab::ErrorCode         merr;
47032b8ab6SVijay Mahadevan   Vec                     local, global;
48032b8ab6SVijay Mahadevan   IS                      from;
49032b8ab6SVijay Mahadevan   moab::Range::iterator   iter;
50fc418013SVijay Mahadevan   PetscInt                i,j,bs,gsiz,lsiz;
51032b8ab6SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
52eb9d2429SVijay Mahadevan   PetscInt                totsize;
531cec0304SVijay Mahadevan   PetscSection            section;
54eb9d2429SVijay Mahadevan   PetscInt                gmin,lmin,lmax;
55032b8ab6SVijay Mahadevan 
5669263071SVijay Mahadevan   moab::Range adj;
5769263071SVijay Mahadevan 
58032b8ab6SVijay Mahadevan   PetscFunctionBegin;
59032b8ab6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
60032b8ab6SVijay Mahadevan   /* Get the local and shared vertices and cache it */
61032b8ab6SVijay 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.");
62032b8ab6SVijay Mahadevan 
631cec0304SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
64032b8ab6SVijay Mahadevan   if (dmmoab->vlocal->empty()) {
651cec0304SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
66032b8ab6SVijay Mahadevan 
67032b8ab6SVijay Mahadevan     /* filter based on parallel status */
68fc418013SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
69032b8ab6SVijay Mahadevan     *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
70032b8ab6SVijay Mahadevan 
71032b8ab6SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
72032b8ab6SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
73032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
74fc418013SVijay Mahadevan 
75e23c60ebSVijay Mahadevan #if 0
76fc418013SVijay Mahadevan     if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) {
77fc418013SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost);
78fc418013SVijay Mahadevan       dmmoab->vlocal->print(0);
79fc418013SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc);
80fc418013SVijay Mahadevan       dmmoab->vowned->print(0);
81fc418013SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost);
82fc418013SVijay Mahadevan       dmmoab->vghost->print(0);
83fc418013SVijay Mahadevan     }
84fc418013SVijay Mahadevan #endif
85032b8ab6SVijay Mahadevan   }
86032b8ab6SVijay Mahadevan 
87032b8ab6SVijay Mahadevan   /* get the information about the local elements in the mesh */
88032b8ab6SVijay Mahadevan   {
89032b8ab6SVijay Mahadevan     dmmoab->eghost->clear();
90fc418013SVijay Mahadevan 
91fc418013SVijay Mahadevan     /* first decipher the leading dimension */
92fc418013SVijay Mahadevan     for (i=3;i>0;i--) {
93fc418013SVijay Mahadevan       dmmoab->elocal->clear();
94fc418013SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
95fc418013SVijay Mahadevan 
96fc418013SVijay Mahadevan       /* store the current mesh dimension */
97fc418013SVijay Mahadevan       if (dmmoab->elocal->size()) {
98fc418013SVijay Mahadevan         dmmoab->dim=i;
99fc418013SVijay Mahadevan         break;
100fc418013SVijay Mahadevan       }
101fc418013SVijay Mahadevan     }
102fc418013SVijay Mahadevan 
103032b8ab6SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
104032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
105032b8ab6SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
106032b8ab6SVijay Mahadevan 
107032b8ab6SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
108032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
109032b8ab6SVijay Mahadevan   }
110032b8ab6SVijay Mahadevan 
111032b8ab6SVijay Mahadevan   bs = dmmoab->bs;
112032b8ab6SVijay Mahadevan   if (!dmmoab->ltog_tag) {
113db66d124SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
114db66d124SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
115db66d124SVijay Mahadevan        assemble the individual pieces of the mesh */
116032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
117032b8ab6SVijay Mahadevan   }
118032b8ab6SVijay Mahadevan 
119032b8ab6SVijay Mahadevan   totsize=dmmoab->vlocal->size();
120fc418013SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr);
1211cec0304SVijay Mahadevan   {
122032b8ab6SVijay Mahadevan     /* first get the local indices */
123fc418013SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
1244a40b570SVijay Mahadevan     /* next get the ghosted indices */
125fc418013SVijay Mahadevan     if (dmmoab->nghost) {
126fc418013SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1271cec0304SVijay Mahadevan     }
1286e40195eSVijay Mahadevan 
1296e40195eSVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
130eb9d2429SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
13169263071SVijay Mahadevan     for (i=0; i<totsize; ++i) {
132eb9d2429SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
133eb9d2429SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
134fc418013SVijay Mahadevan     }
1356e40195eSVijay Mahadevan 
136eb9d2429SVijay Mahadevan     ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
137eb9d2429SVijay Mahadevan     PetscInfo3(dm, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
1381cec0304SVijay Mahadevan   }
139032b8ab6SVijay Mahadevan 
1401cec0304SVijay Mahadevan   {
1411cec0304SVijay Mahadevan     ierr = PetscSectionCreate(((PetscObject)dm)->comm, &section);CHKERRQ(ierr);
1421cec0304SVijay Mahadevan     ierr = PetscSectionSetNumFields(section, dmmoab->nfields);CHKERRQ(ierr);
143eb9d2429SVijay Mahadevan     ierr = PetscSectionSetChart(section, lmin, lmax+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) {
149eb9d2429SVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, locgid, i, (locgid-gmin)*dmmoab->nfields+i);CHKERRQ(ierr);
150eb9d2429SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, locgid, i, (locgid-gmin)*dmmoab->nfields);
1511cec0304SVijay Mahadevan         }
1521cec0304SVijay Mahadevan         else {
153eb9d2429SVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, locgid, i, dmmoab->n*i+locgid-gmin);CHKERRQ(ierr);
15469263071SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, locgid, i, i*dmmoab->n);
1551cec0304SVijay Mahadevan         }
1561cec0304SVijay Mahadevan       }
157fc418013SVijay Mahadevan       ierr = PetscSectionSetDof(section, locgid, dmmoab->nfields);CHKERRQ(ierr);
1581cec0304SVijay Mahadevan     }
1591cec0304SVijay Mahadevan     ierr = PetscSectionSetUp(section);CHKERRQ(ierr);
1601cec0304SVijay Mahadevan     ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr);
1611cec0304SVijay Mahadevan   }
1621cec0304SVijay Mahadevan 
1631cec0304SVijay Mahadevan   {
164fc418013SVijay Mahadevan     for (i=0; i<totsize; ++i) {
165eb9d2429SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
166fc418013SVijay Mahadevan     }
167fc418013SVijay Mahadevan 
168032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
169032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
170032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
171032b8ab6SVijay Mahadevan 
172032b8ab6SVijay Mahadevan     /* global to local must retrieve ghost points */
173fc418013SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
174032b8ab6SVijay Mahadevan 
175db66d124SVijay Mahadevan     ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr);
176db66d124SVijay Mahadevan     ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr);
177032b8ab6SVijay Mahadevan 
178032b8ab6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
179032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
180032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
181032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
182032b8ab6SVijay Mahadevan   }
183032b8ab6SVijay Mahadevan 
1841cec0304SVijay Mahadevan   /* skin the boundary and store nodes */
1851cec0304SVijay Mahadevan   {
186eb9d2429SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
187eb9d2429SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
188eb9d2429SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
189eb9d2429SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1901cec0304SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1911cec0304SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
1921cec0304SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
19369263071SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
194eb9d2429SVijay Mahadevan 
195eb9d2429SVijay Mahadevan     /* get the entities on the skin - only the faces */
19669263071SVijay 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
197eb9d2429SVijay Mahadevan 
198eb9d2429SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
199eb9d2429SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
200eb9d2429SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
20169263071SVijay Mahadevan 
20269263071SVijay Mahadevan     if (dmmoab->dim == 3) {
20369263071SVijay Mahadevan       // get the edges from faces and then do the same if needed
20469263071SVijay Mahadevan     }
20569263071SVijay Mahadevan 
206eb9d2429SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
20769263071SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
20869263071SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
20969263071SVijay Mahadevan     PetscInfo3(dm, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
2101cec0304SVijay Mahadevan   }
211032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
212032b8ab6SVijay Mahadevan }
213032b8ab6SVijay Mahadevan 
2141cec0304SVijay Mahadevan 
215032b8ab6SVijay Mahadevan #undef __FUNCT__
216aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
217853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
218aa768e4cSTim Tautges {
219aa768e4cSTim Tautges   PetscErrorCode ierr;
220aa768e4cSTim Tautges 
221aa768e4cSTim Tautges   PetscFunctionBegin;
222aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
223032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
224032b8ab6SVijay Mahadevan 
225032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
226*324f1edfSVijay Mahadevan   ((DM_Moab*)dm->data)->nfields = 1;
227032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
228032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
229032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
230032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
231032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
232032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
233032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
234032b8ab6SVijay Mahadevan 
235032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
236032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
237032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
238032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
239032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
240aa768e4cSTim Tautges 
24197ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
24297ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
243032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
244032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
24597ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
246032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
247032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
248032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
249032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
250aa768e4cSTim Tautges   PetscFunctionReturn(0);
251aa768e4cSTim Tautges }
252fd349b41STim Tautges 
253fd349b41STim Tautges #undef __FUNCT__
2541d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
2551d72bce8STim Tautges /*@
2561d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
2571d72bce8STim Tautges 
2581d72bce8STim Tautges   Collective on MPI_Comm
2591d72bce8STim Tautges 
2601d72bce8STim Tautges   Input Parameter:
2611d72bce8STim Tautges . comm - The communicator for the DMMoab object
2621d72bce8STim Tautges 
2631d72bce8STim Tautges   Output Parameter:
264032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2651d72bce8STim Tautges 
2661d72bce8STim Tautges   Level: beginner
2671d72bce8STim Tautges 
2681d72bce8STim Tautges .keywords: DMMoab, create
2691d72bce8STim Tautges @*/
270032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
2711d72bce8STim Tautges {
2721d72bce8STim Tautges   PetscErrorCode ierr;
2731d72bce8STim Tautges 
2741d72bce8STim Tautges   PetscFunctionBegin;
275032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
276032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
277032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
2781d72bce8STim Tautges   PetscFunctionReturn(0);
2791d72bce8STim Tautges }
2801d72bce8STim Tautges 
2811d72bce8STim Tautges #undef __FUNCT__
282aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
2831d72bce8STim Tautges /*@
284a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
2851d72bce8STim Tautges 
2861d72bce8STim Tautges   Collective on MPI_Comm
2871d72bce8STim Tautges 
2881d72bce8STim Tautges   Input Parameter:
2891d72bce8STim Tautges . comm - The communicator for the DMMoab object
290032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
291a4d2169cSTim Tautges          along with the DMMoab
292a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
2931d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
2941d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
2951d72bce8STim Tautges 
2961d72bce8STim Tautges   Output Parameter:
297032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2981d72bce8STim Tautges 
299032b8ab6SVijay Mahadevan   Level: intermediate
3001d72bce8STim Tautges 
3011d72bce8STim Tautges .keywords: DMMoab, create
3021d72bce8STim Tautges @*/
303032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
3041d72bce8STim Tautges {
3051d72bce8STim Tautges   PetscErrorCode ierr;
306032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
3071cec0304SVijay Mahadevan   moab::EntityHandle partnset;
3081cec0304SVijay Mahadevan   PetscInt rank, nprocs;
309853cdec3SJed Brown   DM_Moab        *dmmoab;
3101d72bce8STim Tautges 
3111d72bce8STim Tautges   PetscFunctionBegin;
312032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
313032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
314032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
315a4d2169cSTim Tautges 
316a4d2169cSTim Tautges   if (!mbiface) {
31772ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
3187d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
3191d72bce8STim Tautges   }
3201cec0304SVijay Mahadevan   else {
3211cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
3227d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
3231cec0304SVijay Mahadevan   }
3241cec0304SVijay Mahadevan 
3251cec0304SVijay Mahadevan   /* create a fileset to store the hierarchy of entities belonging to current DM */
3261cec0304SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr);
3277d89fc02STim Tautges 
328a4d2169cSTim Tautges   if (!pcomm) {
329032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
330032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
331032b8ab6SVijay Mahadevan 
332db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
333db66d124SVijay Mahadevan        to the load_file functions to be populated. */
33472ff976dSVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
335032b8ab6SVijay Mahadevan     MBERR("Creating partition set failed", merr);
336032b8ab6SVijay Mahadevan 
337db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
33872ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
33972ff976dSVijay Mahadevan   }
34072ff976dSVijay Mahadevan   else {
34172ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
342032b8ab6SVijay Mahadevan   }
343032b8ab6SVijay Mahadevan 
3444973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
3454973de03SVijay Mahadevan   dmmoab->bs = 1;
346*324f1edfSVijay Mahadevan   dmmoab->nfields = 1;
3474973de03SVijay Mahadevan 
3484973de03SVijay Mahadevan   /* set global ID tag handle */
349032b8ab6SVijay Mahadevan   if (!ltog_tag) {
3504973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
351032b8ab6SVijay Mahadevan   }
352032b8ab6SVijay Mahadevan   else {
353032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
354a4d2169cSTim Tautges   }
355a4d2169cSTim Tautges 
3564973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
357a4d2169cSTim Tautges   if (range) {
3585eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
359a4d2169cSTim Tautges   }
3601d72bce8STim Tautges   PetscFunctionReturn(0);
3611d72bce8STim Tautges }
3621d72bce8STim Tautges 
3631d72bce8STim Tautges #undef __FUNCT__
3641d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
365aa768e4cSTim Tautges /*@
366aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
367aa768e4cSTim Tautges 
368aa768e4cSTim Tautges   Collective on MPI_Comm
369aa768e4cSTim Tautges 
370aa768e4cSTim Tautges   Input Parameter:
371aa768e4cSTim Tautges . dm    - The DMMoab object being set
372aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
373aa768e4cSTim Tautges 
374aa768e4cSTim Tautges   Level: beginner
375aa768e4cSTim Tautges 
376aa768e4cSTim Tautges .keywords: DMMoab, create
377aa768e4cSTim Tautges @*/
3781d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
3791d72bce8STim Tautges {
380032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
381032b8ab6SVijay Mahadevan 
3821d72bce8STim Tautges   PetscFunctionBegin;
3831d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3841cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
385032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
386032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
387032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
3881d72bce8STim Tautges   PetscFunctionReturn(0);
3891d72bce8STim Tautges }
3901d72bce8STim Tautges 
3911d72bce8STim Tautges 
3921d72bce8STim Tautges #undef __FUNCT__
3931d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
394aa768e4cSTim Tautges /*@
395aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
396aa768e4cSTim Tautges 
397aa768e4cSTim Tautges   Collective on MPI_Comm
398aa768e4cSTim Tautges 
399aa768e4cSTim Tautges   Input Parameter:
400aa768e4cSTim Tautges . dm    - The DMMoab object being set
401aa768e4cSTim Tautges 
402aa768e4cSTim Tautges   Output Parameter:
403aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
404aa768e4cSTim Tautges 
405aa768e4cSTim Tautges   Level: beginner
406aa768e4cSTim Tautges 
407aa768e4cSTim Tautges .keywords: DMMoab, create
408aa768e4cSTim Tautges @*/
4091d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
4101d72bce8STim Tautges {
4111d72bce8STim Tautges   PetscFunctionBegin;
4121d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
413032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
4141d72bce8STim Tautges   PetscFunctionReturn(0);
4151d72bce8STim Tautges }
4161d72bce8STim Tautges 
4171d72bce8STim Tautges 
4181d72bce8STim Tautges #undef __FUNCT__
4191d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
420aa768e4cSTim Tautges /*@
421aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
422aa768e4cSTim Tautges 
423aa768e4cSTim Tautges   Collective on MPI_Comm
424aa768e4cSTim Tautges 
425aa768e4cSTim Tautges   Input Parameter:
426aa768e4cSTim Tautges . dm      - The DMMoab object being set
427aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
428aa768e4cSTim Tautges 
429aa768e4cSTim Tautges   Level: beginner
430aa768e4cSTim Tautges 
431aa768e4cSTim Tautges .keywords: DMMoab, create
432aa768e4cSTim Tautges @*/
433a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
4341d72bce8STim Tautges {
435032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
436032b8ab6SVijay Mahadevan 
4371d72bce8STim Tautges   PetscFunctionBegin;
4381d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4391cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
440032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
441032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
442032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4431d72bce8STim Tautges   PetscFunctionReturn(0);
4441d72bce8STim Tautges }
4451d72bce8STim Tautges 
4461d72bce8STim Tautges 
4471d72bce8STim Tautges #undef __FUNCT__
4481d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
449aa768e4cSTim Tautges /*@
450aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
451aa768e4cSTim Tautges 
452aa768e4cSTim Tautges   Collective on MPI_Comm
453aa768e4cSTim Tautges 
454aa768e4cSTim Tautges   Input Parameter:
455aa768e4cSTim Tautges . dm      - The DMMoab object being set
456aa768e4cSTim Tautges 
457aa768e4cSTim Tautges   Output Parameter:
458aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
459aa768e4cSTim Tautges 
460aa768e4cSTim Tautges   Level: beginner
461aa768e4cSTim Tautges 
462aa768e4cSTim Tautges .keywords: DMMoab, create
463aa768e4cSTim Tautges @*/
464a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
4651d72bce8STim Tautges {
4669426e041SSatish Balay   PetscErrorCode   ierr;
467cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
468cabb514dSBarry Smith 
4691d72bce8STim Tautges   PetscFunctionBegin;
4701d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
471cabb514dSBarry 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);
472a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
4731d72bce8STim Tautges   PetscFunctionReturn(0);
4741d72bce8STim Tautges }
4751d72bce8STim Tautges 
4761d72bce8STim Tautges 
4771d72bce8STim Tautges #undef __FUNCT__
4785eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
479aa768e4cSTim Tautges /*@
4805eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
481aa768e4cSTim Tautges 
482aa768e4cSTim Tautges   Collective on MPI_Comm
483aa768e4cSTim Tautges 
484aa768e4cSTim Tautges   Input Parameter:
485aa768e4cSTim Tautges . dm    - The DMMoab object being set
486aa768e4cSTim Tautges . range - The entities treated by this DMMoab
487aa768e4cSTim Tautges 
488aa768e4cSTim Tautges   Level: beginner
489aa768e4cSTim Tautges 
490aa768e4cSTim Tautges .keywords: DMMoab, create
491aa768e4cSTim Tautges @*/
4925eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
4931d72bce8STim Tautges {
494032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
495032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
496032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
497032b8ab6SVijay Mahadevan 
4981d72bce8STim Tautges   PetscFunctionBegin;
4991d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
500032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
501032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
502032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
503032b8ab6SVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
504032b8ab6SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
505032b8ab6SVijay Mahadevan   *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned);
506032b8ab6SVijay Mahadevan   dmmoab->nloc=dmmoab->vowned->size();
507032b8ab6SVijay Mahadevan   dmmoab->nghost=dmmoab->vghost->size();
508032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5091d72bce8STim Tautges   PetscFunctionReturn(0);
5101d72bce8STim Tautges }
5111d72bce8STim Tautges 
5121d72bce8STim Tautges 
5131d72bce8STim Tautges #undef __FUNCT__
5145eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
515aa768e4cSTim Tautges /*@
5165eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on 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 
523aa768e4cSTim Tautges   Output Parameter:
5245eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
5255eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
526aa768e4cSTim Tautges 
527aa768e4cSTim Tautges   Level: beginner
528aa768e4cSTim Tautges 
529aa768e4cSTim Tautges .keywords: DMMoab, create
530aa768e4cSTim Tautges @*/
5311cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
5321d72bce8STim Tautges {
5331d72bce8STim Tautges   PetscFunctionBegin;
5341d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5351cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
5361cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
5371d72bce8STim Tautges   PetscFunctionReturn(0);
5381d72bce8STim Tautges }
5391d72bce8STim Tautges 
5401d72bce8STim Tautges #undef __FUNCT__
5415eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
5425eb88e9dSVijay Mahadevan /*@
5435eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
5445eb88e9dSVijay Mahadevan 
5455eb88e9dSVijay Mahadevan   Collective on MPI_Comm
5465eb88e9dSVijay Mahadevan 
5475eb88e9dSVijay Mahadevan   Input Parameter:
5485eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
5495eb88e9dSVijay Mahadevan 
5505eb88e9dSVijay Mahadevan   Output Parameter:
5515eb88e9dSVijay Mahadevan . range - The entities owned locally
5525eb88e9dSVijay Mahadevan 
5535eb88e9dSVijay Mahadevan   Level: beginner
5545eb88e9dSVijay Mahadevan 
5555eb88e9dSVijay Mahadevan .keywords: DMMoab, create
5565eb88e9dSVijay Mahadevan @*/
5571cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
5585eb88e9dSVijay Mahadevan {
5595eb88e9dSVijay Mahadevan   PetscFunctionBegin;
5605eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5611cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
5621cec0304SVijay Mahadevan   PetscFunctionReturn(0);
5631cec0304SVijay Mahadevan }
5641cec0304SVijay Mahadevan 
5651cec0304SVijay Mahadevan 
5661cec0304SVijay Mahadevan #undef __FUNCT__
5671cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
5681cec0304SVijay Mahadevan /*@
5691cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
5701cec0304SVijay Mahadevan 
5711cec0304SVijay Mahadevan   Collective on MPI_Comm
5721cec0304SVijay Mahadevan 
5731cec0304SVijay Mahadevan   Input Parameter:
5741cec0304SVijay Mahadevan . dm    - The DMMoab object being set
5751cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
5761cec0304SVijay Mahadevan 
5771cec0304SVijay Mahadevan   Level: beginner
5781cec0304SVijay Mahadevan 
5791cec0304SVijay Mahadevan .keywords: DMMoab, create
5801cec0304SVijay Mahadevan @*/
5811cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
5821cec0304SVijay Mahadevan {
5831cec0304SVijay Mahadevan   moab::ErrorCode merr;
5841cec0304SVijay Mahadevan   PetscErrorCode  ierr;
5851cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
5861cec0304SVijay Mahadevan 
5871cec0304SVijay Mahadevan   PetscFunctionBegin;
5881cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5891cec0304SVijay Mahadevan   dmmoab->elocal->clear();
5901cec0304SVijay Mahadevan   dmmoab->eghost->clear();
5911cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
5921cec0304SVijay Mahadevan   PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size());
5931cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
5941cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
5951cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
5961cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5971cec0304SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele);
5985eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
5995eb88e9dSVijay Mahadevan }
6005eb88e9dSVijay Mahadevan 
6015eb88e9dSVijay Mahadevan 
6025eb88e9dSVijay Mahadevan #undef __FUNCT__
6031d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
604aa768e4cSTim Tautges /*@
605aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
606aa768e4cSTim Tautges 
607aa768e4cSTim Tautges   Collective on MPI_Comm
608aa768e4cSTim Tautges 
609aa768e4cSTim Tautges   Input Parameter:
610aa768e4cSTim Tautges . dm      - The DMMoab object being set
611aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
612aa768e4cSTim Tautges 
613aa768e4cSTim Tautges   Level: beginner
614aa768e4cSTim Tautges 
615aa768e4cSTim Tautges .keywords: DMMoab, create
616aa768e4cSTim Tautges @*/
6171d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
6181d72bce8STim Tautges {
6191d72bce8STim Tautges   PetscFunctionBegin;
6201d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6211d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
6221d72bce8STim Tautges   PetscFunctionReturn(0);
6231d72bce8STim Tautges }
6241d72bce8STim Tautges 
6251d72bce8STim Tautges 
6261d72bce8STim Tautges #undef __FUNCT__
6271d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
628aa768e4cSTim Tautges /*@
629aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
630aa768e4cSTim Tautges 
631aa768e4cSTim Tautges   Collective on MPI_Comm
632aa768e4cSTim Tautges 
633aa768e4cSTim Tautges   Input Parameter:
634aa768e4cSTim Tautges . dm      - The DMMoab object being set
635aa768e4cSTim Tautges 
636aa768e4cSTim Tautges   Output Parameter:
637aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
638aa768e4cSTim Tautges 
639aa768e4cSTim Tautges   Level: beginner
640aa768e4cSTim Tautges 
641aa768e4cSTim Tautges .keywords: DMMoab, create
642aa768e4cSTim Tautges @*/
6431d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
6441d72bce8STim Tautges {
6451d72bce8STim Tautges   PetscFunctionBegin;
6461d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6471d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
6481d72bce8STim Tautges   PetscFunctionReturn(0);
6491d72bce8STim Tautges }
6501d72bce8STim Tautges 
6511d72bce8STim Tautges 
6521d72bce8STim Tautges #undef __FUNCT__
6531d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
654aa768e4cSTim Tautges /*@
655aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
656aa768e4cSTim Tautges 
657aa768e4cSTim Tautges   Collective on MPI_Comm
658aa768e4cSTim Tautges 
659aa768e4cSTim Tautges   Input Parameter:
660aa768e4cSTim Tautges . dm - The DMMoab object being set
661aa768e4cSTim Tautges . bs - The block size used with this DMMoab
662aa768e4cSTim Tautges 
663aa768e4cSTim Tautges   Level: beginner
664aa768e4cSTim Tautges 
665aa768e4cSTim Tautges .keywords: DMMoab, create
666aa768e4cSTim Tautges @*/
6671d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
6681d72bce8STim Tautges {
6691d72bce8STim Tautges   PetscFunctionBegin;
6701d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6711d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
6721d72bce8STim Tautges   PetscFunctionReturn(0);
6731d72bce8STim Tautges }
6741d72bce8STim Tautges 
6751d72bce8STim Tautges 
6761d72bce8STim Tautges #undef __FUNCT__
6771d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
678aa768e4cSTim Tautges /*@
679aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
680aa768e4cSTim Tautges 
681aa768e4cSTim Tautges   Collective on MPI_Comm
682aa768e4cSTim Tautges 
683aa768e4cSTim Tautges   Input Parameter:
684aa768e4cSTim Tautges . dm - The DMMoab object being set
685aa768e4cSTim Tautges 
686aa768e4cSTim Tautges   Output Parameter:
687aa768e4cSTim Tautges . bs - The block size used with this DMMoab
688aa768e4cSTim Tautges 
689aa768e4cSTim Tautges   Level: beginner
690aa768e4cSTim Tautges 
691aa768e4cSTim Tautges .keywords: DMMoab, create
692aa768e4cSTim Tautges @*/
6931d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
6941d72bce8STim Tautges {
6951d72bce8STim Tautges   PetscFunctionBegin;
6961d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6971d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
6981d72bce8STim Tautges   PetscFunctionReturn(0);
6991d72bce8STim Tautges }
7001d72bce8STim Tautges 
7011cec0304SVijay Mahadevan 
7021cec0304SVijay Mahadevan #undef __FUNCT__
703212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
704212ad6d1SVijay Mahadevan /*@
705212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
706212ad6d1SVijay Mahadevan 
707212ad6d1SVijay Mahadevan   Collective on MPI_Comm
708212ad6d1SVijay Mahadevan 
709212ad6d1SVijay Mahadevan   Input Parameter:
710212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
711212ad6d1SVijay Mahadevan 
712212ad6d1SVijay Mahadevan   Output Parameter:
713212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance
714212ad6d1SVijay Mahadevan 
715212ad6d1SVijay Mahadevan   Level: beginner
716212ad6d1SVijay Mahadevan 
717212ad6d1SVijay Mahadevan .keywords: DMMoab, create
718212ad6d1SVijay Mahadevan @*/
719212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *ng)
720212ad6d1SVijay Mahadevan {
721212ad6d1SVijay Mahadevan   PetscFunctionBegin;
722212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
723212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->n;
724212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
725212ad6d1SVijay Mahadevan }
726212ad6d1SVijay Mahadevan 
727212ad6d1SVijay Mahadevan 
728212ad6d1SVijay Mahadevan #undef __FUNCT__
729212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
730212ad6d1SVijay Mahadevan /*@
731212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
732212ad6d1SVijay Mahadevan 
733212ad6d1SVijay Mahadevan   Collective on MPI_Comm
734212ad6d1SVijay Mahadevan 
735212ad6d1SVijay Mahadevan   Input Parameter:
736212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
737212ad6d1SVijay Mahadevan 
738212ad6d1SVijay Mahadevan   Output Parameter:
739212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance
740212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance
741212ad6d1SVijay Mahadevan 
742212ad6d1SVijay Mahadevan   Level: beginner
743212ad6d1SVijay Mahadevan 
744212ad6d1SVijay Mahadevan .keywords: DMMoab, create
745212ad6d1SVijay Mahadevan @*/
746212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nl,PetscInt *ng)
747212ad6d1SVijay Mahadevan {
748212ad6d1SVijay Mahadevan   PetscFunctionBegin;
749212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
750212ad6d1SVijay Mahadevan   if(nl) *nl = ((DM_Moab*)dm->data)->nloc;
751212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->nghost;
752212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
753212ad6d1SVijay Mahadevan }
754212ad6d1SVijay Mahadevan 
755212ad6d1SVijay Mahadevan 
756212ad6d1SVijay Mahadevan #undef __FUNCT__
7571cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector"
7581cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
7591cec0304SVijay Mahadevan {
7601cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
7611cec0304SVijay Mahadevan   moab::Tag     vtag,ntag;
762212ad6d1SVijay Mahadevan   const PetscScalar *varray;
763212ad6d1SVijay Mahadevan   PetscScalar *farray;
7641cec0304SVijay Mahadevan   moab::ErrorCode merr;
7651cec0304SVijay Mahadevan   PetscErrorCode  ierr;
7661cec0304SVijay Mahadevan   PetscInt doff;
7671cec0304SVijay Mahadevan   std::string tag_name;
7681cec0304SVijay Mahadevan   moab::Range::iterator iter;
7691cec0304SVijay Mahadevan 
7701cec0304SVijay Mahadevan   PetscFunctionBegin;
7711cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7721cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7731cec0304SVijay Mahadevan 
7741cec0304SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
7751cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
7761cec0304SVijay Mahadevan                                           moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
7771cec0304SVijay Mahadevan 
7781cec0304SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
7791cec0304SVijay Mahadevan 
7801cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
7811cec0304SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
782212ad6d1SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
783212ad6d1SVijay Mahadevan 
7841cec0304SVijay Mahadevan     for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
7851cec0304SVijay Mahadevan       moab::EntityHandle vtx = (*iter);
7861cec0304SVijay Mahadevan 
7871cec0304SVijay Mahadevan       /* get field dof index */
788212ad6d1SVijay Mahadevan       ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff);
7891cec0304SVijay Mahadevan 
7901cec0304SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
7911cec0304SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr);
7921cec0304SVijay Mahadevan     }
793212ad6d1SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
7941cec0304SVijay Mahadevan   }
7951cec0304SVijay Mahadevan   else {
796212ad6d1SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr);
7971cec0304SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
798212ad6d1SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr);
799212ad6d1SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
8001cec0304SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
8011cec0304SVijay Mahadevan     merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
802212ad6d1SVijay Mahadevan     ierr = PetscFree(farray);CHKERRQ(ierr);
803212ad6d1SVijay Mahadevan   }
804212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
805212ad6d1SVijay Mahadevan }
806212ad6d1SVijay Mahadevan 
807212ad6d1SVijay Mahadevan 
808212ad6d1SVijay Mahadevan #undef __FUNCT__
809212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector"
810212ad6d1SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
811212ad6d1SVijay Mahadevan {
812212ad6d1SVijay Mahadevan   DM_Moab        *dmmoab;
813212ad6d1SVijay Mahadevan   moab::Tag     vtag,ntag;
814212ad6d1SVijay Mahadevan   const PetscScalar   *varray;
815212ad6d1SVijay Mahadevan   PetscScalar   *farray;
816212ad6d1SVijay Mahadevan   moab::ErrorCode merr;
817212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
818212ad6d1SVijay Mahadevan   PetscSection section;
819212ad6d1SVijay Mahadevan   PetscInt i,doff,ifield;
820212ad6d1SVijay Mahadevan   std::string tag_name;
821212ad6d1SVijay Mahadevan   moab::Range::iterator iter;
822212ad6d1SVijay Mahadevan 
823212ad6d1SVijay Mahadevan   PetscFunctionBegin;
824212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
825212ad6d1SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
826212ad6d1SVijay Mahadevan 
827212ad6d1SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
828212ad6d1SVijay Mahadevan 
829212ad6d1SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
830212ad6d1SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
831212ad6d1SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
832212ad6d1SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
833212ad6d1SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
834212ad6d1SVijay Mahadevan 
835212ad6d1SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
836212ad6d1SVijay Mahadevan     for (ifield=0; ifield<dmmoab->nfields; ++ifield) {
837212ad6d1SVijay Mahadevan 
838212ad6d1SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
839212ad6d1SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
840212ad6d1SVijay Mahadevan                                             moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
841212ad6d1SVijay Mahadevan 
842212ad6d1SVijay Mahadevan       for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
843212ad6d1SVijay Mahadevan         moab::EntityHandle vtx = (*iter);
844212ad6d1SVijay Mahadevan 
845212ad6d1SVijay Mahadevan         /* get field dof index */
846212ad6d1SVijay Mahadevan         ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff);
847212ad6d1SVijay Mahadevan 
848212ad6d1SVijay Mahadevan         /* use the entity handle and the Dof index to set the right value */
849212ad6d1SVijay Mahadevan         merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr);
850212ad6d1SVijay Mahadevan       }
851212ad6d1SVijay Mahadevan     }
852212ad6d1SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
853212ad6d1SVijay Mahadevan   }
854212ad6d1SVijay Mahadevan   else {
855212ad6d1SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr);
856212ad6d1SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*dmmoab->bs*sizeof(PetscScalar),&varray);CHKERRQ(ierr);
857212ad6d1SVijay Mahadevan 
858212ad6d1SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
859212ad6d1SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
860212ad6d1SVijay Mahadevan     for (ifield=0; ifield<dmmoab->nfields; ++ifield) {
861212ad6d1SVijay Mahadevan 
862212ad6d1SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
863212ad6d1SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
864212ad6d1SVijay Mahadevan                                             moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
865212ad6d1SVijay Mahadevan 
866212ad6d1SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
867212ad6d1SVijay Mahadevan       for(i=0; i < dmmoab->nloc; i++) {
868212ad6d1SVijay Mahadevan         farray[i] = varray[i*dmmoab->bs+ifield];
869212ad6d1SVijay Mahadevan       }
870212ad6d1SVijay Mahadevan 
871212ad6d1SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
872212ad6d1SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
873212ad6d1SVijay Mahadevan       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
874212ad6d1SVijay Mahadevan     }
875212ad6d1SVijay Mahadevan     ierr = PetscFree(farray);CHKERRQ(ierr);
8761cec0304SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
8771cec0304SVijay Mahadevan   }
8781cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8791cec0304SVijay Mahadevan }
8801cec0304SVijay Mahadevan 
8811cec0304SVijay Mahadevan 
882212ad6d1SVijay Mahadevan 
8831cec0304SVijay Mahadevan #undef __FUNCT__
8847023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
8857023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
8867023aa44SVijay Mahadevan {
8877023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
8887023aa44SVijay Mahadevan   PetscErrorCode  ierr;
8897023aa44SVijay Mahadevan   moab::ErrorCode merr;
8907023aa44SVijay Mahadevan 
8917023aa44SVijay Mahadevan   PetscFunctionBegin;
8927023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8937023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
8947023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8957023aa44SVijay Mahadevan 
8967023aa44SVijay Mahadevan   if (!vpos) {
8977023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
8987023aa44SVijay Mahadevan   }
8997023aa44SVijay Mahadevan 
9007023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9017023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
9027023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9037023aa44SVijay Mahadevan }
9047023aa44SVijay Mahadevan 
9057023aa44SVijay Mahadevan 
9067023aa44SVijay Mahadevan #undef __FUNCT__
9077023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
9087023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
9097023aa44SVijay Mahadevan {
9107023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9117023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
9127023aa44SVijay Mahadevan   moab::ErrorCode merr;
9137023aa44SVijay Mahadevan   PetscInt nnodes;
9147023aa44SVijay Mahadevan 
9157023aa44SVijay Mahadevan   PetscFunctionBegin;
9167023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9177023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
9187023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9197023aa44SVijay Mahadevan 
9207023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9217023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
9227023aa44SVijay Mahadevan   if (conn) *conn=connect;
9237023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
9247023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9257023aa44SVijay Mahadevan }
9267023aa44SVijay Mahadevan 
9277023aa44SVijay Mahadevan 
9287023aa44SVijay Mahadevan #undef __FUNCT__
92969263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
93069263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
93169263071SVijay Mahadevan {
93269263071SVijay Mahadevan   moab::EntityType etype;
93369263071SVijay Mahadevan   DM_Moab         *dmmoab;
93469263071SVijay Mahadevan   PetscInt         edim;
93569263071SVijay Mahadevan 
93669263071SVijay Mahadevan   PetscFunctionBegin;
93769263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
93869263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
93969263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
94069263071SVijay Mahadevan 
94169263071SVijay Mahadevan   /* get the entity type and handle accordingly */
94269263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
94369263071SVijay 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);
94469263071SVijay Mahadevan 
94569263071SVijay Mahadevan   /* get the entity dimension */
94669263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
94769263071SVijay Mahadevan 
94869263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
94969263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
95069263071SVijay Mahadevan     moab::Range::const_iterator giter = dmmoab->bndyvtx->find(ent);
95169263071SVijay Mahadevan     if (giter != dmmoab->bndyvtx->end()) *ent_on_boundary=PETSC_TRUE;
95269263071SVijay Mahadevan   }
95369263071SVijay Mahadevan   else {
95469263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
95569263071SVijay Mahadevan       moab::Range::const_iterator geiter = dmmoab->bndyelems->find(ent);
95669263071SVijay Mahadevan       if (geiter != dmmoab->bndyelems->end()) *ent_on_boundary=PETSC_TRUE;
95769263071SVijay Mahadevan     }
95869263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
95969263071SVijay Mahadevan       moab::Range::const_iterator gfiter = dmmoab->bndyfaces->find(ent);
96069263071SVijay Mahadevan       if (gfiter != dmmoab->bndyfaces->end()) *ent_on_boundary=PETSC_TRUE;
96169263071SVijay Mahadevan     }
96269263071SVijay Mahadevan   }
96369263071SVijay Mahadevan   PetscFunctionReturn(0);
96469263071SVijay Mahadevan }
96569263071SVijay Mahadevan 
96669263071SVijay Mahadevan 
96769263071SVijay Mahadevan #undef __FUNCT__
9687023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
96969263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
9707023aa44SVijay Mahadevan {
9717023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9727023aa44SVijay Mahadevan   PetscInt       i;
9737023aa44SVijay Mahadevan 
9747023aa44SVijay Mahadevan   PetscFunctionBegin;
9757023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9767023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
9777023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
9787023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9797023aa44SVijay Mahadevan 
9807023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
9817023aa44SVijay Mahadevan     moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]);
98269263071SVijay Mahadevan     if (giter != dmmoab->bndyvtx->end()) isbdvtx[i] = PETSC_TRUE;
9837023aa44SVijay Mahadevan     else isbdvtx[i] = PETSC_FALSE;
9847023aa44SVijay Mahadevan   }
9857023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9867023aa44SVijay Mahadevan }
9877023aa44SVijay Mahadevan 
9887023aa44SVijay Mahadevan 
9897023aa44SVijay Mahadevan #undef __FUNCT__
9901cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities"
99169263071SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces,moab::Range* bdelems)
9921cec0304SVijay Mahadevan {
9931cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
9941cec0304SVijay Mahadevan 
9951cec0304SVijay Mahadevan   PetscFunctionBegin;
9961cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9971cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9981cec0304SVijay Mahadevan 
9991cec0304SVijay Mahadevan   if (bdvtx)  *bdvtx = *dmmoab->bndyvtx;
10001cec0304SVijay Mahadevan   if (bdfaces)  *bdfaces = *dmmoab->bndyfaces;
100169263071SVijay Mahadevan   if (bdelems)  *bdfaces = *dmmoab->bndyelems;
10021cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10031cec0304SVijay Mahadevan }
10041cec0304SVijay Mahadevan 
10051cec0304SVijay Mahadevan 
10061cec0304SVijay Mahadevan #undef __FUNCT__
10071cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields"
10081cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields)
10091cec0304SVijay Mahadevan {
10101cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
10111cec0304SVijay Mahadevan 
10121cec0304SVijay Mahadevan   PetscFunctionBegin;
10131cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
10141cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
10151cec0304SVijay Mahadevan 
10161cec0304SVijay Mahadevan   dmmoab->fields = fields;
10171cec0304SVijay Mahadevan   dmmoab->nfields = nfields;
10181cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10191cec0304SVijay Mahadevan }
10201cec0304SVijay Mahadevan 
10211cec0304SVijay Mahadevan 
10221cec0304SVijay Mahadevan #undef __FUNCT__
10231cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
10241cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
10251cec0304SVijay Mahadevan {
10261cec0304SVijay Mahadevan   PetscSection section;
1027fc418013SVijay Mahadevan   PetscInt gid;
10281cec0304SVijay Mahadevan   PetscErrorCode ierr;
1029fc418013SVijay Mahadevan   moab::ErrorCode merr;
1030fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
10311cec0304SVijay Mahadevan 
10321cec0304SVijay Mahadevan   PetscFunctionBegin;
10331cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1034fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1035fc418013SVijay Mahadevan 
10361cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
1037fc418013SVijay Mahadevan 
1038fc418013SVijay Mahadevan   /* first get the global ID for the point */
1039fc418013SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&point,1,&gid);MBERRNM(merr);
1040fc418013SVijay Mahadevan 
1041fc418013SVijay Mahadevan   /* get the dof value for the field */
1042fc418013SVijay Mahadevan   ierr = PetscSectionGetFieldDof(section, gid, field, dof);CHKERRQ(ierr);
10431cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10441cec0304SVijay Mahadevan }
10451cec0304SVijay Mahadevan 
10461cec0304SVijay Mahadevan 
10471cec0304SVijay Mahadevan #undef __FUNCT__
10481cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
10491cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
10501cec0304SVijay Mahadevan {
1051fc418013SVijay Mahadevan   PetscInt i,gid;
10521cec0304SVijay Mahadevan   PetscSection section;
10531cec0304SVijay Mahadevan   PetscErrorCode  ierr;
1054fc418013SVijay Mahadevan   moab::ErrorCode merr;
1055fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
10561cec0304SVijay Mahadevan 
10571cec0304SVijay Mahadevan   PetscFunctionBegin;
10581cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1059*324f1edfSVijay Mahadevan   PetscValidPointer(points,2);
1060fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1061fc418013SVijay Mahadevan 
10621cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
10631cec0304SVijay Mahadevan   if (!dof) {
10641cec0304SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
10651cec0304SVijay Mahadevan   }
1066fc418013SVijay Mahadevan 
1067fc418013SVijay Mahadevan   /* first get the local indices */
1068fc418013SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr);
1069fc418013SVijay Mahadevan 
10701cec0304SVijay Mahadevan   for (i=0; i<npoints; ++i) {
1071fc418013SVijay Mahadevan     gid=dof[i];
1072fc418013SVijay Mahadevan     ierr = PetscSectionGetFieldDof(section, gid, field, &dof[i]);CHKERRQ(ierr);
10731cec0304SVijay Mahadevan   }
10741cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10751cec0304SVijay Mahadevan }
10761cec0304SVijay Mahadevan 
10771cec0304SVijay Mahadevan 
1078fc418013SVijay Mahadevan #undef __FUNCT__
1079212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal"
1080212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
1081eb9d2429SVijay Mahadevan {
1082eb9d2429SVijay Mahadevan   PetscInt i,offset;
1083eb9d2429SVijay Mahadevan   PetscErrorCode  ierr;
1084eb9d2429SVijay Mahadevan   DM_Moab        *dmmoab;
1085eb9d2429SVijay Mahadevan 
1086eb9d2429SVijay Mahadevan   PetscFunctionBegin;
1087eb9d2429SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1088*324f1edfSVijay Mahadevan   PetscValidPointer(points,2);
1089eb9d2429SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1090eb9d2429SVijay Mahadevan 
1091eb9d2429SVijay Mahadevan   if (!dof) {
1092eb9d2429SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
1093eb9d2429SVijay Mahadevan   }
1094eb9d2429SVijay Mahadevan 
1095eb9d2429SVijay Mahadevan   if (dmmoab->bs > 1) {
1096eb9d2429SVijay Mahadevan     for (i=0; i<npoints; ++i)
1097eb9d2429SVijay Mahadevan       dof[i] = (points[i]-1)*dmmoab->bs+field;
1098eb9d2429SVijay Mahadevan   }
1099eb9d2429SVijay Mahadevan   else {
1100eb9d2429SVijay Mahadevan     offset = field*dmmoab->n; /* assume all fields have equal distribution */
1101eb9d2429SVijay Mahadevan     for (i=0; i<npoints; ++i)
1102eb9d2429SVijay Mahadevan       dof[i] = offset+points[i]-1;
1103eb9d2429SVijay Mahadevan   }
1104eb9d2429SVijay Mahadevan   PetscFunctionReturn(0);
1105eb9d2429SVijay Mahadevan }
1106eb9d2429SVijay Mahadevan 
1107eb9d2429SVijay Mahadevan 
1108eb9d2429SVijay Mahadevan #undef __FUNCT__
1109212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs"
1110212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
1111212ad6d1SVijay Mahadevan {
1112212ad6d1SVijay Mahadevan   PetscInt i,f,gid;
1113212ad6d1SVijay Mahadevan   PetscSection section;
1114212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
1115212ad6d1SVijay Mahadevan   moab::ErrorCode merr;
1116212ad6d1SVijay Mahadevan   DM_Moab        *dmmoab;
1117212ad6d1SVijay Mahadevan 
1118212ad6d1SVijay Mahadevan   PetscFunctionBegin;
1119212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1120*324f1edfSVijay Mahadevan   PetscValidPointer(points,2);
1121212ad6d1SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1122212ad6d1SVijay Mahadevan 
1123212ad6d1SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
1124212ad6d1SVijay Mahadevan   if (!dof) {
1125212ad6d1SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr);
1126212ad6d1SVijay Mahadevan   }
1127212ad6d1SVijay Mahadevan 
1128212ad6d1SVijay Mahadevan   /* first get the local indices */
1129212ad6d1SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr);
1130212ad6d1SVijay Mahadevan 
1131212ad6d1SVijay Mahadevan   for (i=0; i<npoints; ++i) {
1132212ad6d1SVijay Mahadevan     gid=dof[i];
1133212ad6d1SVijay Mahadevan     for (f=0; f<dmmoab->nfields; ++f) {
1134212ad6d1SVijay Mahadevan       ierr = PetscSectionGetFieldDof(section, gid, f, &dof[i*dmmoab->nfields+f]);CHKERRQ(ierr);
1135212ad6d1SVijay Mahadevan     }
1136212ad6d1SVijay Mahadevan   }
1137212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
1138212ad6d1SVijay Mahadevan }
1139212ad6d1SVijay Mahadevan 
1140212ad6d1SVijay Mahadevan 
1141212ad6d1SVijay Mahadevan #undef __FUNCT__
1142212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal"
1143212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
1144212ad6d1SVijay Mahadevan {
1145212ad6d1SVijay Mahadevan   PetscInt        i,f,offset;
1146212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
1147212ad6d1SVijay Mahadevan   DM_Moab        *dmmoab;
1148212ad6d1SVijay Mahadevan 
1149212ad6d1SVijay Mahadevan   PetscFunctionBegin;
1150212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1151*324f1edfSVijay Mahadevan   PetscValidPointer(points,2);
1152212ad6d1SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1153212ad6d1SVijay Mahadevan 
1154212ad6d1SVijay Mahadevan   if (!dof) {
1155212ad6d1SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr);
1156212ad6d1SVijay Mahadevan   }
1157212ad6d1SVijay Mahadevan 
1158212ad6d1SVijay Mahadevan   if (dmmoab->bs > 1) {
1159212ad6d1SVijay Mahadevan     for (f=0; f<dmmoab->nfields; ++f)
1160212ad6d1SVijay Mahadevan       for (i=0; i<npoints; ++i)
1161212ad6d1SVijay Mahadevan         dof[i*dmmoab->nfields+f] = (points[i]-1)*dmmoab->bs+f;
1162212ad6d1SVijay Mahadevan   }
1163212ad6d1SVijay Mahadevan   else {
1164212ad6d1SVijay Mahadevan     for (f=0; f<dmmoab->nfields; ++f) {
1165212ad6d1SVijay Mahadevan       offset = f*dmmoab->n;     /* assume all fields have equal distribution - say all vertex based */
1166212ad6d1SVijay Mahadevan       for (i=0; i<npoints; ++i)
1167212ad6d1SVijay Mahadevan         dof[i*dmmoab->nfields+f] = offset+points[i]-1;
1168212ad6d1SVijay Mahadevan     }
1169212ad6d1SVijay Mahadevan   }
1170212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
1171212ad6d1SVijay Mahadevan }
1172212ad6d1SVijay Mahadevan 
1173212ad6d1SVijay Mahadevan 
1174212ad6d1SVijay Mahadevan #undef __FUNCT__
1175212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked"
1176212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
1177212ad6d1SVijay Mahadevan {
1178212ad6d1SVijay Mahadevan   PetscInt i,gid,dofindx;
1179212ad6d1SVijay Mahadevan   PetscSection section;
1180212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
1181212ad6d1SVijay Mahadevan   moab::ErrorCode merr;
1182212ad6d1SVijay Mahadevan   DM_Moab        *dmmoab;
1183212ad6d1SVijay Mahadevan 
1184212ad6d1SVijay Mahadevan   PetscFunctionBegin;
1185212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1186*324f1edfSVijay Mahadevan   PetscValidPointer(points,2);
1187212ad6d1SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1188212ad6d1SVijay Mahadevan 
1189212ad6d1SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
1190212ad6d1SVijay Mahadevan   if (!dof) {
1191212ad6d1SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
1192212ad6d1SVijay Mahadevan   }
1193212ad6d1SVijay Mahadevan 
1194212ad6d1SVijay Mahadevan   /* first get the local indices */
1195212ad6d1SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr);
1196212ad6d1SVijay Mahadevan 
1197212ad6d1SVijay Mahadevan   for (i=0; i<npoints; ++i) {
1198212ad6d1SVijay Mahadevan     gid=dof[i];
1199212ad6d1SVijay Mahadevan     ierr = PetscSectionGetFieldDof(section, gid, 0, &dofindx);CHKERRQ(ierr);
1200212ad6d1SVijay Mahadevan     if (dmmoab->bs > 1)  dof[i]=dofindx/dmmoab->bs;
1201212ad6d1SVijay Mahadevan     else dof[i]=dofindx;
1202212ad6d1SVijay Mahadevan   }
1203212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
1204212ad6d1SVijay Mahadevan }
1205212ad6d1SVijay Mahadevan 
1206212ad6d1SVijay Mahadevan 
1207212ad6d1SVijay Mahadevan #undef __FUNCT__
1208212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal"
1209212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
1210212ad6d1SVijay Mahadevan {
1211212ad6d1SVijay Mahadevan   PetscInt        i;
1212212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
1213212ad6d1SVijay Mahadevan 
1214212ad6d1SVijay Mahadevan   PetscFunctionBegin;
1215212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1216*324f1edfSVijay Mahadevan   PetscValidPointer(points,2);
1217212ad6d1SVijay Mahadevan 
1218212ad6d1SVijay Mahadevan   if (!dof) {
1219212ad6d1SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
1220212ad6d1SVijay Mahadevan   }
1221212ad6d1SVijay Mahadevan 
1222212ad6d1SVijay Mahadevan   for (i=0; i<npoints; ++i)
1223212ad6d1SVijay Mahadevan     dof[i] = points[i]-1;
1224212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
1225212ad6d1SVijay Mahadevan }
1226212ad6d1SVijay Mahadevan 
1227212ad6d1SVijay Mahadevan #undef __FUNCT__
1228fc418013SVijay Mahadevan #define __FUNCT__ "DMMoab_GetWriteOptions_Private"
1229fc418013SVijay Mahadevan PetscErrorCode DMMoab_GetWriteOptions_Private(PetscInt fsetid, PetscInt numproc, PetscInt dim, MoabWriteMode mode, PetscInt dbglevel, const char* extra_opts, const char** write_opts)
1230fc418013SVijay Mahadevan {
1231fc418013SVijay Mahadevan   std::ostringstream str;
1232fc418013SVijay Mahadevan 
1233fc418013SVijay Mahadevan   PetscFunctionBegin;
1234fc418013SVijay Mahadevan 
1235fc418013SVijay Mahadevan   // do parallel read unless only one processor
1236fc418013SVijay Mahadevan   if (numproc > 1) {
1237fc418013SVijay Mahadevan     str << "PARALLEL=" << mode << ";";
1238fc418013SVijay Mahadevan     if (fsetid>=0) str << "PARALLEL_COMM=" << fsetid << ";";
1239fc418013SVijay Mahadevan   }
1240fc418013SVijay Mahadevan 
1241fc418013SVijay Mahadevan   if (dbglevel)
1242fc418013SVijay Mahadevan     str << "CPUTIME;DEBUG_IO=" << dbglevel << ";";
1243fc418013SVijay Mahadevan 
1244fc418013SVijay Mahadevan   if (extra_opts)
1245fc418013SVijay Mahadevan     str << extra_opts ;
1246fc418013SVijay Mahadevan 
1247fc418013SVijay Mahadevan   *write_opts = str.str().c_str();
1248fc418013SVijay Mahadevan   PetscFunctionReturn(0);
1249fc418013SVijay Mahadevan }
1250fc418013SVijay Mahadevan 
1251fc418013SVijay Mahadevan 
1252fc418013SVijay Mahadevan #undef __FUNCT__
1253fc418013SVijay Mahadevan #define __FUNCT__ "DMMoabOutput"
1254fc418013SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* filename,const char* usrwriteopts)
1255fc418013SVijay Mahadevan {
1256fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
1257fc418013SVijay Mahadevan   PetscInt       dbglevel=0;
1258fc418013SVijay Mahadevan   const char *writeopts;
1259fc418013SVijay Mahadevan 
1260fc418013SVijay Mahadevan   PetscErrorCode ierr;
1261fc418013SVijay Mahadevan   moab::ErrorCode merr;
1262fc418013SVijay Mahadevan 
1263fc418013SVijay Mahadevan   PetscFunctionBegin;
1264fc418013SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1265fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1266fc418013SVijay Mahadevan 
1267fc418013SVijay Mahadevan   PetscBarrier((PetscObject)dm);
1268fc418013SVijay Mahadevan 
1269fc418013SVijay Mahadevan   /* TODO: Use command-line options to control by_rank, verbosity, MoabReadMode and extra options */
1270fc418013SVijay Mahadevan   ierr  = PetscOptionsBegin(PETSC_COMM_WORLD, "", "Options for reading/writing MOAB based meshes from file", "DMMoab");
1271fc418013SVijay Mahadevan   ierr  = PetscOptionsInt("-dmmb_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "dmmbutil.cxx", dbglevel, &dbglevel, NULL);CHKERRQ(ierr);
1272fc418013SVijay Mahadevan   ierr  = PetscOptionsEnd();
1273fc418013SVijay Mahadevan 
1274fc418013SVijay Mahadevan   /* add mesh loading options specific to the DM */
1275fc418013SVijay Mahadevan   ierr = DMMoab_GetWriteOptions_Private(dmmoab->pcomm->get_id(), dmmoab->pcomm->size(), dmmoab->dim, MOAB_PARWOPTS_WRITE_PART, dbglevel, usrwriteopts, &writeopts);CHKERRQ(ierr);
1276fc418013SVijay Mahadevan   PetscInfo2(dm, "Writing file %s with options: %s\n",filename,writeopts);
1277fc418013SVijay Mahadevan 
1278fc418013SVijay Mahadevan   /* output file, using parallel write */
1279fc418013SVijay Mahadevan   merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr);
1280fc418013SVijay Mahadevan   PetscFunctionReturn(0);
1281fc418013SVijay Mahadevan }
1282fc418013SVijay Mahadevan 
1283