13 #include "libmesh/cell_prism6.h" 14 #include "libmesh/unstructured_mesh.h" 22 SCMDetailedQuadSubChannelMeshGenerator,
26 DetailedQuadSubChannelMeshGenerator,
30 SCMDetailedQuadPinMeshGenerator,
34 DetailedQuadPinMeshGenerator,
43 "Creates a detailed mesh of subchannels and fuel pins in a square lattice arrangement");
46 params.
addParam<
Real>(
"unheated_length_entry", 0.0,
"Unheated length at entry [m]");
48 params.
addParam<
Real>(
"unheated_length_exit", 0.0,
"Unheated length at exit [m]");
49 params.
addRequiredParam<
unsigned int>(
"n_cells",
"The number of cells in the axial direction");
50 params.
addRequiredParam<
unsigned int>(
"nx",
"Number of channels in the x direction [-]");
51 params.
addRequiredParam<
unsigned int>(
"ny",
"Number of channels in the y direction [-]");
54 "The side gap, not to be confused with the gap between pins, this refers to the gap " 55 "next to the duct or else the distance between the subchannel centroid to the duct wall." 56 "distance(edge pin center, duct wall) = pitch / 2 + side_gap [m]");
60 "Number of azimuthal sectors used to discretize each " 61 "circular pin cross section.");
62 params.
addParam<
unsigned int>(
"subchannel_block_id", 0,
"Subchannel block id.");
63 params.
addParam<
unsigned int>(
"pin_block_id", 1,
"Fuel pin block id.");
70 _unheated_length_entry(getParam<
Real>(
"unheated_length_entry")),
71 _heated_length(getParam<
Real>(
"heated_length")),
72 _unheated_length_exit(getParam<
Real>(
"unheated_length_exit")),
73 _pitch(getParam<
Real>(
"pitch")),
74 _pin_diameter(getParam<
Real>(
"pin_diameter")),
75 _n_cells(getParam<unsigned
int>(
"n_cells")),
76 _nx(getParam<unsigned
int>(
"nx")),
77 _ny(getParam<unsigned
int>(
"ny")),
79 _side_gap(getParam<
Real>(
"side_gap")),
80 _num_sectors(getParam<unsigned
int>(
"num_sectors")),
81 _subchannel_block_id(getParam<unsigned
int>(
"subchannel_block_id")),
82 _pin_block_id(getParam<unsigned
int>(
"pin_block_id")),
88 paramError(
"n_cells",
"The number of axial cells must be greater than zero");
91 mooseError(
"Total bundle length must be greater than zero");
94 mooseError(
"The number of subchannels must be greater than zero in each direction");
97 mooseError(
"The number of subchannels cannot be less than 2 in both directions. " 98 "Smallest assembly allowed is either 2X1 or 1X2.");
103 for (
unsigned int i = 0; i <
_n_cells + 1; i++)
110 for (
unsigned int j = 0;
j < 3;
j++)
115 for (
unsigned int iy = 0; iy <
_ny; iy++)
116 for (
unsigned int ix = 0; ix <
_nx; ix++)
118 const unsigned int i_ch =
_nx * iy + ix;
119 const bool is_corner = (ix == 0 && iy == 0) || (ix ==
_nx - 1 && iy == 0) ||
120 (ix == 0 && iy ==
_ny - 1) || (ix ==
_nx - 1 && iy ==
_ny - 1);
121 const bool is_edge = (ix == 0 || iy == 0 || ix ==
_nx - 1 || iy ==
_ny - 1);
147 std::vector<std::vector<Node *>> nodes;
152 nodes[
k].push_back(mesh_base->add_point(Point(
center(0),
center(1), elev)));
158 nodes[
k].push_back(mesh_base->add_point(Point(
center(0) + dx,
center(1) + dy, elev)));
166 Elem * elem = mesh_base->add_elem(std::make_unique<Prism6>());
169 const unsigned int ctr_idx = 0;
172 elem->set_node(0, nodes[
k][ctr_idx]);
173 elem->set_node(1, nodes[
k][idx1]);
174 elem->set_node(2, nodes[
k][idx2]);
175 elem->set_node(3, nodes[
k + 1][ctr_idx]);
176 elem->set_node(4, nodes[
k + 1][idx1]);
177 elem->set_node(5, nodes[
k + 1][idx2]);
181 std::unique_ptr<MeshBase>
185 BoundaryInfo & boundary_info = mesh_base->get_boundary_info();
186 mesh_base->set_spatial_dimension(3);
190 const unsigned int n_pins = (
_nx - 1) * (
_ny - 1);
192 const unsigned int theta_res = 16;
194 const unsigned int points_per_quad = theta_res / 4 + 1;
201 const unsigned int points_per_center = points_per_quad * 4 + 1;
202 const unsigned int points_per_corner = points_per_quad * 1 + 1 + 3;
203 const unsigned int points_per_side = points_per_quad * 2 + 1 + 2;
206 const unsigned int elems_per_center = theta_res + 4;
207 const unsigned int elems_per_corner = theta_res / 4 + 4;
208 const unsigned int elems_per_side = theta_res / 2 + 4;
211 unsigned int n_center, n_side, n_corner;
227 n_side = 2 * (
_ny - 2) + 2 * (
_nx - 2);
231 const unsigned int points_per_level =
232 n_corner * points_per_corner + n_side * points_per_side + n_center * points_per_center;
233 const unsigned int elems_per_level =
234 n_corner * elems_per_corner + n_side * elems_per_side + n_center * elems_per_center;
237 std::vector<Point> pin_centers;
241 const unsigned int pin_points =
245 mesh_base->reserve_nodes(points_per_level * (
_n_cells + 1) + pin_points);
246 mesh_base->reserve_elem(elems_per_level *
_n_cells + pin_elems);
250 std::array<Point, theta_res + 1> circle_points;
253 for (
unsigned int i = 0; i < theta_res + 1; i++)
255 circle_points[i](0) =
radius * std::cos(theta);
256 circle_points[i](1) =
radius * std::sin(theta);
257 theta += 2 * M_PI / theta_res;
265 const Real shrink_factor = 0.99999;
266 std::array<Point, 4> quadrant_centers;
267 quadrant_centers[0] = Point(
_pitch * 0.5 * shrink_factor,
_pitch * 0.5 * shrink_factor, 0);
268 quadrant_centers[1] = Point(-
_pitch * 0.5 * shrink_factor,
_pitch * 0.5 * shrink_factor, 0);
269 quadrant_centers[2] = Point(-
_pitch * 0.5 * shrink_factor, -
_pitch * 0.5 * shrink_factor, 0);
270 quadrant_centers[3] = Point(
_pitch * 0.5 * shrink_factor, -
_pitch * 0.5 * shrink_factor, 0);
272 const unsigned int m = theta_res / 4;
280 std::array<Point, points_per_center> center_points;
283 for (
unsigned int i = 0; i < 4; i++)
293 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
295 auto c_pt = circle_points[start - ii];
296 center_points[i * points_per_quad + ii + 1] = quadrant_centers[i] + c_pt;
308 std::array<Point, points_per_corner> tl_corner_points;
310 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
312 auto c_pt = circle_points[2 * m - ii];
313 tl_corner_points[ii + 1] = quadrant_centers[3] + c_pt;
315 tl_corner_points[points_per_quad + 1] = Point(
_pitch * 0.5 * shrink_factor,
_side_gap, 0);
317 tl_corner_points[points_per_quad + 3] = Point(-
_side_gap, -
_pitch * 0.5 * shrink_factor, 0);
327 std::array<Point, points_per_corner> tr_corner_points;
329 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
331 auto c_pt = circle_points[m - ii];
332 tr_corner_points[ii + 1] = quadrant_centers[2] + c_pt;
334 tr_corner_points[points_per_quad + 1] = Point(
_side_gap, -
_pitch * 0.5 * shrink_factor, 0);
336 tr_corner_points[points_per_quad + 3] = Point(-
_pitch * 0.5 * shrink_factor,
_side_gap, 0);
346 std::array<Point, points_per_corner> bl_corner_points;
348 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
350 auto c_pt = circle_points[3 * m - ii];
351 bl_corner_points[ii + 1] = quadrant_centers[0] + c_pt;
353 bl_corner_points[points_per_quad + 1] = Point(-
_side_gap,
_pitch * 0.5 * shrink_factor, 0);
355 bl_corner_points[points_per_quad + 3] = Point(
_pitch * 0.5 * shrink_factor, -
_side_gap, 0);
365 std::array<Point, points_per_corner> br_corner_points;
367 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
369 auto c_pt = circle_points[4 * m - ii];
370 br_corner_points[ii + 1] = quadrant_centers[1] + c_pt;
372 br_corner_points[points_per_quad + 1] = Point(-
_pitch * 0.5 * shrink_factor, -
_side_gap, 0);
374 br_corner_points[points_per_quad + 3] = Point(
_side_gap,
_pitch * 0.5 * shrink_factor, 0);
384 std::array<Point, points_per_side> top_points;
386 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
388 auto c_pt = circle_points[m - ii];
389 top_points[ii + 1] = quadrant_centers[2] + c_pt;
391 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
393 auto c_pt = circle_points[2 * m - ii];
394 top_points[points_per_quad + ii + 1] = quadrant_centers[3] + c_pt;
396 top_points[2 * points_per_quad + 1] = Point(
_pitch * 0.5 * shrink_factor,
_side_gap, 0);
397 top_points[2 * points_per_quad + 2] = Point(-
_pitch * 0.5 * shrink_factor,
_side_gap, 0);
407 std::array<Point, points_per_side> left_points;
409 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
411 auto c_pt = circle_points[2 * m - ii];
412 left_points[ii + 1] = quadrant_centers[3] + c_pt;
414 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
416 auto c_pt = circle_points[3 * m - ii];
417 left_points[points_per_quad + ii + 1] = quadrant_centers[0] + c_pt;
419 left_points[2 * points_per_quad + 1] = Point(-
_side_gap,
_pitch * 0.5 * shrink_factor, 0);
420 left_points[2 * points_per_quad + 2] = Point(-
_side_gap, -
_pitch * 0.5 * shrink_factor, 0);
430 std::array<Point, points_per_side> bottom_points;
432 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
434 auto c_pt = circle_points[3 * m - ii];
435 bottom_points[ii + 1] = quadrant_centers[0] + c_pt;
437 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
439 auto c_pt = circle_points[4 * m - ii];
440 bottom_points[points_per_quad + ii + 1] = quadrant_centers[1] + c_pt;
442 bottom_points[2 * points_per_quad + 1] = Point(-
_pitch * 0.5 * shrink_factor, -
_side_gap, 0);
443 bottom_points[2 * points_per_quad + 2] = Point(
_pitch * 0.5 * shrink_factor, -
_side_gap, 0);
453 std::array<Point, points_per_side> right_points;
455 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
457 auto c_pt = circle_points[4 * m - ii];
458 right_points[ii + 1] = quadrant_centers[1] + c_pt;
460 for (
unsigned int ii = 0; ii < points_per_quad; ii++)
462 auto c_pt = circle_points[m - ii];
463 right_points[points_per_quad + ii + 1] = quadrant_centers[2] + c_pt;
465 right_points[2 * points_per_quad + 1] = Point(
_side_gap, -
_pitch * 0.5 * shrink_factor, 0);
466 right_points[2 * points_per_quad + 2] = Point(
_side_gap,
_pitch * 0.5 * shrink_factor, 0);
472 unsigned int node_id = 0;
475 for (
unsigned int iy = 0; iy <
_ny; iy++)
477 Point y0 = {0,
_pitch * iy - offset_y, 0};
478 for (
unsigned int ix = 0; ix <
_nx; ix++)
480 Point x0 = {
_pitch * ix - offset_x, 0, 0};
484 if (
_nx == 1 && iy == 0)
485 for (
unsigned int i = 0; i < points_per_side; i++)
486 mesh_base->add_point(bottom_points[i] + x0 + y0 + z0, node_id++);
487 if (
_nx == 1 && iy == 1)
488 for (
unsigned int i = 0; i < points_per_side; i++)
489 mesh_base->add_point(top_points[i] + x0 + y0 + z0, node_id++);
490 if (
_ny == 1 && ix == 0)
491 for (
unsigned int i = 0; i < points_per_side; i++)
492 mesh_base->add_point(left_points[i] + x0 + y0 + z0, node_id++);
493 if (
_ny == 1 && ix == 1)
494 for (
unsigned int i = 0; i < points_per_side; i++)
495 mesh_base->add_point(right_points[i] + x0 + y0 + z0, node_id++);
504 unsigned int node_id = 0;
507 for (
unsigned int iy = 0; iy <
_ny; iy++)
509 Point y0 = {0,
_pitch * iy - offset_y, 0};
510 for (
unsigned int ix = 0; ix <
_nx; ix++)
512 Point x0 = {
_pitch * ix - offset_x, 0, 0};
519 for (
unsigned int i = 0; i < points_per_side; i++)
520 mesh_base->add_point(bottom_points[i] + x0 + y0 + z0, node_id++);
521 else if (iy ==
_ny - 1)
522 for (
unsigned int i = 0; i < points_per_side; i++)
523 mesh_base->add_point(top_points[i] + x0 + y0 + z0, node_id++);
525 for (
unsigned int i = 0; i < points_per_center; i++)
526 mesh_base->add_point(center_points[i] + x0 + y0 + z0, node_id++);
531 for (
unsigned int i = 0; i < points_per_side; i++)
532 mesh_base->add_point(left_points[i] + x0 + y0 + z0, node_id++);
533 else if (ix ==
_nx - 1)
534 for (
unsigned int i = 0; i < points_per_side; i++)
535 mesh_base->add_point(right_points[i] + x0 + y0 + z0, node_id++);
537 for (
unsigned int i = 0; i < points_per_center; i++)
538 mesh_base->add_point(center_points[i] + x0 + y0 + z0, node_id++);
547 unsigned int node_id = 0;
550 for (
unsigned int iy = 0; iy <
_ny; iy++)
552 Point y0 = {0,
_pitch * iy - offset_y, 0};
553 for (
unsigned int ix = 0; ix <
_nx; ix++)
555 Point x0 = {
_pitch * ix - offset_x, 0, 0};
556 if (ix == 0 && iy == 0)
560 for (
unsigned int i = 0; i < points_per_corner; i++)
561 mesh_base->add_point(bl_corner_points[i] + x0 + y0 + z0, node_id++);
563 else if (ix ==
_nx - 1 && iy == 0)
567 for (
unsigned int i = 0; i < points_per_corner; i++)
568 mesh_base->add_point(br_corner_points[i] + x0 + y0 + z0, node_id++);
570 else if (ix == 0 && iy ==
_ny - 1)
574 for (
unsigned int i = 0; i < points_per_corner; i++)
575 mesh_base->add_point(tl_corner_points[i] + x0 + y0 + z0, node_id++);
577 else if (ix ==
_nx - 1 && iy ==
_ny - 1)
581 for (
unsigned int i = 0; i < points_per_corner; i++)
582 mesh_base->add_point(tr_corner_points[i] + x0 + y0 + z0, node_id++);
584 else if (ix == 0 && (iy !=
_ny - 1 || iy != 0))
588 for (
unsigned int i = 0; i < points_per_side; i++)
589 mesh_base->add_point(left_points[i] + x0 + y0 + z0, node_id++);
591 else if (ix ==
_nx - 1 && (iy !=
_ny - 1 || iy != 0))
595 for (
unsigned int i = 0; i < points_per_side; i++)
596 mesh_base->add_point(right_points[i] + x0 + y0 + z0, node_id++);
598 else if (iy == 0 && (ix !=
_nx - 1 || ix != 0))
602 for (
unsigned int i = 0; i < points_per_side; i++)
603 mesh_base->add_point(bottom_points[i] + x0 + y0 + z0, node_id++);
605 else if (iy ==
_ny - 1 && (ix !=
_nx - 1 || ix != 0))
609 for (
unsigned int i = 0; i < points_per_side; i++)
610 mesh_base->add_point(top_points[i] + x0 + y0 + z0, node_id++);
616 for (
unsigned int i = 0; i < points_per_center; i++)
617 mesh_base->add_point(center_points[i] + x0 + y0 + z0, node_id++);
626 for (
unsigned int iy = 0; iy <
_ny; iy++)
627 for (
unsigned int ix = 0; ix <
_nx; ix++)
629 const unsigned int i_ch =
_nx * iy + ix;
630 for (
unsigned int iz = 0; iz <
_n_cells; iz++)
631 for (
unsigned int i = 0; i < elems_per_side; i++)
633 Elem * elem = mesh_base->add_elem(std::make_unique<Prism6>());
637 const unsigned int indx1 =
638 iz * points_per_side + points_per_side * (
_n_cells + 1) * i_ch;
639 const unsigned int indx2 =
640 (iz + 1) * points_per_side + points_per_side * (
_n_cells + 1) * i_ch;
641 const unsigned int elems_per_channel = elems_per_side;
642 elem->set_node(0, mesh_base->node_ptr(indx1));
643 elem->set_node(1, mesh_base->node_ptr(indx1 + i + 1));
645 i != elems_per_channel - 1 ? mesh_base->node_ptr(indx1 + i + 2)
646 : mesh_base->node_ptr(indx1 + 1));
647 elem->set_node(3, mesh_base->node_ptr(indx2));
648 elem->set_node(4, mesh_base->node_ptr(indx2 + i + 1));
650 i != elems_per_channel - 1 ? mesh_base->node_ptr(indx2 + i + 2)
651 : mesh_base->node_ptr(indx2 + 1));
654 boundary_info.add_side(elem, 0, 0);
656 boundary_info.add_side(elem, 4, 1);
663 unsigned int number_of_corner = 0;
664 unsigned int number_of_side = 0;
665 unsigned int number_of_center = 0;
666 unsigned int elems_per_channel = 0;
667 unsigned int points_per_channel = 0;
668 for (
unsigned int iy = 0; iy <
_ny; iy++)
669 for (
unsigned int ix = 0; ix <
_nx; ix++)
671 const unsigned int i_ch =
_nx * iy + ix;
676 elems_per_channel = elems_per_side;
677 points_per_channel = points_per_side;
682 elems_per_channel = elems_per_center;
683 points_per_channel = points_per_center;
686 for (
unsigned int iz = 0; iz <
_n_cells; iz++)
688 const unsigned int elapsed_points =
689 number_of_corner * points_per_corner * (
_n_cells + 1) +
690 number_of_side * points_per_side * (
_n_cells + 1) +
691 number_of_center * points_per_center * (
_n_cells + 1) -
692 points_per_channel * (
_n_cells + 1);
694 const unsigned int indx1 = iz * points_per_channel + elapsed_points;
695 const unsigned int indx2 = (iz + 1) * points_per_channel + elapsed_points;
697 for (
unsigned int i = 0; i < elems_per_channel; i++)
699 Elem * elem = mesh_base->add_elem(std::make_unique<Prism6>());
702 elem->set_node(0, mesh_base->node_ptr(indx1));
703 elem->set_node(1, mesh_base->node_ptr(indx1 + i + 1));
705 i != elems_per_channel - 1 ? mesh_base->node_ptr(indx1 + i + 2)
706 : mesh_base->node_ptr(indx1 + 1));
707 elem->set_node(3, mesh_base->node_ptr(indx2));
708 elem->set_node(4, mesh_base->node_ptr(indx2 + i + 1));
710 i != elems_per_channel - 1 ? mesh_base->node_ptr(indx2 + i + 2)
711 : mesh_base->node_ptr(indx2 + 1));
714 boundary_info.add_side(elem, 0, 0);
716 boundary_info.add_side(elem, 4, 1);
724 unsigned int number_of_corner = 0;
725 unsigned int number_of_side = 0;
726 unsigned int number_of_center = 0;
727 unsigned int elems_per_channel = 0;
728 unsigned int points_per_channel = 0;
729 for (
unsigned int iy = 0; iy <
_ny; iy++)
730 for (
unsigned int ix = 0; ix <
_nx; ix++)
732 const unsigned int i_ch =
_nx * iy + ix;
737 elems_per_channel = elems_per_corner;
738 points_per_channel = points_per_corner;
743 elems_per_channel = elems_per_side;
744 points_per_channel = points_per_side;
749 elems_per_channel = elems_per_center;
750 points_per_channel = points_per_center;
753 for (
unsigned int iz = 0; iz <
_n_cells; iz++)
755 const unsigned int elapsed_points =
756 number_of_corner * points_per_corner * (
_n_cells + 1) +
757 number_of_side * points_per_side * (
_n_cells + 1) +
758 number_of_center * points_per_center * (
_n_cells + 1) -
759 points_per_channel * (
_n_cells + 1);
761 const unsigned int indx1 = iz * points_per_channel + elapsed_points;
762 const unsigned int indx2 = (iz + 1) * points_per_channel + elapsed_points;
764 for (
unsigned int i = 0; i < elems_per_channel; i++)
766 Elem * elem = mesh_base->add_elem(std::make_unique<Prism6>());
769 elem->set_node(0, mesh_base->node_ptr(indx1));
770 elem->set_node(1, mesh_base->node_ptr(indx1 + i + 1));
772 i != elems_per_channel - 1 ? mesh_base->node_ptr(indx1 + i + 2)
773 : mesh_base->node_ptr(indx1 + 1));
774 elem->set_node(3, mesh_base->node_ptr(indx2));
775 elem->set_node(4, mesh_base->node_ptr(indx2 + i + 1));
777 i != elems_per_channel - 1 ? mesh_base->node_ptr(indx2 + i + 2)
778 : mesh_base->node_ptr(indx2 + 1));
781 boundary_info.add_side(elem, 0, 0);
783 boundary_info.add_side(elem, 4, 1);
790 for (
auto & ctr : pin_centers)
793 boundary_info.sideset_name(0) =
"inlet";
794 boundary_info.sideset_name(1) =
"outlet";
798 mesh_base->prepare_for_use();
const unsigned int _n_cells
Number of cells in the axial direction.
void paramError(const std::string ¶m, Args... args) const
SCMDetailedQuadAssemblyMeshGenerator(const InputParameters ¶meters)
const Real _unheated_length_entry
unheated length of the fuel Pin at the entry of the assembly
const unsigned int _subchannel_block_id
Subchannel subdomain ID.
const unsigned int _pin_block_id
Pin subdomain ID.
registerMooseObject("SubChannelApp", SCMDetailedQuadAssemblyMeshGenerator)
virtual std::unique_ptr< MeshBase > generate() override
std::vector< Real > _z_grid
axial location of nodes
dof_id_type _elem_id
Counter for element numbering.
const Real _pitch
Distance between the neighbor fuel pins, pitch.
std::vector< EChannelType > _subch_type
Subchannel type.
Mesh generator that builds a detailed 3D mesh representing quadrilateral subchannels and pins...
registerMooseObjectRenamed("SubChannelApp", SCMDetailedQuadSubChannelMeshGenerator, "06/30/2027 24:00", SCMDetailedQuadAssemblyMeshGenerator)
static InputParameters validParams()
const unsigned int _nx
Number of subchannels in the x direction.
static InputParameters validParams()
static void generatePinCenters(unsigned int nx, unsigned int ny, Real pitch, Real elev, std::vector< Point > &pin_centers)
Generate pin centers.
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...
const unsigned int _num_sectors
Number of azimuthal sectors used to discretize each circular pin cross section.
const Real _pin_diameter
fuel Pin diameter
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const Real _heated_length
heated length of the fuel Pin
static const std::string alpha
unsigned int _n_channels
Total number of subchannels.
void generatePin(std::unique_ptr< MeshBase > &mesh_base, const Point ¢er)
Generate one detailed fuel pin volume centered at the supplied point.
void mooseError(Args &&... args) const
EChannelType getSubchannelType(unsigned int index) const
returns the type of the subchannel given the index
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
std::unique_ptr< MeshBase > buildMeshBaseObject(unsigned int dim=libMesh::invalid_uint)
const Real _unheated_length_exit
unheated length of the fuel Pin at the exit of the assembly
const unsigned int _ny
Number of subchannels in the y direction.
static const std::string k
std::vector< std::vector< Real > > _subchannel_position
x,y coordinates of the subchannel centroids
void ErrorVector unsigned int
static const std::string center