xref: /petsc/src/dm/impls/moab/dmmoab.cxx (revision 7023aa4408afddbf9542d78375f0bba9193e5517)
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;
466e40195eSVijay 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     }
1016e40195eSVijay Mahadevan 
1026e40195eSVijay Mahadevan     /* find out the local and global minima of GLOBAL_ID */
1036e40195eSVijay Mahadevan     local_min=gsindices[0];
1046e40195eSVijay Mahadevan     for (i=1; i<totsize; ++i)
1056e40195eSVijay Mahadevan       if(local_min>gsindices[i]) local_min=gsindices[i];
1066e40195eSVijay Mahadevan 
1076e40195eSVijay Mahadevan     ierr = MPI_Allreduce(&local_min, &global_min, 1, MPI_INT, MPI_MIN, ((PetscObject)dm)->comm);CHKERRQ(ierr);
1086e40195eSVijay 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) {
1166e40195eSVijay 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) {
1206e40195eSVijay 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 {
1246e40195eSVijay Mahadevan           ierr = PetscSectionSetFieldDof(section, j, i, totsize*i+locgid);CHKERRQ(ierr);
1251cec0304SVijay Mahadevan           ierr = PetscSectionSetFieldOffset(section, j, i, totsize);
126*7023aa44SVijay Mahadevan           PetscPrintf(PETSC_COMM_SELF, "[%D] Index - %D, Local_GID = %D, FDOF = %D, OFF = %D.\n", dmmoab->pcomm->rank(), j, locgid, totsize*i+locgid, totsize );
1271cec0304SVijay Mahadevan         }
1281cec0304SVijay Mahadevan       }
1291cec0304SVijay Mahadevan       ierr = PetscSectionSetDof(section, j, dmmoab->nfields);CHKERRQ(ierr);
1301cec0304SVijay Mahadevan     }
1311cec0304SVijay Mahadevan     ierr = PetscSectionSetUp(section);CHKERRQ(ierr);
1321cec0304SVijay Mahadevan     ierr = DMSetDefaultSection(dm, section);CHKERRQ(ierr);
1331cec0304SVijay Mahadevan   }
1341cec0304SVijay Mahadevan 
1351cec0304SVijay Mahadevan   {
136032b8ab6SVijay Mahadevan     /* Create Global to Local Vector Scatter Context */
137032b8ab6SVijay Mahadevan     ierr = DMCreateGlobalVector_Moab(dm, &global);CHKERRQ(ierr);
138032b8ab6SVijay Mahadevan     ierr = DMCreateLocalVector_Moab(dm, &local);CHKERRQ(ierr);
139032b8ab6SVijay Mahadevan 
1406e40195eSVijay Mahadevan     for (i=0; i<totsize; ++i)
1416e40195eSVijay Mahadevan       gsindices[i]-=global_min;   /* zero based index needed for IS */
1421cec0304SVijay Mahadevan 
143032b8ab6SVijay Mahadevan     /* global to local must retrieve ghost points */
1441cec0304SVijay Mahadevan     ierr = ISCreateBlock(((PetscObject)dm)->comm,bs,totsize,&gsindices[0],PETSC_COPY_VALUES,&from);CHKERRQ(ierr);
145032b8ab6SVijay Mahadevan 
146db66d124SVijay Mahadevan     ierr = VecGetLocalSize(global,&gsiz);CHKERRQ(ierr);
147db66d124SVijay Mahadevan     ierr = VecGetLocalSize(local,&lsiz);CHKERRQ(ierr);
148032b8ab6SVijay Mahadevan 
149032b8ab6SVijay Mahadevan     ierr = VecScatterCreate(local,from,global,from,&dmmoab->ltog_sendrecv);CHKERRQ(ierr);
150032b8ab6SVijay Mahadevan     ierr = ISDestroy(&from);CHKERRQ(ierr);
151032b8ab6SVijay Mahadevan     ierr = VecDestroy(&local);CHKERRQ(ierr);
152032b8ab6SVijay Mahadevan     ierr = VecDestroy(&global);CHKERRQ(ierr);
153032b8ab6SVijay Mahadevan   }
154032b8ab6SVijay Mahadevan 
1551cec0304SVijay Mahadevan   /* skin the boundary and store nodes */
1561cec0304SVijay Mahadevan   {
1571cec0304SVijay Mahadevan     // get the skin vertices of those faces and mark them as fixed; we don't want to fix the vertices on a
1581cec0304SVijay Mahadevan     // part boundary, but since we exchanged a layer of ghost faces, those vertices aren't on the skin locally
1591cec0304SVijay Mahadevan     // ok to mark non-owned skin vertices too, I won't move those anyway
1601cec0304SVijay Mahadevan     // use MOAB's skinner class to find the skin
1611cec0304SVijay Mahadevan     moab::Skinner skinner(dmmoab->mbiface);
1621cec0304SVijay Mahadevan     dmmoab->bndyvtx = new moab::Range();
1631cec0304SVijay Mahadevan     dmmoab->bndyfaces = new moab::Range();
1641cec0304SVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, true, *dmmoab->bndyvtx);MBERRNM(merr); // 'true' param indicates we want vertices back, not faces
1651cec0304SVijay Mahadevan     merr = skinner.find_skin(dmmoab->fileset, *dmmoab->elocal, false, *dmmoab->bndyfaces);MBERRNM(merr); // 'false' param indicates we want faces back, not vertices
1666e40195eSVijay Mahadevan     PetscInfo2(dm, "Found %D boundary vertices and %D faces.\n", dmmoab->bndyvtx->size(), dmmoab->bndyvtx->size());
1671cec0304SVijay Mahadevan   }
1681cec0304SVijay Mahadevan 
1691cec0304SVijay Mahadevan   ierr = PetscFree(gsindices);CHKERRQ(ierr);
170032b8ab6SVijay Mahadevan   PetscFunctionReturn(0);
171032b8ab6SVijay Mahadevan }
172032b8ab6SVijay Mahadevan 
1731cec0304SVijay Mahadevan 
174032b8ab6SVijay Mahadevan #undef __FUNCT__
175aa768e4cSTim Tautges #define __FUNCT__ "DMCreate_Moab"
176853cdec3SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_Moab(DM dm)
177aa768e4cSTim Tautges {
178aa768e4cSTim Tautges   PetscErrorCode ierr;
179aa768e4cSTim Tautges 
180aa768e4cSTim Tautges   PetscFunctionBegin;
181aa768e4cSTim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
182032b8ab6SVijay Mahadevan   ierr = PetscNewLog(dm,&dm->data);CHKERRQ(ierr);
183032b8ab6SVijay Mahadevan 
184032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->bs = 1;
185032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->n = 0;
186032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nloc = 0;
187032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nele = 0;
188032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->neleloc = 0;
189032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->nghost = 0;
190032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_map = PETSC_NULL;
191032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->ltog_sendrecv = PETSC_NULL;
192032b8ab6SVijay Mahadevan 
193032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vlocal = new moab::Range();
194032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vowned = new moab::Range();
195032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->vghost = new moab::Range();
196032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->elocal = new moab::Range();
197032b8ab6SVijay Mahadevan   ((DM_Moab*)dm->data)->eghost = new moab::Range();
198aa768e4cSTim Tautges 
19997ea90e6SJed Brown   dm->ops->createglobalvector              = DMCreateGlobalVector_Moab;
20097ea90e6SJed Brown   dm->ops->createlocalvector               = DMCreateLocalVector_Moab;
201032b8ab6SVijay Mahadevan   dm->ops->creatematrix                    = DMCreateMatrix_Moab;
202032b8ab6SVijay Mahadevan   dm->ops->setup                           = DMSetUp_Moab;
20397ea90e6SJed Brown   dm->ops->destroy                         = DMDestroy_Moab;
204032b8ab6SVijay Mahadevan   dm->ops->globaltolocalbegin              = DMGlobalToLocalBegin_Moab;
205032b8ab6SVijay Mahadevan   dm->ops->globaltolocalend                = DMGlobalToLocalEnd_Moab;
206032b8ab6SVijay Mahadevan   dm->ops->localtoglobalbegin              = DMLocalToGlobalBegin_Moab;
207032b8ab6SVijay Mahadevan   dm->ops->localtoglobalend                = DMLocalToGlobalEnd_Moab;
208aa768e4cSTim Tautges   PetscFunctionReturn(0);
209aa768e4cSTim Tautges }
210fd349b41STim Tautges 
211fd349b41STim Tautges #undef __FUNCT__
2121d72bce8STim Tautges #define __FUNCT__ "DMMoabCreate"
2131d72bce8STim Tautges /*@
2141d72bce8STim Tautges   DMMoabCreate - Creates a DMMoab object, which encapsulates a moab instance
2151d72bce8STim Tautges 
2161d72bce8STim Tautges   Collective on MPI_Comm
2171d72bce8STim Tautges 
2181d72bce8STim Tautges   Input Parameter:
2191d72bce8STim Tautges . comm - The communicator for the DMMoab object
2201d72bce8STim Tautges 
2211d72bce8STim Tautges   Output Parameter:
222032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2231d72bce8STim Tautges 
2241d72bce8STim Tautges   Level: beginner
2251d72bce8STim Tautges 
2261d72bce8STim Tautges .keywords: DMMoab, create
2271d72bce8STim Tautges @*/
228032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreate(MPI_Comm comm, DM *dmb)
2291d72bce8STim Tautges {
2301d72bce8STim Tautges   PetscErrorCode ierr;
2311d72bce8STim Tautges 
2321d72bce8STim Tautges   PetscFunctionBegin;
233032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,2);
234032b8ab6SVijay Mahadevan   ierr = DMCreate(comm, dmb);CHKERRQ(ierr);
235032b8ab6SVijay Mahadevan   ierr = DMSetType(*dmb, DMMOAB);CHKERRQ(ierr);
2361d72bce8STim Tautges   PetscFunctionReturn(0);
2371d72bce8STim Tautges }
2381d72bce8STim Tautges 
2391d72bce8STim Tautges #undef __FUNCT__
240aa768e4cSTim Tautges #define __FUNCT__ "DMMoabCreateMoab"
2411d72bce8STim Tautges /*@
242a4d2169cSTim Tautges   DMMoabCreate - Creates a DMMoab object, optionally from an instance and other data
2431d72bce8STim Tautges 
2441d72bce8STim Tautges   Collective on MPI_Comm
2451d72bce8STim Tautges 
2461d72bce8STim Tautges   Input Parameter:
2471d72bce8STim Tautges . comm - The communicator for the DMMoab object
248032b8ab6SVijay Mahadevan . mbiface - (ptr to) the MOAB Instance; if passed in NULL, MOAB instance is created inside PETSc, and destroyed
249a4d2169cSTim Tautges          along with the DMMoab
250a4d2169cSTim Tautges . pcomm - (ptr to) a ParallelComm; if NULL, creates one internally for the whole communicator
2511d72bce8STim Tautges . ltog_tag - A tag to use to retrieve global id for an entity; if 0, will use GLOBAL_ID_TAG_NAME/tag
2521d72bce8STim Tautges . range - If non-NULL, contains range of entities to which DOFs will be assigned
2531d72bce8STim Tautges 
2541d72bce8STim Tautges   Output Parameter:
255032b8ab6SVijay Mahadevan . dmb  - The DMMoab object
2561d72bce8STim Tautges 
257032b8ab6SVijay Mahadevan   Level: intermediate
2581d72bce8STim Tautges 
2591d72bce8STim Tautges .keywords: DMMoab, create
2601d72bce8STim Tautges @*/
261032b8ab6SVijay Mahadevan PetscErrorCode DMMoabCreateMoab(MPI_Comm comm, moab::Interface *mbiface, moab::ParallelComm *pcomm, moab::Tag *ltog_tag, moab::Range *range, DM *dmb)
2621d72bce8STim Tautges {
2631d72bce8STim Tautges   PetscErrorCode ierr;
264032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
2651cec0304SVijay Mahadevan   moab::EntityHandle partnset;
2661cec0304SVijay Mahadevan   PetscInt rank, nprocs;
267853cdec3SJed Brown   DM_Moab        *dmmoab;
2681d72bce8STim Tautges 
2691d72bce8STim Tautges   PetscFunctionBegin;
270032b8ab6SVijay Mahadevan   PetscValidPointer(dmb,6);
271032b8ab6SVijay Mahadevan   ierr = DMMoabCreate(comm, dmb);CHKERRQ(ierr);
272032b8ab6SVijay Mahadevan   dmmoab = (DM_Moab*)(*dmb)->data;
273a4d2169cSTim Tautges 
274a4d2169cSTim Tautges   if (!mbiface) {
27572ff976dSVijay Mahadevan     dmmoab->mbiface = new moab::Core();
2767d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_TRUE;
2771d72bce8STim Tautges   }
2781cec0304SVijay Mahadevan   else {
2791cec0304SVijay Mahadevan     dmmoab->mbiface = mbiface;
2807d89fc02STim Tautges     dmmoab->icreatedinstance = PETSC_FALSE;
2811cec0304SVijay Mahadevan   }
2821cec0304SVijay Mahadevan 
2831cec0304SVijay Mahadevan   /* create a fileset to store the hierarchy of entities belonging to current DM */
2841cec0304SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_ORDERED, dmmoab->fileset);MBERR("Creating file set failed", merr);
2857d89fc02STim Tautges 
286a4d2169cSTim Tautges   if (!pcomm) {
287032b8ab6SVijay Mahadevan     ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
288032b8ab6SVijay Mahadevan     ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
289032b8ab6SVijay Mahadevan 
290db66d124SVijay Mahadevan     /* Create root sets for each mesh.  Then pass these
291db66d124SVijay Mahadevan        to the load_file functions to be populated. */
29272ff976dSVijay Mahadevan     merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, partnset);
293032b8ab6SVijay Mahadevan     MBERR("Creating partition set failed", merr);
294032b8ab6SVijay Mahadevan 
295db66d124SVijay Mahadevan     /* Create the parallel communicator object with the partition handle associated with MOAB */
29672ff976dSVijay Mahadevan     dmmoab->pcomm = moab::ParallelComm::get_pcomm(dmmoab->mbiface, partnset, &comm);
29772ff976dSVijay Mahadevan   }
29872ff976dSVijay Mahadevan   else {
29972ff976dSVijay Mahadevan     ierr = DMMoabSetParallelComm(*dmb, pcomm);CHKERRQ(ierr);
300032b8ab6SVijay Mahadevan   }
301032b8ab6SVijay Mahadevan 
3024973de03SVijay Mahadevan   /* do the remaining initializations for DMMoab */
3034973de03SVijay Mahadevan   dmmoab->bs       = 1;
3044973de03SVijay Mahadevan 
3054973de03SVijay Mahadevan   /* set global ID tag handle */
306032b8ab6SVijay Mahadevan   if (!ltog_tag) {
3074973de03SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME, dmmoab->ltog_tag);MBERRNM(merr);
308032b8ab6SVijay Mahadevan   }
309032b8ab6SVijay Mahadevan   else {
310032b8ab6SVijay Mahadevan     ierr = DMMoabSetLocalToGlobalTag(*dmb, *ltog_tag);CHKERRQ(ierr);
311a4d2169cSTim Tautges   }
312a4d2169cSTim Tautges 
3134973de03SVijay Mahadevan   /* set the local range of entities (vertices) of interest */
314a4d2169cSTim Tautges   if (range) {
3155eb88e9dSVijay Mahadevan     ierr = DMMoabSetLocalVertices(*dmb, range);CHKERRQ(ierr);
316a4d2169cSTim Tautges   }
3171d72bce8STim Tautges   PetscFunctionReturn(0);
3181d72bce8STim Tautges }
3191d72bce8STim Tautges 
3201d72bce8STim Tautges #undef __FUNCT__
3211d72bce8STim Tautges #define __FUNCT__ "DMMoabSetParallelComm"
322aa768e4cSTim Tautges /*@
323aa768e4cSTim Tautges   DMMoabSetParallelComm - Set the ParallelComm used with this DMMoab
324aa768e4cSTim Tautges 
325aa768e4cSTim Tautges   Collective on MPI_Comm
326aa768e4cSTim Tautges 
327aa768e4cSTim Tautges   Input Parameter:
328aa768e4cSTim Tautges . dm    - The DMMoab object being set
329aa768e4cSTim Tautges . pcomm - The ParallelComm being set on the DMMoab
330aa768e4cSTim Tautges 
331aa768e4cSTim Tautges   Level: beginner
332aa768e4cSTim Tautges 
333aa768e4cSTim Tautges .keywords: DMMoab, create
334aa768e4cSTim Tautges @*/
3351d72bce8STim Tautges PetscErrorCode DMMoabSetParallelComm(DM dm,moab::ParallelComm *pcomm)
3361d72bce8STim Tautges {
337032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
338032b8ab6SVijay Mahadevan 
3391d72bce8STim Tautges   PetscFunctionBegin;
3401d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3411cec0304SVijay Mahadevan   PetscValidPointer(pcomm,2);
342032b8ab6SVijay Mahadevan   dmmoab->pcomm = pcomm;
343032b8ab6SVijay Mahadevan   dmmoab->mbiface = pcomm->get_moab();
344032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
3451d72bce8STim Tautges   PetscFunctionReturn(0);
3461d72bce8STim Tautges }
3471d72bce8STim Tautges 
3481d72bce8STim Tautges 
3491d72bce8STim Tautges #undef __FUNCT__
3501d72bce8STim Tautges #define __FUNCT__ "DMMoabGetParallelComm"
351aa768e4cSTim Tautges /*@
352aa768e4cSTim Tautges   DMMoabGetParallelComm - Get the ParallelComm used with this DMMoab
353aa768e4cSTim Tautges 
354aa768e4cSTim Tautges   Collective on MPI_Comm
355aa768e4cSTim Tautges 
356aa768e4cSTim Tautges   Input Parameter:
357aa768e4cSTim Tautges . dm    - The DMMoab object being set
358aa768e4cSTim Tautges 
359aa768e4cSTim Tautges   Output Parameter:
360aa768e4cSTim Tautges . pcomm - The ParallelComm for the DMMoab
361aa768e4cSTim Tautges 
362aa768e4cSTim Tautges   Level: beginner
363aa768e4cSTim Tautges 
364aa768e4cSTim Tautges .keywords: DMMoab, create
365aa768e4cSTim Tautges @*/
3661d72bce8STim Tautges PetscErrorCode DMMoabGetParallelComm(DM dm,moab::ParallelComm **pcomm)
3671d72bce8STim Tautges {
3681d72bce8STim Tautges   PetscFunctionBegin;
3691d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
370032b8ab6SVijay Mahadevan   *pcomm = ((DM_Moab*)(dm)->data)->pcomm;
3711d72bce8STim Tautges   PetscFunctionReturn(0);
3721d72bce8STim Tautges }
3731d72bce8STim Tautges 
3741d72bce8STim Tautges 
3751d72bce8STim Tautges #undef __FUNCT__
3761d72bce8STim Tautges #define __FUNCT__ "DMMoabSetInterface"
377aa768e4cSTim Tautges /*@
378aa768e4cSTim Tautges   DMMoabSetInterface - Set the MOAB instance used with this DMMoab
379aa768e4cSTim Tautges 
380aa768e4cSTim Tautges   Collective on MPI_Comm
381aa768e4cSTim Tautges 
382aa768e4cSTim Tautges   Input Parameter:
383aa768e4cSTim Tautges . dm      - The DMMoab object being set
384aa768e4cSTim Tautges . mbiface - The MOAB instance being set on this DMMoab
385aa768e4cSTim Tautges 
386aa768e4cSTim Tautges   Level: beginner
387aa768e4cSTim Tautges 
388aa768e4cSTim Tautges .keywords: DMMoab, create
389aa768e4cSTim Tautges @*/
390a4d2169cSTim Tautges PetscErrorCode DMMoabSetInterface(DM dm,moab::Interface *mbiface)
3911d72bce8STim Tautges {
392032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
393032b8ab6SVijay Mahadevan 
3941d72bce8STim Tautges   PetscFunctionBegin;
3951d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3961cec0304SVijay Mahadevan   PetscValidPointer(mbiface,2);
397032b8ab6SVijay Mahadevan   dmmoab->pcomm = NULL;
398032b8ab6SVijay Mahadevan   dmmoab->mbiface = mbiface;
399032b8ab6SVijay Mahadevan   dmmoab->icreatedinstance = PETSC_FALSE;
4001d72bce8STim Tautges   PetscFunctionReturn(0);
4011d72bce8STim Tautges }
4021d72bce8STim Tautges 
4031d72bce8STim Tautges 
4041d72bce8STim Tautges #undef __FUNCT__
4051d72bce8STim Tautges #define __FUNCT__ "DMMoabGetInterface"
406aa768e4cSTim Tautges /*@
407aa768e4cSTim Tautges   DMMoabGetInterface - Get the MOAB instance used with this DMMoab
408aa768e4cSTim Tautges 
409aa768e4cSTim Tautges   Collective on MPI_Comm
410aa768e4cSTim Tautges 
411aa768e4cSTim Tautges   Input Parameter:
412aa768e4cSTim Tautges . dm      - The DMMoab object being set
413aa768e4cSTim Tautges 
414aa768e4cSTim Tautges   Output Parameter:
415aa768e4cSTim Tautges . mbiface - The MOAB instance set on this DMMoab
416aa768e4cSTim Tautges 
417aa768e4cSTim Tautges   Level: beginner
418aa768e4cSTim Tautges 
419aa768e4cSTim Tautges .keywords: DMMoab, create
420aa768e4cSTim Tautges @*/
421a4d2169cSTim Tautges PetscErrorCode DMMoabGetInterface(DM dm,moab::Interface **mbiface)
4221d72bce8STim Tautges {
4239426e041SSatish Balay   PetscErrorCode   ierr;
424cabb514dSBarry Smith   static PetscBool cite = PETSC_FALSE;
425cabb514dSBarry Smith 
4261d72bce8STim Tautges   PetscFunctionBegin;
4271d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
428cabb514dSBarry 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);
429a4d2169cSTim Tautges   *mbiface = ((DM_Moab*)dm->data)->mbiface;
4301d72bce8STim Tautges   PetscFunctionReturn(0);
4311d72bce8STim Tautges }
4321d72bce8STim Tautges 
4331d72bce8STim Tautges 
4341d72bce8STim Tautges #undef __FUNCT__
4355eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalVertices"
436aa768e4cSTim Tautges /*@
4375eb88e9dSVijay Mahadevan   DMMoabSetLocalVertices - Set the entities having DOFs on this DMMoab
438aa768e4cSTim Tautges 
439aa768e4cSTim Tautges   Collective on MPI_Comm
440aa768e4cSTim Tautges 
441aa768e4cSTim Tautges   Input Parameter:
442aa768e4cSTim Tautges . dm    - The DMMoab object being set
443aa768e4cSTim Tautges . range - The entities treated by this DMMoab
444aa768e4cSTim Tautges 
445aa768e4cSTim Tautges   Level: beginner
446aa768e4cSTim Tautges 
447aa768e4cSTim Tautges .keywords: DMMoab, create
448aa768e4cSTim Tautges @*/
4495eb88e9dSVijay Mahadevan PetscErrorCode DMMoabSetLocalVertices(DM dm,moab::Range *range)
4501d72bce8STim Tautges {
451032b8ab6SVijay Mahadevan   moab::ErrorCode merr;
452032b8ab6SVijay Mahadevan   PetscErrorCode  ierr;
453032b8ab6SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
454032b8ab6SVijay Mahadevan 
4551d72bce8STim Tautges   PetscFunctionBegin;
4561d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
457032b8ab6SVijay Mahadevan   dmmoab->vlocal->clear();
458032b8ab6SVijay Mahadevan   dmmoab->vowned->clear();
459032b8ab6SVijay Mahadevan   dmmoab->vlocal->insert(range->begin(), range->end());
460032b8ab6SVijay Mahadevan   *dmmoab->vowned = *dmmoab->vlocal;
461032b8ab6SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->vowned,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
462032b8ab6SVijay Mahadevan   *dmmoab->vghost = moab::subtract(*range, *dmmoab->vowned);
463032b8ab6SVijay Mahadevan   dmmoab->nloc=dmmoab->vowned->size();
464032b8ab6SVijay Mahadevan   dmmoab->nghost=dmmoab->vghost->size();
465032b8ab6SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nloc, &dmmoab->n, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
4661d72bce8STim Tautges   PetscFunctionReturn(0);
4671d72bce8STim Tautges }
4681d72bce8STim Tautges 
4691d72bce8STim Tautges 
4701d72bce8STim Tautges #undef __FUNCT__
4715eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalVertices"
472aa768e4cSTim Tautges /*@
4735eb88e9dSVijay Mahadevan   DMMoabGetLocalVertices - Get the entities having DOFs on 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:
4815eb88e9dSVijay Mahadevan . owned - The owned vertex entities in this DMMoab
4825eb88e9dSVijay Mahadevan . ghost - The ghosted entities (non-owned) stored locally in this partition
483aa768e4cSTim Tautges 
484aa768e4cSTim Tautges   Level: beginner
485aa768e4cSTim Tautges 
486aa768e4cSTim Tautges .keywords: DMMoab, create
487aa768e4cSTim Tautges @*/
4881cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalVertices(DM dm,moab::Range *owned,moab::Range *ghost)
4891d72bce8STim Tautges {
4901d72bce8STim Tautges   PetscFunctionBegin;
4911d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4921cec0304SVijay Mahadevan   if (owned) *owned = *((DM_Moab*)dm->data)->vowned;
4931cec0304SVijay Mahadevan   if (ghost) *ghost = *((DM_Moab*)dm->data)->vghost;
4941d72bce8STim Tautges   PetscFunctionReturn(0);
4951d72bce8STim Tautges }
4961d72bce8STim Tautges 
4971d72bce8STim Tautges #undef __FUNCT__
4985eb88e9dSVijay Mahadevan #define __FUNCT__ "DMMoabGetLocalElements"
4995eb88e9dSVijay Mahadevan /*@
5005eb88e9dSVijay Mahadevan   DMMoabGetLocalElements - Get the higher-dimensional entities that are locally owned
5015eb88e9dSVijay Mahadevan 
5025eb88e9dSVijay Mahadevan   Collective on MPI_Comm
5035eb88e9dSVijay Mahadevan 
5045eb88e9dSVijay Mahadevan   Input Parameter:
5055eb88e9dSVijay Mahadevan . dm    - The DMMoab object being set
5065eb88e9dSVijay Mahadevan 
5075eb88e9dSVijay Mahadevan   Output Parameter:
5085eb88e9dSVijay Mahadevan . range - The entities owned locally
5095eb88e9dSVijay Mahadevan 
5105eb88e9dSVijay Mahadevan   Level: beginner
5115eb88e9dSVijay Mahadevan 
5125eb88e9dSVijay Mahadevan .keywords: DMMoab, create
5135eb88e9dSVijay Mahadevan @*/
5141cec0304SVijay Mahadevan PetscErrorCode DMMoabGetLocalElements(DM dm,moab::Range *range)
5155eb88e9dSVijay Mahadevan {
5165eb88e9dSVijay Mahadevan   PetscFunctionBegin;
5175eb88e9dSVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5181cec0304SVijay Mahadevan   if (range) *range = *((DM_Moab*)dm->data)->elocal;
5191cec0304SVijay Mahadevan   PetscFunctionReturn(0);
5201cec0304SVijay Mahadevan }
5211cec0304SVijay Mahadevan 
5221cec0304SVijay Mahadevan 
5231cec0304SVijay Mahadevan #undef __FUNCT__
5241cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetLocalElements"
5251cec0304SVijay Mahadevan /*@
5261cec0304SVijay Mahadevan   DMMoabSetLocalElements - Set the entities having DOFs on this DMMoab
5271cec0304SVijay Mahadevan 
5281cec0304SVijay Mahadevan   Collective on MPI_Comm
5291cec0304SVijay Mahadevan 
5301cec0304SVijay Mahadevan   Input Parameter:
5311cec0304SVijay Mahadevan . dm    - The DMMoab object being set
5321cec0304SVijay Mahadevan . range - The entities treated by this DMMoab
5331cec0304SVijay Mahadevan 
5341cec0304SVijay Mahadevan   Level: beginner
5351cec0304SVijay Mahadevan 
5361cec0304SVijay Mahadevan .keywords: DMMoab, create
5371cec0304SVijay Mahadevan @*/
5381cec0304SVijay Mahadevan PetscErrorCode DMMoabSetLocalElements(DM dm,moab::Range *range)
5391cec0304SVijay Mahadevan {
5401cec0304SVijay Mahadevan   moab::ErrorCode merr;
5411cec0304SVijay Mahadevan   PetscErrorCode  ierr;
5421cec0304SVijay Mahadevan   DM_Moab        *dmmoab = (DM_Moab*)(dm)->data;
5431cec0304SVijay Mahadevan 
5441cec0304SVijay Mahadevan   PetscFunctionBegin;
5451cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5461cec0304SVijay Mahadevan   dmmoab->elocal->clear();
5471cec0304SVijay Mahadevan   dmmoab->eghost->clear();
5481cec0304SVijay Mahadevan   dmmoab->elocal->insert(range->begin(), range->end());
5491cec0304SVijay Mahadevan   PetscInfo2(dm, "Range size = %D; elocal size = %D.\n", range->size(), dmmoab->elocal->size());
5501cec0304SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(*dmmoab->elocal,PSTATUS_NOT_OWNED,PSTATUS_NOT);MBERRNM(merr);
5511cec0304SVijay Mahadevan   *dmmoab->eghost = moab::subtract(*range, *dmmoab->elocal);
5521cec0304SVijay Mahadevan   dmmoab->neleloc=dmmoab->elocal->size();
5531cec0304SVijay Mahadevan   ierr = MPI_Allreduce(&dmmoab->nele, &dmmoab->neleloc, 1, MPI_INTEGER, MPI_SUM, ((PetscObject)dm)->comm);CHKERRQ(ierr);
5541cec0304SVijay Mahadevan   PetscInfo2(dm, "Created %D local and %D glocal elements.\n", dmmoab->neleloc, dmmoab->nele);
5555eb88e9dSVijay Mahadevan   PetscFunctionReturn(0);
5565eb88e9dSVijay Mahadevan }
5575eb88e9dSVijay Mahadevan 
5585eb88e9dSVijay Mahadevan 
5595eb88e9dSVijay Mahadevan #undef __FUNCT__
5601d72bce8STim Tautges #define __FUNCT__ "DMMoabSetLocalToGlobalTag"
561aa768e4cSTim Tautges /*@
562aa768e4cSTim Tautges   DMMoabSetLocalToGlobalTag - Set the tag used for local to global numbering
563aa768e4cSTim Tautges 
564aa768e4cSTim Tautges   Collective on MPI_Comm
565aa768e4cSTim Tautges 
566aa768e4cSTim Tautges   Input Parameter:
567aa768e4cSTim Tautges . dm      - The DMMoab object being set
568aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
569aa768e4cSTim Tautges 
570aa768e4cSTim Tautges   Level: beginner
571aa768e4cSTim Tautges 
572aa768e4cSTim Tautges .keywords: DMMoab, create
573aa768e4cSTim Tautges @*/
5741d72bce8STim Tautges PetscErrorCode DMMoabSetLocalToGlobalTag(DM dm,moab::Tag ltogtag)
5751d72bce8STim Tautges {
5761d72bce8STim Tautges   PetscFunctionBegin;
5771d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5781d72bce8STim Tautges   ((DM_Moab*)dm->data)->ltog_tag = ltogtag;
5791d72bce8STim Tautges   PetscFunctionReturn(0);
5801d72bce8STim Tautges }
5811d72bce8STim Tautges 
5821d72bce8STim Tautges 
5831d72bce8STim Tautges #undef __FUNCT__
5841d72bce8STim Tautges #define __FUNCT__ "DMMoabGetLocalToGlobalTag"
585aa768e4cSTim Tautges /*@
586aa768e4cSTim Tautges   DMMoabGetLocalToGlobalTag - Get the tag used for local to global numbering
587aa768e4cSTim Tautges 
588aa768e4cSTim Tautges   Collective on MPI_Comm
589aa768e4cSTim Tautges 
590aa768e4cSTim Tautges   Input Parameter:
591aa768e4cSTim Tautges . dm      - The DMMoab object being set
592aa768e4cSTim Tautges 
593aa768e4cSTim Tautges   Output Parameter:
594aa768e4cSTim Tautges . ltogtag - The MOAB tag used for local to global ids
595aa768e4cSTim Tautges 
596aa768e4cSTim Tautges   Level: beginner
597aa768e4cSTim Tautges 
598aa768e4cSTim Tautges .keywords: DMMoab, create
599aa768e4cSTim Tautges @*/
6001d72bce8STim Tautges PetscErrorCode DMMoabGetLocalToGlobalTag(DM dm,moab::Tag *ltog_tag)
6011d72bce8STim Tautges {
6021d72bce8STim Tautges   PetscFunctionBegin;
6031d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6041d72bce8STim Tautges   *ltog_tag = ((DM_Moab*)dm->data)->ltog_tag;
6051d72bce8STim Tautges   PetscFunctionReturn(0);
6061d72bce8STim Tautges }
6071d72bce8STim Tautges 
6081d72bce8STim Tautges 
6091d72bce8STim Tautges #undef __FUNCT__
6101d72bce8STim Tautges #define __FUNCT__ "DMMoabSetBlockSize"
611aa768e4cSTim Tautges /*@
612aa768e4cSTim Tautges   DMMoabSetBlockSize - Set the block size used with this DMMoab
613aa768e4cSTim Tautges 
614aa768e4cSTim Tautges   Collective on MPI_Comm
615aa768e4cSTim Tautges 
616aa768e4cSTim Tautges   Input Parameter:
617aa768e4cSTim Tautges . dm - The DMMoab object being set
618aa768e4cSTim Tautges . bs - The block size used with this DMMoab
619aa768e4cSTim Tautges 
620aa768e4cSTim Tautges   Level: beginner
621aa768e4cSTim Tautges 
622aa768e4cSTim Tautges .keywords: DMMoab, create
623aa768e4cSTim Tautges @*/
6241d72bce8STim Tautges PetscErrorCode DMMoabSetBlockSize(DM dm,PetscInt bs)
6251d72bce8STim Tautges {
6261d72bce8STim Tautges   PetscFunctionBegin;
6271d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6281d72bce8STim Tautges   ((DM_Moab*)dm->data)->bs = bs;
6291d72bce8STim Tautges   PetscFunctionReturn(0);
6301d72bce8STim Tautges }
6311d72bce8STim Tautges 
6321d72bce8STim Tautges 
6331d72bce8STim Tautges #undef __FUNCT__
6341d72bce8STim Tautges #define __FUNCT__ "DMMoabGetBlockSize"
635aa768e4cSTim Tautges /*@
636aa768e4cSTim Tautges   DMMoabGetBlockSize - Get the block size used with this DMMoab
637aa768e4cSTim Tautges 
638aa768e4cSTim Tautges   Collective on MPI_Comm
639aa768e4cSTim Tautges 
640aa768e4cSTim Tautges   Input Parameter:
641aa768e4cSTim Tautges . dm - The DMMoab object being set
642aa768e4cSTim Tautges 
643aa768e4cSTim Tautges   Output Parameter:
644aa768e4cSTim Tautges . bs - The block size used with this DMMoab
645aa768e4cSTim Tautges 
646aa768e4cSTim Tautges   Level: beginner
647aa768e4cSTim Tautges 
648aa768e4cSTim Tautges .keywords: DMMoab, create
649aa768e4cSTim Tautges @*/
6501d72bce8STim Tautges PetscErrorCode DMMoabGetBlockSize(DM dm,PetscInt *bs)
6511d72bce8STim Tautges {
6521d72bce8STim Tautges   PetscFunctionBegin;
6531d72bce8STim Tautges   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6541d72bce8STim Tautges   *bs = ((DM_Moab*)dm->data)->bs;
6551d72bce8STim Tautges   PetscFunctionReturn(0);
6561d72bce8STim Tautges }
6571d72bce8STim Tautges 
6581cec0304SVijay Mahadevan 
6591cec0304SVijay Mahadevan #undef __FUNCT__
6601cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector"
6611cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
6621cec0304SVijay Mahadevan {
6631cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
6641cec0304SVijay Mahadevan   moab::Tag     vtag,ntag;
6651cec0304SVijay Mahadevan   PetscScalar   *varray;
6661cec0304SVijay Mahadevan   moab::ErrorCode merr;
6671cec0304SVijay Mahadevan   PetscErrorCode  ierr;
6681cec0304SVijay Mahadevan   PetscSection section;
6691cec0304SVijay Mahadevan   PetscInt doff;
6701cec0304SVijay Mahadevan   std::string tag_name;
6711cec0304SVijay Mahadevan   moab::Range::iterator iter;
6721cec0304SVijay Mahadevan 
6731cec0304SVijay Mahadevan   PetscFunctionBegin;
6741cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6751cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6761cec0304SVijay Mahadevan 
6771cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
6781cec0304SVijay Mahadevan 
6791cec0304SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
6801cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fields[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
6811cec0304SVijay Mahadevan                                           moab::MB_TAG_SPARSE | moab::MB_TAG_CREAT);MBERRNM(merr);
6821cec0304SVijay Mahadevan 
6831cec0304SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
6841cec0304SVijay Mahadevan 
6851cec0304SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
6861cec0304SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
6871cec0304SVijay Mahadevan     ierr = DMMoabVecGetArray(dm,fvec,&varray);CHKERRQ(ierr);
6881cec0304SVijay Mahadevan     for(iter = dmmoab->vowned->begin(); iter != dmmoab->vowned->end(); iter++) {
6891cec0304SVijay Mahadevan       moab::EntityHandle vtx = (*iter);
6901cec0304SVijay Mahadevan 
6911cec0304SVijay Mahadevan       /* get field dof index */
6921cec0304SVijay Mahadevan       ierr = PetscSectionGetFieldOffset(section, vtx, ifield, &doff);
6931cec0304SVijay Mahadevan 
6941cec0304SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
6951cec0304SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, &vtx, 1, (const void*)&varray[doff]);MBERRNM(merr);
6961cec0304SVijay Mahadevan     }
6971cec0304SVijay Mahadevan     ierr = DMMoabVecRestoreArray(dm,fvec,&varray);CHKERRQ(ierr);
6981cec0304SVijay Mahadevan   }
6991cec0304SVijay Mahadevan   else {
7001cec0304SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&varray);CHKERRQ(ierr);
7011cec0304SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
7021cec0304SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
7031cec0304SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr);
7041cec0304SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
7051cec0304SVijay Mahadevan     merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
7061cec0304SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
7071cec0304SVijay Mahadevan   }
7081cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7091cec0304SVijay Mahadevan }
7101cec0304SVijay Mahadevan 
7111cec0304SVijay Mahadevan 
7121cec0304SVijay Mahadevan #undef __FUNCT__
713*7023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexCoordinates"
714*7023aa44SVijay Mahadevan PetscErrorCode DMMoabGetVertexCoordinates(DM dm,PetscInt nconn,const moab::EntityHandle *conn,PetscScalar *vpos)
715*7023aa44SVijay Mahadevan {
716*7023aa44SVijay Mahadevan   DM_Moab         *dmmoab;
717*7023aa44SVijay Mahadevan   PetscErrorCode  ierr;
718*7023aa44SVijay Mahadevan   moab::ErrorCode merr;
719*7023aa44SVijay Mahadevan 
720*7023aa44SVijay Mahadevan   PetscFunctionBegin;
721*7023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
722*7023aa44SVijay Mahadevan   PetscValidPointer(conn,3);
723*7023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
724*7023aa44SVijay Mahadevan 
725*7023aa44SVijay Mahadevan   if (!vpos) {
726*7023aa44SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*nconn*3, &vpos);CHKERRQ(ierr);
727*7023aa44SVijay Mahadevan   }
728*7023aa44SVijay Mahadevan 
729*7023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
730*7023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_coords(conn, nconn, vpos);MBERRNM(merr);
731*7023aa44SVijay Mahadevan   PetscFunctionReturn(0);
732*7023aa44SVijay Mahadevan }
733*7023aa44SVijay Mahadevan 
734*7023aa44SVijay Mahadevan 
735*7023aa44SVijay Mahadevan #undef __FUNCT__
736*7023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabGetElementConnectivity"
737*7023aa44SVijay Mahadevan PetscErrorCode DMMoabGetElementConnectivity(DM dm,moab::EntityHandle ehandle,PetscInt* nconn,const moab::EntityHandle **conn)
738*7023aa44SVijay Mahadevan {
739*7023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
740*7023aa44SVijay Mahadevan   const moab::EntityHandle *connect;
741*7023aa44SVijay Mahadevan   moab::ErrorCode merr;
742*7023aa44SVijay Mahadevan   PetscInt nnodes;
743*7023aa44SVijay Mahadevan 
744*7023aa44SVijay Mahadevan   PetscFunctionBegin;
745*7023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
746*7023aa44SVijay Mahadevan   PetscValidPointer(conn,4);
747*7023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
748*7023aa44SVijay Mahadevan 
749*7023aa44SVijay Mahadevan   /* Get connectivity information in MOAB canonical ordering */
750*7023aa44SVijay Mahadevan   merr = dmmoab->mbiface->get_connectivity(ehandle, connect, nnodes);MBERRNM(merr);
751*7023aa44SVijay Mahadevan   if (conn) *conn=connect;
752*7023aa44SVijay Mahadevan   if (nconn) *nconn=nnodes;
753*7023aa44SVijay Mahadevan   PetscFunctionReturn(0);
754*7023aa44SVijay Mahadevan }
755*7023aa44SVijay Mahadevan 
756*7023aa44SVijay Mahadevan 
757*7023aa44SVijay Mahadevan #undef __FUNCT__
758*7023aa44SVijay Mahadevan #define __FUNCT__ "DMMoabCheckBoundaryVertices"
759*7023aa44SVijay Mahadevan PetscErrorCode DMMoabCheckBoundaryVertices(DM dm,PetscInt nconn,const moab::EntityHandle *cnt,PetscBool* isbdvtx,PetscBool* elem_on_boundary)
760*7023aa44SVijay Mahadevan {
761*7023aa44SVijay Mahadevan   DM_Moab        *dmmoab;
762*7023aa44SVijay Mahadevan   PetscInt       i;
763*7023aa44SVijay Mahadevan 
764*7023aa44SVijay Mahadevan   PetscFunctionBegin;
765*7023aa44SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
766*7023aa44SVijay Mahadevan   PetscValidPointer(cnt,3);
767*7023aa44SVijay Mahadevan   PetscValidPointer(isbdvtx,4);
768*7023aa44SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
769*7023aa44SVijay Mahadevan 
770*7023aa44SVijay Mahadevan   if (elem_on_boundary) *elem_on_boundary = PETSC_FALSE;
771*7023aa44SVijay Mahadevan   for (i=0; i < nconn; ++i) {
772*7023aa44SVijay Mahadevan     moab::Range::const_iterator giter = dmmoab->bndyvtx->find(cnt[i]);
773*7023aa44SVijay Mahadevan     if (giter != dmmoab->bndyvtx->end()) {
774*7023aa44SVijay Mahadevan       isbdvtx[i] = PETSC_TRUE;
775*7023aa44SVijay Mahadevan       if (elem_on_boundary) *elem_on_boundary = PETSC_TRUE;
776*7023aa44SVijay Mahadevan     }
777*7023aa44SVijay Mahadevan     else isbdvtx[i] = PETSC_FALSE;
778*7023aa44SVijay Mahadevan   }
779*7023aa44SVijay Mahadevan   PetscFunctionReturn(0);
780*7023aa44SVijay Mahadevan }
781*7023aa44SVijay Mahadevan 
782*7023aa44SVijay Mahadevan 
783*7023aa44SVijay Mahadevan #undef __FUNCT__
7841cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetBoundaryEntities"
7851cec0304SVijay Mahadevan PetscErrorCode DMMoabGetBoundaryEntities(DM dm,moab::Range *bdvtx,moab::Range* bdfaces)
7861cec0304SVijay Mahadevan {
7871cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
7881cec0304SVijay Mahadevan 
7891cec0304SVijay Mahadevan   PetscFunctionBegin;
7901cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
7911cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
7921cec0304SVijay Mahadevan 
7931cec0304SVijay Mahadevan   if (bdvtx)  *bdvtx = *dmmoab->bndyvtx;
7941cec0304SVijay Mahadevan   if (bdfaces)  *bdfaces = *dmmoab->bndyfaces;
7951cec0304SVijay Mahadevan   PetscFunctionReturn(0);
7961cec0304SVijay Mahadevan }
7971cec0304SVijay Mahadevan 
7981cec0304SVijay Mahadevan 
7991cec0304SVijay Mahadevan #undef __FUNCT__
8001cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabOutput"
8011cec0304SVijay Mahadevan PetscErrorCode DMMoabOutput(DM dm,const char* fname,const char* wopts)
8021cec0304SVijay Mahadevan {
8031cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8041cec0304SVijay Mahadevan   moab::ErrorCode merr;
8051cec0304SVijay Mahadevan 
8061cec0304SVijay Mahadevan   PetscFunctionBegin;
8071cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8081cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8091cec0304SVijay Mahadevan 
8101cec0304SVijay Mahadevan   // output file, using parallel write
8111cec0304SVijay Mahadevan   merr = dmmoab->mbiface->write_file(fname, NULL, wopts);MBERRVM(dmmoab->mbiface,"Writing output of DMMoab failed.",merr);
8121cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8131cec0304SVijay Mahadevan }
8141cec0304SVijay Mahadevan 
8151cec0304SVijay Mahadevan 
8161cec0304SVijay Mahadevan #undef __FUNCT__
8171cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabSetFields"
8181cec0304SVijay Mahadevan PetscErrorCode DMMoabSetFields(DM dm,PetscInt nfields,const char** fields)
8191cec0304SVijay Mahadevan {
8201cec0304SVijay Mahadevan   DM_Moab        *dmmoab;
8211cec0304SVijay Mahadevan 
8221cec0304SVijay Mahadevan   PetscFunctionBegin;
8231cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8241cec0304SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
8251cec0304SVijay Mahadevan 
8261cec0304SVijay Mahadevan   dmmoab->fields = fields;
8271cec0304SVijay Mahadevan   dmmoab->nfields = nfields;
8281cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8291cec0304SVijay Mahadevan }
8301cec0304SVijay Mahadevan 
8311cec0304SVijay Mahadevan 
8321cec0304SVijay Mahadevan #undef __FUNCT__
8331cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
8341cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
8351cec0304SVijay Mahadevan {
8361cec0304SVijay Mahadevan   PetscSection section;
8371cec0304SVijay Mahadevan   PetscErrorCode ierr;
8381cec0304SVijay Mahadevan 
8391cec0304SVijay Mahadevan   PetscFunctionBegin;
8401cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8411cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
8421cec0304SVijay Mahadevan   ierr = PetscSectionGetFieldDof(section, (PetscInt)point, field, dof);CHKERRQ(ierr);
8431cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8441cec0304SVijay Mahadevan }
8451cec0304SVijay Mahadevan 
8461cec0304SVijay Mahadevan 
8471cec0304SVijay Mahadevan #undef __FUNCT__
8481cec0304SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
8491cec0304SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
8501cec0304SVijay Mahadevan {
8511cec0304SVijay Mahadevan   PetscInt i;
8521cec0304SVijay Mahadevan   PetscSection section;
8531cec0304SVijay Mahadevan   PetscErrorCode ierr;
8541cec0304SVijay Mahadevan 
8551cec0304SVijay Mahadevan   PetscFunctionBegin;
8561cec0304SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
8571cec0304SVijay Mahadevan   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
8581cec0304SVijay Mahadevan   if (!dof) {
8591cec0304SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscScalar)*npoints, &dof);CHKERRQ(ierr);
8601cec0304SVijay Mahadevan   }
8611cec0304SVijay Mahadevan   for (i=0; i<npoints; ++i) {
8621cec0304SVijay Mahadevan     ierr = PetscSectionGetFieldDof(section, (PetscInt)points[i], field, &dof[i]);CHKERRQ(ierr);
8631cec0304SVijay Mahadevan   }
8641cec0304SVijay Mahadevan   PetscFunctionReturn(0);
8651cec0304SVijay Mahadevan }
8661cec0304SVijay Mahadevan 
8671cec0304SVijay Mahadevan 
868