xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision eb9d242969b06b49099e4db0b43908fcc20cd2f9)
1032b8ab6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I  "petscdm.h"   I*/
2aa768e4cSTim Tautges #include <petsc-private/vecimpl.h> /*I  "petscdm.h"   I*/
31d72bce8STim Tautges 
41d72bce8STim Tautges #include <petscdmmoab.h>
588face26SJed Brown #include <MBTagConventions.hpp>
61cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
7032b8ab6SVijay Mahadevan 
8853cdec3SJed Brown #undef __FUNCT__
9853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab"
10853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm)
11853cdec3SJed Brown {
12853cdec3SJed Brown   PetscErrorCode ierr;
13032b8ab6SVijay Mahadevan   DM_Moab         *dmmoab = (DM_Moab*)dm->data;
14853cdec3SJed Brown 
15853cdec3SJed Brown   PetscFunctionBegin;
16853cdec3SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
17032b8ab6SVijay Mahadevan   if (dmmoab->icreatedinstance) {
18032b8ab6SVijay Mahadevan     delete dmmoab->mbiface;
19853cdec3SJed Brown   }
20032b8ab6SVijay Mahadevan   dmmoab->mbiface = NULL;
21032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
22032b8ab6SVijay Mahadevan   delete dmmoab->vlocal;
23032b8ab6SVijay Mahadevan   delete dmmoab->vowned;
24032b8ab6SVijay Mahadevan   delete dmmoab->vghost;
25032b8ab6SVijay Mahadevan   delete dmmoab->elocal;
26032b8ab6SVijay Mahadevan   delete dmmoab->eghost;
271cec0304SVijay Mahadevan   delete dmmoab->bndyvtx;
281cec0304SVijay Mahadevan   delete dmmoab->bndyfaces;
2969263071SVijay Mahadevan   delete dmmoab->bndyelems;
30fc418013SVijay Mahadevan 
31fc418013SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
32032b8ab6SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
33032b8ab6SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
34853cdec3SJed Brown   ierr = PetscFree(dm->data);CHKERRQ(ierr);
35853cdec3SJed Brown   PetscFunctionReturn(0);
36853cdec3SJed Brown }
37853cdec3SJed Brown 
38aa768e4cSTim Tautges #undef __FUNCT__
39032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
40032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm)
41032b8ab6SVijay Mahadevan {
42032b8ab6SVijay Mahadevan   PetscErrorCode          ierr;
43032b8ab6SVijay Mahadevan   moab::ErrorCode         merr;
44032b8ab6SVijay Mahadevan   Vec                     local, global;
45032b8ab6SVijay Mahadevan   IS                      from;
46032b8ab6SVijay Mahadevan   moab::Range::iterator   iter;
47fc418013SVijay Mahadevan   PetscInt                i,j,bs,gsiz,lsiz;
48032b8ab6SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
49*eb9d2429SVijay Mahadevan   PetscInt                totsize;
501cec0304SVijay Mahadevan   PetscSection            section;
51*eb9d2429SVijay Mahadevan   PetscInt                gmin,lmin,lmax;
52032b8ab6SVijay Mahadevan 
5369263071SVijay Mahadevan   moab::Range adj;
5469263071SVijay Mahadevan 
55032b8ab6SVijay Mahadevan   PetscFunctionBegin;
56032b8ab6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
57032b8ab6SVijay Mahadevan   /* Get the local and shared vertices and cache it */
58032b8ab6SVijay 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.");
59032b8ab6SVijay Mahadevan 
601cec0304SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
61032b8ab6SVijay Mahadevan   if (dmmoab->vlocal->empty()) {
621cec0304SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
63032b8ab6SVijay Mahadevan 
64032b8ab6SVijay Mahadevan     /* filter based on parallel status */
65fc418013SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
66032b8ab6SVijay Mahadevan     *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
67032b8ab6SVijay Mahadevan 
68032b8ab6SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
69032b8ab6SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
70032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
71fc418013SVijay Mahadevan 
72e23c60ebSVijay Mahadevan #if 0
73fc418013SVijay Mahadevan     if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) {
74fc418013SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost);
75fc418013SVijay Mahadevan       dmmoab->vlocal->print(0);
76fc418013SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc);
77fc418013SVijay Mahadevan       dmmoab->vowned->print(0);
78fc418013SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost);
79fc418013SVijay Mahadevan       dmmoab->vghost->print(0);
80fc418013SVijay Mahadevan     }
81fc418013SVijay Mahadevan #endif
82032b8ab6SVijay Mahadevan   }
83032b8ab6SVijay Mahadevan 
84032b8ab6SVijay Mahadevan   /* get the information about the local elements in the mesh */
85032b8ab6SVijay Mahadevan   {
86032b8ab6SVijay Mahadevan     dmmoab->eghost->clear();
87fc418013SVijay Mahadevan 
88fc418013SVijay Mahadevan     /* first decipher the leading dimension */
89fc418013SVijay Mahadevan     for (i=3;i>0;i--) {
90fc418013SVijay Mahadevan       dmmoab->elocal->clear();
91fc418013SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
92fc418013SVijay Mahadevan 
93fc418013SVijay Mahadevan       /* store the current mesh dimension */
94fc418013SVijay Mahadevan       if (dmmoab->elocal->size()) {
95fc418013SVijay Mahadevan         dmmoab->dim=i;
96fc418013SVijay Mahadevan         break;
97fc418013SVijay Mahadevan       }
98fc418013SVijay Mahadevan     }
99fc418013SVijay Mahadevan 
100032b8ab6SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
101032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
102032b8ab6SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
103032b8ab6SVijay Mahadevan 
104032b8ab6SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
105032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
106032b8ab6SVijay Mahadevan   }
107032b8ab6SVijay Mahadevan 
108032b8ab6SVijay Mahadevan   bs = dmmoab->bs;
109032b8ab6SVijay Mahadevan   if (!dmmoab->ltog_tag) {
110db66d124SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
111db66d124SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
112db66d124SVijay Mahadevan        assemble the individual pieces of the mesh */
113032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
114032b8ab6SVijay Mahadevan   }
115032b8ab6SVijay Mahadevan 
116032b8ab6SVijay Mahadevan   totsize=dmmoab->vlocal->size();
117fc418013SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr);
1181cec0304SVijay Mahadevan   {
119032b8ab6SVijay Mahadevan     /* first get the local indices */
120fc418013SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
1214a40b570SVijay Mahadevan     /* next get the ghosted indices */
122fc418013SVijay Mahadevan     if (dmmoab->nghost) {
123fc418013SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1241cec0304SVijay Mahadevan     }
1256e40195eSVijay Mahadevan 
1266e40195eSVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
127*eb9d2429SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
12869263071SVijay Mahadevan     for (i=0; i<totsize; ++i) {
129*eb9d2429SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
130*eb9d2429SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
131fc418013SVijay Mahadevan     }
1326e40195eSVijay Mahadevan 
133*eb9d2429SVijay Mahadevan     ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
134*eb9d2429SVijay Mahadevan     PetscInfo3(dm, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
1351cec0304SVijay Mahadevan   }
136032b8ab6SVijay Mahadevan 
1371cec0304SVijay Mahadevan   {
1381cec0304SVijay Mahadevan     ierr = PetscSectionCreate(((PetscObject)dm)->comm, &section);CHKERRQ(ierr);
1391cec0304SVijay Mahadevan     ierr = PetscSectionSetNumFields(section, dmmoab->nfields);CHKERRQ(ierr);
140*eb9d2429SVijay Mahadevan     ierr = PetscSectionSetChart(section, lmin, lmax+1);CHKERRQ(ierr);
141fc418013SVijay Mahadevan     for (j=0; j<totsize; ++j) {
142fc418013SVijay Mahadevan       PetscInt locgid = dmmoab->gsindices[j];
1431cec0304SVijay Mahadevan       for (i=0; i < dmmoab->nfields; ++i) {
1441cec0304SVijay Mahadevan         ierr = PetscSectionSetFieldName(section, i, dmmoab->fields[i]);CHKERRQ(ierr);
1451cec0304SVijay Mahadevan         if (bs>1) {
146*eb9d2429SVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, locgid, i, (locgid-gmin)*dmmoab->nfields+i);CHKERRQ(ierr);
147*eb9d2429SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, locgid, i, (locgid-gmin)*dmmoab->nfields);
1481cec0304SVijay Mahadevan         }
1491cec0304SVijay Mahadevan         else {
150*eb9d2429SVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, locgid, i, dmmoab->n*i+locgid-gmin);CHKERRQ(ierr);
15169263071SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, locgid, i, i*dmmoab->n);
1521cec0304SVijay Mahadevan         }
1531cec0304SVijay Mahadevan       }
154fc418013SVijay Mahadevan       ierr = PetscSectionSetDof(section, locgid, dmmoab->nfields);CHKERRQ(ierr);
1551cec0304SVijay Mahadevan     }
1561cec0304SVijay Mahadevan     ierr = PetscSectionSetUp(section);CHKERRQ(ierr);
1571cec0304SVijay Mahadevan     ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr);
1581cec0304SVijay Mahadevan   }
1591cec0304SVijay Mahadevan 
1601cec0304SVijay Mahadevan   {
161fc418013SVijay Mahadevan     for (i=0; i<totsize; ++i) {
162*eb9d2429SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
163fc418013SVijay Mahadevan     }
164fc418013SVijay Mahadevan 
165032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
166032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
167032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
168032b8ab6SVijay Mahadevan 
169032b8ab6SVijay Mahadevan     /* global to local must retrieve ghost points */
170fc418013SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
171032b8ab6SVijay Mahadevan 
172db66d124SVijay Mahadevan     ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr);
173db66d124SVijay Mahadevan     ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr);
174032b8ab6SVijay Mahadevan 
175032b8ab6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
176032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
177032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
178032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
179032b8ab6SVijay Mahadevan   }
180032b8ab6SVijay Mahadevan 
1811cec0304SVijay Mahadevan   /* skin the boundary and store nodes */
1821cec0304SVijay Mahadevan   {
183*eb9d2429SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
184*eb9d2429SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
185*eb9d2429SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
186*eb9d2429SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1871cec0304SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1881cec0304SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
1891cec0304SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
19069263071SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
191*eb9d2429SVijay Mahadevan 
192*eb9d2429SVijay Mahadevan     /* get the entities on the skin - only the faces */
19369263071SVijay 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
194*eb9d2429SVijay Mahadevan 
195*eb9d2429SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
196*eb9d2429SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
197*eb9d2429SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
19869263071SVijay Mahadevan 
19969263071SVijay Mahadevan     if (dmmoab->dim == 3) {
20069263071SVijay Mahadevan       // get the edges from faces and then do the same if needed
20169263071SVijay Mahadevan     }
20269263071SVijay Mahadevan 
203*eb9d2429SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
20469263071SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
20569263071SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
20669263071SVijay Mahadevan     PetscInfo3(dm, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
2071cec0304SVijay Mahadevan   }
208032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
209032b8ab6SVijay Mahadevan }
210032b8ab6SVijay Mahadevan 
2111cec0304SVijay Mahadevan 
212032b8ab6SVijay Mahadevan #undef __FUNCT__
213aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
214853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
215aa768e4cSTim Tautges {
216aa768e4cSTim Tautges   PetscErrorCode ierr;
217aa768e4cSTim Tautges 
218aa768e4cSTim Tautges   PetscFunctionBegin;
219aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
220032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
221032b8ab6SVijay Mahadevan 
222032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
223032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
224032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
225032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
226032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
227032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
228032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
229032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
230032b8ab6SVijay Mahadevan 
231032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
232032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
233032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
234032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
235032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
236aa768e4cSTim Tautges 
23797ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
23897ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
239032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
240032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
24197ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
242032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
243032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
244032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
245032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
246aa768e4cSTim Tautges   PetscFunctionReturn(0);
247aa768e4cSTim Tautges }
248fd349b41STim Tautges 
249fd349b41STim Tautges #undef __FUNCT__
2501d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
2511d72bce8STim Tautges /*@
2521d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
2531d72bce8STim Tautges 
2541d72bce8STim Tautges   Collective on MPI_Comm
2551d72bce8STim Tautges 
2561d72bce8STim Tautges   Input Parameter:
2571d72bce8STim Tautges . comm - The communicator for the DMMoab object
2581d72bce8STim Tautges 
2591d72bce8STim Tautges   Output Parameter:
260032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2611d72bce8STim Tautges 
2621d72bce8STim Tautges   Level: beginner
2631d72bce8STim Tautges 
2641d72bce8STim Tautges .keywords: DMMoab, create
2651d72bce8STim Tautges @*/
266032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
2671d72bce8STim Tautges {
2681d72bce8STim Tautges   PetscErrorCode ierr;
2691d72bce8STim Tautges 
2701d72bce8STim Tautges   PetscFunctionBegin;
271032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
272032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
273032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
2741d72bce8STim Tautges   PetscFunctionReturn(0);
2751d72bce8STim Tautges }
2761d72bce8STim Tautges 
2771d72bce8STim Tautges #undef __FUNCT__
278aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
2791d72bce8STim Tautges /*@
280a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
2811d72bce8STim Tautges 
2821d72bce8STim Tautges   Collective on MPI_Comm
2831d72bce8STim Tautges 
2841d72bce8STim Tautges   Input Parameter:
2851d72bce8STim Tautges . comm - The communicator for the DMMoab object
286032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
287a4d2169cSTim Tautges          along with the DMMoab
288a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
2891d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
2901d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
2911d72bce8STim Tautges 
2921d72bce8STim Tautges   Output Parameter:
293032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2941d72bce8STim Tautges 
295032b8ab6SVijay Mahadevan   Level: intermediate
2961d72bce8STim Tautges 
2971d72bce8STim Tautges .keywords: DMMoab, create
2981d72bce8STim Tautges @*/
299032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
3001d72bce8STim Tautges {
3011d72bce8STim Tautges   PetscErrorCode ierr;
302032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
3031cec0304SVijay Mahadevan   moab::EntityHandle partnset;
3041cec0304SVijay Mahadevan   PetscInt rank, nprocs;
305853cdec3SJed Brown   DM_Moab        *dmmoab;
3061d72bce8STim Tautges 
3071d72bce8STim Tautges   PetscFunctionBegin;
308032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
309032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
310032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
311a4d2169cSTim Tautges 
312a4d2169cSTim Tautges   if (!mbiface) {
31372ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
3147d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
3151d72bce8STim Tautges   }
3161cec0304SVijay Mahadevan   else {
3171cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
3187d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
3191cec0304SVijay Mahadevan   }
3201cec0304SVijay Mahadevan 
3211cec0304SVijay Mahadevan   /* create a fileset to store the hierarchy of entities belonging to current DM */
3221cec0304SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr);
3237d89fc02STim Tautges 
324a4d2169cSTim Tautges   if (!pcomm) {
325032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
326032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
327032b8ab6SVijay Mahadevan 
328db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
329db66d124SVijay Mahadevan        to the load_file functions to be populated. */
33072ff976dSVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
331032b8ab6SVijay Mahadevan     MBERR("Creating partition set failed", merr);
332032b8ab6SVijay Mahadevan 
333db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
33472ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
33572ff976dSVijay Mahadevan   }
33672ff976dSVijay Mahadevan   else {
33772ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
338032b8ab6SVijay Mahadevan   }
339032b8ab6SVijay Mahadevan 
3404973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
3414973de03SVijay Mahadevan   dmmoab->bs       = 1;
3424973de03SVijay Mahadevan 
3434973de03SVijay Mahadevan   /* set global ID tag handle */
344032b8ab6SVijay Mahadevan   if (!ltog_tag) {
3454973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
346032b8ab6SVijay Mahadevan   }
347032b8ab6SVijay Mahadevan   else {
348032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
349a4d2169cSTim Tautges   }
350a4d2169cSTim Tautges 
3514973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
352a4d2169cSTim Tautges   if (range) {
3535eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
354a4d2169cSTim Tautges   }
3551d72bce8STim Tautges   PetscFunctionReturn(0);
3561d72bce8STim Tautges }
3571d72bce8STim Tautges 
3581d72bce8STim Tautges #undef __FUNCT__
3591d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
360aa768e4cSTim Tautges /*@
361aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
362aa768e4cSTim Tautges 
363aa768e4cSTim Tautges   Collective on MPI_Comm
364aa768e4cSTim Tautges 
365aa768e4cSTim Tautges   Input Parameter:
366aa768e4cSTim Tautges . dm    - The DMMoab object being set
367aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
368aa768e4cSTim Tautges 
369aa768e4cSTim Tautges   Level: beginner
370aa768e4cSTim Tautges 
371aa768e4cSTim Tautges .keywords: DMMoab, create
372aa768e4cSTim Tautges @*/
3731d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
3741d72bce8STim Tautges {
375032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
376032b8ab6SVijay Mahadevan 
3771d72bce8STim Tautges   PetscFunctionBegin;
3781d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3791cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
380032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
381032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
382032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
3831d72bce8STim Tautges   PetscFunctionReturn(0);
3841d72bce8STim Tautges }
3851d72bce8STim Tautges 
3861d72bce8STim Tautges 
3871d72bce8STim Tautges #undef __FUNCT__
3881d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
389aa768e4cSTim Tautges /*@
390aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
391aa768e4cSTim Tautges 
392aa768e4cSTim Tautges   Collective on MPI_Comm
393aa768e4cSTim Tautges 
394aa768e4cSTim Tautges   Input Parameter:
395aa768e4cSTim Tautges . dm    - The DMMoab object being set
396aa768e4cSTim Tautges 
397aa768e4cSTim Tautges   Output Parameter:
398aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
399aa768e4cSTim Tautges 
400aa768e4cSTim Tautges   Level: beginner
401aa768e4cSTim Tautges 
402aa768e4cSTim Tautges .keywords: DMMoab, create
403aa768e4cSTim Tautges @*/
4041d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
4051d72bce8STim Tautges {
4061d72bce8STim Tautges   PetscFunctionBegin;
4071d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
408032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
4091d72bce8STim Tautges   PetscFunctionReturn(0);
4101d72bce8STim Tautges }
4111d72bce8STim Tautges 
4121d72bce8STim Tautges 
4131d72bce8STim Tautges #undef __FUNCT__
4141d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
415aa768e4cSTim Tautges /*@
416aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
417aa768e4cSTim Tautges 
418aa768e4cSTim Tautges   Collective on MPI_Comm
419aa768e4cSTim Tautges 
420aa768e4cSTim Tautges   Input Parameter:
421aa768e4cSTim Tautges . dm      - The DMMoab object being set
422aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
423aa768e4cSTim Tautges 
424aa768e4cSTim Tautges   Level: beginner
425aa768e4cSTim Tautges 
426aa768e4cSTim Tautges .keywords: DMMoab, create
427aa768e4cSTim Tautges @*/
428a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
4291d72bce8STim Tautges {
430032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
431032b8ab6SVijay Mahadevan 
4321d72bce8STim Tautges   PetscFunctionBegin;
4331d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4341cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
435032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
436032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
437032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4381d72bce8STim Tautges   PetscFunctionReturn(0);
4391d72bce8STim Tautges }
4401d72bce8STim Tautges 
4411d72bce8STim Tautges 
4421d72bce8STim Tautges #undef __FUNCT__
4431d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
444aa768e4cSTim Tautges /*@
445aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
446aa768e4cSTim Tautges 
447aa768e4cSTim Tautges   Collective on MPI_Comm
448aa768e4cSTim Tautges 
449aa768e4cSTim Tautges   Input Parameter:
450aa768e4cSTim Tautges . dm      - The DMMoab object being set
451aa768e4cSTim Tautges 
452aa768e4cSTim Tautges   Output Parameter:
453aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
454aa768e4cSTim Tautges 
455aa768e4cSTim Tautges   Level: beginner
456aa768e4cSTim Tautges 
457aa768e4cSTim Tautges .keywords: DMMoab, create
458aa768e4cSTim Tautges @*/
459a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
4601d72bce8STim Tautges {
4619426e041SSatish Balay   PetscErrorCode   ierr;
462cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
463cabb514dSBarry Smith 
4641d72bce8STim Tautges   PetscFunctionBegin;
4651d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
466cabb514dSBarry 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);
467a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
4681d72bce8STim Tautges   PetscFunctionReturn(0);
4691d72bce8STim Tautges }
4701d72bce8STim Tautges 
4711d72bce8STim Tautges 
4721d72bce8STim Tautges #undef __FUNCT__
4735eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
474aa768e4cSTim Tautges /*@
4755eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
476aa768e4cSTim Tautges 
477aa768e4cSTim Tautges   Collective on MPI_Comm
478aa768e4cSTim Tautges 
479aa768e4cSTim Tautges   Input Parameter:
480aa768e4cSTim Tautges . dm    - The DMMoab object being set
481aa768e4cSTim Tautges . range - The entities treated by this DMMoab
482aa768e4cSTim Tautges 
483aa768e4cSTim Tautges   Level: beginner
484aa768e4cSTim Tautges 
485aa768e4cSTim Tautges .keywords: DMMoab, create
486aa768e4cSTim Tautges @*/
4875eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
4881d72bce8STim Tautges {
489032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
490032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
491032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
492032b8ab6SVijay Mahadevan 
4931d72bce8STim Tautges   PetscFunctionBegin;
4941d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
495032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
496032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
497032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
498032b8ab6SVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
499032b8ab6SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
500032b8ab6SVijay Mahadevan   *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned);
501032b8ab6SVijay Mahadevan   dmmoab->nloc=dmmoab->vowned->size();
502032b8ab6SVijay Mahadevan   dmmoab->nghost=dmmoab->vghost->size();
503032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5041d72bce8STim Tautges   PetscFunctionReturn(0);
5051d72bce8STim Tautges }
5061d72bce8STim Tautges 
5071d72bce8STim Tautges 
5081d72bce8STim Tautges #undef __FUNCT__
5095eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
510aa768e4cSTim Tautges /*@
5115eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
512aa768e4cSTim Tautges 
513aa768e4cSTim Tautges   Collective on MPI_Comm
514aa768e4cSTim Tautges 
515aa768e4cSTim Tautges   Input Parameter:
516aa768e4cSTim Tautges . dm    - The DMMoab object being set
517aa768e4cSTim Tautges 
518aa768e4cSTim Tautges   Output Parameter:
5195eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
5205eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
521aa768e4cSTim Tautges 
522aa768e4cSTim Tautges   Level: beginner
523aa768e4cSTim Tautges 
524aa768e4cSTim Tautges .keywords: DMMoab, create
525aa768e4cSTim Tautges @*/
5261cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
5271d72bce8STim Tautges {
5281d72bce8STim Tautges   PetscFunctionBegin;
5291d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5301cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
5311cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
5321d72bce8STim Tautges   PetscFunctionReturn(0);
5331d72bce8STim Tautges }
5341d72bce8STim Tautges 
5351d72bce8STim Tautges #undef __FUNCT__
5365eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
5375eb88e9dSVijay Mahadevan /*@
5385eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
5395eb88e9dSVijay Mahadevan 
5405eb88e9dSVijay Mahadevan   Collective on MPI_Comm
5415eb88e9dSVijay Mahadevan 
5425eb88e9dSVijay Mahadevan   Input Parameter:
5435eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
5445eb88e9dSVijay Mahadevan 
5455eb88e9dSVijay Mahadevan   Output Parameter:
5465eb88e9dSVijay Mahadevan . range - The entities owned locally
5475eb88e9dSVijay Mahadevan 
5485eb88e9dSVijay Mahadevan   Level: beginner
5495eb88e9dSVijay Mahadevan 
5505eb88e9dSVijay Mahadevan .keywords: DMMoab, create
5515eb88e9dSVijay Mahadevan @*/
5521cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
5535eb88e9dSVijay Mahadevan {
5545eb88e9dSVijay Mahadevan   PetscFunctionBegin;
5555eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5561cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
5571cec0304SVijay Mahadevan   PetscFunctionReturn(0);
5581cec0304SVijay Mahadevan }
5591cec0304SVijay Mahadevan 
5601cec0304SVijay Mahadevan 
5611cec0304SVijay Mahadevan #undef __FUNCT__
5621cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
5631cec0304SVijay Mahadevan /*@
5641cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
5651cec0304SVijay Mahadevan 
5661cec0304SVijay Mahadevan   Collective on MPI_Comm
5671cec0304SVijay Mahadevan 
5681cec0304SVijay Mahadevan   Input Parameter:
5691cec0304SVijay Mahadevan . dm    - The DMMoab object being set
5701cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
5711cec0304SVijay Mahadevan 
5721cec0304SVijay Mahadevan   Level: beginner
5731cec0304SVijay Mahadevan 
5741cec0304SVijay Mahadevan .keywords: DMMoab, create
5751cec0304SVijay Mahadevan @*/
5761cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
5771cec0304SVijay Mahadevan {
5781cec0304SVijay Mahadevan   moab::ErrorCode merr;
5791cec0304SVijay Mahadevan   PetscErrorCode  ierr;
5801cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
5811cec0304SVijay Mahadevan 
5821cec0304SVijay Mahadevan   PetscFunctionBegin;
5831cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5841cec0304SVijay Mahadevan   dmmoab->elocal->clear();
5851cec0304SVijay Mahadevan   dmmoab->eghost->clear();
5861cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
5871cec0304SVijay Mahadevan   PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size());
5881cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
5891cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
5901cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
5911cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5921cec0304SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele);
5935eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
5945eb88e9dSVijay Mahadevan }
5955eb88e9dSVijay Mahadevan 
5965eb88e9dSVijay Mahadevan 
5975eb88e9dSVijay Mahadevan #undef __FUNCT__
5981d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
599aa768e4cSTim Tautges /*@
600aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
601aa768e4cSTim Tautges 
602aa768e4cSTim Tautges   Collective on MPI_Comm
603aa768e4cSTim Tautges 
604aa768e4cSTim Tautges   Input Parameter:
605aa768e4cSTim Tautges . dm      - The DMMoab object being set
606aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
607aa768e4cSTim Tautges 
608aa768e4cSTim Tautges   Level: beginner
609aa768e4cSTim Tautges 
610aa768e4cSTim Tautges .keywords: DMMoab, create
611aa768e4cSTim Tautges @*/
6121d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
6131d72bce8STim Tautges {
6141d72bce8STim Tautges   PetscFunctionBegin;
6151d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6161d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
6171d72bce8STim Tautges   PetscFunctionReturn(0);
6181d72bce8STim Tautges }
6191d72bce8STim Tautges 
6201d72bce8STim Tautges 
6211d72bce8STim Tautges #undef __FUNCT__
6221d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
623aa768e4cSTim Tautges /*@
624aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
625aa768e4cSTim Tautges 
626aa768e4cSTim Tautges   Collective on MPI_Comm
627aa768e4cSTim Tautges 
628aa768e4cSTim Tautges   Input Parameter:
629aa768e4cSTim Tautges . dm      - The DMMoab object being set
630aa768e4cSTim Tautges 
631aa768e4cSTim Tautges   Output Parameter:
632aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
633aa768e4cSTim Tautges 
634aa768e4cSTim Tautges   Level: beginner
635aa768e4cSTim Tautges 
636aa768e4cSTim Tautges .keywords: DMMoab, create
637aa768e4cSTim Tautges @*/
6381d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
6391d72bce8STim Tautges {
6401d72bce8STim Tautges   PetscFunctionBegin;
6411d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6421d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
6431d72bce8STim Tautges   PetscFunctionReturn(0);
6441d72bce8STim Tautges }
6451d72bce8STim Tautges 
6461d72bce8STim Tautges 
6471d72bce8STim Tautges #undef __FUNCT__
6481d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
649aa768e4cSTim Tautges /*@
650aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
651aa768e4cSTim Tautges 
652aa768e4cSTim Tautges   Collective on MPI_Comm
653aa768e4cSTim Tautges 
654aa768e4cSTim Tautges   Input Parameter:
655aa768e4cSTim Tautges . dm - The DMMoab object being set
656aa768e4cSTim Tautges . bs - The block size used with this DMMoab
657aa768e4cSTim Tautges 
658aa768e4cSTim Tautges   Level: beginner
659aa768e4cSTim Tautges 
660aa768e4cSTim Tautges .keywords: DMMoab, create
661aa768e4cSTim Tautges @*/
6621d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
6631d72bce8STim Tautges {
6641d72bce8STim Tautges   PetscFunctionBegin;
6651d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6661d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
6671d72bce8STim Tautges   PetscFunctionReturn(0);
6681d72bce8STim Tautges }
6691d72bce8STim Tautges 
6701d72bce8STim Tautges 
6711d72bce8STim Tautges #undef __FUNCT__
6721d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
673aa768e4cSTim Tautges /*@
674aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
675aa768e4cSTim Tautges 
676aa768e4cSTim Tautges   Collective on MPI_Comm
677aa768e4cSTim Tautges 
678aa768e4cSTim Tautges   Input Parameter:
679aa768e4cSTim Tautges . dm - The DMMoab object being set
680aa768e4cSTim Tautges 
681aa768e4cSTim Tautges   Output Parameter:
682aa768e4cSTim Tautges . bs - The block size used with this DMMoab
683aa768e4cSTim Tautges 
684aa768e4cSTim Tautges   Level: beginner
685aa768e4cSTim Tautges 
686aa768e4cSTim Tautges .keywords: DMMoab, create
687aa768e4cSTim Tautges @*/
6881d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
6891d72bce8STim Tautges {
6901d72bce8STim Tautges   PetscFunctionBegin;
6911d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6921d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
6931d72bce8STim Tautges   PetscFunctionReturn(0);
6941d72bce8STim Tautges }
6951d72bce8STim Tautges 
6961cec0304SVijay Mahadevan 
6971cec0304SVijay Mahadevan #undef __FUNCT__
6981cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector"
6991cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
7001cec0304SVijay Mahadevan {
7011cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
7021cec0304SVijay Mahadevan   moab::Tag     vtag,ntag;
7031cec0304SVijay Mahadevan   PetscScalar   *varray;
7041cec0304SVijay Mahadevan   moab::ErrorCode merr;
7051cec0304SVijay Mahadevan   PetscErrorCode  ierr;
7061cec0304SVijay Mahadevan   PetscSection section;
7071cec0304SVijay Mahadevan   PetscInt doff;
7081cec0304SVijay Mahadevan   std::string tag_name;
7091cec0304SVijay Mahadevan   moab::Range::iterator iter;
7101cec0304SVijay Mahadevan 
7111cec0304SVijay Mahadevan   PetscFunctionBegin;
7121cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7131cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7141cec0304SVijay Mahadevan 
7151cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
7161cec0304SVijay Mahadevan 
7171cec0304SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
7181cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
7191cec0304SVijay Mahadevan                                           moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
7201cec0304SVijay Mahadevan 
7211cec0304SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
7221cec0304SVijay Mahadevan 
7231cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
7241cec0304SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
7251cec0304SVijay Mahadevan     ierr = DMMoabVecGetArray(dm,fvec,&varray);CHKERRQ(ierr);
7261cec0304SVijay Mahadevan     for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
7271cec0304SVijay Mahadevan       moab::EntityHandle vtx = (*iter);
7281cec0304SVijay Mahadevan 
7291cec0304SVijay Mahadevan       /* get field dof index */
7301cec0304SVijay Mahadevan       ierr = PetscSectionGetFieldOffset(section, vtx, ifield, &doff);
7311cec0304SVijay Mahadevan 
7321cec0304SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
7331cec0304SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr);
7341cec0304SVijay Mahadevan     }
7351cec0304SVijay Mahadevan     ierr = DMMoabVecRestoreArray(dm,fvec,&varray);CHKERRQ(ierr);
7361cec0304SVijay Mahadevan   }
7371cec0304SVijay Mahadevan   else {
7381cec0304SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&varray);CHKERRQ(ierr);
7391cec0304SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
7401cec0304SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
7411cec0304SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr);
7421cec0304SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
7431cec0304SVijay Mahadevan     merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
7441cec0304SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
7451cec0304SVijay Mahadevan   }
7461cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7471cec0304SVijay Mahadevan }
7481cec0304SVijay Mahadevan 
7491cec0304SVijay Mahadevan 
7501cec0304SVijay Mahadevan #undef __FUNCT__
7517023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
7527023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
7537023aa44SVijay Mahadevan {
7547023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
7557023aa44SVijay Mahadevan   PetscErrorCode  ierr;
7567023aa44SVijay Mahadevan   moab::ErrorCode merr;
7577023aa44SVijay Mahadevan 
7587023aa44SVijay Mahadevan   PetscFunctionBegin;
7597023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7607023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
7617023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7627023aa44SVijay Mahadevan 
7637023aa44SVijay Mahadevan   if (!vpos) {
7647023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
7657023aa44SVijay Mahadevan   }
7667023aa44SVijay Mahadevan 
7677023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7687023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
7697023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7707023aa44SVijay Mahadevan }
7717023aa44SVijay Mahadevan 
7727023aa44SVijay Mahadevan 
7737023aa44SVijay Mahadevan #undef __FUNCT__
7747023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
7757023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
7767023aa44SVijay Mahadevan {
7777023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
7787023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
7797023aa44SVijay Mahadevan   moab::ErrorCode merr;
7807023aa44SVijay Mahadevan   PetscInt nnodes;
7817023aa44SVijay Mahadevan 
7827023aa44SVijay Mahadevan   PetscFunctionBegin;
7837023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7847023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
7857023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7867023aa44SVijay Mahadevan 
7877023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
7887023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
7897023aa44SVijay Mahadevan   if (conn) *conn=connect;
7907023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
7917023aa44SVijay Mahadevan   PetscFunctionReturn(0);
7927023aa44SVijay Mahadevan }
7937023aa44SVijay Mahadevan 
7947023aa44SVijay Mahadevan 
7957023aa44SVijay Mahadevan #undef __FUNCT__
79669263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
79769263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
79869263071SVijay Mahadevan {
79969263071SVijay Mahadevan   moab::EntityType etype;
80069263071SVijay Mahadevan   DM_Moab         *dmmoab;
80169263071SVijay Mahadevan   PetscInt         edim;
80269263071SVijay Mahadevan 
80369263071SVijay Mahadevan   PetscFunctionBegin;
80469263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
80569263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
80669263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
80769263071SVijay Mahadevan 
80869263071SVijay Mahadevan   /* get the entity type and handle accordingly */
80969263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
81069263071SVijay 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);
81169263071SVijay Mahadevan 
81269263071SVijay Mahadevan   /* get the entity dimension */
81369263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
81469263071SVijay Mahadevan 
81569263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
81669263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
81769263071SVijay Mahadevan     moab::Range::const_iterator giter = dmmoab->bndyvtx->find(ent);
81869263071SVijay Mahadevan     if (giter != dmmoab->bndyvtx->end()) *ent_on_boundary=PETSC_TRUE;
81969263071SVijay Mahadevan   }
82069263071SVijay Mahadevan   else {
82169263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
82269263071SVijay Mahadevan       moab::Range::const_iterator geiter = dmmoab->bndyelems->find(ent);
82369263071SVijay Mahadevan       if (geiter != dmmoab->bndyelems->end()) *ent_on_boundary=PETSC_TRUE;
82469263071SVijay Mahadevan     }
82569263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
82669263071SVijay Mahadevan       moab::Range::const_iterator gfiter = dmmoab->bndyfaces->find(ent);
82769263071SVijay Mahadevan       if (gfiter != dmmoab->bndyfaces->end()) *ent_on_boundary=PETSC_TRUE;
82869263071SVijay Mahadevan     }
82969263071SVijay Mahadevan   }
83069263071SVijay Mahadevan   PetscFunctionReturn(0);
83169263071SVijay Mahadevan }
83269263071SVijay Mahadevan 
83369263071SVijay Mahadevan 
83469263071SVijay Mahadevan #undef __FUNCT__
8357023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
83669263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
8377023aa44SVijay Mahadevan {
8387023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
8397023aa44SVijay Mahadevan   PetscInt       i;
8407023aa44SVijay Mahadevan 
8417023aa44SVijay Mahadevan   PetscFunctionBegin;
8427023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8437023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
8447023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
8457023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8467023aa44SVijay Mahadevan 
8477023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
8487023aa44SVijay Mahadevan     moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]);
84969263071SVijay Mahadevan     if (giter != dmmoab->bndyvtx->end()) isbdvtx[i] = PETSC_TRUE;
8507023aa44SVijay Mahadevan     else isbdvtx[i] = PETSC_FALSE;
8517023aa44SVijay Mahadevan   }
8527023aa44SVijay Mahadevan   PetscFunctionReturn(0);
8537023aa44SVijay Mahadevan }
8547023aa44SVijay Mahadevan 
8557023aa44SVijay Mahadevan 
8567023aa44SVijay Mahadevan #undef __FUNCT__
8571cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities"
85869263071SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces,moab::Range* bdelems)
8591cec0304SVijay Mahadevan {
8601cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8611cec0304SVijay Mahadevan 
8621cec0304SVijay Mahadevan   PetscFunctionBegin;
8631cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8641cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8651cec0304SVijay Mahadevan 
8661cec0304SVijay Mahadevan   if (bdvtx)  *bdvtx = *dmmoab->bndyvtx;
8671cec0304SVijay Mahadevan   if (bdfaces)  *bdfaces = *dmmoab->bndyfaces;
86869263071SVijay Mahadevan   if (bdelems)  *bdfaces = *dmmoab->bndyelems;
8691cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8701cec0304SVijay Mahadevan }
8711cec0304SVijay Mahadevan 
8721cec0304SVijay Mahadevan 
8731cec0304SVijay Mahadevan #undef __FUNCT__
8741cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields"
8751cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields)
8761cec0304SVijay Mahadevan {
8771cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8781cec0304SVijay Mahadevan 
8791cec0304SVijay Mahadevan   PetscFunctionBegin;
8801cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8811cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8821cec0304SVijay Mahadevan 
8831cec0304SVijay Mahadevan   dmmoab->fields = fields;
8841cec0304SVijay Mahadevan   dmmoab->nfields = nfields;
8851cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8861cec0304SVijay Mahadevan }
8871cec0304SVijay Mahadevan 
8881cec0304SVijay Mahadevan 
8891cec0304SVijay Mahadevan #undef __FUNCT__
8901cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
8911cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
8921cec0304SVijay Mahadevan {
8931cec0304SVijay Mahadevan   PetscSection section;
894fc418013SVijay Mahadevan   PetscInt gid;
8951cec0304SVijay Mahadevan   PetscErrorCode ierr;
896fc418013SVijay Mahadevan   moab::ErrorCode merr;
897fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
8981cec0304SVijay Mahadevan 
8991cec0304SVijay Mahadevan   PetscFunctionBegin;
9001cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
901fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
902fc418013SVijay Mahadevan 
9031cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
904fc418013SVijay Mahadevan 
905fc418013SVijay Mahadevan   /* first get the global ID for the point */
906fc418013SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&point,1,&gid);MBERRNM(merr);
907fc418013SVijay Mahadevan 
908fc418013SVijay Mahadevan   /* get the dof value for the field */
909fc418013SVijay Mahadevan   ierr = PetscSectionGetFieldDof(section, gid, field, dof);CHKERRQ(ierr);
9101cec0304SVijay Mahadevan   PetscFunctionReturn(0);
9111cec0304SVijay Mahadevan }
9121cec0304SVijay Mahadevan 
9131cec0304SVijay Mahadevan 
9141cec0304SVijay Mahadevan #undef __FUNCT__
9151cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
9161cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
9171cec0304SVijay Mahadevan {
918fc418013SVijay Mahadevan   PetscInt i,gid;
9191cec0304SVijay Mahadevan   PetscSection section;
9201cec0304SVijay Mahadevan   PetscErrorCode  ierr;
921fc418013SVijay Mahadevan   moab::ErrorCode merr;
922fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
9231cec0304SVijay Mahadevan 
9241cec0304SVijay Mahadevan   PetscFunctionBegin;
9251cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
926fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
927fc418013SVijay Mahadevan 
9281cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
9291cec0304SVijay Mahadevan   if (!dof) {
9301cec0304SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
9311cec0304SVijay Mahadevan   }
932fc418013SVijay Mahadevan 
933fc418013SVijay Mahadevan   /* first get the local indices */
934fc418013SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr);
935fc418013SVijay Mahadevan 
9361cec0304SVijay Mahadevan   for (i=0; i<npoints; ++i) {
937fc418013SVijay Mahadevan     gid=dof[i];
938fc418013SVijay Mahadevan     ierr = PetscSectionGetFieldDof(section, gid, field, &dof[i]);CHKERRQ(ierr);
9391cec0304SVijay Mahadevan   }
9401cec0304SVijay Mahadevan   PetscFunctionReturn(0);
9411cec0304SVijay Mahadevan }
9421cec0304SVijay Mahadevan 
9431cec0304SVijay Mahadevan 
944fc418013SVijay Mahadevan #undef __FUNCT__
945*eb9d2429SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalFieldDofs"
946*eb9d2429SVijay Mahadevan PetscErrorCode DMMoabGetLocalFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
947*eb9d2429SVijay Mahadevan {
948*eb9d2429SVijay Mahadevan   PetscInt i,offset;
949*eb9d2429SVijay Mahadevan   PetscErrorCode  ierr;
950*eb9d2429SVijay Mahadevan   DM_Moab        *dmmoab;
951*eb9d2429SVijay Mahadevan 
952*eb9d2429SVijay Mahadevan   PetscFunctionBegin;
953*eb9d2429SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
954*eb9d2429SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
955*eb9d2429SVijay Mahadevan 
956*eb9d2429SVijay Mahadevan   if (!dof) {
957*eb9d2429SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
958*eb9d2429SVijay Mahadevan   }
959*eb9d2429SVijay Mahadevan 
960*eb9d2429SVijay Mahadevan   if (dmmoab->bs > 1) {
961*eb9d2429SVijay Mahadevan     for (i=0; i<npoints; ++i)
962*eb9d2429SVijay Mahadevan       dof[i] = (points[i]-1)*dmmoab->bs+field;
963*eb9d2429SVijay Mahadevan   }
964*eb9d2429SVijay Mahadevan   else {
965*eb9d2429SVijay Mahadevan     offset = field*dmmoab->n; /* assume all fields have equal distribution */
966*eb9d2429SVijay Mahadevan     for (i=0; i<npoints; ++i)
967*eb9d2429SVijay Mahadevan       dof[i] = offset+points[i]-1;
968*eb9d2429SVijay Mahadevan   }
969*eb9d2429SVijay Mahadevan   PetscFunctionReturn(0);
970*eb9d2429SVijay Mahadevan }
971*eb9d2429SVijay Mahadevan 
972*eb9d2429SVijay Mahadevan 
973*eb9d2429SVijay Mahadevan #undef __FUNCT__
974fc418013SVijay Mahadevan #define __FUNCT__ "DMMoab_GetWriteOptions_Private"
975fc418013SVijay Mahadevan PetscErrorCode DMMoab_GetWriteOptions_Private(PetscInt fsetid, PetscInt numproc, PetscInt dim, MoabWriteMode mode, PetscInt dbglevel, const char* extra_opts, const char** write_opts)
976fc418013SVijay Mahadevan {
977fc418013SVijay Mahadevan   std::ostringstream str;
978fc418013SVijay Mahadevan 
979fc418013SVijay Mahadevan   PetscFunctionBegin;
980fc418013SVijay Mahadevan 
981fc418013SVijay Mahadevan   // do parallel read unless only one processor
982fc418013SVijay Mahadevan   if (numproc > 1) {
983fc418013SVijay Mahadevan     str << "PARALLEL=" << mode << ";";
984fc418013SVijay Mahadevan     if (fsetid>=0) str << "PARALLEL_COMM=" << fsetid << ";";
985fc418013SVijay Mahadevan   }
986fc418013SVijay Mahadevan 
987fc418013SVijay Mahadevan   if (dbglevel)
988fc418013SVijay Mahadevan     str << "CPUTIME;DEBUG_IO=" << dbglevel << ";";
989fc418013SVijay Mahadevan 
990fc418013SVijay Mahadevan   if (extra_opts)
991fc418013SVijay Mahadevan     str << extra_opts ;
992fc418013SVijay Mahadevan 
993fc418013SVijay Mahadevan   *write_opts = str.str().c_str();
994fc418013SVijay Mahadevan   PetscFunctionReturn(0);
995fc418013SVijay Mahadevan }
996fc418013SVijay Mahadevan 
997fc418013SVijay Mahadevan 
998fc418013SVijay Mahadevan #undef __FUNCT__
999fc418013SVijay Mahadevan #define __FUNCT__ "DMMoabOutput"
1000fc418013SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* filename,const char* usrwriteopts)
1001fc418013SVijay Mahadevan {
1002fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
1003fc418013SVijay Mahadevan   PetscInt       dbglevel=0;
1004fc418013SVijay Mahadevan   const char *writeopts;
1005fc418013SVijay Mahadevan 
1006fc418013SVijay Mahadevan   PetscErrorCode ierr;
1007fc418013SVijay Mahadevan   moab::ErrorCode merr;
1008fc418013SVijay Mahadevan 
1009fc418013SVijay Mahadevan   PetscFunctionBegin;
1010fc418013SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1011fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1012fc418013SVijay Mahadevan 
1013fc418013SVijay Mahadevan   PetscBarrier((PetscObject)dm);
1014fc418013SVijay Mahadevan 
1015fc418013SVijay Mahadevan   /* TODO: Use command-line options to control by_rank, verbosity, MoabReadMode and extra options */
1016fc418013SVijay Mahadevan   ierr  = PetscOptionsBegin(PETSC_COMM_WORLD, "", "Options for reading/writing MOAB based meshes from file", "DMMoab");
1017fc418013SVijay Mahadevan   ierr  = PetscOptionsInt("-dmmb_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "dmmbutil.cxx", dbglevel, &dbglevel, NULL);CHKERRQ(ierr);
1018fc418013SVijay Mahadevan   ierr  = PetscOptionsEnd();
1019fc418013SVijay Mahadevan 
1020fc418013SVijay Mahadevan   /* add mesh loading options specific to the DM */
1021fc418013SVijay Mahadevan   ierr = DMMoab_GetWriteOptions_Private(dmmoab->pcomm->get_id(), dmmoab->pcomm->size(), dmmoab->dim, MOAB_PARWOPTS_WRITE_PART, dbglevel, usrwriteopts, &writeopts);CHKERRQ(ierr);
1022fc418013SVijay Mahadevan   PetscInfo2(dm, "Writing file %s with options: %s\n",filename,writeopts);
1023fc418013SVijay Mahadevan 
1024fc418013SVijay Mahadevan   /* output file, using parallel write */
1025fc418013SVijay Mahadevan   merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr);
1026fc418013SVijay Mahadevan   PetscFunctionReturn(0);
1027fc418013SVijay Mahadevan }
1028fc418013SVijay Mahadevan 
1029