xref: /petsc/src/dm/impls/moab/dmmbutil.cxx (revision 51d15aee49336faa1f633d57dec55dd1cd6395e0)
1*51d15aeeSVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I  "petscdm.h"   I*/
2*51d15aeeSVijay Mahadevan #include <petsc-private/vecimpl.h> /*I  "petscdm.h"   I*/
3*51d15aeeSVijay Mahadevan 
4*51d15aeeSVijay Mahadevan #include <petscdmmoab.h>
5*51d15aeeSVijay Mahadevan #include <MBTagConventions.hpp>
6*51d15aeeSVijay Mahadevan #include <moab/ReadUtilIface.hpp>
7*51d15aeeSVijay Mahadevan #include <moab/ScdInterface.hpp>
8*51d15aeeSVijay Mahadevan #include <moab/CN.hpp>
9*51d15aeeSVijay Mahadevan 
10*51d15aeeSVijay Mahadevan 
11*51d15aeeSVijay Mahadevan #undef __FUNCT__
12*51d15aeeSVijay Mahadevan #define __FUNCT__ "DMMoabComputeDomainBounds_Private"
13*51d15aeeSVijay Mahadevan PetscErrorCode DMMoabComputeDomainBounds_Private(moab::ParallelComm* pcomm, PetscInt dim, PetscInt neleglob, PetscInt *ise)
14*51d15aeeSVijay Mahadevan {
15*51d15aeeSVijay Mahadevan   PetscInt size,rank;
16*51d15aeeSVijay Mahadevan   PetscInt fraction,remainder;
17*51d15aeeSVijay Mahadevan   PetscInt neleadim;
18*51d15aeeSVijay Mahadevan   PetscInt starts[3],sizes[3];
19*51d15aeeSVijay Mahadevan 
20*51d15aeeSVijay Mahadevan   PetscFunctionBegin;
21*51d15aeeSVijay Mahadevan   if(dim<1 && dim>3) SETERRQ1(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"The problem dimension is invalid: %D",dim);
22*51d15aeeSVijay Mahadevan 
23*51d15aeeSVijay Mahadevan   size=pcomm->size();
24*51d15aeeSVijay Mahadevan   rank=pcomm->rank();
25*51d15aeeSVijay Mahadevan   neleadim=(dim==3?neleglob*neleglob:(dim==2?neleglob:1));
26*51d15aeeSVijay Mahadevan   fraction=neleglob/size;    /* partition only by the largest dimension */
27*51d15aeeSVijay Mahadevan   remainder=neleglob%size;   /* remainder after partition which gets evenly distributed by round-robin */
28*51d15aeeSVijay Mahadevan 
29*51d15aeeSVijay 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);
30*51d15aeeSVijay Mahadevan 
31*51d15aeeSVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%D] Input Dim=%D IFR=[%D]; IREM=[%D]; NCOUNT=[%D]\n", rank, dim, fraction, remainder, neleadim);
32*51d15aeeSVijay Mahadevan 
33*51d15aeeSVijay Mahadevan   starts[0]=starts[1]=starts[2]=0;       /* default dimensional element = 1 */
34*51d15aeeSVijay Mahadevan   sizes[0]=sizes[1]=sizes[2]=neleglob;   /* default dimensional element = 1 */
35*51d15aeeSVijay Mahadevan 
36*51d15aeeSVijay Mahadevan   if(rank < remainder) {
37*51d15aeeSVijay Mahadevan     /* This process gets "fraction+1" elements */
38*51d15aeeSVijay Mahadevan     sizes[dim-1] = (fraction + 1);
39*51d15aeeSVijay Mahadevan     starts[dim-1] = rank * (fraction+1);
40*51d15aeeSVijay Mahadevan   } else {
41*51d15aeeSVijay Mahadevan     /* This process gets "fraction" elements */
42*51d15aeeSVijay Mahadevan     sizes[dim-1] = fraction;
43*51d15aeeSVijay Mahadevan     starts[dim-1] = (remainder*(fraction+1) + fraction*(rank-remainder));
44*51d15aeeSVijay Mahadevan   }
45*51d15aeeSVijay Mahadevan 
46*51d15aeeSVijay Mahadevan   for(int i=dim-1; i>=0; --i) {
47*51d15aeeSVijay Mahadevan     ise[2*i]=starts[i];ise[2*i+1]=starts[i]+sizes[i];
48*51d15aeeSVijay Mahadevan     PetscPrintf(PETSC_COMM_SELF, "[%D] Dim=%D ISTART=[%D]; IEND=[%D]; NCOUNT=[%D]\n", rank, i, ise[2*i], ise[2*i+1], sizes[i]);
49*51d15aeeSVijay Mahadevan   }
50*51d15aeeSVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%D] X=[%D, %D]; Y=[%D,%D]; Z=[%D,%D]\n", rank, ise[0], ise[1], ise[2], ise[3], ise[4], ise[5]);
51*51d15aeeSVijay Mahadevan 
52*51d15aeeSVijay Mahadevan   PetscFunctionReturn(0);
53*51d15aeeSVijay Mahadevan }
54*51d15aeeSVijay Mahadevan 
55*51d15aeeSVijay Mahadevan 
56*51d15aeeSVijay Mahadevan #undef __FUNCT__
57*51d15aeeSVijay Mahadevan #define __FUNCT__ "DMMoabCreateBoxMesh"
58*51d15aeeSVijay Mahadevan PetscErrorCode DMMoabCreateBoxMesh(MPI_Comm comm, PetscInt dim, PetscInt nele, PetscInt nghost, DM *dm)
59*51d15aeeSVijay Mahadevan {
60*51d15aeeSVijay Mahadevan   PetscErrorCode ierr;
61*51d15aeeSVijay Mahadevan   moab::ErrorCode merr;
62*51d15aeeSVijay Mahadevan   PetscInt  rank,nprocs;
63*51d15aeeSVijay Mahadevan   DM_Moab        *dmmoab;
64*51d15aeeSVijay Mahadevan   moab::Interface *mbiface;
65*51d15aeeSVijay Mahadevan   moab::ParallelComm *pcomm;
66*51d15aeeSVijay Mahadevan   moab::Tag  id_tag=PETSC_NULL;
67*51d15aeeSVijay Mahadevan   moab::Range range;
68*51d15aeeSVijay Mahadevan   moab::EntityType etype;
69*51d15aeeSVijay Mahadevan   moab::ScdInterface *scdiface;
70*51d15aeeSVijay Mahadevan   PetscInt    ise[6];
71*51d15aeeSVijay Mahadevan   PetscReal   xse[6];
72*51d15aeeSVijay Mahadevan 
73*51d15aeeSVijay Mahadevan   // Determine which elements (cells) the current process owns:
74*51d15aeeSVijay Mahadevan   const PetscInt npts=nele+1;
75*51d15aeeSVijay Mahadevan   PetscInt my_nele,my_npts;      // Number of elements owned by this process
76*51d15aeeSVijay Mahadevan   PetscInt my_estart;    // The starting element for this process
77*51d15aeeSVijay Mahadevan   PetscInt vpere;
78*51d15aeeSVijay Mahadevan 
79*51d15aeeSVijay Mahadevan   PetscFunctionBegin;
80*51d15aeeSVijay Mahadevan   ierr = DMMoabCreateMoab(comm, PETSC_NULL, PETSC_NULL, PETSC_NULL, PETSC_NULL, dm);CHKERRQ(ierr);
81*51d15aeeSVijay Mahadevan 
82*51d15aeeSVijay Mahadevan   dmmoab = (DM_Moab*)(*dm)->data;
83*51d15aeeSVijay Mahadevan   mbiface = dmmoab->mbiface;
84*51d15aeeSVijay Mahadevan   pcomm = dmmoab->pcomm;
85*51d15aeeSVijay Mahadevan   id_tag = dmmoab->ltog_tag;
86*51d15aeeSVijay Mahadevan 
87*51d15aeeSVijay Mahadevan   nprocs = pcomm->size();
88*51d15aeeSVijay Mahadevan   rank = pcomm->rank();
89*51d15aeeSVijay Mahadevan 
90*51d15aeeSVijay Mahadevan   // Begin with some error checking:
91*51d15aeeSVijay Mahadevan   if(npts < 2) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Number of points must be >= 2");
92*51d15aeeSVijay Mahadevan   if(nprocs >= npts) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Number of processors must be less than number of points");
93*51d15aeeSVijay Mahadevan 
94*51d15aeeSVijay Mahadevan   // No errors,proceed with building the mesh:
95*51d15aeeSVijay Mahadevan   merr = mbiface->query_interface(scdiface);MBERRNM(merr); // get a ScdInterface object through moab instance
96*51d15aeeSVijay Mahadevan 
97*51d15aeeSVijay Mahadevan   moab::ReadUtilIface* readMeshIface;
98*51d15aeeSVijay Mahadevan   mbiface->query_interface(readMeshIface);
99*51d15aeeSVijay Mahadevan 
100*51d15aeeSVijay Mahadevan   ierr = PetscMemzero(ise,sizeof(PetscInt)*6);CHKERRQ(ierr);
101*51d15aeeSVijay Mahadevan   ierr = DMMoabComputeDomainBounds_Private(pcomm, dim, nele, ise);CHKERRQ(ierr);
102*51d15aeeSVijay Mahadevan 
103*51d15aeeSVijay Mahadevan   my_estart = ise[2*(dim-1)];
104*51d15aeeSVijay Mahadevan   switch(dim) {
105*51d15aeeSVijay Mahadevan    case 1:
106*51d15aeeSVijay Mahadevan     vpere = 2;
107*51d15aeeSVijay Mahadevan     my_nele = (ise[1]-ise[0]);
108*51d15aeeSVijay Mahadevan     my_npts = (ise[1]-ise[0]+1);
109*51d15aeeSVijay Mahadevan     etype = moab::MBEDGE;
110*51d15aeeSVijay Mahadevan     break;
111*51d15aeeSVijay Mahadevan    case 2:
112*51d15aeeSVijay Mahadevan     vpere = 4;
113*51d15aeeSVijay Mahadevan     my_nele = (ise[1]-ise[0])*(ise[3]-ise[2]);
114*51d15aeeSVijay Mahadevan     my_npts = (ise[1]-ise[0]+1)*(ise[3]-ise[2]+1);
115*51d15aeeSVijay Mahadevan     etype = moab::MBQUAD;
116*51d15aeeSVijay Mahadevan     break;
117*51d15aeeSVijay Mahadevan    case 3:
118*51d15aeeSVijay Mahadevan     vpere = 8;
119*51d15aeeSVijay Mahadevan     my_nele = (ise[1]-ise[0])*(ise[3]-ise[2])*(ise[5]-ise[4]);
120*51d15aeeSVijay Mahadevan     my_npts = (ise[1]-ise[0]+1)*(ise[3]-ise[2]+1)*(ise[5]-ise[4]+1);
121*51d15aeeSVijay Mahadevan     etype = moab::MBHEX;
122*51d15aeeSVijay Mahadevan     break;
123*51d15aeeSVijay Mahadevan   }
124*51d15aeeSVijay Mahadevan 
125*51d15aeeSVijay Mahadevan   /* we have a domain of size [1,1,1] - now compute local co-ordinate box */
126*51d15aeeSVijay Mahadevan   ierr = PetscMemzero(xse,sizeof(PetscReal)*6);CHKERRQ(ierr);
127*51d15aeeSVijay Mahadevan   for(int i=0; i<6; ++i) {
128*51d15aeeSVijay Mahadevan     xse[i]=(PetscReal)ise[i]/nele;
129*51d15aeeSVijay Mahadevan     PetscPrintf(PETSC_COMM_SELF, "[%D] Coords %d ; nele = %D; [%D, %G]\n", rank, i, nele, ise[i], xse[i]);
130*51d15aeeSVijay Mahadevan   }
131*51d15aeeSVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "[%D] Coords X=[%G, %G]; Y=[%G,%G]; Z=[%G,%G]\n", rank, xse[0], xse[1], xse[2], xse[3], xse[4], xse[5]);
132*51d15aeeSVijay Mahadevan 
133*51d15aeeSVijay Mahadevan   PetscPrintf(PETSC_COMM_SELF, "\n[%D] My start_ele = %D and tot_nele = %D\n", rank,my_estart, my_nele);
134*51d15aeeSVijay Mahadevan 
135*51d15aeeSVijay Mahadevan   /*
136*51d15aeeSVijay Mahadevan   // Compute the co-ordinates of vertices
137*51d15aeeSVijay Mahadevan   std::vector<double> coords(my_npts*vpere*3); // vertices_per_edge = 2, 3 doubles/point
138*51d15aeeSVijay Mahadevan   std::vector<int>    vgid(my_npts);
139*51d15aeeSVijay Mahadevan   int vcount=0;
140*51d15aeeSVijay Mahadevan   double hxyz=1.0/nele;
141*51d15aeeSVijay Mahadevan   for (int k = ise[4]; k <= ise[5]; k++) {
142*51d15aeeSVijay Mahadevan     for (int j = ise[2]; j <= ise[3]; j++) {
143*51d15aeeSVijay Mahadevan       for (int i = ise[0]; i <= ise[1]; i++, vcount++) {
144*51d15aeeSVijay Mahadevan         coords[vcount*3]   = i*hxyz;
145*51d15aeeSVijay Mahadevan         coords[vcount*3+1] = j*hxyz;
146*51d15aeeSVijay Mahadevan         coords[vcount*3+2] = k*hxyz;
147*51d15aeeSVijay Mahadevan         vgid[vcount] = (k*nele+j)*nele+i;
148*51d15aeeSVijay Mahadevan       }
149*51d15aeeSVijay Mahadevan     }
150*51d15aeeSVijay Mahadevan   }
151*51d15aeeSVijay Mahadevan 
152*51d15aeeSVijay Mahadevan 
153*51d15aeeSVijay Mahadevan   // 1. Creates a IxJxK structured mesh, which includes I*J*K vertices and (I-1)*(J-1)*(K-1) hexes.
154*51d15aeeSVijay Mahadevan   moab::ScdBox *box;
155*51d15aeeSVijay Mahadevan   moab::HomCoord low(ise[0], ise[2], ise[4]);
156*51d15aeeSVijay Mahadevan   moab::HomCoord high(ise[1], ise[3], ise[5]);
157*51d15aeeSVijay Mahadevan //  low.normalize(); high.normalize();
158*51d15aeeSVijay Mahadevan   merr = scdiface->construct_box(low, high, // low, high box corners in parametric space
159*51d15aeeSVijay Mahadevan                                  coords.data(), vcount,   // NULL coords vector and 0 coords (don't specify coords for now)
160*51d15aeeSVijay Mahadevan                                  box);      // box is the structured box object providing the parametric
161*51d15aeeSVijay Mahadevan                                             // structured mesh interface for this tensor grid of elements
162*51d15aeeSVijay Mahadevan   MBERRNM(merr);
163*51d15aeeSVijay Mahadevan   */
164*51d15aeeSVijay Mahadevan 
165*51d15aeeSVijay Mahadevan     // Create vertexes and set the coodinate of each vertex:
166*51d15aeeSVijay Mahadevan   moab::EntityHandle vfirst;
167*51d15aeeSVijay Mahadevan   std::vector<double*> vcoords;
168*51d15aeeSVijay Mahadevan   const int sequence_size = (my_nele + 2) + 1;
169*51d15aeeSVijay Mahadevan   merr = readMeshIface->get_node_coords(3,my_npts,0,vfirst,vcoords,sequence_size);MBERRNM(merr);
170*51d15aeeSVijay Mahadevan 
171*51d15aeeSVijay Mahadevan     // Compute the co-ordinates of vertices and global IDs
172*51d15aeeSVijay Mahadevan   std::vector<int>    vgid(my_npts);
173*51d15aeeSVijay Mahadevan   int vcount=0;
174*51d15aeeSVijay Mahadevan   double hxyz=1.0/nele;
175*51d15aeeSVijay Mahadevan   for (int k = ise[4]; k <= ise[5]; k++) {
176*51d15aeeSVijay Mahadevan     for (int j = ise[2]; j <= ise[3]; j++) {
177*51d15aeeSVijay Mahadevan       for (int i = ise[0]; i <= ise[1]; i++, vcount++) {
178*51d15aeeSVijay Mahadevan         vcoords[0][vcount] = i*hxyz;
179*51d15aeeSVijay Mahadevan         vcoords[1][vcount] = j*hxyz;
180*51d15aeeSVijay Mahadevan         vcoords[2][vcount] = k*hxyz;
181*51d15aeeSVijay Mahadevan         vgid[vcount] = (k*nele+j)*nele+i;
182*51d15aeeSVijay Mahadevan       }
183*51d15aeeSVijay Mahadevan     }
184*51d15aeeSVijay Mahadevan   }
185*51d15aeeSVijay Mahadevan 
186*51d15aeeSVijay Mahadevan   moab::Range ownedvtx,ownedelms;
187*51d15aeeSVijay Mahadevan   merr = mbiface->get_entities_by_type(0,moab::MBVERTEX,ownedvtx,true);MBERRNM(merr);
188*51d15aeeSVijay Mahadevan 
189*51d15aeeSVijay Mahadevan   // Get the global ID tag. The global ID tag is applied to each
190*51d15aeeSVijay Mahadevan   // vertex. It acts as an global identifier which MOAB uses to
191*51d15aeeSVijay Mahadevan   // assemble the individual pieces of the mesh:
192*51d15aeeSVijay Mahadevan   merr = mbiface->tag_get_handle(GLOBAL_ID_TAG_NAME,id_tag);MBERRNM(merr);
193*51d15aeeSVijay Mahadevan 
194*51d15aeeSVijay Mahadevan   // set the global id for all the owned vertices
195*51d15aeeSVijay Mahadevan   merr = mbiface->tag_set_data(id_tag,ownedvtx,vgid.data());MBERRNM(merr);
196*51d15aeeSVijay Mahadevan 
197*51d15aeeSVijay Mahadevan   // Create elements between mesh points. This is done so that VisIt
198*51d15aeeSVijay Mahadevan   // will interpret the output as a mesh that can be plotted...
199*51d15aeeSVijay Mahadevan   moab::EntityHandle efirst;
200*51d15aeeSVijay Mahadevan   moab::EntityHandle *connectivity = 0;
201*51d15aeeSVijay Mahadevan   std::vector<int> subent_conn(vpere);
202*51d15aeeSVijay Mahadevan 
203*51d15aeeSVijay Mahadevan   merr = readMeshIface->get_element_connect (my_nele,vpere,etype,1,efirst,connectivity);MBERRNM(merr);
204*51d15aeeSVijay Mahadevan 
205*51d15aeeSVijay Mahadevan   int ecount=0;
206*51d15aeeSVijay Mahadevan   for (int k = ise[4]; k < std::max(ise[5],1); k++) {
207*51d15aeeSVijay Mahadevan     for (int j = ise[2]; j < std::max(ise[3],1); j++) {
208*51d15aeeSVijay Mahadevan       for (int i = ise[0]; i < std::max(ise[1],1); i++,ecount++) {
209*51d15aeeSVijay Mahadevan         const int offset = ecount*vpere;
210*51d15aeeSVijay Mahadevan         moab::CN::SubEntityVertexIndices(etype, dim, 0, subent_conn.data());
211*51d15aeeSVijay Mahadevan 
212*51d15aeeSVijay Mahadevan         switch(dim) {
213*51d15aeeSVijay Mahadevan           case 1:
214*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[0]] = vfirst+i;
215*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[1]] = vfirst+(i+1);
216*51d15aeeSVijay Mahadevan             break;
217*51d15aeeSVijay Mahadevan           case 2:
218*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[0]] = vfirst+i+j*(nele+1);
219*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[1]] = vfirst+(i+1)+j*(nele+1);
220*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[2]] = vfirst+(i+1)+(j+1)*(nele+1);
221*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[3]] = vfirst+i+(j+1)*(nele+1);
222*51d15aeeSVijay Mahadevan             break;
223*51d15aeeSVijay Mahadevan           case 3:
224*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[0]] = vfirst+i+(nele+1)*(j+(nele+1)*k);
225*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[1]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*k);
226*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[2]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*k);
227*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[3]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*k);
228*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[4]] = vfirst+i+(nele+1)*(j+(nele+1)*(k+1));
229*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[5]] = vfirst+(i+1)+(nele+1)*(j+(nele+1)*(k+1));
230*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[6]] = vfirst+(i+1)+(nele+1)*((j+1)+(nele+1)*(k+1));
231*51d15aeeSVijay Mahadevan             connectivity[offset+subent_conn[7]] = vfirst+i+(nele+1)*((j+1)+(nele+1)*(k+1));
232*51d15aeeSVijay Mahadevan             break;
233*51d15aeeSVijay Mahadevan         }
234*51d15aeeSVijay Mahadevan       }
235*51d15aeeSVijay Mahadevan     }
236*51d15aeeSVijay Mahadevan   }
237*51d15aeeSVijay Mahadevan   merr = readMeshIface->update_adjacencies(efirst,my_nele,vpere,connectivity);MBERRNM(merr);
238*51d15aeeSVijay Mahadevan 
239*51d15aeeSVijay 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.
240*51d15aeeSVijay Mahadevan    // first '0' specifies "root set", or entire MOAB instance, second the entity dimension being requested
241*51d15aeeSVijay Mahadevan   merr = mbiface->get_entities_by_dimension(0, dim, ownedelms);MBERRNM(merr);
242*51d15aeeSVijay Mahadevan 
243*51d15aeeSVijay Mahadevan   if (my_nele != (int) ownedelms.size())
244*51d15aeeSVijay Mahadevan     SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Created the wrong number of elements! (%D!=%D)",my_nele,ownedelms.size());
245*51d15aeeSVijay Mahadevan   else if(my_npts != (int) ownedvtx.size())
246*51d15aeeSVijay Mahadevan     SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Created the wrong number of vertices! (%D!=%D)",my_npts,ownedvtx.size());
247*51d15aeeSVijay Mahadevan   else
248*51d15aeeSVijay Mahadevan     PetscPrintf(PETSC_COMM_WORLD, "Created %D elements and %D vertices.\n", ownedelms.size(), ownedvtx.size());
249*51d15aeeSVijay Mahadevan 
250*51d15aeeSVijay Mahadevan     // 3. Loop over elements in 3 nested loops over i, j, k; for each (i,j,k):
251*51d15aeeSVijay Mahadevan   /*
252*51d15aeeSVijay Mahadevan   std::vector<double> coords(vpere*3); // vertices_per_edge = 2, 3 doubles/point
253*51d15aeeSVijay Mahadevan   std::vector<moab::EntityHandle> connect;
254*51d15aeeSVijay Mahadevan   int count=0;
255*51d15aeeSVijay Mahadevan   for (int k = ise[4]; k < std::max(ise[5],1); k++) {
256*51d15aeeSVijay Mahadevan     for (int j = ise[2]; j < std::max(ise[3],1); j++) {
257*51d15aeeSVijay Mahadevan       for (int i = ise[0]; i < std::max(ise[1],1); i++,count++) {
258*51d15aeeSVijay Mahadevan           // 3a. Get the element corresponding to (i,j,k)
259*51d15aeeSVijay Mahadevan         moab::EntityHandle ehandle = box->get_element(i, j, k);
260*51d15aeeSVijay Mahadevan         if (0 == ehandle) MBERRNM(moab::MB_FAILURE);
261*51d15aeeSVijay Mahadevan 
262*51d15aeeSVijay Mahadevan         PetscPrintf(PETSC_COMM_SELF, "[%D] element[%D,%D,%D]=%D\n", rank, i,j,k, ehandle);
263*51d15aeeSVijay Mahadevan 
264*51d15aeeSVijay Mahadevan           // 3b. Get the connectivity of the element
265*51d15aeeSVijay Mahadevan         merr = mbiface->get_connectivity(&ehandle, 1, connect);MBERRNM(merr); // get the connectivity, in canonical order
266*51d15aeeSVijay Mahadevan 
267*51d15aeeSVijay Mahadevan           // 3c. Get the coordinates of the vertices comprising that element
268*51d15aeeSVijay Mahadevan         merr = mbiface->get_coords(connect.data(), connect.size(), coords.data());MBERRNM(merr); // get the coordinates of those vertices
269*51d15aeeSVijay Mahadevan 
270*51d15aeeSVijay Mahadevan         for (int iv=0; iv<vpere; ++iv)
271*51d15aeeSVijay Mahadevan           PetscPrintf(PETSC_COMM_SELF, "[%D] \t iv=%D [X,Y,Z]=[%G, %G, %G]\n", rank, iv, coords[iv*3], coords[iv*3+1], coords[iv*3+2]);
272*51d15aeeSVijay Mahadevan         PetscPrintf(PETSC_COMM_SELF, "\n");
273*51d15aeeSVijay Mahadevan       }
274*51d15aeeSVijay Mahadevan     }
275*51d15aeeSVijay Mahadevan   }
276*51d15aeeSVijay Mahadevan 
277*51d15aeeSVijay Mahadevan   merr = readMeshIface->update_adjacencies(box->get_element(ise[0],ise[2],ise[4]),my_nele,vpere,connect.data());MBERRNM(merr);
278*51d15aeeSVijay Mahadevan 
279*51d15aeeSVijay Mahadevan 
280*51d15aeeSVijay Mahadevan     // 4. Release the structured mesh interface
281*51d15aeeSVijay Mahadevan   mbiface->release_interface(scdiface); // tell MOAB we're done with the ScdInterface
282*51d15aeeSVijay Mahadevan   */
283*51d15aeeSVijay Mahadevan 
284*51d15aeeSVijay Mahadevan   // The global ID tag is applied to each
285*51d15aeeSVijay Mahadevan   // vertex. It acts as an global identifier which MOAB uses to
286*51d15aeeSVijay Mahadevan   // assemble the individual pieces of the mesh:
287*51d15aeeSVijay Mahadevan   // Set the global ID indices
288*51d15aeeSVijay Mahadevan //  std::vector<int> global_ids(my_npts);
289*51d15aeeSVijay Mahadevan //  for (int i = 0; i < my_npts; i++) {
290*51d15aeeSVijay Mahadevan //    global_ids[i] = i+my_estart;
291*51d15aeeSVijay Mahadevan //  }
292*51d15aeeSVijay Mahadevan 
293*51d15aeeSVijay Mahadevan   // set the global id for all the owned vertices
294*51d15aeeSVijay Mahadevan //  merr = mbiface->tag_set_data(id_tag,ownedvtx,global_ids.data());MBERRNM(merr);
295*51d15aeeSVijay Mahadevan 
296*51d15aeeSVijay Mahadevan   merr = pcomm->check_all_shared_handles();MBERRNM(merr);
297*51d15aeeSVijay Mahadevan 
298*51d15aeeSVijay Mahadevan   if (rank)
299*51d15aeeSVijay Mahadevan     reinterpret_cast<moab::Core*>(mbiface)->print_database();
300*51d15aeeSVijay Mahadevan 
301*51d15aeeSVijay Mahadevan   // resolve the shared entities by exchanging information to adjacent processors
302*51d15aeeSVijay Mahadevan   merr = mbiface->get_entities_by_type(0,etype,ownedelms,true);MBERRNM(merr);
303*51d15aeeSVijay Mahadevan   merr = pcomm->resolve_shared_ents(0,ownedelms,dim,0);MBERRNM(merr);
304*51d15aeeSVijay Mahadevan 
305*51d15aeeSVijay Mahadevan   // Reassign global IDs on all entities.
306*51d15aeeSVijay Mahadevan   merr = pcomm->assign_global_ids(0,dim,0,false,true);MBERRNM(merr);
307*51d15aeeSVijay Mahadevan   merr = pcomm->exchange_ghost_cells(dim,0,nghost,0,true);MBERRNM(merr);
308*51d15aeeSVijay Mahadevan 
309*51d15aeeSVijay Mahadevan   // Everything is set up, now just do a tag exchange to update tags
310*51d15aeeSVijay Mahadevan   // on all of the ghost vertexes:
311*51d15aeeSVijay Mahadevan   merr = pcomm->exchange_tags(id_tag,ownedvtx);MBERRNM(merr);
312*51d15aeeSVijay Mahadevan   merr = pcomm->exchange_tags(id_tag,ownedelms);MBERRNM(merr);
313*51d15aeeSVijay Mahadevan 
314*51d15aeeSVijay Mahadevan   // set the dimension of the mesh
315*51d15aeeSVijay Mahadevan   merr = mbiface->set_dimension(dim);MBERRNM(merr);
316*51d15aeeSVijay Mahadevan 
317*51d15aeeSVijay Mahadevan 
318*51d15aeeSVijay Mahadevan   std::stringstream sstr;
319*51d15aeeSVijay Mahadevan   sstr << "test_" << rank << ".vtk";
320*51d15aeeSVijay Mahadevan   mbiface->write_mesh(sstr.str().c_str());
321*51d15aeeSVijay Mahadevan   PetscFunctionReturn(0);
322*51d15aeeSVijay Mahadevan }
323*51d15aeeSVijay Mahadevan 
324*51d15aeeSVijay Mahadevan 
325*51d15aeeSVijay Mahadevan 
326*51d15aeeSVijay Mahadevan 
327*51d15aeeSVijay Mahadevan PetscErrorCode resolve_and_exchange(moab::ParallelComm* mbpc, PetscInt dim)
328*51d15aeeSVijay Mahadevan {
329*51d15aeeSVijay Mahadevan   moab::EntityHandle entity_set;
330*51d15aeeSVijay Mahadevan   moab::ErrorCode merr;
331*51d15aeeSVijay Mahadevan   moab::Interface *mbint=mbpc->get_moab();
332*51d15aeeSVijay Mahadevan   moab::Range range;
333*51d15aeeSVijay Mahadevan   moab::Tag tag;
334*51d15aeeSVijay Mahadevan   PetscInt rank=mbpc->rank();
335*51d15aeeSVijay Mahadevan 
336*51d15aeeSVijay Mahadevan   // Create the entity set:
337*51d15aeeSVijay Mahadevan   merr = mbint->create_meshset(moab::MESHSET_SET, entity_set);MBERRNM(merr);
338*51d15aeeSVijay Mahadevan 
339*51d15aeeSVijay Mahadevan   // Get a list of elements in the current set:
340*51d15aeeSVijay Mahadevan   merr = mbint->get_entities_by_dimension(0, dim, range, true);MBERRNM(merr);
341*51d15aeeSVijay Mahadevan 
342*51d15aeeSVijay Mahadevan   // Add entities to the entity set:
343*51d15aeeSVijay Mahadevan   merr = mbint->add_entities(entity_set, range);MBERRNM(merr);
344*51d15aeeSVijay Mahadevan 
345*51d15aeeSVijay Mahadevan   // Add the MATERIAL_SET tag to the entity set:
346*51d15aeeSVijay Mahadevan   merr = mbint->tag_get_handle(MATERIAL_SET_TAG_NAME, 1, moab::MB_TYPE_INTEGER, tag);MBERRNM(merr);
347*51d15aeeSVijay Mahadevan   merr = mbint->tag_set_data(tag, &entity_set, 1, &rank);MBERRNM(merr);
348*51d15aeeSVijay Mahadevan 
349*51d15aeeSVijay Mahadevan   // Set up partition sets. This is where MOAB is actually told what
350*51d15aeeSVijay Mahadevan   // entities each process owns:
351*51d15aeeSVijay Mahadevan   merr = mbint->get_entities_by_type_and_tag(0, moab::MBENTITYSET,
352*51d15aeeSVijay Mahadevan 					    &tag, NULL, 1,
353*51d15aeeSVijay Mahadevan 					    mbpc->partition_sets());MBERRNM(merr);
354*51d15aeeSVijay Mahadevan 
355*51d15aeeSVijay Mahadevan   // Finally, determine which entites are shared and exchange the
356*51d15aeeSVijay Mahadevan   // ghosted entities:
357*51d15aeeSVijay Mahadevan   merr = mbpc->resolve_shared_ents(0, -1, -1);MBERRNM(merr);
358*51d15aeeSVijay Mahadevan   merr = mbpc->exchange_ghost_cells(-1, 0, 1, 0, true);MBERRNM(merr);
359*51d15aeeSVijay Mahadevan   PetscFunctionReturn(0);
360*51d15aeeSVijay Mahadevan }
361*51d15aeeSVijay Mahadevan 
362*51d15aeeSVijay Mahadevan 
363*51d15aeeSVijay Mahadevan #undef __FUNCT__
364*51d15aeeSVijay Mahadevan #define __FUNCT__ "DMMoabLoadFromFile_Private"
365*51d15aeeSVijay Mahadevan PetscErrorCode DMMoabLoadFromFile_Private(moab::ParallelComm* pcomm,PetscInt dim,PetscInt npts,PetscInt nghost)
366*51d15aeeSVijay Mahadevan {
367*51d15aeeSVijay Mahadevan //  moab::ErrorCode merr;
368*51d15aeeSVijay Mahadevan   PetscInt rank,nprocs;
369*51d15aeeSVijay Mahadevan //  moab::ScdInterface *scdiface;
370*51d15aeeSVijay Mahadevan 
371*51d15aeeSVijay Mahadevan   /*
372*51d15aeeSVijay Mahadevan   // Determine which elements (cells) this process owns:
373*51d15aeeSVijay Mahadevan   const PetscInt nele = npts-1;
374*51d15aeeSVijay Mahadevan   PetscInt my_nele; // Number of elements owned by this process
375*51d15aeeSVijay Mahadevan   PetscInt my_estart;    // The starting element for this process
376*51d15aeeSVijay Mahadevan   const PetscInt vertices_per_edge=2;
377*51d15aeeSVijay Mahadevan */
378*51d15aeeSVijay Mahadevan   PetscFunctionBegin;
379*51d15aeeSVijay Mahadevan   MPI_Comm_size( PETSC_COMM_WORLD,&nprocs );
380*51d15aeeSVijay Mahadevan   MPI_Comm_rank( PETSC_COMM_WORLD,&rank );
381*51d15aeeSVijay Mahadevan 
382*51d15aeeSVijay Mahadevan 
383*51d15aeeSVijay Mahadevan //  std::stringstream sstr;
384*51d15aeeSVijay Mahadevan //  sstr << "test_" << rank << ".vtk";
385*51d15aeeSVijay Mahadevan //  mbiface->write_mesh(sstr.str().c_str());
386*51d15aeeSVijay Mahadevan   PetscFunctionReturn(0);
387*51d15aeeSVijay Mahadevan }
388*51d15aeeSVijay Mahadevan 
389*51d15aeeSVijay Mahadevan 
390*51d15aeeSVijay Mahadevan 
391