void SquareQuadMeshFactory::addSideSets(STK_Interface & mesh) const { mesh.beginModification(); std::size_t totalXElems = nXElems_*xBlocks_; std::size_t totalYElems = nYElems_*yBlocks_; // get all part vectors stk::mesh::Part * left = mesh.getSideset("left"); stk::mesh::Part * right = mesh.getSideset("right"); stk::mesh::Part * top = mesh.getSideset("top"); stk::mesh::Part * bottom = mesh.getSideset("bottom"); std::vector<stk::mesh::Entity*> localElmts; mesh.getMyElements(localElmts); // loop over elements adding edges to sidesets std::vector<stk::mesh::Entity*>::const_iterator itr; for(itr=localElmts.begin();itr!=localElmts.end();++itr) { stk::mesh::Entity * element = (*itr); stk::mesh::EntityId gid = element->identifier(); stk::mesh::PairIterRelation relations = element->relations(mesh.getEdgeRank()); std::size_t nx,ny; ny = (gid-1) / totalXElems; nx = gid-ny*totalXElems-1; // vertical boundaries /////////////////////////////////////////// if(nx+1==totalXElems) { stk::mesh::Entity * edge = getRelationByID(1,relations)->entity(); // on the right if(edge->owner_rank()==machRank_) mesh.addEntityToSideset(*edge,right); } if(nx==0) { stk::mesh::Entity * edge = getRelationByID(3,relations)->entity(); // on the left if(edge->owner_rank()==machRank_) mesh.addEntityToSideset(*edge,left); } // horizontal boundaries /////////////////////////////////////////// if(ny==0) { stk::mesh::Entity * edge = getRelationByID(0,relations)->entity(); // on the bottom if(edge->owner_rank()==machRank_) mesh.addEntityToSideset(*edge,bottom); } if(ny+1==totalYElems) { stk::mesh::Entity * edge = getRelationByID(2,relations)->entity(); // on the top if(edge->owner_rank()==machRank_) mesh.addEntityToSideset(*edge,top); } } mesh.endModification(); }
std::pair<Teuchos::RCP<std::vector<std::size_t> >, Teuchos::RCP<std::vector<Teuchos::Tuple<double,3> > > > getLocalSideIdsAndCoords(const STK_Interface & mesh, const std::string & sideName, const std::string type_) { unsigned physicalDim = mesh.getDimension(); Teuchos::RCP<stk::mesh::MetaData> metaData = mesh.getMetaData(); Teuchos::RCP<stk::mesh::BulkData> bulkData = mesh.getBulkData(); // grab nodes owned by requested side ///////////////////////////////////////////// std::stringstream ss; ss << "Can't find part=\"" << sideName << "\"" << std::endl; stk::mesh::Part * side = metaData->get_part(sideName,ss.str().c_str()); stk::mesh::Selector mySides = (*side) & metaData->locally_owned_part(); stk::mesh::EntityRank rank; const STK_Interface::VectorFieldType * field = 0; unsigned int offset = 0; if(type_ == "coord"){ rank = mesh.getNodeRank(); field = & mesh.getCoordinatesField(); } else if(type_ == "edge"){ rank = mesh.getEdgeRank(); field = & mesh.getEdgesField(); offset = mesh.getMaxEntityId(mesh.getNodeRank()); } else if(type_ == "face"){ rank = mesh.getFaceRank(); field = & mesh.getFacesField(); offset = mesh.getMaxEntityId(mesh.getNodeRank())+mesh.getMaxEntityId(mesh.getEdgeRank()); } else { ss << "Can't do BCs of type " << type_ << std::endl; TEUCHOS_TEST_FOR_EXCEPTION(true,std::runtime_error, ss.str()) } std::vector<stk::mesh::Bucket*> const& nodeBuckets = bulkData->get_buckets(rank, mySides); // build id vector //////////////////////////////////////////// std::size_t nodeCount = 0; for(std::size_t b=0;b<nodeBuckets.size();b++) nodeCount += nodeBuckets[b]->size(); Teuchos::RCP<std::vector<std::size_t> > sideIds = Teuchos::rcp(new std::vector<std::size_t>(nodeCount)); Teuchos::RCP<std::vector<Teuchos::Tuple<double,3> > > sideCoords = Teuchos::rcp(new std::vector<Teuchos::Tuple<double,3> >(nodeCount)); // loop over node buckets for(std::size_t b=0,index=0;b<nodeBuckets.size();b++) { stk::mesh::Bucket & bucket = *nodeBuckets[b]; double const* array = stk::mesh::field_data(*field, bucket); for(std::size_t n=0;n<bucket.size();n++,index++) { (*sideIds)[index] = bulkData->identifier(bucket[n]) + offset; Teuchos::Tuple<double,3> & coord = (*sideCoords)[index]; // copy coordinates into multi vector for(std::size_t d=0;d<physicalDim;d++) coord[d] = array[physicalDim*n + d]; } } return std::make_pair(sideIds,sideCoords); }