44 #include <Teuchos_TimeMonitor.hpp> 45 #include <PanzerAdaptersSTK_config.hpp> 65 PANZER_FUNC_TIME_MONITOR(
"panzer::CubeHexMeshFactory::buildMesh()");
71 mesh->initialize(parallelMach);
81 PANZER_FUNC_TIME_MONITOR(
"panzer::CubeHexMeshFactory::buildUncomittedMesh()");
85 machRank_ = stk::parallel_machine_rank(parallelMach);
86 machSize_ = stk::parallel_machine_size(parallelMach);
95 "Cannot build CubeHexMeshFactory, the product of \"X Procs\", \"Y Procs\", and \"Z Procs\"" 96 " must equal the number of processors.");
109 PANZER_FUNC_TIME_MONITOR(
"panzer::CubeHexMeshFactory::completeMeshConstruction()");
117 Teuchos::FancyOStream out(Teuchos::rcpFromRef(std::cout));
118 out.setOutputToRootOnly(0);
119 out.setShowProcRank(
true);
125 out <<
"CubeHexMesh: Building sub cells" << std::endl;
130 out <<
"CubeHexMesh: NOT building sub cells" << std::endl;
148 setMyParamList(paramList);
150 x0_ = paramList->get<
double>(
"X0");
151 y0_ = paramList->get<
double>(
"Y0");
152 z0_ = paramList->get<
double>(
"Z0");
154 xf_ = paramList->get<
double>(
"Xf");
155 yf_ = paramList->get<
double>(
"Yf");
156 zf_ = paramList->get<
double>(
"Zf");
158 xBlocks_ = paramList->get<
int>(
"X Blocks");
159 yBlocks_ = paramList->get<
int>(
"Y Blocks");
160 zBlocks_ = paramList->get<
int>(
"Z Blocks");
162 xProcs_ = paramList->get<
int>(
"X Procs");
163 yProcs_ = paramList->get<
int>(
"Y Procs");
164 zProcs_ = paramList->get<
int>(
"Z Procs");
166 nXElems_ = paramList->get<
int>(
"X Elements");
167 nYElems_ = paramList->get<
int>(
"Y Elements");
168 nZElems_ = paramList->get<
int>(
"Z Elements");
181 static RCP<Teuchos::ParameterList> defaultParams;
184 if(defaultParams == Teuchos::null) {
185 defaultParams = rcp(
new Teuchos::ParameterList);
187 defaultParams->set<
double>(
"X0",0.0);
188 defaultParams->set<
double>(
"Y0",0.0);
189 defaultParams->set<
double>(
"Z0",0.0);
191 defaultParams->set<
double>(
"Xf",1.0);
192 defaultParams->set<
double>(
"Yf",1.0);
193 defaultParams->set<
double>(
"Zf",1.0);
195 defaultParams->set<
int>(
"X Blocks",1);
196 defaultParams->set<
int>(
"Y Blocks",1);
197 defaultParams->set<
int>(
"Z Blocks",1);
199 defaultParams->set<
int>(
"X Procs",-1);
200 defaultParams->set<
int>(
"Y Procs",1);
201 defaultParams->set<
int>(
"Z Procs",1);
203 defaultParams->set<
int>(
"X Elements",5);
204 defaultParams->set<
int>(
"Y Elements",5);
205 defaultParams->set<
int>(
"Z Elements",5);
207 defaultParams->set<
bool>(
"Build Interface Sidesets",
false);
209 defaultParams->set<
bool>(
"Build Subcells",
true);
211 Teuchos::ParameterList & bcs = defaultParams->sublist(
"Periodic BCs");
212 bcs.set<
int>(
"Count",0);
215 return defaultParams;
221 RCP<Teuchos::ParameterList> validParams = rcp(
new Teuchos::ParameterList(*
getValidParameters()));
229 typedef shards::Hexahedron<8> HexTopo;
230 const CellTopologyData * ctd = shards::getCellTopologyData<HexTopo>();
231 const CellTopologyData * side_ctd = shards::CellTopology(ctd).getBaseCellTopologyData(2,0);
239 std::stringstream ebPostfix;
240 ebPostfix <<
"-" << bx <<
"_" << by <<
"_" << bz;
258 std::stringstream ss;
259 ss <<
"vertical_" << bx-1;
263 std::stringstream ss;
264 ss <<
"horizontal_" << by-1;
268 std::stringstream ss;
269 ss <<
"transverse_" << bz-1;
282 for(
int xBlock=0;xBlock<
xBlocks_;xBlock++) {
283 for(
int yBlock=0;yBlock<
yBlocks_;yBlock++) {
284 for(
int zBlock=0;zBlock<
zBlocks_;zBlock++) {
285 buildBlock(parallelMach,xBlock,yBlock,zBlock,mesh);
299 panzer::Ordinal64 myXElems_start = sizeAndStartX.first;
300 panzer::Ordinal64 myXElems_end = myXElems_start+sizeAndStartX.second;
301 panzer::Ordinal64 myYElems_start = sizeAndStartY.first;
302 panzer::Ordinal64 myYElems_end = myYElems_start+sizeAndStartY.second;
303 panzer::Ordinal64 myZElems_start = sizeAndStartZ.first;
304 panzer::Ordinal64 myZElems_end = myZElems_start+sizeAndStartZ.second;
310 double deltaX = (
xf_-
x0_)/
double(totalXElems);
311 double deltaY = (
yf_-
y0_)/
double(totalYElems);
312 double deltaZ = (
zf_-
z0_)/
double(totalZElems);
314 std::vector<double> coord(3,0.0);
317 for(panzer::Ordinal64 nx=myXElems_start;nx<myXElems_end+1;++nx) {
318 coord[0] = double(nx)*deltaX+
x0_;
319 for(panzer::Ordinal64 ny=myYElems_start;ny<myYElems_end+1;++ny) {
320 coord[1] = double(ny)*deltaY+
y0_;
321 for(panzer::Ordinal64 nz=myZElems_start;nz<myZElems_end+1;++nz) {
322 coord[2] = double(nz)*deltaZ+
z0_;
324 mesh.
addNode(nz*(totalYElems+1)*(totalXElems+1)+ny*(totalXElems+1)+nx+1,coord);
329 std::stringstream blockName;
330 blockName <<
"eblock-" << xBlock <<
"_" << yBlock <<
"_" << zBlock;
334 for(panzer::Ordinal64 nx=myXElems_start;nx<myXElems_end;++nx) {
335 for(panzer::Ordinal64 ny=myYElems_start;ny<myYElems_end;++ny) {
336 for(panzer::Ordinal64 nz=myZElems_start;nz<myZElems_end;++nz) {
337 stk::mesh::EntityId gid = totalXElems*totalYElems*nz+totalXElems*ny+nx+1;
338 std::vector<stk::mesh::EntityId> nodes(8);
339 nodes[0] = nx+1+ny*(totalXElems+1) +nz*(totalYElems+1)*(totalXElems+1);
340 nodes[1] = nodes[0]+1;
341 nodes[2] = nodes[1]+(totalXElems+1);
342 nodes[3] = nodes[2]-1;
343 nodes[4] = nodes[0]+(totalYElems+1)*(totalXElems+1);
344 nodes[5] = nodes[1]+(totalYElems+1)*(totalXElems+1);
345 nodes[6] = nodes[2]+(totalYElems+1)*(totalXElems+1);
346 nodes[7] = nodes[3]+(totalYElems+1)*(totalXElems+1);
358 panzer::Ordinal64 minElements =
nXElems_/size;
359 panzer::Ordinal64 extra =
nXElems_ - minElements*size;
361 TEUCHOS_ASSERT(minElements>0);
365 panzer::Ordinal64 nume=0, start=0;
366 if(panzer::Ordinal64(xProcLoc)<extra) {
367 nume = minElements+1;
368 start = xProcLoc*(minElements+1);
372 start = extra*(minElements+1)+(xProcLoc-extra)*minElements;
375 return std::make_pair(start+
nXElems_*xBlock,nume);
384 panzer::Ordinal64 minElements =
nYElems_/size;
385 panzer::Ordinal64 extra =
nYElems_ - minElements*size;
387 TEUCHOS_ASSERT(minElements>0);
391 panzer::Ordinal64 nume=0, start=0;
392 if(panzer::Ordinal64(yProcLoc)<extra) {
393 nume = minElements+1;
394 start = yProcLoc*(minElements+1);
398 start = extra*(minElements+1)+(yProcLoc-extra)*minElements;
401 return std::make_pair(start+
nYElems_*yBlock,nume);
409 panzer::Ordinal64 minElements =
nZElems_/size;
410 panzer::Ordinal64 extra =
nZElems_ - minElements*size;
412 TEUCHOS_ASSERT(minElements>0);
416 panzer::Ordinal64 nume=0, start=0;
417 if(zProcLoc<Teuchos::as<std::size_t>(extra)) {
418 nume = minElements+1;
419 start = zProcLoc*(minElements+1);
423 start = extra*(minElements+1)+(zProcLoc-extra)*minElements;
426 return std::make_pair(start+
nZElems_*zBlock,nume);
438 std::vector<stk::mesh::Entity> localElmts;
441 stk::mesh::EntityId
offset[6];
452 std::vector<stk::mesh::Entity>::const_iterator itr;
453 for(itr=localElmts.begin();itr!=localElmts.end();++itr) {
454 stk::mesh::Entity element = (*itr);
457 std::size_t nx,ny,nz;
458 nz = (gid-1) / (totalXElems*totalYElems);
459 gid = (gid-1)-nz*(totalXElems*totalYElems);
460 ny = gid / totalXElems;
461 nx = gid-ny*totalXElems;
463 std::vector<stk::mesh::Part*> parts;
467 stk::mesh::EntityId eid = (1+nx+ny*totalXElems)+
offset[4];
469 mesh.
getBulkData()->declare_relation(element,side,4);
471 if(nz+1==totalZElems) {
473 stk::mesh::EntityId eid = (1+nx+ny*totalXElems)+
offset[5];
475 mesh.
getBulkData()->declare_relation(element,side,5);
480 stk::mesh::EntityId eid = (1+nx+nz*totalXElems)+
offset[0];
482 mesh.
getBulkData()->declare_relation(element,side,0);
484 if(ny+1==totalYElems) {
486 stk::mesh::EntityId eid = (1+nx+nz*totalXElems)+
offset[2];
488 mesh.
getBulkData()->declare_relation(element,side,2);
493 stk::mesh::EntityId eid = (1+ny+nz*totalYElems)+
offset[3];
495 mesh.
getBulkData()->declare_relation(element,side,3);
497 if(nx+1==totalXElems) {
499 stk::mesh::EntityId eid = (1+ny+nz*totalYElems)+
offset[1];
501 mesh.
getBulkData()->declare_relation(element,side,1);
511 const stk::mesh::EntityRank side_rank = mesh.
getSideRank();
518 stk::mesh::Part * left = mesh.
getSideset(
"left");
519 stk::mesh::Part * right = mesh.
getSideset(
"right");
520 stk::mesh::Part * top = mesh.
getSideset(
"top");
521 stk::mesh::Part * bottom = mesh.
getSideset(
"bottom");
522 stk::mesh::Part * front = mesh.
getSideset(
"front");
523 stk::mesh::Part * back = mesh.
getSideset(
"back");
525 std::vector<stk::mesh::Part*> vertical;
526 std::vector<stk::mesh::Part*> horizontal;
527 std::vector<stk::mesh::Part*> transverse;
531 std::stringstream ss;
532 ss <<
"vertical_" << bx-1;
533 vertical.push_back(mesh.
getSideset(ss.str()));
536 std::stringstream ss;
537 ss <<
"horizontal_" << by-1;
538 horizontal.push_back(mesh.
getSideset(ss.str()));
541 std::stringstream ss;
542 ss <<
"transverse_" << bz-1;
543 transverse.push_back(mesh.
getSideset(ss.str()));
547 std::vector<stk::mesh::Entity> localElmts;
553 std::vector<stk::mesh::Entity>::const_iterator itr;
554 for(itr=localElmts.begin();itr!=localElmts.end();++itr) {
555 stk::mesh::Entity element = (*itr);
558 std::size_t nx,ny,nz;
559 nz = (gid-1) / (totalXElems*totalYElems);
560 gid = (gid-1)-nz*(totalXElems*totalYElems);
561 ny = gid / totalXElems;
562 nx = gid-ny*totalXElems;
584 if(nz+1==totalZElems) {
615 if(ny+1==totalYElems) {
646 if(nx+1==totalXElems) {
666 stk::mesh::Part * origin = mesh.
getNodeset(
"origin");
668 Teuchos::RCP<stk::mesh::BulkData> bulkData = mesh.
getBulkData();
672 stk::mesh::Entity node = bulkData->get_entity(mesh.
getNodeRank(),1);
682 std::size_t i=0,j=0,k=0;
688 return Teuchos::tuple(i,j,k);
stk::mesh::Part * getElementBlockPart(const std::string &name) const
get the block count
void initializeWithDefaults()
virtual ~CubeHexMeshFactory()
Destructor.
std::pair< panzer::Ordinal64, panzer::Ordinal64 > determineYElemSizeAndStart(int yBlock, unsigned int size, unsigned int rank) const
void addNodeset(const std::string &name)
void addSides(STK_Interface &mesh) const
void addEntityToNodeset(stk::mesh::Entity entity, stk::mesh::Part *nodeset)
virtual Teuchos::RCP< STK_Interface > buildUncommitedMesh(stk::ParallelMachine parallelMach) const
std::pair< panzer::Ordinal64, panzer::Ordinal64 > determineXElemSizeAndStart(int xBlock, unsigned int size, unsigned int rank) const
panzer::Ordinal64 nZElems_
void getMyElements(std::vector< stk::mesh::Entity > &elements) const
void addEntityToSideset(stk::mesh::Entity entity, stk::mesh::Part *sideset)
stk::mesh::EntityRank getNodeRank() const
Teuchos::RCP< stk::mesh::BulkData > getBulkData() const
void addSideSets(STK_Interface &mesh) const
virtual void completeMeshConstruction(STK_Interface &mesh, stk::ParallelMachine parallelMach) const
stk::mesh::EntityRank getSideRank() const
void initialize(stk::ParallelMachine parallelMach, bool setupIO=true)
panzer::Ordinal64 nXElems_
stk::mesh::Entity findConnectivityById(stk::mesh::Entity src, stk::mesh::EntityRank tgt_rank, unsigned rel_id) const
panzer::Ordinal64 nYElems_
stk::mesh::Part * getSideset(const std::string &name) const
void addElement(const Teuchos::RCP< ElementDescriptor > &ed, stk::mesh::Part *block)
stk::mesh::EntityId elementGlobalId(std::size_t lid) const
void buildMetaData(stk::ParallelMachine parallelMach, STK_Interface &mesh) const
Teuchos::RCP< STK_Interface > buildMesh(stk::ParallelMachine parallelMach) const
Build the mesh object.
bool isInitialized() const
Has initialize been called on this mesh object?
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > ¶mList)
From ParameterListAcceptor.
Teuchos::Tuple< std::size_t, 3 > procRankToProcTuple(std::size_t procRank) const
what is the 3D tuple describe this processor distribution
void addNode(stk::mesh::EntityId gid, const std::vector< double > &coord)
void buildSubcells()
force the mesh to build subcells: edges and faces
Teuchos::Tuple< std::size_t, 3 > procTuple_
CubeHexMeshFactory()
Constructor.
void buildElements(stk::ParallelMachine parallelMach, STK_Interface &mesh) const
void addNodeSets(STK_Interface &mesh) const
void addSideset(const std::string &name, const CellTopologyData *ctData)
std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > periodicBCVec_
bool buildInterfaceSidesets_
void buildLocalElementIDs()
unsigned entityOwnerRank(stk::mesh::Entity entity) const
std::pair< panzer::Ordinal64, panzer::Ordinal64 > determineZElemSizeAndStart(int zBlock, unsigned int size, unsigned int rank) const
void rebalance(STK_Interface &mesh) const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
From ParameterListAcceptor.
void addElementBlock(const std::string &name, const CellTopologyData *ctData)
stk::mesh::Part * getNodeset(const std::string &name) const
void buildBlock(stk::ParallelMachine machRank, int xBlock, int yBlock, int zBlock, STK_Interface &mesh) const
static void parsePeriodicBCList(const Teuchos::RCP< Teuchos::ParameterList > &pl, std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > &periodicBC)