xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 8d8d51c86027a13935644f06c7b4df5786dd0478)
1032b8ab6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I  "petscdm.h"   I*/
2aa768e4cSTim Tautges #include <petsc-private/vecimpl.h> /*I  "petscdm.h"   I*/
31d72bce8STim Tautges 
41d72bce8STim Tautges #include <petscdmmoab.h>
588face26SJed Brown #include <MBTagConventions.hpp>
61cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
7032b8ab6SVijay Mahadevan 
8853cdec3SJed Brown #undef __FUNCT__
9853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab"
10853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm)
11853cdec3SJed Brown {
12853cdec3SJed Brown   PetscErrorCode ierr;
13032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)dm->data;
14212ad6d1SVijay Mahadevan   PetscSection   section;
15853cdec3SJed Brown 
16853cdec3SJed Brown   PetscFunctionBegin;
17853cdec3SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
18212ad6d1SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
19212ad6d1SVijay Mahadevan   ierr = PetscSectionDestroy(&section);CHKERRQ(ierr);
20032b8ab6SVijay Mahadevan   if (dmmoab->icreatedinstance) {
21032b8ab6SVijay Mahadevan     delete dmmoab->mbiface;
22853cdec3SJed Brown   }
23032b8ab6SVijay Mahadevan   dmmoab->mbiface = NULL;
24032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
25032b8ab6SVijay Mahadevan   delete dmmoab->vlocal;
26032b8ab6SVijay Mahadevan   delete dmmoab->vowned;
27032b8ab6SVijay Mahadevan   delete dmmoab->vghost;
28032b8ab6SVijay Mahadevan   delete dmmoab->elocal;
29032b8ab6SVijay Mahadevan   delete dmmoab->eghost;
30*8d8d51c8SVijay Mahadevan 
31*8d8d51c8SVijay Mahadevan   ierr = PetscFree(dmmoab->isbndyvtx);CHKERRQ(ierr);
32*8d8d51c8SVijay Mahadevan   ierr = PetscFree(dmmoab->isbndyfaces);CHKERRQ(ierr);
33*8d8d51c8SVijay Mahadevan   ierr = PetscFree(dmmoab->isbndyelems);CHKERRQ(ierr);
341cec0304SVijay Mahadevan   delete dmmoab->bndyvtx;
351cec0304SVijay Mahadevan   delete dmmoab->bndyfaces;
3669263071SVijay Mahadevan   delete dmmoab->bndyelems;
37fc418013SVijay Mahadevan 
38fc418013SVijay Mahadevan   ierr = PetscFree(dmmoab->gsindices);CHKERRQ(ierr);
39032b8ab6SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
40032b8ab6SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
41853cdec3SJed Brown   ierr = PetscFree(dm->data);CHKERRQ(ierr);
42853cdec3SJed Brown   PetscFunctionReturn(0);
43853cdec3SJed Brown }
44853cdec3SJed Brown 
45aa768e4cSTim Tautges #undef __FUNCT__
46032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
47032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm)
48032b8ab6SVijay Mahadevan {
49032b8ab6SVijay Mahadevan   PetscErrorCode          ierr;
50032b8ab6SVijay Mahadevan   moab::ErrorCode         merr;
51032b8ab6SVijay Mahadevan   Vec                     local, global;
52032b8ab6SVijay Mahadevan   IS                      from;
53032b8ab6SVijay Mahadevan   moab::Range::iterator   iter;
54fc418013SVijay Mahadevan   PetscInt                i,j,bs,gsiz,lsiz;
55032b8ab6SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
56eb9d2429SVijay Mahadevan   PetscInt                totsize;
571cec0304SVijay Mahadevan   PetscSection            section;
58eb9d2429SVijay Mahadevan   PetscInt                gmin,lmin,lmax;
59032b8ab6SVijay Mahadevan 
6069263071SVijay Mahadevan   moab::Range adj;
6169263071SVijay Mahadevan 
62032b8ab6SVijay Mahadevan   PetscFunctionBegin;
63032b8ab6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
64032b8ab6SVijay Mahadevan   /* Get the local and shared vertices and cache it */
65032b8ab6SVijay 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.");
66032b8ab6SVijay Mahadevan 
671cec0304SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
68032b8ab6SVijay Mahadevan   if (dmmoab->vlocal->empty()) {
691cec0304SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
70032b8ab6SVijay Mahadevan 
71032b8ab6SVijay Mahadevan     /* filter based on parallel status */
72fc418013SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vlocal,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,dmmoab->vowned);MBERRNM(merr);
73032b8ab6SVijay Mahadevan     *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
74032b8ab6SVijay Mahadevan 
75032b8ab6SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
76032b8ab6SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
77032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
78fc418013SVijay Mahadevan 
79e23c60ebSVijay Mahadevan #if 0
80fc418013SVijay Mahadevan     if(dmmoab->pcomm->rank() || dmmoab->pcomm->size()==1) {
81fc418013SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: global: %D, local: %D", dmmoab->n, dmmoab->nloc+dmmoab->nghost);
82fc418013SVijay Mahadevan       dmmoab->vlocal->print(0);
83fc418013SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: owned: %D", dmmoab->nloc);
84fc418013SVijay Mahadevan       dmmoab->vowned->print(0);
85fc418013SVijay Mahadevan       PetscPrintf(PETSC_COMM_SELF, "Vertices: ghost: %D", dmmoab->nghost);
86fc418013SVijay Mahadevan       dmmoab->vghost->print(0);
87fc418013SVijay Mahadevan     }
88fc418013SVijay Mahadevan #endif
89032b8ab6SVijay Mahadevan   }
90032b8ab6SVijay Mahadevan 
91032b8ab6SVijay Mahadevan   /* get the information about the local elements in the mesh */
92032b8ab6SVijay Mahadevan   {
93032b8ab6SVijay Mahadevan     dmmoab->eghost->clear();
94fc418013SVijay Mahadevan 
95fc418013SVijay Mahadevan     /* first decipher the leading dimension */
96fc418013SVijay Mahadevan     for (i=3;i>0;i--) {
97fc418013SVijay Mahadevan       dmmoab->elocal->clear();
98fc418013SVijay Mahadevan       merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, i, *dmmoab->elocal, true);CHKERRQ(merr);
99fc418013SVijay Mahadevan 
100fc418013SVijay Mahadevan       /* store the current mesh dimension */
101fc418013SVijay Mahadevan       if (dmmoab->elocal->size()) {
102fc418013SVijay Mahadevan         dmmoab->dim=i;
103fc418013SVijay Mahadevan         break;
104fc418013SVijay Mahadevan       }
105fc418013SVijay Mahadevan     }
106fc418013SVijay Mahadevan 
107032b8ab6SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
108032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
109032b8ab6SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
110032b8ab6SVijay Mahadevan 
111032b8ab6SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
112032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
113032b8ab6SVijay Mahadevan   }
114032b8ab6SVijay Mahadevan 
115032b8ab6SVijay Mahadevan   bs = dmmoab->bs;
116032b8ab6SVijay Mahadevan   if (!dmmoab->ltog_tag) {
117db66d124SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
118db66d124SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
119db66d124SVijay Mahadevan        assemble the individual pieces of the mesh */
120032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
121032b8ab6SVijay Mahadevan   }
122032b8ab6SVijay Mahadevan 
123032b8ab6SVijay Mahadevan   totsize=dmmoab->vlocal->size();
124fc418013SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &dmmoab->gsindices);CHKERRQ(ierr);
1251cec0304SVijay Mahadevan   {
126032b8ab6SVijay Mahadevan     /* first get the local indices */
127fc418013SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&dmmoab->gsindices[0]);MBERRNM(merr);
1284a40b570SVijay Mahadevan     /* next get the ghosted indices */
129fc418013SVijay Mahadevan     if (dmmoab->nghost) {
130fc418013SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&dmmoab->gsindices[dmmoab->nloc]);MBERRNM(merr);
1311cec0304SVijay Mahadevan     }
1326e40195eSVijay Mahadevan 
1336e40195eSVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
134eb9d2429SVijay Mahadevan     lmin=lmax=dmmoab->gsindices[0];
13569263071SVijay Mahadevan     for (i=0; i<totsize; ++i) {
136eb9d2429SVijay Mahadevan       if(lmin>dmmoab->gsindices[i]) lmin=dmmoab->gsindices[i];
137eb9d2429SVijay Mahadevan       if(lmax<dmmoab->gsindices[i]) lmax=dmmoab->gsindices[i];
138fc418013SVijay Mahadevan     }
1396e40195eSVijay Mahadevan 
140eb9d2429SVijay Mahadevan     ierr = MPI_Allreduce(&lmin, &gmin, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
141eb9d2429SVijay Mahadevan     PetscInfo3(dm, "GLOBAL_ID: Local minima - %D, Local maxima - %D, Global minima - %D.\n", lmin, lmax, gmin);
1421cec0304SVijay Mahadevan   }
143032b8ab6SVijay Mahadevan 
1441cec0304SVijay Mahadevan   {
1451cec0304SVijay Mahadevan     ierr = PetscSectionCreate(((PetscObject)dm)->comm, &section);CHKERRQ(ierr);
1461cec0304SVijay Mahadevan     ierr = PetscSectionSetNumFields(section, dmmoab->nfields);CHKERRQ(ierr);
147eb9d2429SVijay Mahadevan     ierr = PetscSectionSetChart(section, lmin, lmax+1);CHKERRQ(ierr);
148fc418013SVijay Mahadevan     for (j=0; j<totsize; ++j) {
149fc418013SVijay Mahadevan       PetscInt locgid = dmmoab->gsindices[j];
1501cec0304SVijay Mahadevan       for (i=0; i < dmmoab->nfields; ++i) {
1511cec0304SVijay Mahadevan         ierr = PetscSectionSetFieldName(section, i, dmmoab->fields[i]);CHKERRQ(ierr);
1521cec0304SVijay Mahadevan         if (bs>1) {
153eb9d2429SVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, locgid, i, (locgid-gmin)*dmmoab->nfields+i);CHKERRQ(ierr);
154eb9d2429SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, locgid, i, (locgid-gmin)*dmmoab->nfields);
1551cec0304SVijay Mahadevan         }
1561cec0304SVijay Mahadevan         else {
157eb9d2429SVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, locgid, i, dmmoab->n*i+locgid-gmin);CHKERRQ(ierr);
15869263071SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, locgid, i, i*dmmoab->n);
1591cec0304SVijay Mahadevan         }
1601cec0304SVijay Mahadevan       }
161fc418013SVijay Mahadevan       ierr = PetscSectionSetDof(section, locgid, dmmoab->nfields);CHKERRQ(ierr);
1621cec0304SVijay Mahadevan     }
1631cec0304SVijay Mahadevan     ierr = PetscSectionSetUp(section);CHKERRQ(ierr);
1641cec0304SVijay Mahadevan     ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr);
1651cec0304SVijay Mahadevan   }
1661cec0304SVijay Mahadevan 
1671cec0304SVijay Mahadevan   {
168fc418013SVijay Mahadevan     for (i=0; i<totsize; ++i) {
169eb9d2429SVijay Mahadevan       dmmoab->gsindices[i]-=gmin;   /* zero based index needed for IS */
170fc418013SVijay Mahadevan     }
171fc418013SVijay Mahadevan 
172032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
173032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
174032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
175032b8ab6SVijay Mahadevan 
176032b8ab6SVijay Mahadevan     /* global to local must retrieve ghost points */
177fc418013SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&dmmoab->gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
178032b8ab6SVijay Mahadevan 
179db66d124SVijay Mahadevan     ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr);
180db66d124SVijay Mahadevan     ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr);
181032b8ab6SVijay Mahadevan 
182032b8ab6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
183032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
184032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
185032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
186032b8ab6SVijay Mahadevan   }
187032b8ab6SVijay Mahadevan 
1881cec0304SVijay Mahadevan   /* skin the boundary and store nodes */
1891cec0304SVijay Mahadevan   {
190eb9d2429SVijay Mahadevan     /* get the skin vertices of boundary faces for the current partition and then filter
191eb9d2429SVijay Mahadevan        the local, boundary faces, vertices and elements alone via PSTATUS flags;
192eb9d2429SVijay Mahadevan        this should not give us any ghosted boundary, but if user needs such a functionality
193eb9d2429SVijay Mahadevan        it would be easy to add it based on the find_skin query below */
1941cec0304SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1951cec0304SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
1961cec0304SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
19769263071SVijay Mahadevan     dmmoab->bndyelems = new moab::Range();
198eb9d2429SVijay Mahadevan 
199eb9d2429SVijay Mahadevan     /* get the entities on the skin - only the faces */
20069263071SVijay 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
201eb9d2429SVijay Mahadevan 
202eb9d2429SVijay Mahadevan     /* filter all the non-owned and shared entities out of the list */
203eb9d2429SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
204eb9d2429SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->bndyfaces,PSTATUS_SHARED,PSTATUS_NOT);MBERRNM(merr);
20569263071SVijay Mahadevan 
20669263071SVijay Mahadevan     if (dmmoab->dim == 3) {
20769263071SVijay Mahadevan       // get the edges from faces and then do the same if needed
20869263071SVijay Mahadevan     }
20969263071SVijay Mahadevan 
210eb9d2429SVijay Mahadevan     /* get all the nodes via connectivity and the parent elements via adjacency information */
21169263071SVijay Mahadevan     merr = dmmoab->mbiface->get_connectivity(*dmmoab->bndyfaces, *dmmoab->bndyvtx, false);MBERRNM(ierr);
21269263071SVijay Mahadevan     merr = dmmoab->mbiface->get_adjacencies(*dmmoab->bndyfaces, dmmoab->dim, false, *dmmoab->bndyelems, moab::Interface::UNION);MBERRNM(ierr);
21369263071SVijay Mahadevan     PetscInfo3(dm, "Found %D boundary vertices, %D boundary faces and %D boundary elements.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size(), dmmoab->bndyelems->size());
214*8d8d51c8SVijay Mahadevan 
215*8d8d51c8SVijay Mahadevan     /* cache a bit-vector for easy query */
216*8d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscBool)*(dmmoab->nloc+dmmoab->nghost),&dmmoab->isbndyvtx);CHKERRQ(ierr);
217*8d8d51c8SVijay Mahadevan     ierr = PetscMemzero(dmmoab->isbndyvtx,sizeof(PetscBool)*(dmmoab->nloc+dmmoab->nghost));CHKERRQ(ierr);
218*8d8d51c8SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->bndyvtx->begin(); iter != dmmoab->bndyvtx->end(); iter++) {
219*8d8d51c8SVijay Mahadevan       dmmoab->isbndyvtx[(PetscInt)*iter-1]=PETSC_TRUE;
220*8d8d51c8SVijay Mahadevan     }
221*8d8d51c8SVijay Mahadevan 
222*8d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscBool)*dmmoab->neleloc,&dmmoab->isbndyelems);CHKERRQ(ierr);
223*8d8d51c8SVijay Mahadevan     ierr = PetscMemzero(dmmoab->isbndyelems,sizeof(PetscBool)*dmmoab->neleloc);CHKERRQ(ierr);
224*8d8d51c8SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->bndyelems->begin(); iter != dmmoab->bndyelems->end(); iter++) {
225*8d8d51c8SVijay Mahadevan       dmmoab->isbndyelems[(PetscInt)*iter-1]=PETSC_TRUE;
226*8d8d51c8SVijay Mahadevan     }
227*8d8d51c8SVijay Mahadevan 
228*8d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscBool)*dmmoab->bndyfaces->size(),&dmmoab->isbndyfaces);CHKERRQ(ierr);
229*8d8d51c8SVijay Mahadevan     ierr = PetscMemzero(dmmoab->isbndyfaces,sizeof(PetscBool)*dmmoab->bndyfaces->size());CHKERRQ(ierr);
230*8d8d51c8SVijay Mahadevan     for(moab::Range::iterator iter = dmmoab->bndyfaces->begin(); iter != dmmoab->bndyfaces->end(); iter++) {
231*8d8d51c8SVijay Mahadevan       dmmoab->isbndyfaces[(PetscInt)*iter-1]=PETSC_TRUE;
232*8d8d51c8SVijay Mahadevan     }
2331cec0304SVijay Mahadevan   }
234032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
235032b8ab6SVijay Mahadevan }
236032b8ab6SVijay Mahadevan 
2371cec0304SVijay Mahadevan 
238032b8ab6SVijay Mahadevan #undef __FUNCT__
239aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
240853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
241aa768e4cSTim Tautges {
242aa768e4cSTim Tautges   PetscErrorCode ierr;
243aa768e4cSTim Tautges 
244aa768e4cSTim Tautges   PetscFunctionBegin;
245aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
246032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
247032b8ab6SVijay Mahadevan 
248032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
249324f1edfSVijay Mahadevan   ((DM_Moab*)dm->data)->nfields = 1;
250032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
251032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
252032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
253032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
254032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
255032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
256032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
257032b8ab6SVijay Mahadevan 
258032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
259032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
260032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
261032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
262032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
263aa768e4cSTim Tautges 
26497ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
26597ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
266032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
267032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
26897ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
269032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
270032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
271032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
272032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
273aa768e4cSTim Tautges   PetscFunctionReturn(0);
274aa768e4cSTim Tautges }
275fd349b41STim Tautges 
276fd349b41STim Tautges #undef __FUNCT__
2771d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
2781d72bce8STim Tautges /*@
2791d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
2801d72bce8STim Tautges 
2811d72bce8STim Tautges   Collective on MPI_Comm
2821d72bce8STim Tautges 
2831d72bce8STim Tautges   Input Parameter:
2841d72bce8STim Tautges . comm - The communicator for the DMMoab object
2851d72bce8STim Tautges 
2861d72bce8STim Tautges   Output Parameter:
287032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2881d72bce8STim Tautges 
2891d72bce8STim Tautges   Level: beginner
2901d72bce8STim Tautges 
2911d72bce8STim Tautges .keywords: DMMoab, create
2921d72bce8STim Tautges @*/
293032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
2941d72bce8STim Tautges {
2951d72bce8STim Tautges   PetscErrorCode ierr;
2961d72bce8STim Tautges 
2971d72bce8STim Tautges   PetscFunctionBegin;
298032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
299032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
300032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
3011d72bce8STim Tautges   PetscFunctionReturn(0);
3021d72bce8STim Tautges }
3031d72bce8STim Tautges 
3041d72bce8STim Tautges #undef __FUNCT__
305aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
3061d72bce8STim Tautges /*@
307a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
3081d72bce8STim Tautges 
3091d72bce8STim Tautges   Collective on MPI_Comm
3101d72bce8STim Tautges 
3111d72bce8STim Tautges   Input Parameter:
3121d72bce8STim Tautges . comm - The communicator for the DMMoab object
313032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
314a4d2169cSTim Tautges          along with the DMMoab
315a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
3161d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
3171d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
3181d72bce8STim Tautges 
3191d72bce8STim Tautges   Output Parameter:
320032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
3211d72bce8STim Tautges 
322032b8ab6SVijay Mahadevan   Level: intermediate
3231d72bce8STim Tautges 
3241d72bce8STim Tautges .keywords: DMMoab, create
3251d72bce8STim Tautges @*/
326032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
3271d72bce8STim Tautges {
3281d72bce8STim Tautges   PetscErrorCode ierr;
329032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
3301cec0304SVijay Mahadevan   moab::EntityHandle partnset;
3311cec0304SVijay Mahadevan   PetscInt rank, nprocs;
332853cdec3SJed Brown   DM_Moab        *dmmoab;
3331d72bce8STim Tautges 
3341d72bce8STim Tautges   PetscFunctionBegin;
335032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
336032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
337032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
338a4d2169cSTim Tautges 
339a4d2169cSTim Tautges   if (!mbiface) {
34072ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
3417d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
3421d72bce8STim Tautges   }
3431cec0304SVijay Mahadevan   else {
3441cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
3457d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
3461cec0304SVijay Mahadevan   }
3471cec0304SVijay Mahadevan 
3481cec0304SVijay Mahadevan   /* create a fileset to store the hierarchy of entities belonging to current DM */
3491cec0304SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr);
3507d89fc02STim Tautges 
351a4d2169cSTim Tautges   if (!pcomm) {
352032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
353032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
354032b8ab6SVijay Mahadevan 
355db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
356db66d124SVijay Mahadevan        to the load_file functions to be populated. */
35772ff976dSVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
358032b8ab6SVijay Mahadevan     MBERR("Creating partition set failed", merr);
359032b8ab6SVijay Mahadevan 
360db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
36172ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
36272ff976dSVijay Mahadevan   }
36372ff976dSVijay Mahadevan   else {
36472ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
365032b8ab6SVijay Mahadevan   }
366032b8ab6SVijay Mahadevan 
3674973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
3684973de03SVijay Mahadevan   dmmoab->bs = 1;
369324f1edfSVijay Mahadevan   dmmoab->nfields = 1;
3704973de03SVijay Mahadevan 
3714973de03SVijay Mahadevan   /* set global ID tag handle */
372032b8ab6SVijay Mahadevan   if (!ltog_tag) {
3734973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
374032b8ab6SVijay Mahadevan   }
375032b8ab6SVijay Mahadevan   else {
376032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
377a4d2169cSTim Tautges   }
378a4d2169cSTim Tautges 
3794973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
380a4d2169cSTim Tautges   if (range) {
3815eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
382a4d2169cSTim Tautges   }
3831d72bce8STim Tautges   PetscFunctionReturn(0);
3841d72bce8STim Tautges }
3851d72bce8STim Tautges 
3861d72bce8STim Tautges #undef __FUNCT__
3871d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
388aa768e4cSTim Tautges /*@
389aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
390aa768e4cSTim Tautges 
391aa768e4cSTim Tautges   Collective on MPI_Comm
392aa768e4cSTim Tautges 
393aa768e4cSTim Tautges   Input Parameter:
394aa768e4cSTim Tautges . dm    - The DMMoab object being set
395aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
396aa768e4cSTim Tautges 
397aa768e4cSTim Tautges   Level: beginner
398aa768e4cSTim Tautges 
399aa768e4cSTim Tautges .keywords: DMMoab, create
400aa768e4cSTim Tautges @*/
4011d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
4021d72bce8STim Tautges {
403032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
404032b8ab6SVijay Mahadevan 
4051d72bce8STim Tautges   PetscFunctionBegin;
4061d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4071cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
408032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
409032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
410032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4111d72bce8STim Tautges   PetscFunctionReturn(0);
4121d72bce8STim Tautges }
4131d72bce8STim Tautges 
4141d72bce8STim Tautges 
4151d72bce8STim Tautges #undef __FUNCT__
4161d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
417aa768e4cSTim Tautges /*@
418aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
419aa768e4cSTim Tautges 
420aa768e4cSTim Tautges   Collective on MPI_Comm
421aa768e4cSTim Tautges 
422aa768e4cSTim Tautges   Input Parameter:
423aa768e4cSTim Tautges . dm    - The DMMoab object being set
424aa768e4cSTim Tautges 
425aa768e4cSTim Tautges   Output Parameter:
426aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
427aa768e4cSTim Tautges 
428aa768e4cSTim Tautges   Level: beginner
429aa768e4cSTim Tautges 
430aa768e4cSTim Tautges .keywords: DMMoab, create
431aa768e4cSTim Tautges @*/
4321d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
4331d72bce8STim Tautges {
4341d72bce8STim Tautges   PetscFunctionBegin;
4351d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
436032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
4371d72bce8STim Tautges   PetscFunctionReturn(0);
4381d72bce8STim Tautges }
4391d72bce8STim Tautges 
4401d72bce8STim Tautges 
4411d72bce8STim Tautges #undef __FUNCT__
4421d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
443aa768e4cSTim Tautges /*@
444aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
445aa768e4cSTim Tautges 
446aa768e4cSTim Tautges   Collective on MPI_Comm
447aa768e4cSTim Tautges 
448aa768e4cSTim Tautges   Input Parameter:
449aa768e4cSTim Tautges . dm      - The DMMoab object being set
450aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
451aa768e4cSTim Tautges 
452aa768e4cSTim Tautges   Level: beginner
453aa768e4cSTim Tautges 
454aa768e4cSTim Tautges .keywords: DMMoab, create
455aa768e4cSTim Tautges @*/
456a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
4571d72bce8STim Tautges {
458032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
459032b8ab6SVijay Mahadevan 
4601d72bce8STim Tautges   PetscFunctionBegin;
4611d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4621cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
463032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
464032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
465032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4661d72bce8STim Tautges   PetscFunctionReturn(0);
4671d72bce8STim Tautges }
4681d72bce8STim Tautges 
4691d72bce8STim Tautges 
4701d72bce8STim Tautges #undef __FUNCT__
4711d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
472aa768e4cSTim Tautges /*@
473aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
474aa768e4cSTim Tautges 
475aa768e4cSTim Tautges   Collective on MPI_Comm
476aa768e4cSTim Tautges 
477aa768e4cSTim Tautges   Input Parameter:
478aa768e4cSTim Tautges . dm      - The DMMoab object being set
479aa768e4cSTim Tautges 
480aa768e4cSTim Tautges   Output Parameter:
481aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
482aa768e4cSTim Tautges 
483aa768e4cSTim Tautges   Level: beginner
484aa768e4cSTim Tautges 
485aa768e4cSTim Tautges .keywords: DMMoab, create
486aa768e4cSTim Tautges @*/
487a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
4881d72bce8STim Tautges {
4899426e041SSatish Balay   PetscErrorCode   ierr;
490cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
491cabb514dSBarry Smith 
4921d72bce8STim Tautges   PetscFunctionBegin;
4931d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
494cabb514dSBarry 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);
495a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
4961d72bce8STim Tautges   PetscFunctionReturn(0);
4971d72bce8STim Tautges }
4981d72bce8STim Tautges 
4991d72bce8STim Tautges 
5001d72bce8STim Tautges #undef __FUNCT__
5015eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
502aa768e4cSTim Tautges /*@
5035eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
504aa768e4cSTim Tautges 
505aa768e4cSTim Tautges   Collective on MPI_Comm
506aa768e4cSTim Tautges 
507aa768e4cSTim Tautges   Input Parameter:
508aa768e4cSTim Tautges . dm    - The DMMoab object being set
509aa768e4cSTim Tautges . range - The entities treated by this DMMoab
510aa768e4cSTim Tautges 
511aa768e4cSTim Tautges   Level: beginner
512aa768e4cSTim Tautges 
513aa768e4cSTim Tautges .keywords: DMMoab, create
514aa768e4cSTim Tautges @*/
5155eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
5161d72bce8STim Tautges {
517032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
518032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
519032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
520032b8ab6SVijay Mahadevan 
5211d72bce8STim Tautges   PetscFunctionBegin;
5221d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
523032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
524032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
525032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
526032b8ab6SVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
527032b8ab6SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
528032b8ab6SVijay Mahadevan   *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned);
529032b8ab6SVijay Mahadevan   dmmoab->nloc=dmmoab->vowned->size();
530032b8ab6SVijay Mahadevan   dmmoab->nghost=dmmoab->vghost->size();
531032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5321d72bce8STim Tautges   PetscFunctionReturn(0);
5331d72bce8STim Tautges }
5341d72bce8STim Tautges 
5351d72bce8STim Tautges 
5361d72bce8STim Tautges #undef __FUNCT__
537*8d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetAllVertices"
538*8d8d51c8SVijay Mahadevan /*@
539*8d8d51c8SVijay Mahadevan   DMMoabGetAllVertices - Get the entities having DOFs on this DMMoab
540*8d8d51c8SVijay Mahadevan 
541*8d8d51c8SVijay Mahadevan   Collective on MPI_Comm
542*8d8d51c8SVijay Mahadevan 
543*8d8d51c8SVijay Mahadevan   Input Parameter:
544*8d8d51c8SVijay Mahadevan . dm    - The DMMoab object being set
545*8d8d51c8SVijay Mahadevan 
546*8d8d51c8SVijay Mahadevan   Output Parameter:
547*8d8d51c8SVijay Mahadevan . owned - The local vertex entities in this DMMoab = (owned+ghosted)
548*8d8d51c8SVijay Mahadevan 
549*8d8d51c8SVijay Mahadevan   Level: beginner
550*8d8d51c8SVijay Mahadevan 
551*8d8d51c8SVijay Mahadevan .keywords: DMMoab, create
552*8d8d51c8SVijay Mahadevan @*/
553*8d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetAllVertices(DM dm,moab::Range *local)
554*8d8d51c8SVijay Mahadevan {
555*8d8d51c8SVijay Mahadevan   PetscFunctionBegin;
556*8d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
557*8d8d51c8SVijay Mahadevan   if (local) *local = *((DM_Moab*)dm->data)->vlocal;
558*8d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
559*8d8d51c8SVijay Mahadevan }
560*8d8d51c8SVijay Mahadevan 
561*8d8d51c8SVijay Mahadevan 
562*8d8d51c8SVijay Mahadevan 
563*8d8d51c8SVijay Mahadevan #undef __FUNCT__
5645eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
565aa768e4cSTim Tautges /*@
5665eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
567aa768e4cSTim Tautges 
568aa768e4cSTim Tautges   Collective on MPI_Comm
569aa768e4cSTim Tautges 
570aa768e4cSTim Tautges   Input Parameter:
571aa768e4cSTim Tautges . dm    - The DMMoab object being set
572aa768e4cSTim Tautges 
573aa768e4cSTim Tautges   Output Parameter:
5745eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
5755eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
576aa768e4cSTim Tautges 
577aa768e4cSTim Tautges   Level: beginner
578aa768e4cSTim Tautges 
579aa768e4cSTim Tautges .keywords: DMMoab, create
580aa768e4cSTim Tautges @*/
5811cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
5821d72bce8STim Tautges {
5831d72bce8STim Tautges   PetscFunctionBegin;
5841d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5851cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
5861cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
5871d72bce8STim Tautges   PetscFunctionReturn(0);
5881d72bce8STim Tautges }
5891d72bce8STim Tautges 
5901d72bce8STim Tautges #undef __FUNCT__
5915eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
5925eb88e9dSVijay Mahadevan /*@
5935eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
5945eb88e9dSVijay Mahadevan 
5955eb88e9dSVijay Mahadevan   Collective on MPI_Comm
5965eb88e9dSVijay Mahadevan 
5975eb88e9dSVijay Mahadevan   Input Parameter:
5985eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
5995eb88e9dSVijay Mahadevan 
6005eb88e9dSVijay Mahadevan   Output Parameter:
6015eb88e9dSVijay Mahadevan . range - The entities owned locally
6025eb88e9dSVijay Mahadevan 
6035eb88e9dSVijay Mahadevan   Level: beginner
6045eb88e9dSVijay Mahadevan 
6055eb88e9dSVijay Mahadevan .keywords: DMMoab, create
6065eb88e9dSVijay Mahadevan @*/
6071cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
6085eb88e9dSVijay Mahadevan {
6095eb88e9dSVijay Mahadevan   PetscFunctionBegin;
6105eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6111cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
6121cec0304SVijay Mahadevan   PetscFunctionReturn(0);
6131cec0304SVijay Mahadevan }
6141cec0304SVijay Mahadevan 
6151cec0304SVijay Mahadevan 
6161cec0304SVijay Mahadevan #undef __FUNCT__
6171cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
6181cec0304SVijay Mahadevan /*@
6191cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
6201cec0304SVijay Mahadevan 
6211cec0304SVijay Mahadevan   Collective on MPI_Comm
6221cec0304SVijay Mahadevan 
6231cec0304SVijay Mahadevan   Input Parameter:
6241cec0304SVijay Mahadevan . dm    - The DMMoab object being set
6251cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
6261cec0304SVijay Mahadevan 
6271cec0304SVijay Mahadevan   Level: beginner
6281cec0304SVijay Mahadevan 
6291cec0304SVijay Mahadevan .keywords: DMMoab, create
6301cec0304SVijay Mahadevan @*/
6311cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
6321cec0304SVijay Mahadevan {
6331cec0304SVijay Mahadevan   moab::ErrorCode merr;
6341cec0304SVijay Mahadevan   PetscErrorCode  ierr;
6351cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
6361cec0304SVijay Mahadevan 
6371cec0304SVijay Mahadevan   PetscFunctionBegin;
6381cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6391cec0304SVijay Mahadevan   dmmoab->elocal->clear();
6401cec0304SVijay Mahadevan   dmmoab->eghost->clear();
6411cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
6421cec0304SVijay Mahadevan   PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size());
6431cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
6441cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
6451cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
6461cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
6471cec0304SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele);
6485eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
6495eb88e9dSVijay Mahadevan }
6505eb88e9dSVijay Mahadevan 
6515eb88e9dSVijay Mahadevan 
6525eb88e9dSVijay Mahadevan #undef __FUNCT__
6531d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
654aa768e4cSTim Tautges /*@
655aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
656aa768e4cSTim Tautges 
657aa768e4cSTim Tautges   Collective on MPI_Comm
658aa768e4cSTim Tautges 
659aa768e4cSTim Tautges   Input Parameter:
660aa768e4cSTim Tautges . dm      - The DMMoab object being set
661aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
662aa768e4cSTim Tautges 
663aa768e4cSTim Tautges   Level: beginner
664aa768e4cSTim Tautges 
665aa768e4cSTim Tautges .keywords: DMMoab, create
666aa768e4cSTim Tautges @*/
6671d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
6681d72bce8STim Tautges {
6691d72bce8STim Tautges   PetscFunctionBegin;
6701d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6711d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
6721d72bce8STim Tautges   PetscFunctionReturn(0);
6731d72bce8STim Tautges }
6741d72bce8STim Tautges 
6751d72bce8STim Tautges 
6761d72bce8STim Tautges #undef __FUNCT__
6771d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
678aa768e4cSTim Tautges /*@
679aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
680aa768e4cSTim Tautges 
681aa768e4cSTim Tautges   Collective on MPI_Comm
682aa768e4cSTim Tautges 
683aa768e4cSTim Tautges   Input Parameter:
684aa768e4cSTim Tautges . dm      - The DMMoab object being set
685aa768e4cSTim Tautges 
686aa768e4cSTim Tautges   Output Parameter:
687aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
688aa768e4cSTim Tautges 
689aa768e4cSTim Tautges   Level: beginner
690aa768e4cSTim Tautges 
691aa768e4cSTim Tautges .keywords: DMMoab, create
692aa768e4cSTim Tautges @*/
6931d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
6941d72bce8STim Tautges {
6951d72bce8STim Tautges   PetscFunctionBegin;
6961d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6971d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
6981d72bce8STim Tautges   PetscFunctionReturn(0);
6991d72bce8STim Tautges }
7001d72bce8STim Tautges 
7011d72bce8STim Tautges 
7021d72bce8STim Tautges #undef __FUNCT__
7031d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
704aa768e4cSTim Tautges /*@
705aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
706aa768e4cSTim Tautges 
707aa768e4cSTim Tautges   Collective on MPI_Comm
708aa768e4cSTim Tautges 
709aa768e4cSTim Tautges   Input Parameter:
710aa768e4cSTim Tautges . dm - The DMMoab object being set
711aa768e4cSTim Tautges . bs - The block size used with this DMMoab
712aa768e4cSTim Tautges 
713aa768e4cSTim Tautges   Level: beginner
714aa768e4cSTim Tautges 
715aa768e4cSTim Tautges .keywords: DMMoab, create
716aa768e4cSTim Tautges @*/
7171d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
7181d72bce8STim Tautges {
7191d72bce8STim Tautges   PetscFunctionBegin;
7201d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7211d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
7221d72bce8STim Tautges   PetscFunctionReturn(0);
7231d72bce8STim Tautges }
7241d72bce8STim Tautges 
7251d72bce8STim Tautges 
7261d72bce8STim Tautges #undef __FUNCT__
7271d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
728aa768e4cSTim Tautges /*@
729aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
730aa768e4cSTim Tautges 
731aa768e4cSTim Tautges   Collective on MPI_Comm
732aa768e4cSTim Tautges 
733aa768e4cSTim Tautges   Input Parameter:
734aa768e4cSTim Tautges . dm - The DMMoab object being set
735aa768e4cSTim Tautges 
736aa768e4cSTim Tautges   Output Parameter:
737aa768e4cSTim Tautges . bs - The block size used with this DMMoab
738aa768e4cSTim Tautges 
739aa768e4cSTim Tautges   Level: beginner
740aa768e4cSTim Tautges 
741aa768e4cSTim Tautges .keywords: DMMoab, create
742aa768e4cSTim Tautges @*/
7431d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
7441d72bce8STim Tautges {
7451d72bce8STim Tautges   PetscFunctionBegin;
7461d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7471d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
7481d72bce8STim Tautges   PetscFunctionReturn(0);
7491d72bce8STim Tautges }
7501d72bce8STim Tautges 
7511cec0304SVijay Mahadevan 
7521cec0304SVijay Mahadevan #undef __FUNCT__
753212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetSize"
754212ad6d1SVijay Mahadevan /*@
755212ad6d1SVijay Mahadevan   DMMoabGetSize - Get the global vertex size used with this DMMoab
756212ad6d1SVijay Mahadevan 
757212ad6d1SVijay Mahadevan   Collective on MPI_Comm
758212ad6d1SVijay Mahadevan 
759212ad6d1SVijay Mahadevan   Input Parameter:
760212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
761212ad6d1SVijay Mahadevan 
762212ad6d1SVijay Mahadevan   Output Parameter:
763212ad6d1SVijay Mahadevan . ng - The global size of the DMMoab instance
764212ad6d1SVijay Mahadevan 
765212ad6d1SVijay Mahadevan   Level: beginner
766212ad6d1SVijay Mahadevan 
767212ad6d1SVijay Mahadevan .keywords: DMMoab, create
768212ad6d1SVijay Mahadevan @*/
769212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetSize(DM dm,PetscInt *ng)
770212ad6d1SVijay Mahadevan {
771212ad6d1SVijay Mahadevan   PetscFunctionBegin;
772212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
773212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->n;
774212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
775212ad6d1SVijay Mahadevan }
776212ad6d1SVijay Mahadevan 
777212ad6d1SVijay Mahadevan 
778212ad6d1SVijay Mahadevan #undef __FUNCT__
779212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalSize"
780212ad6d1SVijay Mahadevan /*@
781212ad6d1SVijay Mahadevan   DMMoabGetLocalSize - Get the local and ghosted vertex size used with this DMMoab
782212ad6d1SVijay Mahadevan 
783212ad6d1SVijay Mahadevan   Collective on MPI_Comm
784212ad6d1SVijay Mahadevan 
785212ad6d1SVijay Mahadevan   Input Parameter:
786212ad6d1SVijay Mahadevan . dm - The DMMoab object being set
787212ad6d1SVijay Mahadevan 
788212ad6d1SVijay Mahadevan   Output Parameter:
789212ad6d1SVijay Mahadevan . nl - The local size of the DMMoab instance
790212ad6d1SVijay Mahadevan . ng - The ghosted size of the DMMoab instance
791212ad6d1SVijay Mahadevan 
792212ad6d1SVijay Mahadevan   Level: beginner
793212ad6d1SVijay Mahadevan 
794212ad6d1SVijay Mahadevan .keywords: DMMoab, create
795212ad6d1SVijay Mahadevan @*/
796212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetLocalSize(DM dm,PetscInt *nl,PetscInt *ng)
797212ad6d1SVijay Mahadevan {
798212ad6d1SVijay Mahadevan   PetscFunctionBegin;
799212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
800212ad6d1SVijay Mahadevan   if(nl) *nl = ((DM_Moab*)dm->data)->nloc;
801212ad6d1SVijay Mahadevan   if(ng) *ng = ((DM_Moab*)dm->data)->nghost;
802212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
803212ad6d1SVijay Mahadevan }
804212ad6d1SVijay Mahadevan 
805212ad6d1SVijay Mahadevan 
806212ad6d1SVijay Mahadevan #undef __FUNCT__
8074920ab11SVijay Mahadevan #define __FUNCT__ "DMMoabGetDimension"
8084920ab11SVijay Mahadevan /*@
8094920ab11SVijay Mahadevan   DMMoabGetDimension - Get the dimension of the DM Mesh
8104920ab11SVijay Mahadevan 
8114920ab11SVijay Mahadevan   Collective on MPI_Comm
8124920ab11SVijay Mahadevan 
8134920ab11SVijay Mahadevan   Input Parameter:
8144920ab11SVijay Mahadevan . dm - The DMMoab object being set
8154920ab11SVijay Mahadevan 
8164920ab11SVijay Mahadevan   Output Parameter:
8174920ab11SVijay Mahadevan . dim - The dimension of DM
8184920ab11SVijay Mahadevan 
8194920ab11SVijay Mahadevan   Level: beginner
8204920ab11SVijay Mahadevan 
8214920ab11SVijay Mahadevan .keywords: DMMoab, create
8224920ab11SVijay Mahadevan @*/
8234920ab11SVijay Mahadevan PetscErrorCode DMMoabGetDimension(DM dm,PetscInt *dim)
8244920ab11SVijay Mahadevan {
8254920ab11SVijay Mahadevan   PetscFunctionBegin;
8264920ab11SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8274920ab11SVijay Mahadevan   *dim = ((DM_Moab*)dm->data)->dim;
8284920ab11SVijay Mahadevan   PetscFunctionReturn(0);
8294920ab11SVijay Mahadevan }
8304920ab11SVijay Mahadevan 
8314920ab11SVijay Mahadevan 
8324920ab11SVijay Mahadevan 
8334920ab11SVijay Mahadevan #undef __FUNCT__
8341cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector"
8351cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
8361cec0304SVijay Mahadevan {
8371cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8381cec0304SVijay Mahadevan   moab::Tag     vtag,ntag;
839212ad6d1SVijay Mahadevan   const PetscScalar *varray;
840212ad6d1SVijay Mahadevan   PetscScalar *farray;
8411cec0304SVijay Mahadevan   moab::ErrorCode merr;
8421cec0304SVijay Mahadevan   PetscErrorCode  ierr;
8431cec0304SVijay Mahadevan   PetscInt doff;
8441cec0304SVijay Mahadevan   std::string tag_name;
8451cec0304SVijay Mahadevan   moab::Range::iterator iter;
8461cec0304SVijay Mahadevan 
8471cec0304SVijay Mahadevan   PetscFunctionBegin;
8481cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8491cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8501cec0304SVijay Mahadevan 
8511cec0304SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
8521cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
8531cec0304SVijay Mahadevan                                           moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
8541cec0304SVijay Mahadevan 
8551cec0304SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
8561cec0304SVijay Mahadevan 
8571cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
8581cec0304SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
859212ad6d1SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
860212ad6d1SVijay Mahadevan 
8611cec0304SVijay Mahadevan     for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
8621cec0304SVijay Mahadevan       moab::EntityHandle vtx = (*iter);
8631cec0304SVijay Mahadevan 
8641cec0304SVijay Mahadevan       /* get field dof index */
865212ad6d1SVijay Mahadevan       ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff);
8661cec0304SVijay Mahadevan 
8671cec0304SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
8681cec0304SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr);
8691cec0304SVijay Mahadevan     }
870212ad6d1SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
8711cec0304SVijay Mahadevan   }
8721cec0304SVijay Mahadevan   else {
873212ad6d1SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr);
8741cec0304SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
875212ad6d1SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr);
876212ad6d1SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
8771cec0304SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
8781cec0304SVijay Mahadevan     merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
879212ad6d1SVijay Mahadevan     ierr = PetscFree(farray);CHKERRQ(ierr);
880212ad6d1SVijay Mahadevan   }
881212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
882212ad6d1SVijay Mahadevan }
883212ad6d1SVijay Mahadevan 
884212ad6d1SVijay Mahadevan 
885212ad6d1SVijay Mahadevan #undef __FUNCT__
886212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector"
887212ad6d1SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
888212ad6d1SVijay Mahadevan {
889212ad6d1SVijay Mahadevan   DM_Moab        *dmmoab;
890212ad6d1SVijay Mahadevan   moab::Tag     vtag,ntag;
891212ad6d1SVijay Mahadevan   const PetscScalar   *varray;
892212ad6d1SVijay Mahadevan   PetscScalar   *farray;
893212ad6d1SVijay Mahadevan   moab::ErrorCode merr;
894212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
895212ad6d1SVijay Mahadevan   PetscSection section;
896212ad6d1SVijay Mahadevan   PetscInt i,doff,ifield;
897212ad6d1SVijay Mahadevan   std::string tag_name;
898212ad6d1SVijay Mahadevan   moab::Range::iterator iter;
899212ad6d1SVijay Mahadevan 
900212ad6d1SVijay Mahadevan   PetscFunctionBegin;
901212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
902212ad6d1SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
903212ad6d1SVijay Mahadevan 
904212ad6d1SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
905212ad6d1SVijay Mahadevan 
906212ad6d1SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
907212ad6d1SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
908212ad6d1SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
909212ad6d1SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
910212ad6d1SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
911212ad6d1SVijay Mahadevan 
912212ad6d1SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
913212ad6d1SVijay Mahadevan     for (ifield=0; ifield<dmmoab->nfields; ++ifield) {
914212ad6d1SVijay Mahadevan 
915212ad6d1SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
916212ad6d1SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
917212ad6d1SVijay Mahadevan                                             moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
918212ad6d1SVijay Mahadevan 
919212ad6d1SVijay Mahadevan       for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
920212ad6d1SVijay Mahadevan         moab::EntityHandle vtx = (*iter);
921212ad6d1SVijay Mahadevan 
922212ad6d1SVijay Mahadevan         /* get field dof index */
923212ad6d1SVijay Mahadevan         ierr = DMMoabGetFieldDof(dm, vtx, ifield, &doff);
924212ad6d1SVijay Mahadevan 
925212ad6d1SVijay Mahadevan         /* use the entity handle and the Dof index to set the right value */
926212ad6d1SVijay Mahadevan         merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr);
927212ad6d1SVijay Mahadevan       }
928212ad6d1SVijay Mahadevan     }
929212ad6d1SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
930212ad6d1SVijay Mahadevan   }
931212ad6d1SVijay Mahadevan   else {
932212ad6d1SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr);
933212ad6d1SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*dmmoab->bs*sizeof(PetscScalar),&varray);CHKERRQ(ierr);
934212ad6d1SVijay Mahadevan 
935212ad6d1SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
936212ad6d1SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
937212ad6d1SVijay Mahadevan     for (ifield=0; ifield<dmmoab->nfields; ++ifield) {
938212ad6d1SVijay Mahadevan 
939212ad6d1SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
940212ad6d1SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
941212ad6d1SVijay Mahadevan                                             moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
942212ad6d1SVijay Mahadevan 
943212ad6d1SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
944212ad6d1SVijay Mahadevan       for(i=0; i < dmmoab->nloc; i++) {
945212ad6d1SVijay Mahadevan         farray[i] = varray[i*dmmoab->bs+ifield];
946212ad6d1SVijay Mahadevan       }
947212ad6d1SVijay Mahadevan 
948212ad6d1SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
949212ad6d1SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
950212ad6d1SVijay Mahadevan       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
951212ad6d1SVijay Mahadevan     }
952212ad6d1SVijay Mahadevan     ierr = PetscFree(farray);CHKERRQ(ierr);
9531cec0304SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
9541cec0304SVijay Mahadevan   }
9551cec0304SVijay Mahadevan   PetscFunctionReturn(0);
9561cec0304SVijay Mahadevan }
9571cec0304SVijay Mahadevan 
9581cec0304SVijay Mahadevan 
959212ad6d1SVijay Mahadevan 
9601cec0304SVijay Mahadevan #undef __FUNCT__
9617023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
9627023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
9637023aa44SVijay Mahadevan {
9647023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
9657023aa44SVijay Mahadevan   PetscErrorCode  ierr;
9667023aa44SVijay Mahadevan   moab::ErrorCode merr;
9677023aa44SVijay Mahadevan 
9687023aa44SVijay Mahadevan   PetscFunctionBegin;
9697023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9707023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
9717023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
9727023aa44SVijay Mahadevan 
9737023aa44SVijay Mahadevan   if (!vpos) {
9747023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
9757023aa44SVijay Mahadevan   }
9767023aa44SVijay Mahadevan 
9777023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
9787023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
9797023aa44SVijay Mahadevan   PetscFunctionReturn(0);
9807023aa44SVijay Mahadevan }
9817023aa44SVijay Mahadevan 
9827023aa44SVijay Mahadevan 
9837023aa44SVijay Mahadevan #undef __FUNCT__
984*8d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexConnectivity"
985*8d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
986*8d8d51c8SVijay Mahadevan {
987*8d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
988*8d8d51c8SVijay Mahadevan   std::vector<moab::EntityHandle> adj_entities,connect;
989*8d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
990*8d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
991*8d8d51c8SVijay Mahadevan 
992*8d8d51c8SVijay Mahadevan   PetscFunctionBegin;
993*8d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
994*8d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
995*8d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
996*8d8d51c8SVijay Mahadevan 
997*8d8d51c8SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
998*8d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_adjacencies(&ehandle, 1, 1, true, adj_entities, moab::Interface::UNION);MBERRNM(merr);
999*8d8d51c8SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(&adj_entities[0],adj_entities.size(),connect);MBERRNM(merr);
1000*8d8d51c8SVijay Mahadevan 
1001*8d8d51c8SVijay Mahadevan #if 0
1002*8d8d51c8SVijay Mahadevan   for(unsigned int jter = 0; jter < connect.size(); jter++) {
1003*8d8d51c8SVijay Mahadevan     PetscPrintf(PETSC_COMM_SELF,"Handle=%D\tAdj_Size=%D\tAdj_Entity=%D\n",ehandle,connect.size(),connect[jter]);
1004*8d8d51c8SVijay Mahadevan   }
1005*8d8d51c8SVijay Mahadevan #endif
1006*8d8d51c8SVijay Mahadevan 
1007*8d8d51c8SVijay Mahadevan   if (conn) {
1008*8d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(moab::EntityHandle)*connect.size(), conn);CHKERRQ(ierr);
1009*8d8d51c8SVijay Mahadevan     ierr = PetscMemcpy(*conn, &connect[0], sizeof(moab::EntityHandle)*connect.size());CHKERRQ(ierr);
1010*8d8d51c8SVijay Mahadevan   }
1011*8d8d51c8SVijay Mahadevan   if (nconn) *nconn=connect.size();
1012*8d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
1013*8d8d51c8SVijay Mahadevan }
1014*8d8d51c8SVijay Mahadevan 
1015*8d8d51c8SVijay Mahadevan 
1016*8d8d51c8SVijay Mahadevan #undef __FUNCT__
1017*8d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabRestoreVertexConnectivity"
1018*8d8d51c8SVijay Mahadevan PetscErrorCode DMMoabRestoreVertexConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn, moab::EntityHandle **conn)
1019*8d8d51c8SVijay Mahadevan {
1020*8d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
1021*8d8d51c8SVijay Mahadevan 
1022*8d8d51c8SVijay Mahadevan   PetscFunctionBegin;
1023*8d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1024*8d8d51c8SVijay Mahadevan   PetscValidPointer(conn,4);
1025*8d8d51c8SVijay Mahadevan 
1026*8d8d51c8SVijay Mahadevan   if (conn) {
1027*8d8d51c8SVijay Mahadevan     ierr = PetscFree(*conn);CHKERRQ(ierr);
1028*8d8d51c8SVijay Mahadevan   }
1029*8d8d51c8SVijay Mahadevan   if (nconn) *nconn=0;
1030*8d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
1031*8d8d51c8SVijay Mahadevan }
1032*8d8d51c8SVijay Mahadevan 
1033*8d8d51c8SVijay Mahadevan 
1034*8d8d51c8SVijay Mahadevan 
1035*8d8d51c8SVijay Mahadevan #undef __FUNCT__
10367023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
10377023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
10387023aa44SVijay Mahadevan {
10397023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
10407023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
10417023aa44SVijay Mahadevan   moab::ErrorCode merr;
10427023aa44SVijay Mahadevan   PetscInt nnodes;
10437023aa44SVijay Mahadevan 
10447023aa44SVijay Mahadevan   PetscFunctionBegin;
10457023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
10467023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
10477023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
10487023aa44SVijay Mahadevan 
10497023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
10507023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
10517023aa44SVijay Mahadevan   if (conn) *conn=connect;
10527023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
10537023aa44SVijay Mahadevan   PetscFunctionReturn(0);
10547023aa44SVijay Mahadevan }
10557023aa44SVijay Mahadevan 
10567023aa44SVijay Mahadevan 
10577023aa44SVijay Mahadevan #undef __FUNCT__
105869263071SVijay Mahadevan #define __FUNCT__ "DMMoabIsEntityOnBoundary"
105969263071SVijay Mahadevan PetscErrorCode DMMoabIsEntityOnBoundary(DM dm,const moab::EntityHandle ent,PetscBool* ent_on_boundary)
106069263071SVijay Mahadevan {
106169263071SVijay Mahadevan   moab::EntityType etype;
106269263071SVijay Mahadevan   DM_Moab         *dmmoab;
106369263071SVijay Mahadevan   PetscInt         edim;
106469263071SVijay Mahadevan 
106569263071SVijay Mahadevan   PetscFunctionBegin;
106669263071SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
106769263071SVijay Mahadevan   PetscValidPointer(ent_on_boundary,3);
106869263071SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
106969263071SVijay Mahadevan 
107069263071SVijay Mahadevan   /* get the entity type and handle accordingly */
107169263071SVijay Mahadevan   etype=dmmoab->mbiface->type_from_handle(ent);
107269263071SVijay 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);
107369263071SVijay Mahadevan 
107469263071SVijay Mahadevan   /* get the entity dimension */
107569263071SVijay Mahadevan   edim=dmmoab->mbiface->dimension_from_handle(ent);
107669263071SVijay Mahadevan 
107769263071SVijay Mahadevan   *ent_on_boundary=PETSC_FALSE;
107869263071SVijay Mahadevan   if(etype == moab::MBVERTEX && edim == 0) {
1079*8d8d51c8SVijay Mahadevan     if (ent < (*dmmoab->vlocal)[0] || ent > (*dmmoab->vlocal)[dmmoab->nloc-1]) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Invalid boundary vertex entity handle: %D\n",ent);
1080*8d8d51c8SVijay Mahadevan     *ent_on_boundary=dmmoab->isbndyvtx[(PetscInt)ent-1];
108169263071SVijay Mahadevan   }
108269263071SVijay Mahadevan   else {
108369263071SVijay Mahadevan     if (edim == dmmoab->dim) {  /* check the higher-dimensional elements first */
1084*8d8d51c8SVijay Mahadevan       if (ent < (*dmmoab->elocal)[0] || ent > (*dmmoab->elocal)[dmmoab->neleloc-1]) SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Invalid boundary element entity handle: %D\n",ent);
1085*8d8d51c8SVijay Mahadevan       *ent_on_boundary=dmmoab->isbndyelems[(PetscInt)ent-1];
108669263071SVijay Mahadevan     }
108769263071SVijay Mahadevan     else {                      /* next check the lower-dimensional faces */
108869263071SVijay Mahadevan       moab::Range::const_iterator gfiter = dmmoab->bndyfaces->find(ent);
108969263071SVijay Mahadevan       if (gfiter != dmmoab->bndyfaces->end()) *ent_on_boundary=PETSC_TRUE;
109069263071SVijay Mahadevan     }
109169263071SVijay Mahadevan   }
109269263071SVijay Mahadevan   PetscFunctionReturn(0);
109369263071SVijay Mahadevan }
109469263071SVijay Mahadevan 
109569263071SVijay Mahadevan 
109669263071SVijay Mahadevan #undef __FUNCT__
10977023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
109869263071SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx)
10997023aa44SVijay Mahadevan {
11007023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
11017023aa44SVijay Mahadevan   PetscInt       i;
11027023aa44SVijay Mahadevan 
11037023aa44SVijay Mahadevan   PetscFunctionBegin;
11047023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
11057023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
11067023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
11077023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
11087023aa44SVijay Mahadevan 
11097023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
11107023aa44SVijay Mahadevan     moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]);
111169263071SVijay Mahadevan     if (giter != dmmoab->bndyvtx->end()) isbdvtx[i] = PETSC_TRUE;
11127023aa44SVijay Mahadevan     else isbdvtx[i] = PETSC_FALSE;
11137023aa44SVijay Mahadevan   }
11147023aa44SVijay Mahadevan   PetscFunctionReturn(0);
11157023aa44SVijay Mahadevan }
11167023aa44SVijay Mahadevan 
11177023aa44SVijay Mahadevan 
11187023aa44SVijay Mahadevan #undef __FUNCT__
11191cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities"
112069263071SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces,moab::Range* bdelems)
11211cec0304SVijay Mahadevan {
11221cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
11231cec0304SVijay Mahadevan 
11241cec0304SVijay Mahadevan   PetscFunctionBegin;
11251cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
11261cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
11271cec0304SVijay Mahadevan 
11281cec0304SVijay Mahadevan   if (bdvtx)  *bdvtx = *dmmoab->bndyvtx;
11291cec0304SVijay Mahadevan   if (bdfaces)  *bdfaces = *dmmoab->bndyfaces;
113069263071SVijay Mahadevan   if (bdelems)  *bdfaces = *dmmoab->bndyelems;
11311cec0304SVijay Mahadevan   PetscFunctionReturn(0);
11321cec0304SVijay Mahadevan }
11331cec0304SVijay Mahadevan 
11341cec0304SVijay Mahadevan 
11351cec0304SVijay Mahadevan #undef __FUNCT__
11361cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields"
11371cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields)
11381cec0304SVijay Mahadevan {
11391cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
11401cec0304SVijay Mahadevan 
11411cec0304SVijay Mahadevan   PetscFunctionBegin;
11421cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
11431cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
11441cec0304SVijay Mahadevan 
11451cec0304SVijay Mahadevan   dmmoab->fields = fields;
11461cec0304SVijay Mahadevan   dmmoab->nfields = nfields;
11471cec0304SVijay Mahadevan   PetscFunctionReturn(0);
11481cec0304SVijay Mahadevan }
11491cec0304SVijay Mahadevan 
11501cec0304SVijay Mahadevan 
11511cec0304SVijay Mahadevan #undef __FUNCT__
11521cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
11531cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
11541cec0304SVijay Mahadevan {
11551cec0304SVijay Mahadevan   PetscSection section;
1156fc418013SVijay Mahadevan   PetscInt gid;
11571cec0304SVijay Mahadevan   PetscErrorCode ierr;
1158fc418013SVijay Mahadevan   moab::ErrorCode merr;
1159fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
11601cec0304SVijay Mahadevan 
11611cec0304SVijay Mahadevan   PetscFunctionBegin;
11621cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1163fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1164fc418013SVijay Mahadevan 
11651cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
1166fc418013SVijay Mahadevan 
1167fc418013SVijay Mahadevan   /* first get the global ID for the point */
1168fc418013SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,&point,1,&gid);MBERRNM(merr);
1169fc418013SVijay Mahadevan 
1170fc418013SVijay Mahadevan   /* get the dof value for the field */
1171fc418013SVijay Mahadevan   ierr = PetscSectionGetFieldDof(section, gid, field, dof);CHKERRQ(ierr);
11721cec0304SVijay Mahadevan   PetscFunctionReturn(0);
11731cec0304SVijay Mahadevan }
11741cec0304SVijay Mahadevan 
11751cec0304SVijay Mahadevan 
11761cec0304SVijay Mahadevan #undef __FUNCT__
11771cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
11781cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
11791cec0304SVijay Mahadevan {
1180fc418013SVijay Mahadevan   PetscInt i,gid;
11811cec0304SVijay Mahadevan   PetscSection section;
11821cec0304SVijay Mahadevan   PetscErrorCode  ierr;
1183fc418013SVijay Mahadevan   moab::ErrorCode merr;
1184fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
11851cec0304SVijay Mahadevan 
11861cec0304SVijay Mahadevan   PetscFunctionBegin;
11871cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1188324f1edfSVijay Mahadevan   PetscValidPointer(points,2);
1189fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1190fc418013SVijay Mahadevan 
11911cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
11921cec0304SVijay Mahadevan   if (!dof) {
1193*8d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
11941cec0304SVijay Mahadevan   }
1195fc418013SVijay Mahadevan 
1196fc418013SVijay Mahadevan   /* first get the local indices */
1197fc418013SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr);
1198fc418013SVijay Mahadevan 
11991cec0304SVijay Mahadevan   for (i=0; i<npoints; ++i) {
1200fc418013SVijay Mahadevan     gid=dof[i];
1201fc418013SVijay Mahadevan     ierr = PetscSectionGetFieldDof(section, gid, field, &dof[i]);CHKERRQ(ierr);
12021cec0304SVijay Mahadevan   }
12031cec0304SVijay Mahadevan   PetscFunctionReturn(0);
12041cec0304SVijay Mahadevan }
12051cec0304SVijay Mahadevan 
12061cec0304SVijay Mahadevan 
1207fc418013SVijay Mahadevan #undef __FUNCT__
1208212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal"
1209212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
1210eb9d2429SVijay Mahadevan {
1211eb9d2429SVijay Mahadevan   PetscInt i,offset;
1212eb9d2429SVijay Mahadevan   PetscErrorCode  ierr;
1213eb9d2429SVijay Mahadevan   DM_Moab        *dmmoab;
1214eb9d2429SVijay Mahadevan 
1215eb9d2429SVijay Mahadevan   PetscFunctionBegin;
1216eb9d2429SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1217324f1edfSVijay Mahadevan   PetscValidPointer(points,2);
1218eb9d2429SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1219eb9d2429SVijay Mahadevan 
1220eb9d2429SVijay Mahadevan   if (!dof) {
1221*8d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
1222eb9d2429SVijay Mahadevan   }
1223eb9d2429SVijay Mahadevan 
1224eb9d2429SVijay Mahadevan   if (dmmoab->bs > 1) {
1225eb9d2429SVijay Mahadevan     for (i=0; i<npoints; ++i)
1226eb9d2429SVijay Mahadevan       dof[i] = (points[i]-1)*dmmoab->bs+field;
1227eb9d2429SVijay Mahadevan   }
1228eb9d2429SVijay Mahadevan   else {
1229eb9d2429SVijay Mahadevan     offset = field*dmmoab->n; /* assume all fields have equal distribution */
1230eb9d2429SVijay Mahadevan     for (i=0; i<npoints; ++i)
1231eb9d2429SVijay Mahadevan       dof[i] = offset+points[i]-1;
1232eb9d2429SVijay Mahadevan   }
1233eb9d2429SVijay Mahadevan   PetscFunctionReturn(0);
1234eb9d2429SVijay Mahadevan }
1235eb9d2429SVijay Mahadevan 
1236eb9d2429SVijay Mahadevan 
1237eb9d2429SVijay Mahadevan #undef __FUNCT__
1238212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs"
1239212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
1240212ad6d1SVijay Mahadevan {
1241212ad6d1SVijay Mahadevan   PetscInt i,f,gid;
1242212ad6d1SVijay Mahadevan   PetscSection section;
1243212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
1244212ad6d1SVijay Mahadevan   moab::ErrorCode merr;
1245212ad6d1SVijay Mahadevan   DM_Moab        *dmmoab;
1246212ad6d1SVijay Mahadevan 
1247212ad6d1SVijay Mahadevan   PetscFunctionBegin;
1248212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1249324f1edfSVijay Mahadevan   PetscValidPointer(points,2);
1250212ad6d1SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1251212ad6d1SVijay Mahadevan 
1252212ad6d1SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
1253212ad6d1SVijay Mahadevan   if (!dof) {
1254*8d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr);
1255212ad6d1SVijay Mahadevan   }
1256212ad6d1SVijay Mahadevan 
1257212ad6d1SVijay Mahadevan   /* first get the local indices */
1258212ad6d1SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr);
1259212ad6d1SVijay Mahadevan 
1260212ad6d1SVijay Mahadevan   for (i=0; i<npoints; ++i) {
1261212ad6d1SVijay Mahadevan     gid=dof[i];
1262212ad6d1SVijay Mahadevan     for (f=0; f<dmmoab->nfields; ++f) {
1263212ad6d1SVijay Mahadevan       ierr = PetscSectionGetFieldDof(section, gid, f, &dof[i*dmmoab->nfields+f]);CHKERRQ(ierr);
1264212ad6d1SVijay Mahadevan     }
1265212ad6d1SVijay Mahadevan   }
1266212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
1267212ad6d1SVijay Mahadevan }
1268212ad6d1SVijay Mahadevan 
1269212ad6d1SVijay Mahadevan 
1270212ad6d1SVijay Mahadevan #undef __FUNCT__
1271212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal"
1272212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
1273212ad6d1SVijay Mahadevan {
1274212ad6d1SVijay Mahadevan   PetscInt        i,f,offset;
1275212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
1276212ad6d1SVijay Mahadevan   DM_Moab        *dmmoab;
1277212ad6d1SVijay Mahadevan 
1278212ad6d1SVijay Mahadevan   PetscFunctionBegin;
1279212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1280324f1edfSVijay Mahadevan   PetscValidPointer(points,2);
1281212ad6d1SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1282212ad6d1SVijay Mahadevan 
1283212ad6d1SVijay Mahadevan   if (!dof) {
1284*8d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->nfields*npoints, &dof);CHKERRQ(ierr);
1285212ad6d1SVijay Mahadevan   }
1286212ad6d1SVijay Mahadevan 
1287212ad6d1SVijay Mahadevan   if (dmmoab->bs > 1) {
1288212ad6d1SVijay Mahadevan     for (f=0; f<dmmoab->nfields; ++f)
1289212ad6d1SVijay Mahadevan       for (i=0; i<npoints; ++i)
1290212ad6d1SVijay Mahadevan         dof[i*dmmoab->nfields+f] = (points[i]-1)*dmmoab->bs+f;
1291212ad6d1SVijay Mahadevan   }
1292212ad6d1SVijay Mahadevan   else {
1293212ad6d1SVijay Mahadevan     for (f=0; f<dmmoab->nfields; ++f) {
1294212ad6d1SVijay Mahadevan       offset = f*dmmoab->n;     /* assume all fields have equal distribution - say all vertex based */
1295212ad6d1SVijay Mahadevan       for (i=0; i<npoints; ++i)
1296212ad6d1SVijay Mahadevan         dof[i*dmmoab->nfields+f] = offset+points[i]-1;
1297212ad6d1SVijay Mahadevan     }
1298212ad6d1SVijay Mahadevan   }
1299212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
1300212ad6d1SVijay Mahadevan }
1301212ad6d1SVijay Mahadevan 
1302212ad6d1SVijay Mahadevan 
1303212ad6d1SVijay Mahadevan #undef __FUNCT__
1304212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked"
1305212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
1306212ad6d1SVijay Mahadevan {
1307212ad6d1SVijay Mahadevan   PetscInt i,gid,dofindx;
1308212ad6d1SVijay Mahadevan   PetscSection section;
1309212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
1310212ad6d1SVijay Mahadevan   moab::ErrorCode merr;
1311212ad6d1SVijay Mahadevan   DM_Moab        *dmmoab;
1312212ad6d1SVijay Mahadevan 
1313212ad6d1SVijay Mahadevan   PetscFunctionBegin;
1314212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1315324f1edfSVijay Mahadevan   PetscValidPointer(points,2);
1316212ad6d1SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1317212ad6d1SVijay Mahadevan 
1318212ad6d1SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
1319212ad6d1SVijay Mahadevan   if (!dof) {
1320*8d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
1321212ad6d1SVijay Mahadevan   }
1322212ad6d1SVijay Mahadevan 
1323212ad6d1SVijay Mahadevan   /* first get the local indices */
1324212ad6d1SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,points,npoints,dof);MBERRNM(merr);
1325212ad6d1SVijay Mahadevan 
1326212ad6d1SVijay Mahadevan   for (i=0; i<npoints; ++i) {
1327212ad6d1SVijay Mahadevan     gid=dof[i];
1328212ad6d1SVijay Mahadevan     ierr = PetscSectionGetFieldDof(section, gid, 0, &dofindx);CHKERRQ(ierr);
1329212ad6d1SVijay Mahadevan     if (dmmoab->bs > 1)  dof[i]=dofindx/dmmoab->bs;
1330212ad6d1SVijay Mahadevan     else dof[i]=dofindx;
1331212ad6d1SVijay Mahadevan   }
1332212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
1333212ad6d1SVijay Mahadevan }
1334212ad6d1SVijay Mahadevan 
1335212ad6d1SVijay Mahadevan 
1336212ad6d1SVijay Mahadevan #undef __FUNCT__
1337212ad6d1SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal"
1338212ad6d1SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
1339212ad6d1SVijay Mahadevan {
1340212ad6d1SVijay Mahadevan   PetscInt        i;
1341212ad6d1SVijay Mahadevan   PetscErrorCode  ierr;
1342212ad6d1SVijay Mahadevan 
1343212ad6d1SVijay Mahadevan   PetscFunctionBegin;
1344212ad6d1SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1345324f1edfSVijay Mahadevan   PetscValidPointer(points,2);
1346212ad6d1SVijay Mahadevan 
1347212ad6d1SVijay Mahadevan   if (!dof) {
1348*8d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
1349212ad6d1SVijay Mahadevan   }
1350212ad6d1SVijay Mahadevan 
1351212ad6d1SVijay Mahadevan   for (i=0; i<npoints; ++i)
1352212ad6d1SVijay Mahadevan     dof[i] = points[i]-1;
1353212ad6d1SVijay Mahadevan   PetscFunctionReturn(0);
1354212ad6d1SVijay Mahadevan }
1355212ad6d1SVijay Mahadevan 
1356*8d8d51c8SVijay Mahadevan 
1357*8d8d51c8SVijay Mahadevan #undef __FUNCT__
1358*8d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlocked"
1359*8d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof)
1360*8d8d51c8SVijay Mahadevan {
1361*8d8d51c8SVijay Mahadevan   PetscInt        i,gid;
1362*8d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
1363*8d8d51c8SVijay Mahadevan   PetscSection section;
1364*8d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
1365*8d8d51c8SVijay Mahadevan   moab::ErrorCode merr;
1366*8d8d51c8SVijay Mahadevan 
1367*8d8d51c8SVijay Mahadevan   PetscFunctionBegin;
1368*8d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1369*8d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1370*8d8d51c8SVijay Mahadevan 
1371*8d8d51c8SVijay Mahadevan   *dof = dmmoab->gsindices;
1372*8d8d51c8SVijay Mahadevan 
1373*8d8d51c8SVijay Mahadevan   if (false) {
1374*8d8d51c8SVijay Mahadevan     if (!dof) {
1375*8d8d51c8SVijay Mahadevan       ierr = PetscMalloc(sizeof(PetscInt)*(dmmoab->nloc+dmmoab->nghost), dof);CHKERRQ(ierr);
1376*8d8d51c8SVijay Mahadevan     }
1377*8d8d51c8SVijay Mahadevan 
1378*8d8d51c8SVijay Mahadevan     /* first get the local indices */
1379*8d8d51c8SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vlocal,*dof);MBERRNM(merr);
1380*8d8d51c8SVijay Mahadevan 
1381*8d8d51c8SVijay Mahadevan     ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
1382*8d8d51c8SVijay Mahadevan 
1383*8d8d51c8SVijay Mahadevan     /* Compute function over the locally owned part of the grid */
1384*8d8d51c8SVijay Mahadevan     for(i=0; i<dmmoab->nloc+dmmoab->nghost; i++) {
1385*8d8d51c8SVijay Mahadevan       gid=(*dof)[i];
1386*8d8d51c8SVijay Mahadevan       ierr = PetscSectionGetFieldDof(section, gid, 0, &(*dof)[i]);CHKERRQ(ierr);
1387*8d8d51c8SVijay Mahadevan     }
1388*8d8d51c8SVijay Mahadevan   }
1389*8d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
1390*8d8d51c8SVijay Mahadevan }
1391*8d8d51c8SVijay Mahadevan 
1392*8d8d51c8SVijay Mahadevan 
1393*8d8d51c8SVijay Mahadevan #undef __FUNCT__
1394*8d8d51c8SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlockedLocal"
1395*8d8d51c8SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof)
1396*8d8d51c8SVijay Mahadevan {
1397*8d8d51c8SVijay Mahadevan   PetscInt        i;
1398*8d8d51c8SVijay Mahadevan   DM_Moab        *dmmoab;
1399*8d8d51c8SVijay Mahadevan   PetscErrorCode  ierr;
1400*8d8d51c8SVijay Mahadevan 
1401*8d8d51c8SVijay Mahadevan   PetscFunctionBegin;
1402*8d8d51c8SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1403*8d8d51c8SVijay Mahadevan   PetscValidPointer(dof,2);
1404*8d8d51c8SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1405*8d8d51c8SVijay Mahadevan 
1406*8d8d51c8SVijay Mahadevan   if (!(*dof)) {
1407*8d8d51c8SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*(dmmoab->nloc+dmmoab->nghost), dof);CHKERRQ(ierr);
1408*8d8d51c8SVijay Mahadevan   }
1409*8d8d51c8SVijay Mahadevan 
1410*8d8d51c8SVijay Mahadevan   i=0;
1411*8d8d51c8SVijay Mahadevan   /* Compute function over the locally owned part of the grid */
1412*8d8d51c8SVijay Mahadevan   for(moab::Range::iterator iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++,i++) {
1413*8d8d51c8SVijay Mahadevan     (*dof)[i] = (*iter)-1;
1414*8d8d51c8SVijay Mahadevan   }
1415*8d8d51c8SVijay Mahadevan   for(moab::Range::iterator iter = dmmoab->vghost->begin(); iter != dmmoab->vghost->end(); iter++,i++) {
1416*8d8d51c8SVijay Mahadevan     (*dof)[i] = (*iter)-1;
1417*8d8d51c8SVijay Mahadevan   }
1418*8d8d51c8SVijay Mahadevan   PetscFunctionReturn(0);
1419*8d8d51c8SVijay Mahadevan }
1420*8d8d51c8SVijay Mahadevan 
1421*8d8d51c8SVijay Mahadevan 
1422212ad6d1SVijay Mahadevan #undef __FUNCT__
1423fc418013SVijay Mahadevan #define __FUNCT__ "DMMoab_GetWriteOptions_Private"
1424fc418013SVijay Mahadevan PetscErrorCode DMMoab_GetWriteOptions_Private(PetscInt fsetid, PetscInt numproc, PetscInt dim, MoabWriteMode mode, PetscInt dbglevel, const char* extra_opts, const char** write_opts)
1425fc418013SVijay Mahadevan {
1426fc418013SVijay Mahadevan   std::ostringstream str;
1427fc418013SVijay Mahadevan 
1428fc418013SVijay Mahadevan   PetscFunctionBegin;
1429fc418013SVijay Mahadevan 
1430fc418013SVijay Mahadevan   // do parallel read unless only one processor
1431fc418013SVijay Mahadevan   if (numproc > 1) {
1432fc418013SVijay Mahadevan     str << "PARALLEL=" << mode << ";";
1433fc418013SVijay Mahadevan     if (fsetid>=0) str << "PARALLEL_COMM=" << fsetid << ";";
1434fc418013SVijay Mahadevan   }
1435fc418013SVijay Mahadevan 
1436fc418013SVijay Mahadevan   if (dbglevel)
1437fc418013SVijay Mahadevan     str << "CPUTIME;DEBUG_IO=" << dbglevel << ";";
1438fc418013SVijay Mahadevan 
1439fc418013SVijay Mahadevan   if (extra_opts)
1440fc418013SVijay Mahadevan     str << extra_opts ;
1441fc418013SVijay Mahadevan 
1442fc418013SVijay Mahadevan   *write_opts = str.str().c_str();
1443fc418013SVijay Mahadevan   PetscFunctionReturn(0);
1444fc418013SVijay Mahadevan }
1445fc418013SVijay Mahadevan 
1446fc418013SVijay Mahadevan 
1447fc418013SVijay Mahadevan #undef __FUNCT__
1448fc418013SVijay Mahadevan #define __FUNCT__ "DMMoabOutput"
1449fc418013SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* filename,const char* usrwriteopts)
1450fc418013SVijay Mahadevan {
1451fc418013SVijay Mahadevan   DM_Moab        *dmmoab;
1452fc418013SVijay Mahadevan   PetscInt       dbglevel=0;
1453fc418013SVijay Mahadevan   const char *writeopts;
1454fc418013SVijay Mahadevan 
1455fc418013SVijay Mahadevan   PetscErrorCode ierr;
1456fc418013SVijay Mahadevan   moab::ErrorCode merr;
1457fc418013SVijay Mahadevan 
1458fc418013SVijay Mahadevan   PetscFunctionBegin;
1459fc418013SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1460fc418013SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1461fc418013SVijay Mahadevan 
1462fc418013SVijay Mahadevan   PetscBarrier((PetscObject)dm);
1463fc418013SVijay Mahadevan 
1464fc418013SVijay Mahadevan   /* TODO: Use command-line options to control by_rank, verbosity, MoabReadMode and extra options */
1465fc418013SVijay Mahadevan   ierr  = PetscOptionsBegin(PETSC_COMM_WORLD, "", "Options for reading/writing MOAB based meshes from file", "DMMoab");
1466fc418013SVijay Mahadevan   ierr  = PetscOptionsInt("-dmmb_rw_dbg", "The verbosity level for reading and writing MOAB meshes", "dmmbutil.cxx", dbglevel, &dbglevel, NULL);CHKERRQ(ierr);
1467fc418013SVijay Mahadevan   ierr  = PetscOptionsEnd();
1468fc418013SVijay Mahadevan 
1469fc418013SVijay Mahadevan   /* add mesh loading options specific to the DM */
1470fc418013SVijay Mahadevan   ierr = DMMoab_GetWriteOptions_Private(dmmoab->pcomm->get_id(), dmmoab->pcomm->size(), dmmoab->dim, MOAB_PARWOPTS_WRITE_PART, dbglevel, usrwriteopts, &writeopts);CHKERRQ(ierr);
1471fc418013SVijay Mahadevan   PetscInfo2(dm, "Writing file %s with options: %s\n",filename,writeopts);
1472fc418013SVijay Mahadevan 
1473fc418013SVijay Mahadevan   /* output file, using parallel write */
1474fc418013SVijay Mahadevan   merr = dmmoab->mbiface->write_file(filename, NULL, writeopts, &dmmoab->fileset, 1);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr);
1475fc418013SVijay Mahadevan   PetscFunctionReturn(0);
1476fc418013SVijay Mahadevan }
1477fc418013SVijay Mahadevan 
1478