12 #include "libmesh/edge_edge2.h" 17 QuadSubChannelMeshGenerator,
25 params.
addClassDescription(
"Creates a mesh of 1D subchannels in a square lattice arrangement");
28 params.
addParam<
Real>(
"unheated_length_entry", 0.0,
"Unheated length at entry [m]");
30 params.
addParam<
Real>(
"unheated_length_exit", 0.0,
"Unheated length at exit [m]");
32 "spacer_z", {},
"Axial location of spacers/vanes/mixing_vanes [m]");
34 "spacer_k", {},
"K-loss coefficient of spacers/vanes/mixing_vanes [-]");
35 params.
addParam<std::vector<Real>>(
"z_blockage",
36 std::vector<Real>({0.0, 0.0}),
37 "axial location of blockage (inlet, outlet) [m]");
38 params.
addParam<std::vector<unsigned int>>(
"index_blockage",
39 std::vector<unsigned int>({0}),
40 "index of subchannels affected by blockage");
43 std::vector<Real>({1.0}),
44 "Area reduction of subchannels affected by blockage (number to muliply the area)");
45 params.
addParam<std::vector<Real>>(
"k_blockage",
46 std::vector<Real>({0.0}),
47 "Form loss coefficient of subchannels affected by blockage");
49 params.
addParam<
Real>(
"Kij", 0.5,
"Lateral form loss coefficient [-]");
50 params.
addRequiredParam<
unsigned int>(
"n_cells",
"The number of cells in the axial direction");
51 params.
addRequiredParam<
unsigned int>(
"nx",
"Number of channels in the x direction [-]");
52 params.
addRequiredParam<
unsigned int>(
"ny",
"Number of channels in the y direction [-]");
55 "The side gap, not to be confused with the gap between pins, this refers to the gap " 56 "next to the duct or else the distance between the subchannel centroid to the duct wall." 57 "distance(edge pin center, duct wall) = pitch / 2 + side_gap [m]");
59 params.
addParam<
unsigned int>(
"block_id", 0,
"Domain Index");
65 _unheated_length_entry(getParam<
Real>(
"unheated_length_entry")),
66 _heated_length(getParam<
Real>(
"heated_length")),
67 _unheated_length_exit(getParam<
Real>(
"unheated_length_exit")),
68 _spacer_z(getParam<
std::vector<
Real>>(
"spacer_z")),
69 _spacer_k(getParam<
std::vector<
Real>>(
"spacer_k")),
70 _z_blockage(getParam<
std::vector<
Real>>(
"z_blockage")),
71 _index_blockage(getParam<
std::vector<unsigned
int>>(
"index_blockage")),
72 _reduction_blockage(getParam<
std::vector<
Real>>(
"reduction_blockage")),
73 _k_blockage(getParam<
std::vector<
Real>>(
"k_blockage")),
74 _kij(getParam<
Real>(
"Kij")),
75 _pitch(getParam<
Real>(
"pitch")),
76 _pin_diameter(getParam<
Real>(
"pin_diameter")),
77 _n_cells(getParam<unsigned
int>(
"n_cells")),
78 _nx(getParam<unsigned
int>(
"nx")),
79 _ny(getParam<unsigned
int>(
"ny")),
80 _n_channels(_nx * _ny),
81 _n_gaps((_nx - 1) * _ny + (_ny - 1) * _nx),
82 _n_pins((_nx - 1) * (_ny - 1)),
83 _side_gap(getParam<
Real>(
"side_gap")),
84 _block_id(getParam<unsigned
int>(
"block_id"))
87 mooseError(
name(),
": Size of vector spacer_z should be equal to size of vector spacer_k");
91 mooseError(
name(),
": Location of spacers should be less than the total bundle length");
98 ": The index of the blocked subchannel cannot be more than the max index of the " 102 mooseError(
name(),
": The area reduction of the blocked subchannels cannot be more than 1");
107 ": Size of vectors: index_blockage, reduction_blockage, k_blockage, cannot be more " 108 "than the total number of subchannels");
114 ": Size of vectors: index_blockage, reduction_blockage, k_blockage, must be equal " 119 ": The number of subchannels cannot be less than 2 in both directions (x and y). " 120 "Smallest assembly allowed is either 2X1 or 1X2. ");
129 std::vector<int> spacer_cell;
131 spacer_cell.emplace_back(std::round(elem *
_n_cells / L));
134 std::vector<Real> kgrid;
139 for (
unsigned int index = 0; index < spacer_cell.size(); index++)
140 kgrid[spacer_cell[index]] +=
_spacer_k[index];
148 for (
unsigned int i = 0; i <
_n_cells + 1; i++)
152 unsigned int index(0);
175 for (
unsigned int j = 0;
j < 3;
j++)
181 for (
unsigned int iz = 0; iz <
_n_cells + 1; iz++)
187 Real positive_flow = 1.0;
188 Real negative_flow = -1.0;
192 for (
unsigned int iy = 0; iy <
_ny; iy++)
194 for (
unsigned int ix = 0; ix <
_nx; ix++)
196 unsigned int i_ch =
_nx * iy + ix;
197 bool is_corner = (ix == 0 && iy == 0) || (ix ==
_nx - 1 && iy == 0) ||
198 (ix == 0 && iy ==
_ny - 1) || (ix ==
_nx - 1 && iy ==
_ny - 1);
199 bool is_edge = (ix == 0 || iy == 0 || ix ==
_nx - 1 || iy ==
_ny - 1);
222 unsigned int i_gap = 0;
223 for (
unsigned int iy = 0; iy <
_ny; iy++)
225 for (
unsigned int ix = 0; ix <
_nx - 1; ix++)
227 unsigned int i_ch =
_nx * iy + ix;
228 unsigned int j_ch =
_nx * iy + (ix + 1);
236 if (iy == 0 || iy ==
_ny - 1)
245 for (
unsigned int iy = 0; iy <
_ny - 1; iy++)
247 for (
unsigned int ix = 0; ix <
_nx; ix++)
249 unsigned int i_ch =
_nx * iy + ix;
250 unsigned int j_ch =
_nx * (iy + 1) + ix;
258 if (ix == 0 || ix ==
_nx - 1)
266 for (
unsigned int iz = 1; iz <
_n_cells + 1; iz++)
272 for (
unsigned int iy = 0; iy <
_ny - 1; iy++)
274 for (
unsigned int ix = 0; ix <
_nx - 1; ix++)
276 unsigned int i_pin = (
_nx - 1) * iy + ix;
277 unsigned int i_chan_1 =
_nx * iy + ix;
278 unsigned int i_chan_2 =
_nx * (iy + 1) + ix;
279 unsigned int i_chan_3 =
_nx * (iy + 1) + (ix + 1);
280 unsigned int i_chan_4 =
_nx * iy + (ix + 1);
289 for (
unsigned int iy = 0; iy <
_ny; iy++)
291 for (
unsigned int ix = 0; ix <
_nx; ix++)
293 unsigned int i_ch =
_nx * iy + ix;
295 if (iy == 0 && ix == 0)
299 else if (iy ==
_ny - 1 && ix == 0)
303 else if (iy == 0 && ix ==
_nx - 1)
307 else if (iy ==
_ny - 1 && ix ==
_nx - 1)
317 else if (iy ==
_ny - 1)
327 else if (ix ==
_nx - 1)
350 for (
unsigned int i_gap = 0; i_gap <
_n_gaps; i_gap++)
358 for (
unsigned int i : i_pins)
360 for (
unsigned int j : j_pins)
391 std::unique_ptr<MeshBase>
395 BoundaryInfo & boundary_info = mesh_base->get_boundary_info();
396 mesh_base->set_spatial_dimension(3);
406 unsigned int node_id = 0;
407 for (
unsigned int iy = 0; iy <
_ny; iy++)
409 for (
unsigned int ix = 0; ix <
_nx; ix++)
411 int i_ch =
_nx * iy + ix;
413 for (
unsigned int iz = 0; iz <
_n_cells + 1; iz++)
415 _nodes[i_ch].push_back(mesh_base->add_point(
423 unsigned int elem_id = 0;
424 for (
unsigned int iy = 0; iy <
_ny; iy++)
426 for (
unsigned int ix = 0; ix <
_nx; ix++)
428 for (
unsigned int iz = 0; iz <
_n_cells; iz++)
430 Elem * elem =
new Edge2;
432 elem->set_id(elem_id++);
433 elem = mesh_base->add_elem(elem);
436 elem->set_node(0, mesh_base->node_ptr(indx1));
437 elem->set_node(1, mesh_base->node_ptr(indx2));
440 boundary_info.add_side(elem, 0, 0);
442 boundary_info.add_side(elem, 1, 1);
447 boundary_info.sideset_name(0) =
"inlet";
448 boundary_info.sideset_name(1) =
"outlet";
449 boundary_info.nodeset_name(0) =
"inlet";
450 boundary_info.nodeset_name(1) =
"outlet";
452 mesh_base->prepare_for_use();
466 sch_mesh._kij =
_kij;
const unsigned int _n_gaps
Number of gaps per layer.
Class for Subchannel mesh generation in the square lattice geometry.
const std::vector< Real > & _spacer_k
form loss coefficient of the spacers
const Real _pitch
Distance between the neighbor fuel pins, pitch.
std::vector< std::pair< unsigned int, unsigned int > > _gap_to_chan_map
const std::vector< unsigned int > _index_blockage
index of subchannels affected by blockage
const std::vector< Real > _z_blockage
axial location of blockage (inlet, outlet) [m]
Real _unheated_length_entry
unheated length of the fuel Pin at the entry of the assembly
const Real _side_gap
The side gap, not to be confused with the gap between pins, this refers to the gap next to the duct o...
std::vector< std::vector< unsigned int > > _chan_to_pin_map
static InputParameters validParams()
Creates the mesh of subchannels in a quadrilateral lattice.
const unsigned int _n_cells
number of axial cells
const unsigned int _ny
Number of subchannels in the y direction.
std::vector< std::vector< Real > > _subchannel_position
x,y coordinates of the subchannel centroid
const unsigned int _n_channels
Total number of subchannels.
const Real _unheated_length_entry
unheated length of the fuel Pin at the entry of the assembly
registerMooseObject("SubChannelApp", SCMQuadSubChannelMeshGenerator)
const std::vector< Real > _k_blockage
form loss coefficient of subchannels affected by blockage
static void generateZGrid(Real unheated_length_entry, Real heated_length, Real unheated_length_exit, unsigned int n_cells, std::vector< Real > &z_grid)
Generate the spacing in z-direction using heated and unteaded lengths.
const std::string & name() const
registerMooseObjectRenamed("SubChannelApp", QuadSubChannelMeshGenerator, "06/30/2025 24:00", SCMQuadSubChannelMeshGenerator)
std::vector< std::vector< Node * > > _nodes
Channel nodes.
const unsigned int _nx
Number of subchannels in the x direction.
const std::vector< Real > _reduction_blockage
area reduction of subchannels affected by blockage
static InputParameters validParams()
std::vector< EChannelType > _subch_type
Subchannel type.
std::unique_ptr< MeshBase > generate() override
std::vector< std::vector< Real > > _gij_map
Vector to store gap size.
SCMQuadSubChannelMeshGenerator(const InputParameters ¶meters)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< std::vector< Node * > > _gapnodes
gap nodes
const Real _pin_diameter
fuel Pin diameter
std::vector< std::vector< unsigned int > > _chan_to_gap_map
const Real _unheated_length_exit
unheated length of the fuel Pin at the exit of the assembly
const std::vector< Real > & _spacer_z
axial location of the spacers
void mooseError(Args &&... args) const
std::vector< std::vector< unsigned int > > _pin_to_chan_map
std::vector< std::vector< double > > _sign_id_crossflow_map
Matrix used to give local sign to crossflow quantities.
const unsigned int _block_id
block index
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
const Real & _kij
Lateral form loss coefficient.
std::vector< std::vector< Real > > _k_grid
axial form loss coefficient per computational cell
std::unique_ptr< MeshBase > buildMeshBaseObject(unsigned int dim=libMesh::invalid_uint)
std::vector< std::pair< unsigned int, unsigned int > > _gap_to_pin_map
const Real _heated_length
heated length of the fuel Pin
std::vector< Real > _z_grid
axial location of nodes
void ErrorVector unsigned int
const unsigned int _n_pins
Number of pins.