https://mooseframework.inl.gov
SCMTriPinMeshGenerator.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 
10 #include "SCMTriPinMeshGenerator.h"
11 #include "TriSubChannelMesh.h"
12 #include "libmesh/edge_edge2.h"
13 #include <numeric>
14 
16 registerMooseObjectRenamed("SubChannelApp",
17  TriPinMeshGenerator,
18  "06/30/2025 24:00",
20 
23 {
25  params.addRequiredParam<MeshGeneratorName>("input", "The corresponding subchannel mesh");
26  params.addClassDescription("Creates a mesh of 1D fuel pins in a triangular lattice arrangement");
27  params.addParam<Real>("unheated_length_entry", 0.0, "Unheated length at entry [m]");
28  params.addRequiredParam<Real>("heated_length", "Heated length [m]");
29  params.addParam<Real>("unheated_length_exit", 0.0, "Unheated length at exit [m]");
30  params.addRequiredParam<Real>("pitch", "Pitch [m]");
31  params.addRequiredParam<unsigned int>("nrings", "Number of fuel Pin rings per assembly [-]");
32  params.addRequiredParam<unsigned int>("n_cells", "The number of cells in the axial direction");
33  params.addParam<unsigned int>("block_id", 1, "Domain Index");
34  return params;
35 }
36 
38  : MeshGenerator(params),
39  _input(getMesh("input")),
40  _unheated_length_entry(getParam<Real>("unheated_length_entry")),
41  _heated_length(getParam<Real>("heated_length")),
42  _unheated_length_exit(getParam<Real>("unheated_length_exit")),
43  _pitch(getParam<Real>("pitch")),
44  _n_rings(getParam<unsigned int>("nrings")),
45  _n_cells(getParam<unsigned int>("n_cells")),
46  _block_id(getParam<unsigned int>("block_id"))
47 {
49  for (unsigned int i = 0; i < _n_cells + 1; i++)
50  _z_grid.push_back(dz * i);
51 }
52 
53 std::unique_ptr<MeshBase>
55 {
56 
57  // Setting up base elements in the mesh
58  std::unique_ptr<MeshBase> mesh_base = std::move(_input);
59  if (!mesh_base)
60  mesh_base = buildMeshBaseObject();
61 
62  mesh_base->set_mesh_dimension(3);
63 
64  // Defining the Pin positions
66  auto _nrods = _pin_position.size();
67 
68  // Reserving memory in the mesh
69  mesh_base->reserve_elem(_n_cells * _nrods);
70  mesh_base->reserve_nodes((_n_cells + 1) * _nrods);
71  _pin_nodes.resize(_nrods);
72 
73  // Defining the extent of the subchanel mesh to append pins mesh
74  // to the current subchannel mesh
75  unsigned int chancount = 0;
76  for (unsigned int j = 0; j < _n_rings - 1; j++)
77  chancount += j * 6;
78  unsigned int _n_channels = chancount + _nrods - 1 + (_n_rings - 1) * 6 + 6;
79  unsigned int node_sub = (_n_cells + 1) * _n_channels;
80  unsigned int elem_sub = _n_cells * _n_channels;
81 
82  // Add the points in the shape of a rectilinear grid. The grid is regular
83  // on the xy-plane with a spacing of `pitch` between points. The grid along
84  // z is also regular. Store pointers in the _nodes
85  // array so we can keep track of which points are in which pins.
86  unsigned int node_id = node_sub;
87  for (unsigned int i = 0; i < _nrods; i++)
88  {
89  _pin_nodes[i].reserve(_n_cells);
90  for (unsigned int iz = 0; iz < _n_cells + 1; iz++)
91  {
92  _pin_nodes[i].push_back(mesh_base->add_point(
93  Point(_pin_position[i](0), _pin_position[i](1), _z_grid[iz]), node_id++));
94  }
95  }
96 
97  // Add the elements which in this case are 2-node edges that link each
98  // pin nodes vertically.
99  unsigned int elem_id = elem_sub;
100  for (unsigned int i = 0; i < _nrods; i++)
101  {
102  for (unsigned int iz = 0; iz < _n_cells; iz++)
103  {
104  Elem * elem = new Edge2;
105  elem->subdomain_id() = _block_id;
106  elem->set_id(elem_id++);
107  elem = mesh_base->add_elem(elem);
108  const int indx1 = (_n_cells + 1) * i + iz + node_sub;
109  const int indx2 = (_n_cells + 1) * i + (iz + 1) + node_sub;
110  elem->set_node(0, mesh_base->node_ptr(indx1));
111  elem->set_node(1, mesh_base->node_ptr(indx2));
112  }
113  }
114  mesh_base->subdomain_name(_block_id) = name();
115  mesh_base->prepare_for_use();
116 
117  // move the meta data into TriSubChannelMesh
118  auto & sch_mesh = static_cast<TriSubChannelMesh &>(*_mesh);
119  sch_mesh._pin_nodes = _pin_nodes;
120  sch_mesh._pin_mesh_exist = true;
121 
122  return mesh_base;
123 }
std::vector< Real > _z_grid
axial location of nodes
SCMTriPinMeshGenerator(const InputParameters &parameters)
std::unique_ptr< MeshBase > generate() override
std::vector< Point > _pin_position
x-y positions of the fuel pins
const Real _unheated_length_entry
unheated length of the fuel Pin at the entry of the assembly
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)
std::unique_ptr< MeshBase > & _input
Mesh that comes from another generator.
const unsigned int _n_cells
number of axial cells
virtual const std::string & name() const
void addRequiredParam(const std::string &name, const std::string &doc_string)
registerMooseObjectRenamed("SubChannelApp", TriPinMeshGenerator, "06/30/2025 24:00", SCMTriPinMeshGenerator)
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.
static InputParameters validParams()
Mesh class for triangular, edge and corner subchannels for hexagonal lattice fuel assemblies...
const unsigned int _n_rings
number of subchannels in the x direction
static void rodPositions(std::vector< Point > &positions, unsigned int nrings, Real pitch, Point center)
Calculates and stores the pin positions/centers for a hexagonal assembly containing the given number ...
const unsigned int _block_id
block index
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Class to create Pin mesh in the square lattice geometry.
static InputParameters validParams()
std::vector< std::vector< Node * > > _pin_nodes
pin nodes
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
const Real _pitch
Distance between the neighbor fuel pins, pitch.
std::unique_ptr< MeshBase > buildMeshBaseObject(unsigned int dim=libMesh::invalid_uint)
registerMooseObject("SubChannelApp", SCMTriPinMeshGenerator)
void ErrorVector unsigned int
const Real _heated_length
heated length of the fuel Pin