Panzer Version of the Day
Loading...
Searching...
No Matches
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
18using Teuchos::RCP;
19using Teuchos::rcp;
20
21namespace panzer_stk {
22
27
32
34Teuchos::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
50Teuchos::RCP<STK_Interface> SquareQuadMeshFactory::buildUncommitedMesh(stk::ParallelMachine parallelMach) const
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
117void 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
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
145 addEdgeBlocks(mesh);
146 }
147
148 // calls Stk_MeshFactory::rebalance
149 this->rebalance(mesh);
150}
151
153void SquareQuadMeshFactory::setParameterList(const Teuchos::RCP<Teuchos::ParameterList> & paramList)
154{
155 paramList->validateParametersAndSetDefaults(*getValidParameters(),0);
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
183Teuchos::RCP<const Teuchos::ParameterList> SquareQuadMeshFactory::getValidParameters() const
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
223 RCP<Teuchos::ParameterList> validParams = rcp(new Teuchos::ParameterList(*getValidParameters()));
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
235void 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);
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
288void 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
300void 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
357std::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
380std::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
538 Teuchos::RCP<stk::mesh::BulkData> bulkData = mesh.getBulkData();
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
556 Teuchos::RCP<stk::mesh::BulkData> bulkData = mesh.getBulkData();
557 Teuchos::RCP<stk::mesh::MetaData> metaData = mesh.getMetaData();
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
571Teuchos::Tuple<std::size_t,2> SquareQuadMeshFactory::procRankToProcTuple(std::size_t procRank) const
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
stk::mesh::Entity findConnectivityById(stk::mesh::Entity src, stk::mesh::EntityRank tgt_rank, unsigned rel_id) const
void initialize(stk::ParallelMachine parallelMach, bool setupIO=true, const bool buildRefinementSupport=false)
stk::mesh::Part * getElementBlockPart(const std::string &name) const
get the block part
static const std::string edgeBlockString
stk::mesh::EntityId elementGlobalId(std::size_t lid) const
stk::mesh::Part * getEdgeBlock(const std::string &name) const
get the block part
bool isInitialized() const
Has initialize been called on this mesh object?
stk::mesh::EntityRank getNodeRank() const
void addEdgeBlock(const std::string &elemBlockName, const std::string &edgeBlockName, const stk::topology &topology)
void buildSubcells()
force the mesh to build subcells: edges and faces
void addEntityToNodeset(stk::mesh::Entity entity, stk::mesh::Part *nodeset)
void addElement(const Teuchos::RCP< ElementDescriptor > &ed, stk::mesh::Part *block)
void addNode(stk::mesh::EntityId gid, const std::vector< double > &coord)
void addNodeset(const std::string &name)
void addSideset(const std::string &name, const CellTopologyData *ctData)
Teuchos::RCP< stk::mesh::MetaData > getMetaData() const
stk::mesh::Part * getNodeset(const std::string &name) const
void endModification(const bool find_and_set_shared_nodes_in_stk=true)
unsigned entityOwnerRank(stk::mesh::Entity entity) const
void addEntitiesToEdgeBlock(std::vector< stk::mesh::Entity > entities, stk::mesh::Part *edgeblock)
void addEntityToSideset(stk::mesh::Entity entity, stk::mesh::Part *sideset)
void getMyElements(std::vector< stk::mesh::Entity > &elements) const
void addElementBlock(const std::string &name, const CellTopologyData *ctData)
Teuchos::RCP< stk::mesh::BulkData > getBulkData() const
stk::mesh::EntityRank getEdgeRank() const
stk::mesh::Part * getSideset(const std::string &name) const
void rebalance(STK_Interface &mesh) const
static void parsePeriodicBCList(const Teuchos::RCP< Teuchos::ParameterList > &pl, std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > &periodicBC, bool &useBBoxSearch)
double getMeshCoord(const int nx, const double deltaX, const double x0) const
std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > periodicBCVec_
SquareQuadMeshFactory(bool enableRebalance=false)
Constructor.
Teuchos::RCP< STK_Interface > buildMesh(stk::ParallelMachine parallelMach) const
Build the mesh object.
virtual Teuchos::RCP< STK_Interface > buildUncommitedMesh(stk::ParallelMachine parallelMach) const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
From ParameterListAcceptor.
void buildMetaData(stk::ParallelMachine parallelMach, STK_Interface &mesh) const
void buildElements(stk::ParallelMachine parallelMach, STK_Interface &mesh) 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
virtual void completeMeshConstruction(STK_Interface &mesh, stk::ParallelMachine parallelMach) const
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &paramList)
From ParameterListAcceptor.
Teuchos::Tuple< std::size_t, 2 > procRankToProcTuple(std::size_t procRank) const
what is the 2D tuple describe this processor distribution
std::pair< int, int > determineXElemSizeAndStart(int xBlock, unsigned int size, unsigned int rank) const
void buildBlock(stk::ParallelMachine machRank, int xBlock, int yBlock, STK_Interface &mesh) const