xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 6e40195ecc592446ee0fa1655e2767ca3348244e)
1032b8ab6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I  "petscdm.h"   I*/
2aa768e4cSTim Tautges #include <petsc-private/vecimpl.h> /*I  "petscdm.h"   I*/
31d72bce8STim Tautges 
41d72bce8STim Tautges #include <petscdmmoab.h>
588face26SJed Brown #include <MBTagConventions.hpp>
61cec0304SVijay Mahadevan #include <moab/Skinner.hpp>
7032b8ab6SVijay Mahadevan 
8853cdec3SJed Brown #undef __FUNCT__
9853cdec3SJed Brown #define __FUNCT__ "DMDestroy_Moab"
10853cdec3SJed Brown PetscErrorCode DMDestroy_Moab(DM dm)
11853cdec3SJed Brown {
12853cdec3SJed Brown   PetscErrorCode ierr;
13032b8ab6SVijay Mahadevan   DM_Moab         *dmmoab = (DM_Moab*)dm->data;
14853cdec3SJed Brown 
15853cdec3SJed Brown   PetscFunctionBegin;
16853cdec3SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
17032b8ab6SVijay Mahadevan   if (dmmoab->icreatedinstance) {
18032b8ab6SVijay Mahadevan     delete dmmoab->mbiface;
19853cdec3SJed Brown   }
20032b8ab6SVijay Mahadevan   dmmoab->mbiface = NULL;
21032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
22032b8ab6SVijay Mahadevan   delete dmmoab->vlocal;
23032b8ab6SVijay Mahadevan   delete dmmoab->vowned;
24032b8ab6SVijay Mahadevan   delete dmmoab->vghost;
25032b8ab6SVijay Mahadevan   delete dmmoab->elocal;
26032b8ab6SVijay Mahadevan   delete dmmoab->eghost;
271cec0304SVijay Mahadevan   delete dmmoab->bndyvtx;
281cec0304SVijay Mahadevan   delete dmmoab->bndyfaces;
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;
441cec0304SVijay Mahadevan   PetscInt                i,j,bs,gsiz,lsiz,*gsindices;
45032b8ab6SVijay Mahadevan   DM_Moab                *dmmoab = (DM_Moab*)dm->data;
46*6e40195eSVijay Mahadevan   PetscInt                totsize,local_min,global_min;
471cec0304SVijay 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 
571cec0304SVijay 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()) {
591cec0304SVijay 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();
751cec0304SVijay 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);
941cec0304SVijay 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 */
981cec0304SVijay Mahadevan     if (dmmoab->vghost->size()) {
994a40b570SVijay Mahadevan       merr = dmmoab->mbiface->tag_get_data(dmmoab->ltog_tag,*dmmoab->vghost,&gsindices[dmmoab->nloc]);MBERRNM(merr);
1001cec0304SVijay Mahadevan     }
101*6e40195eSVijay Mahadevan 
102*6e40195eSVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
103*6e40195eSVijay Mahadevan     local_min=gsindices[0];
104*6e40195eSVijay Mahadevan     for (i=1; i<totsize; ++i)
105*6e40195eSVijay Mahadevan       if(local_min>gsindices[i]) local_min=gsindices[i];
106*6e40195eSVijay Mahadevan 
107*6e40195eSVijay Mahadevan     ierr = MPI_Allreduce(&local_min, &global_min, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
108*6e40195eSVijay Mahadevan     PetscInfo2(dm, "GLOBAL_ID: Local minima - %D, Global minima - %D.\n", local_min, global_min);
1091cec0304SVijay Mahadevan   }
110032b8ab6SVijay Mahadevan 
1111cec0304SVijay Mahadevan   {
1121cec0304SVijay Mahadevan     ierr = PetscSectionCreate(((PetscObject)dm)->comm, &section);CHKERRQ(ierr);
1131cec0304SVijay Mahadevan     ierr = PetscSectionSetNumFields(section, dmmoab->nfields);CHKERRQ(ierr);
1141cec0304SVijay Mahadevan     ierr = PetscSectionSetChart(section, gsindices[0], gsindices[dmmoab->nloc-1]+1);CHKERRQ(ierr);
1151cec0304SVijay Mahadevan     for (j=gsindices[0]; j<=gsindices[dmmoab->nloc-1]; ++j) {
116*6e40195eSVijay Mahadevan       PetscInt locgid = j-global_min;
1171cec0304SVijay Mahadevan       for (i=0; i < dmmoab->nfields; ++i) {
1181cec0304SVijay Mahadevan         ierr = PetscSectionSetFieldName(section, i, dmmoab->fields[i]);CHKERRQ(ierr);
1191cec0304SVijay Mahadevan         if (bs>1) {
120*6e40195eSVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, j, i, locgid*dmmoab->nfields+i);CHKERRQ(ierr);
1211cec0304SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, j, i, dmmoab->nfields);
1221cec0304SVijay Mahadevan         }
1231cec0304SVijay Mahadevan         else {
124*6e40195eSVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, j, i, totsize*i+locgid);CHKERRQ(ierr);
1251cec0304SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, j, i, totsize);
1261cec0304SVijay Mahadevan         }
1271cec0304SVijay Mahadevan       }
1281cec0304SVijay Mahadevan       ierr = PetscSectionSetDof(section, j, dmmoab->nfields);CHKERRQ(ierr);
1291cec0304SVijay Mahadevan     }
1301cec0304SVijay Mahadevan     ierr = PetscSectionSetUp(section);CHKERRQ(ierr);
1311cec0304SVijay Mahadevan     ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr);
1321cec0304SVijay Mahadevan   }
1331cec0304SVijay Mahadevan 
1341cec0304SVijay Mahadevan   {
135032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
136032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
137032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
138032b8ab6SVijay Mahadevan 
139*6e40195eSVijay Mahadevan     for (i=0; i<totsize; ++i)
140*6e40195eSVijay Mahadevan       gsindices[i]-=global_min;   /* zero based index needed for IS */
1411cec0304SVijay Mahadevan 
142032b8ab6SVijay Mahadevan     /* global to local must retrieve ghost points */
1431cec0304SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
144032b8ab6SVijay Mahadevan 
145db66d124SVijay Mahadevan     ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr);
146db66d124SVijay Mahadevan     ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr);
147032b8ab6SVijay Mahadevan 
148032b8ab6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
149032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
150032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
151032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
152032b8ab6SVijay Mahadevan   }
153032b8ab6SVijay Mahadevan 
1541cec0304SVijay Mahadevan   /* skin the boundary and store nodes */
1551cec0304SVijay Mahadevan   {
1561cec0304SVijay Mahadevan     // get the skin vertices of those faces and mark them as fixed; we don't want to fix the vertices on a
1571cec0304SVijay Mahadevan     // part boundary, but since we exchanged a layer of ghost faces, those vertices aren't on the skin locally
1581cec0304SVijay Mahadevan     // ok to mark non-owned skin vertices too, I won't move those anyway
1591cec0304SVijay Mahadevan     // use MOAB's skinner class to find the skin
1601cec0304SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1611cec0304SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
1621cec0304SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
1631cec0304SVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, true, *dmmoab->bndyvtx);MBERRNM(merr); // 'true' param indicates we want vertices back, not faces
1641cec0304SVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
165*6e40195eSVijay Mahadevan     PetscInfo2(dm, "Found %D boundary vertices and %D faces.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size());
1661cec0304SVijay Mahadevan   }
1671cec0304SVijay Mahadevan 
1681cec0304SVijay Mahadevan   ierr = PetscFree(gsindices);CHKERRQ(ierr);
169032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
170032b8ab6SVijay Mahadevan }
171032b8ab6SVijay Mahadevan 
1721cec0304SVijay Mahadevan 
173032b8ab6SVijay Mahadevan #undef __FUNCT__
174aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
175853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
176aa768e4cSTim Tautges {
177aa768e4cSTim Tautges   PetscErrorCode ierr;
178aa768e4cSTim Tautges 
179aa768e4cSTim Tautges   PetscFunctionBegin;
180aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
181032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
182032b8ab6SVijay Mahadevan 
183032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
184032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
185032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
186032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
187032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
188032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
189032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
190032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
191032b8ab6SVijay Mahadevan 
192032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
193032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
194032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
195032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
196032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
197aa768e4cSTim Tautges 
19897ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
19997ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
200032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
201032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
20297ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
203032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
204032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
205032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
206032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
207aa768e4cSTim Tautges   PetscFunctionReturn(0);
208aa768e4cSTim Tautges }
209fd349b41STim Tautges 
210fd349b41STim Tautges #undef __FUNCT__
2111d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
2121d72bce8STim Tautges /*@
2131d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
2141d72bce8STim Tautges 
2151d72bce8STim Tautges   Collective on MPI_Comm
2161d72bce8STim Tautges 
2171d72bce8STim Tautges   Input Parameter:
2181d72bce8STim Tautges . comm - The communicator for the DMMoab object
2191d72bce8STim Tautges 
2201d72bce8STim Tautges   Output Parameter:
221032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2221d72bce8STim Tautges 
2231d72bce8STim Tautges   Level: beginner
2241d72bce8STim Tautges 
2251d72bce8STim Tautges .keywords: DMMoab, create
2261d72bce8STim Tautges @*/
227032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
2281d72bce8STim Tautges {
2291d72bce8STim Tautges   PetscErrorCode ierr;
2301d72bce8STim Tautges 
2311d72bce8STim Tautges   PetscFunctionBegin;
232032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
233032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
234032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
2351d72bce8STim Tautges   PetscFunctionReturn(0);
2361d72bce8STim Tautges }
2371d72bce8STim Tautges 
2381d72bce8STim Tautges #undef __FUNCT__
239aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
2401d72bce8STim Tautges /*@
241a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
2421d72bce8STim Tautges 
2431d72bce8STim Tautges   Collective on MPI_Comm
2441d72bce8STim Tautges 
2451d72bce8STim Tautges   Input Parameter:
2461d72bce8STim Tautges . comm - The communicator for the DMMoab object
247032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
248a4d2169cSTim Tautges          along with the DMMoab
249a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
2501d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
2511d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
2521d72bce8STim Tautges 
2531d72bce8STim Tautges   Output Parameter:
254032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2551d72bce8STim Tautges 
256032b8ab6SVijay Mahadevan   Level: intermediate
2571d72bce8STim Tautges 
2581d72bce8STim Tautges .keywords: DMMoab, create
2591d72bce8STim Tautges @*/
260032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
2611d72bce8STim Tautges {
2621d72bce8STim Tautges   PetscErrorCode ierr;
263032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
2641cec0304SVijay Mahadevan   moab::EntityHandle partnset;
2651cec0304SVijay Mahadevan   PetscInt rank, nprocs;
266853cdec3SJed Brown   DM_Moab        *dmmoab;
2671d72bce8STim Tautges 
2681d72bce8STim Tautges   PetscFunctionBegin;
269032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
270032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
271032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
272a4d2169cSTim Tautges 
273a4d2169cSTim Tautges   if (!mbiface) {
27472ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
2757d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
2761d72bce8STim Tautges   }
2771cec0304SVijay Mahadevan   else {
2781cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
2797d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
2801cec0304SVijay Mahadevan   }
2811cec0304SVijay Mahadevan 
2821cec0304SVijay Mahadevan   /* create a fileset to store the hierarchy of entities belonging to current DM */
2831cec0304SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr);
2847d89fc02STim Tautges 
285a4d2169cSTim Tautges   if (!pcomm) {
286032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
287032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
288032b8ab6SVijay Mahadevan 
289db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
290db66d124SVijay Mahadevan        to the load_file functions to be populated. */
29172ff976dSVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
292032b8ab6SVijay Mahadevan     MBERR("Creating partition set failed", merr);
293032b8ab6SVijay Mahadevan 
294db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
29572ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
29672ff976dSVijay Mahadevan   }
29772ff976dSVijay Mahadevan   else {
29872ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
299032b8ab6SVijay Mahadevan   }
300032b8ab6SVijay Mahadevan 
3014973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
3024973de03SVijay Mahadevan   dmmoab->bs       = 1;
3034973de03SVijay Mahadevan 
3044973de03SVijay Mahadevan   /* set global ID tag handle */
305032b8ab6SVijay Mahadevan   if (!ltog_tag) {
3064973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
307032b8ab6SVijay Mahadevan   }
308032b8ab6SVijay Mahadevan   else {
309032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
310a4d2169cSTim Tautges   }
311a4d2169cSTim Tautges 
3124973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
313a4d2169cSTim Tautges   if (range) {
3145eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
315a4d2169cSTim Tautges   }
3161d72bce8STim Tautges   PetscFunctionReturn(0);
3171d72bce8STim Tautges }
3181d72bce8STim Tautges 
3191d72bce8STim Tautges #undef __FUNCT__
3201d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
321aa768e4cSTim Tautges /*@
322aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
323aa768e4cSTim Tautges 
324aa768e4cSTim Tautges   Collective on MPI_Comm
325aa768e4cSTim Tautges 
326aa768e4cSTim Tautges   Input Parameter:
327aa768e4cSTim Tautges . dm    - The DMMoab object being set
328aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
329aa768e4cSTim Tautges 
330aa768e4cSTim Tautges   Level: beginner
331aa768e4cSTim Tautges 
332aa768e4cSTim Tautges .keywords: DMMoab, create
333aa768e4cSTim Tautges @*/
3341d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
3351d72bce8STim Tautges {
336032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
337032b8ab6SVijay Mahadevan 
3381d72bce8STim Tautges   PetscFunctionBegin;
3391d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3401cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
341032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
342032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
343032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
3441d72bce8STim Tautges   PetscFunctionReturn(0);
3451d72bce8STim Tautges }
3461d72bce8STim Tautges 
3471d72bce8STim Tautges 
3481d72bce8STim Tautges #undef __FUNCT__
3491d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
350aa768e4cSTim Tautges /*@
351aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
352aa768e4cSTim Tautges 
353aa768e4cSTim Tautges   Collective on MPI_Comm
354aa768e4cSTim Tautges 
355aa768e4cSTim Tautges   Input Parameter:
356aa768e4cSTim Tautges . dm    - The DMMoab object being set
357aa768e4cSTim Tautges 
358aa768e4cSTim Tautges   Output Parameter:
359aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
360aa768e4cSTim Tautges 
361aa768e4cSTim Tautges   Level: beginner
362aa768e4cSTim Tautges 
363aa768e4cSTim Tautges .keywords: DMMoab, create
364aa768e4cSTim Tautges @*/
3651d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
3661d72bce8STim Tautges {
3671d72bce8STim Tautges   PetscFunctionBegin;
3681d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
369032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
3701d72bce8STim Tautges   PetscFunctionReturn(0);
3711d72bce8STim Tautges }
3721d72bce8STim Tautges 
3731d72bce8STim Tautges 
3741d72bce8STim Tautges #undef __FUNCT__
3751d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
376aa768e4cSTim Tautges /*@
377aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
378aa768e4cSTim Tautges 
379aa768e4cSTim Tautges   Collective on MPI_Comm
380aa768e4cSTim Tautges 
381aa768e4cSTim Tautges   Input Parameter:
382aa768e4cSTim Tautges . dm      - The DMMoab object being set
383aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
384aa768e4cSTim Tautges 
385aa768e4cSTim Tautges   Level: beginner
386aa768e4cSTim Tautges 
387aa768e4cSTim Tautges .keywords: DMMoab, create
388aa768e4cSTim Tautges @*/
389a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
3901d72bce8STim Tautges {
391032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
392032b8ab6SVijay Mahadevan 
3931d72bce8STim Tautges   PetscFunctionBegin;
3941d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3951cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
396032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
397032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
398032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
3991d72bce8STim Tautges   PetscFunctionReturn(0);
4001d72bce8STim Tautges }
4011d72bce8STim Tautges 
4021d72bce8STim Tautges 
4031d72bce8STim Tautges #undef __FUNCT__
4041d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
405aa768e4cSTim Tautges /*@
406aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
407aa768e4cSTim Tautges 
408aa768e4cSTim Tautges   Collective on MPI_Comm
409aa768e4cSTim Tautges 
410aa768e4cSTim Tautges   Input Parameter:
411aa768e4cSTim Tautges . dm      - The DMMoab object being set
412aa768e4cSTim Tautges 
413aa768e4cSTim Tautges   Output Parameter:
414aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
415aa768e4cSTim Tautges 
416aa768e4cSTim Tautges   Level: beginner
417aa768e4cSTim Tautges 
418aa768e4cSTim Tautges .keywords: DMMoab, create
419aa768e4cSTim Tautges @*/
420a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
4211d72bce8STim Tautges {
4229426e041SSatish Balay   PetscErrorCode   ierr;
423cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
424cabb514dSBarry Smith 
4251d72bce8STim Tautges   PetscFunctionBegin;
4261d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
427cabb514dSBarry 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);
428a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
4291d72bce8STim Tautges   PetscFunctionReturn(0);
4301d72bce8STim Tautges }
4311d72bce8STim Tautges 
4321d72bce8STim Tautges 
4331d72bce8STim Tautges #undef __FUNCT__
4345eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
435aa768e4cSTim Tautges /*@
4365eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
437aa768e4cSTim Tautges 
438aa768e4cSTim Tautges   Collective on MPI_Comm
439aa768e4cSTim Tautges 
440aa768e4cSTim Tautges   Input Parameter:
441aa768e4cSTim Tautges . dm    - The DMMoab object being set
442aa768e4cSTim Tautges . range - The entities treated by this DMMoab
443aa768e4cSTim Tautges 
444aa768e4cSTim Tautges   Level: beginner
445aa768e4cSTim Tautges 
446aa768e4cSTim Tautges .keywords: DMMoab, create
447aa768e4cSTim Tautges @*/
4485eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
4491d72bce8STim Tautges {
450032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
451032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
452032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
453032b8ab6SVijay Mahadevan 
4541d72bce8STim Tautges   PetscFunctionBegin;
4551d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
456032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
457032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
458032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
459032b8ab6SVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
460032b8ab6SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
461032b8ab6SVijay Mahadevan   *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned);
462032b8ab6SVijay Mahadevan   dmmoab->nloc=dmmoab->vowned->size();
463032b8ab6SVijay Mahadevan   dmmoab->nghost=dmmoab->vghost->size();
464032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4651d72bce8STim Tautges   PetscFunctionReturn(0);
4661d72bce8STim Tautges }
4671d72bce8STim Tautges 
4681d72bce8STim Tautges 
4691d72bce8STim Tautges #undef __FUNCT__
4705eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
471aa768e4cSTim Tautges /*@
4725eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on this DMMoab
473aa768e4cSTim Tautges 
474aa768e4cSTim Tautges   Collective on MPI_Comm
475aa768e4cSTim Tautges 
476aa768e4cSTim Tautges   Input Parameter:
477aa768e4cSTim Tautges . dm    - The DMMoab object being set
478aa768e4cSTim Tautges 
479aa768e4cSTim Tautges   Output Parameter:
4805eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
4815eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
482aa768e4cSTim Tautges 
483aa768e4cSTim Tautges   Level: beginner
484aa768e4cSTim Tautges 
485aa768e4cSTim Tautges .keywords: DMMoab, create
486aa768e4cSTim Tautges @*/
4871cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
4881d72bce8STim Tautges {
4891d72bce8STim Tautges   PetscFunctionBegin;
4901d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4911cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
4921cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
4931d72bce8STim Tautges   PetscFunctionReturn(0);
4941d72bce8STim Tautges }
4951d72bce8STim Tautges 
4961d72bce8STim Tautges #undef __FUNCT__
4975eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
4985eb88e9dSVijay Mahadevan /*@
4995eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
5005eb88e9dSVijay Mahadevan 
5015eb88e9dSVijay Mahadevan   Collective on MPI_Comm
5025eb88e9dSVijay Mahadevan 
5035eb88e9dSVijay Mahadevan   Input Parameter:
5045eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
5055eb88e9dSVijay Mahadevan 
5065eb88e9dSVijay Mahadevan   Output Parameter:
5075eb88e9dSVijay Mahadevan . range - The entities owned locally
5085eb88e9dSVijay Mahadevan 
5095eb88e9dSVijay Mahadevan   Level: beginner
5105eb88e9dSVijay Mahadevan 
5115eb88e9dSVijay Mahadevan .keywords: DMMoab, create
5125eb88e9dSVijay Mahadevan @*/
5131cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
5145eb88e9dSVijay Mahadevan {
5155eb88e9dSVijay Mahadevan   PetscFunctionBegin;
5165eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5171cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
5181cec0304SVijay Mahadevan   PetscFunctionReturn(0);
5191cec0304SVijay Mahadevan }
5201cec0304SVijay Mahadevan 
5211cec0304SVijay Mahadevan 
5221cec0304SVijay Mahadevan #undef __FUNCT__
5231cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
5241cec0304SVijay Mahadevan /*@
5251cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
5261cec0304SVijay Mahadevan 
5271cec0304SVijay Mahadevan   Collective on MPI_Comm
5281cec0304SVijay Mahadevan 
5291cec0304SVijay Mahadevan   Input Parameter:
5301cec0304SVijay Mahadevan . dm    - The DMMoab object being set
5311cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
5321cec0304SVijay Mahadevan 
5331cec0304SVijay Mahadevan   Level: beginner
5341cec0304SVijay Mahadevan 
5351cec0304SVijay Mahadevan .keywords: DMMoab, create
5361cec0304SVijay Mahadevan @*/
5371cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
5381cec0304SVijay Mahadevan {
5391cec0304SVijay Mahadevan   moab::ErrorCode merr;
5401cec0304SVijay Mahadevan   PetscErrorCode  ierr;
5411cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
5421cec0304SVijay Mahadevan 
5431cec0304SVijay Mahadevan   PetscFunctionBegin;
5441cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5451cec0304SVijay Mahadevan   dmmoab->elocal->clear();
5461cec0304SVijay Mahadevan   dmmoab->eghost->clear();
5471cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
5481cec0304SVijay Mahadevan   PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size());
5491cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
5501cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
5511cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
5521cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5531cec0304SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele);
5545eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
5555eb88e9dSVijay Mahadevan }
5565eb88e9dSVijay Mahadevan 
5575eb88e9dSVijay Mahadevan 
5585eb88e9dSVijay Mahadevan #undef __FUNCT__
5591d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
560aa768e4cSTim Tautges /*@
561aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
562aa768e4cSTim Tautges 
563aa768e4cSTim Tautges   Collective on MPI_Comm
564aa768e4cSTim Tautges 
565aa768e4cSTim Tautges   Input Parameter:
566aa768e4cSTim Tautges . dm      - The DMMoab object being set
567aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
568aa768e4cSTim Tautges 
569aa768e4cSTim Tautges   Level: beginner
570aa768e4cSTim Tautges 
571aa768e4cSTim Tautges .keywords: DMMoab, create
572aa768e4cSTim Tautges @*/
5731d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
5741d72bce8STim Tautges {
5751d72bce8STim Tautges   PetscFunctionBegin;
5761d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5771d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
5781d72bce8STim Tautges   PetscFunctionReturn(0);
5791d72bce8STim Tautges }
5801d72bce8STim Tautges 
5811d72bce8STim Tautges 
5821d72bce8STim Tautges #undef __FUNCT__
5831d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
584aa768e4cSTim Tautges /*@
585aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
586aa768e4cSTim Tautges 
587aa768e4cSTim Tautges   Collective on MPI_Comm
588aa768e4cSTim Tautges 
589aa768e4cSTim Tautges   Input Parameter:
590aa768e4cSTim Tautges . dm      - The DMMoab object being set
591aa768e4cSTim Tautges 
592aa768e4cSTim Tautges   Output Parameter:
593aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
594aa768e4cSTim Tautges 
595aa768e4cSTim Tautges   Level: beginner
596aa768e4cSTim Tautges 
597aa768e4cSTim Tautges .keywords: DMMoab, create
598aa768e4cSTim Tautges @*/
5991d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
6001d72bce8STim Tautges {
6011d72bce8STim Tautges   PetscFunctionBegin;
6021d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6031d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
6041d72bce8STim Tautges   PetscFunctionReturn(0);
6051d72bce8STim Tautges }
6061d72bce8STim Tautges 
6071d72bce8STim Tautges 
6081d72bce8STim Tautges #undef __FUNCT__
6091d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
610aa768e4cSTim Tautges /*@
611aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
612aa768e4cSTim Tautges 
613aa768e4cSTim Tautges   Collective on MPI_Comm
614aa768e4cSTim Tautges 
615aa768e4cSTim Tautges   Input Parameter:
616aa768e4cSTim Tautges . dm - The DMMoab object being set
617aa768e4cSTim Tautges . bs - The block size used with this DMMoab
618aa768e4cSTim Tautges 
619aa768e4cSTim Tautges   Level: beginner
620aa768e4cSTim Tautges 
621aa768e4cSTim Tautges .keywords: DMMoab, create
622aa768e4cSTim Tautges @*/
6231d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
6241d72bce8STim Tautges {
6251d72bce8STim Tautges   PetscFunctionBegin;
6261d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6271d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
6281d72bce8STim Tautges   PetscFunctionReturn(0);
6291d72bce8STim Tautges }
6301d72bce8STim Tautges 
6311d72bce8STim Tautges 
6321d72bce8STim Tautges #undef __FUNCT__
6331d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
634aa768e4cSTim Tautges /*@
635aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
636aa768e4cSTim Tautges 
637aa768e4cSTim Tautges   Collective on MPI_Comm
638aa768e4cSTim Tautges 
639aa768e4cSTim Tautges   Input Parameter:
640aa768e4cSTim Tautges . dm - The DMMoab object being set
641aa768e4cSTim Tautges 
642aa768e4cSTim Tautges   Output Parameter:
643aa768e4cSTim Tautges . bs - The block size used with this DMMoab
644aa768e4cSTim Tautges 
645aa768e4cSTim Tautges   Level: beginner
646aa768e4cSTim Tautges 
647aa768e4cSTim Tautges .keywords: DMMoab, create
648aa768e4cSTim Tautges @*/
6491d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
6501d72bce8STim Tautges {
6511d72bce8STim Tautges   PetscFunctionBegin;
6521d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6531d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
6541d72bce8STim Tautges   PetscFunctionReturn(0);
6551d72bce8STim Tautges }
6561d72bce8STim Tautges 
6571cec0304SVijay Mahadevan 
6581cec0304SVijay Mahadevan #undef __FUNCT__
6591cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector"
6601cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
6611cec0304SVijay Mahadevan {
6621cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
6631cec0304SVijay Mahadevan   moab::Tag     vtag,ntag;
6641cec0304SVijay Mahadevan   PetscScalar   *varray;
6651cec0304SVijay Mahadevan   moab::ErrorCode merr;
6661cec0304SVijay Mahadevan   PetscErrorCode  ierr;
6671cec0304SVijay Mahadevan   PetscSection section;
6681cec0304SVijay Mahadevan   PetscInt doff;
6691cec0304SVijay Mahadevan   std::string tag_name;
6701cec0304SVijay Mahadevan   moab::Range::iterator iter;
6711cec0304SVijay Mahadevan 
6721cec0304SVijay Mahadevan   PetscFunctionBegin;
6731cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6741cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6751cec0304SVijay Mahadevan 
6761cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
6771cec0304SVijay Mahadevan 
6781cec0304SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
6791cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
6801cec0304SVijay Mahadevan                                           moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
6811cec0304SVijay Mahadevan 
6821cec0304SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
6831cec0304SVijay Mahadevan 
6841cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
6851cec0304SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
6861cec0304SVijay Mahadevan     ierr = DMMoabVecGetArray(dm,fvec,&varray);CHKERRQ(ierr);
6871cec0304SVijay Mahadevan     for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
6881cec0304SVijay Mahadevan       moab::EntityHandle vtx = (*iter);
6891cec0304SVijay Mahadevan 
6901cec0304SVijay Mahadevan       /* get field dof index */
6911cec0304SVijay Mahadevan       ierr = PetscSectionGetFieldOffset(section, vtx, ifield, &doff);
6921cec0304SVijay Mahadevan 
6931cec0304SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
6941cec0304SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr);
6951cec0304SVijay Mahadevan     }
6961cec0304SVijay Mahadevan     ierr = DMMoabVecRestoreArray(dm,fvec,&varray);CHKERRQ(ierr);
6971cec0304SVijay Mahadevan   }
6981cec0304SVijay Mahadevan   else {
6991cec0304SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&varray);CHKERRQ(ierr);
7001cec0304SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
7011cec0304SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
7021cec0304SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr);
7031cec0304SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
7041cec0304SVijay Mahadevan     merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
7051cec0304SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
7061cec0304SVijay Mahadevan   }
7071cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7081cec0304SVijay Mahadevan }
7091cec0304SVijay Mahadevan 
7101cec0304SVijay Mahadevan 
7111cec0304SVijay Mahadevan #undef __FUNCT__
7121cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities"
7131cec0304SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces)
7141cec0304SVijay Mahadevan {
7151cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
7161cec0304SVijay Mahadevan 
7171cec0304SVijay Mahadevan   PetscFunctionBegin;
7181cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7191cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7201cec0304SVijay Mahadevan 
7211cec0304SVijay Mahadevan   if (bdvtx)  *bdvtx = *dmmoab->bndyvtx;
7221cec0304SVijay Mahadevan   if (bdfaces)  *bdfaces = *dmmoab->bndyfaces;
7231cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7241cec0304SVijay Mahadevan }
7251cec0304SVijay Mahadevan 
7261cec0304SVijay Mahadevan 
7271cec0304SVijay Mahadevan #undef __FUNCT__
7281cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabOutput"
7291cec0304SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* fname,const char* wopts)
7301cec0304SVijay Mahadevan {
7311cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
7321cec0304SVijay Mahadevan   moab::ErrorCode merr;
7331cec0304SVijay Mahadevan 
7341cec0304SVijay Mahadevan   PetscFunctionBegin;
7351cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7361cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7371cec0304SVijay Mahadevan 
7381cec0304SVijay Mahadevan   // output file, using parallel write
7391cec0304SVijay Mahadevan   merr = dmmoab->mbiface->write_file(fname, NULL, wopts);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr);
7401cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7411cec0304SVijay Mahadevan }
7421cec0304SVijay Mahadevan 
7431cec0304SVijay Mahadevan 
7441cec0304SVijay Mahadevan #undef __FUNCT__
7451cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields"
7461cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields)
7471cec0304SVijay Mahadevan {
7481cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
7491cec0304SVijay Mahadevan 
7501cec0304SVijay Mahadevan   PetscFunctionBegin;
7511cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7521cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7531cec0304SVijay Mahadevan 
7541cec0304SVijay Mahadevan   dmmoab->fields = fields;
7551cec0304SVijay Mahadevan   dmmoab->nfields = nfields;
7561cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7571cec0304SVijay Mahadevan }
7581cec0304SVijay Mahadevan 
7591cec0304SVijay Mahadevan 
7601cec0304SVijay Mahadevan #undef __FUNCT__
7611cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
7621cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
7631cec0304SVijay Mahadevan {
7641cec0304SVijay Mahadevan   PetscSection section;
7651cec0304SVijay Mahadevan   PetscErrorCode ierr;
7661cec0304SVijay Mahadevan 
7671cec0304SVijay Mahadevan   PetscFunctionBegin;
7681cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7691cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
7701cec0304SVijay Mahadevan   ierr = PetscSectionGetFieldDof(section, (PetscInt)point, field, dof);CHKERRQ(ierr);
7711cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7721cec0304SVijay Mahadevan }
7731cec0304SVijay Mahadevan 
7741cec0304SVijay Mahadevan 
7751cec0304SVijay Mahadevan #undef __FUNCT__
7761cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
7771cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
7781cec0304SVijay Mahadevan {
7791cec0304SVijay Mahadevan   PetscInt i;
7801cec0304SVijay Mahadevan   PetscSection section;
7811cec0304SVijay Mahadevan   PetscErrorCode ierr;
7821cec0304SVijay Mahadevan 
7831cec0304SVijay Mahadevan   PetscFunctionBegin;
7841cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7851cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
7861cec0304SVijay Mahadevan   if (!dof) {
7871cec0304SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
7881cec0304SVijay Mahadevan   }
7891cec0304SVijay Mahadevan   for (i=0; i<npoints; ++i) {
7901cec0304SVijay Mahadevan     ierr = PetscSectionGetFieldDof(section, (PetscInt)points[i], field, &dof[i]);CHKERRQ(ierr);
7911cec0304SVijay Mahadevan   }
7921cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7931cec0304SVijay Mahadevan }
7941cec0304SVijay Mahadevan 
7951cec0304SVijay Mahadevan 
796