https://mooseframework.inl.gov
SCMQuadPinMeshGenerator.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
11 #include "QuadSubChannelMesh.h"
12 #include "libmesh/edge_edge2.h"
13 
15 
18 {
20  params.addClassDescription("Creates a mesh of 1D fuel pins in a square lattice arrangement");
21  params.addRequiredParam<MeshGeneratorName>("input", "The corresponding subchannel mesh");
22  params.addParam<Real>("unheated_length_entry", 0.0, "Unheated length at entry [m]");
23  params.addRequiredParam<Real>("heated_length", "Heated length [m]");
24  params.addParam<Real>("unheated_length_exit", 0.0, "Unheated length at exit [m]");
25  params.addRequiredParam<Real>("pitch", "Pitch [m]");
26  params.addRequiredParam<unsigned int>("nx", "Number of subchannels in the x direction [-]");
27  params.addRequiredParam<unsigned int>("ny", "Number of subchannels in the y direction [-]");
28  params.addRequiredParam<unsigned int>("n_cells", "The number of cells in the axial direction");
29  params.addParam<unsigned int>("block_id", 1, "Domain Index");
30  return params;
31 }
32 
34  : MeshGenerator(params),
35  _input(getMesh("input")),
36  _unheated_length_entry(getParam<Real>("unheated_length_entry")),
37  _heated_length(getParam<Real>("heated_length")),
38  _unheated_length_exit(getParam<Real>("unheated_length_exit")),
39  _pitch(getParam<Real>("pitch")),
40  _nx(getParam<unsigned int>("nx")),
41  _ny(getParam<unsigned int>("ny")),
42  _n_cells(getParam<unsigned int>("n_cells")),
43  _block_id(getParam<unsigned int>("block_id"))
44 {
46  for (unsigned int i = 0; i < _n_cells + 1; i++)
47  _z_grid.push_back(dz * i);
48 }
49 
50 std::unique_ptr<MeshBase>
52 {
53  std::unique_ptr<MeshBase> mesh_base = std::move(_input);
54  if (!mesh_base)
55  mesh_base = buildMeshBaseObject();
56  mesh_base->set_mesh_dimension(3);
57  mesh_base->reserve_elem(_n_cells * (_ny - 1) * (_nx - 1));
58  mesh_base->reserve_nodes((_n_cells + 1) * (_ny - 1) * (_nx - 1));
59  _pin_nodes.resize((_nx - 1) * (_ny - 1));
60  // number of nodes in subchannel mesh
61  unsigned int node_sub = (_n_cells + 1) * _ny * _nx;
62  // number of elements in subchannel mesh
63  unsigned int elem_sub = _n_cells * _ny * _nx;
64 
65  // Add the points in the shape of a rectilinear grid. The grid is regular
66  // on the xy-plane with a spacing of `pitch` between points. The grid along
67  // z is also regular. Store pointers in the _nodes
68  // array so we can keep track of which points are in which pins.
69  Real offset_x = (_nx - 2) * _pitch / 2.0;
70  Real offset_y = (_ny - 2) * _pitch / 2.0;
71  unsigned int node_id = node_sub;
72  for (unsigned int iy = 0; iy < _ny - 1; iy++)
73  {
74  for (unsigned int ix = 0; ix < _nx - 1; ix++)
75  {
76  int i_node = (_nx - 1) * iy + ix;
77  _pin_nodes[i_node].reserve(_n_cells);
78  for (unsigned int iz = 0; iz < _n_cells + 1; iz++)
79  {
80  _pin_nodes[i_node].push_back(mesh_base->add_point(
81  Point(_pitch * ix - offset_x, _pitch * iy - offset_y, _z_grid[iz]), node_id++));
82  }
83  }
84  }
85 
86  // Add the elements which in this case are 2-node edges that link each
87  // subchannel's nodes vertically.
88  unsigned int elem_id = elem_sub;
89  for (unsigned int iy = 0; iy < _ny - 1; iy++)
90  {
91  for (unsigned int ix = 0; ix < _nx - 1; ix++)
92  {
93  for (unsigned int iz = 0; iz < _n_cells; iz++)
94  {
95  Elem * elem = new Edge2;
96  elem->subdomain_id() = _block_id;
97  elem->set_id(elem_id++);
98  elem = mesh_base->add_elem(elem);
99  const int indx1 = ((_n_cells + 1) * (_nx - 1)) * iy + (_n_cells + 1) * ix + iz + node_sub;
100  const int indx2 =
101  ((_n_cells + 1) * (_nx - 1)) * iy + (_n_cells + 1) * ix + (iz + 1) + node_sub;
102  elem->set_node(0, mesh_base->node_ptr(indx1));
103  elem->set_node(1, mesh_base->node_ptr(indx2));
104  }
105  }
106  }
107  mesh_base->subdomain_name(_block_id) = name();
108  mesh_base->prepare_for_use();
109 
110  // move the meta data into QuadSubChannelMesh
111  auto & sch_mesh = static_cast<QuadSubChannelMesh &>(*_mesh);
112  sch_mesh._pin_nodes = _pin_nodes;
113  sch_mesh._pin_mesh_exist = true;
114 
115  return mesh_base;
116 }
const unsigned int _n_cells
number of axial cells
const Real _heated_length
heated length of the fuel Pin
T & getMesh(MooseMesh &mesh)
function to cast mesh
Definition: SCM.h:35
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const Real _unheated_length_exit
unheated length of the fuel Pin at the exit of the assembly
std::vector< std::vector< Node * > > _pin_nodes
Pin nodes.
const unsigned int _block_id
block index
std::unique_ptr< MeshBase > & _input
Mesh that comes from another generator.
Creates the mesh of subchannels in a quadrilateral lattice.
SCMQuadPinMeshGenerator(const InputParameters &parameters)
void addRequiredParam(const std::string &name, const std::string &doc_string)
const std::string & name() const
static InputParameters validParams()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const unsigned int _ny
number of subchannels in the y direction
static InputParameters validParams()
std::vector< std::vector< Node * > > _pin_nodes
vector of fuel pin nodes
std::vector< Real > _z_grid
axial location of nodes
void addClassDescription(const std::string &doc_string)
std::unique_ptr< MeshBase > buildMeshBaseObject(unsigned int dim=libMesh::invalid_uint)
std::unique_ptr< MeshBase > generate() override
const unsigned int _nx
number of subchannels in the x direction
registerMooseObject("SubChannelApp", SCMQuadPinMeshGenerator)
void ErrorVector unsigned int
const Real _pitch
Distance between the neighbor fuel pins, pitch.
Class to create Pin mesh in the square lattice geometry.
const Real _unheated_length_entry
unheated length of the fuel Pin at the entry of the assembly