xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 212ad6d17b0bfab76c1ec753e42eda578400f603)
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;
14*212ad6d1SVijay Mahadevan   PetscSection   section;
15853cdec3SJed Brown 
16853cdec3SJed Brown   PetscFunctionBegin;
17853cdec3SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
18*212ad6d1SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
19*212ad6d1SVijay 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;
226032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
227032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
228032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
229032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
230032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
231032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
232032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
233032b8ab6SVijay Mahadevan 
234032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
235032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
236032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
237032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
238032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
239aa768e4cSTim Tautges 
24097ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
24197ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
242032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
243032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
24497ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
245032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
246032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
247032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
248032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
249aa768e4cSTim Tautges   PetscFunctionReturn(0);
250aa768e4cSTim Tautges }
251fd349b41STim Tautges 
252fd349b41STim Tautges #undef __FUNCT__
2531d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
2541d72bce8STim Tautges /*@
2551d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
2561d72bce8STim Tautges 
2571d72bce8STim Tautges   Collective on MPI_Comm
2581d72bce8STim Tautges 
2591d72bce8STim Tautges   Input Parameter:
2601d72bce8STim Tautges . comm - The communicator for the DMMoab object
2611d72bce8STim Tautges 
2621d72bce8STim Tautges   Output Parameter:
263032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2641d72bce8STim Tautges 
2651d72bce8STim Tautges   Level: beginner
2661d72bce8STim Tautges 
2671d72bce8STim Tautges .keywords: DMMoab, create
2681d72bce8STim Tautges @*/
269032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
2701d72bce8STim Tautges {
2711d72bce8STim Tautges   PetscErrorCode ierr;
2721d72bce8STim Tautges 
2731d72bce8STim Tautges   PetscFunctionBegin;
274032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
275032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
276032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
2771d72bce8STim Tautges   PetscFunctionReturn(0);
2781d72bce8STim Tautges }
2791d72bce8STim Tautges 
2801d72bce8STim Tautges #undef __FUNCT__
281aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
2821d72bce8STim Tautges /*@
283a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
2841d72bce8STim Tautges 
2851d72bce8STim Tautges   Collective on MPI_Comm
2861d72bce8STim Tautges 
2871d72bce8STim Tautges   Input Parameter:
2881d72bce8STim Tautges . comm - The communicator for the DMMoab object
289032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
290a4d2169cSTim Tautges          along with the DMMoab
291a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
2921d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
2931d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
2941d72bce8STim Tautges 
2951d72bce8STim Tautges   Output Parameter:
296032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2971d72bce8STim Tautges 
298032b8ab6SVijay Mahadevan   Level: intermediate
2991d72bce8STim Tautges 
3001d72bce8STim Tautges .keywords: DMMoab, create
3011d72bce8STim Tautges @*/
302032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
3031d72bce8STim Tautges {
3041d72bce8STim Tautges   PetscErrorCode ierr;
305032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
3061cec0304SVijay Mahadevan   moab::EntityHandle partnset;
3071cec0304SVijay Mahadevan   PetscInt rank, nprocs;
308853cdec3SJed Brown   DM_Moab        *dmmoab;
3091d72bce8STim Tautges 
3101d72bce8STim Tautges   PetscFunctionBegin;
311032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
312032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
313032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
314a4d2169cSTim Tautges 
315a4d2169cSTim Tautges   if (!mbiface) {
31672ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
3177d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
3181d72bce8STim Tautges   }
3191cec0304SVijay Mahadevan   else {
3201cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
3217d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
3221cec0304SVijay Mahadevan   }
3231cec0304SVijay Mahadevan 
3241cec0304SVijay Mahadevan   /* create a fileset to store the hierarchy of entities belonging to current DM */
3251cec0304SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr);
3267d89fc02STim Tautges 
327a4d2169cSTim Tautges   if (!pcomm) {
328032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
329032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
330032b8ab6SVijay Mahadevan 
331db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
332db66d124SVijay Mahadevan        to the load_file functions to be populated. */
33372ff976dSVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
334032b8ab6SVijay Mahadevan     MBERR("Creating partition set failed", merr);
335032b8ab6SVijay Mahadevan 
336db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
33772ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
33872ff976dSVijay Mahadevan   }
33972ff976dSVijay Mahadevan   else {
34072ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
341032b8ab6SVijay Mahadevan   }
342032b8ab6SVijay Mahadevan 
3434973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
3444973de03SVijay Mahadevan   dmmoab->bs       = 1;
3454973de03SVijay Mahadevan 
3464973de03SVijay Mahadevan   /* set global ID tag handle */
347032b8ab6SVijay Mahadevan   if (!ltog_tag) {
3484973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
349032b8ab6SVijay Mahadevan   }
350032b8ab6SVijay Mahadevan   else {
351032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
352a4d2169cSTim Tautges   }
353a4d2169cSTim Tautges 
3544973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
355a4d2169cSTim Tautges   if (range) {
3565eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
357a4d2169cSTim Tautges   }
3581d72bce8STim Tautges   PetscFunctionReturn(0);
3591d72bce8STim Tautges }
3601d72bce8STim Tautges 
3611d72bce8STim Tautges #undef __FUNCT__
3621d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
363aa768e4cSTim Tautges /*@
364aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
365aa768e4cSTim Tautges 
366aa768e4cSTim Tautges   Collective on MPI_Comm
367aa768e4cSTim Tautges 
368aa768e4cSTim Tautges   Input Parameter:
369aa768e4cSTim Tautges . dm    - The DMMoab object being set
370aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
371aa768e4cSTim Tautges 
372aa768e4cSTim Tautges   Level: beginner
373aa768e4cSTim Tautges 
374aa768e4cSTim Tautges .keywords: DMMoab, create
375aa768e4cSTim Tautges @*/
3761d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
3771d72bce8STim Tautges {
378032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
379032b8ab6SVijay Mahadevan 
3801d72bce8STim Tautges   PetscFunctionBegin;
3811d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3821cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
383032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
384032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
385032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
3861d72bce8STim Tautges   PetscFunctionReturn(0);
3871d72bce8STim Tautges }
3881d72bce8STim Tautges 
3891d72bce8STim Tautges 
3901d72bce8STim Tautges #undef __FUNCT__
3911d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
392aa768e4cSTim Tautges /*@
393aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
394aa768e4cSTim Tautges 
395aa768e4cSTim Tautges   Collective on MPI_Comm
396aa768e4cSTim Tautges 
397aa768e4cSTim Tautges   Input Parameter:
398aa768e4cSTim Tautges . dm    - The DMMoab object being set
399aa768e4cSTim Tautges 
400aa768e4cSTim Tautges   Output Parameter:
401aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
402aa768e4cSTim Tautges 
403aa768e4cSTim Tautges   Level: beginner
404aa768e4cSTim Tautges 
405aa768e4cSTim Tautges .keywords: DMMoab, create
406aa768e4cSTim Tautges @*/
4071d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
4081d72bce8STim Tautges {
4091d72bce8STim Tautges   PetscFunctionBegin;
4101d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
411032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
4121d72bce8STim Tautges   PetscFunctionReturn(0);
4131d72bce8STim Tautges }
4141d72bce8STim Tautges 
4151d72bce8STim Tautges 
4161d72bce8STim Tautges #undef __FUNCT__
4171d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
418aa768e4cSTim Tautges /*@
419aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
420aa768e4cSTim Tautges 
421aa768e4cSTim Tautges   Collective on MPI_Comm
422aa768e4cSTim Tautges 
423aa768e4cSTim Tautges   Input Parameter:
424aa768e4cSTim Tautges . dm      - The DMMoab object being set
425aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
426aa768e4cSTim Tautges 
427aa768e4cSTim Tautges   Level: beginner
428aa768e4cSTim Tautges 
429aa768e4cSTim Tautges .keywords: DMMoab, create
430aa768e4cSTim Tautges @*/
431a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
4321d72bce8STim Tautges {
433032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
434032b8ab6SVijay Mahadevan 
4351d72bce8STim Tautges   PetscFunctionBegin;
4361d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4371cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
438032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
439032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
440032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4411d72bce8STim Tautges   PetscFunctionReturn(0);
4421d72bce8STim Tautges }
4431d72bce8STim Tautges 
4441d72bce8STim Tautges 
4451d72bce8STim Tautges #undef __FUNCT__
4461d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
447aa768e4cSTim Tautges /*@
448aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
449aa768e4cSTim Tautges 
450aa768e4cSTim Tautges   Collective on MPI_Comm
451aa768e4cSTim Tautges 
452aa768e4cSTim Tautges   Input Parameter:
453aa768e4cSTim Tautges . dm      - The DMMoab object being set
454aa768e4cSTim Tautges 
455aa768e4cSTim Tautges   Output Parameter:
456aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
457aa768e4cSTim Tautges 
458aa768e4cSTim Tautges   Level: beginner
459aa768e4cSTim Tautges 
460aa768e4cSTim Tautges .keywords: DMMoab, create
461aa768e4cSTim Tautges @*/
462a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
4631d72bce8STim Tautges {
4649426e041SSatish Balay   PetscErrorCode   ierr;
465cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
466cabb514dSBarry Smith 
4671d72bce8STim Tautges   PetscFunctionBegin;
4681d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
469cabb514dSBarry 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);
470a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
4711d72bce8STim Tautges   PetscFunctionReturn(0);
4721d72bce8STim Tautges }
4731d72bce8STim Tautges 
4741d72bce8STim Tautges 
4751d72bce8STim Tautges #undef __FUNCT__
4765eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
477aa768e4cSTim Tautges /*@
4785eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
479aa768e4cSTim Tautges 
480aa768e4cSTim Tautges   Collective on MPI_Comm
481aa768e4cSTim Tautges 
482aa768e4cSTim Tautges   Input Parameter:
483aa768e4cSTim Tautges . dm    - The DMMoab object being set
484aa768e4cSTim Tautges . range - The entities treated by this DMMoab
485aa768e4cSTim Tautges 
486aa768e4cSTim Tautges   Level: beginner
487aa768e4cSTim Tautges 
488aa768e4cSTim Tautges .keywords: DMMoab, create
489aa768e4cSTim Tautges @*/
4905eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
4911d72bce8STim Tautges {
492032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
493032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
494032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
495032b8ab6SVijay Mahadevan 
4961d72bce8STim Tautges   PetscFunctionBegin;
4971d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
498032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
499032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
500032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
501032b8ab6SVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
502032b8ab6SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
503032b8ab6SVijay Mahadevan   *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned);
504032b8ab6SVijay Mahadevan   dmmoab->nloc=dmmoab->vowned->size();
505032b8ab6SVijay Mahadevan   dmmoab->nghost=dmmoab->vghost->size();
506032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5071d72bce8STim Tautges   PetscFunctionReturn(0);
5081d72bce8STim Tautges }
5091d72bce8STim Tautges 
5101d72bce8STim Tautges 
5111d72bce8STim Tautges #undef __FUNCT__
5125eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
513aa768e4cSTim Tautges /*@
5145eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
515aa768e4cSTim Tautges 
516aa768e4cSTim Tautges   Collective on MPI_Comm
517aa768e4cSTim Tautges 
518aa768e4cSTim Tautges   Input Parameter:
519aa768e4cSTim Tautges . dm    - The DMMoab object being set
520aa768e4cSTim Tautges 
521aa768e4cSTim Tautges   Output Parameter:
5225eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
5235eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
524aa768e4cSTim Tautges 
525aa768e4cSTim Tautges   Level: beginner
526aa768e4cSTim Tautges 
527aa768e4cSTim Tautges .keywords: DMMoab, create
528aa768e4cSTim Tautges @*/
5291cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
5301d72bce8STim Tautges {
5311d72bce8STim Tautges   PetscFunctionBegin;
5321d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5331cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
5341cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
5351d72bce8STim Tautges   PetscFunctionReturn(0);
5361d72bce8STim Tautges }
5371d72bce8STim Tautges 
5381d72bce8STim Tautges #undef __FUNCT__
5395eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
5405eb88e9dSVijay Mahadevan /*@
5415eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
5425eb88e9dSVijay Mahadevan 
5435eb88e9dSVijay Mahadevan   Collective on MPI_Comm
5445eb88e9dSVijay Mahadevan 
5455eb88e9dSVijay Mahadevan   Input Parameter:
5465eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
5475eb88e9dSVijay Mahadevan 
5485eb88e9dSVijay Mahadevan   Output Parameter:
5495eb88e9dSVijay Mahadevan . range - The entities owned locally
5505eb88e9dSVijay Mahadevan 
5515eb88e9dSVijay Mahadevan   Level: beginner
5525eb88e9dSVijay Mahadevan 
5535eb88e9dSVijay Mahadevan .keywords: DMMoab, create
5545eb88e9dSVijay Mahadevan @*/
5551cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
5565eb88e9dSVijay Mahadevan {
5575eb88e9dSVijay Mahadevan   PetscFunctionBegin;
5585eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5591cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
5601cec0304SVijay Mahadevan   PetscFunctionReturn(0);
5611cec0304SVijay Mahadevan }
5621cec0304SVijay Mahadevan 
5631cec0304SVijay Mahadevan 
5641cec0304SVijay Mahadevan #undef __FUNCT__
5651cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
5661cec0304SVijay Mahadevan /*@
5671cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
5681cec0304SVijay Mahadevan 
5691cec0304SVijay Mahadevan   Collective on MPI_Comm
5701cec0304SVijay Mahadevan 
5711cec0304SVijay Mahadevan   Input Parameter:
5721cec0304SVijay Mahadevan . dm    - The DMMoab object being set
5731cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
5741cec0304SVijay Mahadevan 
5751cec0304SVijay Mahadevan   Level: beginner
5761cec0304SVijay Mahadevan 
5771cec0304SVijay Mahadevan .keywords: DMMoab, create
5781cec0304SVijay Mahadevan @*/
5791cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
5801cec0304SVijay Mahadevan {
5811cec0304SVijay Mahadevan   moab::ErrorCode merr;
5821cec0304SVijay Mahadevan   PetscErrorCode  ierr;
5831cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
5841cec0304SVijay Mahadevan 
5851cec0304SVijay Mahadevan   PetscFunctionBegin;
5861cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5871cec0304SVijay Mahadevan   dmmoab->elocal->clear();
5881cec0304SVijay Mahadevan   dmmoab->eghost->clear();
5891cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
5901cec0304SVijay Mahadevan   PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size());
5911cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
5921cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
5931cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
5941cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5951cec0304SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele);
5965eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
5975eb88e9dSVijay Mahadevan }
5985eb88e9dSVijay Mahadevan 
5995eb88e9dSVijay Mahadevan 
6005eb88e9dSVijay Mahadevan #undef __FUNCT__
6011d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
602aa768e4cSTim Tautges /*@
603aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
604aa768e4cSTim Tautges 
605aa768e4cSTim Tautges   Collective on MPI_Comm
606aa768e4cSTim Tautges 
607aa768e4cSTim Tautges   Input Parameter:
608aa768e4cSTim Tautges . dm      - The DMMoab object being set
609aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
610aa768e4cSTim Tautges 
611aa768e4cSTim Tautges   Level: beginner
612aa768e4cSTim Tautges 
613aa768e4cSTim Tautges .keywords: DMMoab, create
614aa768e4cSTim Tautges @*/
6151d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
6161d72bce8STim Tautges {
6171d72bce8STim Tautges   PetscFunctionBegin;
6181d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6191d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
6201d72bce8STim Tautges   PetscFunctionReturn(0);
6211d72bce8STim Tautges }
6221d72bce8STim Tautges 
6231d72bce8STim Tautges 
6241d72bce8STim Tautges #undef __FUNCT__
6251d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
626aa768e4cSTim Tautges /*@
627aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
628aa768e4cSTim Tautges 
629aa768e4cSTim Tautges   Collective on MPI_Comm
630aa768e4cSTim Tautges 
631aa768e4cSTim Tautges   Input Parameter:
632aa768e4cSTim Tautges . dm      - The DMMoab object being set
633aa768e4cSTim Tautges 
634aa768e4cSTim Tautges   Output Parameter:
635aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
636aa768e4cSTim Tautges 
637aa768e4cSTim Tautges   Level: beginner
638aa768e4cSTim Tautges 
639aa768e4cSTim Tautges .keywords: DMMoab, create
640aa768e4cSTim Tautges @*/
6411d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
6421d72bce8STim Tautges {
6431d72bce8STim Tautges   PetscFunctionBegin;
6441d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6451d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
6461d72bce8STim Tautges   PetscFunctionReturn(0);
6471d72bce8STim Tautges }
6481d72bce8STim Tautges 
6491d72bce8STim Tautges 
6501d72bce8STim Tautges #undef __FUNCT__
6511d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
652aa768e4cSTim Tautges /*@
653aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
654aa768e4cSTim Tautges 
655aa768e4cSTim Tautges   Collective on MPI_Comm
656aa768e4cSTim Tautges 
657aa768e4cSTim Tautges   Input Parameter:
658aa768e4cSTim Tautges . dm - The DMMoab object being set
659aa768e4cSTim Tautges . bs - The block size used with this DMMoab
660aa768e4cSTim Tautges 
661aa768e4cSTim Tautges   Level: beginner
662aa768e4cSTim Tautges 
663aa768e4cSTim Tautges .keywords: DMMoab, create
664aa768e4cSTim Tautges @*/
6651d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
6661d72bce8STim Tautges {
6671d72bce8STim Tautges   PetscFunctionBegin;
6681d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6691d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
6701d72bce8STim Tautges   PetscFunctionReturn(0);
6711d72bce8STim Tautges }
6721d72bce8STim Tautges 
6731d72bce8STim Tautges 
6741d72bce8STim Tautges #undef __FUNCT__
6751d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
676aa768e4cSTim Tautges /*@
677aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
678aa768e4cSTim Tautges 
679aa768e4cSTim Tautges   Collective on MPI_Comm
680aa768e4cSTim Tautges 
681aa768e4cSTim Tautges   Input Parameter:
682aa768e4cSTim Tautges . dm - The DMMoab object being set
683aa768e4cSTim Tautges 
684aa768e4cSTim Tautges   Output Parameter:
685aa768e4cSTim Tautges . bs - The block size used with this DMMoab
686aa768e4cSTim Tautges 
687aa768e4cSTim Tautges   Level: beginner
688aa768e4cSTim Tautges 
689aa768e4cSTim Tautges .keywords: DMMoab, create
690aa768e4cSTim Tautges @*/
6911d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
6921d72bce8STim Tautges {
6931d72bce8STim Tautges   PetscFunctionBegin;
6941d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6951d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
6961d72bce8STim Tautges   PetscFunctionReturn(0);
6971d72bce8STim Tautges }
6981d72bce8STim Tautges 
6991cec0304SVijay Mahadevan 
7001cec0304SVijay Mahadevan #undef __FUNCT__
701*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
702*212ad6d1SVijay Mahadevan /*@
703*212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
704*212ad6d1SVijay Mahadevan 
705*212ad6d1SVijay Mahadevan   Collective on MPI_Comm
706*212ad6d1SVijay Mahadevan 
707*212ad6d1SVijay Mahadevan   Input Parameter:
708*212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
709*212ad6d1SVijay Mahadevan 
710*212ad6d1SVijay Mahadevan   Output Parameter:
711*212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance
712*212ad6d1SVijay Mahadevan 
713*212ad6d1SVijay Mahadevan   Level: beginner
714*212ad6d1SVijay Mahadevan 
715*212ad6d1SVijay Mahadevan .keywords: DMMoab, create
716*212ad6d1SVijay Mahadevan @*/
717*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *ng)
718*212ad6d1SVijay Mahadevan {
719*212ad6d1SVijay Mahadevan   PetscFunctionBegin;
720*212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
721*212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->n;
722*212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
723*212ad6d1SVijay Mahadevan }
724*212ad6d1SVijay Mahadevan 
725*212ad6d1SVijay Mahadevan 
726*212ad6d1SVijay Mahadevan #undef __FUNCT__
727*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
728*212ad6d1SVijay Mahadevan /*@
729*212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
730*212ad6d1SVijay Mahadevan 
731*212ad6d1SVijay Mahadevan   Collective on MPI_Comm
732*212ad6d1SVijay Mahadevan 
733*212ad6d1SVijay Mahadevan   Input Parameter:
734*212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
735*212ad6d1SVijay Mahadevan 
736*212ad6d1SVijay Mahadevan   Output Parameter:
737*212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance
738*212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance
739*212ad6d1SVijay Mahadevan 
740*212ad6d1SVijay Mahadevan   Level: beginner
741*212ad6d1SVijay Mahadevan 
742*212ad6d1SVijay Mahadevan .keywords: DMMoab, create
743*212ad6d1SVijay Mahadevan @*/
744*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nl,PetscInt *ng)
745*212ad6d1SVijay Mahadevan {
746*212ad6d1SVijay Mahadevan   PetscFunctionBegin;
747*212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
748*212ad6d1SVijay Mahadevan   if(nl) *nl = ((DM_Moab*)dm->data)->nloc;
749*212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->nghost;
750*212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
751*212ad6d1SVijay Mahadevan }
752*212ad6d1SVijay Mahadevan 
753*212ad6d1SVijay Mahadevan 
754*212ad6d1SVijay Mahadevan #undef __FUNCT__
7551cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector"
7561cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
7571cec0304SVijay Mahadevan {
7581cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
7591cec0304SVijay Mahadevan   moab::Tag     vtag,ntag;
760*212ad6d1SVijay Mahadevan   const PetscScalar *varray;
761*212ad6d1SVijay Mahadevan   PetscScalar *farray;
7621cec0304SVijay Mahadevan   moab::ErrorCode merr;
7631cec0304SVijay Mahadevan   PetscErrorCode  ierr;
7641cec0304SVijay Mahadevan   PetscInt doff;
7651cec0304SVijay Mahadevan   std::string tag_name;
7661cec0304SVijay Mahadevan   moab::Range::iterator iter;
7671cec0304SVijay Mahadevan 
7681cec0304SVijay Mahadevan   PetscFunctionBegin;
7691cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7701cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7711cec0304SVijay Mahadevan 
7721cec0304SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
7731cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
7741cec0304SVijay Mahadevan                                           moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
7751cec0304SVijay Mahadevan 
7761cec0304SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
7771cec0304SVijay Mahadevan 
7781cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
7791cec0304SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
780*212ad6d1SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
781*212ad6d1SVijay Mahadevan 
7821cec0304SVijay Mahadevan     for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
7831cec0304SVijay Mahadevan       moab::EntityHandle vtx = (*iter);
7841cec0304SVijay Mahadevan 
7851cec0304SVijay Mahadevan       /* get field dof index */
786*212ad6d1SVijay Mahadevan       ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff);
7871cec0304SVijay Mahadevan 
7881cec0304SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
7891cec0304SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr);
7901cec0304SVijay Mahadevan     }
791*212ad6d1SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
7921cec0304SVijay Mahadevan   }
7931cec0304SVijay Mahadevan   else {
794*212ad6d1SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr);
7951cec0304SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
796*212ad6d1SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr);
797*212ad6d1SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
7981cec0304SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
7991cec0304SVijay Mahadevan     merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
800*212ad6d1SVijay Mahadevan     ierr = PetscFree(farray);CHKERRQ(ierr);
801*212ad6d1SVijay Mahadevan   }
802*212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
803*212ad6d1SVijay Mahadevan }
804*212ad6d1SVijay Mahadevan 
805*212ad6d1SVijay Mahadevan 
806*212ad6d1SVijay Mahadevan #undef __FUNCT__
807*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector"
808*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
809*212ad6d1SVijay Mahadevan {
810*212ad6d1SVijay Mahadevan   DM_Moab        *dmmoab;
811*212ad6d1SVijay Mahadevan   moab::Tag     vtag,ntag;
812*212ad6d1SVijay Mahadevan   const PetscScalar   *varray;
813*212ad6d1SVijay Mahadevan   PetscScalar   *farray;
814*212ad6d1SVijay Mahadevan   moab::ErrorCode merr;
815*212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
816*212ad6d1SVijay Mahadevan   PetscSection section;
817*212ad6d1SVijay Mahadevan   PetscInt i,doff,ifield;
818*212ad6d1SVijay Mahadevan   std::string tag_name;
819*212ad6d1SVijay Mahadevan   moab::Range::iterator iter;
820*212ad6d1SVijay Mahadevan 
821*212ad6d1SVijay Mahadevan   PetscFunctionBegin;
822*212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
823*212ad6d1SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
824*212ad6d1SVijay Mahadevan 
825*212ad6d1SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
826*212ad6d1SVijay Mahadevan 
827*212ad6d1SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
828*212ad6d1SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
829*212ad6d1SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
830*212ad6d1SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
831*212ad6d1SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
832*212ad6d1SVijay Mahadevan 
833*212ad6d1SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
834*212ad6d1SVijay Mahadevan     for (ifield=0; ifield<dmmoab->nfields; ++ifield) {
835*212ad6d1SVijay Mahadevan 
836*212ad6d1SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
837*212ad6d1SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
838*212ad6d1SVijay Mahadevan                                             moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
839*212ad6d1SVijay Mahadevan 
840*212ad6d1SVijay Mahadevan       for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
841*212ad6d1SVijay Mahadevan         moab::EntityHandle vtx = (*iter);
842*212ad6d1SVijay Mahadevan 
843*212ad6d1SVijay Mahadevan         /* get field dof index */
844*212ad6d1SVijay Mahadevan         ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff);
845*212ad6d1SVijay Mahadevan 
846*212ad6d1SVijay Mahadevan         /* use the entity handle and the Dof index to set the right value */
847*212ad6d1SVijay Mahadevan         merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr);
848*212ad6d1SVijay Mahadevan       }
849*212ad6d1SVijay Mahadevan     }
850*212ad6d1SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
851*212ad6d1SVijay Mahadevan   }
852*212ad6d1SVijay Mahadevan   else {
853*212ad6d1SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr);
854*212ad6d1SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*dmmoab->bs*sizeof(PetscScalar),&varray);CHKERRQ(ierr);
855*212ad6d1SVijay Mahadevan 
856*212ad6d1SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
857*212ad6d1SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
858*212ad6d1SVijay Mahadevan     for (ifield=0; ifield<dmmoab->nfields; ++ifield) {
859*212ad6d1SVijay Mahadevan 
860*212ad6d1SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
861*212ad6d1SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
862*212ad6d1SVijay Mahadevan                                             moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
863*212ad6d1SVijay Mahadevan 
864*212ad6d1SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
865*212ad6d1SVijay Mahadevan       for(i=0; i < dmmoab->nloc; i++) {
866*212ad6d1SVijay Mahadevan         farray[i] = varray[i*dmmoab->bs+ifield];
867*212ad6d1SVijay Mahadevan       }
868*212ad6d1SVijay Mahadevan 
869*212ad6d1SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
870*212ad6d1SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
871*212ad6d1SVijay Mahadevan       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
872*212ad6d1SVijay Mahadevan     }
873*212ad6d1SVijay Mahadevan     ierr = PetscFree(farray);CHKERRQ(ierr);
8741cec0304SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
8751cec0304SVijay Mahadevan   }
8761cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8771cec0304SVijay Mahadevan }
8781cec0304SVijay Mahadevan 
8791cec0304SVijay Mahadevan 
880*212ad6d1SVijay Mahadevan 
8811cec0304SVijay Mahadevan #undef __FUNCT__
8827023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
8837023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
8847023aa44SVijay Mahadevan {
8857023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
8867023aa44SVijay Mahadevan   PetscErrorCode  ierr;
8877023aa44SVijay Mahadevan   moab::ErrorCode merr;
8887023aa44SVijay Mahadevan 
8897023aa44SVijay Mahadevan   PetscFunctionBegin;
8907023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8917023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
8927023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8937023aa44SVijay Mahadevan 
8947023aa44SVijay Mahadevan   if (!vpos) {
8957023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
8967023aa44SVijay Mahadevan   }
8977023aa44SVijay Mahadevan 
8987023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
8997023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
9007023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9017023aa44SVijay Mahadevan }
9027023aa44SVijay Mahadevan 
9037023aa44SVijay Mahadevan 
9047023aa44SVijay Mahadevan #undef __FUNCT__
9057023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
9067023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
9077023aa44SVijay Mahadevan {
9087023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9097023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
9107023aa44SVijay Mahadevan   moab::ErrorCode merr;
9117023aa44SVijay Mahadevan   PetscInt nnodes;
9127023aa44SVijay Mahadevan 
9137023aa44SVijay Mahadevan   PetscFunctionBegin;
9147023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9157023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
9167023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9177023aa44SVijay Mahadevan 
9187023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9197023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
9207023aa44SVijay Mahadevan   if (conn) *conn=connect;
9217023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
9227023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9237023aa44SVijay Mahadevan }
9247023aa44SVijay Mahadevan 
9257023aa44SVijay Mahadevan 
9267023aa44SVijay Mahadevan #undef __FUNCT__
92769263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
92869263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
92969263071SVijay Mahadevan {
93069263071SVijay Mahadevan   moab::EntityType etype;
93169263071SVijay Mahadevan   DM_Moab         *dmmoab;
93269263071SVijay Mahadevan   PetscInt         edim;
93369263071SVijay Mahadevan 
93469263071SVijay Mahadevan   PetscFunctionBegin;
93569263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
93669263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
93769263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
93869263071SVijay Mahadevan 
93969263071SVijay Mahadevan   /* get the entity type and handle accordingly */
94069263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
94169263071SVijay 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);
94269263071SVijay Mahadevan 
94369263071SVijay Mahadevan   /* get the entity dimension */
94469263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
94569263071SVijay Mahadevan 
94669263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
94769263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
94869263071SVijay Mahadevan     moab::Range::const_iterator giter = dmmoab->bndyvtx->find(ent);
94969263071SVijay Mahadevan     if (giter != dmmoab->bndyvtx->end()) *ent_on_boundary=PETSC_TRUE;
95069263071SVijay Mahadevan   }
95169263071SVijay Mahadevan   else {
95269263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
95369263071SVijay Mahadevan       moab::Range::const_iterator geiter = dmmoab->bndyelems->find(ent);
95469263071SVijay Mahadevan       if (geiter != dmmoab->bndyelems->end()) *ent_on_boundary=PETSC_TRUE;
95569263071SVijay Mahadevan     }
95669263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
95769263071SVijay Mahadevan       moab::Range::const_iterator gfiter = dmmoab->bndyfaces->find(ent);
95869263071SVijay Mahadevan       if (gfiter != dmmoab->bndyfaces->end()) *ent_on_boundary=PETSC_TRUE;
95969263071SVijay Mahadevan     }
96069263071SVijay Mahadevan   }
96169263071SVijay Mahadevan   PetscFunctionReturn(0);
96269263071SVijay Mahadevan }
96369263071SVijay Mahadevan 
96469263071SVijay Mahadevan 
96569263071SVijay Mahadevan #undef __FUNCT__
9667023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
96769263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
9687023aa44SVijay Mahadevan {
9697023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
9707023aa44SVijay Mahadevan   PetscInt       i;
9717023aa44SVijay Mahadevan 
9727023aa44SVijay Mahadevan   PetscFunctionBegin;
9737023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9747023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
9757023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
9767023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9777023aa44SVijay Mahadevan 
9787023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
9797023aa44SVijay Mahadevan     moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]);
98069263071SVijay Mahadevan     if (giter != dmmoab->bndyvtx->end()) isbdvtx[i] = PETSC_TRUE;
9817023aa44SVijay Mahadevan     else isbdvtx[i] = PETSC_FALSE;
9827023aa44SVijay Mahadevan   }
9837023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9847023aa44SVijay Mahadevan }
9857023aa44SVijay Mahadevan 
9867023aa44SVijay Mahadevan 
9877023aa44SVijay Mahadevan #undef __FUNCT__
9881cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities"
98969263071SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces,moab::Range* bdelems)
9901cec0304SVijay Mahadevan {
9911cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
9921cec0304SVijay Mahadevan 
9931cec0304SVijay Mahadevan   PetscFunctionBegin;
9941cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9951cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9961cec0304SVijay Mahadevan 
9971cec0304SVijay Mahadevan   if (bdvtx)  *bdvtx = *dmmoab->bndyvtx;
9981cec0304SVijay Mahadevan   if (bdfaces)  *bdfaces = *dmmoab->bndyfaces;
99969263071SVijay Mahadevan   if (bdelems)  *bdfaces = *dmmoab->bndyelems;
10001cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10011cec0304SVijay Mahadevan }
10021cec0304SVijay Mahadevan 
10031cec0304SVijay Mahadevan 
10041cec0304SVijay Mahadevan #undef __FUNCT__
10051cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields"
10061cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields)
10071cec0304SVijay Mahadevan {
10081cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
10091cec0304SVijay Mahadevan 
10101cec0304SVijay Mahadevan   PetscFunctionBegin;
10111cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
10121cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
10131cec0304SVijay Mahadevan 
10141cec0304SVijay Mahadevan   dmmoab->fields = fields;
10151cec0304SVijay Mahadevan   dmmoab->nfields = nfields;
10161cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10171cec0304SVijay Mahadevan }
10181cec0304SVijay Mahadevan 
10191cec0304SVijay Mahadevan 
10201cec0304SVijay Mahadevan #undef __FUNCT__
10211cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
10221cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
10231cec0304SVijay Mahadevan {
10241cec0304SVijay Mahadevan   PetscSection section;
1025fc418013SVijay Mahadevan   PetscInt gid;
10261cec0304SVijay Mahadevan   PetscErrorCode ierr;
1027fc418013SVijay Mahadevan   moab::ErrorCode merr;
1028fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
10291cec0304SVijay Mahadevan 
10301cec0304SVijay Mahadevan   PetscFunctionBegin;
10311cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1032fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1033fc418013SVijay Mahadevan 
10341cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
1035fc418013SVijay Mahadevan 
1036fc418013SVijay Mahadevan   /* first get the global ID for the point */
1037fc418013SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&point,1,&gid);MBERRNM(merr);
1038fc418013SVijay Mahadevan 
1039fc418013SVijay Mahadevan   /* get the dof value for the field */
1040fc418013SVijay Mahadevan   ierr = PetscSectionGetFieldDof(section, gid, field, dof);CHKERRQ(ierr);
10411cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10421cec0304SVijay Mahadevan }
10431cec0304SVijay Mahadevan 
10441cec0304SVijay Mahadevan 
10451cec0304SVijay Mahadevan #undef __FUNCT__
10461cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
10471cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
10481cec0304SVijay Mahadevan {
1049fc418013SVijay Mahadevan   PetscInt i,gid;
10501cec0304SVijay Mahadevan   PetscSection section;
10511cec0304SVijay Mahadevan   PetscErrorCode  ierr;
1052fc418013SVijay Mahadevan   moab::ErrorCode merr;
1053fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
10541cec0304SVijay Mahadevan 
10551cec0304SVijay Mahadevan   PetscFunctionBegin;
10561cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1057fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1058fc418013SVijay Mahadevan 
10591cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
10601cec0304SVijay Mahadevan   if (!dof) {
10611cec0304SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
10621cec0304SVijay Mahadevan   }
1063fc418013SVijay Mahadevan 
1064fc418013SVijay Mahadevan   /* first get the local indices */
1065fc418013SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr);
1066fc418013SVijay Mahadevan 
10671cec0304SVijay Mahadevan   for (i=0; i<npoints; ++i) {
1068fc418013SVijay Mahadevan     gid=dof[i];
1069fc418013SVijay Mahadevan     ierr = PetscSectionGetFieldDof(section, gid, field, &dof[i]);CHKERRQ(ierr);
10701cec0304SVijay Mahadevan   }
10711cec0304SVijay Mahadevan   PetscFunctionReturn(0);
10721cec0304SVijay Mahadevan }
10731cec0304SVijay Mahadevan 
10741cec0304SVijay Mahadevan 
1075fc418013SVijay Mahadevan #undef __FUNCT__
1076*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal"
1077*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
1078eb9d2429SVijay Mahadevan {
1079eb9d2429SVijay Mahadevan   PetscInt i,offset;
1080eb9d2429SVijay Mahadevan   PetscErrorCode  ierr;
1081eb9d2429SVijay Mahadevan   DM_Moab        *dmmoab;
1082eb9d2429SVijay Mahadevan 
1083eb9d2429SVijay Mahadevan   PetscFunctionBegin;
1084eb9d2429SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1085eb9d2429SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1086eb9d2429SVijay Mahadevan 
1087eb9d2429SVijay Mahadevan   if (!dof) {
1088eb9d2429SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
1089eb9d2429SVijay Mahadevan   }
1090eb9d2429SVijay Mahadevan 
1091eb9d2429SVijay Mahadevan   if (dmmoab->bs > 1) {
1092eb9d2429SVijay Mahadevan     for (i=0; i<npoints; ++i)
1093eb9d2429SVijay Mahadevan       dof[i] = (points[i]-1)*dmmoab->bs+field;
1094eb9d2429SVijay Mahadevan   }
1095eb9d2429SVijay Mahadevan   else {
1096eb9d2429SVijay Mahadevan     offset = field*dmmoab->n; /* assume all fields have equal distribution */
1097eb9d2429SVijay Mahadevan     for (i=0; i<npoints; ++i)
1098eb9d2429SVijay Mahadevan       dof[i] = offset+points[i]-1;
1099eb9d2429SVijay Mahadevan   }
1100eb9d2429SVijay Mahadevan   PetscFunctionReturn(0);
1101eb9d2429SVijay Mahadevan }
1102eb9d2429SVijay Mahadevan 
1103eb9d2429SVijay Mahadevan 
1104eb9d2429SVijay Mahadevan #undef __FUNCT__
1105*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs"
1106*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
1107*212ad6d1SVijay Mahadevan {
1108*212ad6d1SVijay Mahadevan   PetscInt i,f,gid;
1109*212ad6d1SVijay Mahadevan   PetscSection section;
1110*212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
1111*212ad6d1SVijay Mahadevan   moab::ErrorCode merr;
1112*212ad6d1SVijay Mahadevan   DM_Moab        *dmmoab;
1113*212ad6d1SVijay Mahadevan 
1114*212ad6d1SVijay Mahadevan   PetscFunctionBegin;
1115*212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1116*212ad6d1SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1117*212ad6d1SVijay Mahadevan 
1118*212ad6d1SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
1119*212ad6d1SVijay Mahadevan   if (!dof) {
1120*212ad6d1SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr);
1121*212ad6d1SVijay Mahadevan   }
1122*212ad6d1SVijay Mahadevan 
1123*212ad6d1SVijay Mahadevan   /* first get the local indices */
1124*212ad6d1SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr);
1125*212ad6d1SVijay Mahadevan 
1126*212ad6d1SVijay Mahadevan   for (i=0; i<npoints; ++i) {
1127*212ad6d1SVijay Mahadevan     gid=dof[i];
1128*212ad6d1SVijay Mahadevan     for (f=0; f<dmmoab->nfields; ++f) {
1129*212ad6d1SVijay Mahadevan       ierr = PetscSectionGetFieldDof(section, gid, f, &dof[i*dmmoab->nfields+f]);CHKERRQ(ierr);
1130*212ad6d1SVijay Mahadevan     }
1131*212ad6d1SVijay Mahadevan   }
1132*212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
1133*212ad6d1SVijay Mahadevan }
1134*212ad6d1SVijay Mahadevan 
1135*212ad6d1SVijay Mahadevan 
1136*212ad6d1SVijay Mahadevan #undef __FUNCT__
1137*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal"
1138*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
1139*212ad6d1SVijay Mahadevan {
1140*212ad6d1SVijay Mahadevan   PetscInt        i,f,offset;
1141*212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
1142*212ad6d1SVijay Mahadevan   DM_Moab        *dmmoab;
1143*212ad6d1SVijay Mahadevan 
1144*212ad6d1SVijay Mahadevan   PetscFunctionBegin;
1145*212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1146*212ad6d1SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1147*212ad6d1SVijay Mahadevan 
1148*212ad6d1SVijay Mahadevan   if (!dof) {
1149*212ad6d1SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr);
1150*212ad6d1SVijay Mahadevan   }
1151*212ad6d1SVijay Mahadevan 
1152*212ad6d1SVijay Mahadevan   if (dmmoab->bs > 1) {
1153*212ad6d1SVijay Mahadevan     for (f=0; f<dmmoab->nfields; ++f)
1154*212ad6d1SVijay Mahadevan       for (i=0; i<npoints; ++i)
1155*212ad6d1SVijay Mahadevan         dof[i*dmmoab->nfields+f] = (points[i]-1)*dmmoab->bs+f;
1156*212ad6d1SVijay Mahadevan   }
1157*212ad6d1SVijay Mahadevan   else {
1158*212ad6d1SVijay Mahadevan     for (f=0; f<dmmoab->nfields; ++f) {
1159*212ad6d1SVijay Mahadevan       offset = f*dmmoab->n;     /* assume all fields have equal distribution - say all vertex based */
1160*212ad6d1SVijay Mahadevan       for (i=0; i<npoints; ++i)
1161*212ad6d1SVijay Mahadevan         dof[i*dmmoab->nfields+f] = offset+points[i]-1;
1162*212ad6d1SVijay Mahadevan     }
1163*212ad6d1SVijay Mahadevan   }
1164*212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
1165*212ad6d1SVijay Mahadevan }
1166*212ad6d1SVijay Mahadevan 
1167*212ad6d1SVijay Mahadevan 
1168*212ad6d1SVijay Mahadevan #undef __FUNCT__
1169*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked"
1170*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
1171*212ad6d1SVijay Mahadevan {
1172*212ad6d1SVijay Mahadevan   PetscInt i,gid,dofindx;
1173*212ad6d1SVijay Mahadevan   PetscSection section;
1174*212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
1175*212ad6d1SVijay Mahadevan   moab::ErrorCode merr;
1176*212ad6d1SVijay Mahadevan   DM_Moab        *dmmoab;
1177*212ad6d1SVijay Mahadevan 
1178*212ad6d1SVijay Mahadevan   PetscFunctionBegin;
1179*212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1180*212ad6d1SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1181*212ad6d1SVijay Mahadevan 
1182*212ad6d1SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
1183*212ad6d1SVijay Mahadevan   if (!dof) {
1184*212ad6d1SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
1185*212ad6d1SVijay Mahadevan   }
1186*212ad6d1SVijay Mahadevan 
1187*212ad6d1SVijay Mahadevan   /* first get the local indices */
1188*212ad6d1SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr);
1189*212ad6d1SVijay Mahadevan 
1190*212ad6d1SVijay Mahadevan   for (i=0; i<npoints; ++i) {
1191*212ad6d1SVijay Mahadevan     gid=dof[i];
1192*212ad6d1SVijay Mahadevan     ierr = PetscSectionGetFieldDof(section, gid, 0, &dofindx);CHKERRQ(ierr);
1193*212ad6d1SVijay Mahadevan     if (dmmoab->bs > 1)  dof[i]=dofindx/dmmoab->bs;
1194*212ad6d1SVijay Mahadevan     else dof[i]=dofindx;
1195*212ad6d1SVijay Mahadevan //    PetscPrintf(PETSC_COMM_SELF, "I=%D, GID=%D, DOFINDX=%D, DOF=%D\n", i, gid, dofindx, dof[i]);
1196*212ad6d1SVijay Mahadevan   }
1197*212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
1198*212ad6d1SVijay Mahadevan }
1199*212ad6d1SVijay Mahadevan 
1200*212ad6d1SVijay Mahadevan 
1201*212ad6d1SVijay Mahadevan #undef __FUNCT__
1202*212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal"
1203*212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
1204*212ad6d1SVijay Mahadevan {
1205*212ad6d1SVijay Mahadevan   PetscInt        i;
1206*212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
1207*212ad6d1SVijay Mahadevan 
1208*212ad6d1SVijay Mahadevan   PetscFunctionBegin;
1209*212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1210*212ad6d1SVijay Mahadevan 
1211*212ad6d1SVijay Mahadevan   if (!dof) {
1212*212ad6d1SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
1213*212ad6d1SVijay Mahadevan   }
1214*212ad6d1SVijay Mahadevan 
1215*212ad6d1SVijay Mahadevan   for (i=0; i<npoints; ++i)
1216*212ad6d1SVijay Mahadevan     dof[i] = points[i]-1;
1217*212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
1218*212ad6d1SVijay Mahadevan }
1219*212ad6d1SVijay Mahadevan 
1220*212ad6d1SVijay Mahadevan #undef __FUNCT__
1221fc418013SVijay Mahadevan #define __FUNCT__ "DMMoab_GetWriteOptions_Private"
1222fc418013SVijay Mahadevan PetscErrorCode DMMoab_GetWriteOptions_Private(PetscInt fsetid, PetscInt numproc, PetscInt dim, MoabWriteMode mode, PetscInt dbglevel, const char* extra_opts, const char** write_opts)
1223fc418013SVijay Mahadevan {
1224fc418013SVijay Mahadevan   std::ostringstream str;
1225fc418013SVijay Mahadevan 
1226fc418013SVijay Mahadevan   PetscFunctionBegin;
1227fc418013SVijay Mahadevan 
1228fc418013SVijay Mahadevan   // do parallel read unless only one processor
1229fc418013SVijay Mahadevan   if (numproc > 1) {
1230fc418013SVijay Mahadevan     str << "PARALLEL=" << mode << ";";
1231fc418013SVijay Mahadevan     if (fsetid>=0) str << "PARALLEL_COMM=" << fsetid << ";";
1232fc418013SVijay Mahadevan   }
1233fc418013SVijay Mahadevan 
1234fc418013SVijay Mahadevan   if (dbglevel)
1235fc418013SVijay Mahadevan     str << "CPUTIME;DEBUG_IO=" << dbglevel << ";";
1236fc418013SVijay Mahadevan 
1237fc418013SVijay Mahadevan   if (extra_opts)
1238fc418013SVijay Mahadevan     str << extra_opts ;
1239fc418013SVijay Mahadevan 
1240fc418013SVijay Mahadevan   *write_opts = str.str().c_str();
1241fc418013SVijay Mahadevan   PetscFunctionReturn(0);
1242fc418013SVijay Mahadevan }
1243fc418013SVijay Mahadevan 
1244fc418013SVijay Mahadevan 
1245fc418013SVijay Mahadevan #undef __FUNCT__
1246fc418013SVijay Mahadevan #define __FUNCT__ "DMMoabOutput"
1247fc418013SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* filename,const char* usrwriteopts)
1248fc418013SVijay Mahadevan {
1249fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
1250fc418013SVijay Mahadevan   PetscInt       dbglevel=0;
1251fc418013SVijay Mahadevan   const char *writeopts;
1252fc418013SVijay Mahadevan 
1253fc418013SVijay Mahadevan   PetscErrorCode ierr;
1254fc418013SVijay Mahadevan   moab::ErrorCode merr;
1255fc418013SVijay Mahadevan 
1256fc418013SVijay Mahadevan   PetscFunctionBegin;
1257fc418013SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1258fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1259fc418013SVijay Mahadevan 
1260fc418013SVijay Mahadevan   PetscBarrier((PetscObject)dm);
1261fc418013SVijay Mahadevan 
1262fc418013SVijay Mahadevan   /* TODO: Use command-line options to control by_rank, verbosity, MoabReadMode and extra options */
1263fc418013SVijay Mahadevan   ierr  = PetscOptionsBegin(PETSC_COMM_WORLD, "", "Options for reading/writing MOAB based meshes from file", "DMMoab");
1264fc418013SVijay Mahadevan   ierr  = PetscOptionsInt("-dmmb_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "dmmbutil.cxx", dbglevel, &dbglevel, NULL);CHKERRQ(ierr);
1265fc418013SVijay Mahadevan   ierr  = PetscOptionsEnd();
1266fc418013SVijay Mahadevan 
1267fc418013SVijay Mahadevan   /* add mesh loading options specific to the DM */
1268fc418013SVijay Mahadevan   ierr = DMMoab_GetWriteOptions_Private(dmmoab->pcomm->get_id(), dmmoab->pcomm->size(), dmmoab->dim, MOAB_PARWOPTS_WRITE_PART, dbglevel, usrwriteopts, &writeopts);CHKERRQ(ierr);
1269fc418013SVijay Mahadevan   PetscInfo2(dm, "Writing file %s with options: %s\n",filename,writeopts);
1270fc418013SVijay Mahadevan 
1271fc418013SVijay Mahadevan   /* output file, using parallel write */
1272fc418013SVijay Mahadevan   merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr);
1273fc418013SVijay Mahadevan   PetscFunctionReturn(0);
1274fc418013SVijay Mahadevan }
1275fc418013SVijay Mahadevan 
1276