1b8ecf6d3SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 2b8ecf6d3SVijay Mahadevan #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) { 157*a8e33bb7SVijay 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); 160*a8e33bb7SVijay 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; 20751d15aeeSVijay Mahadevan moab::EntityType etype; 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 */ 219e5136372SVijay Mahadevan PetscInt vpere,locnele,locnpts,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: 282c3dd00c7SVijay Mahadevan locnpts = (ise[1]-ise[0]+1)*(ise[3]-ise[2]+1)*(ise[5]-ise[4]+1); 283c3dd00c7SVijay Mahadevan ghnpts = (nghost > 0 ? (ise[4] > 0 ? npts*npts : 0) + (ise[5] < nele ? npts*npts : 0) : 0); 284c3dd00c7SVijay Mahadevan if (useSimplex) { 285c3dd00c7SVijay Mahadevan vpere = 4; 286c3dd00c7SVijay Mahadevan locnele = 5*(ise[1]-ise[0])*(ise[3]-ise[2])*(ise[5]-ise[4]); 287c3dd00c7SVijay Mahadevan ghnele = 5*(nghost > 0 ? (ise[4] > 0 ? nele*nele : 0) + (ise[5] < nele ? nele*nele : 0) : 0); 288c3dd00c7SVijay Mahadevan etype = moab::MBTET; 289c3dd00c7SVijay Mahadevan } 290c3dd00c7SVijay Mahadevan else { 29151d15aeeSVijay Mahadevan vpere = 8; 292a4717116SVijay Mahadevan locnele = (ise[1]-ise[0])*(ise[3]-ise[2])*(ise[5]-ise[4]); 293c8d5365dSVijay Mahadevan ghnele = (nghost > 0 ? (ise[4] > 0 ? nele*nele : 0) + (ise[5] < nele ? nele*nele : 0) : 0); 29451d15aeeSVijay Mahadevan etype = moab::MBHEX; 295c3dd00c7SVijay Mahadevan } 29651d15aeeSVijay Mahadevan break; 29751d15aeeSVijay Mahadevan } 29851d15aeeSVijay Mahadevan 29951d15aeeSVijay Mahadevan /* we have a domain of size [1,1,1] - now compute local co-ordinate box */ 30051d15aeeSVijay Mahadevan ierr = PetscMemzero(xse,sizeof(PetscReal)*6);CHKERRQ(ierr); 301c8d5365dSVijay Mahadevan for(i=0; i<6; ++i) { 30251d15aeeSVijay Mahadevan xse[i]=(PetscReal)ise[i]/nele; 30351d15aeeSVijay Mahadevan } 30451d15aeeSVijay Mahadevan 305a4717116SVijay Mahadevan /* Create vertexes and set the coodinate of each vertex */ 306c8d5365dSVijay Mahadevan merr = readMeshIface->get_node_coords(3,locnpts+ghnpts,0,vfirst,vcoords,n);MBERRNM(merr); 30751d15aeeSVijay Mahadevan 308a4717116SVijay Mahadevan /* Compute the co-ordinates of vertices and global IDs */ 309c8d5365dSVijay Mahadevan std::vector<int> vgid(locnpts+ghnpts); 31051d15aeeSVijay Mahadevan int vcount=0; 31166f88a78SVijay Mahadevan 31266f88a78SVijay Mahadevan if (!bounds) { /* default box mesh is defined on a unit-cube */ 31366f88a78SVijay Mahadevan defbounds[0]=0.0; defbounds[1]=1.0; 31466f88a78SVijay Mahadevan defbounds[2]=0.0; defbounds[3]=1.0; 31566f88a78SVijay Mahadevan defbounds[4]=0.0; defbounds[5]=1.0; 31666f88a78SVijay Mahadevan bounds=defbounds; 31766f88a78SVijay Mahadevan } 31866f88a78SVijay Mahadevan else { 31966f88a78SVijay Mahadevan /* validate the bounds data */ 32066f88a78SVijay 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]); 32166f88a78SVijay 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]); 32266f88a78SVijay 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]); 32366f88a78SVijay Mahadevan } 32466f88a78SVijay Mahadevan 32566f88a78SVijay Mahadevan const double hx=(bounds[1]-bounds[0])/nele; 32666f88a78SVijay Mahadevan const double hy=(dim > 1 ? (bounds[3]-bounds[2])/nele : 0.0); 32766f88a78SVijay Mahadevan const double hz=(dim > 2 ? (bounds[5]-bounds[4])/nele : 0.0); 328e5136372SVijay Mahadevan 329c8d5365dSVijay Mahadevan /* create all the owned vertices */ 330c8d5365dSVijay Mahadevan for (k = ise[4]; k <= ise[5]; k++) { 331c8d5365dSVijay Mahadevan for (j = ise[2]; j <= ise[3]; j++) { 332c8d5365dSVijay Mahadevan for (i = ise[0]; i <= ise[1]; i++, vcount++) { 333aa859218SVijay Mahadevan DMMoab_SetStructuredCoords_Private(i,j,k,hx,hy,hz,vcount,vcoords); 334c8d5365dSVijay Mahadevan vgid[vcount] = (k*npts+j)*npts+i+1; 335c8d5365dSVijay Mahadevan } 336c8d5365dSVijay Mahadevan } 337c8d5365dSVijay Mahadevan } 338c8d5365dSVijay Mahadevan 339e5136372SVijay Mahadevan /* create ghosted vertices requested by user - below the current plane */ 340e5136372SVijay Mahadevan if (ise[2*dim-2] > 0) { 341e5136372SVijay Mahadevan for (k = (dim==3?ise[4]-nghost:ise[4]); k <= (dim==3?ise[4]-1:ise[5]); k++) { 342e5136372SVijay Mahadevan for (j = (dim==2?ise[2]-nghost:ise[2]); j <= (dim==2?ise[2]-1:ise[3]); j++) { 343e5136372SVijay Mahadevan for (i = (dim>1?ise[0]:ise[0]-nghost); i <= (dim>1?ise[1]:ise[0]-1); i++, vcount++) { 344aa859218SVijay Mahadevan DMMoab_SetStructuredCoords_Private(i,j,k,hx,hy,hz,vcount,vcoords); 345e5136372SVijay Mahadevan vgid[vcount] = (k*npts+j)*npts+i+1; 346e5136372SVijay Mahadevan } 347e5136372SVijay Mahadevan } 348e5136372SVijay Mahadevan } 349e5136372SVijay Mahadevan } 350e5136372SVijay Mahadevan 351e5136372SVijay Mahadevan /* create ghosted vertices requested by user - above the current plane */ 352e5136372SVijay Mahadevan if (ise[2*dim-1] < nele) { 353e5136372SVijay Mahadevan for (k = (dim==3?ise[5]+1:ise[4]); k <= (dim==3?ise[5]+nghost:ise[5]); k++) { 354e5136372SVijay Mahadevan for (j = (dim==2?ise[3]+1:ise[2]); j <= (dim==2?ise[3]+nghost:ise[3]); j++) { 355e5136372SVijay Mahadevan for (i = (dim>1?ise[0]:ise[1]+1); i <= (dim>1?ise[1]:ise[1]+nghost); i++, vcount++) { 356aa859218SVijay Mahadevan DMMoab_SetStructuredCoords_Private(i,j,k,hx,hy,hz,vcount,vcoords); 357e5136372SVijay Mahadevan vgid[vcount] = (k*npts+j)*npts+i+1; 358e5136372SVijay Mahadevan } 35951d15aeeSVijay Mahadevan } 36051d15aeeSVijay Mahadevan } 36151d15aeeSVijay Mahadevan } 36251d15aeeSVijay Mahadevan 363c8d5365dSVijay Mahadevan if (locnpts+ghnpts != vcount) SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Created the wrong number of vertices! (%D!=%D)",locnpts+ghnpts,vcount); 364c8d5365dSVijay Mahadevan 36551d15aeeSVijay Mahadevan merr = mbiface->get_entities_by_type(0,moab::MBVERTEX,ownedvtx,true);MBERRNM(merr); 36651d15aeeSVijay Mahadevan 367a4717116SVijay Mahadevan /* The global ID tag is applied to each owned 368a4717116SVijay Mahadevan vertex. It acts as an global identifier which MOAB uses to 369a4717116SVijay Mahadevan assemble the individual pieces of the mesh: 370a4717116SVijay Mahadevan Set the global ID indices */ 37151d15aeeSVijay Mahadevan merr = mbiface->tag_set_data(id_tag,ownedvtx,vgid.data());MBERRNM(merr); 37251d15aeeSVijay Mahadevan 373a4717116SVijay Mahadevan /* Create elements between mesh points using the ReadUtilInterface 374a4717116SVijay Mahadevan get the reference to element connectivities for all local elements from the ReadUtilInterface */ 375e5136372SVijay Mahadevan merr = readMeshIface->get_element_connect (locnele+ghnele,vpere,etype,1,efirst,connectivity);MBERRNM(merr); 37651d15aeeSVijay Mahadevan 377a4717116SVijay Mahadevan /* offset appropriately so that only local ID and not global ID numbers are set for connectivity array */ 378e5136372SVijay Mahadevan vfirst-=vgid[0]-1; 37951d15aeeSVijay Mahadevan 380a4717116SVijay Mahadevan /* 3. Loop over elements in 3 nested loops over i, j, k; for each (i,j,k): 381a4717116SVijay Mahadevan and then set the connectivity for each element appropriately */ 38251d15aeeSVijay Mahadevan int ecount=0; 38351d15aeeSVijay Mahadevan 384e5136372SVijay Mahadevan /* create ghosted elements requested by user - below the current plane */ 385e5136372SVijay Mahadevan if (ise[2*dim-2] >= nghost) { 386e5136372SVijay Mahadevan for (k = (dim==3?ise[4]-nghost:ise[4]); k < (dim==3?ise[4]:std::max(ise[5],1)); k++) { 387e5136372SVijay Mahadevan for (j = (dim==2?ise[2]-nghost:ise[2]); j < (dim==2?ise[2]:std::max(ise[3],1)); j++) { 388c3dd00c7SVijay Mahadevan for (i = (dim>1?ise[0]:ise[0]-nghost); i < (dim>1?std::max(ise[1],1):ise[0]); i++) { 389c3dd00c7SVijay Mahadevan DMMoab_SetElementConnectivity_Private(useSimplex, dim, etype, &ecount, vpere, nele, i, j, k, vfirst, connectivity); 39051d15aeeSVijay Mahadevan } 39151d15aeeSVijay Mahadevan } 39251d15aeeSVijay Mahadevan } 39351d15aeeSVijay Mahadevan } 394e5136372SVijay Mahadevan 395e5136372SVijay Mahadevan /* create owned elements requested by user */ 396e5136372SVijay Mahadevan for (k = ise[4]; k < std::max(ise[5],1); k++) { 397e5136372SVijay Mahadevan for (j = ise[2]; j < std::max(ise[3],1); j++) { 398c3dd00c7SVijay Mahadevan for (i = ise[0]; i < std::max(ise[1],1); i++) { 399c3dd00c7SVijay Mahadevan DMMoab_SetElementConnectivity_Private(useSimplex, dim, etype, &ecount, vpere, nele, i, j, k, vfirst, connectivity); 400e5136372SVijay Mahadevan } 401e5136372SVijay Mahadevan } 402e5136372SVijay Mahadevan } 403e5136372SVijay Mahadevan 404e5136372SVijay Mahadevan /* create ghosted elements requested by user - above the current plane */ 405e5136372SVijay Mahadevan if (ise[2*dim-1] <= nele-nghost) { 406e5136372SVijay Mahadevan for (k = (dim==3?ise[5]:ise[4]); k < (dim==3?ise[5]+nghost:std::max(ise[5],1)); k++) { 407e5136372SVijay Mahadevan for (j = (dim==2?ise[3]:ise[2]); j < (dim==2?ise[3]+nghost:std::max(ise[3],1)); j++) { 408c3dd00c7SVijay Mahadevan for (i = (dim>1?ise[0]:ise[1]); i < (dim>1?std::max(ise[1],1):ise[1]+nghost); i++) { 409c3dd00c7SVijay Mahadevan DMMoab_SetElementConnectivity_Private(useSimplex, dim, etype, &ecount, vpere, nele, i, j, k, vfirst, connectivity); 410e5136372SVijay Mahadevan } 411e5136372SVijay Mahadevan } 412e5136372SVijay Mahadevan } 413e5136372SVijay Mahadevan } 414e5136372SVijay Mahadevan 415e5136372SVijay Mahadevan merr = readMeshIface->update_adjacencies(efirst,locnele+ghnele,vpere,connectivity);MBERRNM(merr); 41651d15aeeSVijay Mahadevan 417a4717116SVijay 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. 418a4717116SVijay Mahadevan first '0' specifies "root set", or entire MOAB instance, second the entity dimension being requested */ 41951d15aeeSVijay Mahadevan merr = mbiface->get_entities_by_dimension(0, dim, ownedelms);MBERRNM(merr); 420a4717116SVijay Mahadevan 421e5136372SVijay Mahadevan if (locnele+ghnele != (int) ownedelms.size()) 422e5136372SVijay Mahadevan SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Created the wrong number of elements! (%D!=%D)",locnele+ghnele,ownedelms.size()); 423e5136372SVijay Mahadevan else if(locnpts+ghnpts != (int) ownedvtx.size()) 424e5136372SVijay Mahadevan SETERRQ2(PETSC_COMM_WORLD,PETSC_ERR_ARG_OUTOFRANGE,"Created the wrong number of vertices! (%D!=%D)",locnpts+ghnpts,ownedvtx.size()); 42551d15aeeSVijay Mahadevan else 426e427d9c9SVijay Mahadevan PetscInfo2(NULL, "Created %D elements and %D vertices.\n", ownedelms.size(), ownedvtx.size()); 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, ®ionset, 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 { 498f90c3b0eSVijay Mahadevan char ropts[PETSC_MAX_PATH_LEN]; 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; 50461eb6e27SVijay Mahadevan ierr = PetscMemzero(&ropts,PETSC_MAX_PATH_LEN);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) { 51061eb6e27SVijay Mahadevan ierr = PetscSNPrintf(ropts_par, sizeof(ropts_par), "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) { 51561eb6e27SVijay Mahadevan ierr = PetscSNPrintf(ropts_dbg, sizeof(ropts_dbg), "%sCPUTIME;DEBUG_IO=%d;DEBUG_PIO=%d;",dbglevel,dbglevel);CHKERRQ(ierr); 51661eb6e27SVijay Mahadevan } 51761eb6e27SVijay Mahadevan else { 51861eb6e27SVijay Mahadevan ierr = PetscSNPrintf(ropts_dbg, sizeof(ropts_dbg), "%sCPUTIME;DEBUG_IO=%d;",dbglevel);CHKERRQ(ierr); 519f90c3b0eSVijay Mahadevan } 520c8d5365dSVijay Mahadevan } 52151d15aeeSVijay Mahadevan 52261eb6e27SVijay Mahadevan ierr = PetscSNPrintf(ropts, sizeof(ropts), "%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()); 60651d15aeeSVijay Mahadevan PetscFunctionReturn(0); 60751d15aeeSVijay Mahadevan } 60851d15aeeSVijay Mahadevan 609