xref: /petsc/src/dm/impls/moab/dmmbutil.cxx (revision 3f1c6e43b297ee9cd09759ca24f8d38b0ebd8168)
1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I  "petscdmmoab.h"   I*/
2af0996ceSBarry Smith #include <petsc/private/vecimpl.h>
351d15aeeSVijay Mahadevan 
451d15aeeSVijay Mahadevan #include <petscdmmoab.h>
551d15aeeSVijay Mahadevan #include <MBTagConventions.hpp>
651d15aeeSVijay Mahadevan #include <moab/ReadUtilIface.hpp>
751d15aeeSVijay Mahadevan #include <moab/ScdInterface.hpp>
851d15aeeSVijay Mahadevan #include <moab/CN.hpp>
951d15aeeSVijay Mahadevan 
1051d15aeeSVijay Mahadevan 
11aa859218SVijay Mahadevan static PetscErrorCode DMMoabComputeDomainBounds_Private(moab::ParallelComm* pcomm, PetscInt dim, PetscInt neleglob, PetscInt *ise)
1251d15aeeSVijay Mahadevan {
1351d15aeeSVijay Mahadevan   PetscInt size,rank;
1451d15aeeSVijay Mahadevan   PetscInt fraction,remainder;
1551d15aeeSVijay Mahadevan   PetscInt starts[3],sizes[3];
1651d15aeeSVijay Mahadevan 
1751d15aeeSVijay Mahadevan   PetscFunctionBegin;
1851d15aeeSVijay Mahadevan   if(dim<1 && dim>3) SETERRQ1(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"The problem dimension is invalid: %D",dim);
1951d15aeeSVijay Mahadevan 
2051d15aeeSVijay Mahadevan   size=pcomm->size();
2151d15aeeSVijay Mahadevan   rank=pcomm->rank();
2251d15aeeSVijay Mahadevan   fraction=neleglob/size;    /* partition only by the largest dimension */
2351d15aeeSVijay Mahadevan   remainder=neleglob%size;   /* remainder after partition which gets evenly distributed by round-robin */
2451d15aeeSVijay Mahadevan 
2551d15aeeSVijay Mahadevan   if(fraction==0) SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"The leading dimension size should be greater than number of processors: %D < %D",neleglob,size);
2651d15aeeSVijay Mahadevan 
2751d15aeeSVijay Mahadevan   starts[0]=starts[1]=starts[2]=0;       /* default dimensional element = 1 */
2851d15aeeSVijay Mahadevan   sizes[0]=sizes[1]=sizes[2]=neleglob;   /* default dimensional element = 1 */
2951d15aeeSVijay Mahadevan 
30b8ecf6d3SVijay Mahadevan   if(rank < remainder) { /* This process gets "fraction+1" elements */
3151d15aeeSVijay Mahadevan     sizes[dim-1] = (fraction + 1);
3251d15aeeSVijay Mahadevan     starts[dim-1] = rank * (fraction+1);
33b8ecf6d3SVijay Mahadevan   } else { /* This process gets "fraction" elements */
3451d15aeeSVijay Mahadevan     sizes[dim-1] = fraction;
3551d15aeeSVijay Mahadevan     starts[dim-1] = (remainder*(fraction+1) + fraction*(rank-remainder));
3651d15aeeSVijay Mahadevan   }
3751d15aeeSVijay Mahadevan 
3851d15aeeSVijay Mahadevan   for(int i=dim-1; i>=0; --i) {
3951d15aeeSVijay Mahadevan     ise[2*i]=starts[i];ise[2*i+1]=starts[i]+sizes[i];
4051d15aeeSVijay Mahadevan   }
4151d15aeeSVijay Mahadevan   PetscFunctionReturn(0);
4251d15aeeSVijay Mahadevan }
4351d15aeeSVijay Mahadevan 
44aa859218SVijay Mahadevan static void DMMoab_SetStructuredCoords_Private(PetscInt i, PetscInt j, PetscInt k, PetscReal hx, PetscReal hy, PetscReal hz, PetscInt vcount, std::vector<double*>& vcoords)
45e5136372SVijay Mahadevan {
4666f88a78SVijay Mahadevan   vcoords[0][vcount] = i*hx;
4766f88a78SVijay Mahadevan   vcoords[1][vcount] = j*hy;
4866f88a78SVijay Mahadevan   vcoords[2][vcount] = k*hz;
49e5136372SVijay Mahadevan }
50e5136372SVijay Mahadevan 
51c3dd00c7SVijay Mahadevan static void DMMoab_SetTensorElementConnectivity_Private(PetscInt dim, moab::EntityType etype, PetscInt offset, PetscInt nele, PetscInt i, PetscInt j, PetscInt k, PetscInt vfirst, moab::EntityHandle *connectivity)
52e5136372SVijay Mahadevan {
53e5136372SVijay Mahadevan   std::vector<int>    subent_conn(pow(2,dim));  /* only linear edge, quad, hex supported now */
54e5136372SVijay Mahadevan 
55e5136372SVijay Mahadevan   moab::CN::SubEntityVertexIndices(etype, dim, 0, subent_conn.data());
56e5136372SVijay Mahadevan 
57e5136372SVijay Mahadevan   switch(dim) {
58e5136372SVijay Mahadevan     case 1:
59e5136372SVijay Mahadevan       connectivity[offset+subent_conn[0]] = vfirst+i;
60e5136372SVijay Mahadevan       connectivity[offset+subent_conn[1]] = vfirst+(i+1);
61e5136372SVijay Mahadevan       break;
62e5136372SVijay Mahadevan     case 2:
63e5136372SVijay Mahadevan       connectivity[offset+subent_conn[0]] = vfirst+i+j*(nele+1);
64e5136372SVijay Mahadevan       connectivity[offset+subent_conn[1]] = vfirst+(i+1)+j*(nele+1);
65e5136372SVijay Mahadevan       connectivity[offset+subent_conn[2]] = vfirst+(i+1)+(j+1)*(nele+1);
66e5136372SVijay Mahadevan       connectivity[offset+subent_conn[3]] = vfirst+i+(j+1)*(nele+1);
67e5136372SVijay Mahadevan       break;
68e5136372SVijay Mahadevan     case 3:
69e5136372SVijay Mahadevan     default:
70e5136372SVijay Mahadevan       connectivity[offset+subent_conn[0]] = vfirst+i+(nele+1)*(j+(nele+1)*k);
71e5136372SVijay Mahadevan       connectivity[offset+subent_conn[1]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*k);
72e5136372SVijay Mahadevan       connectivity[offset+subent_conn[2]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*k);
73e5136372SVijay Mahadevan       connectivity[offset+subent_conn[3]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*k);
74e5136372SVijay Mahadevan       connectivity[offset+subent_conn[4]] = vfirst+i+(nele+1)*(j+(nele+1)*(k+1));
75e5136372SVijay Mahadevan       connectivity[offset+subent_conn[5]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*(k+1));
76e5136372SVijay Mahadevan       connectivity[offset+subent_conn[6]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*(k+1));
77e5136372SVijay Mahadevan       connectivity[offset+subent_conn[7]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*(k+1));
78e5136372SVijay Mahadevan       break;
79e5136372SVijay Mahadevan   }
80e5136372SVijay Mahadevan }
8151d15aeeSVijay Mahadevan 
82c3dd00c7SVijay Mahadevan static void DMMoab_SetSimplexElementConnectivity_Private(PetscInt dim, PetscInt subelem, moab::EntityType etype, PetscInt offset, PetscInt nele, PetscInt i, PetscInt j, PetscInt k, PetscInt vfirst, moab::EntityHandle *connectivity)
83c3dd00c7SVijay Mahadevan {
84c3dd00c7SVijay Mahadevan   std::vector<int>    subent_conn(pow(2,dim));  /* only linear edge, quad, hex supported now */
85c3dd00c7SVijay Mahadevan 
86c3dd00c7SVijay Mahadevan   moab::CN::SubEntityVertexIndices(etype, dim, 0, subent_conn.data());
87c3dd00c7SVijay Mahadevan 
88c3dd00c7SVijay Mahadevan   switch(dim) {
89c3dd00c7SVijay Mahadevan     case 1:
90c3dd00c7SVijay Mahadevan       connectivity[offset+subent_conn[0]] = vfirst+i;
91c3dd00c7SVijay Mahadevan       connectivity[offset+subent_conn[1]] = vfirst+(i+1);
92c3dd00c7SVijay Mahadevan       break;
93c3dd00c7SVijay Mahadevan     case 2:
94c3dd00c7SVijay Mahadevan       if (subelem) { /* 1 2 3 of a QUAD */
95c3dd00c7SVijay Mahadevan         connectivity[offset+subent_conn[0]] = vfirst+i+j*(nele+1);
96c3dd00c7SVijay Mahadevan         connectivity[offset+subent_conn[1]] = vfirst+(i+1)+j*(nele+1);
97c3dd00c7SVijay Mahadevan         connectivity[offset+subent_conn[2]] = vfirst+(i+1)+(j+1)*(nele+1);
98c3dd00c7SVijay Mahadevan       }
99c3dd00c7SVijay Mahadevan       else {        /* 3 4 1 of a QUAD */
100c3dd00c7SVijay Mahadevan         connectivity[offset+subent_conn[0]] = vfirst+(i+1)+(j+1)*(nele+1);
101c3dd00c7SVijay Mahadevan         connectivity[offset+subent_conn[1]] = vfirst+i+(j+1)*(nele+1);
102c3dd00c7SVijay Mahadevan         connectivity[offset+subent_conn[2]] = vfirst+i+j*(nele+1);
103c3dd00c7SVijay Mahadevan       }
104c3dd00c7SVijay Mahadevan       break;
105c3dd00c7SVijay Mahadevan     case 3:
106c3dd00c7SVijay Mahadevan     default:
107c3dd00c7SVijay Mahadevan       switch(subelem) {
108c3dd00c7SVijay Mahadevan         case 0: /* 0 1 2 5 of a HEX */
109c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[0]] = vfirst+i+(nele+1)*(j+(nele+1)*k);
110c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[1]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*k);
111c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[2]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*k);
112c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[3]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*(k+1));
113c3dd00c7SVijay Mahadevan           break;
114c3dd00c7SVijay Mahadevan         case 1: /* 0 2 7 5 of a HEX */
115c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[0]] = vfirst+i+(nele+1)*(j+(nele+1)*k);
116c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[1]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*k);
117c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[2]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*(k+1));
118c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[3]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*(k+1));
119c3dd00c7SVijay Mahadevan           break;
120c3dd00c7SVijay Mahadevan         case 2: /* 0 2 3 7 of a HEX */
121c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[0]] = vfirst+i+(nele+1)*(j+(nele+1)*k);
122c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[1]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*k);
123c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[2]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*k);
124c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[3]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*(k+1));
125c3dd00c7SVijay Mahadevan           break;
126c3dd00c7SVijay Mahadevan         case 3: /* 0 5 7 4 of a HEX */
127c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[0]] = vfirst+i+(nele+1)*(j+(nele+1)*k);
128c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[1]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*(k+1));
129c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[2]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*(k+1));
130c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[3]] = vfirst+i+(nele+1)*(j+(nele+1)*(k+1));
131c3dd00c7SVijay Mahadevan           break;
132c3dd00c7SVijay Mahadevan         case 4: /* 2 7 5 6 of a HEX */
133c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[0]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*k);
134c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[1]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*(k+1));
135c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[2]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*(k+1));
136c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[3]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*(k+1));
137c3dd00c7SVijay Mahadevan           break;
138c3dd00c7SVijay Mahadevan       }
139c3dd00c7SVijay Mahadevan       break;
140c3dd00c7SVijay Mahadevan   }
141c3dd00c7SVijay Mahadevan }
142c3dd00c7SVijay Mahadevan 
143c3dd00c7SVijay Mahadevan static void DMMoab_SetElementConnectivity_Private(PetscBool useSimplex, PetscInt dim, moab::EntityType etype, PetscInt *ecount, PetscInt vpere, PetscInt nele, PetscInt i, PetscInt j, PetscInt k, PetscInt vfirst, moab::EntityHandle *connectivity)
144c3dd00c7SVijay Mahadevan {
145c3dd00c7SVijay Mahadevan   PetscInt m,subelem;
146c3dd00c7SVijay Mahadevan   if (useSimplex) {
147a8e33bb7SVijay Mahadevan     subelem=(dim==1 ? 1 : (dim==2 ? 2 : 5));
148c3dd00c7SVijay Mahadevan     for (m=0; m<subelem; m++)
149c3dd00c7SVijay Mahadevan       DMMoab_SetSimplexElementConnectivity_Private(dim, m, etype, (*ecount+m)*vpere, nele, i, j, k, vfirst, connectivity);
150a8e33bb7SVijay Mahadevan 
151c3dd00c7SVijay Mahadevan   }
152c3dd00c7SVijay Mahadevan   else {
153c3dd00c7SVijay Mahadevan     subelem=1;
154c3dd00c7SVijay Mahadevan     DMMoab_SetTensorElementConnectivity_Private(dim, etype, (*ecount)*vpere, nele, i, j, k, vfirst, connectivity);
155c3dd00c7SVijay Mahadevan   }
156c3dd00c7SVijay Mahadevan   *ecount+=subelem;
157c3dd00c7SVijay Mahadevan }
158c3dd00c7SVijay Mahadevan 
159c3dd00c7SVijay Mahadevan 
160aa859218SVijay Mahadevan /*@
161aa859218SVijay Mahadevan   DMMoabCreateBoxMesh - Creates a mesh on the tensor product (box) of intervals with user specified bounds.
162aa859218SVijay Mahadevan 
163aa859218SVijay Mahadevan   Collective on MPI_Comm
164aa859218SVijay Mahadevan 
165aa859218SVijay Mahadevan   Input Parameters:
166aa859218SVijay Mahadevan + comm - The communicator for the DM object
167aa859218SVijay Mahadevan . dim - The spatial dimension
168b8ecf6d3SVijay Mahadevan . bounds - The bounds of the box specified with [x-left, x-right, y-bottom, y-top, z-bottom, z-top] depending on the spatial dimension
169b8ecf6d3SVijay Mahadevan . nele - The number of discrete elements in each direction
170b8ecf6d3SVijay Mahadevan . user_nghost - The number of ghosted layers needed in the partitioned mesh
171aa859218SVijay Mahadevan 
172aa859218SVijay Mahadevan   Output Parameter:
173aa859218SVijay Mahadevan . dm  - The DM object
174aa859218SVijay Mahadevan 
175aa859218SVijay Mahadevan   Level: beginner
176aa859218SVijay Mahadevan 
177aa859218SVijay Mahadevan .keywords: DM, create
178aa859218SVijay Mahadevan .seealso: DMSetType(), DMCreate(), DMMoabLoadFromFile()
179aa859218SVijay Mahadevan @*/
180c3dd00c7SVijay Mahadevan PetscErrorCode DMMoabCreateBoxMesh(MPI_Comm comm, PetscInt dim, PetscBool useSimplex, const PetscReal* bounds, PetscInt nele, PetscInt user_nghost, DM *dm)
18151d15aeeSVijay Mahadevan {
18251d15aeeSVijay Mahadevan   PetscErrorCode       ierr;
18351d15aeeSVijay Mahadevan   moab::ErrorCode      merr;
184*3f1c6e43SVijay Mahadevan   PetscInt             i,j,k,n,nprocs,rank=-1,ecount=0,vcount=0;
18551d15aeeSVijay Mahadevan   DM_Moab             *dmmoab;
18651d15aeeSVijay Mahadevan   moab::Interface     *mbiface;
18751d15aeeSVijay Mahadevan   moab::ParallelComm  *pcomm;
188a4717116SVijay Mahadevan   moab::ReadUtilIface *readMeshIface;
189a4717116SVijay Mahadevan 
190*3f1c6e43SVijay Mahadevan   moab::Tag            id_tag=PETSC_NULL,part_tag=PETSC_NULL;
191*3f1c6e43SVijay Mahadevan   moab::Range          ownedvtx,ownedelms,localvtxs,localelms;
192*3f1c6e43SVijay Mahadevan   moab::EntityHandle   vfirst,efirst,regionset,faceset,edgeset,vtxset,partset;
193a4717116SVijay Mahadevan   std::vector<double*> vcoords;
194a4717116SVijay Mahadevan   moab::EntityHandle  *connectivity = 0;
1955e168b13SVijay Mahadevan   moab::EntityType     etype=moab::MBHEX;
196c8d5365dSVijay Mahadevan   PetscInt             ise[6];
197*3f1c6e43SVijay Mahadevan   std::vector<int>     vgid;
19866f88a78SVijay Mahadevan   PetscReal            xse[6],defbounds[6];
199*3f1c6e43SVijay Mahadevan 
2003a4aeca1SVijay Mahadevan   /* TODO: Fix nghost > 0 - now relying on exchange_ghost_cells */
2013a4aeca1SVijay Mahadevan   const PetscInt nghost=0;
2023a4aeca1SVijay Mahadevan 
2033a4aeca1SVijay Mahadevan   moab::Tag geom_tag;
2043a4aeca1SVijay Mahadevan 
2053a4aeca1SVijay Mahadevan   moab::Range adj,dim3,dim2;
2063a4aeca1SVijay Mahadevan   bool build_adjacencies=false;
20751d15aeeSVijay Mahadevan 
208a4717116SVijay Mahadevan   const PetscInt npts=nele+1;        /* Number of points in every dimension */
2095e168b13SVijay Mahadevan   PetscInt vpere=0,locnele=0,locnpts=0,ghnele,ghnpts;    /* Number of verts/element, vertices, elements owned by this process */
21051d15aeeSVijay Mahadevan 
21151d15aeeSVijay Mahadevan   PetscFunctionBegin;
212e5136372SVijay Mahadevan   if(dim < 1 || dim > 3) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Invalid dimension argument for mesh: dim=[1,3].\n");
213e5136372SVijay Mahadevan 
214c8d5365dSVijay Mahadevan   ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
215e5136372SVijay Mahadevan   /* total number of vertices in all dimensions */
216e5136372SVijay Mahadevan   n=pow(npts,dim);
217e5136372SVijay Mahadevan 
218e5136372SVijay Mahadevan   /* do some error checking */
219e5136372SVijay Mahadevan   if(n < 2) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Number of points must be >= 2.\n");
220e5136372SVijay Mahadevan   if(nprocs > n) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Number of processors must be less than or equal to number of elements.\n");
221e5136372SVijay Mahadevan   if(nghost < 0) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Number of ghost layers cannot be negative.\n");
222e5136372SVijay Mahadevan 
223a4717116SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
224c528d872SBarry Smith   ierr = DMMoabCreateMoab(comm, NULL, NULL, NULL, NULL, dm);CHKERRQ(ierr);
22551d15aeeSVijay Mahadevan 
226a4717116SVijay Mahadevan   /* get all the necessary handles from the private DM object */
22751d15aeeSVijay Mahadevan   dmmoab = (DM_Moab*)(*dm)->data;
22851d15aeeSVijay Mahadevan   mbiface = dmmoab->mbiface;
22951d15aeeSVijay Mahadevan   pcomm = dmmoab->pcomm;
23051d15aeeSVijay Mahadevan   id_tag = dmmoab->ltog_tag;
23151d15aeeSVijay Mahadevan   nprocs = pcomm->size();
232c8d5365dSVijay Mahadevan   dmmoab->dim = dim;
23351d15aeeSVijay Mahadevan 
234b5410836SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
235b5410836SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, dmmoab->fileset);MBERR("Creating file set failed", merr);
236b5410836SVijay Mahadevan 
237a4717116SVijay Mahadevan   /* No errors yet; proceed with building the mesh */
238a4717116SVijay Mahadevan   merr = mbiface->query_interface(readMeshIface);MBERRNM(merr);
23951d15aeeSVijay Mahadevan 
24051d15aeeSVijay Mahadevan   ierr = PetscMemzero(ise,sizeof(PetscInt)*6);CHKERRQ(ierr);
241a4717116SVijay Mahadevan 
242a4717116SVijay Mahadevan   /* call the collective routine that computes the domain bounds for a structured mesh using MOAB */
24351d15aeeSVijay Mahadevan   ierr = DMMoabComputeDomainBounds_Private(pcomm, dim, nele, ise);CHKERRQ(ierr);
24451d15aeeSVijay Mahadevan 
245a4717116SVijay Mahadevan   /* set some variables based on dimension */
24651d15aeeSVijay Mahadevan   switch(dim) {
24751d15aeeSVijay Mahadevan    case 1:
24851d15aeeSVijay Mahadevan     vpere = 2;
249a4717116SVijay Mahadevan     locnele = (ise[1]-ise[0]);
250a4717116SVijay Mahadevan     locnpts = (ise[1]-ise[0]+1);
251c8d5365dSVijay Mahadevan     ghnele = (nghost > 0 ? (ise[0] > nghost ? 1 : 0) + (ise[1] < nele - nghost ? 1 : 0) : 0 );
252c8d5365dSVijay Mahadevan     ghnpts = (nghost > 0 ? (ise[0] > 0 ? 1 : 0) + (ise[1] < nele ? 1 : 0) : 0);
25351d15aeeSVijay Mahadevan     etype = moab::MBEDGE;
25451d15aeeSVijay Mahadevan     break;
25551d15aeeSVijay Mahadevan    case 2:
256c3dd00c7SVijay Mahadevan     locnpts = (ise[1]-ise[0]+1)*(ise[3]-ise[2]+1);
257c3dd00c7SVijay Mahadevan     ghnpts = (nghost > 0 ? (ise[2] > 0 ? npts : 0) + (ise[3] < nele ? npts : 0) : 0);
258c3dd00c7SVijay Mahadevan     if (useSimplex) {
259c3dd00c7SVijay Mahadevan       vpere = 3;
260c3dd00c7SVijay Mahadevan       locnele = 2*(ise[1]-ise[0])*(ise[3]-ise[2]);
261c3dd00c7SVijay Mahadevan       ghnele = 2*(nghost > 0 ? (ise[2] > 0 ? nele : 0) + (ise[3] < nele ? nele : 0) : 0);
262c3dd00c7SVijay Mahadevan       etype = moab::MBTRI;
263c3dd00c7SVijay Mahadevan     }
264c3dd00c7SVijay Mahadevan     else {
26551d15aeeSVijay Mahadevan       vpere = 4;
266a4717116SVijay Mahadevan       locnele = (ise[1]-ise[0])*(ise[3]-ise[2]);
267c8d5365dSVijay Mahadevan       ghnele = (nghost > 0 ? (ise[2] > 0 ? nele : 0) + (ise[3] < nele ? nele : 0) : 0);
26851d15aeeSVijay Mahadevan       etype = moab::MBQUAD;
269c3dd00c7SVijay Mahadevan     }
27051d15aeeSVijay Mahadevan     break;
27151d15aeeSVijay Mahadevan    case 3:
2725e168b13SVijay Mahadevan    default:
273c3dd00c7SVijay Mahadevan     locnpts = (ise[1]-ise[0]+1)*(ise[3]-ise[2]+1)*(ise[5]-ise[4]+1);
274c3dd00c7SVijay Mahadevan     ghnpts = (nghost > 0 ? (ise[4] > 0 ? npts*npts : 0) + (ise[5] < nele ? npts*npts : 0) : 0);
275c3dd00c7SVijay Mahadevan     if (useSimplex) {
276c3dd00c7SVijay Mahadevan       vpere = 4;
277c3dd00c7SVijay Mahadevan       locnele = 5*(ise[1]-ise[0])*(ise[3]-ise[2])*(ise[5]-ise[4]);
278c3dd00c7SVijay Mahadevan       ghnele = 5*(nghost > 0 ? (ise[4] > 0 ? nele*nele : 0) + (ise[5] < nele ? nele*nele : 0) : 0);
279c3dd00c7SVijay Mahadevan       etype = moab::MBTET;
280c3dd00c7SVijay Mahadevan     }
281c3dd00c7SVijay Mahadevan     else {
28251d15aeeSVijay Mahadevan       vpere = 8;
283a4717116SVijay Mahadevan       locnele = (ise[1]-ise[0])*(ise[3]-ise[2])*(ise[5]-ise[4]);
284c8d5365dSVijay Mahadevan       ghnele = (nghost > 0 ? (ise[4] > 0 ? nele*nele : 0) + (ise[5] < nele ? nele*nele : 0) : 0);
28551d15aeeSVijay Mahadevan       etype = moab::MBHEX;
286c3dd00c7SVijay Mahadevan     }
28751d15aeeSVijay Mahadevan     break;
28851d15aeeSVijay Mahadevan   }
28951d15aeeSVijay Mahadevan 
29051d15aeeSVijay Mahadevan   /* we have a domain of size [1,1,1] - now compute local co-ordinate box */
29151d15aeeSVijay Mahadevan   ierr = PetscMemzero(xse,sizeof(PetscReal)*6);CHKERRQ(ierr);
292c8d5365dSVijay Mahadevan   for(i=0; i<6; ++i) {
29351d15aeeSVijay Mahadevan     xse[i]=(PetscReal)ise[i]/nele;
29451d15aeeSVijay Mahadevan   }
29551d15aeeSVijay Mahadevan 
296a4717116SVijay Mahadevan   /* Create vertexes and set the coodinate of each vertex */
297c8d5365dSVijay Mahadevan   merr = readMeshIface->get_node_coords(3,locnpts+ghnpts,0,vfirst,vcoords,n);MBERRNM(merr);
29851d15aeeSVijay Mahadevan 
299a4717116SVijay Mahadevan   /* Compute the co-ordinates of vertices and global IDs */
300*3f1c6e43SVijay Mahadevan   vgid.resize(locnpts+ghnpts);
301*3f1c6e43SVijay Mahadevan   vcount=0;
30266f88a78SVijay Mahadevan   if (!bounds) { /* default box mesh is defined on a unit-cube */
30366f88a78SVijay Mahadevan     defbounds[0]=0.0; defbounds[1]=1.0;
30466f88a78SVijay Mahadevan     defbounds[2]=0.0; defbounds[3]=1.0;
30566f88a78SVijay Mahadevan     defbounds[4]=0.0; defbounds[5]=1.0;
30666f88a78SVijay Mahadevan     bounds=defbounds;
30766f88a78SVijay Mahadevan   }
30866f88a78SVijay Mahadevan   else {
30966f88a78SVijay Mahadevan     /* validate the bounds data */
31066f88a78SVijay Mahadevan     if(bounds[0] >= bounds[1]) SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"X-dim: Left boundary cannot be greater than right. [%G >= %G]\n",bounds[0],bounds[1]);
31166f88a78SVijay Mahadevan     if(dim > 1 && (bounds[2] >= bounds[3])) SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Y-dim: Left boundary cannot be greater than right. [%G >= %G]\n",bounds[2],bounds[3]);
31266f88a78SVijay Mahadevan     if(dim > 2 && (bounds[4] >= bounds[5])) SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Z-dim: Left boundary cannot be greater than right. [%G >= %G]\n",bounds[4],bounds[5]);
31366f88a78SVijay Mahadevan   }
31466f88a78SVijay Mahadevan 
31566f88a78SVijay Mahadevan   const double hx=(bounds[1]-bounds[0])/nele;
31666f88a78SVijay Mahadevan   const double hy=(dim > 1 ? (bounds[3]-bounds[2])/nele : 0.0);
31766f88a78SVijay Mahadevan   const double hz=(dim > 2 ? (bounds[5]-bounds[4])/nele : 0.0);
318e5136372SVijay Mahadevan 
319c8d5365dSVijay Mahadevan   /* create all the owned vertices */
320c8d5365dSVijay Mahadevan   for (k = ise[4]; k <= ise[5]; k++) {
321c8d5365dSVijay Mahadevan     for (j = ise[2]; j <= ise[3]; j++) {
322c8d5365dSVijay Mahadevan       for (i = ise[0]; i <= ise[1]; i++, vcount++) {
323aa859218SVijay Mahadevan         DMMoab_SetStructuredCoords_Private(i,j,k,hx,hy,hz,vcount,vcoords);
324c8d5365dSVijay Mahadevan         vgid[vcount] = (k*npts+j)*npts+i+1;
325c8d5365dSVijay Mahadevan       }
326c8d5365dSVijay Mahadevan     }
327c8d5365dSVijay Mahadevan   }
328c8d5365dSVijay Mahadevan 
329e5136372SVijay Mahadevan   /* create ghosted vertices requested by user - below the current plane */
330e5136372SVijay Mahadevan   if (ise[2*dim-2] > 0) {
331e5136372SVijay Mahadevan     for (k = (dim==3?ise[4]-nghost:ise[4]); k <= (dim==3?ise[4]-1:ise[5]); k++) {
332e5136372SVijay Mahadevan       for (j = (dim==2?ise[2]-nghost:ise[2]); j <= (dim==2?ise[2]-1:ise[3]); j++) {
333e5136372SVijay Mahadevan         for (i = (dim>1?ise[0]:ise[0]-nghost); i <= (dim>1?ise[1]:ise[0]-1); i++, vcount++) {
334aa859218SVijay Mahadevan           DMMoab_SetStructuredCoords_Private(i,j,k,hx,hy,hz,vcount,vcoords);
335e5136372SVijay Mahadevan           vgid[vcount] = (k*npts+j)*npts+i+1;
336e5136372SVijay Mahadevan         }
337e5136372SVijay Mahadevan       }
338e5136372SVijay Mahadevan     }
339e5136372SVijay Mahadevan   }
340e5136372SVijay Mahadevan 
341e5136372SVijay Mahadevan   /* create ghosted vertices requested by user - above the current plane */
342e5136372SVijay Mahadevan   if (ise[2*dim-1] < nele) {
343e5136372SVijay Mahadevan     for (k = (dim==3?ise[5]+1:ise[4]); k <= (dim==3?ise[5]+nghost:ise[5]); k++) {
344e5136372SVijay Mahadevan       for (j = (dim==2?ise[3]+1:ise[2]); j <= (dim==2?ise[3]+nghost:ise[3]); j++) {
345e5136372SVijay Mahadevan         for (i = (dim>1?ise[0]:ise[1]+1); i <= (dim>1?ise[1]:ise[1]+nghost); i++, vcount++) {
346aa859218SVijay Mahadevan           DMMoab_SetStructuredCoords_Private(i,j,k,hx,hy,hz,vcount,vcoords);
347e5136372SVijay Mahadevan           vgid[vcount] = (k*npts+j)*npts+i+1;
348e5136372SVijay Mahadevan         }
34951d15aeeSVijay Mahadevan       }
35051d15aeeSVijay Mahadevan     }
35151d15aeeSVijay Mahadevan   }
35251d15aeeSVijay Mahadevan 
353c8d5365dSVijay Mahadevan   if (locnpts+ghnpts != vcount) SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Created the wrong number of vertices! (%D!=%D)",locnpts+ghnpts,vcount);
354c8d5365dSVijay Mahadevan 
35551d15aeeSVijay Mahadevan   merr = mbiface->get_entities_by_type(0,moab::MBVERTEX,ownedvtx,true);MBERRNM(merr);
35651d15aeeSVijay Mahadevan 
357a4717116SVijay Mahadevan   /* The global ID tag is applied to each owned
358a4717116SVijay Mahadevan      vertex. It acts as an global identifier which MOAB uses to
359a4717116SVijay Mahadevan      assemble the individual pieces of the mesh:
360a4717116SVijay Mahadevan      Set the global ID indices */
36151d15aeeSVijay Mahadevan   merr = mbiface->tag_set_data(id_tag,ownedvtx,vgid.data());MBERRNM(merr);
36251d15aeeSVijay Mahadevan 
363a4717116SVijay Mahadevan   /* Create elements between mesh points using the ReadUtilInterface
364a4717116SVijay Mahadevan      get the reference to element connectivities for all local elements from the ReadUtilInterface */
365e5136372SVijay Mahadevan   merr = readMeshIface->get_element_connect (locnele+ghnele,vpere,etype,1,efirst,connectivity);MBERRNM(merr);
36651d15aeeSVijay Mahadevan 
367a4717116SVijay Mahadevan   /* offset appropriately so that only local ID and not global ID numbers are set for connectivity array */
368e5136372SVijay Mahadevan   vfirst-=vgid[0]-1;
36951d15aeeSVijay Mahadevan 
370a4717116SVijay Mahadevan    /* 3. Loop over elements in 3 nested loops over i, j, k; for each (i,j,k):
371a4717116SVijay Mahadevan          and then set the connectivity for each element appropriately */
372*3f1c6e43SVijay Mahadevan   ecount=0;
373e5136372SVijay Mahadevan   /* create ghosted elements requested by user - below the current plane */
374e5136372SVijay Mahadevan   if (ise[2*dim-2] >= nghost) {
375e5136372SVijay Mahadevan     for (k = (dim==3?ise[4]-nghost:ise[4]); k < (dim==3?ise[4]:std::max(ise[5],1)); k++) {
376e5136372SVijay Mahadevan       for (j = (dim==2?ise[2]-nghost:ise[2]); j < (dim==2?ise[2]:std::max(ise[3],1)); j++) {
377c3dd00c7SVijay Mahadevan         for (i = (dim>1?ise[0]:ise[0]-nghost); i < (dim>1?std::max(ise[1],1):ise[0]); i++) {
378c3dd00c7SVijay Mahadevan           DMMoab_SetElementConnectivity_Private(useSimplex, dim, etype, &ecount, vpere, nele, i, j, k, vfirst, connectivity);
37951d15aeeSVijay Mahadevan         }
38051d15aeeSVijay Mahadevan       }
38151d15aeeSVijay Mahadevan     }
38251d15aeeSVijay Mahadevan   }
383e5136372SVijay Mahadevan 
384e5136372SVijay Mahadevan   /* create owned elements requested by user */
385e5136372SVijay Mahadevan   for (k = ise[4]; k < std::max(ise[5],1); k++) {
386e5136372SVijay Mahadevan     for (j = ise[2]; j < std::max(ise[3],1); j++) {
387c3dd00c7SVijay Mahadevan       for (i = ise[0]; i < std::max(ise[1],1); i++) {
388c3dd00c7SVijay Mahadevan         DMMoab_SetElementConnectivity_Private(useSimplex, dim, etype, &ecount, vpere, nele, i, j, k, vfirst, connectivity);
389e5136372SVijay Mahadevan       }
390e5136372SVijay Mahadevan     }
391e5136372SVijay Mahadevan   }
392e5136372SVijay Mahadevan 
393e5136372SVijay Mahadevan   /* create ghosted elements requested by user - above the current plane */
394e5136372SVijay Mahadevan   if (ise[2*dim-1] <= nele-nghost) {
395e5136372SVijay Mahadevan     for (k = (dim==3?ise[5]:ise[4]); k < (dim==3?ise[5]+nghost:std::max(ise[5],1)); k++) {
396e5136372SVijay Mahadevan       for (j = (dim==2?ise[3]:ise[2]); j < (dim==2?ise[3]+nghost:std::max(ise[3],1)); j++) {
397c3dd00c7SVijay Mahadevan         for (i = (dim>1?ise[0]:ise[1]); i < (dim>1?std::max(ise[1],1):ise[1]+nghost); i++) {
398c3dd00c7SVijay Mahadevan           DMMoab_SetElementConnectivity_Private(useSimplex, dim, etype, &ecount, vpere, nele, i, j, k, vfirst, connectivity);
399e5136372SVijay Mahadevan         }
400e5136372SVijay Mahadevan       }
401e5136372SVijay Mahadevan     }
402e5136372SVijay Mahadevan   }
403e5136372SVijay Mahadevan 
404e5136372SVijay Mahadevan   merr = readMeshIface->update_adjacencies(efirst,locnele+ghnele,vpere,connectivity);MBERRNM(merr);
40551d15aeeSVijay Mahadevan 
406a4717116SVijay Mahadevan   /* 2. Get the vertices and hexes from moab and check their numbers against I*J*K and (I-1)*(J-1)*(K-1), resp.
407a4717116SVijay Mahadevan         first '0' specifies "root set", or entire MOAB instance, second the entity dimension being requested */
40851d15aeeSVijay Mahadevan   merr = mbiface->get_entities_by_dimension(0, dim, ownedelms);MBERRNM(merr);
409a4717116SVijay Mahadevan 
4106c4ed002SBarry Smith   if (locnele+ghnele != (int) ownedelms.size()) SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Created the wrong number of elements! (%D!=%D)",locnele+ghnele,ownedelms.size());
4116c4ed002SBarry Smith   else if(locnpts+ghnpts != (int) ownedvtx.size()) SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Created the wrong number of vertices! (%D!=%D)",locnpts+ghnpts,ownedvtx.size());
4126c4ed002SBarry Smith   else {
4136c4ed002SBarry Smith     ierr = PetscInfo2(NULL, "Created %D elements and %D vertices.\n", ownedelms.size(), ownedvtx.size());CHKERRQ(ierr);
4146c4ed002SBarry Smith   }
41551d15aeeSVijay Mahadevan 
4163a4aeca1SVijay Mahadevan   /* lets create some sets */
4173a4aeca1SVijay Mahadevan   merr = mbiface->tag_get_handle(GEOM_DIMENSION_TAG_NAME, 1, moab::MB_TYPE_INTEGER, geom_tag, moab::MB_TAG_SPARSE|moab::MB_TAG_CREAT);MBERRNM(merr);
4183a4aeca1SVijay Mahadevan 
4193a4aeca1SVijay Mahadevan   merr = mbiface->create_meshset(moab::MESHSET_SET, regionset);MBERRNM(merr);
4203a4aeca1SVijay Mahadevan   merr = mbiface->add_entities(regionset, ownedelms);MBERRNM(merr);
4213a4aeca1SVijay Mahadevan   merr = mbiface->tag_set_data(geom_tag, &regionset, 1, &dmmoab->dim);MBERRNM(merr);
422b5410836SVijay Mahadevan   merr = mbiface->add_parent_child(dmmoab->fileset,regionset);MBERRNM(merr);
4233a4aeca1SVijay Mahadevan   merr = mbiface->unite_meshset(dmmoab->fileset, regionset);MBERRNM(merr);
4243a4aeca1SVijay Mahadevan 
4253a4aeca1SVijay Mahadevan   merr = mbiface->create_meshset(moab::MESHSET_SET, vtxset);MBERRNM(merr);
4263a4aeca1SVijay Mahadevan   merr = mbiface->add_entities(vtxset, ownedvtx);MBERRNM(merr);
4273a4aeca1SVijay Mahadevan   merr = mbiface->add_parent_child(dmmoab->fileset,vtxset);MBERRNM(merr);
4283a4aeca1SVijay Mahadevan   merr = mbiface->unite_meshset(dmmoab->fileset, vtxset);MBERRNM(merr);
4293a4aeca1SVijay Mahadevan 
4303a4aeca1SVijay Mahadevan   if (build_adjacencies) {
4313a4aeca1SVijay Mahadevan     // generate all lower dimensional adjacencies
4323a4aeca1SVijay Mahadevan     merr = mbiface->get_adjacencies( ownedelms, dim-1, true, adj, moab::Interface::UNION );MBERRNM(merr);
4333a4aeca1SVijay Mahadevan     merr = dmmoab->pcomm->get_part_entities(dim2, dim-1);MBERRNM(merr);
4343a4aeca1SVijay Mahadevan     adj.merge(dim2);
4353a4aeca1SVijay Mahadevan 
4363a4aeca1SVijay Mahadevan     /* create face sets */
4373a4aeca1SVijay Mahadevan     merr = mbiface->create_meshset(moab::MESHSET_SET, faceset);MBERRNM(merr);
4383a4aeca1SVijay Mahadevan     merr = mbiface->add_entities(faceset, adj);MBERRNM(merr);
4393a4aeca1SVijay Mahadevan     merr = mbiface->add_parent_child(dmmoab->fileset,faceset);MBERRNM(merr);
4403a4aeca1SVijay Mahadevan     i=dim-1;
4413a4aeca1SVijay Mahadevan     merr = mbiface->tag_set_data(geom_tag, &faceset, 1, &i);MBERRNM(merr);
4423a4aeca1SVijay Mahadevan     merr = mbiface->unite_meshset(dmmoab->fileset, faceset);MBERRNM(merr);
443b8ecf6d3SVijay Mahadevan     PetscInfo2(NULL, "Found %d %d-Dim quantities.\n", adj.size(), dim-1);
4443a4aeca1SVijay Mahadevan 
4453a4aeca1SVijay Mahadevan     if (dim > 2) {
4463a4aeca1SVijay Mahadevan       dim2.clear();
4473a4aeca1SVijay Mahadevan       /* create edge sets, if appropriate i.e., if dim=3 */
4483a4aeca1SVijay Mahadevan       merr = mbiface->create_meshset(moab::MESHSET_SET, edgeset);MBERRNM(merr);
4493a4aeca1SVijay Mahadevan       merr = mbiface->get_adjacencies(adj, dim-1, true, dim2, moab::Interface::UNION );MBERRNM(merr);
4503a4aeca1SVijay Mahadevan       merr = mbiface->add_entities(edgeset, dim2);MBERRNM(merr);
4513a4aeca1SVijay Mahadevan       merr = mbiface->add_parent_child(dmmoab->fileset,edgeset);MBERRNM(merr);
4523a4aeca1SVijay Mahadevan       i=dim-2;
4533a4aeca1SVijay Mahadevan       merr = mbiface->tag_set_data(geom_tag, &edgeset, 1, &i);MBERRNM(merr);
4543a4aeca1SVijay Mahadevan       merr = mbiface->unite_meshset(dmmoab->fileset, edgeset);MBERRNM(merr);
455b8ecf6d3SVijay Mahadevan       PetscInfo2(NULL, "Found %d %d-Dim quantities.\n", adj.size(), dim-2);
4563a4aeca1SVijay Mahadevan     }
4573a4aeca1SVijay Mahadevan   }
4583a4aeca1SVijay Mahadevan 
459a4717116SVijay Mahadevan   /* check the handles */
460a4717116SVijay Mahadevan   merr = pcomm->check_all_shared_handles();MBERRV(mbiface,merr);
46151d15aeeSVijay Mahadevan 
462a4717116SVijay Mahadevan   /* resolve the shared entities by exchanging information to adjacent processors */
463a4717116SVijay Mahadevan   merr = mbiface->get_entities_by_type(dmmoab->fileset,etype,ownedelms,true);MBERRNM(merr);
464ce1fd009SVijay Mahadevan   merr = pcomm->resolve_shared_ents(dmmoab->fileset,ownedelms,dim,dim-1,NULL,&id_tag);MBERRV(mbiface,merr);
46551d15aeeSVijay Mahadevan 
4663a4aeca1SVijay Mahadevan   merr = pcomm->exchange_ghost_cells(dim,0,user_nghost,dim,true,false,&dmmoab->fileset);MBERRV(mbiface,merr);
467c8d5365dSVijay Mahadevan 
468e427d9c9SVijay Mahadevan   /* Reassign global IDs on all entities. */
469e427d9c9SVijay Mahadevan   merr = pcomm->assign_global_ids(dmmoab->fileset,dim,1,false,true,false);MBERRNM(merr);
470e427d9c9SVijay Mahadevan 
471*3f1c6e43SVijay Mahadevan   /* filter based on parallel status */
472*3f1c6e43SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(ownedvtx,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,&localvtxs);MBERRNM(merr);
473*3f1c6e43SVijay Mahadevan   merr = dmmoab->pcomm->filter_pstatus(ownedelms,PSTATUS_NOT_OWNED,PSTATUS_NOT,-1,&localelms);MBERRNM(merr);
474*3f1c6e43SVijay Mahadevan 
475*3f1c6e43SVijay Mahadevan   /* set the parallel partition tag data */
476*3f1c6e43SVijay Mahadevan   merr = mbiface->tag_get_handle("PARALLEL_PARTITION", 1, moab::MB_TYPE_INTEGER,
477*3f1c6e43SVijay Mahadevan                              part_tag, moab::MB_TAG_CREAT | moab::MB_TAG_SPARSE, &rank);MBERRNM(merr);
478*3f1c6e43SVijay Mahadevan   rank=pcomm->rank();
479*3f1c6e43SVijay Mahadevan   merr = mbiface->create_meshset(moab::MESHSET_SET, partset);MBERRNM(merr);
480*3f1c6e43SVijay Mahadevan   merr = mbiface->add_entities(partset, localvtxs);MBERRNM(merr);
481*3f1c6e43SVijay Mahadevan   merr = mbiface->add_entities(partset, localelms);MBERRNM(merr);
482*3f1c6e43SVijay Mahadevan   merr = mbiface->tag_set_data(part_tag, &partset, 1, &rank);MBERRNM(merr);
483*3f1c6e43SVijay Mahadevan 
484a4717116SVijay Mahadevan   /* Everything is set up, now just do a tag exchange to update tags
485a4717116SVijay Mahadevan      on all of the ghost vertexes */
486c8d5365dSVijay Mahadevan   merr = mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,ownedvtx,true);MBERRNM(merr);
487c8d5365dSVijay Mahadevan   merr = mbiface->get_entities_by_dimension(dmmoab->fileset, dim, ownedelms);MBERRNM(merr);
488c8d5365dSVijay Mahadevan 
489a4717116SVijay Mahadevan   merr = pcomm->exchange_tags(id_tag,ownedvtx);MBERRV(mbiface,merr);
490a4717116SVijay Mahadevan   merr = pcomm->exchange_tags(id_tag,ownedelms);MBERRV(mbiface,merr);
49151d15aeeSVijay Mahadevan   PetscFunctionReturn(0);
49251d15aeeSVijay Mahadevan }
49351d15aeeSVijay Mahadevan 
49451d15aeeSVijay Mahadevan 
4952e4e7c01SVijay Mahadevan PetscErrorCode DMMoab_GetReadOptions_Private(PetscBool by_rank, PetscInt numproc, PetscInt dim, MoabReadMode mode, PetscInt dbglevel, const char* dm_opts, const char* extra_opts, const char** read_opts)
49651d15aeeSVijay Mahadevan {
4976acfe860SVijay Mahadevan   char           *ropts;
49861eb6e27SVijay Mahadevan   char           ropts_par[PETSC_MAX_PATH_LEN];
49961eb6e27SVijay Mahadevan   char           ropts_dbg[PETSC_MAX_PATH_LEN];
500f90c3b0eSVijay Mahadevan   PetscErrorCode ierr;
50151d15aeeSVijay Mahadevan 
502a4717116SVijay Mahadevan   PetscFunctionBegin;
50395dccacaSBarry Smith   ierr = PetscMalloc1(PETSC_MAX_PATH_LEN,&ropts);CHKERRQ(ierr);
50461eb6e27SVijay Mahadevan   ierr = PetscMemzero(&ropts_par,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
50561eb6e27SVijay Mahadevan   ierr = PetscMemzero(&ropts_dbg,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
50661eb6e27SVijay Mahadevan 
507e23c60ebSVijay Mahadevan   /* do parallel read unless using only one processor */
508a4717116SVijay Mahadevan   if (numproc > 1) {
5096acfe860SVijay Mahadevan     ierr = PetscSNPrintf(ropts_par, PETSC_MAX_PATH_LEN, "PARALLEL=%s;PARTITION=PARALLEL_PARTITION;PARTITION_DISTRIBUTE;PARALLEL_RESOLVE_SHARED_ENTS;PARALLEL_GHOSTS=%d.0.1%s;",MoabReadModes[mode],dim,(by_rank ? ";PARTITION_BY_RANK":""));CHKERRQ(ierr);
5102e4e7c01SVijay Mahadevan   }
5112e4e7c01SVijay Mahadevan 
512c8d5365dSVijay Mahadevan   if (dbglevel) {
513f90c3b0eSVijay Mahadevan     if (numproc>1) {
5146acfe860SVijay Mahadevan       ierr = PetscSNPrintf(ropts_dbg, PETSC_MAX_PATH_LEN, "%sCPUTIME;DEBUG_IO=%d;DEBUG_PIO=%d;",dbglevel,dbglevel);CHKERRQ(ierr);
51561eb6e27SVijay Mahadevan     }
51661eb6e27SVijay Mahadevan     else {
5176acfe860SVijay Mahadevan       ierr = PetscSNPrintf(ropts_dbg, PETSC_MAX_PATH_LEN, "%sCPUTIME;DEBUG_IO=%d;",dbglevel);CHKERRQ(ierr);
518f90c3b0eSVijay Mahadevan     }
519c8d5365dSVijay Mahadevan   }
52051d15aeeSVijay Mahadevan 
5216acfe860SVijay Mahadevan   ierr = PetscSNPrintf(ropts, PETSC_MAX_PATH_LEN, "%s%s%s%s",ropts_par,ropts_dbg,(extra_opts?extra_opts:""),(dm_opts?dm_opts:""));CHKERRQ(ierr);
522f90c3b0eSVijay Mahadevan   *read_opts = ropts;
52351d15aeeSVijay Mahadevan   PetscFunctionReturn(0);
52451d15aeeSVijay Mahadevan }
52551d15aeeSVijay Mahadevan 
52651d15aeeSVijay Mahadevan 
527aa859218SVijay Mahadevan /*@
528aa859218SVijay Mahadevan   DMMoabLoadFromFile - Creates a DM object by loading the mesh from a user specified file.
529aa859218SVijay Mahadevan 
530aa859218SVijay Mahadevan   Collective on MPI_Comm
531aa859218SVijay Mahadevan 
532aa859218SVijay Mahadevan   Input Parameters:
533aa859218SVijay Mahadevan + comm - The communicator for the DM object
534aa859218SVijay Mahadevan . dim - The spatial dimension
535b8ecf6d3SVijay Mahadevan . filename - The name of the mesh file to be loaded
536b8ecf6d3SVijay Mahadevan . usrreadopts - The options string to read a MOAB mesh.
537aa859218SVijay Mahadevan   Reference (Parallel Mesh Initialization: http://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html#fivetwo)
538aa859218SVijay Mahadevan 
539aa859218SVijay Mahadevan   Output Parameter:
540aa859218SVijay Mahadevan . dm  - The DM object
541aa859218SVijay Mahadevan 
542aa859218SVijay Mahadevan   Level: beginner
543aa859218SVijay Mahadevan 
544aa859218SVijay Mahadevan .keywords: DM, create
545b8ecf6d3SVijay Mahadevan 
546aa859218SVijay Mahadevan .seealso: DMSetType(), DMCreate(), DMMoabCreateBoxMesh()
547aa859218SVijay Mahadevan @*/
548a4717116SVijay Mahadevan PetscErrorCode DMMoabLoadFromFile(MPI_Comm comm,PetscInt dim,const char* filename, const char* usrreadopts, DM *dm)
54951d15aeeSVijay Mahadevan {
550a4717116SVijay Mahadevan   moab::ErrorCode merr;
5512e4e7c01SVijay Mahadevan   PetscInt        nprocs;
552a4717116SVijay Mahadevan   DM_Moab        *dmmoab;
553a4717116SVijay Mahadevan   moab::Interface *mbiface;
554a4717116SVijay Mahadevan   moab::ParallelComm *pcomm;
555a4717116SVijay Mahadevan   moab::Range verts,elems;
5567023aa44SVijay Mahadevan   const char *readopts;
557a4717116SVijay Mahadevan   PetscErrorCode ierr;
55851d15aeeSVijay Mahadevan 
55951d15aeeSVijay Mahadevan   PetscFunctionBegin;
560a4717116SVijay Mahadevan   PetscValidPointer(dm,5);
56151d15aeeSVijay Mahadevan 
562a4717116SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
563c528d872SBarry Smith   ierr = DMMoabCreateMoab(comm, NULL, NULL, NULL, NULL, dm);CHKERRQ(ierr);
56451d15aeeSVijay Mahadevan 
565a4717116SVijay Mahadevan   /* get all the necessary handles from the private DM object */
566a4717116SVijay Mahadevan   dmmoab = (DM_Moab*)(*dm)->data;
567a4717116SVijay Mahadevan   mbiface = dmmoab->mbiface;
568a4717116SVijay Mahadevan   pcomm = dmmoab->pcomm;
569a4717116SVijay Mahadevan   nprocs = pcomm->size();
570aa859218SVijay Mahadevan   /* TODO: Decipher dimension based on the loaded mesh instead of getting from user */
571c8d5365dSVijay Mahadevan   dmmoab->dim = dim;
572a4717116SVijay Mahadevan 
573b5410836SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
574b5410836SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, dmmoab->fileset);MBERR("Creating file set failed", merr);
575b5410836SVijay Mahadevan 
576a4717116SVijay Mahadevan   /* add mesh loading options specific to the DM */
5772e4e7c01SVijay Mahadevan   ierr = DMMoab_GetReadOptions_Private(dmmoab->partition_by_rank, nprocs, dim, dmmoab->read_mode,
5782e4e7c01SVijay Mahadevan                                         dmmoab->rw_dbglevel, dmmoab->extra_read_options, usrreadopts, &readopts);CHKERRQ(ierr);
5797023aa44SVijay Mahadevan 
580e5136372SVijay Mahadevan   PetscInfo2(*dm, "Reading file %s with options: %s\n",filename,readopts);
581a4717116SVijay Mahadevan 
582a4717116SVijay Mahadevan   /* Load the mesh from a file. */
5837023aa44SVijay Mahadevan   merr = mbiface->load_file(filename, &dmmoab->fileset, readopts);MBERRVM(mbiface,"Reading MOAB file failed.", merr);
584a4717116SVijay Mahadevan 
5856e40195eSVijay Mahadevan   /* Reassign global IDs on all entities. */
586e5136372SVijay Mahadevan   merr = pcomm->assign_global_ids(dmmoab->fileset,dim,1,true,true,true);MBERRNM(merr);
587e5136372SVijay Mahadevan 
588e5136372SVijay Mahadevan   /* load the local vertices */
589e5136372SVijay Mahadevan   merr = mbiface->get_entities_by_type(dmmoab->fileset, moab::MBVERTEX, verts, true);MBERRNM(merr);
590e5136372SVijay Mahadevan   /* load the local elements */
591e5136372SVijay Mahadevan   merr = mbiface->get_entities_by_dimension(dmmoab->fileset, dim, elems, true);MBERRNM(merr);
592e5136372SVijay Mahadevan 
593e5136372SVijay Mahadevan   /* Everything is set up, now just do a tag exchange to update tags
594e5136372SVijay Mahadevan      on all of the ghost vertexes */
595e5136372SVijay Mahadevan   merr = pcomm->exchange_tags(dmmoab->ltog_tag,verts);MBERRV(mbiface,merr);
596e5136372SVijay Mahadevan   merr = pcomm->exchange_tags(dmmoab->ltog_tag,elems);MBERRV(mbiface,merr);
597e5136372SVijay Mahadevan 
598e5136372SVijay Mahadevan   merr = pcomm->exchange_ghost_cells(dim,0,1,0,true,true,&dmmoab->fileset);MBERRV(mbiface,merr);
5996e40195eSVijay Mahadevan 
600a4717116SVijay Mahadevan   merr = pcomm->collective_sync_partition();MBERR("Collective sync failed", merr);
601a4717116SVijay Mahadevan 
602e5136372SVijay Mahadevan   PetscInfo3(*dm, "MOAB file '%s' was successfully loaded. Found %D vertices and %D elements.\n", filename, verts.size(), elems.size());
6036acfe860SVijay Mahadevan   ierr = PetscFree(readopts);CHKERRQ(ierr);
60451d15aeeSVijay Mahadevan   PetscFunctionReturn(0);
60551d15aeeSVijay Mahadevan }
60651d15aeeSVijay Mahadevan 
607