void LineMeshFactory::buildBlock(stk::ParallelMachine parallelMach,int xBlock,STK_Interface & mesh) const { // grab this processors rank and machine size std::pair<int,int> sizeAndStartX = determineXElemSizeAndStart(xBlock,machSize_,machRank_); int myXElems_start = sizeAndStartX.first; int myXElems_end = myXElems_start+sizeAndStartX.second; int totalXElems = nXElems_*xBlocks_; double deltaX = (xf_-x0_)/double(totalXElems); // build the nodes std::vector<double> coord(1,0.0); for(int nx=myXElems_start;nx<myXElems_end+1;++nx) { coord[0] = double(nx)*deltaX+x0_; mesh.addNode(nx+1,coord); } std::stringstream blockName; blockName << "eblock-" << xBlock; stk::mesh::Part * block = mesh.getElementBlockPart(blockName.str()); // build the elements for(int nx=myXElems_start;nx<myXElems_end;++nx) { stk::mesh::EntityId gid = nx+1; std::vector<stk::mesh::EntityId> nodes(2); nodes[0] = nx+1; nodes[1] = nodes[0]+1; RCP<ElementDescriptor> ed = rcp(new ElementDescriptor(gid,nodes)); mesh.addElement(ed,block); } }
void SquareQuadMeshFactory::buildBlock(stk::ParallelMachine parallelMach,int xBlock,int yBlock,STK_Interface & mesh) const { // grab this processors rank and machine size std::pair<int,int> sizeAndStartX = determineXElemSizeAndStart(xBlock,xProcs_,machRank_); std::pair<int,int> sizeAndStartY = determineYElemSizeAndStart(yBlock,yProcs_,machRank_); int myXElems_start = sizeAndStartX.first; int myXElems_end = myXElems_start+sizeAndStartX.second; int myYElems_start = sizeAndStartY.first; int myYElems_end = myYElems_start+sizeAndStartY.second; int totalXElems = nXElems_*xBlocks_; int totalYElems = nYElems_*yBlocks_; double deltaX = (xf_-x0_)/double(totalXElems); double deltaY = (yf_-y0_)/double(totalYElems); std::vector<double> coord(2,0.0); // build the nodes for(int nx=myXElems_start;nx<myXElems_end+1;++nx) { coord[0] = double(nx)*deltaX+x0_; for(int ny=myYElems_start;ny<myYElems_end+1;++ny) { coord[1] = double(ny)*deltaY+y0_; mesh.addNode(ny*(totalXElems+1)+nx+1,coord); } } std::stringstream blockName; blockName << "eblock-" << xBlock << "_" << yBlock; stk::mesh::Part * block = mesh.getElementBlockPart(blockName.str()); // build the elements for(int nx=myXElems_start;nx<myXElems_end;++nx) { for(int ny=myYElems_start;ny<myYElems_end;++ny) { stk::mesh::EntityId gid = totalXElems*ny+nx+1; std::vector<stk::mesh::EntityId> nodes(4); nodes[0] = nx+1+ny*(totalXElems+1); nodes[1] = nodes[0]+1; nodes[2] = nodes[1]+(totalXElems+1); nodes[3] = nodes[2]-1; RCP<ElementDescriptor> ed = rcp(new ElementDescriptor(gid,nodes)); mesh.addElement(ed,block); } } }
void CubeTetMeshFactory::buildBlock(stk_classic::ParallelMachine parallelMach,int xBlock,int yBlock,int zBlock,STK_Interface & mesh) const { // grab this processors rank and machine size std::pair<int,int> sizeAndStartX = determineXElemSizeAndStart(xBlock,xProcs_,machRank_); std::pair<int,int> sizeAndStartY = determineYElemSizeAndStart(yBlock,yProcs_,machRank_); std::pair<int,int> sizeAndStartZ = determineZElemSizeAndStart(zBlock,zProcs_,machRank_); int myXElems_start = sizeAndStartX.first; int myXElems_end = myXElems_start+sizeAndStartX.second; int myYElems_start = sizeAndStartY.first; int myYElems_end = myYElems_start+sizeAndStartY.second; int myZElems_start = sizeAndStartZ.first; int myZElems_end = myZElems_start+sizeAndStartZ.second; int totalXElems = nXElems_*xBlocks_; int totalYElems = nYElems_*yBlocks_; int totalZElems = nZElems_*zBlocks_; double deltaX = (xf_-x0_)/double(totalXElems); double deltaY = (yf_-y0_)/double(totalYElems); double deltaZ = (zf_-z0_)/double(totalZElems); std::vector<double> coord(3,0.0); // build the nodes for(int nx=myXElems_start;nx<myXElems_end+1;++nx) { coord[0] = double(nx)*deltaX+x0_; for(int ny=myYElems_start;ny<myYElems_end+1;++ny) { coord[1] = double(ny)*deltaY+y0_; for(int nz=myZElems_start;nz<myZElems_end+1;++nz) { coord[2] = double(nz)*deltaZ+z0_; mesh.addNode(nz*(totalYElems+1)*(totalXElems+1)+ny*(totalXElems+1)+nx+1,coord); } } } std::stringstream blockName; blockName << "eblock-" << xBlock << "_" << yBlock << "_" << zBlock; stk_classic::mesh::Part * block = mesh.getElementBlockPart(blockName.str()); // build the elements for(int nx=myXElems_start;nx<myXElems_end;++nx) { for(int ny=myYElems_start;ny<myYElems_end;++ny) { for(int nz=myZElems_start;nz<myZElems_end;++nz) { std::vector<stk_classic::mesh::EntityId> nodes(8); nodes[0] = nx+1+ny*(totalXElems+1) +nz*(totalYElems+1)*(totalXElems+1); nodes[1] = nodes[0]+1; nodes[2] = nodes[1]+(totalXElems+1); nodes[3] = nodes[2]-1; nodes[4] = nodes[0]+(totalYElems+1)*(totalXElems+1); nodes[5] = nodes[1]+(totalYElems+1)*(totalXElems+1); nodes[6] = nodes[2]+(totalYElems+1)*(totalXElems+1); nodes[7] = nodes[3]+(totalYElems+1)*(totalXElems+1); buildTetsOnHex(Teuchos::tuple(totalXElems,totalYElems,totalZElems), Teuchos::tuple(nx,ny,nz), block,nodes,mesh); } } } }