xref: /petsc/src/dm/impls/moab/dmmbutil.cxx (revision 95dccacacae8a8fc0b691f9b4fba69a249b61188)
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 
1151d15aeeSVijay Mahadevan #undef __FUNCT__
1251d15aeeSVijay Mahadevan #define __FUNCT__ "DMMoabComputeDomainBounds_Private"
13aa859218SVijay Mahadevan static PetscErrorCode DMMoabComputeDomainBounds_Private(moab::ParallelComm* pcomm, PetscInt dim, PetscInt neleglob, PetscInt *ise)
1451d15aeeSVijay Mahadevan {
1551d15aeeSVijay Mahadevan   PetscInt size,rank;
1651d15aeeSVijay Mahadevan   PetscInt fraction,remainder;
1751d15aeeSVijay Mahadevan   PetscInt starts[3],sizes[3];
1851d15aeeSVijay Mahadevan 
1951d15aeeSVijay Mahadevan   PetscFunctionBegin;
2051d15aeeSVijay Mahadevan   if(dim<1 && dim>3) SETERRQ1(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"The problem dimension is invalid: %D",dim);
2151d15aeeSVijay Mahadevan 
2251d15aeeSVijay Mahadevan   size=pcomm->size();
2351d15aeeSVijay Mahadevan   rank=pcomm->rank();
2451d15aeeSVijay Mahadevan   fraction=neleglob/size;    /* partition only by the largest dimension */
2551d15aeeSVijay Mahadevan   remainder=neleglob%size;   /* remainder after partition which gets evenly distributed by round-robin */
2651d15aeeSVijay Mahadevan 
2751d15aeeSVijay 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);
2851d15aeeSVijay Mahadevan 
2951d15aeeSVijay Mahadevan   starts[0]=starts[1]=starts[2]=0;       /* default dimensional element = 1 */
3051d15aeeSVijay Mahadevan   sizes[0]=sizes[1]=sizes[2]=neleglob;   /* default dimensional element = 1 */
3151d15aeeSVijay Mahadevan 
32b8ecf6d3SVijay Mahadevan   if(rank < remainder) { /* This process gets "fraction+1" elements */
3351d15aeeSVijay Mahadevan     sizes[dim-1] = (fraction + 1);
3451d15aeeSVijay Mahadevan     starts[dim-1] = rank * (fraction+1);
35b8ecf6d3SVijay Mahadevan   } else { /* This process gets "fraction" elements */
3651d15aeeSVijay Mahadevan     sizes[dim-1] = fraction;
3751d15aeeSVijay Mahadevan     starts[dim-1] = (remainder*(fraction+1) + fraction*(rank-remainder));
3851d15aeeSVijay Mahadevan   }
3951d15aeeSVijay Mahadevan 
4051d15aeeSVijay Mahadevan   for(int i=dim-1; i>=0; --i) {
4151d15aeeSVijay Mahadevan     ise[2*i]=starts[i];ise[2*i+1]=starts[i]+sizes[i];
4251d15aeeSVijay Mahadevan   }
4351d15aeeSVijay Mahadevan   PetscFunctionReturn(0);
4451d15aeeSVijay Mahadevan }
4551d15aeeSVijay Mahadevan 
46aa859218SVijay Mahadevan #undef __FUNCT__
47aa859218SVijay Mahadevan #define __FUNCT__ "DMMoab_SetStructuredCoords_Private"
48aa859218SVijay Mahadevan static void DMMoab_SetStructuredCoords_Private(PetscInt i, PetscInt j, PetscInt k, PetscReal hx, PetscReal hy, PetscReal hz, PetscInt vcount, std::vector<double*>& vcoords)
49e5136372SVijay Mahadevan {
5066f88a78SVijay Mahadevan   vcoords[0][vcount] = i*hx;
5166f88a78SVijay Mahadevan   vcoords[1][vcount] = j*hy;
5266f88a78SVijay Mahadevan   vcoords[2][vcount] = k*hz;
53e5136372SVijay Mahadevan }
54e5136372SVijay Mahadevan 
55aa859218SVijay Mahadevan #undef __FUNCT__
56c3dd00c7SVijay Mahadevan #define __FUNCT__ "DMMoab_SetTensorElementConnectivity_Private"
57c3dd00c7SVijay 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)
58e5136372SVijay Mahadevan {
59e5136372SVijay Mahadevan   std::vector<int>    subent_conn(pow(2,dim));  /* only linear edge, quad, hex supported now */
60e5136372SVijay Mahadevan 
61e5136372SVijay Mahadevan   moab::CN::SubEntityVertexIndices(etype, dim, 0, subent_conn.data());
62e5136372SVijay Mahadevan 
63e5136372SVijay Mahadevan   switch(dim) {
64e5136372SVijay Mahadevan     case 1:
65e5136372SVijay Mahadevan       connectivity[offset+subent_conn[0]] = vfirst+i;
66e5136372SVijay Mahadevan       connectivity[offset+subent_conn[1]] = vfirst+(i+1);
67e5136372SVijay Mahadevan       break;
68e5136372SVijay Mahadevan     case 2:
69e5136372SVijay Mahadevan       connectivity[offset+subent_conn[0]] = vfirst+i+j*(nele+1);
70e5136372SVijay Mahadevan       connectivity[offset+subent_conn[1]] = vfirst+(i+1)+j*(nele+1);
71e5136372SVijay Mahadevan       connectivity[offset+subent_conn[2]] = vfirst+(i+1)+(j+1)*(nele+1);
72e5136372SVijay Mahadevan       connectivity[offset+subent_conn[3]] = vfirst+i+(j+1)*(nele+1);
73e5136372SVijay Mahadevan       break;
74e5136372SVijay Mahadevan     case 3:
75e5136372SVijay Mahadevan     default:
76e5136372SVijay Mahadevan       connectivity[offset+subent_conn[0]] = vfirst+i+(nele+1)*(j+(nele+1)*k);
77e5136372SVijay Mahadevan       connectivity[offset+subent_conn[1]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*k);
78e5136372SVijay Mahadevan       connectivity[offset+subent_conn[2]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*k);
79e5136372SVijay Mahadevan       connectivity[offset+subent_conn[3]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*k);
80e5136372SVijay Mahadevan       connectivity[offset+subent_conn[4]] = vfirst+i+(nele+1)*(j+(nele+1)*(k+1));
81e5136372SVijay Mahadevan       connectivity[offset+subent_conn[5]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*(k+1));
82e5136372SVijay Mahadevan       connectivity[offset+subent_conn[6]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*(k+1));
83e5136372SVijay Mahadevan       connectivity[offset+subent_conn[7]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*(k+1));
84e5136372SVijay Mahadevan       break;
85e5136372SVijay Mahadevan   }
86e5136372SVijay Mahadevan }
8751d15aeeSVijay Mahadevan 
8851d15aeeSVijay Mahadevan #undef __FUNCT__
89c3dd00c7SVijay Mahadevan #define __FUNCT__ "DMMoab_SetSimplexElementConnectivity_Private"
90c3dd00c7SVijay 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)
91c3dd00c7SVijay Mahadevan {
92c3dd00c7SVijay Mahadevan   std::vector<int>    subent_conn(pow(2,dim));  /* only linear edge, quad, hex supported now */
93c3dd00c7SVijay Mahadevan 
94c3dd00c7SVijay Mahadevan   moab::CN::SubEntityVertexIndices(etype, dim, 0, subent_conn.data());
95c3dd00c7SVijay Mahadevan 
96c3dd00c7SVijay Mahadevan   switch(dim) {
97c3dd00c7SVijay Mahadevan     case 1:
98c3dd00c7SVijay Mahadevan       connectivity[offset+subent_conn[0]] = vfirst+i;
99c3dd00c7SVijay Mahadevan       connectivity[offset+subent_conn[1]] = vfirst+(i+1);
100c3dd00c7SVijay Mahadevan       break;
101c3dd00c7SVijay Mahadevan     case 2:
102c3dd00c7SVijay Mahadevan       if (subelem) { /* 1 2 3 of a QUAD */
103c3dd00c7SVijay Mahadevan         connectivity[offset+subent_conn[0]] = vfirst+i+j*(nele+1);
104c3dd00c7SVijay Mahadevan         connectivity[offset+subent_conn[1]] = vfirst+(i+1)+j*(nele+1);
105c3dd00c7SVijay Mahadevan         connectivity[offset+subent_conn[2]] = vfirst+(i+1)+(j+1)*(nele+1);
106c3dd00c7SVijay Mahadevan       }
107c3dd00c7SVijay Mahadevan       else {        /* 3 4 1 of a QUAD */
108c3dd00c7SVijay Mahadevan         connectivity[offset+subent_conn[0]] = vfirst+(i+1)+(j+1)*(nele+1);
109c3dd00c7SVijay Mahadevan         connectivity[offset+subent_conn[1]] = vfirst+i+(j+1)*(nele+1);
110c3dd00c7SVijay Mahadevan         connectivity[offset+subent_conn[2]] = vfirst+i+j*(nele+1);
111c3dd00c7SVijay Mahadevan       }
112c3dd00c7SVijay Mahadevan       break;
113c3dd00c7SVijay Mahadevan     case 3:
114c3dd00c7SVijay Mahadevan     default:
115c3dd00c7SVijay Mahadevan       switch(subelem) {
116c3dd00c7SVijay Mahadevan         case 0: /* 0 1 2 5 of a HEX */
117c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[0]] = vfirst+i+(nele+1)*(j+(nele+1)*k);
118c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[1]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*k);
119c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[2]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*k);
120c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[3]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*(k+1));
121c3dd00c7SVijay Mahadevan           break;
122c3dd00c7SVijay Mahadevan         case 1: /* 0 2 7 5 of a HEX */
123c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[0]] = vfirst+i+(nele+1)*(j+(nele+1)*k);
124c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[1]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*k);
125c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[2]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*(k+1));
126c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[3]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*(k+1));
127c3dd00c7SVijay Mahadevan           break;
128c3dd00c7SVijay Mahadevan         case 2: /* 0 2 3 7 of a HEX */
129c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[0]] = vfirst+i+(nele+1)*(j+(nele+1)*k);
130c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[1]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*k);
131c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[2]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*k);
132c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[3]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*(k+1));
133c3dd00c7SVijay Mahadevan           break;
134c3dd00c7SVijay Mahadevan         case 3: /* 0 5 7 4 of a HEX */
135c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[0]] = vfirst+i+(nele+1)*(j+(nele+1)*k);
136c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[1]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*(k+1));
137c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[2]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*(k+1));
138c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[3]] = vfirst+i+(nele+1)*(j+(nele+1)*(k+1));
139c3dd00c7SVijay Mahadevan           break;
140c3dd00c7SVijay Mahadevan         case 4: /* 2 7 5 6 of a HEX */
141c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[0]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*k);
142c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[1]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*(k+1));
143c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[2]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*(k+1));
144c3dd00c7SVijay Mahadevan           connectivity[offset+subent_conn[3]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*(k+1));
145c3dd00c7SVijay Mahadevan           break;
146c3dd00c7SVijay Mahadevan       }
147c3dd00c7SVijay Mahadevan       break;
148c3dd00c7SVijay Mahadevan   }
149c3dd00c7SVijay Mahadevan }
150c3dd00c7SVijay Mahadevan 
151c3dd00c7SVijay Mahadevan #undef __FUNCT__
152c3dd00c7SVijay Mahadevan #define __FUNCT__ "DMMoab_SetElementConnectivity_Private"
153c3dd00c7SVijay 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)
154c3dd00c7SVijay Mahadevan {
155c3dd00c7SVijay Mahadevan   PetscInt m,subelem;
156c3dd00c7SVijay Mahadevan   if (useSimplex) {
157a8e33bb7SVijay Mahadevan     subelem=(dim==1 ? 1 : (dim==2 ? 2 : 5));
158c3dd00c7SVijay Mahadevan     for (m=0; m<subelem; m++)
159c3dd00c7SVijay Mahadevan       DMMoab_SetSimplexElementConnectivity_Private(dim, m, etype, (*ecount+m)*vpere, nele, i, j, k, vfirst, connectivity);
160a8e33bb7SVijay Mahadevan 
161c3dd00c7SVijay Mahadevan   }
162c3dd00c7SVijay Mahadevan   else {
163c3dd00c7SVijay Mahadevan     subelem=1;
164c3dd00c7SVijay Mahadevan     DMMoab_SetTensorElementConnectivity_Private(dim, etype, (*ecount)*vpere, nele, i, j, k, vfirst, connectivity);
165c3dd00c7SVijay Mahadevan   }
166c3dd00c7SVijay Mahadevan   *ecount+=subelem;
167c3dd00c7SVijay Mahadevan }
168c3dd00c7SVijay Mahadevan 
169c3dd00c7SVijay Mahadevan 
170c3dd00c7SVijay Mahadevan #undef __FUNCT__
17151d15aeeSVijay Mahadevan #define __FUNCT__ "DMMoabCreateBoxMesh"
172aa859218SVijay Mahadevan /*@
173aa859218SVijay Mahadevan   DMMoabCreateBoxMesh - Creates a mesh on the tensor product (box) of intervals with user specified bounds.
174aa859218SVijay Mahadevan 
175aa859218SVijay Mahadevan   Collective on MPI_Comm
176aa859218SVijay Mahadevan 
177aa859218SVijay Mahadevan   Input Parameters:
178aa859218SVijay Mahadevan + comm - The communicator for the DM object
179aa859218SVijay Mahadevan . dim - The spatial dimension
180b8ecf6d3SVijay 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
181b8ecf6d3SVijay Mahadevan . nele - The number of discrete elements in each direction
182b8ecf6d3SVijay Mahadevan . user_nghost - The number of ghosted layers needed in the partitioned mesh
183aa859218SVijay Mahadevan 
184aa859218SVijay Mahadevan   Output Parameter:
185aa859218SVijay Mahadevan . dm  - The DM object
186aa859218SVijay Mahadevan 
187aa859218SVijay Mahadevan   Level: beginner
188aa859218SVijay Mahadevan 
189aa859218SVijay Mahadevan .keywords: DM, create
190aa859218SVijay Mahadevan .seealso: DMSetType(), DMCreate(), DMMoabLoadFromFile()
191aa859218SVijay Mahadevan @*/
192c3dd00c7SVijay Mahadevan PetscErrorCode DMMoabCreateBoxMesh(MPI_Comm comm, PetscInt dim, PetscBool useSimplex, const PetscReal* bounds, PetscInt nele, PetscInt user_nghost, DM *dm)
19351d15aeeSVijay Mahadevan {
19451d15aeeSVijay Mahadevan   PetscErrorCode  ierr;
19551d15aeeSVijay Mahadevan   moab::ErrorCode merr;
1963a4aeca1SVijay Mahadevan   PetscInt        i,j,k,n,nprocs;
19751d15aeeSVijay Mahadevan   DM_Moab        *dmmoab;
19851d15aeeSVijay Mahadevan   moab::Interface *mbiface;
19951d15aeeSVijay Mahadevan   moab::ParallelComm *pcomm;
200a4717116SVijay Mahadevan   moab::ReadUtilIface* readMeshIface;
201a4717116SVijay Mahadevan 
20251d15aeeSVijay Mahadevan   moab::Tag  id_tag=PETSC_NULL;
203a4717116SVijay Mahadevan   moab::Range         ownedvtx,ownedelms;
2043a4aeca1SVijay Mahadevan   moab::EntityHandle  vfirst,efirst,regionset,faceset,edgeset,vtxset;
205a4717116SVijay Mahadevan   std::vector<double*> vcoords;
206a4717116SVijay Mahadevan   moab::EntityHandle  *connectivity = 0;
2075e168b13SVijay Mahadevan   moab::EntityType etype=moab::MBHEX;
208c8d5365dSVijay Mahadevan   PetscInt    ise[6];
20966f88a78SVijay Mahadevan   PetscReal   xse[6],defbounds[6];
2103a4aeca1SVijay Mahadevan   /* TODO: Fix nghost > 0 - now relying on exchange_ghost_cells */
2113a4aeca1SVijay Mahadevan   const PetscInt nghost=0;
2123a4aeca1SVijay Mahadevan 
2133a4aeca1SVijay Mahadevan   moab::Tag geom_tag;
2143a4aeca1SVijay Mahadevan 
2153a4aeca1SVijay Mahadevan   moab::Range adj,dim3,dim2;
2163a4aeca1SVijay Mahadevan   bool build_adjacencies=false;
21751d15aeeSVijay Mahadevan 
218a4717116SVijay Mahadevan   const PetscInt npts=nele+1;        /* Number of points in every dimension */
2195e168b13SVijay Mahadevan   PetscInt vpere=0,locnele=0,locnpts=0,ghnele,ghnpts;    /* Number of verts/element, vertices, elements owned by this process */
22051d15aeeSVijay Mahadevan 
22151d15aeeSVijay Mahadevan   PetscFunctionBegin;
222e5136372SVijay Mahadevan   if(dim < 1 || dim > 3) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Invalid dimension argument for mesh: dim=[1,3].\n");
223e5136372SVijay Mahadevan 
224c8d5365dSVijay Mahadevan   ierr = MPI_Comm_size(comm, &nprocs);CHKERRQ(ierr);
225e5136372SVijay Mahadevan   /* total number of vertices in all dimensions */
226e5136372SVijay Mahadevan   n=pow(npts,dim);
227e5136372SVijay Mahadevan 
228e5136372SVijay Mahadevan   /* do some error checking */
229e5136372SVijay Mahadevan   if(n < 2) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Number of points must be >= 2.\n");
230e5136372SVijay 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");
231e5136372SVijay Mahadevan   if(nghost < 0) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Number of ghost layers cannot be negative.\n");
232e5136372SVijay Mahadevan 
233a4717116SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
23451d15aeeSVijay Mahadevan   ierr = DMMoabCreateMoab(comm, PETSC_NULL, PETSC_NULL, PETSC_NULL, PETSC_NULL, dm);CHKERRQ(ierr);
23551d15aeeSVijay Mahadevan 
236a4717116SVijay Mahadevan   /* get all the necessary handles from the private DM object */
23751d15aeeSVijay Mahadevan   dmmoab = (DM_Moab*)(*dm)->data;
23851d15aeeSVijay Mahadevan   mbiface = dmmoab->mbiface;
23951d15aeeSVijay Mahadevan   pcomm = dmmoab->pcomm;
24051d15aeeSVijay Mahadevan   id_tag = dmmoab->ltog_tag;
24151d15aeeSVijay Mahadevan   nprocs = pcomm->size();
242c8d5365dSVijay Mahadevan   dmmoab->dim = dim;
24351d15aeeSVijay Mahadevan 
244b5410836SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
245b5410836SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, dmmoab->fileset);MBERR("Creating file set failed", merr);
246b5410836SVijay Mahadevan 
247a4717116SVijay Mahadevan   /* No errors yet; proceed with building the mesh */
248a4717116SVijay Mahadevan   merr = mbiface->query_interface(readMeshIface);MBERRNM(merr);
24951d15aeeSVijay Mahadevan 
25051d15aeeSVijay Mahadevan   ierr = PetscMemzero(ise,sizeof(PetscInt)*6);CHKERRQ(ierr);
251a4717116SVijay Mahadevan 
252a4717116SVijay Mahadevan   /* call the collective routine that computes the domain bounds for a structured mesh using MOAB */
25351d15aeeSVijay Mahadevan   ierr = DMMoabComputeDomainBounds_Private(pcomm, dim, nele, ise);CHKERRQ(ierr);
25451d15aeeSVijay Mahadevan 
255a4717116SVijay Mahadevan   /* set some variables based on dimension */
25651d15aeeSVijay Mahadevan   switch(dim) {
25751d15aeeSVijay Mahadevan    case 1:
25851d15aeeSVijay Mahadevan     vpere = 2;
259a4717116SVijay Mahadevan     locnele = (ise[1]-ise[0]);
260a4717116SVijay Mahadevan     locnpts = (ise[1]-ise[0]+1);
261c8d5365dSVijay Mahadevan     ghnele = (nghost > 0 ? (ise[0] > nghost ? 1 : 0) + (ise[1] < nele - nghost ? 1 : 0) : 0 );
262c8d5365dSVijay Mahadevan     ghnpts = (nghost > 0 ? (ise[0] > 0 ? 1 : 0) + (ise[1] < nele ? 1 : 0) : 0);
26351d15aeeSVijay Mahadevan     etype = moab::MBEDGE;
26451d15aeeSVijay Mahadevan     break;
26551d15aeeSVijay Mahadevan    case 2:
266c3dd00c7SVijay Mahadevan     locnpts = (ise[1]-ise[0]+1)*(ise[3]-ise[2]+1);
267c3dd00c7SVijay Mahadevan     ghnpts = (nghost > 0 ? (ise[2] > 0 ? npts : 0) + (ise[3] < nele ? npts : 0) : 0);
268c3dd00c7SVijay Mahadevan     if (useSimplex) {
269c3dd00c7SVijay Mahadevan       vpere = 3;
270c3dd00c7SVijay Mahadevan       locnele = 2*(ise[1]-ise[0])*(ise[3]-ise[2]);
271c3dd00c7SVijay Mahadevan       ghnele = 2*(nghost > 0 ? (ise[2] > 0 ? nele : 0) + (ise[3] < nele ? nele : 0) : 0);
272c3dd00c7SVijay Mahadevan       etype = moab::MBTRI;
273c3dd00c7SVijay Mahadevan     }
274c3dd00c7SVijay Mahadevan     else {
27551d15aeeSVijay Mahadevan       vpere = 4;
276a4717116SVijay Mahadevan       locnele = (ise[1]-ise[0])*(ise[3]-ise[2]);
277c8d5365dSVijay Mahadevan       ghnele = (nghost > 0 ? (ise[2] > 0 ? nele : 0) + (ise[3] < nele ? nele : 0) : 0);
27851d15aeeSVijay Mahadevan       etype = moab::MBQUAD;
279c3dd00c7SVijay Mahadevan     }
28051d15aeeSVijay Mahadevan     break;
28151d15aeeSVijay Mahadevan    case 3:
2825e168b13SVijay Mahadevan    default:
283c3dd00c7SVijay Mahadevan     locnpts = (ise[1]-ise[0]+1)*(ise[3]-ise[2]+1)*(ise[5]-ise[4]+1);
284c3dd00c7SVijay Mahadevan     ghnpts = (nghost > 0 ? (ise[4] > 0 ? npts*npts : 0) + (ise[5] < nele ? npts*npts : 0) : 0);
285c3dd00c7SVijay Mahadevan     if (useSimplex) {
286c3dd00c7SVijay Mahadevan       vpere = 4;
287c3dd00c7SVijay Mahadevan       locnele = 5*(ise[1]-ise[0])*(ise[3]-ise[2])*(ise[5]-ise[4]);
288c3dd00c7SVijay Mahadevan       ghnele = 5*(nghost > 0 ? (ise[4] > 0 ? nele*nele : 0) + (ise[5] < nele ? nele*nele : 0) : 0);
289c3dd00c7SVijay Mahadevan       etype = moab::MBTET;
290c3dd00c7SVijay Mahadevan     }
291c3dd00c7SVijay Mahadevan     else {
29251d15aeeSVijay Mahadevan       vpere = 8;
293a4717116SVijay Mahadevan       locnele = (ise[1]-ise[0])*(ise[3]-ise[2])*(ise[5]-ise[4]);
294c8d5365dSVijay Mahadevan       ghnele = (nghost > 0 ? (ise[4] > 0 ? nele*nele : 0) + (ise[5] < nele ? nele*nele : 0) : 0);
29551d15aeeSVijay Mahadevan       etype = moab::MBHEX;
296c3dd00c7SVijay Mahadevan     }
29751d15aeeSVijay Mahadevan     break;
29851d15aeeSVijay Mahadevan   }
29951d15aeeSVijay Mahadevan 
30051d15aeeSVijay Mahadevan   /* we have a domain of size [1,1,1] - now compute local co-ordinate box */
30151d15aeeSVijay Mahadevan   ierr = PetscMemzero(xse,sizeof(PetscReal)*6);CHKERRQ(ierr);
302c8d5365dSVijay Mahadevan   for(i=0; i<6; ++i) {
30351d15aeeSVijay Mahadevan     xse[i]=(PetscReal)ise[i]/nele;
30451d15aeeSVijay Mahadevan   }
30551d15aeeSVijay Mahadevan 
306a4717116SVijay Mahadevan   /* Create vertexes and set the coodinate of each vertex */
307c8d5365dSVijay Mahadevan   merr = readMeshIface->get_node_coords(3,locnpts+ghnpts,0,vfirst,vcoords,n);MBERRNM(merr);
30851d15aeeSVijay Mahadevan 
309a4717116SVijay Mahadevan   /* Compute the co-ordinates of vertices and global IDs */
310c8d5365dSVijay Mahadevan   std::vector<int>    vgid(locnpts+ghnpts);
31151d15aeeSVijay Mahadevan   int vcount=0;
31266f88a78SVijay Mahadevan 
31366f88a78SVijay Mahadevan   if (!bounds) { /* default box mesh is defined on a unit-cube */
31466f88a78SVijay Mahadevan     defbounds[0]=0.0; defbounds[1]=1.0;
31566f88a78SVijay Mahadevan     defbounds[2]=0.0; defbounds[3]=1.0;
31666f88a78SVijay Mahadevan     defbounds[4]=0.0; defbounds[5]=1.0;
31766f88a78SVijay Mahadevan     bounds=defbounds;
31866f88a78SVijay Mahadevan   }
31966f88a78SVijay Mahadevan   else {
32066f88a78SVijay Mahadevan     /* validate the bounds data */
32166f88a78SVijay 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]);
32266f88a78SVijay 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]);
32366f88a78SVijay 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]);
32466f88a78SVijay Mahadevan   }
32566f88a78SVijay Mahadevan 
32666f88a78SVijay Mahadevan   const double hx=(bounds[1]-bounds[0])/nele;
32766f88a78SVijay Mahadevan   const double hy=(dim > 1 ? (bounds[3]-bounds[2])/nele : 0.0);
32866f88a78SVijay Mahadevan   const double hz=(dim > 2 ? (bounds[5]-bounds[4])/nele : 0.0);
329e5136372SVijay Mahadevan 
330c8d5365dSVijay Mahadevan   /* create all the owned vertices */
331c8d5365dSVijay Mahadevan   for (k = ise[4]; k <= ise[5]; k++) {
332c8d5365dSVijay Mahadevan     for (j = ise[2]; j <= ise[3]; j++) {
333c8d5365dSVijay Mahadevan       for (i = ise[0]; i <= ise[1]; i++, vcount++) {
334aa859218SVijay Mahadevan         DMMoab_SetStructuredCoords_Private(i,j,k,hx,hy,hz,vcount,vcoords);
335c8d5365dSVijay Mahadevan         vgid[vcount] = (k*npts+j)*npts+i+1;
336c8d5365dSVijay Mahadevan       }
337c8d5365dSVijay Mahadevan     }
338c8d5365dSVijay Mahadevan   }
339c8d5365dSVijay Mahadevan 
340e5136372SVijay Mahadevan   /* create ghosted vertices requested by user - below the current plane */
341e5136372SVijay Mahadevan   if (ise[2*dim-2] > 0) {
342e5136372SVijay Mahadevan     for (k = (dim==3?ise[4]-nghost:ise[4]); k <= (dim==3?ise[4]-1:ise[5]); k++) {
343e5136372SVijay Mahadevan       for (j = (dim==2?ise[2]-nghost:ise[2]); j <= (dim==2?ise[2]-1:ise[3]); j++) {
344e5136372SVijay Mahadevan         for (i = (dim>1?ise[0]:ise[0]-nghost); i <= (dim>1?ise[1]:ise[0]-1); i++, vcount++) {
345aa859218SVijay Mahadevan           DMMoab_SetStructuredCoords_Private(i,j,k,hx,hy,hz,vcount,vcoords);
346e5136372SVijay Mahadevan           vgid[vcount] = (k*npts+j)*npts+i+1;
347e5136372SVijay Mahadevan         }
348e5136372SVijay Mahadevan       }
349e5136372SVijay Mahadevan     }
350e5136372SVijay Mahadevan   }
351e5136372SVijay Mahadevan 
352e5136372SVijay Mahadevan   /* create ghosted vertices requested by user - above the current plane */
353e5136372SVijay Mahadevan   if (ise[2*dim-1] < nele) {
354e5136372SVijay Mahadevan     for (k = (dim==3?ise[5]+1:ise[4]); k <= (dim==3?ise[5]+nghost:ise[5]); k++) {
355e5136372SVijay Mahadevan       for (j = (dim==2?ise[3]+1:ise[2]); j <= (dim==2?ise[3]+nghost:ise[3]); j++) {
356e5136372SVijay Mahadevan         for (i = (dim>1?ise[0]:ise[1]+1); i <= (dim>1?ise[1]:ise[1]+nghost); i++, vcount++) {
357aa859218SVijay Mahadevan           DMMoab_SetStructuredCoords_Private(i,j,k,hx,hy,hz,vcount,vcoords);
358e5136372SVijay Mahadevan           vgid[vcount] = (k*npts+j)*npts+i+1;
359e5136372SVijay Mahadevan         }
36051d15aeeSVijay Mahadevan       }
36151d15aeeSVijay Mahadevan     }
36251d15aeeSVijay Mahadevan   }
36351d15aeeSVijay Mahadevan 
364c8d5365dSVijay Mahadevan   if (locnpts+ghnpts != vcount) SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Created the wrong number of vertices! (%D!=%D)",locnpts+ghnpts,vcount);
365c8d5365dSVijay Mahadevan 
36651d15aeeSVijay Mahadevan   merr = mbiface->get_entities_by_type(0,moab::MBVERTEX,ownedvtx,true);MBERRNM(merr);
36751d15aeeSVijay Mahadevan 
368a4717116SVijay Mahadevan   /* The global ID tag is applied to each owned
369a4717116SVijay Mahadevan      vertex. It acts as an global identifier which MOAB uses to
370a4717116SVijay Mahadevan      assemble the individual pieces of the mesh:
371a4717116SVijay Mahadevan      Set the global ID indices */
37251d15aeeSVijay Mahadevan   merr = mbiface->tag_set_data(id_tag,ownedvtx,vgid.data());MBERRNM(merr);
37351d15aeeSVijay Mahadevan 
374a4717116SVijay Mahadevan   /* Create elements between mesh points using the ReadUtilInterface
375a4717116SVijay Mahadevan      get the reference to element connectivities for all local elements from the ReadUtilInterface */
376e5136372SVijay Mahadevan   merr = readMeshIface->get_element_connect (locnele+ghnele,vpere,etype,1,efirst,connectivity);MBERRNM(merr);
37751d15aeeSVijay Mahadevan 
378a4717116SVijay Mahadevan   /* offset appropriately so that only local ID and not global ID numbers are set for connectivity array */
379e5136372SVijay Mahadevan   vfirst-=vgid[0]-1;
38051d15aeeSVijay Mahadevan 
381a4717116SVijay Mahadevan    /* 3. Loop over elements in 3 nested loops over i, j, k; for each (i,j,k):
382a4717116SVijay Mahadevan          and then set the connectivity for each element appropriately */
38351d15aeeSVijay Mahadevan   int ecount=0;
38451d15aeeSVijay Mahadevan 
385e5136372SVijay Mahadevan   /* create ghosted elements requested by user - below the current plane */
386e5136372SVijay Mahadevan   if (ise[2*dim-2] >= nghost) {
387e5136372SVijay Mahadevan     for (k = (dim==3?ise[4]-nghost:ise[4]); k < (dim==3?ise[4]:std::max(ise[5],1)); k++) {
388e5136372SVijay Mahadevan       for (j = (dim==2?ise[2]-nghost:ise[2]); j < (dim==2?ise[2]:std::max(ise[3],1)); j++) {
389c3dd00c7SVijay Mahadevan         for (i = (dim>1?ise[0]:ise[0]-nghost); i < (dim>1?std::max(ise[1],1):ise[0]); i++) {
390c3dd00c7SVijay Mahadevan           DMMoab_SetElementConnectivity_Private(useSimplex, dim, etype, &ecount, vpere, nele, i, j, k, vfirst, connectivity);
39151d15aeeSVijay Mahadevan         }
39251d15aeeSVijay Mahadevan       }
39351d15aeeSVijay Mahadevan     }
39451d15aeeSVijay Mahadevan   }
395e5136372SVijay Mahadevan 
396e5136372SVijay Mahadevan   /* create owned elements requested by user */
397e5136372SVijay Mahadevan   for (k = ise[4]; k < std::max(ise[5],1); k++) {
398e5136372SVijay Mahadevan     for (j = ise[2]; j < std::max(ise[3],1); j++) {
399c3dd00c7SVijay Mahadevan       for (i = ise[0]; i < std::max(ise[1],1); i++) {
400c3dd00c7SVijay Mahadevan         DMMoab_SetElementConnectivity_Private(useSimplex, dim, etype, &ecount, vpere, nele, i, j, k, vfirst, connectivity);
401e5136372SVijay Mahadevan       }
402e5136372SVijay Mahadevan     }
403e5136372SVijay Mahadevan   }
404e5136372SVijay Mahadevan 
405e5136372SVijay Mahadevan   /* create ghosted elements requested by user - above the current plane */
406e5136372SVijay Mahadevan   if (ise[2*dim-1] <= nele-nghost) {
407e5136372SVijay Mahadevan     for (k = (dim==3?ise[5]:ise[4]); k < (dim==3?ise[5]+nghost:std::max(ise[5],1)); k++) {
408e5136372SVijay Mahadevan       for (j = (dim==2?ise[3]:ise[2]); j < (dim==2?ise[3]+nghost:std::max(ise[3],1)); j++) {
409c3dd00c7SVijay Mahadevan         for (i = (dim>1?ise[0]:ise[1]); i < (dim>1?std::max(ise[1],1):ise[1]+nghost); i++) {
410c3dd00c7SVijay Mahadevan           DMMoab_SetElementConnectivity_Private(useSimplex, dim, etype, &ecount, vpere, nele, i, j, k, vfirst, connectivity);
411e5136372SVijay Mahadevan         }
412e5136372SVijay Mahadevan       }
413e5136372SVijay Mahadevan     }
414e5136372SVijay Mahadevan   }
415e5136372SVijay Mahadevan 
416e5136372SVijay Mahadevan   merr = readMeshIface->update_adjacencies(efirst,locnele+ghnele,vpere,connectivity);MBERRNM(merr);
41751d15aeeSVijay Mahadevan 
418a4717116SVijay 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.
419a4717116SVijay Mahadevan         first '0' specifies "root set", or entire MOAB instance, second the entity dimension being requested */
42051d15aeeSVijay Mahadevan   merr = mbiface->get_entities_by_dimension(0, dim, ownedelms);MBERRNM(merr);
421a4717116SVijay Mahadevan 
4226c4ed002SBarry 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());
4236c4ed002SBarry 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());
4246c4ed002SBarry Smith   else {
4256c4ed002SBarry Smith     ierr = PetscInfo2(NULL, "Created %D elements and %D vertices.\n", ownedelms.size(), ownedvtx.size());CHKERRQ(ierr);
4266c4ed002SBarry Smith   }
42751d15aeeSVijay Mahadevan 
4283a4aeca1SVijay Mahadevan   /* lets create some sets */
4293a4aeca1SVijay 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);
4303a4aeca1SVijay Mahadevan 
4313a4aeca1SVijay Mahadevan   merr = mbiface->create_meshset(moab::MESHSET_SET, regionset);MBERRNM(merr);
4323a4aeca1SVijay Mahadevan   merr = mbiface->add_entities(regionset, ownedelms);MBERRNM(merr);
4333a4aeca1SVijay Mahadevan   merr = mbiface->tag_set_data(geom_tag, &regionset, 1, &dmmoab->dim);MBERRNM(merr);
434b5410836SVijay Mahadevan   merr = mbiface->add_parent_child(dmmoab->fileset,regionset);MBERRNM(merr);
4353a4aeca1SVijay Mahadevan   merr = mbiface->unite_meshset(dmmoab->fileset, regionset);MBERRNM(merr);
4363a4aeca1SVijay Mahadevan 
4373a4aeca1SVijay Mahadevan   merr = mbiface->create_meshset(moab::MESHSET_SET, vtxset);MBERRNM(merr);
4383a4aeca1SVijay Mahadevan   merr = mbiface->add_entities(vtxset, ownedvtx);MBERRNM(merr);
4393a4aeca1SVijay Mahadevan   merr = mbiface->add_parent_child(dmmoab->fileset,vtxset);MBERRNM(merr);
4403a4aeca1SVijay Mahadevan   merr = mbiface->unite_meshset(dmmoab->fileset, vtxset);MBERRNM(merr);
4413a4aeca1SVijay Mahadevan 
4423a4aeca1SVijay Mahadevan   if (build_adjacencies) {
4433a4aeca1SVijay Mahadevan     // generate all lower dimensional adjacencies
4443a4aeca1SVijay Mahadevan     merr = mbiface->get_adjacencies( ownedelms, dim-1, true, adj, moab::Interface::UNION );MBERRNM(merr);
4453a4aeca1SVijay Mahadevan     merr = dmmoab->pcomm->get_part_entities(dim2, dim-1);MBERRNM(merr);
4463a4aeca1SVijay Mahadevan     adj.merge(dim2);
4473a4aeca1SVijay Mahadevan 
4483a4aeca1SVijay Mahadevan     /* create face sets */
4493a4aeca1SVijay Mahadevan     merr = mbiface->create_meshset(moab::MESHSET_SET, faceset);MBERRNM(merr);
4503a4aeca1SVijay Mahadevan     merr = mbiface->add_entities(faceset, adj);MBERRNM(merr);
4513a4aeca1SVijay Mahadevan     merr = mbiface->add_parent_child(dmmoab->fileset,faceset);MBERRNM(merr);
4523a4aeca1SVijay Mahadevan     i=dim-1;
4533a4aeca1SVijay Mahadevan     merr = mbiface->tag_set_data(geom_tag, &faceset, 1, &i);MBERRNM(merr);
4543a4aeca1SVijay Mahadevan     merr = mbiface->unite_meshset(dmmoab->fileset, faceset);MBERRNM(merr);
455b8ecf6d3SVijay Mahadevan     PetscInfo2(NULL, "Found %d %d-Dim quantities.\n", adj.size(), dim-1);
4563a4aeca1SVijay Mahadevan 
4573a4aeca1SVijay Mahadevan     if (dim > 2) {
4583a4aeca1SVijay Mahadevan       dim2.clear();
4593a4aeca1SVijay Mahadevan       /* create edge sets, if appropriate i.e., if dim=3 */
4603a4aeca1SVijay Mahadevan       merr = mbiface->create_meshset(moab::MESHSET_SET, edgeset);MBERRNM(merr);
4613a4aeca1SVijay Mahadevan       merr = mbiface->get_adjacencies(adj, dim-1, true, dim2, moab::Interface::UNION );MBERRNM(merr);
4623a4aeca1SVijay Mahadevan       merr = mbiface->add_entities(edgeset, dim2);MBERRNM(merr);
4633a4aeca1SVijay Mahadevan       merr = mbiface->add_parent_child(dmmoab->fileset,edgeset);MBERRNM(merr);
4643a4aeca1SVijay Mahadevan       i=dim-2;
4653a4aeca1SVijay Mahadevan       merr = mbiface->tag_set_data(geom_tag, &edgeset, 1, &i);MBERRNM(merr);
4663a4aeca1SVijay Mahadevan       merr = mbiface->unite_meshset(dmmoab->fileset, edgeset);MBERRNM(merr);
467b8ecf6d3SVijay Mahadevan       PetscInfo2(NULL, "Found %d %d-Dim quantities.\n", adj.size(), dim-2);
4683a4aeca1SVijay Mahadevan     }
4693a4aeca1SVijay Mahadevan   }
4703a4aeca1SVijay Mahadevan 
471a4717116SVijay Mahadevan   /* check the handles */
472a4717116SVijay Mahadevan   merr = pcomm->check_all_shared_handles();MBERRV(mbiface,merr);
47351d15aeeSVijay Mahadevan 
474a4717116SVijay Mahadevan   /* resolve the shared entities by exchanging information to adjacent processors */
475a4717116SVijay Mahadevan   merr = mbiface->get_entities_by_type(dmmoab->fileset,etype,ownedelms,true);MBERRNM(merr);
476ce1fd009SVijay Mahadevan   merr = pcomm->resolve_shared_ents(dmmoab->fileset,ownedelms,dim,dim-1,NULL,&id_tag);MBERRV(mbiface,merr);
47751d15aeeSVijay Mahadevan 
4783a4aeca1SVijay Mahadevan   merr = pcomm->exchange_ghost_cells(dim,0,user_nghost,dim,true,false,&dmmoab->fileset);MBERRV(mbiface,merr);
479c8d5365dSVijay Mahadevan 
480e427d9c9SVijay Mahadevan   /* Reassign global IDs on all entities. */
481e427d9c9SVijay Mahadevan   merr = pcomm->assign_global_ids(dmmoab->fileset,dim,1,false,true,false);MBERRNM(merr);
482e427d9c9SVijay Mahadevan 
483a4717116SVijay Mahadevan   /* Everything is set up, now just do a tag exchange to update tags
484a4717116SVijay Mahadevan      on all of the ghost vertexes */
485c8d5365dSVijay Mahadevan   merr = mbiface->get_entities_by_type(dmmoab->fileset,moab::MBVERTEX,ownedvtx,true);MBERRNM(merr);
486c8d5365dSVijay Mahadevan   merr = mbiface->get_entities_by_dimension(dmmoab->fileset, dim, ownedelms);MBERRNM(merr);
487c8d5365dSVijay Mahadevan 
488a4717116SVijay Mahadevan   merr = pcomm->exchange_tags(id_tag,ownedvtx);MBERRV(mbiface,merr);
489a4717116SVijay Mahadevan   merr = pcomm->exchange_tags(id_tag,ownedelms);MBERRV(mbiface,merr);
49051d15aeeSVijay Mahadevan   PetscFunctionReturn(0);
49151d15aeeSVijay Mahadevan }
49251d15aeeSVijay Mahadevan 
49351d15aeeSVijay Mahadevan 
494a4717116SVijay Mahadevan #undef __FUNCT__
495a4717116SVijay Mahadevan #define __FUNCT__ "DMMoab_GetReadOptions_Private"
4962e4e7c01SVijay 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)
49751d15aeeSVijay Mahadevan {
4986acfe860SVijay Mahadevan   char           *ropts;
49961eb6e27SVijay Mahadevan   char           ropts_par[PETSC_MAX_PATH_LEN];
50061eb6e27SVijay Mahadevan   char           ropts_dbg[PETSC_MAX_PATH_LEN];
501f90c3b0eSVijay Mahadevan   PetscErrorCode ierr;
50251d15aeeSVijay Mahadevan 
503a4717116SVijay Mahadevan   PetscFunctionBegin;
504*95dccacaSBarry Smith   ierr = PetscMalloc1(PETSC_MAX_PATH_LEN,&ropts);CHKERRQ(ierr);
50561eb6e27SVijay Mahadevan   ierr = PetscMemzero(&ropts_par,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
50661eb6e27SVijay Mahadevan   ierr = PetscMemzero(&ropts_dbg,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
50761eb6e27SVijay Mahadevan 
508e23c60ebSVijay Mahadevan   /* do parallel read unless using only one processor */
509a4717116SVijay Mahadevan   if (numproc > 1) {
5106acfe860SVijay 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);
5112e4e7c01SVijay Mahadevan   }
5122e4e7c01SVijay Mahadevan 
513c8d5365dSVijay Mahadevan   if (dbglevel) {
514f90c3b0eSVijay Mahadevan     if (numproc>1) {
5156acfe860SVijay Mahadevan       ierr = PetscSNPrintf(ropts_dbg, PETSC_MAX_PATH_LEN, "%sCPUTIME;DEBUG_IO=%d;DEBUG_PIO=%d;",dbglevel,dbglevel);CHKERRQ(ierr);
51661eb6e27SVijay Mahadevan     }
51761eb6e27SVijay Mahadevan     else {
5186acfe860SVijay Mahadevan       ierr = PetscSNPrintf(ropts_dbg, PETSC_MAX_PATH_LEN, "%sCPUTIME;DEBUG_IO=%d;",dbglevel);CHKERRQ(ierr);
519f90c3b0eSVijay Mahadevan     }
520c8d5365dSVijay Mahadevan   }
52151d15aeeSVijay Mahadevan 
5226acfe860SVijay 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);
523f90c3b0eSVijay Mahadevan   *read_opts = ropts;
52451d15aeeSVijay Mahadevan   PetscFunctionReturn(0);
52551d15aeeSVijay Mahadevan }
52651d15aeeSVijay Mahadevan 
52751d15aeeSVijay Mahadevan 
52851d15aeeSVijay Mahadevan #undef __FUNCT__
529a4717116SVijay Mahadevan #define __FUNCT__ "DMMoabLoadFromFile"
530aa859218SVijay Mahadevan /*@
531aa859218SVijay Mahadevan   DMMoabLoadFromFile - Creates a DM object by loading the mesh from a user specified file.
532aa859218SVijay Mahadevan 
533aa859218SVijay Mahadevan   Collective on MPI_Comm
534aa859218SVijay Mahadevan 
535aa859218SVijay Mahadevan   Input Parameters:
536aa859218SVijay Mahadevan + comm - The communicator for the DM object
537aa859218SVijay Mahadevan . dim - The spatial dimension
538b8ecf6d3SVijay Mahadevan . filename - The name of the mesh file to be loaded
539b8ecf6d3SVijay Mahadevan . usrreadopts - The options string to read a MOAB mesh.
540aa859218SVijay Mahadevan   Reference (Parallel Mesh Initialization: http://www.mcs.anl.gov/~fathom/moab-docs/html/contents.html#fivetwo)
541aa859218SVijay Mahadevan 
542aa859218SVijay Mahadevan   Output Parameter:
543aa859218SVijay Mahadevan . dm  - The DM object
544aa859218SVijay Mahadevan 
545aa859218SVijay Mahadevan   Level: beginner
546aa859218SVijay Mahadevan 
547aa859218SVijay Mahadevan .keywords: DM, create
548b8ecf6d3SVijay Mahadevan 
549aa859218SVijay Mahadevan .seealso: DMSetType(), DMCreate(), DMMoabCreateBoxMesh()
550aa859218SVijay Mahadevan @*/
551a4717116SVijay Mahadevan PetscErrorCode DMMoabLoadFromFile(MPI_Comm comm,PetscInt dim,const char* filename, const char* usrreadopts, DM *dm)
55251d15aeeSVijay Mahadevan {
553a4717116SVijay Mahadevan   moab::ErrorCode merr;
5542e4e7c01SVijay Mahadevan   PetscInt        nprocs;
555a4717116SVijay Mahadevan   DM_Moab        *dmmoab;
556a4717116SVijay Mahadevan   moab::Interface *mbiface;
557a4717116SVijay Mahadevan   moab::ParallelComm *pcomm;
558a4717116SVijay Mahadevan   moab::Range verts,elems;
5597023aa44SVijay Mahadevan   const char *readopts;
560a4717116SVijay Mahadevan   PetscErrorCode ierr;
56151d15aeeSVijay Mahadevan 
56251d15aeeSVijay Mahadevan   PetscFunctionBegin;
563a4717116SVijay Mahadevan   PetscValidPointer(dm,5);
56451d15aeeSVijay Mahadevan 
565a4717116SVijay Mahadevan   /* Create the basic DMMoab object and keep the default parameters created by DM impls */
566a4717116SVijay Mahadevan   ierr = DMMoabCreateMoab(comm, PETSC_NULL, PETSC_NULL, PETSC_NULL, PETSC_NULL, dm);CHKERRQ(ierr);
56751d15aeeSVijay Mahadevan 
568a4717116SVijay Mahadevan   /* get all the necessary handles from the private DM object */
569a4717116SVijay Mahadevan   dmmoab = (DM_Moab*)(*dm)->data;
570a4717116SVijay Mahadevan   mbiface = dmmoab->mbiface;
571a4717116SVijay Mahadevan   pcomm = dmmoab->pcomm;
572a4717116SVijay Mahadevan   nprocs = pcomm->size();
573aa859218SVijay Mahadevan   /* TODO: Decipher dimension based on the loaded mesh instead of getting from user */
574c8d5365dSVijay Mahadevan   dmmoab->dim = dim;
575a4717116SVijay Mahadevan 
576b5410836SVijay Mahadevan   /* create a file set to associate all entities in current mesh */
577b5410836SVijay Mahadevan   merr = dmmoab->mbiface->create_meshset(moab::MESHSET_SET, dmmoab->fileset);MBERR("Creating file set failed", merr);
578b5410836SVijay Mahadevan 
579a4717116SVijay Mahadevan   /* add mesh loading options specific to the DM */
5802e4e7c01SVijay Mahadevan   ierr = DMMoab_GetReadOptions_Private(dmmoab->partition_by_rank, nprocs, dim, dmmoab->read_mode,
5812e4e7c01SVijay Mahadevan                                         dmmoab->rw_dbglevel, dmmoab->extra_read_options, usrreadopts, &readopts);CHKERRQ(ierr);
5827023aa44SVijay Mahadevan 
583e5136372SVijay Mahadevan   PetscInfo2(*dm, "Reading file %s with options: %s\n",filename,readopts);
584a4717116SVijay Mahadevan 
585a4717116SVijay Mahadevan   /* Load the mesh from a file. */
5867023aa44SVijay Mahadevan   merr = mbiface->load_file(filename, &dmmoab->fileset, readopts);MBERRVM(mbiface,"Reading MOAB file failed.", merr);
587a4717116SVijay Mahadevan 
5886e40195eSVijay Mahadevan   /* Reassign global IDs on all entities. */
589e5136372SVijay Mahadevan   merr = pcomm->assign_global_ids(dmmoab->fileset,dim,1,true,true,true);MBERRNM(merr);
590e5136372SVijay Mahadevan 
591e5136372SVijay Mahadevan   /* load the local vertices */
592e5136372SVijay Mahadevan   merr = mbiface->get_entities_by_type(dmmoab->fileset, moab::MBVERTEX, verts, true);MBERRNM(merr);
593e5136372SVijay Mahadevan   /* load the local elements */
594e5136372SVijay Mahadevan   merr = mbiface->get_entities_by_dimension(dmmoab->fileset, dim, elems, true);MBERRNM(merr);
595e5136372SVijay Mahadevan 
596e5136372SVijay Mahadevan   /* Everything is set up, now just do a tag exchange to update tags
597e5136372SVijay Mahadevan      on all of the ghost vertexes */
598e5136372SVijay Mahadevan   merr = pcomm->exchange_tags(dmmoab->ltog_tag,verts);MBERRV(mbiface,merr);
599e5136372SVijay Mahadevan   merr = pcomm->exchange_tags(dmmoab->ltog_tag,elems);MBERRV(mbiface,merr);
600e5136372SVijay Mahadevan 
601e5136372SVijay Mahadevan   merr = pcomm->exchange_ghost_cells(dim,0,1,0,true,true,&dmmoab->fileset);MBERRV(mbiface,merr);
6026e40195eSVijay Mahadevan 
603a4717116SVijay Mahadevan   merr = pcomm->collective_sync_partition();MBERR("Collective sync failed", merr);
604a4717116SVijay Mahadevan 
605e5136372SVijay Mahadevan   PetscInfo3(*dm, "MOAB file '%s' was successfully loaded. Found %D vertices and %D elements.\n", filename, verts.size(), elems.size());
6066acfe860SVijay Mahadevan   ierr = PetscFree(readopts);CHKERRQ(ierr);
60751d15aeeSVijay Mahadevan   PetscFunctionReturn(0);
60851d15aeeSVijay Mahadevan }
60951d15aeeSVijay Mahadevan 
610