Panzer  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Panzer_STK_SculptMeshFactory.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 
15 #include "elsa.h"
16 using Teuchos::RCP;
17 using Teuchos::rcp;
18 
19 
20 
21 namespace panzer_stk {
22 
24 {
26 }
27 
30 {
31 }
32 
34 Teuchos::RCP<STK_Interface> SculptMeshFactory::buildMesh(stk::ParallelMachine parallelMach) const
35 {
36  PANZER_FUNC_TIME_MONITOR("panzer::SculptMeshFactory::buildMesh()");
37 
38  RCP<STK_Interface> mesh = buildUncommitedMesh(parallelMach);
39 
40  // commit meta data
41  mesh->initialize(parallelMach);
42 
43  // build bulk data
44  completeMeshConstruction(*mesh,parallelMach);
45 
46  // wrtie exodus file
47  //mesh->writeToExodus("STKSculptMesh.exo");
48 
49  return mesh;
50 }
51 
53 {
54  PANZER_FUNC_TIME_MONITOR("panzer::SculptMeshFactory::buildUncomittedMesh()");
55 
56  RCP<STK_Interface> mesh = rcp(new STK_Interface(3));
57 
58  machRank_ = stk::parallel_machine_rank(parallelMach);
59  machSize_ = stk::parallel_machine_size(parallelMach);
60 
62 
63  //if( machRank_ == 0 )
64  {
65  // call Sculptor
66  char diatom_file[1000];
67  writeDiatomFile( stlFileDir_, stlFileName_, diatom_file );
68 
69  callSculptor( parallelMach, diatom_file );
70 
71  // build meta information: blocks and side set setups
72  buildMetaData(parallelMach,*mesh);
73 
74  mesh->addPeriodicBCs(periodicBCVec_);
75  mesh->setBoundingBoxSearchFlag(useBBoxSearch_);
76 
77  }
78 
79 // if( machRank_ == 0 )
80 // if(mesh->isWritable())
81 // mesh->writeToExodus("STKSculptMesh.exo");
82 
83 
84  return mesh;
85 }
86 
87 int SculptMeshFactory::writeDiatomFile( std::string stl_path, std::string stl_filename, char *diatom_file ) const
88 {
89 
90  strcpy( diatom_file, stl_path.c_str() );
91  strcat( diatom_file, "stl.diatom" );
92  FILE *fp = fopen( diatom_file, "w" );
93  if ( !fp )
94  {
95  printf( "ERROR: Unable to open %s for writing\n", diatom_file );
96  return 0;
97  }
98 
99  char stl_fullfile[1000];
100  strcpy( stl_fullfile, stl_path.c_str() );
101  strcat( stl_fullfile, stl_filename.c_str() );
102 
103  fprintf( fp, " diatom\n" );
104  fprintf( fp, " package \'box\'\n" );
105  fprintf( fp, " material 1\n" );
106  fprintf( fp, " insert stl\n" );
107  fprintf( fp, " FILE = \'%s\'\n", stl_fullfile );
108  fprintf( fp, " endinsert\n" );
109  fprintf( fp, " endpackage\n" );
110  fprintf( fp, " enddiatom\n" );
111  fclose( fp );
112 
113  return 1;
114 
115 }
116 int SculptMeshFactory::callSculptor(stk::ParallelMachine parallelMach, char *diatom_file_name ) const
117 {
118 
119  char * base_exodus_file_name = NULL;
120  char * base_vfrac_file_name = NULL;
121  int nelx, nely, nelz;
122 
123  nelx = xInterval_;
124  nely = yInterval_;
125  nelz = zInterval_;
126 
127  int mesh_void = 0;
128 
129  double gmin[3];
130  double gmax[3];
131 
132  gmin[0] = xMin_;
133  gmin[1] = yMin_;
134  gmin[2] = zMin_;
135  gmax[0] = xMax_;
136  gmax[1] = yMax_;
137  gmax[2] = zMax_;
138 
139  int stair = 0;
140  int smooth = 1;
141  int smooth_iterations = 7;
142 
143  int gen_sidesets = 4; //for stl based sidesets
144  int adaptive_grid = 0;
145  int adapt_level = 2;
146  int adapt_type = 0;
147 
148  printf("\n Sculpt BBox Min ( %lf, %lf, %lf )\n", xMin_, yMin_, zMin_ );
149  printf("\n Sculpt BBox Max ( %lf, %lf, %lf )\n", xMax_, yMax_, zMax_ );
150 
151  int cr_result = Create_Sculptor_Mesh(diatom_file_name,
152  base_exodus_file_name,
153  base_vfrac_file_name,
154  0, //vfac_input
155  machSize_, //comm.size(),
156  machRank_, //comm.rank(),
157  1,
158  nelx,
159  nely,
160  nelz,
161  gmin,
162  gmax,
163  stair,
164  smooth,
165  10,/*num_laplac_iters*/
166  0, // max opt iters
167  .4,/*opt_threshold*/
168  0, // max pcol iters
169  .4, // pcol threshold
170  mesh_void,
171  gen_sidesets,
172  adapt_type, /* adatptive type*/
173  adaptive_grid,/*adaptive_grid*/
174  adapt_level, /* adapt level */
175  0, // max deg iter
176  0.0,/*double htet_threshold*/
177  0,/*int pillow*/
178  0, // capture
179  0, //micro_expand
180  0, //align
181  0, //cell_size
182  NULL,/*char * quality_filename*/
183  NULL,/*char * comm_maps_file_name*/
184  0, // write geom
185  0/*int quiet 1 is quiet*/
186  );
187 
188 
189 
190  if (cr_result == 1){
191  if(machRank_ == 0)
192  printf("Error Generating Sculptor Mesh\n");
193  return 1;
194  }
195 
196  return 0;
197 }
198 
199 void SculptMeshFactory::completeMeshConstruction(STK_Interface & mesh,stk::ParallelMachine parallelMach) const
200 {
201  PANZER_FUNC_TIME_MONITOR("panzer::SculptMeshFactory::completeMeshConstruction()");
202 
203  if(not mesh.isInitialized())
204  mesh.initialize(parallelMach);
205 
206  buildElements(parallelMach,mesh);
207 
208  mesh.buildSubcells();
209  mesh.buildLocalElementIDs();
210  mesh.buildLocalEdgeIDs();
211  mesh.buildLocalFaceIDs();
212 
213  addSideSets(mesh);
214  addNodeSets(mesh);
215  addEdgeBlocks(mesh);
216  addFaceBlocks(mesh);
217 
218  this->rebalance(mesh);
219 }
220 
223 {
225 
226  setMyParamList(paramList);
227 
228  xInterval_ = paramList->get<int>("xInterval");
229  yInterval_ = paramList->get<int>("yInterval");
230  zInterval_ = paramList->get<int>("zInterval");
231 
232 
233  xMin_ = paramList->get<double>("xMin");
234  yMin_ = paramList->get<double>("yMin");
235  zMin_ = paramList->get<double>("zMin");
236 
237  xMax_ = paramList->get<double>("xMax");
238  yMax_ = paramList->get<double>("yMax");
239  zMax_ = paramList->get<double>("zMax");
240 
241  stlFileDir_ = paramList->get<std::string>("stlFileDir");
242  stlFileName_ = paramList->get<std::string>("stlFileName");
243 
244  // read in periodic boundary conditions
245  parsePeriodicBCList(Teuchos::rcpFromRef(paramList->sublist("Periodic BCs")),periodicBCVec_,useBBoxSearch_);
246 }
247 
250 {
251  static RCP<Teuchos::ParameterList> defaultParams;
252 
253  // fill with default values
254  if(defaultParams == Teuchos::null) {
255  defaultParams = rcp(new Teuchos::ParameterList);
256 
257  defaultParams->set<int>("xInterval",10);
258  defaultParams->set<int>("yInterval",10);
259  defaultParams->set<int>("zInterval",10);
260 
261  defaultParams->set<double>("xMin",0.0);
262  defaultParams->set<double>("yMin",0.0);
263  defaultParams->set<double>("zMin",0.0);
264 
265  defaultParams->set<double>("xMax",1.0);
266  defaultParams->set<double>("yMax",1.0);
267  defaultParams->set<double>("zMax",1.0);
268 
269  defaultParams->set<std::string>("stlFileDir", "NULL");
270  defaultParams->set<std::string>("stlFileName", "NULL");
271 
272  Teuchos::ParameterList & bcs = defaultParams->sublist("Periodic BCs");
273  bcs.set<int>("Count",0); // no default periodic boundary conditions
274  }
275 
276 
277  return defaultParams;
278 }
279 
281 {
282  // get valid parameters
284 
285  // set that parameter list
286  setParameterList(validParams);
287 
288 }
289 
290 void SculptMeshFactory::buildMetaData(stk::ParallelMachine parallelMach, STK_Interface & mesh) const
291 {
292  struct MeshStorageStruct *mss = get_sculpt_mesh();
293 
294  int nBlocks_ = mss->num_elem_blk;
295  int nSidesets_ = mss->num_side_sets;
296  int nNodesets_ = mss->num_node_sets;
297 
298 
299  typedef shards::Hexahedron<8> HexTopo;
300  const CellTopologyData * ctd = shards::getCellTopologyData<HexTopo>();
301  const CellTopologyData * side_ctd = shards::CellTopology(ctd).getBaseCellTopologyData(2,0);
302 
303  const CellTopologyData * edge_ctd = shards::CellTopology(ctd).getBaseCellTopologyData(1,0);
304  const CellTopologyData * face_ctd = shards::CellTopology(ctd).getBaseCellTopologyData(2,0);
305 
306 
307  // build meta data
308  //mesh.setDimension(3);
309  for( int b = 0; b < nBlocks_; b++){
310  std::stringstream ebPostfix;
311  ebPostfix << "-" << mss->block_id[b];
312  mesh.addElementBlock("eblock"+ebPostfix.str(),ctd);
313  }
314 
315 
316  // add sidesets
317  int side_set_id;
318  machRank_ = stk::parallel_machine_rank(parallelMach);
319  for(int ict = 0;ict < nSidesets_;ict ++){
320  std::stringstream sPostfix;
321  sPostfix << "-" << mss->side_set_id[ict];
322  mesh.addSideset("Sideset"+sPostfix.str(),side_ctd);
323  }
324 
325  // add nodesets
326  for(int nx=0;nx<nNodesets_;nx++) {
327  std::stringstream nPostfix;
328  nPostfix << "-" << nx;
329  mesh.addNodeset("Nodeset"+nPostfix.str());
330  }
331 
334 }
335 
336 void SculptMeshFactory::buildNodes( stk::ParallelMachine paralleMach, STK_Interface &mesh ) const
337 {
338  struct MeshStorageStruct *mss = get_sculpt_mesh();
339  int num_nodes = mss->num_nodes;
340 
341 
342  int dimensionality = 3;
343 
344  if (num_nodes){
345  int global_node_numbers;
346  for(int ict = 0; ict < num_nodes; ict ++){
347  global_node_numbers = mss->global_node_numbers[ict];
348  std::vector<double> coord(3, 0.0);
349  coord[0] = mss->coord[0*num_nodes+ict];
350  coord[1] = mss->coord[1*num_nodes+ict];
351  coord[2] = mss->coord[2*num_nodes+ict];
352  mesh.addNode(global_node_numbers, coord );
353 
354  //std::cout<<"Node "<<global_node_numbers<<": ( "<<coord[0]<<", "<<coord[1]<<", "<<coord[2]<<" )"<<std::endl;
355 
356  }
357  }
358 
359 
360 }
361 
362 void SculptMeshFactory::buildElements(stk::ParallelMachine parallelMach,STK_Interface & mesh) const
363 {
364  struct MeshStorageStruct *mss = get_sculpt_mesh();
365  int num_blocks = mss->num_elem_blk;
366 
367 
368  int *block_id = new int[num_blocks];
369  //char ** element_types = new std::string[num_blocks];
370  int *elements = new int[num_blocks];
371  int *nodes_per_element = new int[num_blocks];
372  int *element_attributes = new int[num_blocks];
373  int **elmt_node_linkage = new int*[num_blocks];
374 
375  for(int b = 0; b < num_blocks; b++){
376  block_id[b] = mss->block_id[b];
377  // element_types[b] = mss->element_types[b];
378  elements[b] = mss->elements[b];
379  nodes_per_element[b] = mss->nodes_per_element[b];
380  element_attributes[b] = mss->element_attributes[b];
381  }
382 
383 
384  int elm_start = 1;
385  mesh.beginModification();
386  // build each block
387  for(int ib=0;ib<num_blocks;ib++) {
388  buildBlock(parallelMach,mesh, ib, block_id, elm_start, elements, nodes_per_element, element_attributes, elmt_node_linkage );
389  elm_start += elements[ib];
390  }
391  mesh.endModification();
392 }
393 
394 void SculptMeshFactory::buildBlock(stk::ParallelMachine parallelMach,STK_Interface & mesh, int block_index, int *block_id, int elm_start, int *elements, int *nodes_per_element, int *elem_attributes, int **elmt_node_linkage ) const
395 {
396 
397  struct MeshStorageStruct *mss = get_sculpt_mesh();
398 
399  // add blocks
400  std::stringstream blockName;
401  blockName << "eblock-" << block_id[block_index];
402  stk::mesh::Part * block = mesh.getElementBlockPart(blockName.str());
403 
404 
405  buildNodes( parallelMach, mesh );
406 
407 
408  // read element block properties
409  //read element connectivity information into a temporary array
410  if(elements[block_index]) {
411  int maximum_nodes = elements[block_index] * nodes_per_element[block_index];
412  elmt_node_linkage[block_index] = new int[maximum_nodes];
413  for(int ict = 0;ict < elements[block_index]; ict ++){
414  std::vector<stk::mesh::EntityId> nodes(nodes_per_element[block_index]);
415  //std::cout<<"Element id = "<<elm_start+ ict<<std::endl;
416  //std::cout<<"Element global id = "<<mss->global_element_numbers[elm_start+ ict-1]<<std::endl;
417  for(int nct = 0; nct < nodes_per_element[block_index]; nct++){
418  elmt_node_linkage[block_index][(ict*nodes_per_element[block_index])+nct] = mss->elmt_node_linkage[block_index][(ict*nodes_per_element[block_index])+nct];
419  nodes[nct] = mss->global_node_numbers[elmt_node_linkage[block_index][(ict*nodes_per_element[block_index])+nct]-1];
420  //std::cout<<" Node linkage id = "<<elmt_node_linkage[block_index][(ict*nodes_per_element[block_index])+nct]<<std::endl;
421  //std::cout<<" Node global id = "<<nodes[nct]<<std::endl;
422  }
423 
424  stk::mesh::EntityId gid = mss->global_element_numbers[elm_start+ ict-1];
425  RCP<ElementDescriptor> ed = rcp(new ElementDescriptor(gid,nodes));
426  mesh.addElement(ed,block);
427  }
428  }
429  else {
430  elmt_node_linkage[block_index] = NULL;
431  }
432 }
433 
434 const stk::mesh::Relation * SculptMeshFactory::getRelationByID(unsigned ID,stk::mesh::PairIterRelation relations) const
435 {
436  for(std::size_t i=0;i<relations.size();i++)
437  if(relations[i].identifier()==ID)
438  return &relations[i];
439 
440  return 0;
441 }
442 
443 
444 
446 {
447  mesh.beginModification();
448 
449  struct MeshStorageStruct *mss = get_sculpt_mesh();
450  int num_side_sets = mss->num_side_sets;
451 
452  int *side_set_id = new int[num_side_sets];
453  int *num_elements_in_side_set = new int[num_side_sets];
454  int *num_nodes_in_side_set = new int[num_side_sets];
455  int *num_df_in_side_set = new int[num_side_sets];
456  int **side_set_elements = new int*[num_side_sets];
457  int **side_set_faces = new int*[num_side_sets];
458  //Element_Type **side_set_element_type = new Element_Type*[num_side_sets];
459  int **side_set_node_counter = new int*[num_side_sets];
460  int **side_set_nodes = new int*[num_side_sets];
461  double **side_set_df = new double*[num_side_sets];
462 
463  for(int ict = 0;ict < num_side_sets;ict ++){
464  side_set_id[ict] = mss->side_set_id[ict];
465  }
466 
467  for(int i = 0; i < num_side_sets; i++) {
468 
469  std::stringstream sidesetName;
470  sidesetName << "Sideset-" << mss->side_set_id[i];
471  stk::mesh::Part * sideset = mesh.getSideset(sidesetName.str());
472 
473 
474  num_elements_in_side_set[i] = mss->num_elements_in_side_set[i];
475  num_df_in_side_set[i] = mss->num_df_in_side_set[i];
476 
477  int ne = num_elements_in_side_set[i];
478  side_set_elements[i] = new int[ne];
479  side_set_faces[i] = new int[ne];
480  //side_set_element_type[i] = new Element_Type[ne];
481  side_set_node_counter[i] = new int[ne];
482  side_set_df[i] = new double[num_df_in_side_set[i]];
483 
484 
485  if(ne) {
486 
487  for(int nct = 0; nct < ne; nct ++){
488 
489  std::vector<stk::mesh::EntityId> nodes(4);
490 
491  int sculpt_elem_id = mss->global_element_numbers[ mss->side_set_elements[i][nct]-1 ];
492  int sculpt_face_id = -1 ;
493 
494  std::vector<stk::mesh::Entity> localElmts;
495  mesh.getMyElements(localElmts);
496 
497  std::vector<stk::mesh::Entity>::const_iterator itr;
498  for(itr=localElmts.begin();itr!=localElmts.end();++itr) {
499  stk::mesh::Entity element = (*itr);
500 
501  if( element->identifier() == sculpt_elem_id )
502  {
503  sculpt_face_id = mss->side_set_faces[i][nct];
504 
505  stk::mesh::EntityId gid = element->identifier();
506 
507  stk::mesh::PairIterRelation relations = element->relations(mesh.getSideRank());
508 
509  stk::mesh::Entity side = getRelationByID(sculpt_face_id-1,relations)->entity();
510 
511  if( side != NULL )
512  {
513  if(side->owner_rank()==machRank_)
514  mesh.addEntityToSideset(*side,sideset );
515  }
516  }
517  }
518 
519  if( sculpt_face_id == -1 )
520  printf(" ERROR: Could not find the element id for a sideset face \n");
521  }
522  }
523  }
524  mesh.endModification();
525 }
526 
528 {
529  mesh.beginModification();
530 
531  struct MeshStorageStruct *mss = get_sculpt_mesh();
532  int num_node_sets = mss->num_node_sets;
533 
534 
535  if (num_node_sets) {
536  int *node_set_id = new int[num_node_sets];
537  int *num_nodes_in_node_set = new int[num_node_sets];
538  int *num_df_in_node_set = new int[num_node_sets];
539  int **node_set_nodes = new int*[num_node_sets];
540  double **node_set_df = new double*[num_node_sets];
541 
542  for(int ict = 0; ict < num_node_sets; ict ++){
543  node_set_id[ict] = mss->node_set_id[ict];
544  num_nodes_in_node_set[ict] = mss->num_nodes_in_node_set[ict];
545  num_df_in_node_set[ict] = mss->num_df_in_node_set[ict];
546  }
547 
548  for(int i = 0; i < num_node_sets; i++) {
549  node_set_nodes[i] = new int[num_nodes_in_node_set[i]];
550  node_set_df[i] = NULL;
551  if(num_nodes_in_node_set[i]) {
552  for(int nct = 0; nct < num_nodes_in_node_set[i];nct ++){
553  node_set_nodes[i][nct] = mss->node_set_nodes[i][nct];
554  }
555  }
556  }
557 
558 
559  for(int i = 0; i < num_node_sets; i++) {
560 
561  std::stringstream nodesetName;
562  nodesetName << "Nodeset-" << mss->node_set_id[i];
563  stk::mesh::Part * nodeset = mesh.getNodeset(nodesetName.str());
564 
565  for( int j = 0; j < num_nodes_in_node_set[i]; j++ )
566  {
567  int node_id = node_set_nodes[i][j];
569  if(machRank_==0)
570  {
571  stk::mesh::Entity node = bulkData->get_entity(mesh.getNodeRank(),node_id);
572  mesh.addEntityToNodeset(*node, nodeset);
573  }
574  }
575  }
576 
577  }
578  mesh.endModification();
579 }
580 
581 void ScupltMeshFactory::addEdgeBlocks(STK_Interface & mesh) const
582 {
583  mesh.beginModification();
584 
585  stk::mesh::Part * edge_block = mesh.getEdgeBlock(panzer_stk::STK_Interface::edgeBlockString);
586 
589 
590  std::vector<stk::mesh::Entity> edges;
591  bulkData->get_entities(mesh.getEdgeRank(),metaData->locally_owned_part(),edges);
592  for(auto edge : edges) {
593  mesh.addEntityToEdgeBlock(edge, edge_block);
594  }
595 
596  mesh.endModification();
597 }
598 
599 void ScupltMeshFactory::addFaceBlocks(STK_Interface & mesh) const
600 {
601  mesh.beginModification();
602 
603  stk::mesh::Part * face_block = mesh.getFaceBlock(panzer_stk::STK_Interface::faceBlockString);
604 
605  Teuchos::RCP<stk::mesh::BulkData> bulkData = mesh.getBulkData();
606  Teuchos::RCP<stk::mesh::MetaData> metaData = mesh.getMetaData();
607 
608  std::vector<stk::mesh::Entity> faces;
609  bulkData->get_entities(mesh.getFaceRank(),metaData->locally_owned_part(),faces);
610  for(auto face : faces) {
611  mesh.addEntityToFaceBlock(face, face_block);
612  }
613 
614  mesh.endModification();
615 }
616 
619 {
620  std::size_t i=0,j=0;
621 
622  j = procRank/machSize_;
623  procRank = procRank % machSize_;
624  i = procRank;
625 
626  return Teuchos::tuple(i,j);
627 }
628 
629 } // end panzer_stk
void buildMetaData(stk::ParallelMachine parallelMach, STK_Interface &mesh) const
void addFaceBlocks(STK_Interface &mesh) const
void buildElements(stk::ParallelMachine parallelMach, STK_Interface &mesh) const
void addNodeset(const std::string &name)
int callSculptor(stk::ParallelMachine parallelMach, char *diatom_file) 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
Teuchos::RCP< STK_Interface > buildMesh(stk::ParallelMachine parallelMach) const
Build the mesh object.
void addEntityToSideset(stk::mesh::Entity entity, stk::mesh::Part *sideset)
ParameterList & set(std::string const &name, T &&value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
virtual void completeMeshConstruction(STK_Interface &mesh, stk::ParallelMachine parallelMach) const
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
Teuchos::Tuple< std::size_t, 2 > procRankToProcTuple(std::size_t procRank) const
what is the 2D tuple describe this processor distribution
void addElement(const Teuchos::RCP< ElementDescriptor > &ed, stk::mesh::Part *block)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
stk::mesh::EntityRank getSideRank() const
void initialize(stk::ParallelMachine parallelMach, bool setupIO=true, const bool buildRefinementSupport=false)
void rebalance(STK_Interface &mesh) const
Teuchos::Tuple< std::size_t, 2 > procTuple_
Teuchos::RCP< stk::mesh::BulkData > getBulkData() const
void setMyParamList(const RCP< ParameterList > &paramList)
void validateParametersAndSetDefaults(ParameterList const &validParamList, int const depth=1000)
static const std::string edgeBlockString
void addNode(stk::mesh::EntityId gid, const std::vector< double > &coord)
void buildNodes(stk::ParallelMachine parallelMach, STK_Interface &mesh) const
void buildSubcells()
force the mesh to build subcells: edges and faces
const stk::mesh::Relation * getRelationByID(unsigned ID, stk::mesh::PairIterRelation edges) const
Teuchos::RCP< stk::mesh::MetaData > getMetaData() const
void addNodeSets(STK_Interface &mesh) const
bool isInitialized() const
Has initialize been called on this mesh object?
virtual Teuchos::RCP< STK_Interface > buildUncommitedMesh(stk::ParallelMachine parallelMach) const
void buildBlock(stk::ParallelMachine parallelMach, STK_Interface &mesh, int block_index, int *block_id, int elem_start, int *elements, int *nodes_per_elem, int *elem_attributes, int **elm_node_linkage) const
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
From ParameterListAcceptor.
void addSideset(const std::string &name, const CellTopologyData *ctData)
static const std::string faceBlockString
void addEntityToEdgeBlock(stk::mesh::Entity entity, stk::mesh::Part *edgeblock)
stk::mesh::Part * getEdgeBlock(const std::string &name) const
get the block part
std::vector< Teuchos::RCP< const PeriodicBC_MatcherBase > > periodicBCVec_
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &paramList)
From ParameterListAcceptor.
stk::mesh::EntityRank getEdgeRank() const
int writeDiatomFile(std::string stl_path, std::string stl_filename, char *diatom_file) const
void addFaceBlock(const std::string &elemBlockName, const std::string &faceBlockName, const stk::topology &topology)
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
void getMyElements(std::vector< stk::mesh::Entity > &elements) const
stk::mesh::EntityRank getNodeRank() const
void addEdgeBlocks(STK_Interface &mesh) const
void addElementBlock(const std::string &name, const CellTopologyData *ctData)
void addSideSets(STK_Interface &mesh) const