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