https://mooseframework.inl.gov
SCMDetailedQuadInterWrapperMeshGenerator.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 <array>
12 #include <cmath>
13 #include "libmesh/cell_prism6.h"
14 #include "libmesh/unstructured_mesh.h"
15 
17 registerMooseObjectRenamed("SubChannelApp",
18  DetailedQuadInterWrapperMeshGenerator,
19  "06/30/2025 24:00",
21 
24 {
26  params.addClassDescription(
27  "Creates a detailed mesh of the inter-wrapper cells around square lattice subassemblies");
28  params.addRequiredParam<Real>("assembly_pitch", "Assembly Pitch [m]");
29  params.addRequiredParam<Real>("assembly_side_x",
30  "Outer side lengths of assembly in x [m] - including duct");
31  params.addRequiredParam<Real>("assembly_side_y",
32  "Outer side lengths of assembly in y [m] - including duct");
33  params.addParam<Real>("unheated_length_entry", 0.0, "Unheated length at entry [m]");
34  params.addRequiredParam<Real>("heated_length", "Heated length [m]");
35  params.addParam<Real>("unheated_length_exit", 0.0, "Unheated length at exit [m]");
36  params.addRequiredParam<unsigned int>("n_cells", "The number of cells in the axial direction");
37  params.addRequiredParam<unsigned int>("nx", "Number of channels in the x direction [-]");
38  params.addRequiredParam<unsigned int>("ny", "Number of channels in the y direction [-]");
39  params.addRequiredParam<Real>("side_bypass", "Half of assembly_pitch between assemblies [m]");
40  params.addParam<unsigned int>("block_id", 0, "Block ID used for the mesh subdomain.");
41  return params;
42 }
43 
45  const InputParameters & parameters)
46  : MeshGenerator(parameters),
47  _unheated_length_entry(getParam<Real>("unheated_length_entry")),
48  _heated_length(getParam<Real>("heated_length")),
49  _unheated_length_exit(getParam<Real>("unheated_length_exit")),
50  _assembly_pitch(getParam<Real>("assembly_pitch")),
51  _assembly_side_x(getParam<Real>("assembly_side_x")),
52  _assembly_side_y(getParam<Real>("assembly_side_y")),
53  _n_cells(getParam<unsigned int>("n_cells")),
54  _nx(getParam<unsigned int>("nx") + 1),
55  _ny(getParam<unsigned int>("ny") + 1),
56  _n_channels((_nx + 1) * (_ny + 1)),
57  _side_bypass_length(getParam<Real>("side_bypass")),
58  _block_id(getParam<unsigned int>("block_id"))
59 {
61  Real dz = L / _n_cells;
62  for (unsigned int i = 0; i < _n_cells + 1; i++)
63  _z_grid.push_back(dz * i);
64 
65  _subch_type.resize(_n_channels);
66  for (unsigned int iy = 0; iy < _ny; iy++)
67  {
68  for (unsigned int ix = 0; ix < _nx; ix++)
69  {
70  unsigned int i_ch = _nx * iy + ix;
71  bool is_corner = (ix == 0 && iy == 0) || (ix == _nx - 1 && iy == 0) ||
72  (ix == 0 && iy == _ny - 1) || (ix == _nx - 1 && iy == _ny - 1);
73  bool is_edge = (ix == 0 || iy == 0 || ix == _nx - 1 || iy == _ny - 1);
74 
75  if (is_corner)
77  else if (is_edge)
79  else
81  }
82  }
83 }
84 
85 std::unique_ptr<MeshBase>
87 {
88  auto mesh_base = buildMeshBaseObject();
89  BoundaryInfo & boundary_info = mesh_base->get_boundary_info();
90  mesh_base->set_spatial_dimension(3);
91  // Define the resolution (the number of points used to represent a circle).
92  // This must be divisible by 4.
93  const unsigned int theta_res = 16; // TODO: parameterize
94  // Compute the number of points needed to represent one quarter of a circle.
95  const unsigned int points_per_quad = theta_res / 4 + 1;
96 
97  // Compute the points needed to represent one axial cross-flow of a subchannel.
98  // For the center subchannel (sc) there is one center point plus the points from 4 intersecting
99  // circles.
100  const unsigned int points_per_center = points_per_quad * 4 + 1;
101  // For the corner sc there is one center point plus the points from 1 intersecting circle plus 3
102  // corners
103  const unsigned int points_per_corner = points_per_quad * 1 + 1 + 3;
104  // For the side sc there is one center point plus the points from 2 intersecting circles plus 2
105  // corners
106  const unsigned int points_per_side = points_per_quad * 2 + 1 + 2;
107 
108  // Compute the number of elements (Prism6) which combined base creates the sub-channel
109  // cross-section
110  const unsigned int elems_per_center = theta_res + 4;
111  const unsigned int elems_per_corner = theta_res / 4 + 4;
112  const unsigned int elems_per_side = theta_res / 2 + 4;
113 
114  // specify number and type of sub-channel
115  unsigned int n_center, n_side, n_corner;
116 
117  n_corner = 4;
118  n_side = 2 * (_ny - 2) + 2 * (_nx - 2);
119  n_center = _n_channels - n_side - n_corner;
120 
121  // Compute the total number of points and elements.
122  const unsigned int points_per_level =
123  n_corner * points_per_corner + n_side * points_per_side + n_center * points_per_center;
124  const unsigned int elems_per_level =
125  n_corner * elems_per_corner + n_side * elems_per_side + n_center * elems_per_center;
126  const unsigned int n_points = points_per_level * (_n_cells + 1);
127  const unsigned int n_elems = elems_per_level * _n_cells;
128  mesh_base->reserve_nodes(n_points);
129  mesh_base->reserve_elem(n_elems);
130  // Build an array of points arranged in a square on the xy-plane. (last and first node overlap)
131  // Mapping points in a circle to a square
132  // See ttp://arxiv.org/abs/1509.06344 for proof
133  const Real radius = 1.0;
134  std::array<Point, theta_res + 1> circle_points;
135  {
136  Real theta = 0;
137  Real u, v;
138  for (unsigned int i = 0; i < theta_res + 1; i++)
139  {
140  u = radius * std::cos(theta);
141  v = radius * std::sin(theta);
142  Real val_check_u = std::abs(u) - std::sqrt(2.0) / 2.0;
143  Real val_check_v = std::abs(v) - std::sqrt(2.0) / 2.0;
144  if (val_check_u < 1e-5 && val_check_v < 1e-5)
145  {
146  circle_points[i](0) = u * 2.0 / std::sqrt(2);
147  circle_points[i](1) = v * 2.0 / std::sqrt(2);
148  }
149  else
150  {
151  circle_points[i](0) =
152  0.5 * std::sqrt(2. + std::pow(u, 2) - std::pow(v, 2) + 2. * u * std::sqrt(2)) -
153  0.5 * std::sqrt(2. + std::pow(u, 2) - std::pow(v, 2) - 2. * u * std::sqrt(2));
154  circle_points[i](1) =
155  0.5 * std::sqrt(2. - std::pow(u, 2) + std::pow(v, 2) + 2. * v * std::sqrt(2)) -
156  0.5 * std::sqrt(2. - std::pow(u, 2) + std::pow(v, 2) - 2. * v * std::sqrt(2));
157  }
158  circle_points[i](0) *= _assembly_side_x / 2.0;
159  circle_points[i](1) *= _assembly_side_y / 2.0;
160  theta += 2 * M_PI / theta_res;
161  }
162  }
163  // Define "quadrant center" reference points. These will be the centers of
164  // the 4 circles that represent the fuel pins. These centers are
165  // offset a little bit so that in the final mesh, there is a tiny assembly_pitch between
166  // neighboring subchannel cells. That allows us to easily map a solution to
167  // this detailed mesh with a nearest-neighbor search.
168  const Real shrink_factor = 0.99999;
169  std::array<Point, 4> quadrant_centers;
170  quadrant_centers[0] =
171  Point(_assembly_pitch * 0.5 * shrink_factor, _assembly_pitch * 0.5 * shrink_factor, 0);
172  quadrant_centers[1] =
173  Point(-_assembly_pitch * 0.5 * shrink_factor, _assembly_pitch * 0.5 * shrink_factor, 0);
174  quadrant_centers[2] =
175  Point(-_assembly_pitch * 0.5 * shrink_factor, -_assembly_pitch * 0.5 * shrink_factor, 0);
176  quadrant_centers[3] =
177  Point(_assembly_pitch * 0.5 * shrink_factor, -_assembly_pitch * 0.5 * shrink_factor, 0);
178 
179  const unsigned int m = theta_res / 4;
180  // Build an array of points that represent a cross section of a center subchannel
181  // cell. The points are ordered in this fashion:
182  // 4 3
183  // 6 5 2 1
184  // 0
185  // 7 8 * *
186  // 9 *
187  std::array<Point, points_per_center> center_points;
188  {
189  unsigned int start;
190  for (unsigned int i = 0; i < 4; i++)
191  {
192  if (i == 0)
193  start = 3 * m;
194  if (i == 1)
195  start = 4 * m;
196  if (i == 2)
197  start = 1 * m;
198  if (i == 3)
199  start = 2 * m;
200  for (unsigned int ii = 0; ii < points_per_quad; ii++)
201  {
202  auto c_pt = circle_points[start - ii];
203  center_points[i * points_per_quad + ii + 1] = quadrant_centers[i] + c_pt;
204  }
205  }
206  }
207 
208  // Build an array of points that represent a cross section of a top left corner subchannel
209  // cell. The points are ordered in this fashion:
210  // 5 4
211  //
212  // 0
213  // 2 3
214  // 6 1
215  std::array<Point, points_per_corner> tl_corner_points;
216  {
217  for (unsigned int ii = 0; ii < points_per_quad; ii++)
218  {
219  auto c_pt = circle_points[2 * m - ii];
220  tl_corner_points[ii + 1] = quadrant_centers[3] + c_pt;
221  }
222  tl_corner_points[points_per_quad + 1] =
223  Point(_assembly_pitch * 0.5 * shrink_factor, _side_bypass_length, 0);
224  tl_corner_points[points_per_quad + 2] = Point(-_side_bypass_length, +_side_bypass_length, 0);
225  tl_corner_points[points_per_quad + 3] =
226  Point(-_side_bypass_length, -_assembly_pitch * 0.5 * shrink_factor, 0);
227  }
228 
229  // Build an array of points that represent a cross section of a top right corner subchannel
230  // cell. The points are ordered in this fashion:
231  // 6 5
232  //
233  // 0
234  // 1 2
235  // 3 4
236  std::array<Point, points_per_corner> tr_corner_points;
237  {
238  for (unsigned int ii = 0; ii < points_per_quad; ii++)
239  {
240  auto c_pt = circle_points[m - ii];
241  tr_corner_points[ii + 1] = quadrant_centers[2] + c_pt;
242  }
243  tr_corner_points[points_per_quad + 1] =
244  Point(_side_bypass_length, -_assembly_pitch * 0.5 * shrink_factor, 0);
245  tr_corner_points[points_per_quad + 2] = Point(_side_bypass_length, _side_bypass_length, 0);
246  tr_corner_points[points_per_quad + 3] =
247  Point(-_assembly_pitch * 0.5 * shrink_factor, _side_bypass_length, 0);
248  }
249 
250  // Build an array of points that represent a cross section of a bottom left corner subchannel
251  // cell. The points are ordered in this fashion:
252  // 4 3
253  // 2 1
254  // 0
255  //
256  // 5 6
257  std::array<Point, points_per_corner> bl_corner_points;
258  {
259  for (unsigned int ii = 0; ii < points_per_quad; ii++)
260  {
261  auto c_pt = circle_points[3 * m - ii];
262  bl_corner_points[ii + 1] = quadrant_centers[0] + c_pt;
263  }
264  bl_corner_points[points_per_quad + 1] =
265  Point(-_side_bypass_length, _assembly_pitch * 0.5 * shrink_factor, 0);
266  bl_corner_points[points_per_quad + 2] = Point(-_side_bypass_length, -_side_bypass_length, 0);
267  bl_corner_points[points_per_quad + 3] =
268  Point(_assembly_pitch * 0.5 * shrink_factor, -_side_bypass_length, 0);
269  }
270 
271  // Build an array of points that represent a cross section of a bottom right corner subchannel
272  // cell. The points are ordered in this fashion:
273  // 1 6
274  // 3 2
275  // 0
276  //
277  // 4 5
278  std::array<Point, points_per_corner> br_corner_points;
279  {
280  for (unsigned int ii = 0; ii < points_per_quad; ii++)
281  {
282  auto c_pt = circle_points[4 * m - ii];
283  br_corner_points[ii + 1] = quadrant_centers[1] + c_pt;
284  }
285  br_corner_points[points_per_quad + 1] =
286  Point(-_assembly_pitch * 0.5 * shrink_factor, -_side_bypass_length, 0);
287  br_corner_points[points_per_quad + 2] = Point(_side_bypass_length, -_side_bypass_length, 0);
288  br_corner_points[points_per_quad + 3] =
289  Point(_side_bypass_length, _assembly_pitch * 0.5 * shrink_factor, 0);
290  }
291 
292  // Build an array of points that represent a cross section of a top side subchannel
293  // cell. The points are ordered in this fashion:
294  // 8 7
295  //
296  // 0
297  // 1 2 5 6
298  // 3 4
299  std::array<Point, points_per_side> top_points;
300  {
301  for (unsigned int ii = 0; ii < points_per_quad; ii++)
302  {
303  auto c_pt = circle_points[m - ii];
304  top_points[ii + 1] = quadrant_centers[2] + c_pt;
305  }
306  for (unsigned int ii = 0; ii < points_per_quad; ii++)
307  {
308  auto c_pt = circle_points[2 * m - ii];
309  top_points[points_per_quad + ii + 1] = quadrant_centers[3] + c_pt;
310  }
311  top_points[2 * points_per_quad + 1] =
312  Point(_assembly_pitch * 0.5 * shrink_factor, _side_bypass_length, 0);
313  top_points[2 * points_per_quad + 2] =
314  Point(-_assembly_pitch * 0.5 * shrink_factor, _side_bypass_length, 0);
315  }
316 
317  // Build an array of points that represent a cross section of a left side subchannel
318  // cell. The points are ordered in this fashion:
319  // 7 6
320  // 5 4
321  // 0
322  // 2 3
323  // 8 1
324  std::array<Point, points_per_side> left_points;
325  {
326  for (unsigned int ii = 0; ii < points_per_quad; ii++)
327  {
328  auto c_pt = circle_points[2 * m - ii];
329  left_points[ii + 1] = quadrant_centers[3] + c_pt;
330  }
331  for (unsigned int ii = 0; ii < points_per_quad; ii++)
332  {
333  auto c_pt = circle_points[3 * m - ii];
334  left_points[points_per_quad + ii + 1] = quadrant_centers[0] + c_pt;
335  }
336  left_points[2 * points_per_quad + 1] =
337  Point(-_side_bypass_length, _assembly_pitch * 0.5 * shrink_factor, 0);
338  left_points[2 * points_per_quad + 2] =
339  Point(-_side_bypass_length, -_assembly_pitch * 0.5 * shrink_factor, 0);
340  }
341 
342  // Build an array of points that represent a cross section of a bottom side subchannel
343  // cell. The points are ordered in this fashion:
344  // 4 3
345  // 6 5 2 1
346  // 0
347  //
348  // 7 8
349  std::array<Point, points_per_side> bottom_points;
350  {
351  for (unsigned int ii = 0; ii < points_per_quad; ii++)
352  {
353  auto c_pt = circle_points[3 * m - ii];
354  bottom_points[ii + 1] = quadrant_centers[0] + c_pt;
355  }
356  for (unsigned int ii = 0; ii < points_per_quad; ii++)
357  {
358  auto c_pt = circle_points[4 * m - ii];
359  bottom_points[points_per_quad + ii + 1] = quadrant_centers[1] + c_pt;
360  }
361  bottom_points[2 * points_per_quad + 1] =
362  Point(-_assembly_pitch * 0.5 * shrink_factor, -_side_bypass_length, 0);
363  bottom_points[2 * points_per_quad + 2] =
364  Point(_assembly_pitch * 0.5 * shrink_factor, -_side_bypass_length, 0);
365  }
366 
367  // Build an array of points that represent a cross section of a right side subchannel
368  // cell. The points are ordered in this fashion:
369  // 1 8
370  // 3 2
371  // 0
372  // 4 5
373  // 6 7
374  std::array<Point, points_per_side> right_points;
375  {
376  for (unsigned int ii = 0; ii < points_per_quad; ii++)
377  {
378  auto c_pt = circle_points[4 * m - ii];
379  right_points[ii + 1] = quadrant_centers[1] + c_pt;
380  }
381  for (unsigned int ii = 0; ii < points_per_quad; ii++)
382  {
383  auto c_pt = circle_points[m - ii];
384  right_points[points_per_quad + ii + 1] = quadrant_centers[2] + c_pt;
385  }
386  right_points[2 * points_per_quad + 1] =
387  Point(_side_bypass_length, -_assembly_pitch * 0.5 * shrink_factor, 0);
388  right_points[2 * points_per_quad + 2] =
389  Point(_side_bypass_length, _assembly_pitch * 0.5 * shrink_factor, 0);
390  }
391 
392  // Add the points to the mesh.
393 
394  unsigned int node_id = 0;
395  Real offset_x = (_nx - 1) * _assembly_pitch / 2.0;
396  Real offset_y = (_ny - 1) * _assembly_pitch / 2.0;
397  for (unsigned int iy = 0; iy < _ny; iy++)
398  {
399  Point y0 = {0, _assembly_pitch * iy - offset_y, 0};
400  for (unsigned int ix = 0; ix < _nx; ix++)
401  {
402  Point x0 = {_assembly_pitch * ix - offset_x, 0, 0};
403  if (ix == 0 && iy == 0) // Bottom Left corner
404  {
405  for (auto z : _z_grid)
406  {
407  Point z0{0, 0, z};
408  for (unsigned int i = 0; i < points_per_corner; i++)
409  mesh_base->add_point(bl_corner_points[i] + x0 + y0 + z0, node_id++);
410  }
411  }
412  else if (ix == _nx - 1 && iy == 0) // Bottom right corner
413  {
414  for (auto z : _z_grid)
415  {
416  Point z0{0, 0, z};
417  for (unsigned int i = 0; i < points_per_corner; i++)
418  mesh_base->add_point(br_corner_points[i] + x0 + y0 + z0, node_id++);
419  }
420  }
421  else if (ix == 0 && iy == _ny - 1) // top Left corner
422  {
423  for (auto z : _z_grid)
424  {
425  Point z0{0, 0, z};
426  for (unsigned int i = 0; i < points_per_corner; i++)
427  mesh_base->add_point(tl_corner_points[i] + x0 + y0 + z0, node_id++);
428  }
429  }
430  else if (ix == _nx - 1 && iy == _ny - 1) // top right corner
431  {
432  for (auto z : _z_grid)
433  {
434  Point z0{0, 0, z};
435  for (unsigned int i = 0; i < points_per_corner; i++)
436  mesh_base->add_point(tr_corner_points[i] + x0 + y0 + z0, node_id++);
437  }
438  }
439  else if (ix == 0 && (iy != _ny - 1 || iy != 0)) // left side
440  {
441  for (auto z : _z_grid)
442  {
443  Point z0{0, 0, z};
444  for (unsigned int i = 0; i < points_per_side; i++)
445  mesh_base->add_point(left_points[i] + x0 + y0 + z0, node_id++);
446  }
447  }
448  else if (ix == _nx - 1 && (iy != _ny - 1 || iy != 0)) // right side
449  {
450  for (auto z : _z_grid)
451  {
452  Point z0{0, 0, z};
453  for (unsigned int i = 0; i < points_per_side; i++)
454  mesh_base->add_point(right_points[i] + x0 + y0 + z0, node_id++);
455  }
456  }
457  else if (iy == 0 && (ix != _nx - 1 || ix != 0)) // bottom side
458  {
459  for (auto z : _z_grid)
460  {
461  Point z0{0, 0, z};
462  for (unsigned int i = 0; i < points_per_side; i++)
463  mesh_base->add_point(bottom_points[i] + x0 + y0 + z0, node_id++);
464  }
465  }
466  else if (iy == _ny - 1 && (ix != _nx - 1 || ix != 0)) // top side
467  {
468  for (auto z : _z_grid)
469  {
470  Point z0{0, 0, z};
471  for (unsigned int i = 0; i < points_per_side; i++)
472  mesh_base->add_point(top_points[i] + x0 + y0 + z0, node_id++);
473  }
474  }
475  else // center
476  {
477  for (auto z : _z_grid)
478  {
479  Point z0{0, 0, z};
480  for (unsigned int i = 0; i < points_per_center; i++)
481  mesh_base->add_point(center_points[i] + x0 + y0 + z0, node_id++);
482  }
483  }
484  }
485  }
486 
487  // Add elements to the mesh. The elements are 6-node prisms. The
488  // bases of these prisms form a triangulated representation of an cross-section
489  // of a center subchannel.
490  unsigned int elem_id = 0;
491  unsigned int number_of_corner = 0;
492  unsigned int number_of_side = 0;
493  unsigned int number_of_center = 0;
494  unsigned int elems_per_channel = 0;
495  unsigned int points_per_channel = 0;
496  for (unsigned int iy = 0; iy < _ny; iy++)
497  {
498  for (unsigned int ix = 0; ix < _nx; ix++)
499  {
500  unsigned int i_ch = _nx * iy + ix;
501  auto subch_type = getSubchannelType(i_ch);
502  if (subch_type == EChannelType::CORNER)
503  {
504  number_of_corner++;
505  elems_per_channel = elems_per_corner;
506  points_per_channel = points_per_corner;
507  }
508  else if (subch_type == EChannelType::EDGE)
509  {
510  number_of_side++;
511  elems_per_channel = elems_per_side;
512  points_per_channel = points_per_side;
513  }
514  else
515  {
516  number_of_center++;
517  elems_per_channel = elems_per_center;
518  points_per_channel = points_per_center;
519  }
520  for (unsigned int iz = 0; iz < _n_cells; iz++)
521  {
522  unsigned int elapsed_points = number_of_corner * points_per_corner * (_n_cells + 1) +
523  number_of_side * points_per_side * (_n_cells + 1) +
524  number_of_center * points_per_center * (_n_cells + 1) -
525  points_per_channel * (_n_cells + 1);
526  // index of the central node at base of cell
527  unsigned int indx1 = iz * points_per_channel + elapsed_points;
528  // index of the central node at top of cell
529  unsigned int indx2 = (iz + 1) * points_per_channel + elapsed_points;
530 
531  for (unsigned int i = 0; i < elems_per_channel; i++)
532  {
533  Elem * elem = new Prism6;
534  elem->subdomain_id() = _block_id;
535  elem->set_id(elem_id++);
536  elem = mesh_base->add_elem(elem);
537 
538  elem->set_node(0, mesh_base->node_ptr(indx1));
539  elem->set_node(1, mesh_base->node_ptr(indx1 + i + 1));
540  if (i != elems_per_channel - 1)
541  elem->set_node(2, mesh_base->node_ptr(indx1 + i + 2));
542  else
543  elem->set_node(2, mesh_base->node_ptr(indx1 + 1));
544 
545  elem->set_node(3, mesh_base->node_ptr(indx2));
546  elem->set_node(4, mesh_base->node_ptr(indx2 + i + 1));
547  if (i != elems_per_channel - 1)
548  elem->set_node(5, mesh_base->node_ptr(indx2 + i + 2));
549  else
550  elem->set_node(5, mesh_base->node_ptr(indx2 + 1));
551 
552  if (iz == 0)
553  boundary_info.add_side(elem, 0, 0);
554  if (iz == _n_cells - 1)
555  boundary_info.add_side(elem, 4, 1);
556  }
557  }
558  }
559  }
560  boundary_info.sideset_name(0) = "inlet";
561  boundary_info.sideset_name(1) = "outlet";
562  mesh_base->subdomain_name(_block_id) = name();
563  mesh_base->prepare_for_use();
564 
565  return mesh_base;
566 }
const Real radius
const unsigned int _nx
Number of subchannels in the x direction.
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
std::vector< Real > _z_grid
axial location of nodes
const unsigned int _ny
Number of subchannels in the y direction.
virtual const std::string & name() const
void addRequiredParam(const std::string &name, const std::string &doc_string)
const Real _side_bypass_length
Half of gap between adjacent assemblies.
virtual std::unique_ptr< MeshBase > generate() override
const Real _unheated_length_entry
unheated length of the fuel Pin at the entry of the assembly
std::vector< EChannelType > _subch_type
Subchannel type.
static InputParameters validParams()
const Real _unheated_length_exit
unheated length of the fuel Pin at the exit of the assembly
const Real _assembly_pitch
Distance between the neighbor fuel pins, pitch.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::string v
Definition: NS.h:84
SCMDetailedQuadInterWrapperMeshGenerator(const InputParameters &parameters)
void addClassDescription(const std::string &doc_string)
registerMooseObject("SubChannelApp", SCMDetailedQuadInterWrapperMeshGenerator)
const unsigned int _n_cells
Number of cells in the axial direction.
registerMooseObjectRenamed("SubChannelApp", DetailedQuadInterWrapperMeshGenerator, "06/30/2025 24:00", SCMDetailedQuadInterWrapperMeshGenerator)
std::unique_ptr< MeshBase > buildMeshBaseObject(unsigned int dim=libMesh::invalid_uint)
const unsigned int & _block_id
Subdomain ID used for the mesh block.
Mesh generator that builds a 3D mesh representing quadrilateral subchannels.
MooseUnits pow(const MooseUnits &, int)
void ErrorVector unsigned int