Panzer  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Panzer_STK_SquareQuadMeshFactory.cpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Panzer: A partial differential equation assembly
4 // engine for strongly coupled complex multiphysics systems
5 //
6 // Copyright 2011 NTESS and the Panzer contributors.
7 // SPDX-License-Identifier: BSD-3-Clause
8 // *****************************************************************************
9 // @HEADER
10 
12 #include <Teuchos_TimeMonitor.hpp>
13 #include <PanzerAdaptersSTK_config.hpp>
14 #include "Teuchos_StandardParameterEntryValidators.hpp" // for plist validation
15 
16 // #define ENABLE_UNIFORM
17 
18 using Teuchos::RCP;
19 using Teuchos::rcp;
20 
21 namespace panzer_stk {
22 
24 {
26 }
27 
30 {
31 }
32 
34 Teuchos::RCP<STK_Interface> SquareQuadMeshFactory::buildMesh(stk::ParallelMachine parallelMach) const
35 {
36  PANZER_FUNC_TIME_MONITOR("panzer::SquareQuadMeshFactory::buildMesh()");
37 
38  // build all meta data
39  RCP<STK_Interface> mesh = buildUncommitedMesh(parallelMach);
40 
41  // commit meta data
42  mesh->initialize(parallelMach);
43 
44  // build bulk data
45  completeMeshConstruction(*mesh,parallelMach);
46 
47  return mesh;
48 }
49 
51 {
52  PANZER_FUNC_TIME_MONITOR("panzer::SquareQuadMeshFactory::buildUncomittedMesh()");
53 
54  RCP<STK_Interface> mesh = rcp(new STK_Interface(2));
55 
56  machRank_ = stk::parallel_machine_rank(parallelMach);
57  machSize_ = stk::parallel_machine_size(parallelMach);
58 
59  if (xProcs_ == -1 && yProcs_ == -1) {
60  // copied from galeri
61  xProcs_ = yProcs_ = Teuchos::as<int>(pow(Teuchos::as<double>(machSize_), 0.5));
62 
63  if (xProcs_ * yProcs_ != Teuchos::as<int>(machSize_)) {
64  // Simple method to find a set of processor assignments
65  xProcs_ = yProcs_ = 1;
66 
67  // This means that this works correctly up to about maxFactor^2
68  // processors.
69  const int maxFactor = 100;
70 
71  int ProcTemp = machSize_;
72  int factors[maxFactor];
73  for (int jj = 0; jj < maxFactor; jj++) factors[jj] = 0;
74  for (int jj = 2; jj < maxFactor; jj++) {
75  bool flag = true;
76  while (flag) {
77  int temp = ProcTemp/jj;
78  if (temp*jj == ProcTemp) {
79  factors[jj]++;
80  ProcTemp = temp;
81 
82  } else {
83  flag = false;
84  }
85  }
86  }
87  xProcs_ = ProcTemp;
88  for (int jj = maxFactor-1; jj > 0; jj--) {
89  while (factors[jj] != 0) {
90  if (xProcs_ <= yProcs_) xProcs_ = xProcs_*jj;
91  else yProcs_ = yProcs_*jj;
92  factors[jj]--;
93  }
94  }
95  }
96 
97  } else if(xProcs_==-1) {
98  // default x only decomposition
100  yProcs_ = 1;
101  }
102  TEUCHOS_TEST_FOR_EXCEPTION(int(machSize_) != xProcs_ * yProcs_, std::logic_error,
103  "Cannot build SquareQuadMeshFactory. The product of 'X Procs * Y Procs = " << xProcs_ << "*" << yProcs_ << " = " << xProcs_*yProcs_
104  << "' must equal the number of processors = " << machSize_
105  << "\n\n\t==> Run the simulation with an appropriate number of processors, i.e. #procs = " << xProcs_*yProcs_ << ".\n");
107 
108  // build meta information: blocks and side set setups
109  buildMetaData(parallelMach,*mesh);
110 
111  mesh->addPeriodicBCs(periodicBCVec_);
112  mesh->setBoundingBoxSearchFlag(useBBoxSearch_);
113 
114  return mesh;
115 }
116 
117 void SquareQuadMeshFactory::completeMeshConstruction(STK_Interface & mesh,stk::ParallelMachine parallelMach) const
118 {
119  PANZER_FUNC_TIME_MONITOR("panzer::SquareQuadMeshFactory::completeMeshConstruction()");
120 
121  if(not mesh.isInitialized())
122  mesh.initialize(parallelMach);
123 
124  // add node and element information
125  buildElements(parallelMach,mesh);
126 
127  // finish up the edges
128 #ifndef ENABLE_UNIFORM
129  mesh.buildSubcells();
130 #endif
131  mesh.buildLocalElementIDs();
132  if(createEdgeBlocks_) {
133  mesh.buildLocalEdgeIDs();
134  }
135 
136  // now that edges are built, sidsets can be added
137 #ifndef ENABLE_UNIFORM
138  addSideSets(mesh);
139 #endif
140 
141  // add nodesets
142  addNodeSets(mesh);
143 
144  if(createEdgeBlocks_) {
145  addEdgeBlocks(mesh);
146  }
147 
148  // calls Stk_MeshFactory::rebalance
149  this->rebalance(mesh);
150 }
151 
154 {
156 
157  setMyParamList(paramList);
158 
159  x0_ = paramList->get<double>("X0");
160  y0_ = paramList->get<double>("Y0");
161 
162  xf_ = paramList->get<double>("Xf");
163  yf_ = paramList->get<double>("Yf");
164 
165  xBlocks_ = paramList->get<int>("X Blocks");
166  yBlocks_ = paramList->get<int>("Y Blocks");
167 
168  nXElems_ = paramList->get<int>("X Elements");
169  nYElems_ = paramList->get<int>("Y Elements");
170 
171  xProcs_ = paramList->get<int>("X Procs");
172  yProcs_ = paramList->get<int>("Y Procs");
173 
174  offsetGIDs_ = (paramList->get<std::string>("Offset mesh GIDs above 32-bit int limit") == "ON") ? true : false;
175 
176  createEdgeBlocks_ = paramList->get<bool>("Create Edge Blocks");
177 
178  // read in periodic boundary conditions
179  parsePeriodicBCList(Teuchos::rcpFromRef(paramList->sublist("Periodic BCs")),periodicBCVec_,useBBoxSearch_);
180 }
181 
184 {
185  static RCP<Teuchos::ParameterList> defaultParams;
186 
187  // fill with default values
188  if(defaultParams == Teuchos::null) {
189  defaultParams = rcp(new Teuchos::ParameterList);
190 
191  defaultParams->set<double>("X0",0.0);
192  defaultParams->set<double>("Y0",0.0);
193 
194  defaultParams->set<double>("Xf",1.0);
195  defaultParams->set<double>("Yf",1.0);
196 
197  defaultParams->set<int>("X Blocks",1);
198  defaultParams->set<int>("Y Blocks",1);
199 
200  defaultParams->set<int>("X Procs",-1);
201  defaultParams->set<int>("Y Procs",1);
202 
203  defaultParams->set<int>("X Elements",5);
204  defaultParams->set<int>("Y Elements",5);
205 
206  // default to false for backward compatibility
207  defaultParams->set<bool>("Create Edge Blocks",false,"Create edge blocks in the mesh");
208 
209  defaultParams->set<std::string>("Offset mesh GIDs above 32-bit int limit", "OFF",
210  "If 64-bit GIDs are supported, the mesh element and node global indices will start at a value greater than 32-bit limit.",
211  rcp(new Teuchos::StringValidator(Teuchos::tuple<std::string>("OFF", "ON"))));
212 
213  Teuchos::ParameterList & bcs = defaultParams->sublist("Periodic BCs");
214  bcs.set<int>("Count",0); // no default periodic boundary conditions
215  }
216 
217  return defaultParams;
218 }
219 
221 {
222  // get valid parameters
224 
225  // set that parameter list
226  setParameterList(validParams);
227 
228  /* This is a quad mesh factory so all elements in all element blocks
229  * will be quad4. This means that all the edges will be line2.
230  * The edge block name is hard coded to reflect this.
231  */
233 }
234 
235 void SquareQuadMeshFactory::buildMetaData(stk::ParallelMachine /* parallelMach */, STK_Interface & mesh) const
236 {
237  typedef shards::Quadrilateral<4> QuadTopo;
238  const CellTopologyData * ctd = shards::getCellTopologyData<QuadTopo>();
239  const CellTopologyData * side_ctd = shards::CellTopology(ctd).getBaseCellTopologyData(1,0);
240  const CellTopologyData * edge_ctd = shards::CellTopology(ctd).getBaseCellTopologyData(1,0);
241 
242  // build meta data
243  //mesh.setDimension(2);
244  for(int bx=0;bx<xBlocks_;bx++) {
245  for(int by=0;by<yBlocks_;by++) {
246 
247  // add this element block
248  {
249  std::stringstream ebPostfix;
250  ebPostfix << "-" << bx << "_" << by;
251 
252  // add element blocks
253  mesh.addElementBlock("eblock"+ebPostfix.str(),ctd);
254  if(createEdgeBlocks_) {
255  mesh.addEdgeBlock("eblock"+ebPostfix.str(),
257  edge_ctd);
258  }
259  }
260 
261  }
262  }
263 
264  // add sidesets
265 #ifndef ENABLE_UNIFORM
266  mesh.addSideset("left",side_ctd);
267  mesh.addSideset("right",side_ctd);
268  mesh.addSideset("top",side_ctd);
269  mesh.addSideset("bottom",side_ctd);
270 
271  for(int bx=1;bx<xBlocks_;bx++) {
272  std::stringstream ss;
273  ss << "vertical_" << bx-1;
274  mesh.addSideset(ss.str(),side_ctd);
275  }
276  for(int by=1;by<yBlocks_;by++) {
277  std::stringstream ss;
278  ss << "horizontal_" << by-1;
279  mesh.addSideset(ss.str(),side_ctd);
280  }
281 #endif
282 
283  // add nodesets
284  mesh.addNodeset("lower_left");
285  mesh.addNodeset("origin");
286 }
287 
288 void SquareQuadMeshFactory::buildElements(stk::ParallelMachine parallelMach,STK_Interface & mesh) const
289 {
290  mesh.beginModification();
291  // build each block
292  for(int xBlock=0;xBlock<xBlocks_;xBlock++) {
293  for(int yBlock=0;yBlock<yBlocks_;yBlock++) {
294  buildBlock(parallelMach,xBlock,yBlock,mesh);
295  }
296  }
297  mesh.endModification();
298 }
299 
300 void SquareQuadMeshFactory::buildBlock(stk::ParallelMachine /* parallelMach */,int xBlock,int yBlock,STK_Interface & mesh) const
301 {
302  // grab this processors rank and machine size
303  std::pair<int,int> sizeAndStartX = determineXElemSizeAndStart(xBlock,xProcs_,machRank_);
304  std::pair<int,int> sizeAndStartY = determineYElemSizeAndStart(yBlock,yProcs_,machRank_);
305 
306  int myXElems_start = sizeAndStartX.first;
307  int myXElems_end = myXElems_start+sizeAndStartX.second;
308  int myYElems_start = sizeAndStartY.first;
309  int myYElems_end = myYElems_start+sizeAndStartY.second;
310  int totalXElems = nXElems_*xBlocks_;
311  int totalYElems = nYElems_*yBlocks_;
312 
313  double deltaX = (xf_-x0_)/double(totalXElems);
314  double deltaY = (yf_-y0_)/double(totalYElems);
315 
316  std::vector<double> coord(2,0.0);
317 
318  offset_ = 0;
319  if (offsetGIDs_) {
320  if (std::numeric_limits<panzer::GlobalOrdinal>::max() > std::numeric_limits<unsigned int>::max())
321  offset_ = panzer::GlobalOrdinal(std::numeric_limits<unsigned int>::max()) + 1;
322  }
323 
324  // build the nodes
325  for(int nx=myXElems_start;nx<myXElems_end+1;++nx) {
326  coord[0] = this->getMeshCoord(nx, deltaX, x0_);
327  for(int ny=myYElems_start;ny<myYElems_end+1;++ny) {
328  coord[1] = this->getMeshCoord(ny, deltaY, y0_);
329 
330  mesh.addNode(ny*(totalXElems+1)+nx+1+offset_,coord);
331  }
332  }
333 
334  std::stringstream blockName;
335  blockName << "eblock-" << xBlock << "_" << yBlock;
336  stk::mesh::Part * block = mesh.getElementBlockPart(blockName.str());
337 
338  // build the elements
339  for(int nx=myXElems_start;nx<myXElems_end;++nx) {
340  for(int ny=myYElems_start;ny<myYElems_end;++ny) {
341  stk::mesh::EntityId gid = totalXElems*ny+nx+1 + offset_;
342  std::vector<stk::mesh::EntityId> nodes(4);
343  nodes[0] = nx+1+ny*(totalXElems+1);
344  nodes[1] = nodes[0]+1;
345  nodes[2] = nodes[1]+(totalXElems+1);
346  nodes[3] = nodes[2]-1;
347 
348  for (int i=0; i < 4; ++i)
349  nodes[i] += offset_;
350 
351  RCP<ElementDescriptor> ed = rcp(new ElementDescriptor(gid,nodes));
352  mesh.addElement(ed,block);
353  }
354  }
355 }
356 
357 std::pair<int,int> SquareQuadMeshFactory::determineXElemSizeAndStart(int xBlock,unsigned int size,unsigned int /* rank */) const
358 {
359  std::size_t xProcLoc = procTuple_[0];
360  unsigned int minElements = nXElems_/size;
361  unsigned int extra = nXElems_ - minElements*size;
362 
363  TEUCHOS_ASSERT(minElements>0);
364 
365  // first "extra" elements get an extra column of elements
366  // this determines the starting X index and number of elements
367  int nume=0, start=0;
368  if(xProcLoc<extra) {
369  nume = minElements+1;
370  start = xProcLoc*(minElements+1);
371  }
372  else {
373  nume = minElements;
374  start = extra*(minElements+1)+(xProcLoc-extra)*minElements;
375  }
376 
377  return std::make_pair(start+nXElems_*xBlock,nume);
378 }
379 
380 std::pair<int,int> SquareQuadMeshFactory::determineYElemSizeAndStart(int yBlock,unsigned int size,unsigned int /* rank */) const
381 {
382  std::size_t yProcLoc = procTuple_[1];
383  unsigned int minElements = nYElems_/size;
384  unsigned int extra = nYElems_ - minElements*size;
385 
386  TEUCHOS_ASSERT(minElements>0);
387 
388  // first "extra" elements get an extra column of elements
389  // this determines the starting X index and number of elements
390  int nume=0, start=0;
391  if(yProcLoc<extra) {
392  nume = minElements+1;
393  start = yProcLoc*(minElements+1);
394  }
395  else {
396  nume = minElements;
397  start = extra*(minElements+1)+(yProcLoc-extra)*minElements;
398  }
399 
400  return std::make_pair(start+nYElems_*yBlock,nume);
401 }
402 
404 {
405  mesh.beginModification();
406 
407  std::size_t totalXElems = nXElems_*xBlocks_;
408  std::size_t totalYElems = nYElems_*yBlocks_;
409 
410  // get all part vectors
411  stk::mesh::Part * left = mesh.getSideset("left");
412  stk::mesh::Part * right = mesh.getSideset("right");
413  stk::mesh::Part * top = mesh.getSideset("top");
414  stk::mesh::Part * bottom = mesh.getSideset("bottom");
415 
416  std::vector<stk::mesh::Part*> vertical;
417  std::vector<stk::mesh::Part*> horizontal;
418  for(int bx=1;bx<xBlocks_;bx++) {
419  std::stringstream ss;
420  ss << "vertical_" << bx-1;
421  vertical.push_back(mesh.getSideset(ss.str()));
422  }
423  for(int by=1;by<yBlocks_;by++) {
424  std::stringstream ss;
425  ss << "horizontal_" << by-1;
426  horizontal.push_back(mesh.getSideset(ss.str()));
427  }
428 
429  std::vector<stk::mesh::Entity> localElmts;
430  mesh.getMyElements(localElmts);
431 
432  // loop over elements adding edges to sidesets
433  std::vector<stk::mesh::Entity>::const_iterator itr;
434  for(itr=localElmts.begin();itr!=localElmts.end();++itr) {
435  stk::mesh::Entity element = (*itr);
436  stk::mesh::EntityId gid = mesh.elementGlobalId(element);
437 
438  // reverse the offset for local gid numbering scheme
439  gid -= offset_;
440 
441  std::size_t nx,ny;
442  ny = (gid-1) / totalXElems;
443  nx = gid-ny*totalXElems-1;
444 
445  // vertical boundaries
447 
448  if(nx+1==totalXElems) {
449  stk::mesh::Entity edge = mesh.findConnectivityById(element, stk::topology::EDGE_RANK, 1);
450 
451  // on the right
452  if(mesh.entityOwnerRank(edge)==machRank_)
453  mesh.addEntityToSideset(edge,right);
454  }
455 
456  if(nx==0) {
457  stk::mesh::Entity edge = mesh.findConnectivityById(element, stk::topology::EDGE_RANK, 3);
458 
459  // on the left
460  if(mesh.entityOwnerRank(edge)==machRank_)
461  mesh.addEntityToSideset(edge,left);
462  }
463 
464  if(nx+1!=totalXElems && ((nx+1) % nXElems_==0)) {
465  stk::mesh::Entity edge = mesh.findConnectivityById(element, stk::topology::EDGE_RANK, 1);
466 
467  // on the right
468  if(mesh.entityOwnerRank(edge)==machRank_) {
469  int index = (nx+1)/nXElems_-1;
470  mesh.addEntityToSideset(edge,vertical[index]);
471  }
472  }
473 
474  if(nx!=0 && (nx % nXElems_==0)) {
475  stk::mesh::Entity edge = mesh.findConnectivityById(element, stk::topology::EDGE_RANK, 3);
476 
477  // on the left
478  if(mesh.entityOwnerRank(edge)==machRank_) {
479  int index = nx/nXElems_-1;
480  mesh.addEntityToSideset(edge,vertical[index]);
481  }
482  }
483 
484  // horizontal boundaries
486 
487  if(ny==0) {
488  stk::mesh::Entity edge = mesh.findConnectivityById(element, stk::topology::EDGE_RANK, 0);
489 
490  // on the bottom
491  if(mesh.entityOwnerRank(edge)==machRank_)
492  mesh.addEntityToSideset(edge,bottom);
493  }
494 
495  if(ny+1==totalYElems) {
496  stk::mesh::Entity edge = mesh.findConnectivityById(element, stk::topology::EDGE_RANK, 2);
497 
498  // on the top
499  if(mesh.entityOwnerRank(edge)==machRank_)
500  mesh.addEntityToSideset(edge,top);
501  }
502 
503  if(ny!=0 && (ny % nYElems_==0)) {
504  stk::mesh::Entity edge = mesh.findConnectivityById(element, stk::topology::EDGE_RANK, 0);
505 
506  // on the bottom
507  if(mesh.entityOwnerRank(edge)==machRank_) {
508  int index = ny/nYElems_-1;
509  mesh.addEntityToSideset(edge,horizontal[index]);
510  }
511  }
512 
513  if(ny+1!=totalYElems && ((ny+1) % nYElems_==0)) {
514  stk::mesh::Entity edge = mesh.findConnectivityById(element, stk::topology::EDGE_RANK, 2);
515 
516  // on the top
517  if(mesh.entityOwnerRank(edge)==machRank_) {
518  int index = (ny+1)/nYElems_-1;
519  mesh.addEntityToSideset(edge,horizontal[index]);
520  }
521  }
522  }
523 
524  mesh.endModification();
525 }
526 
528 {
529  mesh.beginModification();
530 
531  // get all part vectors
532  stk::mesh::Part * lower_left = mesh.getNodeset("lower_left");
533  stk::mesh::Part * origin = mesh.getNodeset("origin");
534 
535  // std::vector<stk::mesh::Entity> localElmts;
536  // mesh.getMyElements(localElmts);
537 
539  if(machRank_==0)
540  {
541  // add zero node to lower_left node set
542  stk::mesh::Entity node = bulkData->get_entity(mesh.getNodeRank(),1 + offset_);
543  mesh.addEntityToNodeset(node,lower_left);
544 
545  // add zero node to origin node set
546  mesh.addEntityToNodeset(node,origin);
547  }
548 
549  mesh.endModification();
550 }
551 
553 {
554  mesh.beginModification();
555 
558 
559  stk::mesh::Part * edge_block = mesh.getEdgeBlock(edgeBlockName_);
560 
561  stk::mesh::Selector owned_block = metaData->locally_owned_part();
562 
563  std::vector<stk::mesh::Entity> edges;
564  bulkData->get_entities(mesh.getEdgeRank(), owned_block, edges);
565  mesh.addEntitiesToEdgeBlock(edges, edge_block);
566 
567  mesh.endModification();
568 }
569 
572 {
573  std::size_t i=0,j=0;
574 
575  j = procRank/xProcs_;
576  procRank = procRank % xProcs_;
577  i = procRank;
578 
579  return Teuchos::tuple(i,j);
580 }
581 
582 } // end panzer_stk
void addNodeset(const std::string &name)
unsigned entityOwnerRank(stk::mesh::Entity entity) const
virtual Teuchos::RCP< STK_Interface > buildUncommitedMesh(stk::ParallelMachine parallelMach) const
void addEntityToNodeset(stk::mesh::Entity entity, stk::mesh::Part *nodeset)
static void parsePeriodicBCList(const Teuchos::RCP< Teuchos::ParameterList > &pl, std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > &periodicBC, bool &useBBoxSearch)
T & get(const std::string &name, T def_value)
stk::mesh::Part * getElementBlockPart(const std::string &name) const
get the block part
std::pair< int, int > determineXElemSizeAndStart(int xBlock, unsigned int size, unsigned int rank) const
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void addEntityToSideset(stk::mesh::Entity entity, stk::mesh::Part *sideset)
void buildElements(stk::ParallelMachine parallelMach, STK_Interface &mesh) const
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
stk::mesh::Part * getNodeset(const std::string &name) const
void addEdgeBlock(const std::string &elemBlockName, const std::string &edgeBlockName, const stk::topology &topology)
stk::mesh::Part * getSideset(const std::string &name) const
bool offsetGIDs_
If true, offset mesh GIDs to exercise 32-bit limits.
std::pair< int, int > determineYElemSizeAndStart(int yBlock, unsigned int size, unsigned int rank) const
void addElement(const Teuchos::RCP< ElementDescriptor > &ed, stk::mesh::Part *block)
Teuchos::RCP< STK_Interface > buildMesh(stk::ParallelMachine parallelMach) const
Build the mesh object.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
void initialize(stk::ParallelMachine parallelMach, bool setupIO=true, const bool buildRefinementSupport=false)
SquareQuadMeshFactory(bool enableRebalance=false)
Constructor.
void rebalance(STK_Interface &mesh) const
Teuchos::RCP< stk::mesh::BulkData > getBulkData() const
stk::mesh::EntityId elementGlobalId(std::size_t lid) const
void setMyParamList(const RCP< ParameterList > &paramList)
void validateParametersAndSetDefaults(ParameterList const &validParamList, int const depth=1000)
static const std::string edgeBlockString
void buildBlock(stk::ParallelMachine machRank, int xBlock, int yBlock, STK_Interface &mesh) const
Teuchos::Tuple< std::size_t, 2 > procRankToProcTuple(std::size_t procRank) const
what is the 2D tuple describe this processor distribution
void addNode(stk::mesh::EntityId gid, const std::vector< double > &coord)
void addEntitiesToEdgeBlock(std::vector< stk::mesh::Entity > entities, stk::mesh::Part *edgeblock)
void buildSubcells()
force the mesh to build subcells: edges and faces
Teuchos::RCP< stk::mesh::MetaData > getMetaData() const
bool isInitialized() const
Has initialize been called on this mesh object?
stk::mesh::Entity findConnectivityById(stk::mesh::Entity src, stk::mesh::EntityRank tgt_rank, unsigned rel_id) const
void addSideset(const std::string &name, const CellTopologyData *ctData)
double getMeshCoord(const int nx, const double deltaX, const double x0) const
stk::mesh::Part * getEdgeBlock(const std::string &name) const
get the block part
void buildMetaData(stk::ParallelMachine parallelMach, STK_Interface &mesh) const
std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > periodicBCVec_
stk::mesh::EntityRank getEdgeRank() const
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &paramList)
From ParameterListAcceptor.
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
void getMyElements(std::vector< stk::mesh::Entity > &elements) const
#define TEUCHOS_ASSERT(assertion_test)
stk::mesh::EntityRank getNodeRank() const
virtual void completeMeshConstruction(STK_Interface &mesh, stk::ParallelMachine parallelMach) const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
From ParameterListAcceptor.
void addElementBlock(const std::string &name, const CellTopologyData *ctData)