xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 1cec0304154dc24c6cd49e0c7607a315ec6ede7d)
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>
6*1cec0304SVijay 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;
27*1cec0304SVijay Mahadevan   delete dmmoab->bndyvtx;
28*1cec0304SVijay Mahadevan   delete dmmoab->bndyfaces;
29032b8ab6SVijay Mahadevan   ierr = VecScatterDestroy(&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
30032b8ab6SVijay Mahadevan   ierr = ISLocalToGlobalMappingDestroy(&dmmoab->ltog_map);CHKERRQ(ierr);
31853cdec3SJed Brown   ierr = PetscFree(dm->data);CHKERRQ(ierr);
32853cdec3SJed Brown   PetscFunctionReturn(0);
33853cdec3SJed Brown }
34853cdec3SJed Brown 
35aa768e4cSTim Tautges #undef __FUNCT__
36032b8ab6SVijay Mahadevan #define __FUNCT__ "DMSetUp_Moab"
37032b8ab6SVijay Mahadevan PetscErrorCode DMSetUp_Moab(DM dm)
38032b8ab6SVijay Mahadevan {
39032b8ab6SVijay Mahadevan   PetscErrorCode          ierr;
40032b8ab6SVijay Mahadevan   moab::ErrorCode         merr;
41032b8ab6SVijay Mahadevan   Vec                     local, global;
42032b8ab6SVijay Mahadevan   IS                      from;
43032b8ab6SVijay Mahadevan   moab::Range::iterator   iter;
44*1cec0304SVijay Mahadevan   PetscInt                i,j,bs,gsiz,lsiz,*gsindices;
45032b8ab6SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
4672ff976dSVijay Mahadevan   PetscInt                totsize;
47*1cec0304SVijay Mahadevan   PetscSection            section;
48032b8ab6SVijay Mahadevan 
49032b8ab6SVijay Mahadevan   PetscFunctionBegin;
50032b8ab6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
51032b8ab6SVijay Mahadevan   /* Get the local and shared vertices and cache it */
52032b8ab6SVijay 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.");
53032b8ab6SVijay Mahadevan 
54032b8ab6SVijay Mahadevan   /* store the current mesh dimension */
55032b8ab6SVijay Mahadevan   merr = dmmoab->mbiface->get_dimension(dmmoab->dim);MBERRNM(merr);
56032b8ab6SVijay Mahadevan 
57*1cec0304SVijay Mahadevan   /* Get the entities recursively in the current part of the mesh, if user did not set the local vertices explicitly */
58032b8ab6SVijay Mahadevan   if (dmmoab->vlocal->empty()) {
59*1cec0304SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,*dmmoab->vlocal,true);MBERRNM(merr);
60032b8ab6SVijay Mahadevan     *dmmoab->vowned = *dmmoab->vlocal;
61032b8ab6SVijay Mahadevan 
62032b8ab6SVijay Mahadevan     /* filter based on parallel status */
63032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
64032b8ab6SVijay Mahadevan     *dmmoab->vghost = moab::subtract(*dmmoab->vlocal, *dmmoab->vowned);
65032b8ab6SVijay Mahadevan 
66032b8ab6SVijay Mahadevan     dmmoab->nloc = dmmoab->vowned->size();
67032b8ab6SVijay Mahadevan     dmmoab->nghost = dmmoab->vghost->size();
68032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
69032b8ab6SVijay Mahadevan   }
70032b8ab6SVijay Mahadevan 
71032b8ab6SVijay Mahadevan   /* get the information about the local elements in the mesh */
72032b8ab6SVijay Mahadevan   {
73032b8ab6SVijay Mahadevan     dmmoab->elocal->clear();
74032b8ab6SVijay Mahadevan     dmmoab->eghost->clear();
75*1cec0304SVijay Mahadevan     merr = dmmoab->mbiface->get_entities_by_dimension(dmmoab->fileset, dmmoab->dim, *dmmoab->elocal, true);CHKERRQ(merr);
76032b8ab6SVijay Mahadevan     *dmmoab->eghost = *dmmoab->elocal;
77032b8ab6SVijay Mahadevan     merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
78032b8ab6SVijay Mahadevan     *dmmoab->eghost = moab::subtract(*dmmoab->eghost, *dmmoab->elocal);
79032b8ab6SVijay Mahadevan 
80032b8ab6SVijay Mahadevan     dmmoab->neleloc = dmmoab->elocal->size();
81032b8ab6SVijay Mahadevan     ierr = MPI_Allreduce(&dmmoab->neleloc, &dmmoab->nele, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
82032b8ab6SVijay Mahadevan   }
83032b8ab6SVijay Mahadevan 
84032b8ab6SVijay Mahadevan   bs = dmmoab->bs;
85032b8ab6SVijay Mahadevan   if (!dmmoab->ltog_tag) {
86db66d124SVijay Mahadevan     /* Get the global ID tag. The global ID tag is applied to each
87db66d124SVijay Mahadevan        vertex. It acts as an global identifier which MOAB uses to
88db66d124SVijay Mahadevan        assemble the individual pieces of the mesh */
89032b8ab6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
90032b8ab6SVijay Mahadevan   }
91032b8ab6SVijay Mahadevan 
92032b8ab6SVijay Mahadevan   totsize=dmmoab->vlocal->size();
93032b8ab6SVijay Mahadevan   ierr = PetscMalloc(totsize*sizeof(PetscInt), &gsindices);CHKERRQ(ierr);
94*1cec0304SVijay Mahadevan   {
95032b8ab6SVijay Mahadevan     /* first get the local indices */
964a40b570SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vowned,&gsindices[0]);MBERRNM(merr);
974a40b570SVijay Mahadevan     /* next get the ghosted indices */
98*1cec0304SVijay Mahadevan     if (dmmoab->vghost->size()) {
994a40b570SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&gsindices[dmmoab->nloc]);MBERRNM(merr);
100*1cec0304SVijay Mahadevan     }
101*1cec0304SVijay Mahadevan   }
102032b8ab6SVijay Mahadevan 
103*1cec0304SVijay Mahadevan   {
104*1cec0304SVijay Mahadevan     ierr = PetscSectionCreate(((PetscObject)dm)->comm, &section);CHKERRQ(ierr);
105*1cec0304SVijay Mahadevan     ierr = PetscSectionSetNumFields(section, dmmoab->nfields);CHKERRQ(ierr);
106*1cec0304SVijay Mahadevan     ierr = PetscSectionSetChart(section, gsindices[0], gsindices[dmmoab->nloc-1]+1);CHKERRQ(ierr);
107*1cec0304SVijay Mahadevan     for (j=gsindices[0]; j<=gsindices[dmmoab->nloc-1]; ++j) {
108*1cec0304SVijay Mahadevan       for (i=0; i < dmmoab->nfields; ++i) {
109*1cec0304SVijay Mahadevan         ierr = PetscSectionSetFieldName(section, i, dmmoab->fields[i]);CHKERRQ(ierr);
110*1cec0304SVijay Mahadevan         if (bs>1) {
111*1cec0304SVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, j, i, j*dmmoab->nfields+i-1);CHKERRQ(ierr);
112*1cec0304SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, j, i, dmmoab->nfields);
113*1cec0304SVijay Mahadevan //          PetscPrintf(PETSC_COMM_WORLD, "Point %D, Field %D, DOF %D, OFFSET = %D\n", j, i, j*dmmoab->nfields+i, dmmoab->nfields);
114*1cec0304SVijay Mahadevan         }
115*1cec0304SVijay Mahadevan         else {
116*1cec0304SVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, j, i, totsize*i+j-1);CHKERRQ(ierr);
117*1cec0304SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, j, i, totsize);
118*1cec0304SVijay Mahadevan //          PetscPrintf(PETSC_COMM_WORLD, "Point %D, Field %D, DOF %D, OFFSET = %D\n", j, i, totsize*i+j, totsize);
119*1cec0304SVijay Mahadevan         }
120*1cec0304SVijay Mahadevan       }
121*1cec0304SVijay Mahadevan       ierr = PetscSectionSetDof(section, j, dmmoab->nfields);CHKERRQ(ierr);
122*1cec0304SVijay Mahadevan     }
123*1cec0304SVijay Mahadevan     ierr = PetscSectionSetUp(section);CHKERRQ(ierr);
124*1cec0304SVijay Mahadevan     ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr);
125*1cec0304SVijay Mahadevan   }
126*1cec0304SVijay Mahadevan 
127*1cec0304SVijay Mahadevan   {
128032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
129032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
130032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
131032b8ab6SVijay Mahadevan 
132*1cec0304SVijay Mahadevan     for (i=0; i<totsize; ++i) {
133*1cec0304SVijay Mahadevan       gsindices[i]--;   /* zero based index needed for IS */
134*1cec0304SVijay Mahadevan     }
135*1cec0304SVijay Mahadevan 
136032b8ab6SVijay Mahadevan     /* global to local must retrieve ghost points */
137*1cec0304SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
138032b8ab6SVijay Mahadevan 
139db66d124SVijay Mahadevan     ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr);
140db66d124SVijay Mahadevan     ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr);
141032b8ab6SVijay Mahadevan 
142032b8ab6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
143032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
144032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
145032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
146032b8ab6SVijay Mahadevan   }
147032b8ab6SVijay Mahadevan 
148*1cec0304SVijay Mahadevan   /* skin the boundary and store nodes */
149*1cec0304SVijay Mahadevan   {
150*1cec0304SVijay Mahadevan     // get the skin vertices of those faces and mark them as fixed; we don't want to fix the vertices on a
151*1cec0304SVijay Mahadevan     // part boundary, but since we exchanged a layer of ghost faces, those vertices aren't on the skin locally
152*1cec0304SVijay Mahadevan     // ok to mark non-owned skin vertices too, I won't move those anyway
153*1cec0304SVijay Mahadevan     // use MOAB's skinner class to find the skin
154*1cec0304SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
155*1cec0304SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
156*1cec0304SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
157*1cec0304SVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, true, *dmmoab->bndyvtx);MBERRNM(merr); // 'true' param indicates we want vertices back, not faces
158*1cec0304SVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
159*1cec0304SVijay Mahadevan     PetscPrintf(PETSC_COMM_WORLD, "\nFound %D boundary vertices and %D faces.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size());
160*1cec0304SVijay Mahadevan   }
161*1cec0304SVijay Mahadevan 
162*1cec0304SVijay Mahadevan   ierr = PetscFree(gsindices);CHKERRQ(ierr);
163032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
164032b8ab6SVijay Mahadevan }
165032b8ab6SVijay Mahadevan 
166*1cec0304SVijay Mahadevan 
167032b8ab6SVijay Mahadevan #undef __FUNCT__
168aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
169853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
170aa768e4cSTim Tautges {
171aa768e4cSTim Tautges   PetscErrorCode ierr;
172aa768e4cSTim Tautges 
173aa768e4cSTim Tautges   PetscFunctionBegin;
174aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
175032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
176032b8ab6SVijay Mahadevan 
177032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
178032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
179032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
180032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
181032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
182032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
183032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
184032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
185032b8ab6SVijay Mahadevan 
186032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
187032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
188032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
189032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
190032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
191aa768e4cSTim Tautges 
19297ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
19397ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
194032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
195032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
19697ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
197032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
198032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
199032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
200032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
201aa768e4cSTim Tautges   PetscFunctionReturn(0);
202aa768e4cSTim Tautges }
203fd349b41STim Tautges 
204fd349b41STim Tautges #undef __FUNCT__
2051d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
2061d72bce8STim Tautges /*@
2071d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
2081d72bce8STim Tautges 
2091d72bce8STim Tautges   Collective on MPI_Comm
2101d72bce8STim Tautges 
2111d72bce8STim Tautges   Input Parameter:
2121d72bce8STim Tautges . comm - The communicator for the DMMoab object
2131d72bce8STim Tautges 
2141d72bce8STim Tautges   Output Parameter:
215032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2161d72bce8STim Tautges 
2171d72bce8STim Tautges   Level: beginner
2181d72bce8STim Tautges 
2191d72bce8STim Tautges .keywords: DMMoab, create
2201d72bce8STim Tautges @*/
221032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
2221d72bce8STim Tautges {
2231d72bce8STim Tautges   PetscErrorCode ierr;
2241d72bce8STim Tautges 
2251d72bce8STim Tautges   PetscFunctionBegin;
226032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
227032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
228032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
2291d72bce8STim Tautges   PetscFunctionReturn(0);
2301d72bce8STim Tautges }
2311d72bce8STim Tautges 
2321d72bce8STim Tautges #undef __FUNCT__
233aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
2341d72bce8STim Tautges /*@
235a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
2361d72bce8STim Tautges 
2371d72bce8STim Tautges   Collective on MPI_Comm
2381d72bce8STim Tautges 
2391d72bce8STim Tautges   Input Parameter:
2401d72bce8STim Tautges . comm - The communicator for the DMMoab object
241032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
242a4d2169cSTim Tautges          along with the DMMoab
243a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
2441d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
2451d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
2461d72bce8STim Tautges 
2471d72bce8STim Tautges   Output Parameter:
248032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2491d72bce8STim Tautges 
250032b8ab6SVijay Mahadevan   Level: intermediate
2511d72bce8STim Tautges 
2521d72bce8STim Tautges .keywords: DMMoab, create
2531d72bce8STim Tautges @*/
254032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
2551d72bce8STim Tautges {
2561d72bce8STim Tautges   PetscErrorCode ierr;
257032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
258*1cec0304SVijay Mahadevan   moab::EntityHandle partnset;
259*1cec0304SVijay Mahadevan   PetscInt rank, nprocs;
260853cdec3SJed Brown   DM_Moab        *dmmoab;
2611d72bce8STim Tautges 
2621d72bce8STim Tautges   PetscFunctionBegin;
263032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
264032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
265032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
266a4d2169cSTim Tautges 
267a4d2169cSTim Tautges   if (!mbiface) {
26872ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
2697d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
2701d72bce8STim Tautges   }
271*1cec0304SVijay Mahadevan   else {
272*1cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
2737d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
274*1cec0304SVijay Mahadevan   }
275*1cec0304SVijay Mahadevan 
276*1cec0304SVijay Mahadevan   /* create a fileset to store the hierarchy of entities belonging to current DM */
277*1cec0304SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr);
2787d89fc02STim Tautges 
279a4d2169cSTim Tautges   if (!pcomm) {
280032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
281032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
282032b8ab6SVijay Mahadevan 
283db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
284db66d124SVijay Mahadevan        to the load_file functions to be populated. */
28572ff976dSVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
286032b8ab6SVijay Mahadevan     MBERR("Creating partition set failed", merr);
287032b8ab6SVijay Mahadevan 
288db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
28972ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
29072ff976dSVijay Mahadevan   }
29172ff976dSVijay Mahadevan   else {
29272ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
293032b8ab6SVijay Mahadevan   }
294032b8ab6SVijay Mahadevan 
2954973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
2964973de03SVijay Mahadevan   dmmoab->bs       = 1;
2974973de03SVijay Mahadevan 
2984973de03SVijay Mahadevan   /* set global ID tag handle */
299032b8ab6SVijay Mahadevan   if (!ltog_tag) {
3004973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
301032b8ab6SVijay Mahadevan   }
302032b8ab6SVijay Mahadevan   else {
303032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
304a4d2169cSTim Tautges   }
305a4d2169cSTim Tautges 
3064973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
307a4d2169cSTim Tautges   if (range) {
3085eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
309a4d2169cSTim Tautges   }
3101d72bce8STim Tautges   PetscFunctionReturn(0);
3111d72bce8STim Tautges }
3121d72bce8STim Tautges 
3131d72bce8STim Tautges #undef __FUNCT__
3141d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
315aa768e4cSTim Tautges /*@
316aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
317aa768e4cSTim Tautges 
318aa768e4cSTim Tautges   Collective on MPI_Comm
319aa768e4cSTim Tautges 
320aa768e4cSTim Tautges   Input Parameter:
321aa768e4cSTim Tautges . dm    - The DMMoab object being set
322aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
323aa768e4cSTim Tautges 
324aa768e4cSTim Tautges   Level: beginner
325aa768e4cSTim Tautges 
326aa768e4cSTim Tautges .keywords: DMMoab, create
327aa768e4cSTim Tautges @*/
3281d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
3291d72bce8STim Tautges {
330032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
331032b8ab6SVijay Mahadevan 
3321d72bce8STim Tautges   PetscFunctionBegin;
3331d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
334*1cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
335032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
336032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
337032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
3381d72bce8STim Tautges   PetscFunctionReturn(0);
3391d72bce8STim Tautges }
3401d72bce8STim Tautges 
3411d72bce8STim Tautges 
3421d72bce8STim Tautges #undef __FUNCT__
3431d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
344aa768e4cSTim Tautges /*@
345aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
346aa768e4cSTim Tautges 
347aa768e4cSTim Tautges   Collective on MPI_Comm
348aa768e4cSTim Tautges 
349aa768e4cSTim Tautges   Input Parameter:
350aa768e4cSTim Tautges . dm    - The DMMoab object being set
351aa768e4cSTim Tautges 
352aa768e4cSTim Tautges   Output Parameter:
353aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
354aa768e4cSTim Tautges 
355aa768e4cSTim Tautges   Level: beginner
356aa768e4cSTim Tautges 
357aa768e4cSTim Tautges .keywords: DMMoab, create
358aa768e4cSTim Tautges @*/
3591d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
3601d72bce8STim Tautges {
3611d72bce8STim Tautges   PetscFunctionBegin;
3621d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
363032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
3641d72bce8STim Tautges   PetscFunctionReturn(0);
3651d72bce8STim Tautges }
3661d72bce8STim Tautges 
3671d72bce8STim Tautges 
3681d72bce8STim Tautges #undef __FUNCT__
3691d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
370aa768e4cSTim Tautges /*@
371aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
372aa768e4cSTim Tautges 
373aa768e4cSTim Tautges   Collective on MPI_Comm
374aa768e4cSTim Tautges 
375aa768e4cSTim Tautges   Input Parameter:
376aa768e4cSTim Tautges . dm      - The DMMoab object being set
377aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
378aa768e4cSTim Tautges 
379aa768e4cSTim Tautges   Level: beginner
380aa768e4cSTim Tautges 
381aa768e4cSTim Tautges .keywords: DMMoab, create
382aa768e4cSTim Tautges @*/
383a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
3841d72bce8STim Tautges {
385032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
386032b8ab6SVijay Mahadevan 
3871d72bce8STim Tautges   PetscFunctionBegin;
3881d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
389*1cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
390032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
391032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
392032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
3931d72bce8STim Tautges   PetscFunctionReturn(0);
3941d72bce8STim Tautges }
3951d72bce8STim Tautges 
3961d72bce8STim Tautges 
3971d72bce8STim Tautges #undef __FUNCT__
3981d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
399aa768e4cSTim Tautges /*@
400aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
401aa768e4cSTim Tautges 
402aa768e4cSTim Tautges   Collective on MPI_Comm
403aa768e4cSTim Tautges 
404aa768e4cSTim Tautges   Input Parameter:
405aa768e4cSTim Tautges . dm      - The DMMoab object being set
406aa768e4cSTim Tautges 
407aa768e4cSTim Tautges   Output Parameter:
408aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
409aa768e4cSTim Tautges 
410aa768e4cSTim Tautges   Level: beginner
411aa768e4cSTim Tautges 
412aa768e4cSTim Tautges .keywords: DMMoab, create
413aa768e4cSTim Tautges @*/
414a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
4151d72bce8STim Tautges {
4169426e041SSatish Balay   PetscErrorCode   ierr;
417cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
418cabb514dSBarry Smith 
4191d72bce8STim Tautges   PetscFunctionBegin;
4201d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
421cabb514dSBarry 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);
422a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
4231d72bce8STim Tautges   PetscFunctionReturn(0);
4241d72bce8STim Tautges }
4251d72bce8STim Tautges 
4261d72bce8STim Tautges 
4271d72bce8STim Tautges #undef __FUNCT__
4285eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
429aa768e4cSTim Tautges /*@
4305eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
431aa768e4cSTim Tautges 
432aa768e4cSTim Tautges   Collective on MPI_Comm
433aa768e4cSTim Tautges 
434aa768e4cSTim Tautges   Input Parameter:
435aa768e4cSTim Tautges . dm    - The DMMoab object being set
436aa768e4cSTim Tautges . range - The entities treated by this DMMoab
437aa768e4cSTim Tautges 
438aa768e4cSTim Tautges   Level: beginner
439aa768e4cSTim Tautges 
440aa768e4cSTim Tautges .keywords: DMMoab, create
441aa768e4cSTim Tautges @*/
4425eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
4431d72bce8STim Tautges {
444032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
445032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
446032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
447032b8ab6SVijay Mahadevan 
4481d72bce8STim Tautges   PetscFunctionBegin;
4491d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
450032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
451032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
452032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
453032b8ab6SVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
454032b8ab6SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
455032b8ab6SVijay Mahadevan   *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned);
456032b8ab6SVijay Mahadevan   dmmoab->nloc=dmmoab->vowned->size();
457032b8ab6SVijay Mahadevan   dmmoab->nghost=dmmoab->vghost->size();
458032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4591d72bce8STim Tautges   PetscFunctionReturn(0);
4601d72bce8STim Tautges }
4611d72bce8STim Tautges 
4621d72bce8STim Tautges 
4631d72bce8STim Tautges #undef __FUNCT__
4645eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
465aa768e4cSTim Tautges /*@
4665eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
467aa768e4cSTim Tautges 
468aa768e4cSTim Tautges   Collective on MPI_Comm
469aa768e4cSTim Tautges 
470aa768e4cSTim Tautges   Input Parameter:
471aa768e4cSTim Tautges . dm    - The DMMoab object being set
472aa768e4cSTim Tautges 
473aa768e4cSTim Tautges   Output Parameter:
4745eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
4755eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
476aa768e4cSTim Tautges 
477aa768e4cSTim Tautges   Level: beginner
478aa768e4cSTim Tautges 
479aa768e4cSTim Tautges .keywords: DMMoab, create
480aa768e4cSTim Tautges @*/
481*1cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
4821d72bce8STim Tautges {
4831d72bce8STim Tautges   PetscFunctionBegin;
4841d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
485*1cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
486*1cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
4871d72bce8STim Tautges   PetscFunctionReturn(0);
4881d72bce8STim Tautges }
4891d72bce8STim Tautges 
4901d72bce8STim Tautges #undef __FUNCT__
4915eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
4925eb88e9dSVijay Mahadevan /*@
4935eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
4945eb88e9dSVijay Mahadevan 
4955eb88e9dSVijay Mahadevan   Collective on MPI_Comm
4965eb88e9dSVijay Mahadevan 
4975eb88e9dSVijay Mahadevan   Input Parameter:
4985eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
4995eb88e9dSVijay Mahadevan 
5005eb88e9dSVijay Mahadevan   Output Parameter:
5015eb88e9dSVijay Mahadevan . range - The entities owned locally
5025eb88e9dSVijay Mahadevan 
5035eb88e9dSVijay Mahadevan   Level: beginner
5045eb88e9dSVijay Mahadevan 
5055eb88e9dSVijay Mahadevan .keywords: DMMoab, create
5065eb88e9dSVijay Mahadevan @*/
507*1cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
5085eb88e9dSVijay Mahadevan {
5095eb88e9dSVijay Mahadevan   PetscFunctionBegin;
5105eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
511*1cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
512*1cec0304SVijay Mahadevan   PetscFunctionReturn(0);
513*1cec0304SVijay Mahadevan }
514*1cec0304SVijay Mahadevan 
515*1cec0304SVijay Mahadevan 
516*1cec0304SVijay Mahadevan #undef __FUNCT__
517*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
518*1cec0304SVijay Mahadevan /*@
519*1cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
520*1cec0304SVijay Mahadevan 
521*1cec0304SVijay Mahadevan   Collective on MPI_Comm
522*1cec0304SVijay Mahadevan 
523*1cec0304SVijay Mahadevan   Input Parameter:
524*1cec0304SVijay Mahadevan . dm    - The DMMoab object being set
525*1cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
526*1cec0304SVijay Mahadevan 
527*1cec0304SVijay Mahadevan   Level: beginner
528*1cec0304SVijay Mahadevan 
529*1cec0304SVijay Mahadevan .keywords: DMMoab, create
530*1cec0304SVijay Mahadevan @*/
531*1cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
532*1cec0304SVijay Mahadevan {
533*1cec0304SVijay Mahadevan   moab::ErrorCode merr;
534*1cec0304SVijay Mahadevan   PetscErrorCode  ierr;
535*1cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
536*1cec0304SVijay Mahadevan 
537*1cec0304SVijay Mahadevan   PetscFunctionBegin;
538*1cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
539*1cec0304SVijay Mahadevan   dmmoab->elocal->clear();
540*1cec0304SVijay Mahadevan   dmmoab->eghost->clear();
541*1cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
542*1cec0304SVijay Mahadevan   PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size());
543*1cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
544*1cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
545*1cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
546*1cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
547*1cec0304SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele);
5485eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
5495eb88e9dSVijay Mahadevan }
5505eb88e9dSVijay Mahadevan 
5515eb88e9dSVijay Mahadevan 
5525eb88e9dSVijay Mahadevan #undef __FUNCT__
5531d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
554aa768e4cSTim Tautges /*@
555aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
556aa768e4cSTim Tautges 
557aa768e4cSTim Tautges   Collective on MPI_Comm
558aa768e4cSTim Tautges 
559aa768e4cSTim Tautges   Input Parameter:
560aa768e4cSTim Tautges . dm      - The DMMoab object being set
561aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
562aa768e4cSTim Tautges 
563aa768e4cSTim Tautges   Level: beginner
564aa768e4cSTim Tautges 
565aa768e4cSTim Tautges .keywords: DMMoab, create
566aa768e4cSTim Tautges @*/
5671d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
5681d72bce8STim Tautges {
5691d72bce8STim Tautges   PetscFunctionBegin;
5701d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5711d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
5721d72bce8STim Tautges   PetscFunctionReturn(0);
5731d72bce8STim Tautges }
5741d72bce8STim Tautges 
5751d72bce8STim Tautges 
5761d72bce8STim Tautges #undef __FUNCT__
5771d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
578aa768e4cSTim Tautges /*@
579aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
580aa768e4cSTim Tautges 
581aa768e4cSTim Tautges   Collective on MPI_Comm
582aa768e4cSTim Tautges 
583aa768e4cSTim Tautges   Input Parameter:
584aa768e4cSTim Tautges . dm      - The DMMoab object being set
585aa768e4cSTim Tautges 
586aa768e4cSTim Tautges   Output Parameter:
587aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
588aa768e4cSTim Tautges 
589aa768e4cSTim Tautges   Level: beginner
590aa768e4cSTim Tautges 
591aa768e4cSTim Tautges .keywords: DMMoab, create
592aa768e4cSTim Tautges @*/
5931d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
5941d72bce8STim Tautges {
5951d72bce8STim Tautges   PetscFunctionBegin;
5961d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5971d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
5981d72bce8STim Tautges   PetscFunctionReturn(0);
5991d72bce8STim Tautges }
6001d72bce8STim Tautges 
6011d72bce8STim Tautges 
6021d72bce8STim Tautges #undef __FUNCT__
6031d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
604aa768e4cSTim Tautges /*@
605aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
606aa768e4cSTim Tautges 
607aa768e4cSTim Tautges   Collective on MPI_Comm
608aa768e4cSTim Tautges 
609aa768e4cSTim Tautges   Input Parameter:
610aa768e4cSTim Tautges . dm - The DMMoab object being set
611aa768e4cSTim Tautges . bs - The block size used with this DMMoab
612aa768e4cSTim Tautges 
613aa768e4cSTim Tautges   Level: beginner
614aa768e4cSTim Tautges 
615aa768e4cSTim Tautges .keywords: DMMoab, create
616aa768e4cSTim Tautges @*/
6171d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
6181d72bce8STim Tautges {
6191d72bce8STim Tautges   PetscFunctionBegin;
6201d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6211d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
6221d72bce8STim Tautges   PetscFunctionReturn(0);
6231d72bce8STim Tautges }
6241d72bce8STim Tautges 
6251d72bce8STim Tautges 
6261d72bce8STim Tautges #undef __FUNCT__
6271d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
628aa768e4cSTim Tautges /*@
629aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
630aa768e4cSTim Tautges 
631aa768e4cSTim Tautges   Collective on MPI_Comm
632aa768e4cSTim Tautges 
633aa768e4cSTim Tautges   Input Parameter:
634aa768e4cSTim Tautges . dm - The DMMoab object being set
635aa768e4cSTim Tautges 
636aa768e4cSTim Tautges   Output Parameter:
637aa768e4cSTim Tautges . bs - The block size used with this DMMoab
638aa768e4cSTim Tautges 
639aa768e4cSTim Tautges   Level: beginner
640aa768e4cSTim Tautges 
641aa768e4cSTim Tautges .keywords: DMMoab, create
642aa768e4cSTim Tautges @*/
6431d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
6441d72bce8STim Tautges {
6451d72bce8STim Tautges   PetscFunctionBegin;
6461d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6471d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
6481d72bce8STim Tautges   PetscFunctionReturn(0);
6491d72bce8STim Tautges }
6501d72bce8STim Tautges 
651*1cec0304SVijay Mahadevan 
652*1cec0304SVijay Mahadevan #undef __FUNCT__
653*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector"
654*1cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
655*1cec0304SVijay Mahadevan {
656*1cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
657*1cec0304SVijay Mahadevan   moab::Tag     vtag,ntag;
658*1cec0304SVijay Mahadevan   PetscScalar   *varray;
659*1cec0304SVijay Mahadevan   moab::ErrorCode merr;
660*1cec0304SVijay Mahadevan   PetscErrorCode  ierr;
661*1cec0304SVijay Mahadevan   PetscSection section;
662*1cec0304SVijay Mahadevan   PetscInt doff;
663*1cec0304SVijay Mahadevan   std::string tag_name;
664*1cec0304SVijay Mahadevan   moab::Range::iterator iter;
665*1cec0304SVijay Mahadevan 
666*1cec0304SVijay Mahadevan   PetscFunctionBegin;
667*1cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
668*1cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
669*1cec0304SVijay Mahadevan 
670*1cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
671*1cec0304SVijay Mahadevan 
672*1cec0304SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
673*1cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
674*1cec0304SVijay Mahadevan                                           moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
675*1cec0304SVijay Mahadevan 
676*1cec0304SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
677*1cec0304SVijay Mahadevan 
678*1cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
679*1cec0304SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
680*1cec0304SVijay Mahadevan     ierr = DMMoabVecGetArray(dm,fvec,&varray);CHKERRQ(ierr);
681*1cec0304SVijay Mahadevan     for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
682*1cec0304SVijay Mahadevan       moab::EntityHandle vtx = (*iter);
683*1cec0304SVijay Mahadevan 
684*1cec0304SVijay Mahadevan       /* get field dof index */
685*1cec0304SVijay Mahadevan       ierr = PetscSectionGetFieldOffset(section, vtx, ifield, &doff);
686*1cec0304SVijay Mahadevan 
687*1cec0304SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
688*1cec0304SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr);
689*1cec0304SVijay Mahadevan     }
690*1cec0304SVijay Mahadevan     ierr = DMMoabVecRestoreArray(dm,fvec,&varray);CHKERRQ(ierr);
691*1cec0304SVijay Mahadevan   }
692*1cec0304SVijay Mahadevan   else {
693*1cec0304SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&varray);CHKERRQ(ierr);
694*1cec0304SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
695*1cec0304SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
696*1cec0304SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr);
697*1cec0304SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
698*1cec0304SVijay Mahadevan     merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
699*1cec0304SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
700*1cec0304SVijay Mahadevan   }
701*1cec0304SVijay Mahadevan   PetscFunctionReturn(0);
702*1cec0304SVijay Mahadevan }
703*1cec0304SVijay Mahadevan 
704*1cec0304SVijay Mahadevan 
705*1cec0304SVijay Mahadevan #undef __FUNCT__
706*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities"
707*1cec0304SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces)
708*1cec0304SVijay Mahadevan {
709*1cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
710*1cec0304SVijay Mahadevan 
711*1cec0304SVijay Mahadevan   PetscFunctionBegin;
712*1cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
713*1cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
714*1cec0304SVijay Mahadevan 
715*1cec0304SVijay Mahadevan   if (bdvtx)  *bdvtx = *dmmoab->bndyvtx;
716*1cec0304SVijay Mahadevan   if (bdfaces)  *bdfaces = *dmmoab->bndyfaces;
717*1cec0304SVijay Mahadevan   PetscFunctionReturn(0);
718*1cec0304SVijay Mahadevan }
719*1cec0304SVijay Mahadevan 
720*1cec0304SVijay Mahadevan 
721*1cec0304SVijay Mahadevan #undef __FUNCT__
722*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabOutput"
723*1cec0304SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* fname,const char* wopts)
724*1cec0304SVijay Mahadevan {
725*1cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
726*1cec0304SVijay Mahadevan   moab::ErrorCode merr;
727*1cec0304SVijay Mahadevan 
728*1cec0304SVijay Mahadevan   PetscFunctionBegin;
729*1cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
730*1cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
731*1cec0304SVijay Mahadevan 
732*1cec0304SVijay Mahadevan   // output file, using parallel write
733*1cec0304SVijay Mahadevan   merr = dmmoab->mbiface->write_file(fname, NULL, wopts);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr);
734*1cec0304SVijay Mahadevan   PetscFunctionReturn(0);
735*1cec0304SVijay Mahadevan }
736*1cec0304SVijay Mahadevan 
737*1cec0304SVijay Mahadevan 
738*1cec0304SVijay Mahadevan #undef __FUNCT__
739*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields"
740*1cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields)
741*1cec0304SVijay Mahadevan {
742*1cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
743*1cec0304SVijay Mahadevan 
744*1cec0304SVijay Mahadevan   PetscFunctionBegin;
745*1cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
746*1cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
747*1cec0304SVijay Mahadevan 
748*1cec0304SVijay Mahadevan   dmmoab->fields = fields;
749*1cec0304SVijay Mahadevan   dmmoab->nfields = nfields;
750*1cec0304SVijay Mahadevan   PetscFunctionReturn(0);
751*1cec0304SVijay Mahadevan }
752*1cec0304SVijay Mahadevan 
753*1cec0304SVijay Mahadevan 
754*1cec0304SVijay Mahadevan #undef __FUNCT__
755*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
756*1cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
757*1cec0304SVijay Mahadevan {
758*1cec0304SVijay Mahadevan   PetscSection section;
759*1cec0304SVijay Mahadevan   PetscErrorCode ierr;
760*1cec0304SVijay Mahadevan 
761*1cec0304SVijay Mahadevan   PetscFunctionBegin;
762*1cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
763*1cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
764*1cec0304SVijay Mahadevan   ierr = PetscSectionGetFieldDof(section, (PetscInt)point, field, dof);CHKERRQ(ierr);
765*1cec0304SVijay Mahadevan   PetscFunctionReturn(0);
766*1cec0304SVijay Mahadevan }
767*1cec0304SVijay Mahadevan 
768*1cec0304SVijay Mahadevan 
769*1cec0304SVijay Mahadevan #undef __FUNCT__
770*1cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
771*1cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
772*1cec0304SVijay Mahadevan {
773*1cec0304SVijay Mahadevan   PetscInt i;
774*1cec0304SVijay Mahadevan   PetscSection section;
775*1cec0304SVijay Mahadevan   PetscErrorCode ierr;
776*1cec0304SVijay Mahadevan 
777*1cec0304SVijay Mahadevan   PetscFunctionBegin;
778*1cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
779*1cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
780*1cec0304SVijay Mahadevan   if (!dof) {
781*1cec0304SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
782*1cec0304SVijay Mahadevan   }
783*1cec0304SVijay Mahadevan   for (i=0; i<npoints; ++i) {
784*1cec0304SVijay Mahadevan     ierr = PetscSectionGetFieldDof(section, (PetscInt)points[i], field, &dof[i]);CHKERRQ(ierr);
785*1cec0304SVijay Mahadevan   }
786*1cec0304SVijay Mahadevan   PetscFunctionReturn(0);
787*1cec0304SVijay Mahadevan }
788*1cec0304SVijay Mahadevan 
789*1cec0304SVijay Mahadevan 
790