From d66fcfe9e90848fd85b75f8e490bbd944721cdf4 Mon Sep 17 00:00:00 2001 From: Vasileios Kyriakopoulos Date: Tue, 21 Apr 2026 13:03:51 -0600 Subject: [PATCH 1/6] create merged quad assembly Refs #32796 --- .../include/mesh/QuadSubChannelMesh.h | 1 + .../subchannel/include/mesh/SubChannelMesh.h | 2 + .../SCMQuadAssemblyMeshGenerator.h | 72 +++ .../SCMQuadAssemblyMeshGenerator.C | 493 ++++++++++++++++++ .../tests/problems/psbt/psbt_monolithic.i | 45 +- 5 files changed, 598 insertions(+), 15 deletions(-) create mode 100644 modules/subchannel/include/meshgenerators/SCMQuadAssemblyMeshGenerator.h create mode 100644 modules/subchannel/src/meshgenerators/SCMQuadAssemblyMeshGenerator.C diff --git a/modules/subchannel/include/mesh/QuadSubChannelMesh.h b/modules/subchannel/include/mesh/QuadSubChannelMesh.h index f4e220114fb6..9a6a52342a78 100644 --- a/modules/subchannel/include/mesh/QuadSubChannelMesh.h +++ b/modules/subchannel/include/mesh/QuadSubChannelMesh.h @@ -154,4 +154,5 @@ class QuadSubChannelMesh : public SubChannelMesh friend class SCMQuadSubChannelMeshGenerator; friend class SCMQuadPinMeshGenerator; friend class QuadSubChannel1PhaseProblem; + friend class SCMQuadAssemblyMeshGenerator; }; diff --git a/modules/subchannel/include/mesh/SubChannelMesh.h b/modules/subchannel/include/mesh/SubChannelMesh.h index 8a19352b179c..ad5d60b61409 100644 --- a/modules/subchannel/include/mesh/SubChannelMesh.h +++ b/modules/subchannel/include/mesh/SubChannelMesh.h @@ -261,4 +261,6 @@ class SubChannelMesh : public MooseMesh Real unheated_length_exit, unsigned int n_cells, std::vector & z_grid); + + friend class SCMQuadAssemblyMeshGenerator; }; diff --git a/modules/subchannel/include/meshgenerators/SCMQuadAssemblyMeshGenerator.h b/modules/subchannel/include/meshgenerators/SCMQuadAssemblyMeshGenerator.h new file mode 100644 index 000000000000..0f54c5ee4e0f --- /dev/null +++ b/modules/subchannel/include/meshgenerators/SCMQuadAssemblyMeshGenerator.h @@ -0,0 +1,72 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#pragma once + +#include "MeshGenerator.h" +#include "QuadSubChannelMesh.h" + +class SCMQuadAssemblyMeshGenerator : public MeshGenerator +{ +public: + static InputParameters validParams(); + + SCMQuadAssemblyMeshGenerator(const InputParameters & params); + + virtual std::unique_ptr generate() override; + +protected: + void initializeChannelData(); + void buildSubchannelMesh(MeshBase & mesh_base, BoundaryInfo & boundary_info); + void buildPinMesh(MeshBase & mesh_base); + void transferMetadata(QuadSubChannelMesh & sch_mesh); + +protected: + Real _unheated_length_entry; + Real _heated_length; + Real _unheated_length_exit; + + std::vector _spacer_z; + std::vector _spacer_k; + std::vector _z_blockage; + std::vector _index_blockage; + std::vector _reduction_blockage; + std::vector _k_blockage; + + Real _kij; + Real _pitch; + Real _pin_diameter; + unsigned int _n_cells; + unsigned int _nx; + unsigned int _ny; + unsigned int _n_channels; + unsigned int _n_gaps; + unsigned int _n_pins; + Real _side_gap; + + unsigned int _subchannel_block_id; + unsigned int _pin_block_id; + + std::vector _z_grid; + std::vector> _k_grid; + + std::vector> _nodes; + std::vector> _pin_nodes; + std::vector> _gapnodes; + + std::vector> _gap_to_chan_map; + std::vector> _gap_to_pin_map; + std::vector> _chan_to_gap_map; + std::vector> _chan_to_pin_map; + std::vector> _pin_to_chan_map; + std::vector> _sign_id_crossflow_map; + std::vector> _gij_map; + std::vector> _subchannel_position; + std::vector _subch_type; +}; diff --git a/modules/subchannel/src/meshgenerators/SCMQuadAssemblyMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMQuadAssemblyMeshGenerator.C new file mode 100644 index 000000000000..0e9c021bc2b3 --- /dev/null +++ b/modules/subchannel/src/meshgenerators/SCMQuadAssemblyMeshGenerator.C @@ -0,0 +1,493 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#include "SCMQuadAssemblyMeshGenerator.h" +#include "SubChannelMesh.h" + +#include "libmesh/edge_edge2.h" + +#include +#include +#include +#include + +registerMooseObject("SubChannelApp", SCMQuadAssemblyMeshGenerator); + +InputParameters +SCMQuadAssemblyMeshGenerator::validParams() +{ + InputParameters params = MeshGenerator::validParams(); + params.addClassDescription("Creates one mesh containing both 1D subchannels and 1D pins in a " + "square lattice arrangement"); + + params.addRequiredParam("pitch", "Pitch [m]"); + params.addRequiredParam("pin_diameter", "Rod diameter [m]"); + params.addParam("unheated_length_entry", 0.0, "Unheated length at entry [m]"); + params.addRequiredParam("heated_length", "Heated length [m]"); + params.addParam("unheated_length_exit", 0.0, "Unheated length at exit [m]"); + + params.addParam>( + "spacer_z", {}, "Axial location of spacers/vanes/mixing_vanes [m]"); + params.addParam>( + "spacer_k", {}, "K-loss coefficient of spacers/vanes/mixing_vanes [-]"); + + params.addParam>("z_blockage", + std::vector({0.0, 0.0}), + "Axial location of blockage (inlet, outlet) [m]"); + params.addParam>("index_blockage", + std::vector({0}), + "Index of subchannels affected by blockage"); + params.addParam>("reduction_blockage", + std::vector({1.0}), + "Area reduction of subchannels affected by blockage"); + params.addParam>( + "k_blockage", std::vector({0.0}), "Form loss coefficient of blocked subchannels"); + + params.addParam("Kij", 0.5, "Lateral form loss coefficient [-]"); + params.addRequiredParam("n_cells", "The number of cells in the axial direction"); + params.addRequiredParam("nx", "Number of channels in the x direction [-]"); + params.addRequiredParam("ny", "Number of channels in the y direction [-]"); + + params.addRequiredParam( + "side_gap", + "The side gap, not to be confused with the gap between pins; this refers to the gap next " + "to the duct or else the distance between the subchannel centroid and the duct wall. " + "distance(edge pin center, duct wall) = pitch / 2 + side_gap [m]"); + + params.addParam("subchannel_block_id", 0, "Subchannel block id"); + params.addParam("pin_block_id", 1, "Fuel Pin block id"); + + return params; +} + +SCMQuadAssemblyMeshGenerator::SCMQuadAssemblyMeshGenerator(const InputParameters & params) + : MeshGenerator(params), + _unheated_length_entry(getParam("unheated_length_entry")), + _heated_length(getParam("heated_length")), + _unheated_length_exit(getParam("unheated_length_exit")), + _spacer_z(getParam>("spacer_z")), + _spacer_k(getParam>("spacer_k")), + _z_blockage(getParam>("z_blockage")), + _index_blockage(getParam>("index_blockage")), + _reduction_blockage(getParam>("reduction_blockage")), + _k_blockage(getParam>("k_blockage")), + _kij(getParam("Kij")), + _pitch(getParam("pitch")), + _pin_diameter(getParam("pin_diameter")), + _n_cells(getParam("n_cells")), + _nx(getParam("nx")), + _ny(getParam("ny")), + _n_channels(_nx * _ny), + _n_gaps((_nx - 1) * _ny + (_ny - 1) * _nx), + _n_pins((_nx - 1) * (_ny - 1)), + _side_gap(getParam("side_gap")), + _subchannel_block_id(getParam("subchannel_block_id")), + _pin_block_id(getParam("pin_block_id")) +{ + if (_spacer_z.size() != _spacer_k.size()) + mooseError(name(), ": Size of vector spacer_z should equal size of spacer_k"); + + if (_z_blockage.size() != 2) + mooseError(name(), ": Size of vector z_blockage must be 2"); + + if (_nx < 2 && _ny < 2) + mooseError(name(), + ": The number of subchannels cannot be less than 2 in both directions. " + "Smallest assembly allowed is either 2X1 or 1X2."); + + if (!_index_blockage.empty() && + *std::max_element(_index_blockage.begin(), _index_blockage.end()) > (_n_channels - 1)) + mooseError(name(), ": Blocked subchannel index exceeds valid subchannel range"); + + if (!_reduction_blockage.empty() && + *std::max_element(_reduction_blockage.begin(), _reduction_blockage.end()) > 1.0) + mooseError(name(), ": Area reduction of blocked subchannels cannot exceed 1"); + + if ((_index_blockage.size() > _n_channels) || (_reduction_blockage.size() > _n_channels) || + (_k_blockage.size() > _n_channels)) + mooseError(name(), + ": Sizes of blockage-related vectors cannot exceed total number of subchannels"); + + if ((_index_blockage.size() != _reduction_blockage.size()) || + (_index_blockage.size() != _k_blockage.size()) || + (_reduction_blockage.size() != _k_blockage.size())) + mooseError(name(), ": index_blockage, reduction_blockage, and k_blockage must have equal size"); + + SubChannelMesh::generateZGrid( + _unheated_length_entry, _heated_length, _unheated_length_exit, _n_cells, _z_grid); + + if (_spacer_z.size() && + _spacer_z.back() > _unheated_length_entry + _heated_length + _unheated_length_exit) + mooseError(name(), ": Location of spacers must be less than total bundle length"); + + initializeChannelData(); +} + +void +SCMQuadAssemblyMeshGenerator::initializeChannelData() +{ + const Real L = _unheated_length_entry + _heated_length + _unheated_length_exit; + + std::vector spacer_cell; + for (const auto & elem : _spacer_z) + spacer_cell.emplace_back(std::round(elem * _n_cells / L)); + + std::vector kgrid(_n_cells + 1, 0.0); + _k_grid.resize(_n_channels, std::vector(_n_cells + 1)); + + for (unsigned int index = 0; index < spacer_cell.size(); index++) + kgrid[spacer_cell[index]] += _spacer_k[index]; + + for (unsigned int i = 0; i < _n_channels; i++) + _k_grid[i] = kgrid; + + const Real dz = L / _n_cells; + for (unsigned int i = 0; i < _n_cells + 1; i++) + if ((dz * i >= _z_blockage.front() && dz * i <= _z_blockage.back())) + { + unsigned int index = 0; + for (const auto & i_ch : _index_blockage) + { + _k_grid[i_ch][i] += _k_blockage[index]; + index++; + } + } + + _gap_to_chan_map.resize(_n_gaps); + _gap_to_pin_map.resize(_n_gaps); + _gapnodes.resize(_n_gaps); + _chan_to_gap_map.resize(_n_channels); + _chan_to_pin_map.resize(_n_channels); + _pin_to_chan_map.resize(_n_pins); + _sign_id_crossflow_map.resize(_n_channels); + _gij_map.resize(_n_cells + 1); + _subchannel_position.resize(_n_channels); + + for (unsigned int i = 0; i < _n_channels; i++) + { + _subchannel_position[i].reserve(3); + for (unsigned int j = 0; j < 3; j++) + _subchannel_position.at(i).push_back(0.0); + } + + for (unsigned int iz = 0; iz < _n_cells + 1; iz++) + _gij_map[iz].reserve(_n_gaps); + + const Real positive_flow = 1.0; + const Real negative_flow = -1.0; + + _subch_type.resize(_n_channels); + for (unsigned int iy = 0; iy < _ny; iy++) + for (unsigned int ix = 0; ix < _nx; ix++) + { + const unsigned int i_ch = _nx * iy + ix; + const bool is_corner = (ix == 0 && iy == 0) || (ix == _nx - 1 && iy == 0) || + (ix == 0 && iy == _ny - 1) || (ix == _nx - 1 && iy == _ny - 1); + const bool is_edge = (ix == 0 || iy == 0 || ix == _nx - 1 || iy == _ny - 1); + + if (_n_channels == 2) + _subch_type[i_ch] = EChannelType::CENTER; + else if (_n_channels == 4) + _subch_type[i_ch] = EChannelType::CORNER; + else if (is_corner) + _subch_type[i_ch] = EChannelType::CORNER; + else if (is_edge) + _subch_type[i_ch] = EChannelType::EDGE; + else + _subch_type[i_ch] = EChannelType::CENTER; + } + + unsigned int i_gap = 0; + for (unsigned int iy = 0; iy < _ny; iy++) + for (unsigned int ix = 0; ix < _nx - 1; ix++) + { + const unsigned int i_ch = _nx * iy + ix; + const unsigned int j_ch = _nx * iy + (ix + 1); + _gap_to_chan_map[i_gap] = {i_ch, j_ch}; + _chan_to_gap_map[i_ch].push_back(i_gap); + _chan_to_gap_map[j_ch].push_back(i_gap); + _sign_id_crossflow_map[i_ch].push_back(positive_flow); + _sign_id_crossflow_map[j_ch].push_back(negative_flow); + + if (iy == 0 || iy == _ny - 1) + _gij_map[0].push_back((_pitch - _pin_diameter) / 2.0 + _side_gap); + else + _gij_map[0].push_back(_pitch - _pin_diameter); + + ++i_gap; + } + + for (unsigned int iy = 0; iy < _ny - 1; iy++) + for (unsigned int ix = 0; ix < _nx; ix++) + { + const unsigned int i_ch = _nx * iy + ix; + const unsigned int j_ch = _nx * (iy + 1) + ix; + _gap_to_chan_map[i_gap] = {i_ch, j_ch}; + _chan_to_gap_map[i_ch].push_back(i_gap); + _chan_to_gap_map[j_ch].push_back(i_gap); + _sign_id_crossflow_map[i_ch].push_back(positive_flow); + _sign_id_crossflow_map[j_ch].push_back(negative_flow); + + if (ix == 0 || ix == _nx - 1) + _gij_map[0].push_back((_pitch - _pin_diameter) / 2.0 + _side_gap); + else + _gij_map[0].push_back(_pitch - _pin_diameter); + + ++i_gap; + } + + for (unsigned int iz = 1; iz < _n_cells + 1; iz++) + _gij_map[iz] = _gij_map[0]; + + for (unsigned int iy = 0; iy < _ny - 1; iy++) + for (unsigned int ix = 0; ix < _nx - 1; ix++) + { + const unsigned int i_pin = (_nx - 1) * iy + ix; + const unsigned int i_chan_1 = _nx * iy + ix; + const unsigned int i_chan_2 = _nx * (iy + 1) + ix; + const unsigned int i_chan_3 = _nx * (iy + 1) + (ix + 1); + const unsigned int i_chan_4 = _nx * iy + (ix + 1); + + _pin_to_chan_map[i_pin].push_back(i_chan_1); + _pin_to_chan_map[i_pin].push_back(i_chan_2); + _pin_to_chan_map[i_pin].push_back(i_chan_3); + _pin_to_chan_map[i_pin].push_back(i_chan_4); + } + + for (unsigned int iy = 0; iy < _ny; iy++) + for (unsigned int ix = 0; ix < _nx; ix++) + { + const unsigned int i_ch = _nx * iy + ix; + + if (iy == 0 && ix == 0) + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); + else if (iy == _ny - 1 && ix == 0) + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); + else if (iy == 0 && ix == _nx - 1) + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); + else if (iy == _ny - 1 && ix == _nx - 1) + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); + else if (iy == 0) + { + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); + } + else if (iy == _ny - 1) + { + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); + } + else if (ix == 0) + { + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); + } + else if (ix == _nx - 1) + { + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); + } + else + { + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); + } + + const Real offset_x = (_nx - 1) * _pitch / 2.0; + const Real offset_y = (_ny - 1) * _pitch / 2.0; + _subchannel_position[i_ch][0] = _pitch * ix - offset_x; + _subchannel_position[i_ch][1] = _pitch * iy - offset_y; + } + + for (unsigned int ig = 0; ig < _n_gaps; ig++) + { + const auto i_ch = _gap_to_chan_map[ig].first; + const auto j_ch = _gap_to_chan_map[ig].second; + const auto & i_pins = _chan_to_pin_map[i_ch]; + const auto & j_pins = _chan_to_pin_map[j_ch]; + + _gap_to_pin_map[ig] = {10000, 10000}; + + for (unsigned int i : i_pins) + for (unsigned int j : j_pins) + if (i == j) + { + if (_gap_to_pin_map[ig].first == 10000) + { + _gap_to_pin_map[ig].first = i; + _gap_to_pin_map[ig].second = i; + } + else + _gap_to_pin_map[ig].second = i; + } + } + + for (auto & gap : _chan_to_gap_map) + gap.shrink_to_fit(); + for (auto & pin : _chan_to_pin_map) + pin.shrink_to_fit(); + for (auto & pin : _pin_to_chan_map) + pin.shrink_to_fit(); +} + +void +SCMQuadAssemblyMeshGenerator::buildSubchannelMesh(MeshBase & mesh_base, + BoundaryInfo & boundary_info) +{ + mesh_base.reserve_elem(mesh_base.n_elem() + _n_cells * _ny * _nx); + mesh_base.reserve_nodes(mesh_base.n_nodes() + (_n_cells + 1) * _ny * _nx); + + _nodes.resize(_nx * _ny); + + const Real offset_x = (_nx - 1) * _pitch / 2.0; + const Real offset_y = (_ny - 1) * _pitch / 2.0; + + dof_id_type node_id = mesh_base.n_nodes(); + for (unsigned int iy = 0; iy < _ny; iy++) + for (unsigned int ix = 0; ix < _nx; ix++) + { + const unsigned int i_ch = _nx * iy + ix; + _nodes[i_ch].reserve(_n_cells + 1); + + for (unsigned int iz = 0; iz < _n_cells + 1; iz++) + _nodes[i_ch].push_back(mesh_base.add_point( + Point(_pitch * ix - offset_x, _pitch * iy - offset_y, _z_grid[iz]), node_id++)); + } + + dof_id_type elem_id = mesh_base.n_elem(); + for (unsigned int iy = 0; iy < _ny; iy++) + for (unsigned int ix = 0; ix < _nx; ix++) + for (unsigned int iz = 0; iz < _n_cells; iz++) + { + Elem * elem = new Edge2; + elem->subdomain_id() = _subchannel_block_id; + elem->set_id(elem_id++); + elem = mesh_base.add_elem(elem); + + const unsigned int i_ch = _nx * iy + ix; + elem->set_node(0, _nodes[i_ch][iz]); + elem->set_node(1, _nodes[i_ch][iz + 1]); + + if (iz == 0) + boundary_info.add_side(elem, 0, 0); + if (iz == _n_cells - 1) + boundary_info.add_side(elem, 1, 1); + } + + mesh_base.subdomain_name(_subchannel_block_id) = "subchannel"; +} + +void +SCMQuadAssemblyMeshGenerator::buildPinMesh(MeshBase & mesh_base) +{ + mesh_base.reserve_elem(mesh_base.n_elem() + _n_cells * (_ny - 1) * (_nx - 1)); + mesh_base.reserve_nodes(mesh_base.n_nodes() + (_n_cells + 1) * (_ny - 1) * (_nx - 1)); + + _pin_nodes.resize((_nx - 1) * (_ny - 1)); + + const Real offset_x = (_nx - 2) * _pitch / 2.0; + const Real offset_y = (_ny - 2) * _pitch / 2.0; + + dof_id_type node_id = mesh_base.n_nodes(); + for (unsigned int iy = 0; iy < _ny - 1; iy++) + for (unsigned int ix = 0; ix < _nx - 1; ix++) + { + const unsigned int i_pin = (_nx - 1) * iy + ix; + _pin_nodes[i_pin].reserve(_n_cells + 1); + + for (unsigned int iz = 0; iz < _n_cells + 1; iz++) + _pin_nodes[i_pin].push_back(mesh_base.add_point( + Point(_pitch * ix - offset_x, _pitch * iy - offset_y, _z_grid[iz]), node_id++)); + } + + dof_id_type elem_id = mesh_base.n_elem(); + for (unsigned int iy = 0; iy < _ny - 1; iy++) + for (unsigned int ix = 0; ix < _nx - 1; ix++) + for (unsigned int iz = 0; iz < _n_cells; iz++) + { + Elem * elem = new Edge2; + elem->subdomain_id() = _pin_block_id; + elem->set_id(elem_id++); + elem = mesh_base.add_elem(elem); + + const unsigned int i_pin = (_nx - 1) * iy + ix; + elem->set_node(0, _pin_nodes[i_pin][iz]); + elem->set_node(1, _pin_nodes[i_pin][iz + 1]); + } + + mesh_base.subdomain_name(_pin_block_id) = "fuel_pins"; +} + +void +SCMQuadAssemblyMeshGenerator::transferMetadata(QuadSubChannelMesh & sch_mesh) +{ + sch_mesh._unheated_length_entry = _unheated_length_entry; + sch_mesh._heated_length = _heated_length; + sch_mesh._unheated_length_exit = _unheated_length_exit; + sch_mesh._z_grid = _z_grid; + sch_mesh._k_grid = _k_grid; + sch_mesh._spacer_z = _spacer_z; + sch_mesh._spacer_k = _spacer_k; + sch_mesh._z_blockage = _z_blockage; + sch_mesh._index_blockage = _index_blockage; + sch_mesh._reduction_blockage = _reduction_blockage; + sch_mesh._kij = _kij; + sch_mesh._pitch = _pitch; + sch_mesh._pin_diameter = _pin_diameter; + sch_mesh._n_cells = _n_cells; + + sch_mesh._nx = _nx; + sch_mesh._ny = _ny; + sch_mesh._n_channels = _n_channels; + sch_mesh._n_gaps = _n_gaps; + sch_mesh._n_pins = _n_pins; + sch_mesh._side_gap = _side_gap; + + sch_mesh._nodes = _nodes; + sch_mesh._pin_nodes = _pin_nodes; + sch_mesh._gapnodes = _gapnodes; + sch_mesh._gap_to_chan_map = _gap_to_chan_map; + sch_mesh._gap_to_pin_map = _gap_to_pin_map; + sch_mesh._chan_to_gap_map = _chan_to_gap_map; + sch_mesh._chan_to_pin_map = _chan_to_pin_map; + sch_mesh._pin_to_chan_map = _pin_to_chan_map; + sch_mesh._sign_id_crossflow_map = _sign_id_crossflow_map; + sch_mesh._gij_map = _gij_map; + sch_mesh._subchannel_position = _subchannel_position; + sch_mesh._subch_type = _subch_type; + + sch_mesh._duct_mesh_exist = false; + sch_mesh._pin_mesh_exist = true; +} + +std::unique_ptr +SCMQuadAssemblyMeshGenerator::generate() +{ + auto mesh_base = buildMeshBaseObject(); + BoundaryInfo & boundary_info = mesh_base->get_boundary_info(); + + mesh_base->set_spatial_dimension(3); + + buildSubchannelMesh(*mesh_base, boundary_info); + buildPinMesh(*mesh_base); + + boundary_info.sideset_name(0) = "inlet"; + boundary_info.sideset_name(1) = "outlet"; + boundary_info.nodeset_name(0) = "inlet"; + boundary_info.nodeset_name(1) = "outlet"; + + mesh_base->prepare_for_use(); + + auto & sch_mesh = static_cast(*_mesh); + transferMetadata(sch_mesh); + + return mesh_base; +} diff --git a/modules/subchannel/test/tests/problems/psbt/psbt_monolithic.i b/modules/subchannel/test/tests/problems/psbt/psbt_monolithic.i index 7c549ab5e54e..bd067340ccf5 100644 --- a/modules/subchannel/test/tests/problems/psbt/psbt_monolithic.i +++ b/modules/subchannel/test/tests/problems/psbt/psbt_monolithic.i @@ -5,8 +5,8 @@ P_out = 4.923e6 # Pa pin_diameter = 0.00950 [QuadSubChannelMesh] - [sub_channel] - type = SCMQuadSubChannelMeshGenerator + [assembly] + type = SCMQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 10 @@ -16,17 +16,31 @@ pin_diameter = 0.00950 heated_length = 1.0 spacer_z = '0.0' spacer_k = '0.0' - [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = sub_channel - nx = 6 - ny = 6 - n_cells = 10 - pitch = 0.0126 - heated_length = 1.0 - [] + subchannel_block_id = 0 + pin_block_id = 1 + [] + # [sub_channel] + # type = SCMQuadSubChannelMeshGenerator + # nx = 6 + # ny = 6 + # n_cells = 10 + # pitch = 0.0126 + # pin_diameter = ${pin_diameter} + # side_gap = 0.00095 + # heated_length = 1.0 + # spacer_z = '0.0' + # spacer_k = '0.0' + # [] + + # [fuel_pins] + # type = SCMQuadPinMeshGenerator + # input = sub_channel + # nx = 6 + # ny = 6 + # n_cells = 10 + # pitch = 0.0126 + # heated_length = 1.0 + # [] [] [FluidProperties] @@ -142,7 +156,7 @@ pin_diameter = 0.00950 boundary = inlet value = ${T_in} execute_on = 'timestep_begin' - block = sub_channel + block = subchannel [] [mdot_in_bc] type = SCMMassFlowRateAux @@ -151,7 +165,7 @@ pin_diameter = 0.00950 area = S mass_flux = report_mass_flux_inlet execute_on = 'timestep_begin' - block = sub_channel + block = subchannel [] [] @@ -210,6 +224,7 @@ pin_diameter = 0.00950 [] [Outputs] + exodus = true csv = true [] From 93258b6385323ad05666b624e9eeea567040835a Mon Sep 17 00:00:00 2001 From: Vasileios Kyriakopoulos Date: Fri, 24 Apr 2026 12:01:45 -0600 Subject: [PATCH 2/6] merge all quad mesh generators and remove the old ones, edit all quad tests and v&v cases, Refs #32796 --- .../SCMDetailedQuadAssemblyMeshGenerator.md | 17 + .../SCMDetailedQuadPinMeshGenerator.md | 18 - .../SCMDetailedQuadSubChannelMeshGenerator.md | 27 - .../meshgenerators/SCMQuadPinMeshGenerator.md | 21 - .../SCMQuadSubChannelMeshGenerator.md | 34 -- .../meshgenerators/SCMTriPinMeshGenerator.md | 2 +- .../source/positions/SCMPinPositions.md | 2 +- .../transfers/SCMPinSolutionTransfer.md | 16 - .../source/transfers/SCMSolutionTransfer.md | 4 +- .../examples/MultiApp/fuel_assembly.i | 3 +- modules/subchannel/examples/MultiApp/tests | 2 +- .../examples/coupling/thermo_mech/quad/3d.i | 8 +- .../thermo_mech/quad/one_pin_problem.i | 16 +- .../examples/heating_test/3X3_channel.i | 12 +- modules/subchannel/examples/heating_test/3d.i | 4 +- .../subchannel/examples/mesh_generator/3d.i | 4 +- .../mesh_generator/psbt_mesh_generator_test.i | 34 +- .../subchannel/examples/mesh_generator/tests | 2 +- .../include/mesh/QuadSubChannelMesh.h | 2 - ...=> SCMDetailedQuadAssemblyMeshGenerator.h} | 18 +- .../SCMDetailedQuadPinMeshGenerator.h | 34 -- .../meshgenerators/SCMQuadPinMeshGenerator.h | 51 -- .../SCMQuadSubChannelMeshGenerator.h | 99 ---- .../transfers/SCMPinSolutionTransfer.h | 27 - .../include/transfers/SCMSolutionTransfer.h | 22 +- .../transfers/SCMSolutionTransferBase.h | 56 -- ...=> SCMDetailedQuadAssemblyMeshGenerator.C} | 435 ++++++---------- .../SCMDetailedQuadPinMeshGenerator.C | 59 --- .../SCMQuadAssemblyMeshGenerator.C | 120 +++-- .../meshgenerators/SCMQuadPinMeshGenerator.C | 120 ----- .../SCMQuadSubChannelMeshGenerator.C | 489 ------------------ .../src/transfers/SCMPinSolutionTransfer.C | 39 -- .../src/transfers/SCMSolutionTransfer.C | 153 +++++- .../src/transfers/SCMSolutionTransferBase.C | 153 ------ .../tests/SCMQuadPower/gold/not_aligned.csv | 3 - .../gold/not_aligned_line_check_0001.csv | 13 - .../test/tests/SCMQuadPower/gold/test_out.csv | 3 - .../gold/test_out_line_check_0001.csv | 17 - .../subchannel/test/tests/SCMQuadPower/test.i | 192 ------- .../test/tests/SCMQuadPower/test_with_pins.i | 14 +- .../subchannel/test/tests/SCMQuadPower/tests | 17 - .../auxkernels/mass_flow_rate/blocked_test.i | 2 +- .../mass_flow_rate/gold/blocked_test_out.e | Bin 42004 -> 57720 bytes .../auxkernels/uniform_mass_flow_rate/test.i | 2 +- .../test/tests/gravity/one_pin_problem.i | 7 +- .../test/tests/ics/mass_flow/gold/test_out.e | Bin 32540 -> 49560 bytes .../test/tests/ics/mass_flow/test.i | 2 +- .../tests/ics/quad_flow_area/gold/test_out.e | Bin 28116 -> 43880 bytes .../test/tests/ics/quad_flow_area/test.i | 2 +- .../ics/quad_wetted_perimeter/gold/test_out.e | Bin 28116 -> 43880 bytes .../tests/ics/quad_wetted_perimeter/test.i | 2 +- .../mesh/detailed_quad_pin_mesh/coords.i | 8 +- .../detailed_quad_pin_mesh/gold/coords_in.e | Bin 30800 -> 30800 bytes .../tests/mesh/detailed_quad_pin_mesh/tests | 4 +- .../detailed_quad_sub_channel_mesh/coords.i | 4 +- .../gold/coords_1x2.e | Bin 19208 -> 19208 bytes .../gold/coords_1x3.e | Bin 31764 -> 31764 bytes .../gold/coords_3x1.e | Bin 31764 -> 31764 bytes .../gold/coords_3x3.e | Bin 67932 -> 107188 bytes .../mesh/detailed_quad_sub_channel_mesh/tests | 16 +- .../detailed_tri_pin_mesh/gold/coords_in.e | Bin 1092672 -> 1092672 bytes .../gold/coords_in.e | Bin 732116 -> 732116 bytes .../tests/mesh/quad_sub_channel_mesh/coords.i | 2 +- .../quad_sub_channel_mesh/gold/coords_in.e | Bin 6112 -> 10056 bytes .../quad_sub_channel_mesh/subchannel_number.i | 2 +- .../tests/mesh/quad_sub_channel_mesh/tests | 4 +- .../mesh/quad_sub_channel_pin_mesh/coords.i | 12 +- .../gold/coords_in.e | Bin 8088 -> 10056 bytes .../mesh/quad_sub_channel_pin_mesh/tests | 2 +- .../mesh/quad_subchannel_duct_mesh/coords.i | 2 +- .../gold/coords_in.e | Bin 20428 -> 25956 bytes .../tri_sub_channel_pin_mesh/gold/coords_in.e | Bin 73968 -> 73968 bytes .../tri_subchannel_mesh/gold/tricoords3_in.e | Bin 9432 -> 9432 bytes .../tests/outputs/normalslicevalues/test.i | 2 +- .../quadsubchannelpointvalue/test.i | 2 +- .../quadsubchannelpointvalue/test_error.i | 2 +- .../test/tests/problems/coupling/3d.i | 8 +- .../test/tests/problems/coupling/main.i | 15 +- .../test/tests/problems/psbt/psbt_explicit.i | 16 +- .../problems/psbt/psbt_explicit_staggered.i | 16 +- .../tests/problems/psbt/psbt_explicit_v2.i | 16 +- .../test/tests/problems/psbt/psbt_implicit.i | 16 +- .../tests/problems/psbt/psbt_monolithic.i | 4 +- .../test/tests/restart/gold/steady_out.e | Bin 89524 -> 105160 bytes .../test/tests/restart/gold/transient_out.e | Bin 115164 -> 135296 bytes .../subchannel/test/tests/restart/steady.i | 12 +- .../subchannel/test/tests/restart/transient.i | 6 +- .../quad.i | 12 +- .../quad_viz.i | 11 +- .../multiapp_detailed_solution_transfer/tests | 2 +- .../Blockage/PNNL_7x7/7X7blockage70.i | 29 +- .../Blockage/PNNL_7x7/7X7blockage90.i | 29 +- .../Blockage/PNNL_7x7/detailedMesh.i | 5 +- .../validation/EBR-II/XX09_SCM_SS17.i | 3 +- .../EBR-II/XX09_SCM_SS17_corrected.i | 3 +- .../validation/EBR-II/XX09_SCM_SS45R.i | 3 +- .../EBR-II/XX09_SCM_SS45R_corrected.i | 3 +- .../validation/EBR-II/XX09_SCM_TR17.i | 3 +- .../validation/EBR-II/XX09_SCM_TR45R.i | 3 +- .../PNNL_12_pin/steady_state/2X6_ss.i | 35 +- .../validation/PNNL_12_pin/steady_state/3d.i | 8 +- .../PNNL_12_pin/transient/2X6_transient.i | 12 +- .../validation/PNNL_12_pin/transient/3d.i | 4 +- .../validation/areva_FCTF/FCTF_deformed.i | 3 +- .../validation/areva_FCTF/FCTF_non_deformed.i | 3 +- .../validation/psbt/psbt_null_transient/3d.i | 4 +- .../psbt/psbt_null_transient/psbt_ss.i | 6 +- .../psbt/psbt_null_transient/psbt_transient.i | 6 +- .../subchannel/validation/psbt/psbt_ss/3d.i | 15 +- .../subchannel/validation/psbt/psbt_ss/psbt.i | 32 +- .../enthalpy_mixing_verification/3d.i | 4 +- .../two_channel.i | 2 +- .../friction_model_verification/3d.i | 4 +- .../friction_model_verification/two_channel.i | 2 +- .../two_channel2.i | 2 +- 115 files changed, 669 insertions(+), 2129 deletions(-) create mode 100644 modules/subchannel/doc/content/source/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.md delete mode 100644 modules/subchannel/doc/content/source/meshgenerators/SCMDetailedQuadPinMeshGenerator.md delete mode 100644 modules/subchannel/doc/content/source/meshgenerators/SCMDetailedQuadSubChannelMeshGenerator.md delete mode 100644 modules/subchannel/doc/content/source/meshgenerators/SCMQuadPinMeshGenerator.md delete mode 100644 modules/subchannel/doc/content/source/meshgenerators/SCMQuadSubChannelMeshGenerator.md delete mode 100644 modules/subchannel/doc/content/source/transfers/SCMPinSolutionTransfer.md rename modules/subchannel/include/meshgenerators/{SCMDetailedQuadSubChannelMeshGenerator.h => SCMDetailedQuadAssemblyMeshGenerator.h} (75%) delete mode 100644 modules/subchannel/include/meshgenerators/SCMDetailedQuadPinMeshGenerator.h delete mode 100644 modules/subchannel/include/meshgenerators/SCMQuadPinMeshGenerator.h delete mode 100644 modules/subchannel/include/meshgenerators/SCMQuadSubChannelMeshGenerator.h delete mode 100644 modules/subchannel/include/transfers/SCMPinSolutionTransfer.h delete mode 100644 modules/subchannel/include/transfers/SCMSolutionTransferBase.h rename modules/subchannel/src/meshgenerators/{SCMDetailedQuadSubChannelMeshGenerator.C => SCMDetailedQuadAssemblyMeshGenerator.C} (63%) delete mode 100644 modules/subchannel/src/meshgenerators/SCMDetailedQuadPinMeshGenerator.C delete mode 100644 modules/subchannel/src/meshgenerators/SCMQuadPinMeshGenerator.C delete mode 100644 modules/subchannel/src/meshgenerators/SCMQuadSubChannelMeshGenerator.C delete mode 100644 modules/subchannel/src/transfers/SCMPinSolutionTransfer.C delete mode 100644 modules/subchannel/src/transfers/SCMSolutionTransferBase.C delete mode 100644 modules/subchannel/test/tests/SCMQuadPower/gold/not_aligned.csv delete mode 100644 modules/subchannel/test/tests/SCMQuadPower/gold/not_aligned_line_check_0001.csv delete mode 100644 modules/subchannel/test/tests/SCMQuadPower/gold/test_out.csv delete mode 100644 modules/subchannel/test/tests/SCMQuadPower/gold/test_out_line_check_0001.csv delete mode 100644 modules/subchannel/test/tests/SCMQuadPower/test.i diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.md new file mode 100644 index 000000000000..5bc4c9b7d75a --- /dev/null +++ b/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.md @@ -0,0 +1,17 @@ +# SCMDetailedQuadAssemblyMeshGenerator + +!syntax description /Mesh/SCMDetailedQuadAssemblyMeshGenerator + +## Overview + +!! Intentional comment to provide extra spacing + +This mesh generator creates one detailed 3D visualization mesh containing both the subchannel +volume and the fuel pin volume for a square lattice arrangement. The generated subdomains are named +`subchannel` and `fuel_pins`. + +!syntax parameters /Mesh/SCMDetailedQuadAssemblyMeshGenerator + +!syntax inputs /Mesh/SCMDetailedQuadAssemblyMeshGenerator + +!syntax children /Mesh/SCMDetailedQuadAssemblyMeshGenerator diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedQuadPinMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedQuadPinMeshGenerator.md deleted file mode 100644 index ebda75fdc7b7..000000000000 --- a/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedQuadPinMeshGenerator.md +++ /dev/null @@ -1,18 +0,0 @@ -# SCMDetailedQuadPinMeshGenerator - -!syntax description /Mesh/SCMDetailedQuadPinMeshGenerator - -## Overview - -!! Intentional comment to provide extra spacing - -This is a mesh generator used for visualization purposes only. It is part of an input file that creates -a 3D realistic mesh of the pins in a square lattice arrangement. This input file has a Problem block -with the [NoSolveProblem.md] because it is not used to perform any calculations. It is used to create a detailed 3D mesh that the `SCM` solution gets projected on. Last, [!param](/Mesh/SCMDetailedQuadPinMeshGenerator/input) is a parameter that takes the name of an object of type [SCMDetailedQuadSubChannelMeshGenerator](SCMDetailedQuadSubChannelMeshGenerator.md) so the user must be careful to define consistent -parameters across both `MeshGenerators`. The center of the mesh is the origin. - -!syntax parameters /Mesh/SCMDetailedQuadPinMeshGenerator - -!syntax inputs /Mesh/SCMDetailedQuadPinMeshGenerator - -!syntax children /Mesh/SCMDetailedQuadPinMeshGenerator diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedQuadSubChannelMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedQuadSubChannelMeshGenerator.md deleted file mode 100644 index 55045ec96fce..000000000000 --- a/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedQuadSubChannelMeshGenerator.md +++ /dev/null @@ -1,27 +0,0 @@ -# SCMDetailedQuadSubChannelMeshGenerator - -!syntax description /Mesh/SCMDetailedQuadSubChannelMeshGenerator - -## Overview - -!! Intentional comment to provide extra spacing - -This is a mesh generator used for visualization purposes only. It is part of an input file that creates a 3D realistic mesh of the subchannels in a square lattice arrangement. This input file has a Problem block with the [NoSolveProblem.md] because it is not used to perform any calculations. It is used to create a detailed 3D mesh that the `SCM` solution gets projected on. The center of the mesh is the origin. Last the [!param](/Mesh/SCMDetailedQuadSubChannelMeshGenerator/side_gap) is an added distance between a perimetric pin and the duct, such that: distance(edge/corner pin center, duct wall) = pitch / 2 + side_gap. - -Note that: - -- the vector (in the XY plane) from a corner pin center to the corner subchannel centroid is $Pitch/2 \vec{i} + Pitch/2 \vec{j}$. -- the vector (in the XY plane) from a corner pin center to the corner of the duct is $(Pitch/2 + side\_gap) \vec{i} + (Pitch/2 + side\_gap) \vec{j}$. - -[side_gap] presents a sketch of the SCM geometry nomenclature near the duct corner. - -!media subchannel/misc/side_gap.png - style=width:90%;margin-bottom:2%;margin:auto; - id=side_gap - caption=Geometric features of the quadrilateral SCM mesh - -!syntax parameters /Mesh/SCMDetailedQuadSubChannelMeshGenerator - -!syntax inputs /Mesh/SCMDetailedQuadSubChannelMeshGenerator - -!syntax children /Mesh/SCMDetailedQuadSubChannelMeshGenerator diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMQuadPinMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMQuadPinMeshGenerator.md deleted file mode 100644 index a5402be446f6..000000000000 --- a/modules/subchannel/doc/content/source/meshgenerators/SCMQuadPinMeshGenerator.md +++ /dev/null @@ -1,21 +0,0 @@ -# SCMQuadPinMeshGenerator - -!syntax description /Mesh/SCMQuadPinMeshGenerator - -## Overview - -!! Intentional comment to provide extra spacing - -This mesh generator creates the mesh were the `SCM` solution variables associated with the fuel pins live. -The user needs to provide the number of subchannels [!param](/Mesh/SCMQuadPinMeshGenerator/nx) in the -x direction and [!param](/Mesh/SCMQuadPinMeshGenerator/ny) in the -y direction. -The number of cells in the -z direction is given by [!param](/Mesh/SCMQuadPinMeshGenerator/n_cells). The distance of the pins from eachother is given by the [!param](/Mesh/SCMQuadPinMeshGenerator/pitch) parameter and the total length of the pins in the -z direction is defined by the parameters: [!param](/Mesh/SCMQuadPinMeshGenerator/heated_length),[!param](/Mesh/SCMQuadPinMeshGenerator/unheated_length_entry),[!param](/Mesh/SCMQuadPinMeshGenerator/unheated_length_exit). Last, [!param](/Mesh/SCMQuadPinMeshGenerator/input) is a parameter that takes the name of an object of type [SCMQuadSubChannelMeshGenerator](SCMQuadSubChannelMeshGenerator.md) so the user must be careful to define consistent parameters across both `MeshGenerators`. The center of the mesh is the origin. - -## Example Input File Syntax - -!listing /validation/psbt/psbt_ss/psbt.i block=QuadSubChannelMesh language=moose - -!syntax parameters /Mesh/SCMQuadPinMeshGenerator - -!syntax inputs /Mesh/SCMQuadPinMeshGenerator - -!syntax children /Mesh/SCMQuadPinMeshGenerator diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMQuadSubChannelMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMQuadSubChannelMeshGenerator.md deleted file mode 100644 index 39cd9c887416..000000000000 --- a/modules/subchannel/doc/content/source/meshgenerators/SCMQuadSubChannelMeshGenerator.md +++ /dev/null @@ -1,34 +0,0 @@ -# SCMQuadSubChannelMeshGenerator - -!syntax description /Mesh/SCMQuadSubChannelMeshGenerator - -## Overview - -!! Intentional comment to provide extra spacing - -This mesh generator creates the mesh were the `SCM` solution variables associated with the subchannels live. -The user needs to provide the number of subchannels [!param](/Mesh/SCMQuadSubChannelMeshGenerator/nx) in the -x direction and [!param](/Mesh/SCMQuadSubChannelMeshGenerator/ny) in the -y direction. -The number of cells in the -z direction is given by [!param](/Mesh/SCMQuadSubChannelMeshGenerator/n_cells). The distance of the pins from eachother is given by the [!param](/Mesh/SCMQuadSubChannelMeshGenerator/pitch) parameter and the total length of the sub-assembly is defined by the parameters: -[!param](/Mesh/SCMQuadSubChannelMeshGenerator/heated_length),[!param](/Mesh/SCMQuadSubChannelMeshGenerator/unheated_length_entry),[!param](/Mesh/SCMQuadSubChannelMeshGenerator/unheated_length_entry). The fuel pin diameter is given by [!param](/Mesh/SCMQuadSubChannelMeshGenerator/pin_diameter). The user also has the ability to define the effect of spacers or mixing vanes on the subassembly by defining their axial location [!param](/Mesh/SCMQuadSubChannelMeshGenerator/spacer_z) and a local presure form loss coefficient [!param](/Mesh/SCMQuadSubChannelMeshGenerator/spacer_k). The center of the mesh is the origin. Last the [!param](/Mesh/SCMQuadSubChannelMeshGenerator/side_gap) is an added distance between a perimetric pin and the duct, such that: distance(edge/corner pin center, duct wall) = pitch / 2 + side_gap. - -Note that: - -- the vector (in the XY plane) from a corner pin center to the corner subchannel centroid is $Pitch/2 \vec{i} + Pitch/2 \vec{j}$. -- the vector (in the XY plane) from a corner pin center to the corner of the duct is $(Pitch/2 + side\_gap) \vec{i} + (Pitch/2 + side\_gap) \vec{j}$. - -[side_gap] presents a sketch of the SCM geometry nomenclature near the duct corner. - -!media subchannel/misc/side_gap.png - style=width:90%;margin-bottom:2%;margin:auto; - id=side_gap - caption=Geometric features of the quadrilateral SCM mesh - -## Example Input File Syntax - -!listing /test/tests/problems/psbt/psbt_explicit.i block=QuadSubChannelMesh language=moose - -!syntax parameters /Mesh/SCMQuadSubChannelMeshGenerator - -!syntax inputs /Mesh/SCMQuadSubChannelMeshGenerator - -!syntax children /Mesh/SCMQuadSubChannelMeshGenerator diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMTriPinMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMTriPinMeshGenerator.md index 7a2cf1ad73ad..e376d208bbcc 100644 --- a/modules/subchannel/doc/content/source/meshgenerators/SCMTriPinMeshGenerator.md +++ b/modules/subchannel/doc/content/source/meshgenerators/SCMTriPinMeshGenerator.md @@ -9,7 +9,7 @@ This mesh generator creates the mesh were the `SCM` solution variables associated with the pins live. The user needs to provide the [!param](/Mesh/SCMTriPinMeshGenerator/nrings) parameter which defines the number of fuel pin rings. For triangular sub-assemblies, one nring means that there is one central pin in the (0 0 0) position and six neighboring ones on the the vertices of a normal hexagon. The number of cells in the -z direction is given by [!param](/Mesh/SCMTriPinMeshGenerator/n_cells). The distance of the pins from eachother is given by the [!param](/Mesh/SCMTriPinMeshGenerator/pitch) parameter and the total length of the pins in the -z direction is defined by the parameters: [!param](/Mesh/SCMTriPinMeshGenerator/heated_length),[!param](/Mesh/SCMTriPinMeshGenerator/unheated_length_entry),[!param](/Mesh/SCMTriPinMeshGenerator/unheated_length_entry). -Last, [!param](/Mesh/SCMTriPinMeshGenerator/input) is a parameter that takes the name of an object of type [SCMTriSubChannelMeshGenerator](SCMQuadSubChannelMeshGenerator.md) so the user must be careful to define consistent parameters across both `MeshGenerators`. The center of the mesh is the origin. +Last, [!param](/Mesh/SCMTriPinMeshGenerator/input) is a parameter that takes the name of an object of type [SCMTriSubChannelMeshGenerator](SCMTriSubChannelMeshGenerator.md) so the user must be careful to define consistent parameters across both `MeshGenerators`. The center of the mesh is the origin. ## Example Input File Syntax diff --git a/modules/subchannel/doc/content/source/positions/SCMPinPositions.md b/modules/subchannel/doc/content/source/positions/SCMPinPositions.md index 790fe16b3339..c488c9e97913 100644 --- a/modules/subchannel/doc/content/source/positions/SCMPinPositions.md +++ b/modules/subchannel/doc/content/source/positions/SCMPinPositions.md @@ -3,7 +3,7 @@ !syntax description /Positions/SCMPinPositions This object currently requires using a `SubChannel` pin mesh, such as the meshes generated by the [SCMTriPinMeshGenerator.md] -or the [SCMQuadPinMeshGenerator.md]. +or the [SCMQuadAssemblyMeshGenerator.md]. !alert note Future development may lift this limitation. Please contact a MOOSE developer if needed. diff --git a/modules/subchannel/doc/content/source/transfers/SCMPinSolutionTransfer.md b/modules/subchannel/doc/content/source/transfers/SCMPinSolutionTransfer.md deleted file mode 100644 index 3776ed900d10..000000000000 --- a/modules/subchannel/doc/content/source/transfers/SCMPinSolutionTransfer.md +++ /dev/null @@ -1,16 +0,0 @@ -# SCMPinSolutionTransfer - -!syntax description /Transfers/SCMPinSolutionTransfer - -## Overview - -!! Intentional comment to provide extra spacing - -This class is used to transfer the pin associated variables: pin surface temperature `Tpin`, axial heat rate qprime `q_prime` and pin diameter `Dpin` -to the visualization mesh. - -!syntax parameters /Transfers/SCMPinSolutionTransfer - -!syntax inputs /Transfers/SCMPinSolutionTransfer - -!syntax children /Transfers/SCMPinSolutionTransfer diff --git a/modules/subchannel/doc/content/source/transfers/SCMSolutionTransfer.md b/modules/subchannel/doc/content/source/transfers/SCMSolutionTransfer.md index e26c6484a054..7ae80208b912 100644 --- a/modules/subchannel/doc/content/source/transfers/SCMSolutionTransfer.md +++ b/modules/subchannel/doc/content/source/transfers/SCMSolutionTransfer.md @@ -6,7 +6,9 @@ !! Intentional comment to provide extra spacing -This class is used to transfer the subchannel associated variables to the visualization mesh. +This class transfers either subchannel-associated or pin-associated variables to the visualization +mesh. Use `transfer_type = subchannel` for channel-centered fields and `transfer_type = pin` for +pin-centered fields. !syntax parameters /Transfers/SCMSolutionTransfer diff --git a/modules/subchannel/examples/MultiApp/fuel_assembly.i b/modules/subchannel/examples/MultiApp/fuel_assembly.i index 0aefabc503ee..31e3e5a27348 100644 --- a/modules/subchannel/examples/MultiApp/fuel_assembly.i +++ b/modules/subchannel/examples/MultiApp/fuel_assembly.i @@ -294,7 +294,8 @@ duct_inside = '${fparse duct_outside - 2 * duct_thickness}' variable = 'mdot SumWij P DP h T rho mu S' [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'Tpin q_prime' [] diff --git a/modules/subchannel/examples/MultiApp/tests b/modules/subchannel/examples/MultiApp/tests index 7158818a2f7a..28c5dee76b05 100644 --- a/modules/subchannel/examples/MultiApp/tests +++ b/modules/subchannel/examples/MultiApp/tests @@ -1,6 +1,6 @@ [Tests] issues = '#29237' - design = 'SCMSolutionTransfer.md SCMPinSolutionTransfer.md' + design = 'SCMSolutionTransfer.md' [check] type = CSVDiff input = fuel_assembly.i diff --git a/modules/subchannel/examples/coupling/thermo_mech/quad/3d.i b/modules/subchannel/examples/coupling/thermo_mech/quad/3d.i index 444986a7e5f5..f5ab222ad290 100644 --- a/modules/subchannel/examples/coupling/thermo_mech/quad/3d.i +++ b/modules/subchannel/examples/coupling/thermo_mech/quad/3d.i @@ -9,12 +9,8 @@ [] [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator - [] - [fuel_pins] - type = SCMDetailedQuadPinMeshGenerator - input = subchannel + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator [] [] diff --git a/modules/subchannel/examples/coupling/thermo_mech/quad/one_pin_problem.i b/modules/subchannel/examples/coupling/thermo_mech/quad/one_pin_problem.i index 1821c3c659e6..c31b417a40d9 100644 --- a/modules/subchannel/examples/coupling/thermo_mech/quad/one_pin_problem.i +++ b/modules/subchannel/examples/coupling/thermo_mech/quad/one_pin_problem.i @@ -20,12 +20,7 @@ heated_length = 1.0 [QuadSubChannelMesh] [subchannel] - type = SCMQuadSubChannelMeshGenerator - [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = subchannel + type = SCMQuadAssemblyMeshGenerator [] [] @@ -98,13 +93,17 @@ heated_length = 1.0 P_out = ${P_out} verbose_subchannel = true deformation = true - friction_closure = 'MATRA' + friction_closure = 'MATRA' + pin_HTC_closure = 'Dittus-Boelter' [] [SCMClosures] [MATRA] type = SCMFrictionMATRA [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -293,7 +292,8 @@ heated_length = 1.0 [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'Tpin Dpin q_prime' [] diff --git a/modules/subchannel/examples/heating_test/3X3_channel.i b/modules/subchannel/examples/heating_test/3X3_channel.i index b999a172b038..7e5319804f08 100644 --- a/modules/subchannel/examples/heating_test/3X3_channel.i +++ b/modules/subchannel/examples/heating_test/3X3_channel.i @@ -9,7 +9,7 @@ n_cells = 20 [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = '${n_cells}' @@ -43,12 +43,16 @@ n_cells = 20 compute_power = true P_out = ${P_out} friction_closure = 'MATRA' + pin_HTC_closure = 'Dittus-Boelter' [] [SCMClosures] [MATRA] type = SCMFrictionMATRA [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -87,6 +91,12 @@ n_cells = 20 value = 0.0 [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 0.00950 + [] + [Viscosity_ic] type = ViscosityIC variable = mu diff --git a/modules/subchannel/examples/heating_test/3d.i b/modules/subchannel/examples/heating_test/3d.i index 7a866957fc73..085ab9c8b9a1 100644 --- a/modules/subchannel/examples/heating_test/3d.i +++ b/modules/subchannel/examples/heating_test/3d.i @@ -6,8 +6,8 @@ height = ${fparse unheated_length_entry + heated_length + unheated_length_exit} n_cells = 20 [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = '${n_cells}' diff --git a/modules/subchannel/examples/mesh_generator/3d.i b/modules/subchannel/examples/mesh_generator/3d.i index e353f6c4cd8e..fb0deb7e1c4f 100644 --- a/modules/subchannel/examples/mesh_generator/3d.i +++ b/modules/subchannel/examples/mesh_generator/3d.i @@ -1,6 +1,6 @@ [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 20 diff --git a/modules/subchannel/examples/mesh_generator/psbt_mesh_generator_test.i b/modules/subchannel/examples/mesh_generator/psbt_mesh_generator_test.i index d11db2535a78..9a99b98c22ef 100644 --- a/modules/subchannel/examples/mesh_generator/psbt_mesh_generator_test.i +++ b/modules/subchannel/examples/mesh_generator/psbt_mesh_generator_test.i @@ -5,7 +5,7 @@ P_out = 4.923e6 # Pa [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 20 @@ -16,36 +16,26 @@ P_out = 4.923e6 # Pa spacer_z = '0.5' spacer_k = '0.5' [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = sub_channel - nx = 6 - ny = 6 - n_cells = 20 - pitch = 0.0126 - heated_length = 1.00 - [] [] [AuxVariables] [mdot] - block = sub_channel + block = subchannel [] [SumWij] - block = sub_channel + block = subchannel [] [P] - block = sub_channel + block = subchannel [] [DP] - block = sub_channel + block = subchannel [] [h] - block = sub_channel + block = subchannel [] [T] - block = sub_channel + block = subchannel [] [Tpin] block = fuel_pins @@ -54,19 +44,19 @@ P_out = 4.923e6 # Pa block = fuel_pins [] [rho] - block = sub_channel + block = subchannel [] [mu] - block = sub_channel + block = subchannel [] [S] - block = sub_channel + block = subchannel [] [w_perim] - block = sub_channel + block = subchannel [] [q_prime] - block = sub_channel + block = subchannel [] [] diff --git a/modules/subchannel/examples/mesh_generator/tests b/modules/subchannel/examples/mesh_generator/tests index 40f7564fabaf..c5756d5755c6 100644 --- a/modules/subchannel/examples/mesh_generator/tests +++ b/modules/subchannel/examples/mesh_generator/tests @@ -1,5 +1,5 @@ [Tests] - design = 'SCMQuadSubChannelMeshGenerator.md' + design = 'SCMQuadAssemblyMeshGenerator.md' issues = '#28497' [check_syntax_psbt] type = 'RunApp' diff --git a/modules/subchannel/include/mesh/QuadSubChannelMesh.h b/modules/subchannel/include/mesh/QuadSubChannelMesh.h index 9a6a52342a78..1fe381e35ccf 100644 --- a/modules/subchannel/include/mesh/QuadSubChannelMesh.h +++ b/modules/subchannel/include/mesh/QuadSubChannelMesh.h @@ -151,8 +151,6 @@ class QuadSubChannelMesh : public SubChannelMesh static void generatePinCenters( unsigned int nx, unsigned int ny, Real pitch, Real elev, std::vector & pin_centers); - friend class SCMQuadSubChannelMeshGenerator; - friend class SCMQuadPinMeshGenerator; friend class QuadSubChannel1PhaseProblem; friend class SCMQuadAssemblyMeshGenerator; }; diff --git a/modules/subchannel/include/meshgenerators/SCMDetailedQuadSubChannelMeshGenerator.h b/modules/subchannel/include/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.h similarity index 75% rename from modules/subchannel/include/meshgenerators/SCMDetailedQuadSubChannelMeshGenerator.h rename to modules/subchannel/include/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.h index 5f3ec09b4fc2..c34518e2d196 100644 --- a/modules/subchannel/include/meshgenerators/SCMDetailedQuadSubChannelMeshGenerator.h +++ b/modules/subchannel/include/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.h @@ -13,17 +13,18 @@ #include "SubChannelEnums.h" /** - * Mesh generator that builds a 3D mesh representing quadrilateral subchannels + * Mesh generator that builds a detailed 3D mesh representing quadrilateral subchannels and pins */ -class SCMDetailedQuadSubChannelMeshGenerator : public MeshGenerator +class SCMDetailedQuadAssemblyMeshGenerator : public MeshGenerator { public: - SCMDetailedQuadSubChannelMeshGenerator(const InputParameters & parameters); + SCMDetailedQuadAssemblyMeshGenerator(const InputParameters & parameters); virtual std::unique_ptr generate() override; protected: EChannelType getSubchannelType(unsigned int index) const { return _subch_type[index]; } - std::vector getSubchannelPosition(unsigned int i) { return _subchannel_position[i]; } + + void generatePin(std::unique_ptr & mesh_base, const Point & center); /// unheated length of the fuel Pin at the entry of the assembly const Real _unheated_length_entry; @@ -51,12 +52,17 @@ class SCMDetailedQuadSubChannelMeshGenerator : public MeshGenerator * distance(edge pin center, duct wall) = pitch / 2 + side_gap [m]. */ const Real _side_gap; + /// Number of radial parts in each pin cross section + const unsigned int _num_radial_parts; + /// Subdomain IDs used for mesh blocks + const unsigned int _subchannel_block_id; + const unsigned int _pin_block_id; /// Subchannel type std::vector _subch_type; /// x,y coordinates of the subchannel centroids std::vector> _subchannel_position; - /// Subdomain ID used for the mesh block - const unsigned int & _block_id; + /// Counter for element numbering + dof_id_type _elem_id; public: static InputParameters validParams(); diff --git a/modules/subchannel/include/meshgenerators/SCMDetailedQuadPinMeshGenerator.h b/modules/subchannel/include/meshgenerators/SCMDetailedQuadPinMeshGenerator.h deleted file mode 100644 index 2018589cc524..000000000000 --- a/modules/subchannel/include/meshgenerators/SCMDetailedQuadPinMeshGenerator.h +++ /dev/null @@ -1,34 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#pragma once - -#include "DetailedPinMeshGeneratorBase.h" - -/** - * Mesh generator for fuel pins in a quadrilateral lattice - */ -class SCMDetailedQuadPinMeshGenerator : public DetailedPinMeshGeneratorBase -{ -public: - SCMDetailedQuadPinMeshGenerator(const InputParameters & parameters); - - virtual std::unique_ptr generate() override; - -protected: - /// Mesh that comes from another generator - std::unique_ptr & _input; - /// Number of subchannels in the x direction - const unsigned int & _nx; - /// Number of subchannels in the y direction - const unsigned int & _ny; - -public: - static InputParameters validParams(); -}; diff --git a/modules/subchannel/include/meshgenerators/SCMQuadPinMeshGenerator.h b/modules/subchannel/include/meshgenerators/SCMQuadPinMeshGenerator.h deleted file mode 100644 index caad07aca90c..000000000000 --- a/modules/subchannel/include/meshgenerators/SCMQuadPinMeshGenerator.h +++ /dev/null @@ -1,51 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#pragma once - -#include "MeshGenerator.h" -#include "libmesh/point.h" -#include "SCMQuadSubChannelMeshGenerator.h" - -/** - * Class to create Pin mesh in the square lattice geometry - */ -class SCMQuadPinMeshGenerator : public MeshGenerator -{ -public: - SCMQuadPinMeshGenerator(const InputParameters & parameters); - std::unique_ptr generate() override; - -protected: - /// Mesh that comes from another generator - std::unique_ptr & _input; - /// unheated length of the fuel Pin at the entry of the assembly - const Real _unheated_length_entry; - /// heated length of the fuel Pin - const Real _heated_length; - /// unheated length of the fuel Pin at the exit of the assembly - const Real _unheated_length_exit; - /// axial location of nodes - std::vector _z_grid; - /// Distance between the neighbor fuel pins, pitch - const Real _pitch; - /// number of subchannels in the x direction - const unsigned int _nx; - /// number of subchannels in the y direction - const unsigned int _ny; - /// number of axial cells - const unsigned int _n_cells; - /// Pin nodes - std::vector> _pin_nodes; - /// block index - const unsigned int _block_id; - -public: - static InputParameters validParams(); -}; diff --git a/modules/subchannel/include/meshgenerators/SCMQuadSubChannelMeshGenerator.h b/modules/subchannel/include/meshgenerators/SCMQuadSubChannelMeshGenerator.h deleted file mode 100644 index 04d8bfa53956..000000000000 --- a/modules/subchannel/include/meshgenerators/SCMQuadSubChannelMeshGenerator.h +++ /dev/null @@ -1,99 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#pragma once - -#include -#include "MeshGenerator.h" -#include "libmesh/point.h" -#include "SubChannelEnums.h" - -/** - * Class for Subchannel mesh generation in the square lattice geometry - */ -class SCMQuadSubChannelMeshGenerator : public MeshGenerator -{ -public: - SCMQuadSubChannelMeshGenerator(const InputParameters & parameters); - std::unique_ptr generate() override; - -protected: - /// unheated length of the fuel Pin at the entry of the assembly - const Real _unheated_length_entry; - /// heated length of the fuel Pin - const Real _heated_length; - /// unheated length of the fuel Pin at the exit of the assembly - const Real _unheated_length_exit; - /// axial location of nodes - std::vector _z_grid; - /// axial form loss coefficient per computational cell - std::vector> _k_grid; - /// axial location of the spacers - const std::vector & _spacer_z; - /// form loss coefficient of the spacers - const std::vector & _spacer_k; - /// axial location of blockage (inlet, outlet) [m] - const std::vector _z_blockage; - /// index of subchannels affected by blockage - const std::vector _index_blockage; - /// area reduction of subchannels affected by blockage - const std::vector _reduction_blockage; - /// form loss coefficient of subchannels affected by blockage - const std::vector _k_blockage; - /// Lateral form loss coefficient - const Real & _kij; - /// Distance between the neighbor fuel pins, pitch - const Real _pitch; - /// fuel Pin diameter - const Real _pin_diameter; - /// number of axial cells - const unsigned int _n_cells; - /// number of axial blocks - unsigned int _n_blocks; - /// Number of subchannels in the x direction - const unsigned int _nx; - /// Number of subchannels in the y direction - const unsigned int _ny; - /// Total number of subchannels - const unsigned int _n_channels; - /// Number of gaps per layer - const unsigned int _n_gaps; - /// Number of pins - const unsigned int _n_pins; - /** - * The side gap, not to be confused with the gap between pins, this refers to the gap - * next to the duct or else the distance between the subchannel centroid to the duct wall. - * distance(edge pin center, duct wall) = pitch / 2 + side_gap [m]. - */ - const Real _side_gap; - /// block index - const unsigned int _block_id; - /// Channel nodes - std::vector> _nodes; - /// gap nodes - std::vector> _gapnodes; - std::vector> _gap_to_chan_map; - std::vector> _gap_to_pin_map; - std::vector> _chan_to_gap_map; - std::vector> _chan_to_pin_map; - std::vector> _pin_to_chan_map; - /// Matrix used to give local sign to crossflow quantities - std::vector> _sign_id_crossflow_map; - /// Vector to store gap size - std::vector> _gij_map; - /// x,y coordinates of the subchannel centroid - std::vector> _subchannel_position; - /// Subchannel type - std::vector _subch_type; - -public: - static InputParameters validParams(); - - friend class SCMQuadPinMeshGenerator; -}; diff --git a/modules/subchannel/include/transfers/SCMPinSolutionTransfer.h b/modules/subchannel/include/transfers/SCMPinSolutionTransfer.h deleted file mode 100644 index 07b0ff2d181b..000000000000 --- a/modules/subchannel/include/transfers/SCMPinSolutionTransfer.h +++ /dev/null @@ -1,27 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#pragma once - -#include "SCMSolutionTransferBase.h" - -/** - * Transfers subchannel solution from computational mesh onto visualization mesh - */ -class SCMPinSolutionTransfer : public SCMSolutionTransferBase -{ -public: - SCMPinSolutionTransfer(const InputParameters & parameters); - -protected: - virtual Node * getFromNode(const SubChannelMesh & from_mesh, const Point & src_node); - -public: - static InputParameters validParams(); -}; diff --git a/modules/subchannel/include/transfers/SCMSolutionTransfer.h b/modules/subchannel/include/transfers/SCMSolutionTransfer.h index e130a69c35f5..0c62c483114e 100644 --- a/modules/subchannel/include/transfers/SCMSolutionTransfer.h +++ b/modules/subchannel/include/transfers/SCMSolutionTransfer.h @@ -9,18 +9,32 @@ #pragma once -#include "SCMSolutionTransferBase.h" +#include "MultiAppTransfer.h" + +class SubChannelMesh; /** - * Transfers subchannel solution from computational mesh onto visualization mesh + * Transfers subchannel or pin solutions from a SubChannel mesh onto a visualization mesh */ -class SCMSolutionTransfer : public SCMSolutionTransferBase +class SCMSolutionTransfer : public MultiAppTransfer { public: SCMSolutionTransfer(const InputParameters & parameters); + virtual void execute() override; + void initialSetup() override; + protected: - Node * getFromNode(const SubChannelMesh & from_mesh, const Point & src_node) override; + void transferToMultiApps(); + void transferVarsToApp(unsigned int app_idx); + void transferNodalVars(unsigned int app_idx); + Node * getFromNode(const SubChannelMesh & from_mesh, const Point & src_node); + + /// Variable names to transfer + const std::vector & _var_names; + + /// Whether pin fields should be transferred instead of subchannel fields + const bool _pin_transfer; public: static InputParameters validParams(); diff --git a/modules/subchannel/include/transfers/SCMSolutionTransferBase.h b/modules/subchannel/include/transfers/SCMSolutionTransferBase.h deleted file mode 100644 index 9cea5d9c0702..000000000000 --- a/modules/subchannel/include/transfers/SCMSolutionTransferBase.h +++ /dev/null @@ -1,56 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#pragma once - -#include "MultiAppTransfer.h" - -class SubChannelMesh; - -/** - * Base class for transfering solutions from computational mesh onto visualization mesh - */ -class SCMSolutionTransferBase : public MultiAppTransfer -{ -public: - SCMSolutionTransferBase(const InputParameters & parameters); - - virtual void execute() override; - void initialSetup() override; - -protected: - /** - * Do the transfer into the sub-app - */ - void transferToMultiApps(); - - /** - * Transfer variables into the sub-app - * - * @param app_idx Multi-app index - */ - void transferVarsToApp(unsigned int app_idx); - - void transferNodalVars(unsigned int app_idx); - - /** - * Find node on computational mesh given the visualization point - * - * @return Node from the computational mesh - * @param from_mesh Computational mesh - * @param src_node Node from the visualization - */ - virtual Node * getFromNode(const SubChannelMesh & from_mesh, const Point & src_node) = 0; - - /// Variable names to transfer - const std::vector & _var_names; - -public: - static InputParameters validParams(); -}; diff --git a/modules/subchannel/src/meshgenerators/SCMDetailedQuadSubChannelMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.C similarity index 63% rename from modules/subchannel/src/meshgenerators/SCMDetailedQuadSubChannelMeshGenerator.C rename to modules/subchannel/src/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.C index c3e321508e36..9bcefab78313 100644 --- a/modules/subchannel/src/meshgenerators/SCMDetailedQuadSubChannelMeshGenerator.C +++ b/modules/subchannel/src/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.C @@ -7,24 +7,23 @@ //* Licensed under LGPL 2.1, please see LICENSE for details //* https://www.gnu.org/licenses/lgpl-2.1.html -#include "SCMDetailedQuadSubChannelMeshGenerator.h" -#include -#include +#include "SCMDetailedQuadAssemblyMeshGenerator.h" +#include "QuadSubChannelMesh.h" + #include "libmesh/cell_prism6.h" #include "libmesh/unstructured_mesh.h" -registerMooseObject("SubChannelApp", SCMDetailedQuadSubChannelMeshGenerator); -registerMooseObjectRenamed("SubChannelApp", - DetailedQuadSubChannelMeshGenerator, - "06/30/2025 24:00", - SCMDetailedQuadSubChannelMeshGenerator); +#include +#include + +registerMooseObject("SubChannelApp", SCMDetailedQuadAssemblyMeshGenerator); InputParameters -SCMDetailedQuadSubChannelMeshGenerator::validParams() +SCMDetailedQuadAssemblyMeshGenerator::validParams() { InputParameters params = MeshGenerator::validParams(); params.addClassDescription( - "Creates a detailed mesh of subchannels in a square lattice arrangement"); + "Creates a detailed mesh of subchannels and fuel pins in a square lattice arrangement"); params.addRequiredParam("pitch", "Pitch [m]"); params.addRequiredParam("pin_diameter", "Rod diameter [m]"); params.addParam("unheated_length_entry", 0.0, "Unheated length at entry [m]"); @@ -34,16 +33,26 @@ SCMDetailedQuadSubChannelMeshGenerator::validParams() params.addRequiredParam("nx", "Number of channels in the x direction [-]"); params.addRequiredParam("ny", "Number of channels in the y direction [-]"); params.addRequiredParam( + "side_gap", + "The side gap, not to be confused with the gap between pins, this refers to the gap " + "next to the duct or else the distance between the subchannel centroid to the duct wall." + "distance(edge pin center, duct wall) = pitch / 2 + side_gap [m]"); + params.addParam( "gap", "The side gap, not to be confused with the gap between pins, this refers to the gap " "next to the duct or else the distance between the subchannel centroid to the duct wall." "distance(edge pin center, duct wall) = pitch / 2 + side_gap [m]"); params.deprecateParam("gap", "side_gap", "08/06/2026"); - params.addParam("block_id", 0, "Block ID used for the mesh subdomain."); + params.addRangeCheckedParam("num_radial_parts", + 16, + "num_radial_parts>=4", + "Number of radial parts (must be at least 4)."); + params.addParam("subchannel_block_id", 0, "Subchannel block id."); + params.addParam("pin_block_id", 1, "Fuel pin block id."); return params; } -SCMDetailedQuadSubChannelMeshGenerator::SCMDetailedQuadSubChannelMeshGenerator( +SCMDetailedQuadAssemblyMeshGenerator::SCMDetailedQuadAssemblyMeshGenerator( const InputParameters & parameters) : MeshGenerator(parameters), _unheated_length_entry(getParam("unheated_length_entry")), @@ -55,11 +64,14 @@ SCMDetailedQuadSubChannelMeshGenerator::SCMDetailedQuadSubChannelMeshGenerator( _nx(getParam("nx")), _ny(getParam("ny")), _n_channels(_nx * _ny), - _side_gap(getParam("side_gap")), - _block_id(getParam("block_id")) + _side_gap(isParamValid("side_gap") ? getParam("side_gap") : getParam("gap")), + _num_radial_parts(getParam("num_radial_parts")), + _subchannel_block_id(getParam("subchannel_block_id")), + _pin_block_id(getParam("pin_block_id")), + _elem_id(0) { - Real L = _unheated_length_entry + _heated_length + _unheated_length_exit; - Real dz = L / _n_cells; + const Real L = _unheated_length_entry + _heated_length + _unheated_length_exit; + const Real dz = L / _n_cells; for (unsigned int i = 0; i < _n_cells + 1; i++) _z_grid.push_back(dz * i); @@ -68,20 +80,17 @@ SCMDetailedQuadSubChannelMeshGenerator::SCMDetailedQuadSubChannelMeshGenerator( { _subchannel_position[i].reserve(3); for (unsigned int j = 0; j < 3; j++) - { _subchannel_position.at(i).push_back(0.0); - } } _subch_type.resize(_n_channels); for (unsigned int iy = 0; iy < _ny; iy++) - { for (unsigned int ix = 0; ix < _nx; ix++) { - unsigned int i_ch = _nx * iy + ix; - bool is_corner = (ix == 0 && iy == 0) || (ix == _nx - 1 && iy == 0) || - (ix == 0 && iy == _ny - 1) || (ix == _nx - 1 && iy == _ny - 1); - bool is_edge = (ix == 0 || iy == 0 || ix == _nx - 1 || iy == _ny - 1); + const unsigned int i_ch = _nx * iy + ix; + const bool is_corner = (ix == 0 && iy == 0) || (ix == _nx - 1 && iy == 0) || + (ix == 0 && iy == _ny - 1) || (ix == _nx - 1 && iy == _ny - 1); + const bool is_edge = (ix == 0 || iy == 0 || ix == _nx - 1 || iy == _ny - 1); if (is_corner) _subch_type[i_ch] = EChannelType::CORNER; @@ -90,45 +99,72 @@ SCMDetailedQuadSubChannelMeshGenerator::SCMDetailedQuadSubChannelMeshGenerator( else _subch_type[i_ch] = EChannelType::CENTER; - // set the subchannel positions so that the center of the assembly is the zero point - Real offset_x = (_nx - 1) * _pitch / 2.0; - Real offset_y = (_ny - 1) * _pitch / 2.0; + const Real offset_x = (_nx - 1) * _pitch / 2.0; + const Real offset_y = (_ny - 1) * _pitch / 2.0; _subchannel_position[i_ch][0] = _pitch * ix - offset_x; _subchannel_position[i_ch][1] = _pitch * iy - offset_y; } +} + +void +SCMDetailedQuadAssemblyMeshGenerator::generatePin(std::unique_ptr & mesh_base, + const Point & center) +{ + const Real dalpha = 360. / _num_radial_parts; + const Real radius = _pin_diameter / 2.; + + std::vector> nodes; + nodes.resize(_n_cells + 1); + for (unsigned int k = 0; k < _n_cells + 1; k++) + { + const Real elev = _z_grid[k]; + nodes[k].push_back(mesh_base->add_point(Point(center(0), center(1), elev))); + Real alpha = 0.; + for (unsigned int i = 0; i < _num_radial_parts; i++, alpha += dalpha) + { + const Real dx = radius * std::cos(alpha * M_PI / 180.); + const Real dy = radius * std::sin(alpha * M_PI / 180.); + nodes[k].push_back(mesh_base->add_point(Point(center(0) + dx, center(1) + dy, elev))); + } } + + for (unsigned int k = 0; k < _n_cells; k++) + for (unsigned int i = 0; i < _num_radial_parts; i++) + { + Elem * elem = new Prism6; + elem->subdomain_id() = _pin_block_id; + elem->set_id(_elem_id++); + mesh_base->add_elem(elem); + const unsigned int ctr_idx = 0; + const unsigned int idx1 = (i % _num_radial_parts) + 1; + const unsigned int idx2 = ((i + 1) % _num_radial_parts) + 1; + elem->set_node(0, nodes[k][ctr_idx]); + elem->set_node(1, nodes[k][idx1]); + elem->set_node(2, nodes[k][idx2]); + elem->set_node(3, nodes[k + 1][ctr_idx]); + elem->set_node(4, nodes[k + 1][idx1]); + elem->set_node(5, nodes[k + 1][idx2]); + } } std::unique_ptr -SCMDetailedQuadSubChannelMeshGenerator::generate() +SCMDetailedQuadAssemblyMeshGenerator::generate() { auto mesh_base = buildMeshBaseObject(); BoundaryInfo & boundary_info = mesh_base->get_boundary_info(); mesh_base->set_spatial_dimension(3); - // Define the resolution (the number of points used to represent a circle). - // This must be divisible by 4. - const unsigned int theta_res = 16; // TODO: parameterize - // Compute the number of points needed to represent one quarter of a circle. - const unsigned int points_per_quad = theta_res / 4 + 1; - // Compute the points needed to represent one axial cross-flow of a subchannel. - // For the center subchannel (sc) there is one center point plus the points from 4 intersecting - // circles. + const unsigned int n_pins = (_nx - 1) * (_ny - 1); + + const unsigned int theta_res = 16; + const unsigned int points_per_quad = theta_res / 4 + 1; const unsigned int points_per_center = points_per_quad * 4 + 1; - // For the corner sc there is one center point plus the points from 1 intersecting circle plus 3 - // corners const unsigned int points_per_corner = points_per_quad * 1 + 1 + 3; - // For the side sc there is one center point plus the points from 2 intersecting circles plus 2 - // corners const unsigned int points_per_side = points_per_quad * 2 + 1 + 2; - - // Compute the number of elements (Prism6) which combined base creates the sub-channel - // cross-section const unsigned int elems_per_center = theta_res + 4; const unsigned int elems_per_corner = theta_res / 4 + 4; const unsigned int elems_per_side = theta_res / 2 + 4; - // specify number and type of sub-channel unsigned int n_center, n_side, n_corner; if (_n_channels == 2) { @@ -149,16 +185,22 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() n_center = _n_channels - n_side - n_corner; } - // Compute the total number of points and elements. const unsigned int points_per_level = n_corner * points_per_corner + n_side * points_per_side + n_center * points_per_center; const unsigned int elems_per_level = n_corner * elems_per_corner + n_side * elems_per_side + n_center * elems_per_center; - const unsigned int n_points = points_per_level * (_n_cells + 1); - const unsigned int n_elems = elems_per_level * _n_cells; - mesh_base->reserve_nodes(n_points); - mesh_base->reserve_elem(n_elems); - // Build an array of points arranged in a circle on the xy-plane. (last and first node overlap) + + std::vector pin_centers; + if (n_pins > 0) + QuadSubChannelMesh::generatePinCenters(_nx, _ny, _pitch, 0, pin_centers); + + const unsigned int pin_points = + n_pins > 0 ? (_n_cells + 1) * (_num_radial_parts + 1) * pin_centers.size() : 0; + const unsigned int pin_elems = n_pins > 0 ? _n_cells * _num_radial_parts * pin_centers.size() : 0; + + mesh_base->reserve_nodes(points_per_level * (_n_cells + 1) + pin_points); + mesh_base->reserve_elem(elems_per_level * _n_cells + pin_elems); + const Real radius = _pin_diameter / 2.0; std::array circle_points; { @@ -170,11 +212,7 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() theta += 2 * M_PI / theta_res; } } - // Define "quadrant center" reference points. These will be the centers of - // the 4 circles that represent the fuel pins. These centers are - // offset a little bit so that in the final mesh, there is a tiny gap between - // neighboring subchannel cells. That allows us to easily map a solution to - // this detailed mesh with a nearest-neighbor search. + const Real shrink_factor = 0.99999; std::array quadrant_centers; quadrant_centers[0] = Point(_pitch * 0.5 * shrink_factor, _pitch * 0.5 * shrink_factor, 0); @@ -183,13 +221,6 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() quadrant_centers[3] = Point(_pitch * 0.5 * shrink_factor, -_pitch * 0.5 * shrink_factor, 0); const unsigned int m = theta_res / 4; - // Build an array of points that represent a cross section of a center subchannel - // cell. The points are ordered in this fashion: - // 4 3 - // 6 5 2 1 - // 0 - // 7 8 * * - // 9 * std::array center_points; { unsigned int start; @@ -211,13 +242,6 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() } } - // Build an array of points that represent a cross section of a top left corner subchannel - // cell. The points are ordered in this fashion: - // 5 4 - // - // 0 - // 2 3 - // 6 1 std::array tl_corner_points; { for (unsigned int ii = 0; ii < points_per_quad; ii++) @@ -230,13 +254,6 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() tl_corner_points[points_per_quad + 3] = Point(-_side_gap, -_pitch * 0.5 * shrink_factor, 0); } - // Build an array of points that represent a cross section of a top right corner subchannel - // cell. The points are ordered in this fashion: - // 6 5 - // - // 0 - // 1 2 - // 3 4 std::array tr_corner_points; { for (unsigned int ii = 0; ii < points_per_quad; ii++) @@ -249,13 +266,6 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() tr_corner_points[points_per_quad + 3] = Point(-_pitch * 0.5 * shrink_factor, _side_gap, 0); } - // Build an array of points that represent a cross section of a bottom left corner subchannel - // cell. The points are ordered in this fashion: - // 4 3 - // 2 1 - // 0 - // - // 5 6 std::array bl_corner_points; { for (unsigned int ii = 0; ii < points_per_quad; ii++) @@ -268,13 +278,6 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() bl_corner_points[points_per_quad + 3] = Point(_pitch * 0.5 * shrink_factor, -_side_gap, 0); } - // Build an array of points that represent a cross section of a bottom right corner subchannel - // cell. The points are ordered in this fashion: - // 1 6 - // 3 2 - // 0 - // - // 4 5 std::array br_corner_points; { for (unsigned int ii = 0; ii < points_per_quad; ii++) @@ -287,13 +290,6 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() br_corner_points[points_per_quad + 3] = Point(_side_gap, _pitch * 0.5 * shrink_factor, 0); } - // Build an array of points that represent a cross section of a top side subchannel - // cell. The points are ordered in this fashion: - // 8 7 - // - // 0 - // 1 2 5 6 - // 3 4 std::array top_points; { for (unsigned int ii = 0; ii < points_per_quad; ii++) @@ -310,13 +306,6 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() top_points[2 * points_per_quad + 2] = Point(-_pitch * 0.5 * shrink_factor, _side_gap, 0); } - // Build an array of points that represent a cross section of a left side subchannel - // cell. The points are ordered in this fashion: - // 7 6 - // 5 4 - // 0 - // 2 3 - // 8 1 std::array left_points; { for (unsigned int ii = 0; ii < points_per_quad; ii++) @@ -333,13 +322,6 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() left_points[2 * points_per_quad + 2] = Point(-_side_gap, -_pitch * 0.5 * shrink_factor, 0); } - // Build an array of points that represent a cross section of a bottom side subchannel - // cell. The points are ordered in this fashion: - // 4 3 - // 6 5 2 1 - // 0 - // - // 7 8 std::array bottom_points; { for (unsigned int ii = 0; ii < points_per_quad; ii++) @@ -356,13 +338,6 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() bottom_points[2 * points_per_quad + 2] = Point(_pitch * 0.5 * shrink_factor, -_side_gap, 0); } - // Build an array of points that represent a cross section of a right side subchannel - // cell. The points are ordered in this fashion: - // 1 8 - // 3 2 - // 0 - // 4 5 - // 6 7 std::array right_points; { for (unsigned int ii = 0; ii < points_per_quad; ii++) @@ -379,12 +354,11 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() right_points[2 * points_per_quad + 2] = Point(_side_gap, _pitch * 0.5 * shrink_factor, 0); } - // Add the points to the mesh. if (_n_channels == 2) { unsigned int node_id = 0; - Real offset_x = (_nx - 1) * _pitch / 2.0; - Real offset_y = (_ny - 1) * _pitch / 2.0; + const Real offset_x = (_nx - 1) * _pitch / 2.0; + const Real offset_y = (_ny - 1) * _pitch / 2.0; for (unsigned int iy = 0; iy < _ny; iy++) { Point y0 = {0, _pitch * iy - offset_y, 0}; @@ -394,26 +368,18 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() for (auto z : _z_grid) { Point z0{0, 0, z}; - if (_nx == 1 && iy == 0) // vertical orientation - { + if (_nx == 1 && iy == 0) for (unsigned int i = 0; i < points_per_side; i++) mesh_base->add_point(bottom_points[i] + x0 + y0 + z0, node_id++); - } - if (_nx == 1 && iy == 1) // vertical orientation - { + if (_nx == 1 && iy == 1) for (unsigned int i = 0; i < points_per_side; i++) mesh_base->add_point(top_points[i] + x0 + y0 + z0, node_id++); - } - if (_ny == 1 && ix == 0) // horizontal orientation - { + if (_ny == 1 && ix == 0) for (unsigned int i = 0; i < points_per_side; i++) mesh_base->add_point(left_points[i] + x0 + y0 + z0, node_id++); - } - if (_ny == 1 && ix == 1) // horizontal orientation - { + if (_ny == 1 && ix == 1) for (unsigned int i = 0; i < points_per_side; i++) mesh_base->add_point(right_points[i] + x0 + y0 + z0, node_id++); - } } } } @@ -421,8 +387,8 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() else if (_n_channels > 2 && (_ny == 1 || _nx == 1)) { unsigned int node_id = 0; - Real offset_x = (_nx - 1) * _pitch / 2.0; - Real offset_y = (_ny - 1) * _pitch / 2.0; + const Real offset_x = (_nx - 1) * _pitch / 2.0; + const Real offset_y = (_ny - 1) * _pitch / 2.0; for (unsigned int iy = 0; iy < _ny; iy++) { Point y0 = {0, _pitch * iy - offset_y, 0}; @@ -435,38 +401,26 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() if (_nx == 1) { if (iy == 0) - { for (unsigned int i = 0; i < points_per_side; i++) mesh_base->add_point(bottom_points[i] + x0 + y0 + z0, node_id++); - } else if (iy == _ny - 1) - { for (unsigned int i = 0; i < points_per_side; i++) mesh_base->add_point(top_points[i] + x0 + y0 + z0, node_id++); - } else - { for (unsigned int i = 0; i < points_per_center; i++) mesh_base->add_point(center_points[i] + x0 + y0 + z0, node_id++); - } } else if (_ny == 1) { if (ix == 0) - { for (unsigned int i = 0; i < points_per_side; i++) mesh_base->add_point(left_points[i] + x0 + y0 + z0, node_id++); - } else if (ix == _nx - 1) - { for (unsigned int i = 0; i < points_per_side; i++) mesh_base->add_point(right_points[i] + x0 + y0 + z0, node_id++); - } else - { for (unsigned int i = 0; i < points_per_center; i++) mesh_base->add_point(center_points[i] + x0 + y0 + z0, node_id++); - } } } } @@ -475,210 +429,168 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() else { unsigned int node_id = 0; - Real offset_x = (_nx - 1) * _pitch / 2.0; - Real offset_y = (_ny - 1) * _pitch / 2.0; + const Real offset_x = (_nx - 1) * _pitch / 2.0; + const Real offset_y = (_ny - 1) * _pitch / 2.0; for (unsigned int iy = 0; iy < _ny; iy++) { Point y0 = {0, _pitch * iy - offset_y, 0}; for (unsigned int ix = 0; ix < _nx; ix++) { Point x0 = {_pitch * ix - offset_x, 0, 0}; - if (ix == 0 && iy == 0) // Bottom Left corner - { + if (ix == 0 && iy == 0) for (auto z : _z_grid) { Point z0{0, 0, z}; for (unsigned int i = 0; i < points_per_corner; i++) mesh_base->add_point(bl_corner_points[i] + x0 + y0 + z0, node_id++); } - } - else if (ix == _nx - 1 && iy == 0) // Bottom right corner - { + else if (ix == _nx - 1 && iy == 0) for (auto z : _z_grid) { Point z0{0, 0, z}; for (unsigned int i = 0; i < points_per_corner; i++) mesh_base->add_point(br_corner_points[i] + x0 + y0 + z0, node_id++); } - } - else if (ix == 0 && iy == _ny - 1) // top Left corner - { + else if (ix == 0 && iy == _ny - 1) for (auto z : _z_grid) { Point z0{0, 0, z}; for (unsigned int i = 0; i < points_per_corner; i++) mesh_base->add_point(tl_corner_points[i] + x0 + y0 + z0, node_id++); } - } - else if (ix == _nx - 1 && iy == _ny - 1) // top right corner - { + else if (ix == _nx - 1 && iy == _ny - 1) for (auto z : _z_grid) { Point z0{0, 0, z}; for (unsigned int i = 0; i < points_per_corner; i++) mesh_base->add_point(tr_corner_points[i] + x0 + y0 + z0, node_id++); } - } - else if (ix == 0 && (iy != _ny - 1 || iy != 0)) // left side - { + else if (ix == 0 && (iy != _ny - 1 || iy != 0)) for (auto z : _z_grid) { Point z0{0, 0, z}; for (unsigned int i = 0; i < points_per_side; i++) mesh_base->add_point(left_points[i] + x0 + y0 + z0, node_id++); } - } - else if (ix == _nx - 1 && (iy != _ny - 1 || iy != 0)) // right side - { + else if (ix == _nx - 1 && (iy != _ny - 1 || iy != 0)) for (auto z : _z_grid) { Point z0{0, 0, z}; for (unsigned int i = 0; i < points_per_side; i++) mesh_base->add_point(right_points[i] + x0 + y0 + z0, node_id++); } - } - else if (iy == 0 && (ix != _nx - 1 || ix != 0)) // bottom side - { + else if (iy == 0 && (ix != _nx - 1 || ix != 0)) for (auto z : _z_grid) { Point z0{0, 0, z}; for (unsigned int i = 0; i < points_per_side; i++) mesh_base->add_point(bottom_points[i] + x0 + y0 + z0, node_id++); } - } - else if (iy == _ny - 1 && (ix != _nx - 1 || ix != 0)) // top side - { + else if (iy == _ny - 1 && (ix != _nx - 1 || ix != 0)) for (auto z : _z_grid) { Point z0{0, 0, z}; for (unsigned int i = 0; i < points_per_side; i++) mesh_base->add_point(top_points[i] + x0 + y0 + z0, node_id++); } - } - else // center - { + else for (auto z : _z_grid) { Point z0{0, 0, z}; for (unsigned int i = 0; i < points_per_center; i++) mesh_base->add_point(center_points[i] + x0 + y0 + z0, node_id++); } - } } } } - // Add elements to the mesh. The elements are 6-node prisms. The - // bases of these prisms form a triangulated representation of a cross-section - // of a center subchannel. if (_n_channels == 2) { - unsigned int elem_id = 0; for (unsigned int iy = 0; iy < _ny; iy++) - { for (unsigned int ix = 0; ix < _nx; ix++) { - unsigned int i_ch = _nx * iy + ix; + const unsigned int i_ch = _nx * iy + ix; for (unsigned int iz = 0; iz < _n_cells; iz++) - { for (unsigned int i = 0; i < elems_per_side; i++) { Elem * elem = new Prism6; - elem->subdomain_id() = _block_id; - elem->set_id(elem_id++); + elem->subdomain_id() = _subchannel_block_id; + elem->set_id(_elem_id++); elem = mesh_base->add_elem(elem); - // index of the central node at base of cell - unsigned int indx1 = iz * points_per_side + points_per_side * (_n_cells + 1) * i_ch; - // index of the central node at top of cell - unsigned int indx2 = + const unsigned int indx1 = + iz * points_per_side + points_per_side * (_n_cells + 1) * i_ch; + const unsigned int indx2 = (iz + 1) * points_per_side + points_per_side * (_n_cells + 1) * i_ch; - unsigned int elems_per_channel = elems_per_side; + const unsigned int elems_per_channel = elems_per_side; elem->set_node(0, mesh_base->node_ptr(indx1)); elem->set_node(1, mesh_base->node_ptr(indx1 + i + 1)); - if (i != elems_per_channel - 1) - elem->set_node(2, mesh_base->node_ptr(indx1 + i + 2)); - else - elem->set_node(2, mesh_base->node_ptr(indx1 + 1)); - + elem->set_node(2, + i != elems_per_channel - 1 ? mesh_base->node_ptr(indx1 + i + 2) + : mesh_base->node_ptr(indx1 + 1)); elem->set_node(3, mesh_base->node_ptr(indx2)); elem->set_node(4, mesh_base->node_ptr(indx2 + i + 1)); - if (i != elems_per_channel - 1) - elem->set_node(5, mesh_base->node_ptr(indx2 + i + 2)); - else - elem->set_node(5, mesh_base->node_ptr(indx2 + 1)); + elem->set_node(5, + i != elems_per_channel - 1 ? mesh_base->node_ptr(indx2 + i + 2) + : mesh_base->node_ptr(indx2 + 1)); if (iz == 0) boundary_info.add_side(elem, 0, 0); if (iz == _n_cells - 1) boundary_info.add_side(elem, 4, 1); } - } } - } - boundary_info.sideset_name(0) = "inlet"; - boundary_info.sideset_name(1) = "outlet"; - mesh_base->subdomain_name(_block_id) = name(); - mesh_base->prepare_for_use(); } else if (_n_channels > 2 && (_ny == 1 || _nx == 1)) { - unsigned int elem_id = 0; unsigned int number_of_corner = 0; unsigned int number_of_side = 0; unsigned int number_of_center = 0; unsigned int elems_per_channel = 0; unsigned int points_per_channel = 0; for (unsigned int iy = 0; iy < _ny; iy++) - { for (unsigned int ix = 0; ix < _nx; ix++) { - unsigned int i_ch = _nx * iy + ix; - auto subch_type = getSubchannelType(i_ch); - // note that in this case i use side geometry for corner subchannel + const unsigned int i_ch = _nx * iy + ix; + const auto subch_type = getSubchannelType(i_ch); if (subch_type == EChannelType::CORNER) { number_of_side++; elems_per_channel = elems_per_side; points_per_channel = points_per_side; } - // note that in this case i use center geometry for edge subchannel else if (subch_type == EChannelType::EDGE) { number_of_center++; elems_per_channel = elems_per_center; points_per_channel = points_per_center; } + for (unsigned int iz = 0; iz < _n_cells; iz++) { - unsigned int elapsed_points = number_of_corner * points_per_corner * (_n_cells + 1) + - number_of_side * points_per_side * (_n_cells + 1) + - number_of_center * points_per_center * (_n_cells + 1) - - points_per_channel * (_n_cells + 1); - // index of the central node at base of cell - unsigned int indx1 = iz * points_per_channel + elapsed_points; - // index of the central node at top of cell - unsigned int indx2 = (iz + 1) * points_per_channel + elapsed_points; + const unsigned int elapsed_points = + number_of_corner * points_per_corner * (_n_cells + 1) + + number_of_side * points_per_side * (_n_cells + 1) + + number_of_center * points_per_center * (_n_cells + 1) - + points_per_channel * (_n_cells + 1); + const unsigned int indx1 = iz * points_per_channel + elapsed_points; + const unsigned int indx2 = (iz + 1) * points_per_channel + elapsed_points; for (unsigned int i = 0; i < elems_per_channel; i++) { Elem * elem = new Prism6; - elem->subdomain_id() = _block_id; - elem->set_id(elem_id++); + elem->subdomain_id() = _subchannel_block_id; + elem->set_id(_elem_id++); elem = mesh_base->add_elem(elem); - elem->set_node(0, mesh_base->node_ptr(indx1)); elem->set_node(1, mesh_base->node_ptr(indx1 + i + 1)); - if (i != elems_per_channel - 1) - elem->set_node(2, mesh_base->node_ptr(indx1 + i + 2)); - else - elem->set_node(2, mesh_base->node_ptr(indx1 + 1)); - + elem->set_node(2, + i != elems_per_channel - 1 ? mesh_base->node_ptr(indx1 + i + 2) + : mesh_base->node_ptr(indx1 + 1)); elem->set_node(3, mesh_base->node_ptr(indx2)); elem->set_node(4, mesh_base->node_ptr(indx2 + i + 1)); - if (i != elems_per_channel - 1) - elem->set_node(5, mesh_base->node_ptr(indx2 + i + 2)); - else - elem->set_node(5, mesh_base->node_ptr(indx2 + 1)); + elem->set_node(5, + i != elems_per_channel - 1 ? mesh_base->node_ptr(indx2 + i + 2) + : mesh_base->node_ptr(indx2 + 1)); if (iz == 0) boundary_info.add_side(elem, 0, 0); @@ -687,26 +599,19 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() } } } - } - boundary_info.sideset_name(0) = "inlet"; - boundary_info.sideset_name(1) = "outlet"; - mesh_base->subdomain_name(_block_id) = name(); - mesh_base->prepare_for_use(); } else { - unsigned int elem_id = 0; unsigned int number_of_corner = 0; unsigned int number_of_side = 0; unsigned int number_of_center = 0; unsigned int elems_per_channel = 0; unsigned int points_per_channel = 0; for (unsigned int iy = 0; iy < _ny; iy++) - { for (unsigned int ix = 0; ix < _nx; ix++) { - unsigned int i_ch = _nx * iy + ix; - auto subch_type = getSubchannelType(i_ch); + const unsigned int i_ch = _nx * iy + ix; + const auto subch_type = getSubchannelType(i_ch); if (subch_type == EChannelType::CORNER) { number_of_corner++; @@ -725,37 +630,33 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() elems_per_channel = elems_per_center; points_per_channel = points_per_center; } + for (unsigned int iz = 0; iz < _n_cells; iz++) { - unsigned int elapsed_points = number_of_corner * points_per_corner * (_n_cells + 1) + - number_of_side * points_per_side * (_n_cells + 1) + - number_of_center * points_per_center * (_n_cells + 1) - - points_per_channel * (_n_cells + 1); - // index of the central node at base of cell - unsigned int indx1 = iz * points_per_channel + elapsed_points; - // index of the central node at top of cell - unsigned int indx2 = (iz + 1) * points_per_channel + elapsed_points; + const unsigned int elapsed_points = + number_of_corner * points_per_corner * (_n_cells + 1) + + number_of_side * points_per_side * (_n_cells + 1) + + number_of_center * points_per_center * (_n_cells + 1) - + points_per_channel * (_n_cells + 1); + const unsigned int indx1 = iz * points_per_channel + elapsed_points; + const unsigned int indx2 = (iz + 1) * points_per_channel + elapsed_points; for (unsigned int i = 0; i < elems_per_channel; i++) { Elem * elem = new Prism6; - elem->subdomain_id() = _block_id; - elem->set_id(elem_id++); + elem->subdomain_id() = _subchannel_block_id; + elem->set_id(_elem_id++); elem = mesh_base->add_elem(elem); - elem->set_node(0, mesh_base->node_ptr(indx1)); elem->set_node(1, mesh_base->node_ptr(indx1 + i + 1)); - if (i != elems_per_channel - 1) - elem->set_node(2, mesh_base->node_ptr(indx1 + i + 2)); - else - elem->set_node(2, mesh_base->node_ptr(indx1 + 1)); - + elem->set_node(2, + i != elems_per_channel - 1 ? mesh_base->node_ptr(indx1 + i + 2) + : mesh_base->node_ptr(indx1 + 1)); elem->set_node(3, mesh_base->node_ptr(indx2)); elem->set_node(4, mesh_base->node_ptr(indx2 + i + 1)); - if (i != elems_per_channel - 1) - elem->set_node(5, mesh_base->node_ptr(indx2 + i + 2)); - else - elem->set_node(5, mesh_base->node_ptr(indx2 + 1)); + elem->set_node(5, + i != elems_per_channel - 1 ? mesh_base->node_ptr(indx2 + i + 2) + : mesh_base->node_ptr(indx2 + 1)); if (iz == 0) boundary_info.add_side(elem, 0, 0); @@ -764,12 +665,18 @@ SCMDetailedQuadSubChannelMeshGenerator::generate() } } } - } - boundary_info.sideset_name(0) = "inlet"; - boundary_info.sideset_name(1) = "outlet"; - mesh_base->subdomain_name(_block_id) = name(); - mesh_base->prepare_for_use(); } + if (n_pins > 0) + for (auto & ctr : pin_centers) + generatePin(mesh_base, ctr); + + boundary_info.sideset_name(0) = "inlet"; + boundary_info.sideset_name(1) = "outlet"; + mesh_base->subdomain_name(_subchannel_block_id) = "subchannel"; + if (n_pins > 0) + mesh_base->subdomain_name(_pin_block_id) = "fuel_pins"; + mesh_base->prepare_for_use(); + return mesh_base; } diff --git a/modules/subchannel/src/meshgenerators/SCMDetailedQuadPinMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMDetailedQuadPinMeshGenerator.C deleted file mode 100644 index 062a049c2527..000000000000 --- a/modules/subchannel/src/meshgenerators/SCMDetailedQuadPinMeshGenerator.C +++ /dev/null @@ -1,59 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#include "SCMDetailedQuadPinMeshGenerator.h" -#include "QuadSubChannelMesh.h" -#include "libmesh/cell_prism6.h" - -registerMooseObject("SubChannelApp", SCMDetailedQuadPinMeshGenerator); -registerMooseObjectRenamed("SubChannelApp", - DetailedQuadPinMeshGenerator, - "06/30/2025 24:00", - SCMDetailedQuadPinMeshGenerator); - -InputParameters -SCMDetailedQuadPinMeshGenerator::validParams() -{ - InputParameters params = DetailedPinMeshGeneratorBase::validParams(); - params.addClassDescription( - "Creates a detailed mesh of fuel pins in a square lattice arrangement"); - params.addRequiredParam("input", "The corresponding subchannel mesh"); - params.addRequiredParam("nx", "Number of channels in the x direction [-]"); - params.addRequiredParam("ny", "Number of channels in the y direction [-]"); - return params; -} - -SCMDetailedQuadPinMeshGenerator::SCMDetailedQuadPinMeshGenerator(const InputParameters & parameters) - : DetailedPinMeshGeneratorBase(parameters), - _input(getMesh("input")), - _nx(getParam("nx")), - _ny(getParam("ny")) -{ -} - -std::unique_ptr -SCMDetailedQuadPinMeshGenerator::generate() -{ - std::unique_ptr mesh_base = std::move(_input); - if (!mesh_base) - mesh_base = buildMeshBaseObject(); - mesh_base->set_mesh_dimension(3); - - std::vector pin_centers; - QuadSubChannelMesh::generatePinCenters(_nx, _ny, _pitch, 0, pin_centers); - - _elem_id = mesh_base->n_elem(); - for (auto & ctr : pin_centers) - generatePin(mesh_base, ctr); - - mesh_base->subdomain_name(_block_id) = name(); - mesh_base->prepare_for_use(); - - return mesh_base; -} diff --git a/modules/subchannel/src/meshgenerators/SCMQuadAssemblyMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMQuadAssemblyMeshGenerator.C index 0e9c021bc2b3..b19835b53a4e 100644 --- a/modules/subchannel/src/meshgenerators/SCMQuadAssemblyMeshGenerator.C +++ b/modules/subchannel/src/meshgenerators/SCMQuadAssemblyMeshGenerator.C @@ -264,70 +264,78 @@ SCMQuadAssemblyMeshGenerator::initializeChannelData() for (unsigned int ix = 0; ix < _nx; ix++) { const unsigned int i_ch = _nx * iy + ix; - - if (iy == 0 && ix == 0) - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); - else if (iy == _ny - 1 && ix == 0) - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); - else if (iy == 0 && ix == _nx - 1) - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); - else if (iy == _ny - 1 && ix == _nx - 1) - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); - else if (iy == 0) - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); - } - else if (iy == _ny - 1) - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); - } - else if (ix == 0) - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); - } - else if (ix == _nx - 1) - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); - } - else - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); - } - const Real offset_x = (_nx - 1) * _pitch / 2.0; const Real offset_y = (_ny - 1) * _pitch / 2.0; _subchannel_position[i_ch][0] = _pitch * ix - offset_x; _subchannel_position[i_ch][1] = _pitch * iy - offset_y; } - for (unsigned int ig = 0; ig < _n_gaps; ig++) + if (_n_pins > 0) { - const auto i_ch = _gap_to_chan_map[ig].first; - const auto j_ch = _gap_to_chan_map[ig].second; - const auto & i_pins = _chan_to_pin_map[i_ch]; - const auto & j_pins = _chan_to_pin_map[j_ch]; - - _gap_to_pin_map[ig] = {10000, 10000}; + for (unsigned int iy = 0; iy < _ny; iy++) + for (unsigned int ix = 0; ix < _nx; ix++) + { + const unsigned int i_ch = _nx * iy + ix; - for (unsigned int i : i_pins) - for (unsigned int j : j_pins) - if (i == j) + if (iy == 0 && ix == 0) + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); + else if (iy == _ny - 1 && ix == 0) + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); + else if (iy == 0 && ix == _nx - 1) + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); + else if (iy == _ny - 1 && ix == _nx - 1) + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); + else if (iy == 0) { - if (_gap_to_pin_map[ig].first == 10000) + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); + } + else if (iy == _ny - 1) + { + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); + } + else if (ix == 0) + { + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); + } + else if (ix == _nx - 1) + { + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); + } + else + { + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); + _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); + } + } + + for (unsigned int ig = 0; ig < _n_gaps; ig++) + { + const auto i_ch = _gap_to_chan_map[ig].first; + const auto j_ch = _gap_to_chan_map[ig].second; + const auto & i_pins = _chan_to_pin_map[i_ch]; + const auto & j_pins = _chan_to_pin_map[j_ch]; + + _gap_to_pin_map[ig] = {10000, 10000}; + + for (unsigned int i : i_pins) + for (unsigned int j : j_pins) + if (i == j) { - _gap_to_pin_map[ig].first = i; - _gap_to_pin_map[ig].second = i; + if (_gap_to_pin_map[ig].first == 10000) + { + _gap_to_pin_map[ig].first = i; + _gap_to_pin_map[ig].second = i; + } + else + _gap_to_pin_map[ig].second = i; } - else - _gap_to_pin_map[ig].second = i; - } + } } for (auto & gap : _chan_to_gap_map) @@ -465,7 +473,7 @@ SCMQuadAssemblyMeshGenerator::transferMetadata(QuadSubChannelMesh & sch_mesh) sch_mesh._subch_type = _subch_type; sch_mesh._duct_mesh_exist = false; - sch_mesh._pin_mesh_exist = true; + sch_mesh._pin_mesh_exist = (_n_pins > 0); } std::unique_ptr @@ -477,7 +485,9 @@ SCMQuadAssemblyMeshGenerator::generate() mesh_base->set_spatial_dimension(3); buildSubchannelMesh(*mesh_base, boundary_info); - buildPinMesh(*mesh_base); + + if (_n_pins > 0) + buildPinMesh(*mesh_base); boundary_info.sideset_name(0) = "inlet"; boundary_info.sideset_name(1) = "outlet"; diff --git a/modules/subchannel/src/meshgenerators/SCMQuadPinMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMQuadPinMeshGenerator.C deleted file mode 100644 index 5cdacb66dd6d..000000000000 --- a/modules/subchannel/src/meshgenerators/SCMQuadPinMeshGenerator.C +++ /dev/null @@ -1,120 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#include "SCMQuadPinMeshGenerator.h" -#include "QuadSubChannelMesh.h" -#include "libmesh/edge_edge2.h" - -registerMooseObject("SubChannelApp", SCMQuadPinMeshGenerator); -registerMooseObjectRenamed("SubChannelApp", - QuadPinMeshGenerator, - "06/30/2025 24:00", - SCMQuadPinMeshGenerator); - -InputParameters -SCMQuadPinMeshGenerator::validParams() -{ - InputParameters params = MeshGenerator::validParams(); - params.addClassDescription("Creates a mesh of 1D fuel pins in a square lattice arrangement"); - params.addRequiredParam("input", "The corresponding subchannel mesh"); - params.addParam("unheated_length_entry", 0.0, "Unheated length at entry [m]"); - params.addRequiredParam("heated_length", "Heated length [m]"); - params.addParam("unheated_length_exit", 0.0, "Unheated length at exit [m]"); - params.addRequiredParam("pitch", "Pitch [m]"); - params.addRequiredParam("nx", "Number of subchannels in the x direction [-]"); - params.addRequiredParam("ny", "Number of subchannels in the y direction [-]"); - params.addRequiredParam("n_cells", "The number of cells in the axial direction"); - params.addParam("block_id", 1, "Domain Index"); - return params; -} - -SCMQuadPinMeshGenerator::SCMQuadPinMeshGenerator(const InputParameters & params) - : MeshGenerator(params), - _input(getMesh("input")), - _unheated_length_entry(getParam("unheated_length_entry")), - _heated_length(getParam("heated_length")), - _unheated_length_exit(getParam("unheated_length_exit")), - _pitch(getParam("pitch")), - _nx(getParam("nx")), - _ny(getParam("ny")), - _n_cells(getParam("n_cells")), - _block_id(getParam("block_id")) -{ - Real dz = (_unheated_length_entry + _heated_length + _unheated_length_exit) / _n_cells; - for (unsigned int i = 0; i < _n_cells + 1; i++) - _z_grid.push_back(dz * i); -} - -std::unique_ptr -SCMQuadPinMeshGenerator::generate() -{ - std::unique_ptr mesh_base = std::move(_input); - if (!mesh_base) - mesh_base = buildMeshBaseObject(); - mesh_base->set_mesh_dimension(3); - mesh_base->reserve_elem(_n_cells * (_ny - 1) * (_nx - 1)); - mesh_base->reserve_nodes((_n_cells + 1) * (_ny - 1) * (_nx - 1)); - _pin_nodes.resize((_nx - 1) * (_ny - 1)); - // number of nodes in subchannel mesh - unsigned int node_sub = (_n_cells + 1) * _ny * _nx; - // number of elements in subchannel mesh - unsigned int elem_sub = _n_cells * _ny * _nx; - - // Add the points in the shape of a rectilinear grid. The grid is regular - // on the xy-plane with a spacing of `pitch` between points. The grid along - // z is also regular. Store pointers in the _nodes - // array so we can keep track of which points are in which pins. - Real offset_x = (_nx - 2) * _pitch / 2.0; - Real offset_y = (_ny - 2) * _pitch / 2.0; - unsigned int node_id = node_sub; - for (unsigned int iy = 0; iy < _ny - 1; iy++) - { - for (unsigned int ix = 0; ix < _nx - 1; ix++) - { - int i_node = (_nx - 1) * iy + ix; - _pin_nodes[i_node].reserve(_n_cells); - for (unsigned int iz = 0; iz < _n_cells + 1; iz++) - { - _pin_nodes[i_node].push_back(mesh_base->add_point( - Point(_pitch * ix - offset_x, _pitch * iy - offset_y, _z_grid[iz]), node_id++)); - } - } - } - - // Add the elements which in this case are 2-node edges that link each - // subchannel's nodes vertically. - unsigned int elem_id = elem_sub; - for (unsigned int iy = 0; iy < _ny - 1; iy++) - { - for (unsigned int ix = 0; ix < _nx - 1; ix++) - { - for (unsigned int iz = 0; iz < _n_cells; iz++) - { - Elem * elem = new Edge2; - elem->subdomain_id() = _block_id; - elem->set_id(elem_id++); - elem = mesh_base->add_elem(elem); - const int indx1 = ((_n_cells + 1) * (_nx - 1)) * iy + (_n_cells + 1) * ix + iz + node_sub; - const int indx2 = - ((_n_cells + 1) * (_nx - 1)) * iy + (_n_cells + 1) * ix + (iz + 1) + node_sub; - elem->set_node(0, mesh_base->node_ptr(indx1)); - elem->set_node(1, mesh_base->node_ptr(indx2)); - } - } - } - mesh_base->subdomain_name(_block_id) = name(); - mesh_base->prepare_for_use(); - - // move the meta data into QuadSubChannelMesh - auto & sch_mesh = static_cast(*_mesh); - sch_mesh._pin_nodes = _pin_nodes; - sch_mesh._pin_mesh_exist = true; - - return mesh_base; -} diff --git a/modules/subchannel/src/meshgenerators/SCMQuadSubChannelMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMQuadSubChannelMeshGenerator.C deleted file mode 100644 index 14e6e67fce9d..000000000000 --- a/modules/subchannel/src/meshgenerators/SCMQuadSubChannelMeshGenerator.C +++ /dev/null @@ -1,489 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#include "SCMQuadSubChannelMeshGenerator.h" -#include "QuadSubChannelMesh.h" -#include "libmesh/edge_edge2.h" -#include - -registerMooseObject("SubChannelApp", SCMQuadSubChannelMeshGenerator); -registerMooseObjectRenamed("SubChannelApp", - QuadSubChannelMeshGenerator, - "06/30/2025 24:00", - SCMQuadSubChannelMeshGenerator); - -InputParameters -SCMQuadSubChannelMeshGenerator::validParams() -{ - InputParameters params = MeshGenerator::validParams(); - params.addClassDescription("Creates a mesh of 1D subchannels in a square lattice arrangement"); - params.addRequiredParam("pitch", "Pitch [m]"); - params.addRequiredParam("pin_diameter", "Rod diameter [m]"); - params.addParam("unheated_length_entry", 0.0, "Unheated length at entry [m]"); - params.addRequiredParam("heated_length", "Heated length [m]"); - params.addParam("unheated_length_exit", 0.0, "Unheated length at exit [m]"); - params.addParam>( - "spacer_z", {}, "Axial location of spacers/vanes/mixing_vanes [m]"); - params.addParam>( - "spacer_k", {}, "K-loss coefficient of spacers/vanes/mixing_vanes [-]"); - params.addParam>("z_blockage", - std::vector({0.0, 0.0}), - "axial location of blockage (inlet, outlet) [m]"); - params.addParam>("index_blockage", - std::vector({0}), - "index of subchannels affected by blockage"); - params.addParam>( - "reduction_blockage", - std::vector({1.0}), - "Area reduction of subchannels affected by blockage (number to muliply the area)"); - params.addParam>("k_blockage", - std::vector({0.0}), - "Form loss coefficient of subchannels affected by blockage"); - - params.addParam("Kij", 0.5, "Lateral form loss coefficient [-]"); - params.addRequiredParam("n_cells", "The number of cells in the axial direction"); - params.addRequiredParam("nx", "Number of channels in the x direction [-]"); - params.addRequiredParam("ny", "Number of channels in the y direction [-]"); - params.addRequiredParam( - "gap", - "The side gap, not to be confused with the gap between pins, this refers to the gap " - "next to the duct or else the distance between the subchannel centroid to the duct wall." - "distance(edge pin center, duct wall) = pitch / 2 + side_gap [m]"); - params.deprecateParam("gap", "side_gap", "08/06/2026"); - params.addParam("block_id", 0, "Domain Index"); - return params; -} - -SCMQuadSubChannelMeshGenerator::SCMQuadSubChannelMeshGenerator(const InputParameters & params) - : MeshGenerator(params), - _unheated_length_entry(getParam("unheated_length_entry")), - _heated_length(getParam("heated_length")), - _unheated_length_exit(getParam("unheated_length_exit")), - _spacer_z(getParam>("spacer_z")), - _spacer_k(getParam>("spacer_k")), - _z_blockage(getParam>("z_blockage")), - _index_blockage(getParam>("index_blockage")), - _reduction_blockage(getParam>("reduction_blockage")), - _k_blockage(getParam>("k_blockage")), - _kij(getParam("Kij")), - _pitch(getParam("pitch")), - _pin_diameter(getParam("pin_diameter")), - _n_cells(getParam("n_cells")), - _nx(getParam("nx")), - _ny(getParam("ny")), - _n_channels(_nx * _ny), - _n_gaps((_nx - 1) * _ny + (_ny - 1) * _nx), - _n_pins((_nx - 1) * (_ny - 1)), - _side_gap(getParam("side_gap")), - _block_id(getParam("block_id")) -{ - if (_spacer_z.size() != _spacer_k.size()) - mooseError(name(), ": Size of vector spacer_z should be equal to size of vector spacer_k"); - - if (_spacer_z.size() && - _spacer_z.back() > _unheated_length_entry + _heated_length + _unheated_length_exit) - mooseError(name(), ": Location of spacers should be less than the total bundle length"); - - if (_z_blockage.size() != 2) - mooseError(name(), ": Size of vector z_blockage must be 2"); - - if (*max_element(_index_blockage.begin(), _index_blockage.end()) > (_n_channels - 1)) - mooseError(name(), - ": The index of the blocked subchannel cannot be more than the max index of the " - "subchannels"); - - if (*max_element(_reduction_blockage.begin(), _reduction_blockage.end()) > 1) - mooseError(name(), ": The area reduction of the blocked subchannels cannot be more than 1"); - - if ((_index_blockage.size() > _nx * _ny) || (_reduction_blockage.size() > _nx * _ny) || - (_k_blockage.size() > _nx * _ny)) - mooseError(name(), - ": Size of vectors: index_blockage, reduction_blockage, k_blockage, cannot be more " - "than the total number of subchannels"); - - if ((_index_blockage.size() != _reduction_blockage.size()) || - (_index_blockage.size() != _k_blockage.size()) || - (_reduction_blockage.size() != _k_blockage.size())) - mooseError(name(), - ": Size of vectors: index_blockage, reduction_blockage, k_blockage, must be equal " - "to eachother"); - - if (_nx < 2 && _ny < 2) - mooseError(name(), - ": The number of subchannels cannot be less than 2 in both directions (x and y). " - "Smallest assembly allowed is either 2X1 or 1X2. "); - - SubChannelMesh::generateZGrid( - _unheated_length_entry, _heated_length, _unheated_length_exit, _n_cells, _z_grid); - - // Defining the total length from 3 axial sections - Real L = _unheated_length_entry + _heated_length + _unheated_length_exit; - - // Defining the position of the spacer grid in the numerical solution array - std::vector spacer_cell; - for (const auto & elem : _spacer_z) - spacer_cell.emplace_back(std::round(elem * _n_cells / L)); - - // Defining the arrays for axial resistances - std::vector kgrid; - kgrid.resize(_n_cells + 1, 0.0); - _k_grid.resize(_n_channels, std::vector(_n_cells + 1)); - - // Summing the spacer resistance to the 1D grid resistance array - for (unsigned int index = 0; index < spacer_cell.size(); index++) - kgrid[spacer_cell[index]] += _spacer_k[index]; - - // Creating the 2D grid resistance array - for (unsigned int i = 0; i < _n_channels; i++) - _k_grid[i] = kgrid; - - // Add blockage resistance to the 2D grid resistane array - Real dz = L / _n_cells; - for (unsigned int i = 0; i < _n_cells + 1; i++) - { - if ((dz * i >= _z_blockage.front() && dz * i <= _z_blockage.back())) - { - unsigned int index(0); - for (const auto & i_ch : _index_blockage) - { - _k_grid[i_ch][i] += _k_blockage[index]; - index++; - } - } - } - - // Defining the size of the maps - _gap_to_chan_map.resize(_n_gaps); - _gap_to_pin_map.resize(_n_gaps); - _gapnodes.resize(_n_gaps); - _chan_to_gap_map.resize(_n_channels); - _chan_to_pin_map.resize(_n_channels); - _pin_to_chan_map.resize(_n_pins); - _sign_id_crossflow_map.resize(_n_channels); - _gij_map.resize(_n_cells + 1); - _subchannel_position.resize(_n_channels); - - for (unsigned int i = 0; i < _n_channels; i++) - { - _subchannel_position[i].reserve(3); - for (unsigned int j = 0; j < 3; j++) - { - _subchannel_position.at(i).push_back(0.0); - } - } - - for (unsigned int iz = 0; iz < _n_cells + 1; iz++) - { - _gij_map[iz].reserve(_n_gaps); - } - - // Defining the signs for positive and negative flows - Real positive_flow = 1.0; - Real negative_flow = -1.0; - - // Defining the subchannel types - _subch_type.resize(_n_channels); - for (unsigned int iy = 0; iy < _ny; iy++) - { - for (unsigned int ix = 0; ix < _nx; ix++) - { - unsigned int i_ch = _nx * iy + ix; - bool is_corner = (ix == 0 && iy == 0) || (ix == _nx - 1 && iy == 0) || - (ix == 0 && iy == _ny - 1) || (ix == _nx - 1 && iy == _ny - 1); - bool is_edge = (ix == 0 || iy == 0 || ix == _nx - 1 || iy == _ny - 1); - - if (_n_channels == 2) - { - _subch_type[i_ch] = EChannelType::CENTER; - } - else if (_n_channels == 4) - { - _subch_type[i_ch] = EChannelType::CORNER; - } - else - { - if (is_corner) - _subch_type[i_ch] = EChannelType::CORNER; - else if (is_edge) - _subch_type[i_ch] = EChannelType::EDGE; - else - _subch_type[i_ch] = EChannelType::CENTER; - } - } - } - - // Index the east-west gaps. - unsigned int i_gap = 0; - for (unsigned int iy = 0; iy < _ny; iy++) - { - for (unsigned int ix = 0; ix < _nx - 1; ix++) - { - unsigned int i_ch = _nx * iy + ix; - unsigned int j_ch = _nx * iy + (ix + 1); - _gap_to_chan_map[i_gap] = {i_ch, j_ch}; - _chan_to_gap_map[i_ch].push_back(i_gap); - _chan_to_gap_map[j_ch].push_back(i_gap); - _sign_id_crossflow_map[i_ch].push_back(positive_flow); - _sign_id_crossflow_map[j_ch].push_back(negative_flow); - - // make a gap size map - if (iy == 0 || iy == _ny - 1) - _gij_map[0].push_back((_pitch - _pin_diameter) / 2 + _side_gap); - else - _gij_map[0].push_back(_pitch - _pin_diameter); - ++i_gap; - } - } - - // Index the north-south gaps. - for (unsigned int iy = 0; iy < _ny - 1; iy++) - { - for (unsigned int ix = 0; ix < _nx; ix++) - { - unsigned int i_ch = _nx * iy + ix; - unsigned int j_ch = _nx * (iy + 1) + ix; - _gap_to_chan_map[i_gap] = {i_ch, j_ch}; - _chan_to_gap_map[i_ch].push_back(i_gap); - _chan_to_gap_map[j_ch].push_back(i_gap); - _sign_id_crossflow_map[i_ch].push_back(positive_flow); - _sign_id_crossflow_map[j_ch].push_back(negative_flow); - - // make a gap size map - if (ix == 0 || ix == _nx - 1) - _gij_map[0].push_back((_pitch - _pin_diameter) / 2 + _side_gap); - else - _gij_map[0].push_back(_pitch - _pin_diameter); - ++i_gap; - } - } - - for (unsigned int iz = 1; iz < _n_cells + 1; iz++) - { - _gij_map[iz] = _gij_map[0]; - } - - // Make pin to channel map - for (unsigned int iy = 0; iy < _ny - 1; iy++) - { - for (unsigned int ix = 0; ix < _nx - 1; ix++) - { - unsigned int i_pin = (_nx - 1) * iy + ix; - unsigned int i_chan_1 = _nx * iy + ix; - unsigned int i_chan_2 = _nx * (iy + 1) + ix; - unsigned int i_chan_3 = _nx * (iy + 1) + (ix + 1); - unsigned int i_chan_4 = _nx * iy + (ix + 1); - _pin_to_chan_map[i_pin].push_back(i_chan_1); - _pin_to_chan_map[i_pin].push_back(i_chan_2); - _pin_to_chan_map[i_pin].push_back(i_chan_3); - _pin_to_chan_map[i_pin].push_back(i_chan_4); - } - } - - // Make channel to pin map - for (unsigned int iy = 0; iy < _ny; iy++) // row - { - for (unsigned int ix = 0; ix < _nx; ix++) // column - { - unsigned int i_ch = _nx * iy + ix; - // Corners contact 1/4 of one pin - if (iy == 0 && ix == 0) - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); - } - else if (iy == _ny - 1 && ix == 0) - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); - } - else if (iy == 0 && ix == _nx - 1) - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); - } - else if (iy == _ny - 1 && ix == _nx - 1) - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); - } - // Sides contact 1/4 of two pins - else if (iy == 0) - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); - } - else if (iy == _ny - 1) - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); - } - else if (ix == 0) - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); - } - else if (ix == _nx - 1) - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); - } - // interior contacts 1/4 of 4 pins - else - { - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * iy + ix - 1); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix); - _chan_to_pin_map[i_ch].push_back((_nx - 1) * (iy - 1) + ix - 1); - } - - // set the subchannel positions - Real offset_x = (_nx - 1) * _pitch / 2.0; - Real offset_y = (_ny - 1) * _pitch / 2.0; - _subchannel_position[i_ch][0] = _pitch * ix - offset_x; - _subchannel_position[i_ch][1] = _pitch * iy - offset_y; - } - } - - // Make gap to pin map - for (unsigned int i_gap = 0; i_gap < _n_gaps; i_gap++) - { - auto i_ch = _gap_to_chan_map[i_gap].first; - auto j_ch = _gap_to_chan_map[i_gap].second; - auto i_pins = _chan_to_pin_map[i_ch]; - auto j_pins = _chan_to_pin_map[j_ch]; - _gap_to_pin_map[i_gap] = {10000, 10000}; // Initialize with default values - - for (unsigned int i : i_pins) - { - for (unsigned int j : j_pins) - { - if (i == j) - { - if (_gap_to_pin_map[i_gap].first == 10000) - { - _gap_to_pin_map[i_gap].first = i; - _gap_to_pin_map[i_gap].second = i; - } - else - { - _gap_to_pin_map[i_gap].second = i; - } - } - } - } - } - - // Reduce reserved memory in the channel-to-gap map. - for (auto & gap : _chan_to_gap_map) - gap.shrink_to_fit(); - - // Reduce reserved memory in the channel-to-pin map. - for (auto & pin : _chan_to_pin_map) - pin.shrink_to_fit(); - - // Reduce reserved memory in the pin-to-channel map. - for (auto & pin : _pin_to_chan_map) - pin.shrink_to_fit(); -} - -std::unique_ptr -SCMQuadSubChannelMeshGenerator::generate() -{ - auto mesh_base = buildMeshBaseObject(); - BoundaryInfo & boundary_info = mesh_base->get_boundary_info(); - mesh_base->set_spatial_dimension(3); - mesh_base->reserve_elem(_n_cells * _ny * _nx); - mesh_base->reserve_nodes((_n_cells + 1) * _ny * _nx); - _nodes.resize(_nx * _ny); - // Add the points in the shape of a rectilinear grid. The grid is regular - // on the xy-plane with a spacing of `pitch` between points. The grid along - // z is irregular to account for Pin spacers. Store pointers in the _nodes - // array so we can keep track of which points are in which channels. - Real offset_x = (_nx - 1) * _pitch / 2.0; - Real offset_y = (_ny - 1) * _pitch / 2.0; - unsigned int node_id = 0; - for (unsigned int iy = 0; iy < _ny; iy++) - { - for (unsigned int ix = 0; ix < _nx; ix++) - { - int i_ch = _nx * iy + ix; - _nodes[i_ch].reserve(_n_cells); - for (unsigned int iz = 0; iz < _n_cells + 1; iz++) - { - _nodes[i_ch].push_back(mesh_base->add_point( - Point(_pitch * ix - offset_x, _pitch * iy - offset_y, _z_grid[iz]), node_id++)); - } - } - } - - // Add the elements which in this case are 2-node edges that link each - // subchannel's nodes vertically. - unsigned int elem_id = 0; - for (unsigned int iy = 0; iy < _ny; iy++) - { - for (unsigned int ix = 0; ix < _nx; ix++) - { - for (unsigned int iz = 0; iz < _n_cells; iz++) - { - Elem * elem = new Edge2; - elem->subdomain_id() = _block_id; - elem->set_id(elem_id++); - elem = mesh_base->add_elem(elem); - const int indx1 = ((_n_cells + 1) * _nx) * iy + (_n_cells + 1) * ix + iz; - const int indx2 = ((_n_cells + 1) * _nx) * iy + (_n_cells + 1) * ix + (iz + 1); - elem->set_node(0, mesh_base->node_ptr(indx1)); - elem->set_node(1, mesh_base->node_ptr(indx2)); - - if (iz == 0) - boundary_info.add_side(elem, 0, 0); - if (iz == _n_cells - 1) - boundary_info.add_side(elem, 1, 1); - } - } - } - - boundary_info.sideset_name(0) = "inlet"; - boundary_info.sideset_name(1) = "outlet"; - boundary_info.nodeset_name(0) = "inlet"; - boundary_info.nodeset_name(1) = "outlet"; - mesh_base->subdomain_name(_block_id) = name(); - mesh_base->prepare_for_use(); - - // move the meta data into QuadSubChannelMesh - auto & sch_mesh = static_cast(*_mesh); - sch_mesh._unheated_length_entry = _unheated_length_entry; - sch_mesh._heated_length = _heated_length; - sch_mesh._unheated_length_exit = _unheated_length_exit; - sch_mesh._z_grid = _z_grid; - sch_mesh._k_grid = _k_grid; - sch_mesh._spacer_z = _spacer_z; - sch_mesh._spacer_k = _spacer_k; - sch_mesh._z_blockage = _z_blockage; - sch_mesh._index_blockage = _index_blockage; - sch_mesh._reduction_blockage = _reduction_blockage; - sch_mesh._kij = _kij; - sch_mesh._pitch = _pitch; - sch_mesh._pin_diameter = _pin_diameter; - sch_mesh._n_cells = _n_cells; - sch_mesh._nx = _nx; - sch_mesh._ny = _ny; - sch_mesh._n_channels = _n_channels; - sch_mesh._n_gaps = _n_gaps; - sch_mesh._n_pins = _n_pins; - sch_mesh._side_gap = _side_gap; - sch_mesh._nodes = _nodes; - sch_mesh._gapnodes = _gapnodes; - sch_mesh._gap_to_chan_map = _gap_to_chan_map; - sch_mesh._gap_to_pin_map = _gap_to_pin_map; - sch_mesh._chan_to_gap_map = _chan_to_gap_map; - sch_mesh._chan_to_pin_map = _chan_to_pin_map; - sch_mesh._pin_to_chan_map = _pin_to_chan_map; - sch_mesh._sign_id_crossflow_map = _sign_id_crossflow_map; - sch_mesh._gij_map = _gij_map; - sch_mesh._subchannel_position = _subchannel_position; - sch_mesh._subch_type = _subch_type; - - return mesh_base; -} diff --git a/modules/subchannel/src/transfers/SCMPinSolutionTransfer.C b/modules/subchannel/src/transfers/SCMPinSolutionTransfer.C deleted file mode 100644 index fe25f374c78f..000000000000 --- a/modules/subchannel/src/transfers/SCMPinSolutionTransfer.C +++ /dev/null @@ -1,39 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#include "SCMPinSolutionTransfer.h" -#include "SubChannelMesh.h" - -registerMooseObject("SubChannelApp", SCMPinSolutionTransfer); -registerMooseObjectRenamed("SubChannelApp", - PinSolutionTransfer, - "06/30/2025 24:00", - SCMPinSolutionTransfer); - -InputParameters -SCMPinSolutionTransfer::validParams() -{ - InputParameters params = SCMSolutionTransferBase::validParams(); - params.addClassDescription( - "Transfers pin solution from computational mesh onto visualization mesh"); - return params; -} - -SCMPinSolutionTransfer::SCMPinSolutionTransfer(const InputParameters & parameters) - : SCMSolutionTransferBase(parameters) -{ -} - -Node * -SCMPinSolutionTransfer::getFromNode(const SubChannelMesh & from_mesh, const Point & src_node) -{ - unsigned int pin_idx = from_mesh.pinIndex(src_node); - unsigned iz = from_mesh.getZIndex(src_node); - return from_mesh.getPinNode(pin_idx, iz); -} diff --git a/modules/subchannel/src/transfers/SCMSolutionTransfer.C b/modules/subchannel/src/transfers/SCMSolutionTransfer.C index e10b97600fa2..c755afaac38b 100644 --- a/modules/subchannel/src/transfers/SCMSolutionTransfer.C +++ b/modules/subchannel/src/transfers/SCMSolutionTransfer.C @@ -8,6 +8,9 @@ //* https://www.gnu.org/licenses/lgpl-2.1.html #include "SCMSolutionTransfer.h" +#include "MultiApp.h" +#include "FEProblemBase.h" +#include "DisplacedProblem.h" #include "SubChannelMesh.h" registerMooseObject("SubChannelApp", SCMSolutionTransfer); @@ -15,25 +18,165 @@ registerMooseObjectRenamed("SubChannelApp", SolutionTransfer, "06/30/2025 24:00", SCMSolutionTransfer); +registerMooseObjectRenamed("SubChannelApp", + SCMPinSolutionTransfer, + "06/30/2027 24:00", + SCMSolutionTransfer); +registerMooseObjectRenamed("SubChannelApp", + PinSolutionTransfer, + "06/30/2027 24:00", + SCMSolutionTransfer); InputParameters SCMSolutionTransfer::validParams() { - InputParameters params = SCMSolutionTransferBase::validParams(); + InputParameters params = MultiAppTransfer::validParams(); + params.addRequiredParam>("variable", + "The auxiliary variables to transfer."); + MooseEnum transfer_type("subchannel pin", "subchannel"); + params.addParam("transfer_type", + transfer_type, + "Whether to transfer subchannel-centered or pin-centered fields."); params.addClassDescription( - "Transfers subchannel solution from computational mesh onto visualization mesh"); + "Transfers subchannel or pin solutions from a SubChannel mesh onto a visualization mesh."); return params; } SCMSolutionTransfer::SCMSolutionTransfer(const InputParameters & parameters) - : SCMSolutionTransferBase(parameters) + : MultiAppTransfer(parameters), + _var_names(getParam>("variable")), + _pin_transfer(getParam("transfer_type") == "pin") +{ + if (_directions.contains(Transfer::FROM_MULTIAPP)) + paramError("from_multiapp", "This transfer works only into multi-app."); +} + +void +SCMSolutionTransfer::initialSetup() +{ + MultiAppTransfer::initialSetup(); + for (std::size_t var_index = 0; var_index < _var_names.size(); ++var_index) + { + if (_to_problems.empty()) + continue; + + MooseVariableFieldBase & from_var = _subproblem.getVariable( + 0, _var_names[var_index], Moose::VarKindType::VAR_ANY, Moose::VarFieldType::VAR_FIELD_ANY); + System & from_sys = from_var.sys().system(); + const auto & fe_type = from_sys.variable_type(from_var.number()); + + if (fe_type.family != LAGRANGE || fe_type.order != FIRST) + paramError("variable", + "This transfer requires a first order Lagrange variable for the source variable"); + + MooseVariableFieldBase & to_var = _to_problems[0]->getVariable( + 0, _var_names[var_index], Moose::VarKindType::VAR_ANY, Moose::VarFieldType::VAR_FIELD_ANY); + + System & to_sys = to_var.sys().system(); + const auto & fe_type_target = to_sys.variable_type(to_var.number()); + + if (fe_type_target.family != LAGRANGE || fe_type_target.order != FIRST) + paramError("variable", + "This transfer requires a first order Lagrange variable for the source variable"); + } +} + +void +SCMSolutionTransfer::execute() { + TIME_SECTION( + "MultiAppDetailedSolutionBaseTransfer::execute()", 5, "Transferring subchannel solutions"); + getAppInfo(); + + switch (_current_direction) + { + case TO_MULTIAPP: + transferToMultiApps(); + break; + + default: + break; + } +} + +void +SCMSolutionTransfer::transferToMultiApps() +{ + mooseAssert(_from_meshes.size() == 1, "Only one source mesh can be active in this transfer."); + auto * from_mesh = dynamic_cast(_from_meshes[0]); + if (from_mesh == nullptr) + mooseError("This transfer works only with SubChannelMesh classes."); + if (_pin_transfer && !from_mesh->pinMeshExist()) + mooseError("This transfer was configured for pin variables, but the source mesh has no pin mesh."); + + for (unsigned int i = 0; i < getToMultiApp()->numGlobalApps(); i++) + if (getToMultiApp()->hasLocalApp(i)) + transferVarsToApp(i); +} + +void +SCMSolutionTransfer::transferVarsToApp(unsigned int app_idx) +{ + transferNodalVars(app_idx); +} + +void +SCMSolutionTransfer::transferNodalVars(unsigned int app_idx) +{ + Moose::ScopedCommSwapper swapper(getToMultiApp()->comm()); + + FEProblemBase & to_problem = getToMultiApp()->appProblemBase(app_idx); + MooseMesh * mesh = NULL; + if (_displaced_target_mesh && to_problem.getDisplacedProblem()) + mesh = &to_problem.getDisplacedProblem()->mesh(); + else + mesh = &to_problem.mesh(); + + const SubChannelMesh & from_mesh = dynamic_cast(*_from_meshes[0]); + FEProblemBase & from_problem = *_from_problems[0]; + + for (auto & node : mesh->getMesh().local_node_ptr_range()) + { + if (processor_id() != 0) + continue; + Node * from_node = getFromNode(from_mesh, *node); + + for (auto & var_name : _var_names) + { + System * to_sys = find_sys(to_problem.es(), var_name); + unsigned int to_sys_num = to_sys->number(); + unsigned int to_var_num = to_sys->variable_number(var_name); + + if (node->n_dofs(to_sys_num, to_var_num) > 0) + { + System * from_sys = find_sys(from_problem.es(), var_name); + unsigned int from_sys_num = from_sys->number(); + unsigned int from_var_num = from_sys->variable_number(var_name); + + swapper.forceSwap(); + NumericVector * from_solution = from_sys->solution.get(); + dof_id_type from_dof = from_node->dof_number(from_sys_num, from_var_num, 0); + Real from_value = (*from_solution)(from_dof); + swapper.forceSwap(); + + NumericVector & to_solution = getToMultiApp()->appTransferVector(app_idx, var_name); + dof_id_type to_dof = node->dof_number(to_sys_num, to_var_num, 0); + to_solution.set(to_dof, from_value); + } + } + } + + for (auto & var_name : _var_names) + { + getToMultiApp()->appTransferVector(app_idx, var_name).close(); + find_sys(to_problem.es(), var_name)->update(); + } } Node * SCMSolutionTransfer::getFromNode(const SubChannelMesh & from_mesh, const Point & src_node) { - unsigned int sch_idx = from_mesh.channelIndex(src_node); + unsigned int sch_idx = _pin_transfer ? from_mesh.pinIndex(src_node) : from_mesh.channelIndex(src_node); unsigned iz = from_mesh.getZIndex(src_node); - return from_mesh.getChannelNode(sch_idx, iz); + return _pin_transfer ? from_mesh.getPinNode(sch_idx, iz) : from_mesh.getChannelNode(sch_idx, iz); } diff --git a/modules/subchannel/src/transfers/SCMSolutionTransferBase.C b/modules/subchannel/src/transfers/SCMSolutionTransferBase.C deleted file mode 100644 index 2ba64007ba0c..000000000000 --- a/modules/subchannel/src/transfers/SCMSolutionTransferBase.C +++ /dev/null @@ -1,153 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#include "SCMSolutionTransferBase.h" -#include "MultiApp.h" -#include "FEProblemBase.h" -#include "DisplacedProblem.h" -#include "SubChannelMesh.h" - -InputParameters -SCMSolutionTransferBase::validParams() -{ - InputParameters params = MultiAppTransfer::validParams(); - params.addRequiredParam>("variable", - "The auxiliary variables to transfer."); - return params; -} - -SCMSolutionTransferBase::SCMSolutionTransferBase(const InputParameters & parameters) - : MultiAppTransfer(parameters), _var_names(getParam>("variable")) -{ - if (_directions.contains(Transfer::FROM_MULTIAPP)) - paramError("from_multiapp", "This transfer works only into multi-app."); -} - -void -SCMSolutionTransferBase::initialSetup() -{ - MultiAppTransfer::initialSetup(); - for (std::size_t var_index = 0; var_index < _var_names.size(); ++var_index) - { - // No local app, we cannot examine the target variable - if (_to_problems.empty()) - continue; - - // Check source variable on regular subchannel problem - MooseVariableFieldBase & from_var = _subproblem.getVariable( - 0, _var_names[var_index], Moose::VarKindType::VAR_ANY, Moose::VarFieldType::VAR_FIELD_ANY); - System & from_sys = from_var.sys().system(); - const auto & fe_type = from_sys.variable_type(from_var.number()); - - if (fe_type.family != LAGRANGE || fe_type.order != FIRST) - paramError("variable", - "This transfer requires a first order Lagrange variable for the source variable"); - - // Check target variable in visualization mesh - MooseVariableFieldBase & to_var = _to_problems[0]->getVariable( - 0, _var_names[var_index], Moose::VarKindType::VAR_ANY, Moose::VarFieldType::VAR_FIELD_ANY); - - System & to_sys = to_var.sys().system(); - const auto & fe_type_target = to_sys.variable_type(to_var.number()); - - if (fe_type_target.family != LAGRANGE || fe_type_target.order != FIRST) - paramError("variable", - "This transfer requires a first order Lagrange variable for the source variable"); - } -} - -void -SCMSolutionTransferBase::execute() -{ - TIME_SECTION( - "MultiAppDetailedSolutionBaseTransfer::execute()", 5, "Transferring subchannel solutions"); - getAppInfo(); - - switch (_current_direction) - { - case TO_MULTIAPP: - transferToMultiApps(); - break; - - default: - break; - } -} - -void -SCMSolutionTransferBase::transferToMultiApps() -{ - mooseAssert(_from_meshes.size() == 1, "Only one source mesh can be active in this transfer."); - if (dynamic_cast(_from_meshes[0]) == nullptr) - mooseError("This transfer works only with SubChannelMesh classes."); - - for (unsigned int i = 0; i < getToMultiApp()->numGlobalApps(); i++) - if (getToMultiApp()->hasLocalApp(i)) - transferVarsToApp(i); -} - -void -SCMSolutionTransferBase::transferVarsToApp(unsigned int app_idx) -{ - transferNodalVars(app_idx); -} - -void -SCMSolutionTransferBase::transferNodalVars(unsigned int app_idx) -{ - Moose::ScopedCommSwapper swapper(getToMultiApp()->comm()); - - FEProblemBase & to_problem = getToMultiApp()->appProblemBase(app_idx); - MooseMesh * mesh = NULL; - if (_displaced_target_mesh && to_problem.getDisplacedProblem()) - mesh = &to_problem.getDisplacedProblem()->mesh(); - else - mesh = &to_problem.mesh(); - - const SubChannelMesh & from_mesh = dynamic_cast(*_from_meshes[0]); - FEProblemBase & from_problem = *_from_problems[0]; - - for (auto & node : mesh->getMesh().local_node_ptr_range()) - { - // No local data to send - if (processor_id() != 0) - continue; - Node * from_node = getFromNode(from_mesh, *node); - - for (auto & var_name : _var_names) - { - System * to_sys = find_sys(to_problem.es(), var_name); - unsigned int to_sys_num = to_sys->number(); - unsigned int to_var_num = to_sys->variable_number(var_name); - - if (node->n_dofs(to_sys_num, to_var_num) > 0) - { - System * from_sys = find_sys(from_problem.es(), var_name); - unsigned int from_sys_num = from_sys->number(); - unsigned int from_var_num = from_sys->variable_number(var_name); - - swapper.forceSwap(); - NumericVector * from_solution = from_sys->solution.get(); - dof_id_type from_dof = from_node->dof_number(from_sys_num, from_var_num, 0); - Real from_value = (*from_solution)(from_dof); - swapper.forceSwap(); - - NumericVector & to_solution = getToMultiApp()->appTransferVector(app_idx, var_name); - dof_id_type to_dof = node->dof_number(to_sys_num, to_var_num, 0); - to_solution.set(to_dof, from_value); - } - } - } - - for (auto & var_name : _var_names) - { - getToMultiApp()->appTransferVector(app_idx, var_name).close(); - find_sys(to_problem.es(), var_name)->update(); - } -} diff --git a/modules/subchannel/test/tests/SCMQuadPower/gold/not_aligned.csv b/modules/subchannel/test/tests/SCMQuadPower/gold/not_aligned.csv deleted file mode 100644 index 6b81da444498..000000000000 --- a/modules/subchannel/test/tests/SCMQuadPower/gold/not_aligned.csv +++ /dev/null @@ -1,3 +0,0 @@ -time,Total_power_Aux_defaultPP,Total_power_IC_defaultPP,Total_power_SCMPinPowerPostprocessor,Total_power_SCMTHPowerPostprocessor -0,0,0,0,0 -1,1000000,1000000,1000000,999998.59459221 diff --git a/modules/subchannel/test/tests/SCMQuadPower/gold/not_aligned_line_check_0001.csv b/modules/subchannel/test/tests/SCMQuadPower/gold/not_aligned_line_check_0001.csv deleted file mode 100644 index 8a3e1aece5d7..000000000000 --- a/modules/subchannel/test/tests/SCMQuadPower/gold/not_aligned_line_check_0001.csv +++ /dev/null @@ -1,13 +0,0 @@ -id,q_prime,q_prime_aux,x,y,z -0,0,0,0,0,0 -0.13636363636364,0,0,0,0,0.13636363636364 -0.27272727272727,0,0,0,0,0.27272727272727 -0.40909090909091,0,0,0,0,0.40909090909091 -0.54545454545455,458333.33333333,458333.33333333,0,0,0.54545454545455 -0.68181818181818,458333.33333333,458333.33333333,0,0,0.68181818181818 -0.81818181818182,458333.33333333,458333.33333333,0,0,0.81818181818182 -0.95454545454545,458333.33333333,458333.33333333,0,0,0.95454545454545 -1.0909090909091,0,0,0,0,1.0909090909091 -1.2272727272727,0,0,0,0,1.2272727272727 -1.3636363636364,0,0,0,0,1.3636363636364 -1.5,0,0,0,0,1.5 diff --git a/modules/subchannel/test/tests/SCMQuadPower/gold/test_out.csv b/modules/subchannel/test/tests/SCMQuadPower/gold/test_out.csv deleted file mode 100644 index ade0eecbbfba..000000000000 --- a/modules/subchannel/test/tests/SCMQuadPower/gold/test_out.csv +++ /dev/null @@ -1,3 +0,0 @@ -time,Total_power_Aux_defaultPP,Total_power_IC_defaultPP,Total_power_SCMPinPowerPostprocessor,Total_power_SCMTHPowerPostprocessor -0,0,0,0,0 -1,1200000,1200000,1000000,999998.80505085 diff --git a/modules/subchannel/test/tests/SCMQuadPower/gold/test_out_line_check_0001.csv b/modules/subchannel/test/tests/SCMQuadPower/gold/test_out_line_check_0001.csv deleted file mode 100644 index 60d46facb511..000000000000 --- a/modules/subchannel/test/tests/SCMQuadPower/gold/test_out_line_check_0001.csv +++ /dev/null @@ -1,17 +0,0 @@ -id,q_prime,q_prime_aux,x,y,z -0,0,0,0,0,0 -0.1,0,0,0,0,0.1 -0.2,0,0,0,0,0.2 -0.3,0,0,0,0,0.3 -0.4,0,0,0,0,0.4 -0.5,500000,500000,0,0,0.5 -0.6,500000,500000,0,0,0.6 -0.7,500000,500000,0,0,0.7 -0.8,500000,500000,0,0,0.8 -0.9,500000,500000,0,0,0.9 -1,500000,500000,0,0,1 -1.1,0,0,0,0,1.1 -1.2,0,0,0,0,1.2 -1.3,0,0,0,0,1.3 -1.4,0,0,0,0,1.4 -1.5,0,0,0,0,1.5 diff --git a/modules/subchannel/test/tests/SCMQuadPower/test.i b/modules/subchannel/test/tests/SCMQuadPower/test.i deleted file mode 100644 index 7845c08f4140..000000000000 --- a/modules/subchannel/test/tests/SCMQuadPower/test.i +++ /dev/null @@ -1,192 +0,0 @@ -num_cells = 15 -T_in = 359.15 -# [1e+6 kg/m^2-hour] turns into kg/m^2-sec -mass_flux_in = '${fparse 1e+6 * 17.00 / 3600.}' -P_out = 4.923e6 # Pa - -[QuadSubChannelMesh] - [sub_channel] - type = SCMQuadSubChannelMeshGenerator - nx = 3 - ny = 3 - n_cells = ${num_cells} - pitch = 0.25 - pin_diameter = 0.125 - side_gap = 0.1 - unheated_length_entry = 0.5 - heated_length = 0.5 - unheated_length_exit = 0.5 - [] -[] - -[AuxVariables] - [q_prime_aux] - [] -[] - -[FluidProperties] - [water] - type = Water97FluidProperties - [] -[] - -[SubChannel] - type = QuadSubChannel1PhaseProblem - fp = water - n_blocks = 1 - beta = 0.08 - CT = 2.6 - compute_density = true - compute_viscosity = true - compute_power = true - P_out = ${P_out} - verbose_subchannel = true - implicit = true - segregated = false - friction_closure = 'MATRA' - pin_HTC_closure = 'Dittus-Boelter' -[] - -[SCMClosures] - [MATRA] - type = SCMFrictionMATRA - [] - [Dittus-Boelter] - type = SCMHTCDittusBoelter - [] -[] - -[AuxKernels] - [q_prime_IC] - type = SCMQuadPowerAux - variable = q_prime_aux - power = 1e6 # W - filename = "power_profile.txt" #type in name of file that describes radial power profile - execute_on = 'initial' - [] - [T_in_bc] - type = ConstantAux - variable = T - boundary = inlet - value = ${T_in} - execute_on = 'timestep_begin' - [] - [mdot_in_bc] - type = SCMMassFlowRateAux - variable = mdot - boundary = inlet - area = S - mass_flux = ${mass_flux_in} - execute_on = 'timestep_begin' - [] -[] - -[ICs] - [q_prime_IC] - type = SCMQuadPowerIC - variable = q_prime - power = 1e6 # W - filename = "power_profile.txt" #type in name of file that describes radial power profile - [] - - [S_IC] - type = SCMQuadFlowAreaIC - variable = S - [] - - [w_perim_IC] - type = SCMQuadWettedPerimIC - variable = w_perim - [] - - [T_ic] - type = ConstantIC - variable = T - value = ${T_in} - [] - - [Dpin_ic] - type = ConstantIC - variable = Dpin - value = 0.00950 - [] - - [P_ic] - type = ConstantIC - variable = P - value = 0.0 - [] - - [DP_ic] - type = ConstantIC - variable = DP - value = 0.0 - [] - - [Viscosity_ic] - type = ViscosityIC - variable = mu - p = ${P_out} - T = T - fp = water - [] - - [rho_ic] - type = RhoFromPressureTemperatureIC - variable = rho - p = ${P_out} - T = T - fp = water - [] - - [h_ic] - type = SpecificEnthalpyFromPressureTemperatureIC - variable = h - p = ${P_out} - T = T - fp = water - [] - - [mdot_ic] - type = ConstantIC - variable = mdot - value = 0.0 - [] -[] - -[Executioner] - type = Steady -[] - -[Postprocessors] - [Total_power_IC_defaultPP] - type = ElementIntegralVariablePostprocessor - variable = q_prime - [] - [Total_power_Aux_defaultPP] - type = ElementIntegralVariablePostprocessor - variable = q_prime_aux - [] - [Total_power_SCMPinPowerPostprocessor] - type = SCMPinPowerPostprocessor - [] - [Total_power_SCMTHPowerPostprocessor] - type = SCMTHPowerPostprocessor - [] -[] - -[VectorPostprocessors] - [line_check] - type = LineValueSampler - variable = 'q_prime q_prime_aux' - execute_on = 'TIMESTEP_END' - sort_by = 'z' - start_point = '0 0 0' - end_point = '0 0 1.5' - num_points = ${fparse num_cells + 1} - [] -[] - -[Outputs] - csv = true -[] diff --git a/modules/subchannel/test/tests/SCMQuadPower/test_with_pins.i b/modules/subchannel/test/tests/SCMQuadPower/test_with_pins.i index 8097edb4036b..0df1f7a6a37e 100644 --- a/modules/subchannel/test/tests/SCMQuadPower/test_with_pins.i +++ b/modules/subchannel/test/tests/SCMQuadPower/test_with_pins.i @@ -7,7 +7,7 @@ length = 0.5 [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = ${num_cells} @@ -18,18 +18,6 @@ length = 0.5 heated_length = 0.5 unheated_length_exit = 0.5 [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = sub_channel - nx = 3 - ny = 3 - n_cells = ${num_cells} - pitch = 0.25 - unheated_length_entry = 0.5 - heated_length = 0.5 - unheated_length_exit = 0.5 - [] [] [Functions] diff --git a/modules/subchannel/test/tests/SCMQuadPower/tests b/modules/subchannel/test/tests/SCMQuadPower/tests index 96cf72a97bf0..e97911cb4607 100644 --- a/modules/subchannel/test/tests/SCMQuadPower/tests +++ b/modules/subchannel/test/tests/SCMQuadPower/tests @@ -1,23 +1,6 @@ [Tests] design = 'SCMQuadPowerAux.md SCMQuadPowerIC.md' issues = '#28497 #29233' - [SCMQuadPower_cells_aligned] - type = CSVDiff - input = 'test.i' - csvdiff = 'test_out_line_check_0001.csv test_out.csv' - recover = False - abs_zero = 1e-7 - requirement = 'The system will populate a uniform linear heat rate on subchannels in a quadrilateral lattice using an initial condition and auxiliary kernel' - [] - [SCMQuadPower_cells_not_aligned] - type = CSVDiff - input = 'test.i' - csvdiff = 'not_aligned_line_check_0001.csv not_aligned.csv' - cli_args = 'num_cells=11 Outputs/file_base=not_aligned' - recover = False - abs_zero = 1e-7 - requirement = 'The system will populate a uniform linear heat rate on subchannels in a quadrilateral lattice using an initial condition and auxiliary kernel in a mesh that has axial divisions that are not aligned with the heated region entrance and exit heights.' - [] [SCMQuadPower_cells_aligned_with_pins] type = CSVDiff input = 'test_with_pins.i' diff --git a/modules/subchannel/test/tests/auxkernels/mass_flow_rate/blocked_test.i b/modules/subchannel/test/tests/auxkernels/mass_flow_rate/blocked_test.i index 8a8029457298..66ce8def6876 100644 --- a/modules/subchannel/test/tests/auxkernels/mass_flow_rate/blocked_test.i +++ b/modules/subchannel/test/tests/auxkernels/mass_flow_rate/blocked_test.i @@ -1,6 +1,6 @@ [QuadSubChannelMesh] [subchannel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 3 diff --git a/modules/subchannel/test/tests/auxkernels/mass_flow_rate/gold/blocked_test_out.e b/modules/subchannel/test/tests/auxkernels/mass_flow_rate/gold/blocked_test_out.e index 607ad2fb9f9ce22c6cabcfcfe982a5ad2abcf99a..f8a7b21e892b104e14959ff78cc83ef99d825076 100644 GIT binary patch delta 8214 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 Gr~d`L_djz0 delta 2986 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 W)qyX|48I{mJZk^H>+;7HDE|VaXXnuX diff --git a/modules/subchannel/test/tests/ics/quad_flow_area/test.i b/modules/subchannel/test/tests/ics/quad_flow_area/test.i index 0609362ac2c6..ba15696eed3c 100644 --- a/modules/subchannel/test/tests/ics/quad_flow_area/test.i +++ b/modules/subchannel/test/tests/ics/quad_flow_area/test.i @@ -1,6 +1,6 @@ [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = 10 diff --git a/modules/subchannel/test/tests/ics/quad_wetted_perimeter/gold/test_out.e b/modules/subchannel/test/tests/ics/quad_wetted_perimeter/gold/test_out.e index fed836cda7be4fbd56109d6af378d1330054d660..dcef32fe3dcc39972916b7471e41a4efd2b7fd7c 100644 GIT binary patch literal 43880 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 E2mHIVi~s-t diff --git a/modules/subchannel/test/tests/ics/quad_wetted_perimeter/test.i b/modules/subchannel/test/tests/ics/quad_wetted_perimeter/test.i index 86d4560fe38e..eceb109e9d51 100644 --- a/modules/subchannel/test/tests/ics/quad_wetted_perimeter/test.i +++ b/modules/subchannel/test/tests/ics/quad_wetted_perimeter/test.i @@ -1,6 +1,6 @@ [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = 10 diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/coords.i b/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/coords.i index a40ae453ee76..14f74b363b26 100644 --- a/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/coords.i +++ b/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/coords.i @@ -9,11 +9,7 @@ [] [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator - [] - [pins] - type = SCMDetailedQuadPinMeshGenerator - input = subchannel + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator [] [] diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/gold/coords_in.e b/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/gold/coords_in.e index 247fd5de6df4305be48cd65abedba006ebd34d5a..505effb7073545502faad9a65b1ed65c9c5ac7e4 100644 GIT binary patch delta 32 ocmcccf$_oz#tk)AoN1-0Iq?OVdBu|(t-dd=v1Qs^V|&F40RAKn)Bpeg delta 23 fcmcccf$_oz#tk)AlN+smZ(d->%Cx!0_KFn%lTiyq diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/tests b/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/tests index e06c93f6bc09..ccdc4672c641 100644 --- a/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/tests +++ b/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/tests @@ -1,5 +1,5 @@ [Tests] - design = 'SCMDetailedQuadPinMeshGenerator.md' + design = 'SCMDetailedQuadAssemblyMeshGenerator.md' issues = '#29246' [coords] type = Exodiff @@ -7,6 +7,6 @@ exodiff = coords_in.e cli_args = "--mesh-only" recover = false - requirement = 'The system will create a detailed mesh of the fuel pins for quadrilateral assemblies' + requirement = 'The system will create a detailed mesh of the subchannels and fuel pins for quadrilateral assemblies' [] [] diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/coords.i b/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/coords.i index 894c07b2a027..4cd8679a16cb 100644 --- a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/coords.i +++ b/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/coords.i @@ -1,6 +1,6 @@ [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = 10 diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_1x2.e b/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_1x2.e index 82c7eefd0ee127d0e34fead5b88b91f123c7c1db..e9f75d6b95f3aa02496781dfeae88d7c4702152f 100644 GIT binary patch delta 15 WcmeB}#@I29ae?w8Ri;g<9BKe8p9IhV delta 16 XcmeB}#@I29ae?w;1vREksvK$nF);-4 diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_1x3.e b/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_1x3.e index 00c43c85ac52a667a1fc151a4309e240674ead6b..b0987b527a65c97bf6ebfb1bfa6a3ed981f8b8d6 100644 GIT binary patch delta 18 acmbR8gK^3a#tkbh7O${k+PuOl#}NQmb_jF; delta 18 acmbR8gK^3a#tkbh79X%?+PuOl#}NQnJqV2e diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_3x1.e b/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_3x1.e index ba6fb4b098e5dac5ab39790f636fd69f899bc8f3..d3d6b89df668d82c2dc15d99f6e9060c73d50927 100644 GIT binary patch delta 18 acmbR8gK^3a#tkbh7O${k+PuOl#}NQmb_jF; delta 18 acmbR8gK^3a#tkbh79X%?+PuOl#}NQnJqV2e diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_3x3.e b/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_3x3.e index 12a8d2c74fd6a95aafe743be282105718007facc..874b975213b0cf7f9abca9a5bb5a7788f38df31d 100644 GIT binary patch literal 107188 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 E0Kd#5cK`qY delta 476 zcmdmTl_;9!z>noH3ItnAAC0z>*B?9FtctnZtQJlV33DGYU+WV76zJm>j{Z z&!{lD1IX5xe1chtOSJ;3$zbvqB(Bbi$qFn8*&v0KvH@6Km+sOmhnt3 zU>DpdZ0)8M*al8IZ##T-MT~lvX diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/tests b/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/tests index b6a945fe229e..89a7f6d844db 100644 --- a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/tests +++ b/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/tests @@ -1,5 +1,5 @@ [Tests] - design = 'SCMDetailedQuadSubChannelMeshGenerator.md' + design = 'SCMDetailedQuadAssemblyMeshGenerator.md' issues = '#29191 #29250' [coords] type = Exodiff @@ -7,33 +7,33 @@ exodiff = coords_3x3.e cli_args = "--mesh-only coords_3x3.e" recover = false - requirement = 'The system will create a detailed mesh of the subchannels for quadrilateral assemblies (3x3)' + requirement = 'The system will create a detailed mesh of the subchannels and fuel pins for quadrilateral assemblies (3x3)' [] [1x2] type = Exodiff input = coords.i exodiff = coords_1x2.e - cli_args = "--mesh-only coords_1x2.e Mesh/subchannel/nx=1 Mesh/subchannel/ny=2" + cli_args = "--mesh-only coords_1x2.e Mesh/assembly/nx=1 Mesh/assembly/ny=2" recover = false - requirement = 'The system will create a detailed mesh of the subchannels for quadrilateral assemblies (1x2)' + requirement = 'The system will create a detailed mesh of the subchannels and fuel pins for quadrilateral assemblies (1x2)' [] [1x3] type = Exodiff input = coords.i exodiff = coords_1x3.e - cli_args = "--mesh-only coords_1x3.e Mesh/subchannel/nx=1 Mesh/subchannel/ny=3" + cli_args = "--mesh-only coords_1x3.e Mesh/assembly/nx=1 Mesh/assembly/ny=3" recover = false - requirement = 'The system will create a detailed mesh of the subchannels for quadrilateral assemblies (1x3)' + requirement = 'The system will create a detailed mesh of the subchannels and fuel pins for quadrilateral assemblies (1x3)' [] [3x1] type = Exodiff input = coords.i exodiff = coords_3x1.e - cli_args = "--mesh-only coords_3x1.e Mesh/subchannel/nx=3 Mesh/subchannel/ny=1" + cli_args = "--mesh-only coords_3x1.e Mesh/assembly/nx=3 Mesh/assembly/ny=1" recover = false - requirement = 'The system will create a detailed mesh of the subchannels for quadrilateral assemblies (3x1)' + requirement = 'The system will create a detailed mesh of the subchannels and fuel pins for quadrilateral assemblies (3x1)' [] [] diff --git a/modules/subchannel/test/tests/mesh/detailed_tri_pin_mesh/gold/coords_in.e b/modules/subchannel/test/tests/mesh/detailed_tri_pin_mesh/gold/coords_in.e index 935cbfb2d9beb6639b42488144314b9d4f24bdb6..7a38d377931e7044eb2580eeb0abaf8d320729a8 100644 GIT binary patch delta 60822 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

EXT+BXP**ah+=+l;?06FaA7jH~XuurZTs;D= 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 diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/coords.i b/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/coords.i index 1d9e04c2761e..ff0594d392be 100644 --- a/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/coords.i +++ b/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/coords.i @@ -1,6 +1,6 @@ [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = 10 diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/gold/coords_in.e b/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/gold/coords_in.e index ab1fd4f323387aa28fa7cf95fcf0c30ef499ffc7..ef70565bc879897baff5670c086a183acb21937f 100644 GIT binary patch literal 10056 zcmeI%$!{BF7{~D>&0=TizEWt@J>AkJ=>inoHcR(?p=EQO#7U;H$8PL&W9z;z7cL-< z9655Jry_1hAR%!=;(&yNgv5bAf$wkTeS(wHHkHgFN=Ewl@ytAa-R( zgj+RXG9sy@ANLdKWJyV>&P4NGIvLO9lUePBTa`bMj(2%!?M*;b`+lY?nG4T9Bt znMx|@3aZ2Xct@%)NK(Ib_PKa2nRlNZJf8Eq=y%BRiLMRLS2OE^cHZW7l4~cPP4?4g za6;`2&0innH$0gioKSwP+6nv3sgdZgV@lMq8tcyw(uN-k+6z8QZk6&ASucJz*`M<= zKD#9qDBV{2oyMu^DaU7br!tAW=l8_38PCth&t>|%xVDSTOG&vtj|igOUW#!FPZXTf z`Dy9Ic`vQGVLszbY)`(I!-Jo%=Y1`WZ)|3Q6Zrv6fwj%sl8U^SPpLz;V0=0=TtzPK z`HjKR8jjCKbxyE8DW2yhM{7|8~f}ay2Hl=^9*q)iu2*Kii+l zYECS-*1azeYc;sO3ArG5%LTBQ|?In`-0qP?#cdC z2euXV_az4-!S86}gqcyqpi3*Z62n+Qzk)hi6KvzUE+a`g$EcAJj?N7LK#c3+|;e zeJdT`-wcZ`V+iFTzfjL_VhPE zYufH*1nre>C7*3k1245f|3mMGJ_k4T@7CqwUXDhB{9N!Qs_R$3w&`<=!=0rXn@GX; z^0RV-_3PTzeJQstY$tdvZ1)?ESi8^5{Z+Z)d<|aj#Q$!0nGRd7wL9r4xw=PPqiD1D zPu+j)X0X^X?7sM~F?YSij>W!zYp?ht5VlzC`?vP&x{Do0-8g(3Uh(51$Czuc*s<8x zY3&vJI<388*VkxmFRZfh*VzB`y*}F7wRJaIqOIrA5^bf$9(|_m^Vs(;{@kRkIrfX& z|1Hdn{qBzc(XFi~_NP1l*ALo$jQwpby8K7({CK+>i1G0quZLh^jP>=F8|dilP4NHi z)X?vXv9i}akW9t1p6`B_9V@pzc%Po1O6CXm#@?IE0Kff?;Q<(*|FJ#)V{gTe-|_ee z3>g9a2Ce4;dT62F&Gk%2&tmip#hyJBJ~Pno?D|byzjaT>6imf5OvenOCl9K3|N z(DRK~Fc0%lj|EtWMbPi$ORyCBfnCoVmSY80Vii`S5o@p(dQPI>-Vt84(!A(?8YAK#XjuE0UX339L5nG#W5VmThQ~DlhE_) zcknLW!~2Ni6cXq_C%T}=I^F1jo}YL)jXvmKscHDgAd55ThyDqtzvKfri*q=S3((WO z5AY#A!pHaomv9+Za23~Z9XD_jw{RPGa2NM*9}n;lr6_YI5T)FyAWEfEMU;pWB}%nZ zL##!eGm$8h9Mzhr-b6Jgsyk8biRw=ZYtZV@YSHS^YSQY`YSZe|YP6pA7GNP3Ig5$1 z#92y|WljT8mOCqmveH>aT#ZI&4N=xQ>xi=6X(CFqvwsPdfhp%H>%eJ0vP20M*wS9@tUUse!<*IXycpW#Kn?$+g+$PE$=Ppt1 zIroY3z> zScpYfj3ro#WoW>1tiVdF!fG^P4c1~E)}sl{*no}Lgw3#ZW$Ve-k*%L?t52&-t4FKD3*=mc)t}X!)!SvxT|p@{$C|(S(70<%HC`HvLr~81s8&=5nq$qM v=4J~trW!AeMcD|bAJv=cXdyK3norG>#$V&A>s75SfNDc?z8#t)jeX}o#a)U) delta 1147 zcmaJDj3-5o@U1RK3>idp8SYoCle;tji^zyW(8Qpu|L&6Y1;1kJ)S1|8S2ciVo~ z5kFFejRYqF)W+C!XA75Y42A)vpo=xB%Q%gl7EC+F#=-CP{ayuFa>eK5(t5-=L00#I zGm1L$kr8)tg7%#-_;E!Yir3e)pD5|USt%NGWO1oqNOJJwQU*!wX@5}Cn!ev}y^x)B zZ%rb#0jCNR_?K#u`%-4k;Tm+j;=VeEyC-XA5srpOKbmGu&xXc8B9T#USp~UOcp6Qd zPh*_s*C+f<;^X_{e415Sov&DQK-BOa*q|@{-=Z!xLrsbyRL0eSJmM9iVqG-Jh auP*Gf@Y&*N5~$6@m-0igTds@L%Kd*5XR;;$ diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/subchannel_number.i b/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/subchannel_number.i index 210710fa6287..7f69a6524c16 100644 --- a/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/subchannel_number.i +++ b/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/subchannel_number.i @@ -1,6 +1,6 @@ [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 1 ny = 1 n_cells = 10 diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/tests b/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/tests index e86ddac0c2fc..2c759ab92371 100644 --- a/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/tests +++ b/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/tests @@ -1,5 +1,5 @@ [Tests] - design = 'SCMQuadSubChannelMeshGenerator.md' + design = 'SCMQuadAssemblyMeshGenerator.md' [coords] type = Exodiff input = coords.i @@ -12,7 +12,7 @@ [subchannel_number] type = 'RunException' input = 'subchannel_number.i' - expect_err = "The number of subchannels cannot be less than 2 in both directions \(x and y\)\. Smallest assembly allowed is either 2X1 or 1X2\." + expect_err = "The number of subchannels cannot be less than 2 in both directions\. Smallest assembly allowed is either 2X1 or 1X2\." issues = '#29224' requirement = 'The system shall check the minimum number of subchannels' [] diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/coords.i b/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/coords.i index 26f270d90ec8..ff0594d392be 100644 --- a/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/coords.i +++ b/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/coords.i @@ -1,6 +1,6 @@ [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = 10 @@ -11,14 +11,4 @@ spacer_k = '0.0' spacer_z = '0' [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = sub_channel - nx = 3 - ny = 3 - n_cells = 10 - pitch = 0.25 - heated_length = 1 - [] [] diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/gold/coords_in.e b/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/gold/coords_in.e index 590a57fdf7b4b3d7a8d157ff449eafe887172da6..0da98d9f82dfa4da52caa38fb56bd9a7026d6f34 100644 GIT binary patch delta 1298 zcma)5J#5oJ6h1pYwiBB$kVHV$roy5~umDo0B0!Xagv5wgkZ}{!Msn<^7o)mdU*x2U;K_IQem;M9@7=qDn@0~@cUISQmP&<| z(=^O5h`h+}1&nEI|5kH<Piqx# zYhPZAkJ_13InwTl2f8b2`ihA4xhEQcnUrZYQ+??^tyZw^@qs@`cM!h^NIy!}v4~y_gEwSH_{26QSl%?nK$+@=z??tg4hvI`}Kz zS~mzZyBuC#*jsC;fI0 XYmIGFyqkB$R~m%{S6rvDv9S0TV$Q=e delta 1250 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 diff --git a/modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/gold/coords_in.e b/modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/gold/coords_in.e index d464c18f6e40b98c9373d95a4d153a78223ddc40..12d63173c02bcc0d2a75cb16f05c05eccdd5a61f 100644 GIT binary patch delta 8082 zcmeH}T}TvB7=~Sy8W(?}LaD6S$;xCag;Jrd$-)#gMXd}q5>g1Yf?P%L=PN}Db4&ab z%QAN9Z&TFbL|56QNhlb3(PfY~_JbN;1XAhL%&fbCATz?TL$C|WGc4!4@5{U29L{vV z|8&3qlW`9A9#=mWMvT;JOd10+43OEWe7asRBIq?1D$x3(&^kn!8MFn5&>YwWQsreS zq_1d<5ka4^cvbGS_=JHv(djeUFlZlsVAcjz|8st^a-LO8N<)dOFw z4Y~)-=i6-Q+#Zn;BlQ}Sz_q^(a9DlME{-!IuWjsZ7*B=S@mv^3=ECL-Q0k)wPh`X` zI*jqo`d(-imGi8=oDo5XamyR=qp`F?Tn++F;p^{h@liia;t~i;-9Tl1`$R|ZmeEeJ zeFEGMj0m12iwD>+x=&8p5xg8sq9lxsn|gs$N7T2J5qWK6@?mqf0h-jKslJ>Md2M6- zU~=G;i38WGv{hh4&~5B`rMd;W%%CmUjZd?k#2O(_!H|0L%QsmzFXfI6*( zRz~Etjj<%sfz^>53ECkky(*VZrB@~d9mdMl@7UL3^(ID}DHH`U&+Nc+X8B5GmJC=I z(T=tV4m);F8EYhUDvD|(Y>D0;Ac?I5@ncO7B^->-PB5wyT?EGYHD5ezvJL)xdB0U~ zQ{DB*M{x7@=g^R@BQG&E+Jx0HLF;QImsHJn(Y2-7V{|`e_qx9Z3k1Cak9@oxcsm$t z@^mg#1UKaU4Qr{VCc*z zTM#4i+Qt~3{ury%>}X5l@a<72D1jknQVq_4pxd~eY_ksSnic30Xba8?m&WrGDs$8H z5%eykzfM$wLfe`|^??y15_A}2Nv0jEGC2~M)wTkz3-!r2uGMjj$ZH#8YK|TAayT-X zGvg=cZJp1{gdpeDGFA#Ln|2jSn<*3pi8(*cAF~Rg1axlyRhAa(VeQIS#b;t0gn3#r z4_)c9kKS@qbp2lMCXN)eVQ#_d&2F6q`#kGf3Qv32#WpPL5xu>r^Y*{>LY`e%6?bpY K=}QKk=88Yml;8{i delta 8803 zcmeH}TS!z<6ows>I?80yMd?B{ry4D$RD!aY+8LCErFbdBgoI`uQY)~rqOuj06y#*N zEXmXyx}a%R?C2%!WJm^Gn1`U3ARn>|rT7p?mzg>j$H0hlggtD6IWOPgu=f8i)~vN> z4R%Egc17Ij6JX^{EJ{#YD^BItHbH)VazPnf<0(6w}Q|6 zI>*sj)XRxhW5(Dqxdj(TUqO4c0IQ062c|EuJmAEIhK;c;_7=6oc*0@JFX^=06~&wg zMvSZX)Vec;rBV>MiKQ?#PyJ&V?mq;cgG3T7w0oU zsb8(^I!>Htz!>Xi+=gmNxo0c(b0Qcpu6ZK8joMcx1%tp+`0Oip%A#*`r7;l3dVooM z-RFkrdEOSO?lS~lI1xrN`F8>{y({EQ8=`~3G)BT$Ir}z5sx2D6j}t|GWBO)Jo(bIQ z)l{*c6GeSvd}HxozeNCTltjXbVAxn2sW!rvS*!)y@NQl+bw70~J8L{Z-u>k|i}AWUu8A_&8pr1(gmbm4JI@3|X3>`uztXjX@<2+Uf{ z(T^iM=kEUg@LCNCP&?%(0bc$PJE?VjCmAL>lC3i!Op`nMRnm@CkCtu5?EL@t$t=4E7uyBww70`FQc@^6+V69ssBcWot24*JZgND<^ZE}? z6!nei&(xuDu$r9jIM6t7gA>7kaiv_yo7*0dU=UaeE1lV}#;bOyLBd!Mu!xtGM4!EU zCliO#E}}0@pzaNg5ztRCcIdr(A}5Oa#yBgp1kJ4u+G1L#*{4weWdT(#c@~gcq;k3KicJMdi&nhbb diff --git a/modules/subchannel/test/tests/mesh/tri_subchannel_mesh/gold/tricoords3_in.e b/modules/subchannel/test/tests/mesh/tri_subchannel_mesh/gold/tricoords3_in.e index af15baca3dc34dfaafdc70b2678d72ba4c68410e..32180e067b31b28dc732960f49c138cbe4695576 100644 GIT binary patch delta 376 zcmccNdBbzVM0WkIRUoi>4;pR1Vexe?D|R7tdh!AGWZiGeqR(BkU1Wqp+aCbxuw$}C zrzZz+q)-0NE;RWfhsfl+96^E;z-Brt!0E{r9I}&RIadj~?mxYQFY4zmI6YZ{YrS9} zSiQd;oSuAxOJ4AV{gFkLOKvB_>B$`2{(|%D7n@ysqrCu5Z_eOWXPjKmBfuy-c>&LN zpkXKHgrvku!|BN@c6irOABFx)B8dEiet*?^yC0OdBLvz5HsNPa}Bn(~~c7h)%xC5v17jmE;v0|f@{5C zFW3x!J2*Z02A90xar+~SDwo_&hSQTdxcvp^+b=e|_C|XFoZg(lt&S_yLW(9Bhi~5@F}n^RuE^}BzA)j0K3n(@&Et; diff --git a/modules/subchannel/test/tests/outputs/normalslicevalues/test.i b/modules/subchannel/test/tests/outputs/normalslicevalues/test.i index ca205e798679..dc22ab12836d 100644 --- a/modules/subchannel/test/tests/outputs/normalslicevalues/test.i +++ b/modules/subchannel/test/tests/outputs/normalslicevalues/test.i @@ -1,6 +1,6 @@ [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = 10 diff --git a/modules/subchannel/test/tests/postprocessors/quadsubchannelpointvalue/test.i b/modules/subchannel/test/tests/postprocessors/quadsubchannelpointvalue/test.i index 7609ef7d6027..528c3d7646d5 100644 --- a/modules/subchannel/test/tests/postprocessors/quadsubchannelpointvalue/test.i +++ b/modules/subchannel/test/tests/postprocessors/quadsubchannelpointvalue/test.i @@ -2,7 +2,7 @@ T_in = 359.15 [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = 10 diff --git a/modules/subchannel/test/tests/postprocessors/quadsubchannelpointvalue/test_error.i b/modules/subchannel/test/tests/postprocessors/quadsubchannelpointvalue/test_error.i index a3a30de0d8b0..26df3b54c6fc 100644 --- a/modules/subchannel/test/tests/postprocessors/quadsubchannelpointvalue/test_error.i +++ b/modules/subchannel/test/tests/postprocessors/quadsubchannelpointvalue/test_error.i @@ -2,7 +2,7 @@ T_in = 359.15 [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = 10 diff --git a/modules/subchannel/test/tests/problems/coupling/3d.i b/modules/subchannel/test/tests/problems/coupling/3d.i index a64a92cb5180..9bc3455c5b16 100644 --- a/modules/subchannel/test/tests/problems/coupling/3d.i +++ b/modules/subchannel/test/tests/problems/coupling/3d.i @@ -9,12 +9,8 @@ [] [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator - [] - [fuel_pins] - type = SCMDetailedQuadPinMeshGenerator - input = subchannel + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator [] [] diff --git a/modules/subchannel/test/tests/problems/coupling/main.i b/modules/subchannel/test/tests/problems/coupling/main.i index 788d62b2b01c..648e02dfc3a5 100644 --- a/modules/subchannel/test/tests/problems/coupling/main.i +++ b/modules/subchannel/test/tests/problems/coupling/main.i @@ -4,7 +4,7 @@ heated_length = 1.0 [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 2 ny = 2 n_cells = 10 @@ -15,16 +15,6 @@ heated_length = 1.0 spacer_z = '0.0' spacer_k = '0.0' [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = sub_channel - nx = 2 - ny = 2 - n_cells = 10 - pitch = 0.014605 - heated_length = ${heated_length} - [] [] [FluidProperties] @@ -220,7 +210,8 @@ heated_length = 1.0 [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'Tpin q_prime Dpin' execute_on = 'timestep_end' diff --git a/modules/subchannel/test/tests/problems/psbt/psbt_explicit.i b/modules/subchannel/test/tests/problems/psbt/psbt_explicit.i index 0284cce1917c..0063d57822cc 100644 --- a/modules/subchannel/test/tests/problems/psbt/psbt_explicit.i +++ b/modules/subchannel/test/tests/problems/psbt/psbt_explicit.i @@ -6,7 +6,7 @@ pin_diameter = 0.00950 [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 10 @@ -17,16 +17,6 @@ pin_diameter = 0.00950 spacer_z = '0.0' spacer_k = '0.0' [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = sub_channel - nx = 6 - ny = 6 - n_cells = 10 - pitch = 0.0126 - heated_length = 1.0 - [] [] [FluidProperties] @@ -140,7 +130,7 @@ pin_diameter = 0.00950 boundary = inlet value = ${T_in} execute_on = 'timestep_begin' - block = sub_channel + block = subchannel [] [mdot_in_bc] type = SCMMassFlowRateAux @@ -149,7 +139,7 @@ pin_diameter = 0.00950 area = S mass_flux = report_mass_flux_inlet execute_on = 'timestep_begin' - block = sub_channel + block = subchannel [] [] diff --git a/modules/subchannel/test/tests/problems/psbt/psbt_explicit_staggered.i b/modules/subchannel/test/tests/problems/psbt/psbt_explicit_staggered.i index b3e93785e619..639e50b5f59b 100644 --- a/modules/subchannel/test/tests/problems/psbt/psbt_explicit_staggered.i +++ b/modules/subchannel/test/tests/problems/psbt/psbt_explicit_staggered.i @@ -6,7 +6,7 @@ pin_diameter = 0.00950 [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 10 @@ -17,16 +17,6 @@ pin_diameter = 0.00950 spacer_z = '0.0' spacer_k = '0.0' [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = sub_channel - nx = 6 - ny = 6 - n_cells = 10 - pitch = 0.0126 - heated_length = 1.0 - [] [] [FluidProperties] @@ -141,7 +131,7 @@ pin_diameter = 0.00950 boundary = inlet value = ${T_in} execute_on = 'timestep_begin' - block = sub_channel + block = subchannel [] [mdot_in_bc] type = SCMMassFlowRateAux @@ -150,7 +140,7 @@ pin_diameter = 0.00950 area = S mass_flux = report_mass_flux_inlet execute_on = 'timestep_begin' - block = sub_channel + block = subchannel [] [] diff --git a/modules/subchannel/test/tests/problems/psbt/psbt_explicit_v2.i b/modules/subchannel/test/tests/problems/psbt/psbt_explicit_v2.i index b7be6604ecde..62f3d9ac22ff 100644 --- a/modules/subchannel/test/tests/problems/psbt/psbt_explicit_v2.i +++ b/modules/subchannel/test/tests/problems/psbt/psbt_explicit_v2.i @@ -6,7 +6,7 @@ pin_diameter = 0.00950 [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 10 @@ -17,16 +17,6 @@ pin_diameter = 0.00950 spacer_z = '0.0' spacer_k = '0.0' [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = sub_channel - nx = 6 - ny = 6 - n_cells = 10 - pitch = 0.0126 - heated_length = 1.0 - [] [] [FluidProperties] @@ -133,7 +123,7 @@ pin_diameter = 0.00950 boundary = inlet value = ${T_in} execute_on = 'timestep_begin' - block = sub_channel + block = subchannel [] [mdot_in_bc] type = SCMMassFlowRateAux @@ -142,7 +132,7 @@ pin_diameter = 0.00950 area = S mass_flux = report_mass_flux_inlet execute_on = 'timestep_begin' - block = sub_channel + block = subchannel [] [q_prime_IC] type = SCMQuadPowerAux diff --git a/modules/subchannel/test/tests/problems/psbt/psbt_implicit.i b/modules/subchannel/test/tests/problems/psbt/psbt_implicit.i index 1b5c730cabfd..778ac26c8fc6 100644 --- a/modules/subchannel/test/tests/problems/psbt/psbt_implicit.i +++ b/modules/subchannel/test/tests/problems/psbt/psbt_implicit.i @@ -6,7 +6,7 @@ pin_diameter = 0.00950 [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 10 @@ -17,16 +17,6 @@ pin_diameter = 0.00950 spacer_z = '0.0' spacer_k = '0.0' [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = sub_channel - nx = 6 - ny = 6 - n_cells = 10 - pitch = 0.0126 - heated_length = 1.0 - [] [] [FluidProperties] @@ -142,7 +132,7 @@ pin_diameter = 0.00950 boundary = inlet value = ${T_in} execute_on = 'timestep_begin' - block = sub_channel + block = subchannel [] [mdot_in_bc] type = SCMMassFlowRateAux @@ -151,7 +141,7 @@ pin_diameter = 0.00950 area = S mass_flux = report_mass_flux_inlet execute_on = 'timestep_begin' - block = sub_channel + block = subchannel [] [] diff --git a/modules/subchannel/test/tests/problems/psbt/psbt_monolithic.i b/modules/subchannel/test/tests/problems/psbt/psbt_monolithic.i index bd067340ccf5..32cf9c1d7cb5 100644 --- a/modules/subchannel/test/tests/problems/psbt/psbt_monolithic.i +++ b/modules/subchannel/test/tests/problems/psbt/psbt_monolithic.i @@ -20,7 +20,7 @@ pin_diameter = 0.00950 pin_block_id = 1 [] # [sub_channel] - # type = SCMQuadSubChannelMeshGenerator + # type = SCMQuadAssemblyMeshGenerator # nx = 6 # ny = 6 # n_cells = 10 @@ -33,7 +33,7 @@ pin_diameter = 0.00950 # [] # [fuel_pins] - # type = SCMQuadPinMeshGenerator + # type = SCMQuadAssemblyMeshGenerator # input = sub_channel # nx = 6 # ny = 6 diff --git a/modules/subchannel/test/tests/restart/gold/steady_out.e b/modules/subchannel/test/tests/restart/gold/steady_out.e index 027186cf857cb8ca2806b6dd734662104ab0e8a9..25341525be5205c2e72eb9bdda6cb71db0478bdc 100644 GIT binary patch delta 11030 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 delta 6021 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 Z!|lFd_4D%DO?5kl!|l!g`^Vb}{|EIo;5`5U delta 9748 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 diff --git a/modules/subchannel/test/tests/restart/steady.i b/modules/subchannel/test/tests/restart/steady.i index 297a8e5f3377..13a5bb1fcf01 100644 --- a/modules/subchannel/test/tests/restart/steady.i +++ b/modules/subchannel/test/tests/restart/steady.i @@ -5,7 +5,7 @@ P_out = 4.923e6 # Pa [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = 10 @@ -35,12 +35,16 @@ P_out = 4.923e6 # Pa compute_power = true P_out = ${P_out} friction_closure = 'MATRA' + pin_HTC_closure = 'Dittus-Boelter' [] [SCMClosures] [MATRA] type = SCMFrictionMATRA [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -79,6 +83,12 @@ P_out = 4.923e6 # Pa value = 0.0 [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 0.00950 + [] + [rho_ic] type = RhoFromPressureTemperatureIC variable = rho diff --git a/modules/subchannel/test/tests/restart/transient.i b/modules/subchannel/test/tests/restart/transient.i index ecc57ebec03e..58d11296213a 100644 --- a/modules/subchannel/test/tests/restart/transient.i +++ b/modules/subchannel/test/tests/restart/transient.i @@ -5,7 +5,7 @@ P_out = 4.923e6 # Pa [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 3 ny = 3 n_cells = 10 @@ -47,12 +47,16 @@ P_out = 4.923e6 # Pa skip_additional_restart_data = true allow_initial_conditions_with_restart = true friction_closure = 'MATRA' + pin_HTC_closure = 'Dittus-Boelter' [] [SCMClosures] [MATRA] type = SCMFrictionMATRA [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [Functions] diff --git a/modules/subchannel/test/tests/transfers/multiapp_detailed_solution_transfer/quad.i b/modules/subchannel/test/tests/transfers/multiapp_detailed_solution_transfer/quad.i index 4be29161421b..17bfcc922316 100644 --- a/modules/subchannel/test/tests/transfers/multiapp_detailed_solution_transfer/quad.i +++ b/modules/subchannel/test/tests/transfers/multiapp_detailed_solution_transfer/quad.i @@ -8,17 +8,12 @@ [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator pin_diameter = 0.5 side_gap = 0.1 spacer_z = '0' spacer_k = '0' [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = sub_channel - [] [] [FluidProperties] @@ -29,7 +24,7 @@ [AuxVariables] [P] - block = sub_channel + block = subchannel [] [T] block = fuel_pins @@ -81,7 +76,8 @@ variable = 'P' [] [T_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'T' [] diff --git a/modules/subchannel/test/tests/transfers/multiapp_detailed_solution_transfer/quad_viz.i b/modules/subchannel/test/tests/transfers/multiapp_detailed_solution_transfer/quad_viz.i index fb225feac2d7..88f4e3146c74 100644 --- a/modules/subchannel/test/tests/transfers/multiapp_detailed_solution_transfer/quad_viz.i +++ b/modules/subchannel/test/tests/transfers/multiapp_detailed_solution_transfer/quad_viz.i @@ -8,20 +8,15 @@ [] [Mesh] - [sub_channel] - type = SCMDetailedQuadSubChannelMeshGenerator + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator side_gap = 0.1 [] - - [fuel_pins] - type = SCMDetailedQuadPinMeshGenerator - input = sub_channel - [] [] [AuxVariables] [P] - block = sub_channel + block = subchannel [] [T] block = fuel_pins diff --git a/modules/subchannel/test/tests/transfers/multiapp_detailed_solution_transfer/tests b/modules/subchannel/test/tests/transfers/multiapp_detailed_solution_transfer/tests index d2b66c0cfeac..75b84fe9d01f 100644 --- a/modules/subchannel/test/tests/transfers/multiapp_detailed_solution_transfer/tests +++ b/modules/subchannel/test/tests/transfers/multiapp_detailed_solution_transfer/tests @@ -6,6 +6,6 @@ input = 'quad.i' exodiff = 'quad_out.e quad_out_viz0.e' recover = false - requirement = 'The system shall be able to transger the subchannel/pin solution onto a detailed mesh' + requirement = 'The system shall be able to transfer the subchannel or pin solution onto a detailed mesh' [] [] diff --git a/modules/subchannel/validation/Blockage/PNNL_7x7/7X7blockage70.i b/modules/subchannel/validation/Blockage/PNNL_7x7/7X7blockage70.i index e35728825b62..0f713ed1059a 100644 --- a/modules/subchannel/validation/Blockage/PNNL_7x7/7X7blockage70.i +++ b/modules/subchannel/validation/Blockage/PNNL_7x7/7X7blockage70.i @@ -7,7 +7,7 @@ P_out = 101325 # Pa [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 8 ny = 8 n_cells = 36 @@ -27,34 +27,34 @@ P_out = 101325 # Pa [AuxVariables] [mdot] - block = sub_channel + block = subchannel [] [SumWij] - block = sub_channel + block = subchannel [] [P] - block = sub_channel + block = subchannel [] [DP] - block = sub_channel + block = subchannel [] [h] - block = sub_channel + block = subchannel [] [T] - block = sub_channel + block = subchannel [] [rho] - block = sub_channel + block = subchannel [] [mu] - block = sub_channel + block = subchannel [] [S] - block = sub_channel + block = subchannel [] [w_perim] - block = sub_channel + block = subchannel [] [] @@ -78,6 +78,13 @@ P_out = 101325 # Pa segregated = false staggered_pressure = false interpolation_scheme = 'upwind' + pin_HTC_closure = 'Dittus-Boelter' +[] + +[SCMClosures] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] diff --git a/modules/subchannel/validation/Blockage/PNNL_7x7/7X7blockage90.i b/modules/subchannel/validation/Blockage/PNNL_7x7/7X7blockage90.i index 33a1addc1570..d714e0c5569a 100644 --- a/modules/subchannel/validation/Blockage/PNNL_7x7/7X7blockage90.i +++ b/modules/subchannel/validation/Blockage/PNNL_7x7/7X7blockage90.i @@ -7,7 +7,7 @@ P_out = 101325 # Pa [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 8 ny = 8 n_cells = 84 @@ -27,34 +27,34 @@ P_out = 101325 # Pa [AuxVariables] [mdot] - block = sub_channel + block = subchannel [] [SumWij] - block = sub_channel + block = subchannel [] [P] - block = sub_channel + block = subchannel [] [DP] - block = sub_channel + block = subchannel [] [h] - block = sub_channel + block = subchannel [] [T] - block = sub_channel + block = subchannel [] [rho] - block = sub_channel + block = subchannel [] [mu] - block = sub_channel + block = subchannel [] [S] - block = sub_channel + block = subchannel [] [w_perim] - block = sub_channel + block = subchannel [] [] @@ -78,6 +78,13 @@ P_out = 101325 # Pa segregated = false staggered_pressure = false interpolation_scheme = central_difference + pin_HTC_closure = 'Dittus-Boelter' +[] + +[SCMClosures] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] diff --git a/modules/subchannel/validation/Blockage/PNNL_7x7/detailedMesh.i b/modules/subchannel/validation/Blockage/PNNL_7x7/detailedMesh.i index 0defb710d399..1870c5a2e2e7 100644 --- a/modules/subchannel/validation/Blockage/PNNL_7x7/detailedMesh.i +++ b/modules/subchannel/validation/Blockage/PNNL_7x7/detailedMesh.i @@ -9,8 +9,8 @@ [] [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator [] [] @@ -54,4 +54,3 @@ [Executioner] type = Steady [] - diff --git a/modules/subchannel/validation/EBR-II/XX09_SCM_SS17.i b/modules/subchannel/validation/EBR-II/XX09_SCM_SS17.i index a34b880e0cf2..4c33dc07ba26 100644 --- a/modules/subchannel/validation/EBR-II/XX09_SCM_SS17.i +++ b/modules/subchannel/validation/EBR-II/XX09_SCM_SS17.i @@ -408,7 +408,8 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' variable = 'mdot SumWij P DP h T rho mu S' [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'Tpin q_prime' [] diff --git a/modules/subchannel/validation/EBR-II/XX09_SCM_SS17_corrected.i b/modules/subchannel/validation/EBR-II/XX09_SCM_SS17_corrected.i index 295ec94c4c9c..c29728f49b9b 100644 --- a/modules/subchannel/validation/EBR-II/XX09_SCM_SS17_corrected.i +++ b/modules/subchannel/validation/EBR-II/XX09_SCM_SS17_corrected.i @@ -408,7 +408,8 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' variable = 'mdot SumWij P DP h T rho mu S' [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'Tpin q_prime' [] diff --git a/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R.i b/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R.i index f8f5d7fc90fc..f59bbb83ffbb 100644 --- a/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R.i +++ b/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R.i @@ -408,7 +408,8 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' variable = 'mdot SumWij P DP h T rho mu S' [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'Tpin q_prime' [] diff --git a/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R_corrected.i b/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R_corrected.i index 3a8b1bf62551..0beef95279ac 100644 --- a/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R_corrected.i +++ b/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R_corrected.i @@ -408,7 +408,8 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' variable = 'mdot SumWij P DP h T rho mu S' [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'Tpin q_prime' [] diff --git a/modules/subchannel/validation/EBR-II/XX09_SCM_TR17.i b/modules/subchannel/validation/EBR-II/XX09_SCM_TR17.i index ced63f644a78..deaf9d090227 100644 --- a/modules/subchannel/validation/EBR-II/XX09_SCM_TR17.i +++ b/modules/subchannel/validation/EBR-II/XX09_SCM_TR17.i @@ -349,7 +349,8 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' variable = 'mdot SumWij P DP h T rho mu S' [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'Tpin q_prime' [] diff --git a/modules/subchannel/validation/EBR-II/XX09_SCM_TR45R.i b/modules/subchannel/validation/EBR-II/XX09_SCM_TR45R.i index c6063f8e61e5..ff37c95b4e6f 100644 --- a/modules/subchannel/validation/EBR-II/XX09_SCM_TR45R.i +++ b/modules/subchannel/validation/EBR-II/XX09_SCM_TR45R.i @@ -348,7 +348,8 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' variable = 'mdot SumWij P DP h T rho mu S' [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'Tpin q_prime' [] diff --git a/modules/subchannel/validation/PNNL_12_pin/steady_state/2X6_ss.i b/modules/subchannel/validation/PNNL_12_pin/steady_state/2X6_ss.i index 28e3e610fdee..416d4e475da1 100644 --- a/modules/subchannel/validation/PNNL_12_pin/steady_state/2X6_ss.i +++ b/modules/subchannel/validation/PNNL_12_pin/steady_state/2X6_ss.i @@ -17,34 +17,31 @@ T_in = 297.039 # K P_out = 101325 # Pa [QuadSubChannelMesh] - [sub_channel] - type = SCMQuadSubChannelMeshGenerator - [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = sub_channel + [assembly] + type = SCMQuadAssemblyMeshGenerator + subchannel_block_id = 0 + pin_block_id = 1 [] [] [AuxVariables] [mdot] - block = sub_channel + block = subchannel [] [SumWij] - block = sub_channel + block = subchannel [] [P] - block = sub_channel + block = subchannel [] [DP] - block = sub_channel + block = subchannel [] [h] - block = sub_channel + block = subchannel [] [T] - block = sub_channel + block = subchannel [] [Tpin] block = fuel_pins @@ -53,16 +50,16 @@ P_out = 101325 # Pa block = fuel_pins [] [rho] - block = sub_channel + block = subchannel [] [mu] - block = sub_channel + block = subchannel [] [S] - block = sub_channel + block = subchannel [] [w_perim] - block = sub_channel + block = subchannel [] [q_prime] block = fuel_pins @@ -117,6 +114,7 @@ P_out = 101325 # Pa variable = q_prime power = 5460 # W filename = "power_profile.txt" + block = fuel_pins [] [T_ic] @@ -328,7 +326,8 @@ P_out = 101325 # Pa variable = 'mdot SumWij P DP h T rho mu S' [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'Tpin q_prime' [] diff --git a/modules/subchannel/validation/PNNL_12_pin/steady_state/3d.i b/modules/subchannel/validation/PNNL_12_pin/steady_state/3d.i index 96ca716b4323..2bd43f91a431 100644 --- a/modules/subchannel/validation/PNNL_12_pin/steady_state/3d.i +++ b/modules/subchannel/validation/PNNL_12_pin/steady_state/3d.i @@ -10,12 +10,8 @@ [] [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator - [] - [pins] - type = SCMDetailedQuadPinMeshGenerator - input = subchannel + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator [] [] diff --git a/modules/subchannel/validation/PNNL_12_pin/transient/2X6_transient.i b/modules/subchannel/validation/PNNL_12_pin/transient/2X6_transient.i index 3c4c99f821f9..331231b6fab6 100644 --- a/modules/subchannel/validation/PNNL_12_pin/transient/2X6_transient.i +++ b/modules/subchannel/validation/PNNL_12_pin/transient/2X6_transient.i @@ -3,7 +3,7 @@ P_out = 101325 # Pa [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 7 ny = 3 n_cells = 60 @@ -36,12 +36,16 @@ P_out = 101325 # Pa compute_power = false P_out = ${P_out} friction_closure = 'MATRA' + pin_HTC_closure = 'Dittus-Boelter' [] [SCMClosures] [MATRA] type = SCMFrictionMATRA [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -74,6 +78,12 @@ P_out = 101325 # Pa value = 0.0 [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 0.012065 + [] + [DP_ic] type = ConstantIC variable = DP diff --git a/modules/subchannel/validation/PNNL_12_pin/transient/3d.i b/modules/subchannel/validation/PNNL_12_pin/transient/3d.i index bea6df23f2f4..444e72860fdc 100644 --- a/modules/subchannel/validation/PNNL_12_pin/transient/3d.i +++ b/modules/subchannel/validation/PNNL_12_pin/transient/3d.i @@ -1,6 +1,6 @@ [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator nx = 7 ny = 3 n_cells = 48 diff --git a/modules/subchannel/validation/areva_FCTF/FCTF_deformed.i b/modules/subchannel/validation/areva_FCTF/FCTF_deformed.i index 4a823270163e..8e5299eba107 100644 --- a/modules/subchannel/validation/areva_FCTF/FCTF_deformed.i +++ b/modules/subchannel/validation/areva_FCTF/FCTF_deformed.i @@ -238,7 +238,8 @@ unheated_length_exit = 0.855 #m variable = 'mdot SumWij P DP h T rho mu S displacement' [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'Dpin Tpin q_prime' [] diff --git a/modules/subchannel/validation/areva_FCTF/FCTF_non_deformed.i b/modules/subchannel/validation/areva_FCTF/FCTF_non_deformed.i index 6e9bd67b27e9..075548910e66 100644 --- a/modules/subchannel/validation/areva_FCTF/FCTF_non_deformed.i +++ b/modules/subchannel/validation/areva_FCTF/FCTF_non_deformed.i @@ -278,7 +278,8 @@ unheated_length_exit = 0.855 #m variable = 'mdot SumWij P DP h T rho mu S displacement' [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz variable = 'Dpin Tpin q_prime' [] diff --git a/modules/subchannel/validation/psbt/psbt_null_transient/3d.i b/modules/subchannel/validation/psbt/psbt_null_transient/3d.i index 720dffdaf66c..c73275b5caf4 100644 --- a/modules/subchannel/validation/psbt/psbt_null_transient/3d.i +++ b/modules/subchannel/validation/psbt/psbt_null_transient/3d.i @@ -1,6 +1,6 @@ [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 50 diff --git a/modules/subchannel/validation/psbt/psbt_null_transient/psbt_ss.i b/modules/subchannel/validation/psbt/psbt_null_transient/psbt_ss.i index 9c309f0cdc9d..6401107976d3 100644 --- a/modules/subchannel/validation/psbt/psbt_null_transient/psbt_ss.i +++ b/modules/subchannel/validation/psbt/psbt_null_transient/psbt_ss.i @@ -8,7 +8,7 @@ P_out = 4.923e6 # Pa [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 50 @@ -41,12 +41,16 @@ P_out = 4.923e6 # Pa P_out = ${P_out} # friction model friction_closure = 'MATRA' + pin_HTC_closure = 'Dittus-Boelter' [] [SCMClosures] [MATRA] type = SCMFrictionMATRA [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] diff --git a/modules/subchannel/validation/psbt/psbt_null_transient/psbt_transient.i b/modules/subchannel/validation/psbt/psbt_null_transient/psbt_transient.i index b193bb27bd41..e2e85e23440a 100644 --- a/modules/subchannel/validation/psbt/psbt_null_transient/psbt_transient.i +++ b/modules/subchannel/validation/psbt/psbt_null_transient/psbt_transient.i @@ -8,7 +8,7 @@ P_out = 4.923e6 # Pa [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 50 @@ -52,12 +52,16 @@ P_out = 4.923e6 # Pa skip_additional_restart_data = true # friction model friction_closure = 'MATRA' + pin_HTC_closure = 'Dittus-Boelter' [] [SCMClosures] [MATRA] type = SCMFrictionMATRA [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [Functions] diff --git a/modules/subchannel/validation/psbt/psbt_ss/3d.i b/modules/subchannel/validation/psbt/psbt_ss/3d.i index 055e3757f0f5..bab2f390ce99 100644 --- a/modules/subchannel/validation/psbt/psbt_ss/3d.i +++ b/modules/subchannel/validation/psbt/psbt_ss/3d.i @@ -1,6 +1,6 @@ [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 20 @@ -9,17 +9,6 @@ side_gap = 0.00095 heated_length = 1.0 [] - - [fuel_pins] - type = SCMDetailedQuadPinMeshGenerator - input = subchannel - nx = 6 - ny = 6 - n_cells = 20 - pitch = 0.0126 - pin_diameter = 0.00950 - heated_length = 1.0 - [] [] [AuxVariables] diff --git a/modules/subchannel/validation/psbt/psbt_ss/psbt.i b/modules/subchannel/validation/psbt/psbt_ss/psbt.i index 9e582f20070f..8cd491306c1e 100644 --- a/modules/subchannel/validation/psbt/psbt_ss/psbt.i +++ b/modules/subchannel/validation/psbt/psbt_ss/psbt.i @@ -8,7 +8,7 @@ mass_flux_in = ${fparse 1e+6 * 16.95 / 3600.} P_out = 14.72e6 # Pa [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 6 ny = 6 n_cells = 20 @@ -19,51 +19,41 @@ P_out = 14.72e6 # Pa spacer_z = '0.0 0.229 0.457 0.686 0.914 1.143 1.372 1.600 1.829 2.057 2.286 2.515 2.743 2.972 3.200 3.429' spacer_k = '0.7 0.4 1.0 0.4 1.0 0.4 1.0 0.4 1.0 0.4 1.0 0.4 1.0 0.4 1.0 0.4' [] - - [fuel_pins] - type = SCMQuadPinMeshGenerator - input = sub_channel - nx = 6 - ny = 6 - n_cells = 20 - pitch = 0.0126 - heated_length = 3.658 - [] [] [AuxVariables] [mdot] - block = sub_channel + block = subchannel [] [SumWij] - block = sub_channel + block = subchannel [] [P] - block = sub_channel + block = subchannel [] [DP] - block = sub_channel + block = subchannel [] [h] - block = sub_channel + block = subchannel [] [T] - block = sub_channel + block = subchannel [] [Tpin] block = fuel_pins [] [rho] - block = sub_channel + block = subchannel [] [mu] - block = sub_channel + block = subchannel [] [S] - block = sub_channel + block = subchannel [] [w_perim] - block = sub_channel + block = subchannel [] [q_prime] block = fuel_pins diff --git a/modules/subchannel/verification/enthalpy_mixing_verification/3d.i b/modules/subchannel/verification/enthalpy_mixing_verification/3d.i index ff541ba3e0a1..ec51d8b63525 100644 --- a/modules/subchannel/verification/enthalpy_mixing_verification/3d.i +++ b/modules/subchannel/verification/enthalpy_mixing_verification/3d.i @@ -1,6 +1,6 @@ [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator nx = 2 ny = 1 n_cells = 100 diff --git a/modules/subchannel/verification/enthalpy_mixing_verification/two_channel.i b/modules/subchannel/verification/enthalpy_mixing_verification/two_channel.i index 03aca0bfd2fe..ac37e4000704 100644 --- a/modules/subchannel/verification/enthalpy_mixing_verification/two_channel.i +++ b/modules/subchannel/verification/enthalpy_mixing_verification/two_channel.i @@ -3,7 +3,7 @@ P_out = 155e+5 # Pa [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 2 ny = 1 n_cells = 100 diff --git a/modules/subchannel/verification/friction_model_verification/3d.i b/modules/subchannel/verification/friction_model_verification/3d.i index 0aab03147b17..5538b73b8954 100644 --- a/modules/subchannel/verification/friction_model_verification/3d.i +++ b/modules/subchannel/verification/friction_model_verification/3d.i @@ -1,6 +1,6 @@ [Mesh] - [subchannel] - type = SCMDetailedQuadSubChannelMeshGenerator + [assembly] + type = SCMDetailedQuadAssemblyMeshGenerator nx = 2 ny = 1 n_cells = 100 diff --git a/modules/subchannel/verification/friction_model_verification/two_channel.i b/modules/subchannel/verification/friction_model_verification/two_channel.i index 79140a4c4898..65594f6e50ef 100644 --- a/modules/subchannel/verification/friction_model_verification/two_channel.i +++ b/modules/subchannel/verification/friction_model_verification/two_channel.i @@ -4,7 +4,7 @@ P_out = 155e+5 # Pa [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 1 ny = 2 n_cells = 100 diff --git a/modules/subchannel/verification/friction_model_verification/two_channel2.i b/modules/subchannel/verification/friction_model_verification/two_channel2.i index 8bf8303cce80..5d53071d6920 100644 --- a/modules/subchannel/verification/friction_model_verification/two_channel2.i +++ b/modules/subchannel/verification/friction_model_verification/two_channel2.i @@ -4,7 +4,7 @@ P_out = 155e+5 # Pa [QuadSubChannelMesh] [sub_channel] - type = SCMQuadSubChannelMeshGenerator + type = SCMQuadAssemblyMeshGenerator nx = 2 ny = 1 n_cells = 100 From c1dc44499a26e98791a020b680ec41bb2b92a9dc Mon Sep 17 00:00:00 2001 From: Vasileios Kyriakopoulos Date: Mon, 27 Apr 2026 10:34:03 -0600 Subject: [PATCH 3/6] Merge tri assembly mesh generators and fix detailed mesh regressions Unify the triangular subchannel/pin mesh generators behind SCMTriAssemblyMeshGenerator and SCMDetailedTriAssemblyMeshGenerator, matching the earlier quad-generator merge and the new convention that assembly generators build both subchannel and pin meshes when pins exist. This updates triangular inputs, tests, and registrations to use the new assembly generator names directly and removes the old tri alias registrations for consistency with the quad side. While validating the merged detailed-tri path, fix several regressions: - stop mutating TriSubChannelMesh from the detailed visualization generator - avoid post-build renumbering in the detailed-tri assembly path - copy _pin_nodes in TriSubChannelMesh copy construction - assign unique element IDs to generated pin prisms by starting from mesh_base->n_elem() Also refresh the detailed triangular mesh test baseline to reflect the new combined subchannel+pin mesh output and quiet its verbose debug logging. Refs #32796 --- .../modules/subchannel/v&v/ornl_19_pin.md | 4 +- .../modules/subchannel/v&v/toshiba_37_pin.md | 4 +- .../SCMDetailedTriAssemblyMeshGenerator.md | 17 ++ .../SCMDetailedTriPinMeshGenerator.md | 17 -- .../SCMDetailedTriSubChannelMeshGenerator.md | 21 -- .../SCMTriAssemblyMeshGenerator.md | 21 ++ .../meshgenerators/SCMTriPinMeshGenerator.md | 22 -- .../SCMTriSubChannelMeshGenerator.md | 24 --- .../source/positions/SCMPinPositions.md | 2 +- modules/subchannel/examples/MultiApp/3d.i | 13 +- .../examples/MultiApp/fuel_assembly.i | 15 +- modules/subchannel/examples/duct/3d.i | 2 +- modules/subchannel/examples/duct/test.i | 2 +- .../include/mesh/TriSubChannelMesh.h | 5 +- ... => SCMDetailedTriAssemblyMeshGenerator.h} | 19 +- .../SCMDetailedTriPinMeshGenerator.h | 32 --- ...erator.h => SCMTriAssemblyMeshGenerator.h} | 16 +- .../meshgenerators/SCMTriPinMeshGenerator.h | 50 ----- .../subchannel/src/mesh/TriSubChannelMesh.C | 1 + ... => SCMDetailedTriAssemblyMeshGenerator.C} | 131 ++++++++---- .../SCMDetailedTriPinMeshGenerator.C | 57 ------ ...erator.C => SCMTriAssemblyMeshGenerator.C} | 82 ++++++-- .../meshgenerators/SCMTriPinMeshGenerator.C | 123 ------------ .../src/transfers/SCMSolutionTransfer.C | 6 +- .../tests/SCMTriPower/gold/not_aligned.csv | 3 - .../test/tests/SCMTriPower/gold/test_out.csv | 3 - .../subchannel/test/tests/SCMTriPower/test.i | 188 ------------------ .../test/tests/SCMTriPower/test_with_pins.i | 13 +- .../subchannel/test/tests/SCMTriPower/tests | 21 -- .../test/tests/ics/FCTFdisplacementIC/test.i | 12 +- .../test/tests/ics/marvel/gold/test_out.e | Bin 273972 -> 378688 bytes .../subchannel/test/tests/ics/marvel/test.i | 2 +- .../tests/ics/tri_flow_area/gold/test_out.e | Bin 29780 -> 46500 bytes .../test/tests/ics/tri_flow_area/test.i | 2 +- .../ics/tri_wetted_perimeter/gold/test_out.e | Bin 29780 -> 46500 bytes .../tests/ics/tri_wetted_perimeter/test.i | 2 +- .../coords.i | 0 .../gold/coords_1x2.e | Bin .../gold/coords_1x3.e | Bin .../gold/coords_3x1.e | Bin .../gold/coords_3x3.e | Bin .../tests | 8 +- .../mesh/detailed_quad_pin_mesh/coords.i | 15 -- .../detailed_quad_pin_mesh/gold/coords_in.e | Bin 30800 -> 0 bytes .../tests/mesh/detailed_quad_pin_mesh/tests | 12 -- .../coords.i | 4 +- .../gold/coords_in.e | Bin 1092672 -> 1092672 bytes .../tests | 6 +- .../tests/mesh/detailed_tri_pin_mesh/coords.i | 18 -- .../tests/mesh/detailed_tri_pin_mesh/tests | 13 -- .../gold/coords_in.e | Bin 732116 -> 0 bytes .../coords.i | 0 .../gold/coords_in.e | Bin .../subchannel_number.i | 0 .../tests | 2 +- .../coords.i | 0 .../gold/coords_in.e | Bin .../tests | 0 .../mesh/quad_sub_channel_pin_mesh/coords.i | 14 -- .../gold/coords_in.e | Bin 10056 -> 0 bytes .../mesh/quad_sub_channel_pin_mesh/tests | 12 -- .../mesh/tri_assembly/gold/tricoords3_in.e | Bin 0 -> 11876 bytes .../tests | 2 +- .../tricoords3.i | 2 +- .../coords.i | 2 +- .../gold/coords_in.e | Bin 24628 -> 31608 bytes .../tests | 0 .../mesh/tri_sub_channel_pin_mesh/coords.i | 27 --- .../tri_sub_channel_pin_mesh/gold/coords_in.e | Bin 73968 -> 0 bytes .../tests/mesh/tri_sub_channel_pin_mesh/tests | 13 -- .../tri_subchannel_mesh/gold/tricoords3_in.e | Bin 9432 -> 0 bytes .../subchannel/test/tests/multiapp/sc_core.i | 12 +- .../test/tests/positions/pin_positions.i | 15 +- .../trisubchannelpointvalue/test.i | 2 +- .../problems/Lead-LBE-19pin/3D_LBE-19pin.i | 2 +- .../problems/Lead-LBE-19pin/test_LBE-19pin.i | 13 +- .../problems/Lead-LBE-19pin/test_LEAD-19pin.i | 13 +- .../problems/SFR/EBR-II/XX09_SS_SHRT17.i | 11 +- .../SFR/sodium-19pin/test19_explicit.i | 14 +- .../SFR/sodium-19pin/test19_implicit.i | 14 +- .../SFR/sodium-19pin/test19_monolithic.i | 14 +- .../XX09_SCM_SS17.i | 14 +- .../validation/Blockage/THORS/FFM-3A.i | 12 +- .../validation/Blockage/THORS/FFM-3A_viz.i | 3 +- .../Blockage/THORS/FFM-3Adetailed.i | 3 +- .../validation/Blockage/THORS/FFM-5B_high.i | 23 ++- .../validation/Blockage/THORS/FFM-5B_low.i | 23 ++- .../validation/Blockage/THORS/FFM-5B_viz.i | 4 +- .../Blockage/THORS/FFM-5Bdetailed.i | 3 +- .../subchannel/validation/EBR-II/3d_SCM_SS.i | 12 +- .../subchannel/validation/EBR-II/3d_SCM_TR.i | 12 +- .../validation/EBR-II/XX09_SCM_SS17.i | 13 +- .../EBR-II/XX09_SCM_SS17_corrected.i | 13 +- .../validation/EBR-II/XX09_SCM_SS45R.i | 13 +- .../EBR-II/XX09_SCM_SS45R_corrected.i | 13 +- .../validation/EBR-II/XX09_SCM_TR17.i | 11 +- .../validation/EBR-II/XX09_SCM_TR45R.i | 11 +- .../validation/ORNL_19_pin/3d_ORNL_19.i | 3 +- .../validation/ORNL_19_pin/test_ORNL_19.i | 23 ++- .../PNNL_12_pin/steady_state/2X6_ss.i | 28 +-- .../Toshiba_37_pin/toshiba_37_pin.i | 65 +++++- .../Toshiba_37_pin/toshiba_37_pin_viz.i | 84 ++++---- modules/subchannel/validation/areva_FCTF/3D.i | 13 +- .../validation/areva_FCTF/FCTF_deformed.i | 12 +- .../validation/areva_FCTF/FCTF_non_deformed.i | 12 +- 105 files changed, 545 insertions(+), 1070 deletions(-) create mode 100644 modules/subchannel/doc/content/source/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.md delete mode 100644 modules/subchannel/doc/content/source/meshgenerators/SCMDetailedTriPinMeshGenerator.md delete mode 100644 modules/subchannel/doc/content/source/meshgenerators/SCMDetailedTriSubChannelMeshGenerator.md create mode 100644 modules/subchannel/doc/content/source/meshgenerators/SCMTriAssemblyMeshGenerator.md delete mode 100644 modules/subchannel/doc/content/source/meshgenerators/SCMTriPinMeshGenerator.md delete mode 100644 modules/subchannel/doc/content/source/meshgenerators/SCMTriSubChannelMeshGenerator.md rename modules/subchannel/include/meshgenerators/{SCMDetailedTriSubChannelMeshGenerator.h => SCMDetailedTriAssemblyMeshGenerator.h} (81%) delete mode 100644 modules/subchannel/include/meshgenerators/SCMDetailedTriPinMeshGenerator.h rename modules/subchannel/include/meshgenerators/{SCMTriSubChannelMeshGenerator.h => SCMTriAssemblyMeshGenerator.h} (90%) delete mode 100644 modules/subchannel/include/meshgenerators/SCMTriPinMeshGenerator.h rename modules/subchannel/src/meshgenerators/{SCMDetailedTriSubChannelMeshGenerator.C => SCMDetailedTriAssemblyMeshGenerator.C} (87%) delete mode 100644 modules/subchannel/src/meshgenerators/SCMDetailedTriPinMeshGenerator.C rename modules/subchannel/src/meshgenerators/{SCMTriSubChannelMeshGenerator.C => SCMTriAssemblyMeshGenerator.C} (92%) delete mode 100644 modules/subchannel/src/meshgenerators/SCMTriPinMeshGenerator.C delete mode 100644 modules/subchannel/test/tests/SCMTriPower/gold/not_aligned.csv delete mode 100644 modules/subchannel/test/tests/SCMTriPower/gold/test_out.csv delete mode 100644 modules/subchannel/test/tests/SCMTriPower/test.i rename modules/subchannel/test/tests/mesh/{detailed_quad_sub_channel_mesh => detailed_quad_assembly}/coords.i (100%) rename modules/subchannel/test/tests/mesh/{detailed_quad_sub_channel_mesh => detailed_quad_assembly}/gold/coords_1x2.e (100%) rename modules/subchannel/test/tests/mesh/{detailed_quad_sub_channel_mesh => detailed_quad_assembly}/gold/coords_1x3.e (100%) rename modules/subchannel/test/tests/mesh/{detailed_quad_sub_channel_mesh => detailed_quad_assembly}/gold/coords_3x1.e (100%) rename modules/subchannel/test/tests/mesh/{detailed_quad_sub_channel_mesh => detailed_quad_assembly}/gold/coords_3x3.e (100%) rename modules/subchannel/test/tests/mesh/{detailed_quad_sub_channel_mesh => detailed_quad_assembly}/tests (83%) delete mode 100644 modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/coords.i delete mode 100644 modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/gold/coords_in.e delete mode 100644 modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/tests rename modules/subchannel/test/tests/mesh/{detailed_tri_sub_channel_mesh => detailed_tri_assembly}/coords.i (70%) rename modules/subchannel/test/tests/mesh/{detailed_tri_pin_mesh => detailed_tri_assembly}/gold/coords_in.e (99%) rename modules/subchannel/test/tests/mesh/{detailed_tri_sub_channel_mesh => detailed_tri_assembly}/tests (63%) delete mode 100644 modules/subchannel/test/tests/mesh/detailed_tri_pin_mesh/coords.i delete mode 100644 modules/subchannel/test/tests/mesh/detailed_tri_pin_mesh/tests delete mode 100644 modules/subchannel/test/tests/mesh/detailed_tri_sub_channel_mesh/gold/coords_in.e rename modules/subchannel/test/tests/mesh/{quad_sub_channel_mesh => quad_assembly}/coords.i (100%) rename modules/subchannel/test/tests/mesh/{quad_sub_channel_mesh => quad_assembly}/gold/coords_in.e (100%) rename modules/subchannel/test/tests/mesh/{quad_sub_channel_mesh => quad_assembly}/subchannel_number.i (100%) rename modules/subchannel/test/tests/mesh/{quad_sub_channel_mesh => quad_assembly}/tests (93%) rename modules/subchannel/test/tests/mesh/{quad_subchannel_duct_mesh => quad_duct}/coords.i (100%) rename modules/subchannel/test/tests/mesh/{quad_subchannel_duct_mesh => quad_duct}/gold/coords_in.e (100%) rename modules/subchannel/test/tests/mesh/{quad_subchannel_duct_mesh => quad_duct}/tests (100%) delete mode 100644 modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/coords.i delete mode 100644 modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/gold/coords_in.e delete mode 100644 modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/tests create mode 100644 modules/subchannel/test/tests/mesh/tri_assembly/gold/tricoords3_in.e rename modules/subchannel/test/tests/mesh/{tri_subchannel_mesh => tri_assembly}/tests (85%) rename modules/subchannel/test/tests/mesh/{tri_subchannel_mesh => tri_assembly}/tricoords3.i (85%) rename modules/subchannel/test/tests/mesh/{tri_subchannel_duct_mesh => tri_duct}/coords.i (88%) rename modules/subchannel/test/tests/mesh/{tri_subchannel_duct_mesh => tri_duct}/gold/coords_in.e (62%) rename modules/subchannel/test/tests/mesh/{tri_subchannel_duct_mesh => tri_duct}/tests (100%) delete mode 100644 modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/coords.i delete mode 100644 modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/gold/coords_in.e delete mode 100644 modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/tests delete mode 100644 modules/subchannel/test/tests/mesh/tri_subchannel_mesh/gold/tricoords3_in.e diff --git a/modules/subchannel/doc/content/modules/subchannel/v&v/ornl_19_pin.md b/modules/subchannel/doc/content/modules/subchannel/v&v/ornl_19_pin.md index b9b9c8088fa8..3f26ce367b9e 100644 --- a/modules/subchannel/doc/content/modules/subchannel/v&v/ornl_19_pin.md +++ b/modules/subchannel/doc/content/modules/subchannel/v&v/ornl_19_pin.md @@ -66,7 +66,7 @@ The general parameters on the experimental conditions are described here. The pu ### Mesh -The meshing in SCM uses a custom *SCMTriSubChannelMeshGenerator*. +The meshing in SCM uses a custom *SCMTriAssemblyMeshGenerator*. This one generates a mesh of 1D channel segments connected in 3D. The subchannel positions are automatically generated by specifying the number of radial rings, the flat to flat distance of the duct, and the pin pitch. The number of axial cells in which the domain is discretrized is specified by *n_cells*. @@ -121,7 +121,7 @@ A custom transfer, *SCMSolutionTransfer*, is used for this purpose. !listing /validation/ORNL_19_pin/test_ORNL_19.i block=Transfers language=moose -The detailed mesh uses a *SCMDetailedTriSubChannelMeshGenerator* and the solution variables are populated by the transfer. +The detailed mesh uses a *SCMDetailedTriAssemblyMeshGenerator* and the solution variables are populated by the transfer. !listing /validation/ORNL_19_pin/test_ORNL_19.i language=moose diff --git a/modules/subchannel/doc/content/modules/subchannel/v&v/toshiba_37_pin.md b/modules/subchannel/doc/content/modules/subchannel/v&v/toshiba_37_pin.md index 4cd87ba3cdee..8b374b6f7d0a 100644 --- a/modules/subchannel/doc/content/modules/subchannel/v&v/toshiba_37_pin.md +++ b/modules/subchannel/doc/content/modules/subchannel/v&v/toshiba_37_pin.md @@ -65,7 +65,7 @@ P_out = 2.0e5 # Pa ### Mesh -The meshing in SCM uses a custom [SCMTriSubChannelMeshGenerator](source/meshgenerators/SCMTriSubChannelMeshGenerator.md). +The meshing in SCM uses a custom [SCMTriAssemblyMeshGenerator](source/meshgenerators/SCMTriAssemblyMeshGenerator.md). This one generates a mesh of 1D channel segments connected in 3D. The subchannel positions are automatically generated by specifying the number of radial rings, the flat to flat distance of the duct, and the pin pitch. The number of axial cells in which the domain is discretrized is specified by *n_cells*. For more information about the mesh generator, pelase consult the website documentation on SCM. @@ -121,7 +121,7 @@ A custom transfer, *MultiAppDetailedSolutionTransfer*, is used for this purpose. !listing /validation/Toshiba_37_pin/toshiba_37_pin.i block=Transfers language=moose -The detailed mesh uses a *SCMDetailedTriSubChannelMeshGenerator* and the solution variables are populated by the transfer. +The detailed mesh uses a *SCMDetailedTriAssemblyMeshGenerator* and the solution variables are populated by the transfer. !listing /validation/Toshiba_37_pin/toshiba_37_pin.i block=viz language=moose diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.md new file mode 100644 index 000000000000..fac4b26c536d --- /dev/null +++ b/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.md @@ -0,0 +1,17 @@ +# SCMDetailedTriAssemblyMeshGenerator + +!syntax description /Mesh/SCMDetailedTriAssemblyMeshGenerator + +## Overview + +!! Intentional comment to provide extra spacing + +This mesh generator creates one detailed 3D visualization mesh containing both the subchannel +volume and the fuel pin volume for a triangular lattice arrangement. The generated subdomains are +named `subchannel` and `fuel_pins`. + +!syntax parameters /Mesh/SCMDetailedTriAssemblyMeshGenerator + +!syntax inputs /Mesh/SCMDetailedTriAssemblyMeshGenerator + +!syntax children /Mesh/SCMDetailedTriAssemblyMeshGenerator diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedTriPinMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedTriPinMeshGenerator.md deleted file mode 100644 index 8eed16cb0fa7..000000000000 --- a/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedTriPinMeshGenerator.md +++ /dev/null @@ -1,17 +0,0 @@ -# SCMDetailedTriPinMeshGenerator - -!syntax description /Mesh/SCMDetailedTriPinMeshGenerator - -## Overview - -!! Intentional comment to provide extra spacing - -This is a mesh generator used for visualization purposes only. It is part of an input file that creates -a 3D realistic mesh of the pins in a triangular lattice arrangement. This input file has a Problem block -with the [NoSolveProblem.md] because it is not used to perform any calculations. It is used to create a detailed 3D mesh that the `SCM` solution gets projected on. Last, [!param](/Mesh/SCMDetailedTriPinMeshGenerator/input) is a parameter that takes the name of an object of type [SCMDetailedTriSubChannelMeshGenerator](SCMDetailedTriSubChannelMeshGenerator.md) so the user must be careful to define consistent parameters across both `MeshGenerators`. The center of the mesh is the origin. - -!syntax parameters /Mesh/SCMDetailedTriPinMeshGenerator - -!syntax inputs /Mesh/SCMDetailedTriPinMeshGenerator - -!syntax children /Mesh/SCMDetailedTriPinMeshGenerator diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedTriSubChannelMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedTriSubChannelMeshGenerator.md deleted file mode 100644 index 33ea222043f2..000000000000 --- a/modules/subchannel/doc/content/source/meshgenerators/SCMDetailedTriSubChannelMeshGenerator.md +++ /dev/null @@ -1,21 +0,0 @@ -# SCMDetailedTriSubChannelMeshGenerator - -!syntax description /Mesh/SCMDetailedTriSubChannelMeshGenerator - -## Overview - -!! Intentional comment to provide extra spacing - -This is a mesh generator used for visualization purposes only. It is part of an input file that creates -a 3D realistic mesh of the subchannels in a triangular lattice arrangement. This input file has a Problem block -with the [NoSolveProblem.md] because it is not used to perform any calculations. It is used to create a detailed 3D mesh that the `SCM` solution gets projected on. The center of the mesh is the origin. - -## Example Input File Syntax - -!listing /test/tests/problems/Lead-LBE-19pin/3D_LBE-19pin.i block=Mesh language=moose - -!syntax parameters /Mesh/SCMDetailedTriSubChannelMeshGenerator - -!syntax inputs /Mesh/SCMDetailedTriSubChannelMeshGenerator - -!syntax children /Mesh/SCMDetailedTriSubChannelMeshGenerator diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMTriAssemblyMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMTriAssemblyMeshGenerator.md new file mode 100644 index 000000000000..a6e63dfd4b79 --- /dev/null +++ b/modules/subchannel/doc/content/source/meshgenerators/SCMTriAssemblyMeshGenerator.md @@ -0,0 +1,21 @@ +# SCMTriAssemblyMeshGenerator + +!syntax description /Mesh/SCMTriAssemblyMeshGenerator + +## Overview + +!! Intentional comment to provide extra spacing + +This mesh generator creates the 1D subchannel and pin meshes for a triangular lattice arrangement. +The generated subdomains are named `subchannel` and `fuel_pins`. +The center of the mesh is the origin. + +## Example Input File Syntax + +!listing /test/tests/problems/SFR/sodium-19pin/test19_monolithic.i block=TriSubChannelMesh language=moose + +!syntax parameters /Mesh/SCMTriAssemblyMeshGenerator + +!syntax inputs /Mesh/SCMTriAssemblyMeshGenerator + +!syntax children /Mesh/SCMTriAssemblyMeshGenerator diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMTriPinMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMTriPinMeshGenerator.md deleted file mode 100644 index e376d208bbcc..000000000000 --- a/modules/subchannel/doc/content/source/meshgenerators/SCMTriPinMeshGenerator.md +++ /dev/null @@ -1,22 +0,0 @@ -# SCMTriPinMeshGenerator - -!syntax description /Mesh/SCMTriPinMeshGenerator - -## Overview - -!! Intentional comment to provide extra spacing - -This mesh generator creates the mesh were the `SCM` solution variables associated with the pins live. -The user needs to provide the [!param](/Mesh/SCMTriPinMeshGenerator/nrings) parameter which defines the number of fuel pin rings. For triangular sub-assemblies, one nring means that there is one central pin in the (0 0 0) -position and six neighboring ones on the the vertices of a normal hexagon. The number of cells in the -z direction is given by [!param](/Mesh/SCMTriPinMeshGenerator/n_cells). The distance of the pins from eachother is given by the [!param](/Mesh/SCMTriPinMeshGenerator/pitch) parameter and the total length of the pins in the -z direction is defined by the parameters: [!param](/Mesh/SCMTriPinMeshGenerator/heated_length),[!param](/Mesh/SCMTriPinMeshGenerator/unheated_length_entry),[!param](/Mesh/SCMTriPinMeshGenerator/unheated_length_entry). -Last, [!param](/Mesh/SCMTriPinMeshGenerator/input) is a parameter that takes the name of an object of type [SCMTriSubChannelMeshGenerator](SCMTriSubChannelMeshGenerator.md) so the user must be careful to define consistent parameters across both `MeshGenerators`. The center of the mesh is the origin. - -## Example Input File Syntax - -!listing /test/tests/problems/SFR/sodium-19pin/test19_monolithic.i block=TriSubChannelMesh language=moose - -!syntax parameters /Mesh/SCMTriPinMeshGenerator - -!syntax inputs /Mesh/SCMTriPinMeshGenerator - -!syntax children /Mesh/SCMTriPinMeshGenerator diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMTriSubChannelMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMTriSubChannelMeshGenerator.md deleted file mode 100644 index 5ac256b36516..000000000000 --- a/modules/subchannel/doc/content/source/meshgenerators/SCMTriSubChannelMeshGenerator.md +++ /dev/null @@ -1,24 +0,0 @@ -# SCMTriSubChannelMeshGenerator - -!syntax description /Mesh/SCMTriSubChannelMeshGenerator - -## Overview - -!! Intentional comment to provide extra spacing - -This mesh generator creates the mesh were the `SCM` solution variables associated with the subchannels live. -The user needs to provide the [!param](/Mesh/SCMTriSubChannelMeshGenerator/nrings) parameter which defines the number of fuel pin rings. For triangular sub-assemblies, one nring means that there is one central pin in the (0 0 0) position and six neighboring ones on the the vertices of a normal hexagon. The number of cells in the -z direction is given by [!param](/Mesh/SCMTriSubChannelMeshGenerator/n_cells). The distance of the pins from eachother is given by the [!param](/Mesh/SCMTriSubChannelMeshGenerator/pitch) parameter and the total length of the sub-assembly in the -z direction is defined by the parameters: -[!param](/Mesh/SCMTriSubChannelMeshGenerator/heated_length),[!param](/Mesh/SCMTriSubChannelMeshGenerator/unheated_length_entry),[!param](/Mesh/SCMTriSubChannelMeshGenerator/unheated_length_entry). -The fuel pin diameter is given by [!param](/Mesh/SCMTriSubChannelMeshGenerator/pin_diameter). The user also has the ability to define the effect of spacers or mixing vanes on the sub-assembly -by defining their axial location [!param](/Mesh/SCMTriSubChannelMeshGenerator/spacer_z) and a local presure from loss [!param](/Mesh/SCMTriSubChannelMeshGenerator/spacer_k). [!param](/Mesh/SCMTriSubChannelMeshGenerator/flat_to_flat) is the size of the hexagonal duct that encloses the sub-assembly. If the pins are wire wrapped then the parameters: [!param](/Mesh/SCMTriSubChannelMeshGenerator/dwire) [!param](/Mesh/SCMTriSubChannelMeshGenerator/hwire) have non zero values that describe the geometry of the wire-wrap. -The center of the mesh is the origin. - -## Example Input File Syntax - -!listing /validation/Toshiba_37_pin/toshiba_37_pin.i block=TriSubChannelMesh language=moose - -!syntax parameters /Mesh/SCMTriSubChannelMeshGenerator - -!syntax inputs /Mesh/SCMTriSubChannelMeshGenerator - -!syntax children /Mesh/SCMTriSubChannelMeshGenerator diff --git a/modules/subchannel/doc/content/source/positions/SCMPinPositions.md b/modules/subchannel/doc/content/source/positions/SCMPinPositions.md index c488c9e97913..a9db138d2db6 100644 --- a/modules/subchannel/doc/content/source/positions/SCMPinPositions.md +++ b/modules/subchannel/doc/content/source/positions/SCMPinPositions.md @@ -2,7 +2,7 @@ !syntax description /Positions/SCMPinPositions -This object currently requires using a `SubChannel` pin mesh, such as the meshes generated by the [SCMTriPinMeshGenerator.md] +This object currently requires using a `SubChannel` pin mesh, such as the meshes generated by the [SCMTriAssemblyMeshGenerator.md] or the [SCMQuadAssemblyMeshGenerator.md]. !alert note diff --git a/modules/subchannel/examples/MultiApp/3d.i b/modules/subchannel/examples/MultiApp/3d.i index 407200283343..88f57f711642 100644 --- a/modules/subchannel/examples/MultiApp/3d.i +++ b/modules/subchannel/examples/MultiApp/3d.i @@ -29,7 +29,7 @@ n_cells = 100 [Mesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator nrings = '${fparse n_rings}' n_cells = ${n_cells} flat_to_flat = '${fparse duct_inside}' @@ -40,17 +40,6 @@ n_cells = 100 pitch = '${fparse fuel_pin_pitch}' [] - [fuel_pins] - type = SCMDetailedTriPinMeshGenerator - input = subchannel - nrings = '${fparse n_rings}' - n_cells = ${n_cells} - unheated_length_entry = '${fparse length_entry_fuel}' - heated_length = '${fparse length_heated_fuel}' - unheated_length_exit = '${fparse length_outlet_fuel}' - pitch = '${fparse fuel_pin_pitch}' - pin_diameter = '${fparse fuel_pin_diameter}' - [] [] [AuxVariables] diff --git a/modules/subchannel/examples/MultiApp/fuel_assembly.i b/modules/subchannel/examples/MultiApp/fuel_assembly.i index 31e3e5a27348..7d62848ffed2 100644 --- a/modules/subchannel/examples/MultiApp/fuel_assembly.i +++ b/modules/subchannel/examples/MultiApp/fuel_assembly.i @@ -37,7 +37,7 @@ duct_inside = '${fparse duct_outside - 2 * duct_thickness}' [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = '${fparse n_rings}' n_cells = ${n_cells} flat_to_flat = '${fparse duct_inside}' @@ -52,20 +52,9 @@ duct_inside = '${fparse duct_outside - 2 * duct_thickness}' spacer_k = '0.5 0.5' [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = '${fparse n_rings}' - n_cells = ${n_cells} - unheated_length_entry = '${fparse length_entry_fuel}' - heated_length = '${fparse length_heated_fuel}' - unheated_length_exit = '${fparse length_outlet_fuel}' - pitch = '${fparse fuel_pin_pitch}' - [] - [duct] type = SCMTriDuctMeshGenerator - input = fuel_pins + input = subchannel nrings = '${fparse n_rings}' n_cells = ${n_cells} flat_to_flat = '${fparse duct_inside}' diff --git a/modules/subchannel/examples/duct/3d.i b/modules/subchannel/examples/duct/3d.i index bb35ad4f8150..bfe8a62f71f4 100644 --- a/modules/subchannel/examples/duct/3d.i +++ b/modules/subchannel/examples/duct/3d.i @@ -1,6 +1,6 @@ [Mesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator nrings = 4 n_cells = 100 flat_to_flat = 0.085 diff --git a/modules/subchannel/examples/duct/test.i b/modules/subchannel/examples/duct/test.i index 7c88bacf7360..b985fd06f73a 100644 --- a/modules/subchannel/examples/duct/test.i +++ b/modules/subchannel/examples/duct/test.i @@ -3,7 +3,7 @@ mass_flux_in = '${fparse 1e+6 * 37.00 / 36000.*0.5}' P_out = 2.0e5 # Pa [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = 4 n_cells = 100 flat_to_flat = 0.085 diff --git a/modules/subchannel/include/mesh/TriSubChannelMesh.h b/modules/subchannel/include/mesh/TriSubChannelMesh.h index 5ada5c375d0a..14be2cf50e1e 100644 --- a/modules/subchannel/include/mesh/TriSubChannelMesh.h +++ b/modules/subchannel/include/mesh/TriSubChannelMesh.h @@ -204,10 +204,9 @@ class TriSubChannelMesh : public SubChannelMesh static void pinPositions(std::vector & positions, unsigned int nrings, Real pitch, Point center); - friend class SCMTriSubChannelMeshGenerator; + friend class SCMTriAssemblyMeshGenerator; friend class SCMTriDuctMeshGenerator; - friend class SCMTriPinMeshGenerator; - friend class SCMDetailedTriPinMeshGenerator; + friend class SCMDetailedTriAssemblyMeshGenerator; friend class TriSubChannel1PhaseProblem; /// number of corners in the duct x-sec diff --git a/modules/subchannel/include/meshgenerators/SCMDetailedTriSubChannelMeshGenerator.h b/modules/subchannel/include/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.h similarity index 81% rename from modules/subchannel/include/meshgenerators/SCMDetailedTriSubChannelMeshGenerator.h rename to modules/subchannel/include/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.h index 8ad83ea885cc..ca4b4c67e148 100644 --- a/modules/subchannel/include/meshgenerators/SCMDetailedTriSubChannelMeshGenerator.h +++ b/modules/subchannel/include/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.h @@ -13,12 +13,12 @@ #include "SubChannelEnums.h" /** - * Mesh generator that builds a 3D mesh representing triangular subchannels + * Mesh generator that builds a 3D mesh representing triangular subchannels and pins */ -class SCMDetailedTriSubChannelMeshGenerator : public MeshGenerator +class SCMDetailedTriAssemblyMeshGenerator : public MeshGenerator { public: - SCMDetailedTriSubChannelMeshGenerator(const InputParameters & parameters); + SCMDetailedTriAssemblyMeshGenerator(const InputParameters & parameters); virtual std::unique_ptr generate() override; protected: @@ -26,6 +26,7 @@ class SCMDetailedTriSubChannelMeshGenerator : public MeshGenerator EChannelType getSubchannelType(unsigned int index) const { return _subch_type[index]; } Point rotatePoint(Point b, Real theta); Point translatePoint(Point & b, Point & translation_vector); + void generatePin(std::unique_ptr & mesh_base, const Point & center); /// returns the position of pin given pin index Point getPinPosition(unsigned int i) { return _pin_position[i]; } /// returns the position of subchannel given pin index @@ -49,14 +50,20 @@ class SCMDetailedTriSubChannelMeshGenerator : public MeshGenerator const unsigned int _n_rings; /// Half of gap between adjacent assemblies const Real _flat_to_flat; + /// Number of radial parts in each pin cross section + const unsigned int _num_radial_parts; /// Subchannel type std::vector _subch_type; /// x,y coordinates of the fuel pins std::vector _pin_position; + /// Pin nodes + std::vector> _pin_nodes; /// x,y coordinates of the subchannels std::vector> _subchannel_position; - /// Subdomain ID used for the mesh block - const unsigned int & _block_id; + /// Subchannel subdomain ID + const unsigned int _subchannel_block_id; + /// Pin subdomain ID + const unsigned int _pin_block_id; /// Number of cells in the axial direction const unsigned int _n_cells; /// Number of pins @@ -71,6 +78,8 @@ class SCMDetailedTriSubChannelMeshGenerator : public MeshGenerator std::vector> _chan_to_pin_map; /// Flag to print out the detailed mesh assembly and coordinates const bool _verbose; + /// counter for element numbering + dof_id_type _elem_id; public: static InputParameters validParams(); diff --git a/modules/subchannel/include/meshgenerators/SCMDetailedTriPinMeshGenerator.h b/modules/subchannel/include/meshgenerators/SCMDetailedTriPinMeshGenerator.h deleted file mode 100644 index 410e7f0e2ca1..000000000000 --- a/modules/subchannel/include/meshgenerators/SCMDetailedTriPinMeshGenerator.h +++ /dev/null @@ -1,32 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#pragma once - -#include "DetailedPinMeshGeneratorBase.h" - -/** - * Mesh generator for fuel pins in a triangular lattice - */ -class SCMDetailedTriPinMeshGenerator : public DetailedPinMeshGeneratorBase -{ -public: - SCMDetailedTriPinMeshGenerator(const InputParameters & parameters); - - virtual std::unique_ptr generate() override; - -protected: - /// Mesh that comes from another generator - std::unique_ptr & _input; - /// Number of rings in the fuel assembly - const unsigned int & _n_rings; - -public: - static InputParameters validParams(); -}; diff --git a/modules/subchannel/include/meshgenerators/SCMTriSubChannelMeshGenerator.h b/modules/subchannel/include/meshgenerators/SCMTriAssemblyMeshGenerator.h similarity index 90% rename from modules/subchannel/include/meshgenerators/SCMTriSubChannelMeshGenerator.h rename to modules/subchannel/include/meshgenerators/SCMTriAssemblyMeshGenerator.h index 8497c8c4a62e..91d7091742ed 100644 --- a/modules/subchannel/include/meshgenerators/SCMTriSubChannelMeshGenerator.h +++ b/modules/subchannel/include/meshgenerators/SCMTriAssemblyMeshGenerator.h @@ -15,22 +15,26 @@ /** * Mesh class for triangular, edge and corner subchannels for hexagonal lattice fuel assemblies */ -class SCMTriSubChannelMeshGenerator : public MeshGenerator +class SCMTriAssemblyMeshGenerator : public MeshGenerator { public: - SCMTriSubChannelMeshGenerator(const InputParameters & parameters); + SCMTriAssemblyMeshGenerator(const InputParameters & parameters); std::unique_ptr generate() override; protected: + void buildPinMesh(MeshBase & mesh_base); + /// unheated length of the fuel Pin at the entry of the assembly const Real _unheated_length_entry; /// heated length of the fuel Pin const Real _heated_length; /// unheated length of the fuel Pin at the exit of the assembly const Real _unheated_length_exit; - /// block index - const unsigned int _block_id; + /// subchannel block index + const unsigned int _subchannel_block_id; + /// pin block index + const unsigned int _pin_block_id; /// axial location of nodes std::vector _z_grid; /// axial form loss coefficient per computational cell @@ -70,6 +74,8 @@ class SCMTriSubChannelMeshGenerator : public MeshGenerator /// nodes std::vector> _nodes; + /// pin nodes + std::vector> _pin_nodes; /// stores the channel pairs for each gap std::vector> _gap_to_chan_map; /// stores the fuel pin pairs for each gap each gap @@ -105,6 +111,8 @@ class SCMTriSubChannelMeshGenerator : public MeshGenerator std::vector> _gap_pairs_sf; /// sweeping flow model channel pairs to specify directional edge flow std::vector> _chan_pairs_sf; + /// counter for element numbering + dof_id_type _elem_id; public: static InputParameters validParams(); diff --git a/modules/subchannel/include/meshgenerators/SCMTriPinMeshGenerator.h b/modules/subchannel/include/meshgenerators/SCMTriPinMeshGenerator.h deleted file mode 100644 index 0c55bd26a2d0..000000000000 --- a/modules/subchannel/include/meshgenerators/SCMTriPinMeshGenerator.h +++ /dev/null @@ -1,50 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#pragma once - -#include "MeshGenerator.h" -#include "libmesh/point.h" - -/** - * Class to create Pin mesh in the square lattice geometry - */ -class SCMTriPinMeshGenerator : public MeshGenerator -{ -public: - SCMTriPinMeshGenerator(const InputParameters & parameters); - std::unique_ptr generate() override; - -protected: - /// Mesh that comes from another generator - std::unique_ptr & _input; - /// unheated length of the fuel Pin at the entry of the assembly - const Real _unheated_length_entry; - /// heated length of the fuel Pin - const Real _heated_length; - /// unheated length of the fuel Pin at the exit of the assembly - const Real _unheated_length_exit; - /// axial location of nodes - std::vector _z_grid; - /// Distance between the neighbor fuel pins, pitch - const Real _pitch; - /// number of subchannels in the x direction - const unsigned int _n_rings; - /// number of axial cells - const unsigned int _n_cells; - /// Pin nodes - std::vector> _pin_nodes; - /// block index - const unsigned int _block_id; - /// x-y positions of the fuel pins - std::vector _pin_position; - -public: - static InputParameters validParams(); -}; diff --git a/modules/subchannel/src/mesh/TriSubChannelMesh.C b/modules/subchannel/src/mesh/TriSubChannelMesh.C index 606b79548dd2..cff114f60cb1 100644 --- a/modules/subchannel/src/mesh/TriSubChannelMesh.C +++ b/modules/subchannel/src/mesh/TriSubChannelMesh.C @@ -33,6 +33,7 @@ TriSubChannelMesh::TriSubChannelMesh(const TriSubChannelMesh & other_mesh) _hwire(other_mesh._hwire), _duct_to_pin_gap(other_mesh._duct_to_pin_gap), _nodes(other_mesh._nodes), + _pin_nodes(other_mesh._pin_nodes), _gap_to_chan_map(other_mesh._gap_to_chan_map), _gap_to_pin_map(other_mesh._gap_to_pin_map), _chan_to_gap_map(other_mesh._chan_to_gap_map), diff --git a/modules/subchannel/src/meshgenerators/SCMDetailedTriSubChannelMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C similarity index 87% rename from modules/subchannel/src/meshgenerators/SCMDetailedTriSubChannelMeshGenerator.C rename to modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C index a123c3f0e889..662186bcf1d3 100644 --- a/modules/subchannel/src/meshgenerators/SCMDetailedTriSubChannelMeshGenerator.C +++ b/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C @@ -7,25 +7,21 @@ //* Licensed under LGPL 2.1, please see LICENSE for details //* https://www.gnu.org/licenses/lgpl-2.1.html -#include "SCMDetailedTriSubChannelMeshGenerator.h" +#include "SCMDetailedTriAssemblyMeshGenerator.h" #include "TriSubChannelMesh.h" #include #include #include "libmesh/cell_prism6.h" #include "libmesh/unstructured_mesh.h" -registerMooseObject("SubChannelApp", SCMDetailedTriSubChannelMeshGenerator); -registerMooseObjectRenamed("SubChannelApp", - DetailedTriSubChannelMeshGenerator, - "06/30/2025 24:00", - SCMDetailedTriSubChannelMeshGenerator); +registerMooseObject("SubChannelApp", SCMDetailedTriAssemblyMeshGenerator); InputParameters -SCMDetailedTriSubChannelMeshGenerator::validParams() +SCMDetailedTriAssemblyMeshGenerator::validParams() { InputParameters params = MeshGenerator::validParams(); params.addClassDescription( - "Creates a detailed mesh of subchannels in a triangular lattice arrangement"); + "Creates a detailed mesh of subchannels and pins in a triangular lattice arrangement"); params.addRequiredParam("pitch", "Pitch [m]"); params.addRequiredParam("pin_diameter", "Rod diameter [m]"); params.addParam("unheated_length_entry", 0.0, "Unheated length at entry [m]"); @@ -34,13 +30,19 @@ SCMDetailedTriSubChannelMeshGenerator::validParams() params.addRequiredParam("nrings", "Number of fuel Pin rings per assembly [-]"); params.addRequiredParam("flat_to_flat", "Flat to flat distance for the hexagonal assembly [m]"); - params.addParam("block_id", 0, "Block ID used for the mesh subdomain."); params.addRequiredParam("n_cells", "The number of cells in the axial direction"); + params.addRangeCheckedParam("num_radial_parts", + 16, + "num_radial_parts>=4", + "Number of radial parts (must be at least 4)."); + params.addParam("subchannel_block_id", 0, "Subchannel block id."); + params.addParam("pin_block_id", 1, "Fuel pin block id."); + params.addParam("block_id", 0, "Deprecated subchannel block id."); params.addParam("verbose_flag", false, "Flag to print out the mesh coordinates."); return params; } -SCMDetailedTriSubChannelMeshGenerator::SCMDetailedTriSubChannelMeshGenerator( +SCMDetailedTriAssemblyMeshGenerator::SCMDetailedTriAssemblyMeshGenerator( const InputParameters & parameters) : MeshGenerator(parameters), _unheated_length_entry(getParam("unheated_length_entry")), @@ -50,9 +52,16 @@ SCMDetailedTriSubChannelMeshGenerator::SCMDetailedTriSubChannelMeshGenerator( _pin_diameter(getParam("pin_diameter")), _n_rings(getParam("nrings")), _flat_to_flat(getParam("flat_to_flat")), - _block_id(getParam("block_id")), + _num_radial_parts(getParam("num_radial_parts")), + _subchannel_block_id(isParamValid("subchannel_block_id") + ? getParam("subchannel_block_id") + : getParam("block_id")), + _pin_block_id(getParam("pin_block_id")), _n_cells(getParam("n_cells")), - _verbose(getParam("verbose_flag")) + _nrods(0), + _n_channels(0), + _verbose(getParam("verbose_flag")), + _elem_id(0) { Real L = _unheated_length_entry + _heated_length + _unheated_length_exit; Real dz = L / _n_cells; @@ -92,7 +101,7 @@ SCMDetailedTriSubChannelMeshGenerator::SCMDetailedTriSubChannelMeshGenerator( _pins_in_rings[i].push_back(k++); // Given the number of pins and number of fuel Pin rings, the number of subchannels can be // computed as follows: - unsigned int chancount = 0.0; + unsigned int chancount = 0; // Summing internal channels for (unsigned int j = 0; j < _n_rings - 1; j++) chancount += j * 6; @@ -299,8 +308,54 @@ SCMDetailedTriSubChannelMeshGenerator::SCMDetailedTriSubChannelMeshGenerator( } } +void +SCMDetailedTriAssemblyMeshGenerator::generatePin(std::unique_ptr & mesh_base, + const Point & center) +{ + const Real dalpha = 360. / _num_radial_parts; + const Real radius = _pin_diameter / 2.; + + std::vector> nodes; + nodes.resize(_n_cells + 1); + std::vector center_nodes; + center_nodes.reserve(_n_cells + 1); + for (unsigned int k = 0; k < _n_cells + 1; k++) + { + const Real elev = _z_grid[k]; + center_nodes.push_back(mesh_base->add_point(Point(center(0), center(1), elev))); + nodes[k].push_back(center_nodes.back()); + Real alpha = 0.; + for (unsigned int i = 0; i < _num_radial_parts; i++, alpha += dalpha) + { + const Real dx = radius * std::cos(alpha * M_PI / 180.); + const Real dy = radius * std::sin(alpha * M_PI / 180.); + nodes[k].push_back(mesh_base->add_point(Point(center(0) + dx, center(1) + dy, elev))); + } + } + + for (unsigned int k = 0; k < _n_cells; k++) + for (unsigned int i = 0; i < _num_radial_parts; i++) + { + Elem * elem = new Prism6; + elem->subdomain_id() = _pin_block_id; + elem->set_id(_elem_id++); + mesh_base->add_elem(elem); + const unsigned int ctr_idx = 0; + const unsigned int idx1 = (i % _num_radial_parts) + 1; + const unsigned int idx2 = ((i + 1) % _num_radial_parts) + 1; + elem->set_node(0, nodes[k][ctr_idx]); + elem->set_node(1, nodes[k][idx1]); + elem->set_node(2, nodes[k][idx2]); + elem->set_node(3, nodes[k + 1][ctr_idx]); + elem->set_node(4, nodes[k + 1][idx1]); + elem->set_node(5, nodes[k + 1][idx2]); + } + + _pin_nodes.push_back(center_nodes); +} + std::unique_ptr -SCMDetailedTriSubChannelMeshGenerator::generate() +SCMDetailedTriAssemblyMeshGenerator::generate() { auto mesh_base = buildMeshBaseObject(); BoundaryInfo & boundary_info = mesh_base->get_boundary_info(); @@ -376,13 +431,18 @@ SCMDetailedTriSubChannelMeshGenerator::generate() } const unsigned int n_points = points_per_level * (_n_cells + 1); const unsigned int n_elems = elems_per_level * _n_cells; + const unsigned int n_pins = _pin_position.size(); + const unsigned int pin_points = + n_pins > 0 ? (_n_cells + 1) * (_num_radial_parts + 1) * n_pins : 0; + const unsigned int pin_elems = n_pins > 0 ? _n_cells * _num_radial_parts * n_pins : 0; if (_verbose) { _console << "Number of points: " << n_points << std::endl; _console << "Number of elements: " << n_elems << std::endl; } - mesh_base->reserve_nodes(n_points); - mesh_base->reserve_elem(n_elems); + mesh_base->reserve_nodes(n_points + pin_points); + mesh_base->reserve_elem(n_elems + pin_elems); + _pin_nodes.clear(); // Build an array of points arranged in a circle on the xy-plane. (last and first node overlap) // We build for both the square discretization in the edges and the triangular discretization // within the mesh @@ -444,7 +504,8 @@ SCMDetailedTriSubChannelMeshGenerator::generate() // 0 // 4 5 8 9 // 6 7 - std::array center_points; + std::array center_points{}; + center_points[0] = Point(0, 0, 0); { unsigned int start; for (unsigned int i = 0; i < 3; i++) @@ -471,7 +532,8 @@ SCMDetailedTriSubChannelMeshGenerator::generate() // 0 // 4 2 3 // 1 - std::array corner_points; + std::array corner_points{}; + corner_points[0] = Point(0, 0, 0); { for (unsigned int ii = 0; ii < points_per_sixth; ii++) { @@ -507,7 +569,8 @@ SCMDetailedTriSubChannelMeshGenerator::generate() // 0 // 1 2 5 6 // 3 4 - std::array side_points; + std::array side_points{}; + side_points[0] = Point(0, 0, 0); { for (unsigned int ii = 0; ii < points_per_quadrant; ii++) { @@ -753,7 +816,7 @@ SCMDetailedTriSubChannelMeshGenerator::generate() for (unsigned int i = 0; i < elems_per_channel; i++) { Elem * elem = new Prism6; - elem->subdomain_id() = _block_id; + elem->subdomain_id() = _subchannel_block_id; elem->set_id(elem_id++); elem = mesh_base->add_elem(elem); @@ -787,7 +850,15 @@ SCMDetailedTriSubChannelMeshGenerator::generate() _console << "Element counter: " << element_counter << std::endl; boundary_info.sideset_name(0) = "inlet"; boundary_info.sideset_name(1) = "outlet"; - mesh_base->subdomain_name(_block_id) = name(); + mesh_base->subdomain_name(_subchannel_block_id) = "subchannel"; + if (n_pins > 0) + { + _elem_id = mesh_base->n_elem(); + for (auto & ctr : _pin_position) + generatePin(mesh_base, ctr); + } + if (n_pins > 0) + mesh_base->subdomain_name(_pin_block_id) = "fuel_pins"; if (_verbose) _console << "Mesh assembly done" << std::endl; mesh_base->prepare_for_use(); @@ -796,36 +867,24 @@ SCMDetailedTriSubChannelMeshGenerator::generate() } Point -SCMDetailedTriSubChannelMeshGenerator::rotatePoint(Point b, Real theta) +SCMDetailedTriAssemblyMeshGenerator::rotatePoint(Point b, Real theta) { - - // Building rotation matrix - std::vector> A; - A.resize(3); - for (std::vector a : A) - { - a.resize(3); - } + std::vector> A(3, std::vector(3)); A[0] = {std::cos(theta), -std::sin(theta), 0.0}; A[1] = {std::sin(theta), std::cos(theta), 0.0}; A[2] = {0.0, 0.0, 1.0}; - // Rotating vector Point rotated_vector = Point(0.0, 0.0, 0.0); for (unsigned int i = 0; i < 3; i++) - { for (unsigned int j = 0; j < 3; j++) - { rotated_vector(i) += A[i][j] * b(j); - } - } return rotated_vector; } Point -SCMDetailedTriSubChannelMeshGenerator::translatePoint(Point & b, Point & translation_vector) +SCMDetailedTriAssemblyMeshGenerator::translatePoint(Point & b, Point & translation_vector) { // Translating point Point translated_vector = Point(0.0, 0.0, 0.0); diff --git a/modules/subchannel/src/meshgenerators/SCMDetailedTriPinMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMDetailedTriPinMeshGenerator.C deleted file mode 100644 index b2fe4b8cd751..000000000000 --- a/modules/subchannel/src/meshgenerators/SCMDetailedTriPinMeshGenerator.C +++ /dev/null @@ -1,57 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#include "SCMDetailedTriPinMeshGenerator.h" -#include "TriSubChannelMesh.h" -#include "libmesh/cell_prism6.h" - -registerMooseObject("SubChannelApp", SCMDetailedTriPinMeshGenerator); -registerMooseObjectRenamed("SubChannelApp", - DetailedTriPinMeshGenerator, - "06/30/2025 24:00", - SCMDetailedTriPinMeshGenerator); - -InputParameters -SCMDetailedTriPinMeshGenerator::validParams() -{ - InputParameters params = DetailedPinMeshGeneratorBase::validParams(); - params.addClassDescription( - "Creates a detailed mesh of fuel pins in a triangular lattice arrangement"); - params.addRequiredParam("input", "The corresponding subchannel mesh"); - params.addRequiredParam("nrings", "Number of fuel Pin rings per assembly [-]"); - return params; -} - -SCMDetailedTriPinMeshGenerator::SCMDetailedTriPinMeshGenerator(const InputParameters & parameters) - : DetailedPinMeshGeneratorBase(parameters), - _input(getMesh("input")), - _n_rings(getParam("nrings")) -{ -} - -std::unique_ptr -SCMDetailedTriPinMeshGenerator::generate() -{ - std::unique_ptr mesh_base = std::move(_input); - if (!mesh_base) - mesh_base = buildMeshBaseObject(); - mesh_base->set_mesh_dimension(3); - - std::vector pin_centers; - TriSubChannelMesh::pinPositions(pin_centers, _n_rings, _pitch, Point(0, 0)); - - _elem_id = mesh_base->n_elem(); - for (auto & ctr : pin_centers) - generatePin(mesh_base, ctr); - - mesh_base->subdomain_name(_block_id) = name(); - mesh_base->prepare_for_use(); - - return mesh_base; -} diff --git a/modules/subchannel/src/meshgenerators/SCMTriSubChannelMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMTriAssemblyMeshGenerator.C similarity index 92% rename from modules/subchannel/src/meshgenerators/SCMTriSubChannelMeshGenerator.C rename to modules/subchannel/src/meshgenerators/SCMTriAssemblyMeshGenerator.C index b32fb1509c90..f36aac191455 100644 --- a/modules/subchannel/src/meshgenerators/SCMTriSubChannelMeshGenerator.C +++ b/modules/subchannel/src/meshgenerators/SCMTriAssemblyMeshGenerator.C @@ -7,24 +7,20 @@ //* Licensed under LGPL 2.1, please see LICENSE for details //* https://www.gnu.org/licenses/lgpl-2.1.html -#include "SCMTriSubChannelMeshGenerator.h" +#include "SCMTriAssemblyMeshGenerator.h" #include "TriSubChannelMesh.h" #include #include "libmesh/edge_edge2.h" #include "libmesh/unstructured_mesh.h" -registerMooseObject("SubChannelApp", SCMTriSubChannelMeshGenerator); -registerMooseObjectRenamed("SubChannelApp", - TriSubChannelMeshGenerator, - "06/30/2025 24:00", - SCMTriSubChannelMeshGenerator); +registerMooseObject("SubChannelApp", SCMTriAssemblyMeshGenerator); InputParameters -SCMTriSubChannelMeshGenerator::validParams() +SCMTriAssemblyMeshGenerator::validParams() { InputParameters params = MeshGenerator::validParams(); params.addClassDescription( - "Creates a mesh of 1D subchannels in a triangular lattice arrangement"); + "Creates a mesh of 1D subchannels and 1D pins in a triangular lattice arrangement"); params.addRequiredParam("n_cells", "The number of cells in the axial direction"); params.addRequiredParam("pitch", "Pitch [m]"); params.addRequiredParam("pin_diameter", "Rod diameter [m]"); @@ -54,16 +50,21 @@ SCMTriSubChannelMeshGenerator::validParams() params.addParam>("k_blockage", std::vector({0.0}), "Form loss coefficient of subchannels affected by blockage"); - params.addParam("block_id", 0, "Domain Index"); + params.addParam("subchannel_block_id", 0, "Subchannel block id"); + params.addParam("pin_block_id", 1, "Fuel Pin block id"); + params.addParam("block_id", 0, "Deprecated subchannel block id"); return params; } -SCMTriSubChannelMeshGenerator::SCMTriSubChannelMeshGenerator(const InputParameters & params) +SCMTriAssemblyMeshGenerator::SCMTriAssemblyMeshGenerator(const InputParameters & params) : MeshGenerator(params), _unheated_length_entry(getParam("unheated_length_entry")), _heated_length(getParam("heated_length")), _unheated_length_exit(getParam("unheated_length_exit")), - _block_id(getParam("block_id")), + _subchannel_block_id(isParamValid("subchannel_block_id") + ? getParam("subchannel_block_id") + : getParam("block_id")), + _pin_block_id(getParam("pin_block_id")), _spacer_z(getParam>("spacer_z")), _spacer_k(getParam>("spacer_k")), _z_blockage(getParam>("z_blockage")), @@ -75,11 +76,15 @@ SCMTriSubChannelMeshGenerator::SCMTriSubChannelMeshGenerator(const InputParamete _pin_diameter(getParam("pin_diameter")), _n_cells(getParam("n_cells")), _n_rings(getParam("nrings")), + _n_channels(0), _flat_to_flat(getParam("flat_to_flat")), _dwire(getParam("dwire")), _hwire(getParam("hwire")), _duct_to_pin_gap(0.5 * - (_flat_to_flat - (_n_rings - 1) * _pitch * std::sqrt(3.0) - _pin_diameter)) + (_flat_to_flat - (_n_rings - 1) * _pitch * std::sqrt(3.0) - _pin_diameter)), + _npins(0), + _n_gaps(0), + _elem_id(0) { if (_spacer_z.size() != _spacer_k.size()) mooseError(name(), ": Size of vector spacer_z should be equal to size of vector spacer_k"); @@ -753,15 +758,56 @@ SCMTriSubChannelMeshGenerator::SCMTriSubChannelMeshGenerator(const InputParamete } } +void +SCMTriAssemblyMeshGenerator::buildPinMesh(MeshBase & mesh_base) +{ + if (_npins == 0) + return; + + mesh_base.reserve_elem(_n_cells * _npins); + mesh_base.reserve_nodes((_n_cells + 1) * _npins); + + _pin_nodes.clear(); + _pin_nodes.resize(_npins); + + const unsigned int node_sub = mesh_base.n_nodes(); + const unsigned int elem_sub = mesh_base.n_elem(); + + unsigned int node_id = node_sub; + for (unsigned int i = 0; i < _npins; i++) + { + _pin_nodes[i].reserve(_n_cells + 1); + for (unsigned int iz = 0; iz < _n_cells + 1; iz++) + _pin_nodes[i].push_back(mesh_base.add_point( + Point(_pin_position[i](0), _pin_position[i](1), _z_grid[iz]), node_id++)); + } + + unsigned int elem_id = elem_sub; + for (unsigned int i = 0; i < _npins; i++) + for (unsigned int iz = 0; iz < _n_cells; iz++) + { + Elem * elem = new Edge2; + elem->subdomain_id() = _pin_block_id; + elem->set_id(elem_id++); + elem = mesh_base.add_elem(elem); + const int indx1 = (_n_cells + 1) * i + iz + node_sub; + const int indx2 = (_n_cells + 1) * i + (iz + 1) + node_sub; + elem->set_node(0, mesh_base.node_ptr(indx1)); + elem->set_node(1, mesh_base.node_ptr(indx2)); + } + + mesh_base.subdomain_name(_pin_block_id) = "fuel_pins"; +} + std::unique_ptr -SCMTriSubChannelMeshGenerator::generate() +SCMTriAssemblyMeshGenerator::generate() { auto mesh_base = buildMeshBaseObject(); BoundaryInfo & boundary_info = mesh_base->get_boundary_info(); mesh_base->set_spatial_dimension(3); - mesh_base->reserve_elem(_n_cells * _n_channels); - mesh_base->reserve_nodes((_n_cells + 1) * _n_channels); + mesh_base->reserve_elem(_n_cells * (_n_channels + _npins)); + mesh_base->reserve_nodes((_n_cells + 1) * (_n_channels + _npins)); _nodes.resize(_n_channels); // Add the points for the give x,y subchannel positions. The grid is hexagonal. // The grid along @@ -786,6 +832,7 @@ SCMTriSubChannelMeshGenerator::generate() for (unsigned int iz = 0; iz < _n_cells; iz++) { Elem * elem = new Edge2; + elem->subdomain_id() = _subchannel_block_id; elem->set_id(elem_id++); elem = mesh_base->add_elem(elem); const int indx1 = (_n_cells + 1) * i + iz; @@ -805,7 +852,8 @@ SCMTriSubChannelMeshGenerator::generate() boundary_info.nodeset_name(1) = "outlet"; // Naming the block - mesh_base->subdomain_name(_block_id) = name(); + mesh_base->subdomain_name(_subchannel_block_id) = "subchannel"; + buildPinMesh(*mesh_base); mesh_base->prepare_for_use(); @@ -848,6 +896,8 @@ SCMTriSubChannelMeshGenerator::generate() sch_mesh._gap_pairs_sf = _gap_pairs_sf; sch_mesh._chan_pairs_sf = _chan_pairs_sf; sch_mesh._pin_to_chan_map = _pin_to_chan_map; + sch_mesh._pin_nodes = _pin_nodes; + sch_mesh._pin_mesh_exist = (_npins > 0); return mesh_base; } diff --git a/modules/subchannel/src/meshgenerators/SCMTriPinMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMTriPinMeshGenerator.C deleted file mode 100644 index b0fb0a469dcb..000000000000 --- a/modules/subchannel/src/meshgenerators/SCMTriPinMeshGenerator.C +++ /dev/null @@ -1,123 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#include "SCMTriPinMeshGenerator.h" -#include "TriSubChannelMesh.h" -#include "libmesh/edge_edge2.h" -#include - -registerMooseObject("SubChannelApp", SCMTriPinMeshGenerator); -registerMooseObjectRenamed("SubChannelApp", - TriPinMeshGenerator, - "06/30/2025 24:00", - SCMTriPinMeshGenerator); - -InputParameters -SCMTriPinMeshGenerator::validParams() -{ - InputParameters params = MeshGenerator::validParams(); - params.addRequiredParam("input", "The corresponding subchannel mesh"); - params.addClassDescription("Creates a mesh of 1D fuel pins in a triangular lattice arrangement"); - params.addParam("unheated_length_entry", 0.0, "Unheated length at entry [m]"); - params.addRequiredParam("heated_length", "Heated length [m]"); - params.addParam("unheated_length_exit", 0.0, "Unheated length at exit [m]"); - params.addRequiredParam("pitch", "Pitch [m]"); - params.addRequiredParam("nrings", "Number of fuel Pin rings per assembly [-]"); - params.addRequiredParam("n_cells", "The number of cells in the axial direction"); - params.addParam("block_id", 1, "Domain Index"); - return params; -} - -SCMTriPinMeshGenerator::SCMTriPinMeshGenerator(const InputParameters & params) - : MeshGenerator(params), - _input(getMesh("input")), - _unheated_length_entry(getParam("unheated_length_entry")), - _heated_length(getParam("heated_length")), - _unheated_length_exit(getParam("unheated_length_exit")), - _pitch(getParam("pitch")), - _n_rings(getParam("nrings")), - _n_cells(getParam("n_cells")), - _block_id(getParam("block_id")) -{ - Real dz = (_unheated_length_entry + _heated_length + _unheated_length_exit) / _n_cells; - for (unsigned int i = 0; i < _n_cells + 1; i++) - _z_grid.push_back(dz * i); -} - -std::unique_ptr -SCMTriPinMeshGenerator::generate() -{ - - // Setting up base elements in the mesh - std::unique_ptr mesh_base = std::move(_input); - if (!mesh_base) - mesh_base = buildMeshBaseObject(); - - mesh_base->set_mesh_dimension(3); - - // Defining the Pin positions - TriSubChannelMesh::pinPositions(_pin_position, _n_rings, _pitch, Point(0, 0)); - auto _nrods = _pin_position.size(); - - // Reserving memory in the mesh - mesh_base->reserve_elem(_n_cells * _nrods); - mesh_base->reserve_nodes((_n_cells + 1) * _nrods); - _pin_nodes.resize(_nrods); - - // Defining the extent of the subchanel mesh to append pins mesh - // to the current subchannel mesh - unsigned int chancount = 0; - for (unsigned int j = 0; j < _n_rings - 1; j++) - chancount += j * 6; - unsigned int _n_channels = chancount + _nrods - 1 + (_n_rings - 1) * 6 + 6; - unsigned int node_sub = (_n_cells + 1) * _n_channels; - unsigned int elem_sub = _n_cells * _n_channels; - - // Add the points in the shape of a rectilinear grid. The grid is regular - // on the xy-plane with a spacing of `pitch` between points. The grid along - // z is also regular. Store pointers in the _nodes - // array so we can keep track of which points are in which pins. - unsigned int node_id = node_sub; - for (unsigned int i = 0; i < _nrods; i++) - { - _pin_nodes[i].reserve(_n_cells); - for (unsigned int iz = 0; iz < _n_cells + 1; iz++) - { - _pin_nodes[i].push_back(mesh_base->add_point( - Point(_pin_position[i](0), _pin_position[i](1), _z_grid[iz]), node_id++)); - } - } - - // Add the elements which in this case are 2-node edges that link each - // pin nodes vertically. - unsigned int elem_id = elem_sub; - for (unsigned int i = 0; i < _nrods; i++) - { - for (unsigned int iz = 0; iz < _n_cells; iz++) - { - Elem * elem = new Edge2; - elem->subdomain_id() = _block_id; - elem->set_id(elem_id++); - elem = mesh_base->add_elem(elem); - const int indx1 = (_n_cells + 1) * i + iz + node_sub; - const int indx2 = (_n_cells + 1) * i + (iz + 1) + node_sub; - elem->set_node(0, mesh_base->node_ptr(indx1)); - elem->set_node(1, mesh_base->node_ptr(indx2)); - } - } - mesh_base->subdomain_name(_block_id) = name(); - mesh_base->prepare_for_use(); - - // move the meta data into TriSubChannelMesh - auto & sch_mesh = static_cast(*_mesh); - sch_mesh._pin_nodes = _pin_nodes; - sch_mesh._pin_mesh_exist = true; - - return mesh_base; -} diff --git a/modules/subchannel/src/transfers/SCMSolutionTransfer.C b/modules/subchannel/src/transfers/SCMSolutionTransfer.C index c755afaac38b..04a3d9644fa3 100644 --- a/modules/subchannel/src/transfers/SCMSolutionTransfer.C +++ b/modules/subchannel/src/transfers/SCMSolutionTransfer.C @@ -107,7 +107,8 @@ SCMSolutionTransfer::transferToMultiApps() if (from_mesh == nullptr) mooseError("This transfer works only with SubChannelMesh classes."); if (_pin_transfer && !from_mesh->pinMeshExist()) - mooseError("This transfer was configured for pin variables, but the source mesh has no pin mesh."); + mooseError( + "This transfer was configured for pin variables, but the source mesh has no pin mesh."); for (unsigned int i = 0; i < getToMultiApp()->numGlobalApps(); i++) if (getToMultiApp()->hasLocalApp(i)) @@ -176,7 +177,8 @@ SCMSolutionTransfer::transferNodalVars(unsigned int app_idx) Node * SCMSolutionTransfer::getFromNode(const SubChannelMesh & from_mesh, const Point & src_node) { - unsigned int sch_idx = _pin_transfer ? from_mesh.pinIndex(src_node) : from_mesh.channelIndex(src_node); + unsigned int sch_idx = + _pin_transfer ? from_mesh.pinIndex(src_node) : from_mesh.channelIndex(src_node); unsigned iz = from_mesh.getZIndex(src_node); return _pin_transfer ? from_mesh.getPinNode(sch_idx, iz) : from_mesh.getChannelNode(sch_idx, iz); } diff --git a/modules/subchannel/test/tests/SCMTriPower/gold/not_aligned.csv b/modules/subchannel/test/tests/SCMTriPower/gold/not_aligned.csv deleted file mode 100644 index 36fa6c21b8b1..000000000000 --- a/modules/subchannel/test/tests/SCMTriPower/gold/not_aligned.csv +++ /dev/null @@ -1,3 +0,0 @@ -time,Total_power_Aux_defaultPP,Total_power_IC_defaultPP,Total_power_SCMPinPowerPostprocessor,Total_power_SCMTHPowerPostprocessor -0,0,0,0,0 -1,20000,20000,20000,20000.030207665 diff --git a/modules/subchannel/test/tests/SCMTriPower/gold/test_out.csv b/modules/subchannel/test/tests/SCMTriPower/gold/test_out.csv deleted file mode 100644 index fcdb6d983f8f..000000000000 --- a/modules/subchannel/test/tests/SCMTriPower/gold/test_out.csv +++ /dev/null @@ -1,3 +0,0 @@ -time,Total_power_Aux_defaultPP,Total_power_IC_defaultPP,Total_power_SCMPinPowerPostprocessor,Total_power_SCMTHPowerPostprocessor -0,0,0,0,0 -1,21000,21000,20000,19999.971950208 diff --git a/modules/subchannel/test/tests/SCMTriPower/test.i b/modules/subchannel/test/tests/SCMTriPower/test.i deleted file mode 100644 index a2a63abdd801..000000000000 --- a/modules/subchannel/test/tests/SCMTriPower/test.i +++ /dev/null @@ -1,188 +0,0 @@ -T_in = 588.5 -flow_area = 0.0004980799633447909 #m2 -mass_flux_in = '${fparse 55*3.78541/10/60/flow_area}' -P_out = 2.0e5 # Pa -length = 0.5 -num_cells = 40 -[TriSubChannelMesh] - [subchannel] - type = SCMTriSubChannelMeshGenerator - nrings = 3 - n_cells = ${num_cells} - flat_to_flat = 3.41e-2 - heated_length = 0.5 - unheated_length_entry = 0.4 - unheated_length_exit = 0.1 - pin_diameter = 5.84e-3 - pitch = 7.26e-3 - dwire = 1.42e-3 - hwire = 0.3048 - [] -[] - -[AuxVariables] - [q_prime_aux] - [] -[] - -[Functions] - [axial_heat_rate] - type = ParsedFunction - expression = '(pi/2)*sin(pi*z/L)' - symbol_names = 'L' - symbol_values = '${length}' - [] -[] - -[FluidProperties] - [sodium] - type = PBSodiumFluidProperties - [] -[] - -[SubChannel] - type = TriSubChannel1PhaseProblem - fp = sodium - n_blocks = 1 - P_out = 2.0e5 - CT = 2.6 - compute_density = true - compute_viscosity = true - compute_power = true - implicit = true - segregated = false - verbose_subchannel = true - interpolation_scheme = upwind - # Heat Transfer Correlation - pin_HTC_closure = 'gnielinski' - # friction model - friction_closure = 'cheng' -[] - -[SCMClosures] - [cheng] - type = SCMFrictionUpdatedChengTodreas - [] - [gnielinski] - type = SCMHTCGnielinski - [] -[] - -[ICs] - [S_IC] - type = SCMTriFlowAreaIC - variable = S - [] - - [w_perim_IC] - type = SCMTriWettedPerimIC - variable = w_perim - [] - - [q_prime_ic] - type = SCMTriPowerIC - variable = q_prime - power = 20000 # W - filename = "pin_power_profile.txt" - # axial_heat_rate = axial_heat_rate - [] - - [T_ic] - type = ConstantIC - variable = T - value = ${T_in} - [] - - [P_ic] - type = ConstantIC - variable = P - value = 0.0 - [] - - [DP_ic] - type = ConstantIC - variable = DP - value = 0.0 - [] - - [Viscosity_ic] - type = ViscosityIC - variable = mu - p = ${P_out} - T = T - fp = sodium - [] - - [rho_ic] - type = RhoFromPressureTemperatureIC - variable = rho - p = ${P_out} - T = T - fp = sodium - [] - - [h_ic] - type = SpecificEnthalpyFromPressureTemperatureIC - variable = h - p = ${P_out} - T = T - fp = sodium - [] - - [mdot_ic] - type = ConstantIC - variable = mdot - value = 0.0 - [] -[] - -[AuxKernels] - [T_in_bc] - type = ConstantAux - variable = T - boundary = inlet - value = ${T_in} - execute_on = 'timestep_begin' - [] - [mdot_in_bc] - type = SCMMassFlowRateAux - variable = mdot - boundary = inlet - area = S - mass_flux = ${mass_flux_in} - execute_on = 'timestep_begin' - [] - [q_prime_AUX] - type = SCMTriPowerAux - variable = q_prime_aux - power = 20000 # W - filename = "pin_power_profile.txt" #type in name of file that describes radial power profile - # axial_heat_rate = axial_heat_rate - execute_on = 'initial' - [] -[] - -[Executioner] - type = Steady -[] - -[Postprocessors] - [Total_power_IC_defaultPP] - type = ElementIntegralVariablePostprocessor - variable = q_prime - [] - [Total_power_Aux_defaultPP] - type = ElementIntegralVariablePostprocessor - variable = q_prime_aux - [] - [Total_power_SCMPinPowerPostprocessor] - type = SCMPinPowerPostprocessor - [] - [Total_power_SCMTHPowerPostprocessor] - type = SCMTHPowerPostprocessor - [] -[] - -[Outputs] - csv = true -[] diff --git a/modules/subchannel/test/tests/SCMTriPower/test_with_pins.i b/modules/subchannel/test/tests/SCMTriPower/test_with_pins.i index ba55007c2787..1fbf13fef357 100644 --- a/modules/subchannel/test/tests/SCMTriPower/test_with_pins.i +++ b/modules/subchannel/test/tests/SCMTriPower/test_with_pins.i @@ -6,7 +6,7 @@ length = 0.5 num_cells = 40 [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = 3 n_cells = ${num_cells} flat_to_flat = 3.41e-2 @@ -18,17 +18,6 @@ num_cells = 40 dwire = 1.42e-3 hwire = 0.3048 [] - - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = 3 - n_cells = ${num_cells} - heated_length = 0.5 - unheated_length_entry = 0.4 - unheated_length_exit = 0.1 - pitch = 7.26e-3 - [] [] [AuxVariables] diff --git a/modules/subchannel/test/tests/SCMTriPower/tests b/modules/subchannel/test/tests/SCMTriPower/tests index 8088d489ee74..9690bda8beeb 100644 --- a/modules/subchannel/test/tests/SCMTriPower/tests +++ b/modules/subchannel/test/tests/SCMTriPower/tests @@ -1,16 +1,6 @@ [Tests] design = 'SCMTriPowerAux.md SCMTriPowerIC.md' issues = '#28497 #29194' - [SCMTriPower_cells_aligned] - type = CSVDiff - capabilities = 'method!=dbg' - input = 'test.i' - csvdiff = 'test_out.csv' - recover = False - abs_zero = 1e-7 - rel_err = 1e-5 - requirement = 'The system will populate a uniform linear heat rate on subchannels in a triangular lattice using an initial condition and auxiliary kernel' - [] [SCMTriPower_cells_aligned_with_pins] type = CSVDiff input = 'test_with_pins.i' @@ -21,17 +11,6 @@ rel_err = 1e-5 requirement = 'The system will populate a sinusoidal linear heat rate on pins in a triangular lattice using an initial condition and auxiliary kernel' [] - [SCMTriPower_cells_not_aligned] - type = CSVDiff - input = 'test.i' - capabilities = 'method!=dbg' - csvdiff = 'not_aligned.csv' - cli_args = 'num_cells=31 Outputs/file_base=not_aligned' - recover = False - abs_zero = 1e-7 - rel_err = 1e-5 - requirement = 'The system will populate a uniform linear heat rate on subchannels in a triangular lattice using an initial condition and auxiliary kernel in a mesh that has axial divisions that are not aligned with the heated region entrance and exit heights.' - [] [SCMTriPower_cells_not_aligned_with_pins] type = CSVDiff input = 'test_with_pins.i' diff --git a/modules/subchannel/test/tests/ics/FCTFdisplacementIC/test.i b/modules/subchannel/test/tests/ics/FCTFdisplacementIC/test.i index 8f3a7aa22050..a6a2029ccd57 100644 --- a/modules/subchannel/test/tests/ics/FCTFdisplacementIC/test.i +++ b/modules/subchannel/test/tests/ics/FCTFdisplacementIC/test.i @@ -32,7 +32,7 @@ unheated_length_exit = 0.855 #m [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = 10 flat_to_flat = ${inner_duct_in} @@ -47,16 +47,6 @@ unheated_length_exit = 0.855 #m spacer_k = '0.0' [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = 10 - unheated_length_entry = ${unheated_length_entry} - heated_length = ${heated_length} - unheated_length_exit = ${unheated_length_exit} - pitch = ${fuel_pin_pitch} - [] [] [Functions] diff --git a/modules/subchannel/test/tests/ics/marvel/gold/test_out.e b/modules/subchannel/test/tests/ics/marvel/gold/test_out.e index bbf1ae860599583c18f6f495007e62b09df0656e..fdd8593808871b87a6ba9ac27423b14e1d36f8fa 100644 GIT binary patch literal 378688 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%0Amq<$xWea>x!-Ibuht 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 delta 8861 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 delta 3567 zcmaJ@eQXrh5%-?&>^s}oKHHqlhtF$_l>}n@zKp@xoWC$%roNMpZ=3bq?w)V!z1?H? z&Ja??=8q5xPQe+f@cm^2g;oNzRgy+kAfl~`LR*NcHmX#KsBJ`5)DRjaBvPf$+w~nT zh^+42%$xbmd-LYaoA;*vW%}cNs;#rD+mw}+MOq%VQbI*uV$`G}NJH4m%Bsd@B{ETv zc;tiF%uzX|5IRAZ&(f7rI8Kz+6TX_-*O0MFsW`)nd>r`@wmhTHM8sk2Wo1zlKVYGV zl1*7(!6AyC-*z#t6~(zDyrK%SL?9LdBXYP+t%4>~3zV7`mgb{$F1Ea+5a*elFt^NIUKo%$N;FGIe-lZSTr~H2(eV3wahat&k##g&$P@VmZP~pK~)Yb%L=y( zIm4?QoiqNB&wgmIxmS@I*jIE3S;2F#`DZfN-QR&7)pbSs$}lu!V@V`QijXi)2Sx`G z*+QMmDjh>gA~6$hL)p{#u4()f!Q=X8;zEQvp1-EHOFu!B|dtZLR^<|A}$H=+Ai(sg_hLW02x*~X(<8V}xwWn1c z7PWYKa`=`;i4kS-r#>H8jbGyO@>0Sq@u!q>qLkfnD^$>6#ia3 z`qFvbB$Sh(*Nq_-K22fVUS&UU-54uF;g|L%yLA2Ip_?DwJeZ+iE(vJ9vWMC5xpNS1 z&#Q*p^Y?3iSn!zAep-9Rgj|5q*u{1;1YBis+t&(bk^TcYG^2GoNZBQ zWFhSKE~D$~8!|sN6=7pxOh~a#P9*6%fll&jvR)u|8;v?huaTm%Ze4d-aC9rUk2_^$ zSQjhta1u*pGjKm!4u{FwtDcI{9wD-xS7Yf>o9XoD zX>$AAoO@~1>-IK9o0@p9m*pZ}u5n3Yl=Cj-Bhg5d^(~2hP8Ir7!540(X<%ijk9~GH zn)cSa-Sr;rz0{b$zw!;iV)U!n*y$0dyo3OVMjn676=;u4T<$SF^WC z_aBaX>18W-@oXv?j)=T&h=o0#(5*M|oNh%gqdnf{#-?VEN4HA537?FhR<&>F>qG08;LfFf zc;9m!QZ;hX}7u;XT!?1L2&J`Xb;w|pwj5OZDnw^(*gm% zC+*mD>=Fss)7M@y?JYXOlES0JRiFm^Y4hIBInZ{%W1B`PJe=-y;9wRQ?WluAJzv4_ zTTbGo7XIE!%9;>`WD=hvaP7isxH@KrZ+q9nKLbJSK=3{V9~^lmcHv{4P;|5knnH^q z@P-Ah9LX;Y^P?d$8{!NoqqJ`dR)czD=c$O)>h;TXIUV^G-dpCd@Dn8Hdf$}C1+keH#Etm?k*XVt`(F-QG=n@Ql{i?!W=Y__2)CDSj!I}4v4s&d!~(c=v{@$fE&+YNX5`7n00p@4KnJ{%<@U`~{pT4`{vHnP{d zJ!qCNR^WbnHYqj4Ya4C@#)}sjOmv5>mF`;E-M*nG1nq;1tmz#B_iGg}kRae`=SaF` zx6(e?5vhBTrVV*2!I5QQjv*O(C4Du}Sh^%0-{Y{SV=+{nGNR-^)sU^o9NaxQSC87i zPc{I1+R))btZD*}j>7B)`?gi-5@*?#K3vb2z+X4@L2}C^jO{nW&1jG2*t#wo21i`_ z>6_qY!v`$|P}%Q-iGd(^x8H=~0T%=!IogMVT@-ALtb<39YBX>|)$3O1Vb{QC>{;y- zu7gTX3PpSSzN6A=<~Kg0VEl(<5Er;M2aRVn3Gf_CE4_KkR#G&yJNwHh9l?(q$alsk z;qsdSIPs%u-M@PWZE)mZ1uX7x!M%f%P&;uJr1d(sK-tac?|LS@OCT2v?!^|Ujx=c7 zU^N9_9$uI6b?LdUVQlitS^s}2U}4jKHHGVa_k0PwKIMnY7tUcttFmpx<4!I~6~gOY Z(2ig1roeOQ8|~%GUu0|lxbk)O{{V$%Vrl>Y diff --git a/modules/subchannel/test/tests/ics/tri_flow_area/test.i b/modules/subchannel/test/tests/ics/tri_flow_area/test.i index 8f012266bf49..7b429ae2f4e7 100644 --- a/modules/subchannel/test/tests/ics/tri_flow_area/test.i +++ b/modules/subchannel/test/tests/ics/tri_flow_area/test.i @@ -1,6 +1,6 @@ [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator n_cells = 2 nrings = 3 flat_to_flat = 0.60 diff --git a/modules/subchannel/test/tests/ics/tri_wetted_perimeter/gold/test_out.e b/modules/subchannel/test/tests/ics/tri_wetted_perimeter/gold/test_out.e index b6fd2b1525b7bcb76cf80689168961e45666d156..e05df84bd0a63781f6e8df77521486bd19826684 100644 GIT binary patch literal 46500 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 Di7*e| delta 3563 zcmaJ@eQZ7_n5Ix6ITm&k{>i&$Y}XmZQd>p(=xwB$*pV zPV*{5<+MNK(;sTA@d{E6`?4w_D|i7m>ud@;@;%s5RhO%-3`0XUmPC@I2npkCU{ny1 zEm66&f-$5d5_9opls$`YpT$oTJg$E(o}{3@SOcj4WP+r@eHbtlm6D`*c1TXMC|m(o z3`O?2t4AdDWLB##h?PWBvf+tgrOtW~#xja3jT%_}C&t}cfBsUWCX&vK zqS&F?SeCPZ?2SngI6fs>NY6nzAdIMmAI(9jB5O&Mh(rkuMJ1VZx$rQF++ZtnBqs4k&bQdvgag7IE=b%66B=atc?Zfvw>WKGW^Oy z&}=HI%tw|uko<6_&7W(XGIA_b9mGs@V%qeX&eDGE$?UYuXS?o~1BuS!6kUO&cpk;dhpLi+JtR!5bgnm`G93=XWPug%8u=KV<`O zYhgLuDmj$+)8Z#o;^&oTb;xy73AW0jhi+RT+;X|$9MV4`eT4M3%dM}dsGuRYZk|D* zkp;iq*+AFS)TVw)Jivzhn2_OWDH@}z1vNexw@5gLC(2~4+H~2*0nO&`q3@VXM2D7VUl*Q_4TmN z4@c9^8oRy5ar?3RiRXi*mu4wUI4kUJaarcY812Kl{nP<;#21Rw8{;Bvx6!tSMn^+q zolW&0-g43nYlnF@9`gsnylRMrJrY%|xAL57MK{n6XJcJ`qr;(ECEbL3W$!`$>M3a2 z+6|-IdO(@Zhnp9&;L{5(kyweXw6dmlIC9 zFE18EAtw04jLhS_abyB~P?CAPRCtAtF#%RVXeA6B&_nZ@N3gw#hP$V2VE1f;zj~%J zv~l5Ja}&%A8(})+P5ig@rxg6X{e0qPM^!qk-RK3|9z){6#x+zDeW$q)uCy7T+v7+& zHXFBS6!!PDu&CDj3^iG^GTV zP%B(LUJ5h&UFHDdcav)mCcWAmHHXYPfrGC$b^x;JnyP?IzZmZ;e2T@{7^5auSWse2 zP?jR3nB&aY#SN}5q-k|3o?`-1T;%++z~fSfJSESI(a~U7%cARDbuY*~v%=%doR;%e zmX&1faFR$i#2;uT32O1lLQg!SU5l|Hbbo{gYG_SXh({#H;FEa} zsDp(h+x4Nn0#=lxWe|L;HY4I6X1Ec!!iZn}MKM@w&~56W(5(jrqEl~Sk zo~i}*j21y$h)Id!(UF-Eu!X`ezOFj|7{;c)e(C=&1uSfdKTP9#-@T9zuTFcgvYp4Ow#d8%k2|>_71-aq YEOF{0LL8UAO{}>5ReIu|zj~bhKT&mUYybcN diff --git a/modules/subchannel/test/tests/ics/tri_wetted_perimeter/test.i b/modules/subchannel/test/tests/ics/tri_wetted_perimeter/test.i index 813908645024..18f0aae48ac2 100644 --- a/modules/subchannel/test/tests/ics/tri_wetted_perimeter/test.i +++ b/modules/subchannel/test/tests/ics/tri_wetted_perimeter/test.i @@ -1,6 +1,6 @@ [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = 3 n_cells = 2 flat_to_flat = 0.60 diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/coords.i b/modules/subchannel/test/tests/mesh/detailed_quad_assembly/coords.i similarity index 100% rename from modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/coords.i rename to modules/subchannel/test/tests/mesh/detailed_quad_assembly/coords.i diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_1x2.e b/modules/subchannel/test/tests/mesh/detailed_quad_assembly/gold/coords_1x2.e similarity index 100% rename from modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_1x2.e rename to modules/subchannel/test/tests/mesh/detailed_quad_assembly/gold/coords_1x2.e diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_1x3.e b/modules/subchannel/test/tests/mesh/detailed_quad_assembly/gold/coords_1x3.e similarity index 100% rename from modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_1x3.e rename to modules/subchannel/test/tests/mesh/detailed_quad_assembly/gold/coords_1x3.e diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_3x1.e b/modules/subchannel/test/tests/mesh/detailed_quad_assembly/gold/coords_3x1.e similarity index 100% rename from modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_3x1.e rename to modules/subchannel/test/tests/mesh/detailed_quad_assembly/gold/coords_3x1.e diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_3x3.e b/modules/subchannel/test/tests/mesh/detailed_quad_assembly/gold/coords_3x3.e similarity index 100% rename from modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/gold/coords_3x3.e rename to modules/subchannel/test/tests/mesh/detailed_quad_assembly/gold/coords_3x3.e diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/tests b/modules/subchannel/test/tests/mesh/detailed_quad_assembly/tests similarity index 83% rename from modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/tests rename to modules/subchannel/test/tests/mesh/detailed_quad_assembly/tests index 89a7f6d844db..672d6d247705 100644 --- a/modules/subchannel/test/tests/mesh/detailed_quad_sub_channel_mesh/tests +++ b/modules/subchannel/test/tests/mesh/detailed_quad_assembly/tests @@ -1,6 +1,6 @@ [Tests] design = 'SCMDetailedQuadAssemblyMeshGenerator.md' - issues = '#29191 #29250' + issues = '#32796' [coords] type = Exodiff input = coords.i @@ -16,7 +16,7 @@ exodiff = coords_1x2.e cli_args = "--mesh-only coords_1x2.e Mesh/assembly/nx=1 Mesh/assembly/ny=2" recover = false - requirement = 'The system will create a detailed mesh of the subchannels and fuel pins for quadrilateral assemblies (1x2)' + requirement = 'The system will create a detailed mesh of the subchannels for quadrilateral assemblies (1x2)' [] [1x3] @@ -25,7 +25,7 @@ exodiff = coords_1x3.e cli_args = "--mesh-only coords_1x3.e Mesh/assembly/nx=1 Mesh/assembly/ny=3" recover = false - requirement = 'The system will create a detailed mesh of the subchannels and fuel pins for quadrilateral assemblies (1x3)' + requirement = 'The system will create a detailed mesh of the subchannels for quadrilateral assemblies (1x3)' [] [3x1] @@ -34,6 +34,6 @@ exodiff = coords_3x1.e cli_args = "--mesh-only coords_3x1.e Mesh/assembly/nx=3 Mesh/assembly/ny=1" recover = false - requirement = 'The system will create a detailed mesh of the subchannels and fuel pins for quadrilateral assemblies (3x1)' + requirement = 'The system will create a detailed mesh of the subchannels for quadrilateral assemblies (3x1)' [] [] diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/coords.i b/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/coords.i deleted file mode 100644 index 14f74b363b26..000000000000 --- a/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/coords.i +++ /dev/null @@ -1,15 +0,0 @@ -[GlobalParams] - nx = 3 - ny = 3 - n_cells = 2 - pitch = 1 - side_gap = 0.1 - heated_length = 1 - pin_diameter = 0.5 -[] - -[Mesh] - [assembly] - type = SCMDetailedQuadAssemblyMeshGenerator - [] -[] diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/gold/coords_in.e b/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/gold/coords_in.e deleted file mode 100644 index 505effb7073545502faad9a65b1ed65c9c5ac7e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30800 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 kywSqY4i<{9 diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/tests b/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/tests deleted file mode 100644 index ccdc4672c641..000000000000 --- a/modules/subchannel/test/tests/mesh/detailed_quad_pin_mesh/tests +++ /dev/null @@ -1,12 +0,0 @@ -[Tests] - design = 'SCMDetailedQuadAssemblyMeshGenerator.md' - issues = '#29246' - [coords] - type = Exodiff - input = coords.i - exodiff = coords_in.e - cli_args = "--mesh-only" - recover = false - requirement = 'The system will create a detailed mesh of the subchannels and fuel pins for quadrilateral assemblies' - [] -[] diff --git a/modules/subchannel/test/tests/mesh/detailed_tri_sub_channel_mesh/coords.i b/modules/subchannel/test/tests/mesh/detailed_tri_assembly/coords.i similarity index 70% rename from modules/subchannel/test/tests/mesh/detailed_tri_sub_channel_mesh/coords.i rename to modules/subchannel/test/tests/mesh/detailed_tri_assembly/coords.i index f975c9c989ac..1f069bf87309 100644 --- a/modules/subchannel/test/tests/mesh/detailed_tri_sub_channel_mesh/coords.i +++ b/modules/subchannel/test/tests/mesh/detailed_tri_assembly/coords.i @@ -8,8 +8,8 @@ [TriSubChannelMesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator pin_diameter = 0.01 - verbose_flag = true + verbose_flag = false [] [] diff --git a/modules/subchannel/test/tests/mesh/detailed_tri_pin_mesh/gold/coords_in.e b/modules/subchannel/test/tests/mesh/detailed_tri_assembly/gold/coords_in.e similarity index 99% rename from modules/subchannel/test/tests/mesh/detailed_tri_pin_mesh/gold/coords_in.e rename to modules/subchannel/test/tests/mesh/detailed_tri_assembly/gold/coords_in.e index 7a38d377931e7044eb2580eeb0abaf8d320729a8..bee1e7b5dcff72cf1b7c6ac2d0f6f53022fe7654 100644 GIT binary patch delta 80 zcmX?b!|A{cr-l~B7N!>F7M2#)7Pc+yJtdrJrKvgb1(|up(204m}jVgLXD delta 75 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χ+ME3UWrrUlei=vjl+FU zS{|x?^#j_Ty8co77v~$azjb~}{fF_XaetZ1@`$C~jh-F}^I_?;uOUum0|+n=;dsBZtxQ(~efzFp6s5fgR$dA`EF`DVY;S7OFr zUitOmq2fE)r?g^B)a^SqKPD>2Mcw&j{rP3tFW>BE*f3PPui?p`#zftIk8{`$%It$V zC+7A!tQu;v@`&a)n!jj%B)(|e60gJ=jZ5OuI5K}fS{_;+=DybZ#k804c23Jf%j2k{ z=7;^I_Ah2%PAw1hADR7SF3aPzesf0FEj{*WzprRZw~yofbCMqKKfQg8YA5G8&1>NH zDZMaMx4+>7ejmgK{QjfeL{IDYO0{#^Ha|cVziRd=JxnyabQ98X=XZ-}q}|oPA2W#@zm-mxk*0^IXdBP@DZqm&VNVE{k{GAFA8mb9O9LyFckw zF}F`CYWMq$zwge!&!2xEzY}ftDeV-h+n204<2`2oy5@{~u;1fHdqQ>l`n8RTCM%C< zexvz|<|m9(;`eb&yb@#Ns9)b06LtGgtjBlT{p9f7c7M`P z{r*w-Y`agX*CwI*eJ=dxyN1`1>q$DI5{Ib7AF5r4+r{UvOU&;FnpCsPx1=laNdBVv zk$lMK-DN}Kbn0?tKpB${-l#a#TT+a=}6;mt-AF| z?HI2$`;@lB_n7sEFGqB>f4w@}bS1s$^)p{rucPIYxjskhtCo+JPhxxY?`=2S-w~6- zzcZYV%HzjF5|6w7beQ*D!~8hN#!$I`%)X+29OK<^TtmhO{C=L{_=kJl*uQR^@cHQV zTt601FB*@;AFA7z%;&GO|NFXhQcYGKl8&S=ab=yacs}HFa-Li#8lUs4@whY&yYFK7 zJ!yGpc?|tMPtyBX>xb44tsfi1ep&k$^Luhy9_l~Lyj$-5nA;EYOZ)uU0d4Es=h7

&=j;{_ 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 diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/coords.i b/modules/subchannel/test/tests/mesh/quad_assembly/coords.i similarity index 100% rename from modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/coords.i rename to modules/subchannel/test/tests/mesh/quad_assembly/coords.i diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/gold/coords_in.e b/modules/subchannel/test/tests/mesh/quad_assembly/gold/coords_in.e similarity index 100% rename from modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/gold/coords_in.e rename to modules/subchannel/test/tests/mesh/quad_assembly/gold/coords_in.e diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/subchannel_number.i b/modules/subchannel/test/tests/mesh/quad_assembly/subchannel_number.i similarity index 100% rename from modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/subchannel_number.i rename to modules/subchannel/test/tests/mesh/quad_assembly/subchannel_number.i diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/tests b/modules/subchannel/test/tests/mesh/quad_assembly/tests similarity index 93% rename from modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/tests rename to modules/subchannel/test/tests/mesh/quad_assembly/tests index 2c759ab92371..c25bde3428ca 100644 --- a/modules/subchannel/test/tests/mesh/quad_sub_channel_mesh/tests +++ b/modules/subchannel/test/tests/mesh/quad_assembly/tests @@ -7,7 +7,7 @@ cli_args = "--mesh-only" recover = false issues = '#29241' - requirement = 'The system will create a mesh of the subchannels for quadrilateral assemblies' + requirement = 'The system will create a mesh of the subchannels and pins for quadrilateral assemblies' [] [subchannel_number] type = 'RunException' diff --git a/modules/subchannel/test/tests/mesh/quad_subchannel_duct_mesh/coords.i b/modules/subchannel/test/tests/mesh/quad_duct/coords.i similarity index 100% rename from modules/subchannel/test/tests/mesh/quad_subchannel_duct_mesh/coords.i rename to modules/subchannel/test/tests/mesh/quad_duct/coords.i diff --git a/modules/subchannel/test/tests/mesh/quad_subchannel_duct_mesh/gold/coords_in.e b/modules/subchannel/test/tests/mesh/quad_duct/gold/coords_in.e similarity index 100% rename from modules/subchannel/test/tests/mesh/quad_subchannel_duct_mesh/gold/coords_in.e rename to modules/subchannel/test/tests/mesh/quad_duct/gold/coords_in.e diff --git a/modules/subchannel/test/tests/mesh/quad_subchannel_duct_mesh/tests b/modules/subchannel/test/tests/mesh/quad_duct/tests similarity index 100% rename from modules/subchannel/test/tests/mesh/quad_subchannel_duct_mesh/tests rename to modules/subchannel/test/tests/mesh/quad_duct/tests diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/coords.i b/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/coords.i deleted file mode 100644 index ff0594d392be..000000000000 --- a/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/coords.i +++ /dev/null @@ -1,14 +0,0 @@ -[QuadSubChannelMesh] - [sub_channel] - type = SCMQuadAssemblyMeshGenerator - nx = 3 - ny = 3 - n_cells = 10 - pitch = 0.25 - pin_diameter = 0.125 - side_gap = 0.1 - heated_length = 1 - spacer_k = '0.0' - spacer_z = '0' - [] -[] diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/gold/coords_in.e b/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/gold/coords_in.e deleted file mode 100644 index 0da98d9f82dfa4da52caa38fb56bd9a7026d6f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10056 zcmeI%$!{BF7{~D>O%ppw_niVww{+jr1t_>nmhO8?%QkfqCz;kByRp-atxfm+!Ue>U zBS#MORKyJlBqUBq9FUNZkT~!s@cqraPwJ$!O(k=Pl94`sJTs5qcjkSc*J(Z5n_4Q$ zqOFE75wUbC@PcF}RaRE6Gx36-NqPA~DyO|@s}6cIUWcF2-WbHSA7ndH`RM!uLQKa} z>6DWCP!sKYZRyitlKLHIpY!smg8OX$@x0$bzXOhscWwBAnpqRJ^A4{QTsvMa)kB}* z3AHmYe{Gn*_{se6g!1duPSkH+jl>5XQ=*R5T7N;9HuzZBUievZtCgS3`QF)7Pu|Z4 z?3Rs1`PTC9HBQw}IX<&9olO?}pv%i;{h;8T%l33|Z5NrBvPyj(F~mFlG~*PVC_1O} zQ!>f(enxY{e0of5SD~B3{hzPreI1Q&Xk>zugQXUeL-;b4?|Aw2zz+`8rcxfh?8 zJ2AWm=15ba8d9y;eA<1~crAW9eJq*ojS5OR>R%i0wX1E~%e-j(i`%lfdcn44gl#dl z#ckOe7!>p=ag#_fAXpN;GL)+=1dMME6sR5drXHb-B5TH6&rlgCznoR^quPp8$M{sw4G z+r12-z49&Ov&~=3OI_Ii!26-k{!RV6b-AFMqp>hQAAX7I`qi&(`rLwOr$J*AEBao3 zR&Ka{UAww3<&KNm315rb{gxxv?(=egQ*Jb0{ntDGzuR4;!MxHC)?^s%-Q%@jrd954U!0-3^y$>v_0DTWN`hpKJRf@q>%Mtkc$*_|@(I z9%Ux}aL51b)Yg^w%boxGM{PeP{;?Ka{zG?uv|SCv==hG-L%1+T`g+Uvwt4N{N&dr~ z9{7bZLiRd)Q)w^f2kv*-5pvg$Z_^Lbslwyk5%(_J%WuCUcmPJ{e`L@9h+FWZH#|B5 z14lr=LF>7I9$M&kb3N11vlu-?v1bp(&kXcCyM7bbZ`~6y36n7eQ!x$GF#|I(3ol_d z^nBwLyox!f$6Uc zI^KYuv%HD7kiZsf#Wrk56PnS2R_wq|?80vB!CvgcejLC-9KvB7!BHH;+tBlu6VUVP zckv$H#|Q9m5=pe79UahPolbN?&rf`u!fEIqsTl;wB8M~Rf&K}nzvR6*i*q=S3((WO z5AhK`#wYj`mv9+V2o4AGBxP!a6hx>Sda#T2Dh*If{B}$c3O_Z1uCrXV| zORU2)uz>_)o4BK&BZ*-cNP$3 zq0>N=Mb2WPEOC|+Wtp>_xB@GkRYY0stRc!;XB|-*o%KXftxIveTg_YDTkTu@+ZwQS zU~6Fu?QC_n5x1ksX(mdG(@K;b&Q7B2a&{ACkF%G!5Br@1L^&(`gtv6e9Cut+;v=OBp9Y{HyMCo$6iQ+q_h;rIV6D8vW#4K{o8KU$! zd7>1YUZR|Jw0=cvc}98qC|8`T#A~?j+#t$L=N3_JJ9mh3 z*SSZO`_2PmIVvy)l^BaER3nBsYEX+hjKg?Lz(h>KWK6+SOv7}{fURL$yS8R+t=5w> z7xOS53$PFkScJt`f~8o7&Vv6R&ussJDSjp z7PMjqc48NHV-NOXANIr6f~^6oeXIH7#y_ORGn#!wckGgw>zboz>fA&h?=jnq$r19BAA%rW!Ae#X%_Nc~mQ^1I@AK wPjj;w8dHsz#-d^f)Q{>-bu diff --git a/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/tests b/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/tests deleted file mode 100644 index 93fea8d97d57..000000000000 --- a/modules/subchannel/test/tests/mesh/quad_sub_channel_pin_mesh/tests +++ /dev/null @@ -1,12 +0,0 @@ -[Tests] - design = 'SCMQuadAssemblyMeshGenerator.md' - issues = '#29241' - [coords] - type = Exodiff - input = coords.i - exodiff = coords_in.e - cli_args = "--mesh-only" - recover = false - requirement = 'The system will create a mesh of the fuel pins for quadrilateral assemblies' - [] -[] diff --git a/modules/subchannel/test/tests/mesh/tri_assembly/gold/tricoords3_in.e b/modules/subchannel/test/tests/mesh/tri_assembly/gold/tricoords3_in.e new file mode 100644 index 0000000000000000000000000000000000000000..a112f7ebaf1637b0e0162c0e508c62dd7966f199 GIT binary patch literal 11876 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 literal 0 HcmV?d00001 diff --git a/modules/subchannel/test/tests/mesh/tri_subchannel_mesh/tests b/modules/subchannel/test/tests/mesh/tri_assembly/tests similarity index 85% rename from modules/subchannel/test/tests/mesh/tri_subchannel_mesh/tests rename to modules/subchannel/test/tests/mesh/tri_assembly/tests index dbb673739885..d1db2a068eed 100644 --- a/modules/subchannel/test/tests/mesh/tri_subchannel_mesh/tests +++ b/modules/subchannel/test/tests/mesh/tri_assembly/tests @@ -1,5 +1,5 @@ [Tests] - design = 'SCMTriSubChannelMeshGenerator.md' + design = 'SCMTriAssemblyMeshGenerator.md' issues = '#29194' [tricoords3] type = Exodiff diff --git a/modules/subchannel/test/tests/mesh/tri_subchannel_mesh/tricoords3.i b/modules/subchannel/test/tests/mesh/tri_assembly/tricoords3.i similarity index 85% rename from modules/subchannel/test/tests/mesh/tri_subchannel_mesh/tricoords3.i rename to modules/subchannel/test/tests/mesh/tri_assembly/tricoords3.i index 7e6fa264b59c..6227e26c1621 100644 --- a/modules/subchannel/test/tests/mesh/tri_subchannel_mesh/tricoords3.i +++ b/modules/subchannel/test/tests/mesh/tri_assembly/tricoords3.i @@ -1,6 +1,6 @@ [TriSubChannelMesh] [sub_channel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = 3 n_cells = 2 flat_to_flat = 0.60 diff --git a/modules/subchannel/test/tests/mesh/tri_subchannel_duct_mesh/coords.i b/modules/subchannel/test/tests/mesh/tri_duct/coords.i similarity index 88% rename from modules/subchannel/test/tests/mesh/tri_subchannel_duct_mesh/coords.i rename to modules/subchannel/test/tests/mesh/tri_duct/coords.i index 86bae0d5dd5e..d21a3300ca09 100644 --- a/modules/subchannel/test/tests/mesh/tri_subchannel_duct_mesh/coords.i +++ b/modules/subchannel/test/tests/mesh/tri_duct/coords.i @@ -8,7 +8,7 @@ [TriSubChannelMesh] [sub_channel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator pin_diameter = 0.1 dwire = 0.03 hwire = 0.3 diff --git a/modules/subchannel/test/tests/mesh/tri_subchannel_duct_mesh/gold/coords_in.e b/modules/subchannel/test/tests/mesh/tri_duct/gold/coords_in.e similarity index 62% rename from modules/subchannel/test/tests/mesh/tri_subchannel_duct_mesh/gold/coords_in.e rename to modules/subchannel/test/tests/mesh/tri_duct/gold/coords_in.e index 8af1584515ba523af231d9e2bcd5486a88154448..5589c5afc04c0e7bc852f5baba382a24d308fa2b 100644 GIT binary patch delta 6123 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 X&}3s@rJqZxmuGK^tu7t)X3JjzsvE6L delta 1558 zcmchUTS!xJ9LLW&PS2dn2F0+KkP_=5B(2b3^pL|qr5h3z;<`96(g|4NTU3arh>G&mr3O>RIWpVi#i+`*{W-cT zRQa%D&Y)Uno9P((-c!OVW-B$Og_SF{)F=$A%GBA$^swqm&2^Y_lON~_tB4 zZ!N4C_SRpwoQunOD^QOQ45&0S+ga%y7OKqb%qow37QcmNW!VQatk{^2Oe-g^EmH+2 z+LbduT^~?CC%cs`-}Rr!QkCAXcHi=vrGbFIR?RE>W_f4LA8D;x^u-Krz)!XjG=d=5 z1lZ`C!4|+q-wN=1CmMYl*e;E}1MHMW-vxF{qwfJt(&&3NEvWC4h=aZ#8~|+eW^fR& z(G>^-Hu@oO7_iZgfTMtoeheH3Z1fYL1+dXuwVvDbNPk=%+zDV56S_5x_=2 z3(f&H`gza+*ytBPCt#yr1YLlQ-p!x+5@75Gmq8C;qhA460UO-{QNTvO2Cf4(`g*`Q z*?8rYH^5DCPI*fjJ;;4;OQeUu9cgs#dsiBr``(jA=f3x)(YfyfX>?B6D~--6A4-D< z6I(u#$X&VRW57n|mNCFa=ax?Z8=YG|1#EQg`wXzrIpuS}M(30-09zaPZ-=~;NRNP5 z(&*IprH^bWZtJ8l6+Vlh)&baLe}+>D=;zG&;A8OB>pid&aGS Mnol;Xv%Wv$7vi}lqW}N^ diff --git a/modules/subchannel/test/tests/mesh/tri_subchannel_duct_mesh/tests b/modules/subchannel/test/tests/mesh/tri_duct/tests similarity index 100% rename from modules/subchannel/test/tests/mesh/tri_subchannel_duct_mesh/tests rename to modules/subchannel/test/tests/mesh/tri_duct/tests diff --git a/modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/coords.i b/modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/coords.i deleted file mode 100644 index afab5b6f4579..000000000000 --- a/modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/coords.i +++ /dev/null @@ -1,27 +0,0 @@ -[GlobalParams] - nrings = 3 - n_cells = 20 - flat_to_flat = 0.056 - heated_length = 0.2 - pitch = 0.012 -[] - -[TriSubChannelMesh] - [subchannel] - type = SCMTriSubChannelMeshGenerator - pin_diameter = 0.01 - dwire = 0.002 - hwire = 0.0833 - spacer_z = '0' - spacer_k = '5.0' - [] - [pins] - type = SCMTriPinMeshGenerator - input = subchannel - - [] - [duct] - type = SCMTriDuctMeshGenerator - input = pins - [] -[] diff --git a/modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/gold/coords_in.e b/modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/gold/coords_in.e deleted file mode 100644 index 12d63173c02bcc0d2a75cb16f05c05eccdd5a61f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73968 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 diff --git a/modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/tests b/modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/tests deleted file mode 100644 index 4ade2c2b7d4b..000000000000 --- a/modules/subchannel/test/tests/mesh/tri_sub_channel_pin_mesh/tests +++ /dev/null @@ -1,13 +0,0 @@ -[Tests] - design = 'SCMTriDuctMeshGenerator.md' - issues = '#29484' - [coords] - type = Exodiff - input = coords.i - exodiff = coords_in.e - cli_args = "--mesh-only" - recover = false - mesh_mode = 'replicated' - requirement = 'The system will create a hexagonal duct mesh and a pin mesh for triangular assemblies' - [] -[] diff --git a/modules/subchannel/test/tests/mesh/tri_subchannel_mesh/gold/tricoords3_in.e b/modules/subchannel/test/tests/mesh/tri_subchannel_mesh/gold/tricoords3_in.e deleted file mode 100644 index 32180e067b31b28dc732960f49c138cbe4695576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9432 zcmeI1TWnNS6oy+aolaY>m75?PXpt%x%T>X`0ZO?GDg~8FhiN-4N9Sf|23jr}U(|>d zcrd{zihw|n2aSmr(2R-~kOU$zXkub~G*JRCDkMDk|9hW3b6f|cK4N>4Z~k-kth4so zYp=ZvdukRg>XoOjB1nHw7zxLMu~0OemzU3P{3$yc4klCK1fTTfi>0H%W;@EK-oVf2 zSiCu$)Zaf1DP&tX5~fidDALct#>kV(h|c?&_kziA%6XUZsP?4YjDG*o-rw>3W2}Hj$qvS3)gr2 zzBC$Yx1-E8<|l}WYE5lKbN2lJ?n~f&=5$P0D3xYPjc?rM^-bBS2s^~Z{0vOB*-dc- zlAIQ_W0Tc4#b_S}iqyPs-WYdYVE@Ei1-N0nxGH|chdlDwlWnRq1I0!Bu-z$WD zqAi}_ycpXO=f01wKNVx|r3=xj-!<>k&L2y9`eRJyqOB93Zy@hs@9vMbH|x*5KODCH zq_;oTg1OxN1<+Usdv|}d?P`COuq{v%(~dixAFeZVA@<&v^@Fbps%<+|3v+n`+u}gh zcFWCd2dJE3jyM&pBi4(VPcx39;37K`SsRL^by3mA)Clg)Z7Dlr{@uRJTy@bGUGut) zAIz=WmzjtE=xZo_6*13QZ+e`jvo88G>1LT=&%r(z-c4uwB^2HE|=f2_o31F zy_xMVwAJ~|#>+gJ%jLKH1vDC4UeYZ)i=1k*~ zn$h;9H_#zYdsaVr@hGo%q&oc#_ULDbXI6TfCG^w%Q?DH?pZL7g4DIIjy8pU5E4^K{ zyL8U}sec}-KYKx{rTxtD=&3)x*txdDXGzuZZCCd2pH=3k>f$SETrO34sR``%=#AoM zfAxL8%3Mzok7{?Tj^~+-R2|Q&s^6-MSyl1X1a^5;$5ZX(A*VWyQz{SjeRF!g&$Y`1 zgNiMw-|z1@_*2tqOX``A`meh*dWR*IaaNq$tKxC%m&(t#mQXdGRdaWElzy)sugyr+ z?|+k#%D9Uge$8A@F)r2aR%bjJsd_w}s^3eabE?PnmWs3DTuyZyXPtPms>Z)+?#mw4 z<5{lqcJ+8pwVzW?esZeE^P8HN;)a|an0ev%3H$b1Qr~ylrE0r39Q&+hbo*-_b>7cN z)%I^X_F1)PH)BhKM^B=C(w@I8sk9&W;cjK`Qq|v#E$ck$yq}S({p?Wo<37x)8mCoP z=25<1)wx~8jAWvo$XZpx>V)MsvG1{9nV%ZuBy(Q zI&oyWsyd!h<)`vkPIWwK)oYiYvKL0PQPB)ynf`%9zEZB^32Jd zaZBoVKYxB@M&n^isMP^`b|0T+xhF9nYbRRB30P^|(G({+FG|seb=$$4^f6xH?t*bp=^9Gh+Rs@2tzF z#d+>&SBdD!PftDQ4BXmzNTwTuO&de_4_L%KoNjY($0FfWw;8Q>pz$=$!@6+-dgi}- z&%bv?^tAM3pj%~tXL~$%=a#)C?57vS$!6Tn0;2}}m} z0G?a&+?eN^)4+5v1Iz^X0-mkT0<*#Wpc>2pbAbisf%#wor~wN>Em#B=gC$@oSO%7Z z72pA|608Cbf``DvU^S=%YrtCY2zV4c2G)Uk@Hkix8bAJGO#tU_0RNllh>RLvN^=dpZBI z24o$`T9EZ1YeLqAtPNQo0mSC6k#an{>qORytQT1`vTkJU$oi2rBFG0QZ(fUyi0mEsh1OL*|V& z$egkMm@n2IbH%!w2Uv5=5$lclVXZMYYrvzR9yEXuXa=p|2@nMdkOZ4R2iOL8%Tq8uoXQ0H(o~JNB{r; diff --git a/modules/subchannel/test/tests/multiapp/sc_core.i b/modules/subchannel/test/tests/multiapp/sc_core.i index e94582292863..64ed36b49316 100644 --- a/modules/subchannel/test/tests/multiapp/sc_core.i +++ b/modules/subchannel/test/tests/multiapp/sc_core.i @@ -27,7 +27,7 @@ duct_inside = '${fparse 11.43*2*scale_factor}' [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = '${fparse n_rings}' n_cells = 10 flat_to_flat = '${fparse duct_inside}' @@ -40,18 +40,10 @@ duct_inside = '${fparse 11.43*2*scale_factor}' spacer_k = '0' [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = '${fparse n_rings}' - n_cells = 10 - heated_length = '${fparse length_heated_fuel}' - pitch = '${fparse fuel_pin_pitch}' - [] [duct] type = SCMTriDuctMeshGenerator - input = fuel_pins + input = subchannel nrings = '${fparse n_rings}' n_cells = 10 flat_to_flat = '${fparse duct_inside}' diff --git a/modules/subchannel/test/tests/positions/pin_positions.i b/modules/subchannel/test/tests/positions/pin_positions.i index 664f6877ddfe..9b1bb071e481 100644 --- a/modules/subchannel/test/tests/positions/pin_positions.i +++ b/modules/subchannel/test/tests/positions/pin_positions.i @@ -32,7 +32,7 @@ duct_inside = '${fparse duct_outside - 2 * duct_thickness}' [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = '${fparse n_rings}' n_cells = ${n_cells} flat_to_flat = '${fparse duct_inside}' @@ -47,20 +47,9 @@ duct_inside = '${fparse duct_outside - 2 * duct_thickness}' spacer_k = '0.5 0.5' [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = '${fparse n_rings}' - n_cells = ${n_cells} - unheated_length_entry = '${fparse length_entry_fuel}' - heated_length = '${fparse length_heated_fuel}' - unheated_length_exit = '${fparse length_outlet_fuel}' - pitch = '${fparse fuel_pin_pitch}' - [] - [duct] type = SCMTriDuctMeshGenerator - input = fuel_pins + input = subchannel nrings = '${fparse n_rings}' n_cells = ${n_cells} flat_to_flat = '${fparse duct_inside}' diff --git a/modules/subchannel/test/tests/postprocessors/trisubchannelpointvalue/test.i b/modules/subchannel/test/tests/postprocessors/trisubchannelpointvalue/test.i index 488bb4c9cd4c..7c5730623470 100644 --- a/modules/subchannel/test/tests/postprocessors/trisubchannelpointvalue/test.i +++ b/modules/subchannel/test/tests/postprocessors/trisubchannelpointvalue/test.i @@ -2,7 +2,7 @@ T_in = 359.15 [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = 3 n_cells = 10 flat_to_flat = 3.41e-2 diff --git a/modules/subchannel/test/tests/problems/Lead-LBE-19pin/3D_LBE-19pin.i b/modules/subchannel/test/tests/problems/Lead-LBE-19pin/3D_LBE-19pin.i index 09148f6c479e..9cc2de2ad268 100644 --- a/modules/subchannel/test/tests/problems/Lead-LBE-19pin/3D_LBE-19pin.i +++ b/modules/subchannel/test/tests/problems/Lead-LBE-19pin/3D_LBE-19pin.i @@ -1,6 +1,6 @@ [Mesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator nrings = 3 n_cells = 50 flat_to_flat = 0.05319936 diff --git a/modules/subchannel/test/tests/problems/Lead-LBE-19pin/test_LBE-19pin.i b/modules/subchannel/test/tests/problems/Lead-LBE-19pin/test_LBE-19pin.i index 4a4d0469685b..67cd4a7c1333 100644 --- a/modules/subchannel/test/tests/problems/Lead-LBE-19pin/test_LBE-19pin.i +++ b/modules/subchannel/test/tests/problems/Lead-LBE-19pin/test_LBE-19pin.i @@ -6,7 +6,7 @@ mass_flux_in = '${fparse 10*rho_in/3600/flow_area}' P_out = 1.0e5 # Pa [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = 3 n_cells = 50 flat_to_flat = 0.05319936 @@ -42,6 +42,7 @@ P_out = 1.0e5 # Pa segregated = false verbose_subchannel = true interpolation_scheme = upwind + pin_HTC_closure = 'Dittus-Boelter' # friction model friction_closure = 'cheng' @@ -51,6 +52,9 @@ P_out = 1.0e5 # Pa [cheng] type = SCMFrictionUpdatedChengTodreas [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -71,6 +75,12 @@ P_out = 1.0e5 # Pa filename = "pin_power_profile19.txt" [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 8.2e-3 + [] + [T_ic] type = ConstantIC variable = T @@ -209,6 +219,7 @@ P_out = 1.0e5 # Pa [Total_power] type = ElementIntegralVariablePostprocessor variable = q_prime + block = fuel_pins [] [] diff --git a/modules/subchannel/test/tests/problems/Lead-LBE-19pin/test_LEAD-19pin.i b/modules/subchannel/test/tests/problems/Lead-LBE-19pin/test_LEAD-19pin.i index a5b730b0c054..f825f6a64264 100644 --- a/modules/subchannel/test/tests/problems/Lead-LBE-19pin/test_LEAD-19pin.i +++ b/modules/subchannel/test/tests/problems/Lead-LBE-19pin/test_LEAD-19pin.i @@ -6,7 +6,7 @@ mass_flux_in = '${fparse 10*rho_in/3600/flow_area}' P_out = 1.0e5 # Pa [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = 3 n_cells = 50 flat_to_flat = 0.05319936 @@ -45,6 +45,7 @@ P_out = 1.0e5 # Pa verbose_multiapps = true verbose_subchannel = true interpolation_scheme = upwind + pin_HTC_closure = 'Dittus-Boelter' # friction model friction_closure = 'cheng' @@ -54,6 +55,9 @@ P_out = 1.0e5 # Pa [cheng] type = SCMFrictionUpdatedChengTodreas [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -74,6 +78,12 @@ P_out = 1.0e5 # Pa filename = "pin_power_profile19.txt" [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 8.2e-3 + [] + [T_ic] type = ConstantIC variable = T @@ -217,6 +227,7 @@ P_out = 1.0e5 # Pa [Total_power] type = ElementIntegralVariablePostprocessor variable = q_prime + block = fuel_pins [] [] diff --git a/modules/subchannel/test/tests/problems/SFR/EBR-II/XX09_SS_SHRT17.i b/modules/subchannel/test/tests/problems/SFR/EBR-II/XX09_SS_SHRT17.i index e651ac54ebc7..9461d5f05705 100644 --- a/modules/subchannel/test/tests/problems/SFR/EBR-II/XX09_SS_SHRT17.i +++ b/modules/subchannel/test/tests/problems/SFR/EBR-II/XX09_SS_SHRT17.i @@ -25,7 +25,7 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = 50 flat_to_flat = ${inner_duct_in} @@ -39,15 +39,6 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' spacer_k = '0.0' [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = 50 - unheated_length_exit = ${unheated_length_exit} - heated_length = ${heated_length} - pitch = ${fuel_pin_pitch} - [] [] [AuxVariables] diff --git a/modules/subchannel/test/tests/problems/SFR/sodium-19pin/test19_explicit.i b/modules/subchannel/test/tests/problems/SFR/sodium-19pin/test19_explicit.i index 5567db11403b..8b575612a305 100644 --- a/modules/subchannel/test/tests/problems/SFR/sodium-19pin/test19_explicit.i +++ b/modules/subchannel/test/tests/problems/SFR/sodium-19pin/test19_explicit.i @@ -12,7 +12,7 @@ P_out = 2.0e5 # Pa [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator pin_diameter = 0.01 dwire = 0.002 hwire = 0.0833 @@ -44,6 +44,7 @@ P_out = 2.0e5 # Pa segregated = true verbose_subchannel = true duct_HTC_closure = 'gnielinski' + pin_HTC_closure = 'Dittus-Boelter' friction_closure = 'cheng' [] @@ -54,6 +55,9 @@ P_out = 2.0e5 # Pa [gnielinski] type = SCMHTCGnielinski [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -74,6 +78,12 @@ P_out = 2.0e5 # Pa filename = "pin_power_profile19.txt" [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 0.01 + [] + [T_ic] type = ConstantIC variable = T @@ -218,7 +228,7 @@ P_out = 2.0e5 # Pa [Total_power] type = ElementIntegralVariablePostprocessor variable = q_prime - block = subchannel + block = fuel_pins [] [mdot-8] type = SubChannelPointValue diff --git a/modules/subchannel/test/tests/problems/SFR/sodium-19pin/test19_implicit.i b/modules/subchannel/test/tests/problems/SFR/sodium-19pin/test19_implicit.i index a72c973a6c36..9c3ab9c9688c 100644 --- a/modules/subchannel/test/tests/problems/SFR/sodium-19pin/test19_implicit.i +++ b/modules/subchannel/test/tests/problems/SFR/sodium-19pin/test19_implicit.i @@ -12,7 +12,7 @@ P_out = 2.0e5 # Pa [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator pin_diameter = 0.01 dwire = 0.002 hwire = 0.0833 @@ -44,6 +44,7 @@ P_out = 2.0e5 # Pa segregated = true verbose_subchannel = true duct_HTC_closure = 'gnielinski' + pin_HTC_closure = 'Dittus-Boelter' friction_closure = 'cheng' [] @@ -54,6 +55,9 @@ P_out = 2.0e5 # Pa [gnielinski] type = SCMHTCGnielinski [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -74,6 +78,12 @@ P_out = 2.0e5 # Pa filename = "pin_power_profile19.txt" [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 0.01 + [] + [T_ic] type = ConstantIC variable = T @@ -231,7 +241,7 @@ P_out = 2.0e5 # Pa [Total_power] type = ElementIntegralVariablePostprocessor variable = q_prime - block = subchannel + block = fuel_pins [] [Total_power_SCMDuctPowerPostprocessor] type = SCMDuctHeatRatePostprocessor diff --git a/modules/subchannel/test/tests/problems/SFR/sodium-19pin/test19_monolithic.i b/modules/subchannel/test/tests/problems/SFR/sodium-19pin/test19_monolithic.i index 0c95198d0902..3c9cf456267b 100644 --- a/modules/subchannel/test/tests/problems/SFR/sodium-19pin/test19_monolithic.i +++ b/modules/subchannel/test/tests/problems/SFR/sodium-19pin/test19_monolithic.i @@ -12,7 +12,7 @@ P_out = 2.0e5 # Pa [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator pin_diameter = 0.01 dwire = 0.002 hwire = 0.0833 @@ -45,6 +45,7 @@ P_out = 2.0e5 # Pa implicit = true segregated = false duct_HTC_closure = 'gnielinski' + pin_HTC_closure = 'Dittus-Boelter' friction_closure = 'cheng' [] @@ -55,6 +56,9 @@ P_out = 2.0e5 # Pa [gnielinski] type = SCMHTCGnielinski [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -75,6 +79,12 @@ P_out = 2.0e5 # Pa filename = "pin_power_profile19.txt" [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 0.01 + [] + [T_ic] type = ConstantIC variable = T @@ -219,7 +229,7 @@ P_out = 2.0e5 # Pa [Total_power] type = ElementIntegralVariablePostprocessor variable = q_prime - block = subchannel + block = fuel_pins [] [mdot-8] type = SubChannelPointValue diff --git a/modules/subchannel/test/tests/problems/heat_transfer_correlations/XX09_SCM_SS17.i b/modules/subchannel/test/tests/problems/heat_transfer_correlations/XX09_SCM_SS17.i index 8316c559494b..f7559d0a777e 100644 --- a/modules/subchannel/test/tests/problems/heat_transfer_correlations/XX09_SCM_SS17.i +++ b/modules/subchannel/test/tests/problems/heat_transfer_correlations/XX09_SCM_SS17.i @@ -26,7 +26,7 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = 20 flat_to_flat = ${inner_duct_in} @@ -38,19 +38,9 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' hwire = ${wire_z_spacing} [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = 20 - unheated_length_exit = ${unheated_length_exit} - heated_length = ${heated_length} - pitch = ${fuel_pin_pitch} - [] - [duct] type = SCMTriDuctMeshGenerator - input = fuel_pins + input = subchannel nrings = ${n_rings} n_cells = 20 flat_to_flat = ${inner_duct_in} diff --git a/modules/subchannel/validation/Blockage/THORS/FFM-3A.i b/modules/subchannel/validation/Blockage/THORS/FFM-3A.i index 27ee0ac7c87c..4a7df77a7826 100644 --- a/modules/subchannel/validation/Blockage/THORS/FFM-3A.i +++ b/modules/subchannel/validation/Blockage/THORS/FFM-3A.i @@ -19,7 +19,7 @@ mass_flux_in = '${fparse rho * vol_flow / Flow_area}' P_out = 2.0e5 # Pa [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = 3 n_cells = 36 flat_to_flat = 0.0338514 @@ -60,6 +60,7 @@ P_out = 2.0e5 # Pa segregated = false verbose_subchannel = true interpolation_scheme = exponential + pin_HTC_closure = 'Dittus-Boelter' # friction model friction_closure = 'cheng' [] @@ -68,6 +69,9 @@ P_out = 2.0e5 # Pa [cheng] type = SCMFrictionUpdatedChengTodreas [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -88,6 +92,12 @@ P_out = 2.0e5 # Pa filename = "pin_power_profile_19.txt" [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 0.005842 + [] + [T_ic] type = ConstantIC variable = T diff --git a/modules/subchannel/validation/Blockage/THORS/FFM-3A_viz.i b/modules/subchannel/validation/Blockage/THORS/FFM-3A_viz.i index 75c3aba50eac..34698066580d 100644 --- a/modules/subchannel/validation/Blockage/THORS/FFM-3A_viz.i +++ b/modules/subchannel/validation/Blockage/THORS/FFM-3A_viz.i @@ -10,7 +10,7 @@ [Mesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator nrings = 3 n_cells = 36 flat_to_flat = 3.41e-2 @@ -44,6 +44,7 @@ [w_perim] [] [q_prime] + block = fuel_pins [] [] diff --git a/modules/subchannel/validation/Blockage/THORS/FFM-3Adetailed.i b/modules/subchannel/validation/Blockage/THORS/FFM-3Adetailed.i index bb313920834a..c85aa52e4297 100644 --- a/modules/subchannel/validation/Blockage/THORS/FFM-3Adetailed.i +++ b/modules/subchannel/validation/Blockage/THORS/FFM-3Adetailed.i @@ -1,6 +1,6 @@ [Mesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator nrings = 3 n_cells = 36 flat_to_flat = 3.41e-2 @@ -34,6 +34,7 @@ [w_perim] [] [q_prime] + block = fuel_pins [] [] diff --git a/modules/subchannel/validation/Blockage/THORS/FFM-5B_high.i b/modules/subchannel/validation/Blockage/THORS/FFM-5B_high.i index fb3bc78dcdcc..f1026575ef1b 100644 --- a/modules/subchannel/validation/Blockage/THORS/FFM-5B_high.i +++ b/modules/subchannel/validation/Blockage/THORS/FFM-5B_high.i @@ -19,7 +19,7 @@ mass_flux_in = '${fparse rho * inlet_vel}' P_out = 2.0e5 # Pa [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = 3 n_cells = 50 flat_to_flat = 0.0324290 @@ -58,6 +58,7 @@ P_out = 2.0e5 # Pa segregated = false verbose_subchannel = true interpolation_scheme = exponential + pin_HTC_closure = 'Dittus-Boelter' # friction model friction_closure = 'cheng' [] @@ -66,6 +67,9 @@ P_out = 2.0e5 # Pa [cheng] type = SCMFrictionUpdatedChengTodreas [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -86,6 +90,12 @@ P_out = 2.0e5 # Pa filename = "pin_power_profile_19.txt" [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 0.005842 + [] + [T_ic] type = ConstantIC variable = T @@ -234,9 +244,16 @@ P_out = 2.0e5 # Pa [] [Transfers] - [xfer] + [xfer_subchannel] type = SCMSolutionTransfer to_multi_app = viz - variable = 'mdot SumWij P DP h T rho mu q_prime S displacement w_perim' + transfer_type = subchannel + variable = 'mdot SumWij P DP h T rho mu S displacement w_perim' + [] + [xfer_q_prime] + type = SCMSolutionTransfer + to_multi_app = viz + transfer_type = pin + variable = q_prime [] [] diff --git a/modules/subchannel/validation/Blockage/THORS/FFM-5B_low.i b/modules/subchannel/validation/Blockage/THORS/FFM-5B_low.i index bda76634a8ab..872a270a4909 100644 --- a/modules/subchannel/validation/Blockage/THORS/FFM-5B_low.i +++ b/modules/subchannel/validation/Blockage/THORS/FFM-5B_low.i @@ -19,7 +19,7 @@ mass_flux_in = '${fparse rho * inlet_vel}' P_out = 2.0e5 # Pa [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = 3 n_cells = 50 flat_to_flat = 0.0324290 @@ -58,6 +58,7 @@ P_out = 2.0e5 # Pa segregated = false verbose_subchannel = true interpolation_scheme = exponential + pin_HTC_closure = 'Dittus-Boelter' # friction model friction_closure = 'cheng' [] @@ -66,6 +67,9 @@ P_out = 2.0e5 # Pa [cheng] type = SCMFrictionUpdatedChengTodreas [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -97,6 +101,12 @@ P_out = 2.0e5 # Pa value = 0.0 [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 0.005842 + [] + [Viscosity_ic] type = ViscosityIC variable = mu @@ -234,9 +244,16 @@ P_out = 2.0e5 # Pa [] [Transfers] - [xfer] + [xfer_subchannel] type = SCMSolutionTransfer to_multi_app = viz - variable = 'mdot SumWij P DP h T rho mu q_prime S displacement w_perim' + transfer_type = subchannel + variable = 'mdot SumWij P DP h T rho mu S displacement w_perim' + [] + [xfer_q_prime] + type = SCMSolutionTransfer + to_multi_app = viz + transfer_type = pin + variable = q_prime [] [] diff --git a/modules/subchannel/validation/Blockage/THORS/FFM-5B_viz.i b/modules/subchannel/validation/Blockage/THORS/FFM-5B_viz.i index ffc19c1ab6d8..98a2ec447fc3 100644 --- a/modules/subchannel/validation/Blockage/THORS/FFM-5B_viz.i +++ b/modules/subchannel/validation/Blockage/THORS/FFM-5B_viz.i @@ -10,7 +10,7 @@ [Mesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator nrings = 3 n_cells = 50 flat_to_flat = 3.41e-2 @@ -54,7 +54,7 @@ block = subchannel [] [q_prime] - block = subchannel + block = fuel_pins [] [displacement] block = subchannel diff --git a/modules/subchannel/validation/Blockage/THORS/FFM-5Bdetailed.i b/modules/subchannel/validation/Blockage/THORS/FFM-5Bdetailed.i index 01dfd57b9459..8806db437b1f 100644 --- a/modules/subchannel/validation/Blockage/THORS/FFM-5Bdetailed.i +++ b/modules/subchannel/validation/Blockage/THORS/FFM-5Bdetailed.i @@ -1,6 +1,6 @@ [Mesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator nrings = 3 n_cells = 50 flat_to_flat = 3.41e-2 @@ -34,6 +34,7 @@ [w_perim] [] [q_prime] + block = fuel_pins [] [] diff --git a/modules/subchannel/validation/EBR-II/3d_SCM_SS.i b/modules/subchannel/validation/EBR-II/3d_SCM_SS.i index 8d13af30b6b0..da1def48a6f3 100644 --- a/modules/subchannel/validation/EBR-II/3d_SCM_SS.i +++ b/modules/subchannel/validation/EBR-II/3d_SCM_SS.i @@ -15,7 +15,7 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' [TriSubChannelMesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator nrings = '${n_rings}' n_cells = 50 flat_to_flat = '${inner_duct_in}' @@ -25,16 +25,6 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' pitch = '${fuel_pin_pitch}' [] - [fuel_pins] - type = SCMDetailedTriPinMeshGenerator - input = subchannel - nrings = '${n_rings}' - n_cells = 50 - unheated_length_exit = '${unheated_length_exit}' - heated_length = '${heated_length}' - pin_diameter = '${fuel_pin_diameter}' - pitch = '${fuel_pin_pitch}' - [] [] [AuxVariables] diff --git a/modules/subchannel/validation/EBR-II/3d_SCM_TR.i b/modules/subchannel/validation/EBR-II/3d_SCM_TR.i index 23e2fdbccbd8..953144c287ae 100644 --- a/modules/subchannel/validation/EBR-II/3d_SCM_TR.i +++ b/modules/subchannel/validation/EBR-II/3d_SCM_TR.i @@ -16,7 +16,7 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' [TriSubChannelMesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator nrings = '${n_rings}' n_cells = 50 flat_to_flat = '${inner_duct_in}' @@ -26,16 +26,6 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' pitch = '${fuel_pin_pitch}' [] - [fuel_pins] - type = SCMDetailedTriPinMeshGenerator - input = subchannel - nrings = '${n_rings}' - n_cells = 50 - unheated_length_exit = '${unheated_length_exit}' - heated_length = '${heated_length}' - pin_diameter = '${fuel_pin_diameter}' - pitch = '${fuel_pin_pitch}' - [] [] [AuxVariables] diff --git a/modules/subchannel/validation/EBR-II/XX09_SCM_SS17.i b/modules/subchannel/validation/EBR-II/XX09_SCM_SS17.i index 4c33dc07ba26..195159399149 100644 --- a/modules/subchannel/validation/EBR-II/XX09_SCM_SS17.i +++ b/modules/subchannel/validation/EBR-II/XX09_SCM_SS17.i @@ -26,7 +26,7 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = 50 flat_to_flat = ${inner_duct_in} @@ -38,19 +38,10 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' hwire = ${wire_z_spacing} [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = 50 - unheated_length_exit = ${unheated_length_exit} - heated_length = ${heated_length} - pitch = ${fuel_pin_pitch} - [] [duct] type = SCMTriDuctMeshGenerator - input = fuel_pins + input = subchannel nrings = ${n_rings} n_cells = 50 flat_to_flat = ${inner_duct_in} diff --git a/modules/subchannel/validation/EBR-II/XX09_SCM_SS17_corrected.i b/modules/subchannel/validation/EBR-II/XX09_SCM_SS17_corrected.i index c29728f49b9b..ed8c27e697ac 100644 --- a/modules/subchannel/validation/EBR-II/XX09_SCM_SS17_corrected.i +++ b/modules/subchannel/validation/EBR-II/XX09_SCM_SS17_corrected.i @@ -26,7 +26,7 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = 50 flat_to_flat = ${inner_duct_in} @@ -38,19 +38,10 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' hwire = ${wire_z_spacing} [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = 50 - unheated_length_exit = ${unheated_length_exit} - heated_length = ${heated_length} - pitch = ${fuel_pin_pitch} - [] [duct] type = SCMTriDuctMeshGenerator - input = fuel_pins + input = subchannel nrings = ${n_rings} n_cells = 50 flat_to_flat = ${inner_duct_in} diff --git a/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R.i b/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R.i index f59bbb83ffbb..502d57096326 100644 --- a/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R.i +++ b/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R.i @@ -26,7 +26,7 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = 50 flat_to_flat = ${inner_duct_in} @@ -38,19 +38,10 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' hwire = ${wire_z_spacing} [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = 50 - unheated_length_exit = ${unheated_length_exit} - heated_length = ${heated_length} - pitch = ${fuel_pin_pitch} - [] [duct] type = SCMTriDuctMeshGenerator - input = fuel_pins + input = subchannel nrings = ${n_rings} n_cells = 50 flat_to_flat = ${inner_duct_in} diff --git a/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R_corrected.i b/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R_corrected.i index 0beef95279ac..bc439e15dada 100644 --- a/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R_corrected.i +++ b/modules/subchannel/validation/EBR-II/XX09_SCM_SS45R_corrected.i @@ -26,7 +26,7 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = 50 flat_to_flat = ${inner_duct_in} @@ -38,19 +38,10 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' hwire = ${wire_z_spacing} [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = 50 - unheated_length_exit = ${unheated_length_exit} - heated_length = ${heated_length} - pitch = ${fuel_pin_pitch} - [] [duct] type = SCMTriDuctMeshGenerator - input = fuel_pins + input = subchannel nrings = ${n_rings} n_cells = 50 flat_to_flat = ${inner_duct_in} diff --git a/modules/subchannel/validation/EBR-II/XX09_SCM_TR17.i b/modules/subchannel/validation/EBR-II/XX09_SCM_TR17.i index deaf9d090227..48f46fae4e07 100644 --- a/modules/subchannel/validation/EBR-II/XX09_SCM_TR17.i +++ b/modules/subchannel/validation/EBR-II/XX09_SCM_TR17.i @@ -25,7 +25,7 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = 50 flat_to_flat = ${inner_duct_in} @@ -39,15 +39,6 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' spacer_k = '0.0' [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = 50 - unheated_length_exit = ${unheated_length_exit} - heated_length = ${heated_length} - pitch = ${fuel_pin_pitch} - [] [] [AuxVariables] diff --git a/modules/subchannel/validation/EBR-II/XX09_SCM_TR45R.i b/modules/subchannel/validation/EBR-II/XX09_SCM_TR45R.i index ff37c95b4e6f..3bfe16608529 100644 --- a/modules/subchannel/validation/EBR-II/XX09_SCM_TR45R.i +++ b/modules/subchannel/validation/EBR-II/XX09_SCM_TR45R.i @@ -25,7 +25,7 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = 50 flat_to_flat = ${inner_duct_in} @@ -39,15 +39,6 @@ unheated_length_exit = '${fparse 26.9*scale_factor}' spacer_k = '0.0' [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = 50 - unheated_length_exit = ${unheated_length_exit} - heated_length = ${heated_length} - pitch = ${fuel_pin_pitch} - [] [] [AuxVariables] diff --git a/modules/subchannel/validation/ORNL_19_pin/3d_ORNL_19.i b/modules/subchannel/validation/ORNL_19_pin/3d_ORNL_19.i index 4cc881991b69..52c379cf5395 100644 --- a/modules/subchannel/validation/ORNL_19_pin/3d_ORNL_19.i +++ b/modules/subchannel/validation/ORNL_19_pin/3d_ORNL_19.i @@ -1,6 +1,6 @@ [Mesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator nrings = 3 n_cells = 40 flat_to_flat = 3.41e-2 @@ -34,6 +34,7 @@ [w_perim] [] [q_prime] + block = fuel_pins [] [] diff --git a/modules/subchannel/validation/ORNL_19_pin/test_ORNL_19.i b/modules/subchannel/validation/ORNL_19_pin/test_ORNL_19.i index 5129c1dd87c1..8a6d3b118224 100644 --- a/modules/subchannel/validation/ORNL_19_pin/test_ORNL_19.i +++ b/modules/subchannel/validation/ORNL_19_pin/test_ORNL_19.i @@ -12,7 +12,7 @@ mass_flux_in = '${fparse rho * vol_flow / flow_area}' P_out = 2.0e5 # Pa [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = 3 n_cells = 40 flat_to_flat = 3.41e-2 @@ -52,6 +52,7 @@ P_out = 2.0e5 # Pa verbose_multiapps = true verbose_subchannel = true interpolation_scheme = upwind + pin_HTC_closure = 'Dittus-Boelter' # friction model friction_closure = 'cheng' [] @@ -60,6 +61,9 @@ P_out = 2.0e5 # Pa [cheng] type = SCMFrictionUpdatedChengTodreas [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -80,6 +84,12 @@ P_out = 2.0e5 # Pa filename = "pin_power_profile19.txt" [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 5.84e-3 + [] + [T_ic] type = ConstantIC variable = T @@ -228,6 +238,7 @@ P_out = 2.0e5 # Pa [Total_power] type = ElementIntegralVariablePostprocessor variable = q_prime + block = fuel_pins [] [] @@ -244,9 +255,15 @@ P_out = 2.0e5 # Pa [] [Transfers] - [xfer] + [subchannel_transfer] type = SCMSolutionTransfer to_multi_app = viz - variable = 'mdot SumWij P DP h T rho mu q_prime S' + variable = 'mdot SumWij P DP h T rho mu S' + [] + [pin_transfer] + type = SCMSolutionTransfer + transfer_type = pin + to_multi_app = viz + variable = q_prime [] [] diff --git a/modules/subchannel/validation/PNNL_12_pin/steady_state/2X6_ss.i b/modules/subchannel/validation/PNNL_12_pin/steady_state/2X6_ss.i index 416d4e475da1..573d77f033b9 100644 --- a/modules/subchannel/validation/PNNL_12_pin/steady_state/2X6_ss.i +++ b/modules/subchannel/validation/PNNL_12_pin/steady_state/2X6_ss.i @@ -318,17 +318,17 @@ P_out = 101325 # Pa [] [] -###### Transfers to the detailedMesh at the end of the coupled simulations -[Transfers] - [subchannel_transfer] - type = SCMSolutionTransfer - to_multi_app = viz - variable = 'mdot SumWij P DP h T rho mu S' - [] - [pin_transfer] - type = SCMSolutionTransfer - transfer_type = pin - to_multi_app = viz - variable = 'Tpin q_prime' - [] -[] +# ###### Transfers to the detailedMesh at the end of the coupled simulations +# [Transfers] +# [subchannel_transfer] +# type = SCMSolutionTransfer +# to_multi_app = viz +# variable = 'mdot SumWij P DP h T rho mu S' +# [] +# [pin_transfer] +# type = SCMSolutionTransfer +# transfer_type = pin +# to_multi_app = viz +# variable = 'Tpin q_prime' +# [] +# [] diff --git a/modules/subchannel/validation/Toshiba_37_pin/toshiba_37_pin.i b/modules/subchannel/validation/Toshiba_37_pin/toshiba_37_pin.i index 68b9bdbde40f..4d6d3bd5fdb8 100644 --- a/modules/subchannel/validation/Toshiba_37_pin/toshiba_37_pin.i +++ b/modules/subchannel/validation/Toshiba_37_pin/toshiba_37_pin.i @@ -4,7 +4,7 @@ mass_flux_in = '${fparse 1e+6 * 37.00 / 36000.*0.5}' P_out = 2.0e5 # Pa [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = 4 n_cells = 20 flat_to_flat = 0.085 @@ -24,6 +24,48 @@ P_out = 2.0e5 # Pa [] [] +[AuxVariables] + [mdot] + block = subchannel + [] + [SumWij] + block = subchannel + [] + [P] + block = subchannel + [] + [DP] + block = subchannel + [] + [h] + block = subchannel + [] + [T] + block = subchannel + [] + [Tpin] + block = fuel_pins + [] + [Dpin] + block = fuel_pins + [] + [rho] + block = subchannel + [] + [mu] + block = subchannel + [] + [S] + block = subchannel + [] + [w_perim] + block = subchannel + [] + [q_prime] + block = fuel_pins + [] +[] + [SubChannel] type = TriSubChannel1PhaseProblem fp = sodium @@ -40,6 +82,7 @@ P_out = 2.0e5 # Pa staggered_pressure = false verbose_multiapps = true verbose_subchannel = false + pin_HTC_closure = 'Dittus-Boelter' # friction model friction_closure = 'cheng' [] @@ -48,6 +91,9 @@ P_out = 2.0e5 # Pa [cheng] type = SCMFrictionUpdatedChengTodreas [] + [Dittus-Boelter] + type = SCMHTCDittusBoelter + [] [] [ICs] @@ -68,6 +114,12 @@ P_out = 2.0e5 # Pa filename = "pin_power_profile_37.txt" [] + [Dpin_ic] + type = ConstantIC + variable = Dpin + value = 0.01 + [] + [T_ic] type = ConstantIC variable = T @@ -169,10 +221,17 @@ P_out = 2.0e5 # Pa [] [] +###### Transfers to the detailedMesh at the end of the coupled simulations [Transfers] - [xfer] + [subchannel_transfer] + type = SCMSolutionTransfer + to_multi_app = viz + variable = 'mdot SumWij P DP h T rho mu S' + [] + [pin_transfer] type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz - variable = 'mdot SumWij P DP h T rho mu q_prime S' + variable = 'Tpin q_prime' [] [] diff --git a/modules/subchannel/validation/Toshiba_37_pin/toshiba_37_pin_viz.i b/modules/subchannel/validation/Toshiba_37_pin/toshiba_37_pin_viz.i index e1485fbf398e..29f50d7dcec0 100644 --- a/modules/subchannel/validation/Toshiba_37_pin/toshiba_37_pin_viz.i +++ b/modules/subchannel/validation/Toshiba_37_pin/toshiba_37_pin_viz.i @@ -1,48 +1,52 @@ [Mesh] - [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator - nrings = 4 - n_cells = 20 - flat_to_flat = 0.085 - heated_length = 1.0 - pin_diameter = 0.01 - pitch = 0.012 - [] + [subchannel] + type = SCMDetailedTriAssemblyMeshGenerator + nrings = 4 + n_cells = 20 + flat_to_flat = 0.085 + heated_length = 1.0 + pin_diameter = 0.01 + pitch = 0.012 [] +[] - [AuxVariables] - [mdot] - [] - [SumWij] - [] - [P] - [] - [DP] - [] - [h] - [] - [T] - [] - [rho] - [] - [mu] - [] - [S] - [] - [w_perim] - [] - [q_prime] - [] +[AuxVariables] + [mdot] [] - - [Problem] - type = NoSolveProblem + [SumWij] [] - - [Outputs] - exodus = true + [P] + [] + [DP] + [] + [h] + [] + [T] + [] + [Tpin] + [] + [Dpin] + [] + [rho] [] + [mu] + [] + [S] + [] + [w_perim] + [] + [q_prime] + [] +[] - [Executioner] +[Problem] + type = NoSolveProblem +[] + +[Outputs] + exodus = true +[] + +[Executioner] type = Steady - [] +[] diff --git a/modules/subchannel/validation/areva_FCTF/3D.i b/modules/subchannel/validation/areva_FCTF/3D.i index 652754c7cbce..9cdfe651f5aa 100644 --- a/modules/subchannel/validation/areva_FCTF/3D.i +++ b/modules/subchannel/validation/areva_FCTF/3D.i @@ -12,7 +12,7 @@ unheated_length_exit = 0.855 #m [TriSubChannelMesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator nrings = '${n_rings}' n_cells = 65 flat_to_flat = '${inner_duct_in}' @@ -23,17 +23,6 @@ unheated_length_exit = 0.855 #m pitch = '${fuel_pin_pitch}' [] - [fuel_pins] - type = SCMDetailedTriPinMeshGenerator - input = subchannel - nrings = '${n_rings}' - n_cells = 65 - unheated_length_entry = ${unheated_length_entry} - heated_length = ${heated_length} - unheated_length_exit = ${unheated_length_exit} - pin_diameter = '${fuel_pin_diameter}' - pitch = '${fuel_pin_pitch}' - [] [] [AuxVariables] diff --git a/modules/subchannel/validation/areva_FCTF/FCTF_deformed.i b/modules/subchannel/validation/areva_FCTF/FCTF_deformed.i index 8e5299eba107..361854ad8d82 100644 --- a/modules/subchannel/validation/areva_FCTF/FCTF_deformed.i +++ b/modules/subchannel/validation/areva_FCTF/FCTF_deformed.i @@ -38,7 +38,7 @@ unheated_length_exit = 0.855 #m [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = 65 flat_to_flat = ${inner_duct_in} @@ -53,16 +53,6 @@ unheated_length_exit = 0.855 #m spacer_k = '0.0' [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = 65 - unheated_length_entry = ${unheated_length_entry} - heated_length = ${heated_length} - unheated_length_exit = ${unheated_length_exit} - pitch = ${fuel_pin_pitch} - [] [] [Functions] diff --git a/modules/subchannel/validation/areva_FCTF/FCTF_non_deformed.i b/modules/subchannel/validation/areva_FCTF/FCTF_non_deformed.i index 075548910e66..9c0d9c84288c 100644 --- a/modules/subchannel/validation/areva_FCTF/FCTF_non_deformed.i +++ b/modules/subchannel/validation/areva_FCTF/FCTF_non_deformed.i @@ -38,7 +38,7 @@ unheated_length_exit = 0.855 #m [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = 65 flat_to_flat = ${inner_duct_in} @@ -53,16 +53,6 @@ unheated_length_exit = 0.855 #m spacer_k = '0.0' [] - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = 65 - unheated_length_entry = ${unheated_length_entry} - heated_length = ${heated_length} - unheated_length_exit = ${unheated_length_exit} - pitch = ${fuel_pin_pitch} - [] [] [Functions] From 5da693099acceef6e64beb2f48dac9e9faeb0e01 Mon Sep 17 00:00:00 2001 From: Vasileios Kyriakopoulos Date: Wed, 29 Apr 2026 11:55:37 -0600 Subject: [PATCH 4/6] Refactor and regold ICs tests Refs #32847 --- .../test/tests/subchannel_thm_coupling/3D.i | 12 +--- .../subchannel_thm_coupling/subchannel.i | 17 ++--- .../SCMQuadAssemblyMeshGenerator.md | 21 ++++++ .../SCMPinPowerPostprocessor.md | 4 +- .../examples/MultiApp/fuel_assembly.i | 2 - .../include/mesh/TriSubChannelMesh.h | 4 +- .../subchannel/src/mesh/TriSubChannelMesh.C | 60 +++++++----------- .../SCMDetailedTriAssemblyMeshGenerator.C | 37 ++++------- .../SCMTriAssemblyMeshGenerator.C | 21 +++--- .../ics/FCTFdisplacementIC/gold/test_out.csv | 3 + .../ics/FCTFdisplacementIC/gold/test_out.e | Bin 633672 -> 0 bytes .../test/tests/ics/FCTFdisplacementIC/test.i | 50 ++++++++++++++- .../test/tests/ics/FCTFdisplacementIC/tests | 10 ++- .../test/tests/ics/marvel/gold/test_out.csv | 3 + .../test/tests/ics/marvel/gold/test_out.e | Bin 378688 -> 0 bytes .../subchannel/test/tests/ics/marvel/test.i | 51 ++++++++++++++- .../subchannel/test/tests/ics/marvel/tests | 10 ++- .../tests/ics/mass_flow/gold/test_out.csv | 3 + .../test/tests/ics/mass_flow/gold/test_out.e | Bin 49560 -> 0 bytes .../test/tests/ics/mass_flow/test.i | 27 +++++++- .../subchannel/test/tests/ics/mass_flow/tests | 10 ++- .../ics/quad_flow_area/gold/test_out.csv | 3 + .../tests/ics/quad_flow_area/gold/test_out.e | Bin 43880 -> 0 bytes .../test/tests/ics/quad_flow_area/test.i | 27 +++++++- .../test/tests/ics/quad_flow_area/tests | 10 ++- .../quad_wetted_perimeter/gold/test_out.csv | 3 + .../ics/quad_wetted_perimeter/gold/test_out.e | Bin 43880 -> 0 bytes .../tests/ics/quad_wetted_perimeter/test.i | 27 +++++++- .../tests/ics/quad_wetted_perimeter/tests | 10 ++- .../tests/ics/tri_flow_area/gold/test_out.csv | 3 + .../tests/ics/tri_flow_area/gold/test_out.e | Bin 46500 -> 0 bytes .../test/tests/ics/tri_flow_area/test.i | 29 ++++++++- .../test/tests/ics/tri_flow_area/tests | 10 ++- .../tri_wetted_perimeter/gold/test_out.csv | 3 + .../ics/tri_wetted_perimeter/gold/test_out.e | Bin 46500 -> 0 bytes .../tests/ics/tri_wetted_perimeter/test.i | 29 ++++++++- .../test/tests/ics/tri_wetted_perimeter/tests | 10 ++- .../tests/problems/psbt/psbt_monolithic.i | 22 ------- 38 files changed, 374 insertions(+), 157 deletions(-) create mode 100644 modules/subchannel/doc/content/source/meshgenerators/SCMQuadAssemblyMeshGenerator.md create mode 100644 modules/subchannel/test/tests/ics/FCTFdisplacementIC/gold/test_out.csv delete mode 100644 modules/subchannel/test/tests/ics/FCTFdisplacementIC/gold/test_out.e create mode 100644 modules/subchannel/test/tests/ics/marvel/gold/test_out.csv delete mode 100644 modules/subchannel/test/tests/ics/marvel/gold/test_out.e create mode 100644 modules/subchannel/test/tests/ics/mass_flow/gold/test_out.csv delete mode 100644 modules/subchannel/test/tests/ics/mass_flow/gold/test_out.e create mode 100644 modules/subchannel/test/tests/ics/quad_flow_area/gold/test_out.csv delete mode 100644 modules/subchannel/test/tests/ics/quad_flow_area/gold/test_out.e create mode 100644 modules/subchannel/test/tests/ics/quad_wetted_perimeter/gold/test_out.csv delete mode 100644 modules/subchannel/test/tests/ics/quad_wetted_perimeter/gold/test_out.e create mode 100644 modules/subchannel/test/tests/ics/tri_flow_area/gold/test_out.csv delete mode 100644 modules/subchannel/test/tests/ics/tri_flow_area/gold/test_out.e create mode 100644 modules/subchannel/test/tests/ics/tri_wetted_perimeter/gold/test_out.csv delete mode 100644 modules/subchannel/test/tests/ics/tri_wetted_perimeter/gold/test_out.e diff --git a/modules/combined/test/tests/subchannel_thm_coupling/3D.i b/modules/combined/test/tests/subchannel_thm_coupling/3D.i index 3c914286dd67..338b2fbf99a2 100644 --- a/modules/combined/test/tests/subchannel_thm_coupling/3D.i +++ b/modules/combined/test/tests/subchannel_thm_coupling/3D.i @@ -10,7 +10,7 @@ heated_length = 1.0 ################################################### [TriSubChannelMesh] [subchannel] - type = SCMDetailedTriSubChannelMeshGenerator + type = SCMDetailedTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = ${n_cells} flat_to_flat = ${inner_duct_in} @@ -18,16 +18,6 @@ heated_length = 1.0 pin_diameter = ${fuel_pin_diameter} pitch = ${fuel_pin_pitch} [] - - [fuel_pins] - type = SCMDetailedTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = ${n_cells} - pin_diameter = ${fuel_pin_diameter} - heated_length = ${heated_length} - pitch = ${fuel_pin_pitch} - [] [] [AuxVariables] diff --git a/modules/combined/test/tests/subchannel_thm_coupling/subchannel.i b/modules/combined/test/tests/subchannel_thm_coupling/subchannel.i index 80f5a751d6cd..aa29c60eb024 100644 --- a/modules/combined/test/tests/subchannel_thm_coupling/subchannel.i +++ b/modules/combined/test/tests/subchannel_thm_coupling/subchannel.i @@ -17,7 +17,7 @@ heated_length = 1.0 ################################################### [TriSubChannelMesh] [subchannel] - type = SCMTriSubChannelMeshGenerator + type = SCMTriAssemblyMeshGenerator nrings = ${n_rings} n_cells = ${n_cells} flat_to_flat = ${inner_duct_in} @@ -29,15 +29,6 @@ heated_length = 1.0 spacer_z = '0.0' spacer_k = '0.0' [] - - [fuel_pins] - type = SCMTriPinMeshGenerator - input = subchannel - nrings = ${n_rings} - n_cells = ${n_cells} - heated_length = ${heated_length} - pitch = ${fuel_pin_pitch} - [] [] [AuxVariables] @@ -273,12 +264,14 @@ heated_length = 1.0 [Transfers] [subchannel_transfer] type = SCMSolutionTransfer + transfer_type = subchannel to_multi_app = viz variable = 'mdot SumWij P DP h T rho mu S' [] [pin_transfer] - type = SCMPinSolutionTransfer + type = SCMSolutionTransfer + transfer_type = pin to_multi_app = viz - variable = 'Dpin Tpin q_prime' + variable = 'Tpin q_prime Dpin' [] [] diff --git a/modules/subchannel/doc/content/source/meshgenerators/SCMQuadAssemblyMeshGenerator.md b/modules/subchannel/doc/content/source/meshgenerators/SCMQuadAssemblyMeshGenerator.md new file mode 100644 index 000000000000..fde1981f95db --- /dev/null +++ b/modules/subchannel/doc/content/source/meshgenerators/SCMQuadAssemblyMeshGenerator.md @@ -0,0 +1,21 @@ +# SCMQuadAssemblyMeshGenerator + +!syntax description /Mesh/SCMQuadAssemblyMeshGenerator + +## Overview + +!! Intentional comment to provide extra spacing + +This mesh generator creates the 1D subchannel and pin meshes for a square lattice arrangement. +The generated subdomains are named `subchannel` and `fuel_pins`. +The center of the mesh is the origin. + +## Example Input File Syntax + +!listing /test/tests/problems/psbt/psbt_explicit.i block=QuadSubChannelMesh language=moose + +!syntax parameters /Mesh/SCMQuadAssemblyMeshGenerator + +!syntax inputs /Mesh/SCMQuadAssemblyMeshGenerator + +!syntax children /Mesh/SCMQuadAssemblyMeshGenerator diff --git a/modules/subchannel/doc/content/source/postprocessors/SCMPinPowerPostprocessor.md b/modules/subchannel/doc/content/source/postprocessors/SCMPinPowerPostprocessor.md index f8e6b4134926..6f9ba03788df 100644 --- a/modules/subchannel/doc/content/source/postprocessors/SCMPinPowerPostprocessor.md +++ b/modules/subchannel/doc/content/source/postprocessors/SCMPinPowerPostprocessor.md @@ -10,8 +10,8 @@ The user needs to specify a subchannel problem. Either a [QuadSubChannel1PhasePr ## Example Input File Syntax -!listing /test/tests/SCMQuadPower/test.i block=Postprocessors language=moose -!listing /test/tests/SCMTriPower/test.i block=Postprocessors language=moose +!listing /test/tests/SCMQuadPower/test_with_pins.i block=Postprocessors language=moose +!listing /test/tests/SCMTriPower/test_with_pins.i block=Postprocessors language=moose !syntax parameters /Postprocessors/SCMPinPowerPostprocessor diff --git a/modules/subchannel/examples/MultiApp/fuel_assembly.i b/modules/subchannel/examples/MultiApp/fuel_assembly.i index 7d62848ffed2..b69ea41c8f84 100644 --- a/modules/subchannel/examples/MultiApp/fuel_assembly.i +++ b/modules/subchannel/examples/MultiApp/fuel_assembly.i @@ -12,9 +12,7 @@ mass_flux_in = '${fparse 2786}' # kg/(m2.s) ################################################### # Geometric parameters ################################################### - n_cells = 50 - # units are cm - do not forget to convert to meter scale_factor = 0.01 fuel_element_pitch = '${fparse 14.598*scale_factor}' diff --git a/modules/subchannel/include/mesh/TriSubChannelMesh.h b/modules/subchannel/include/mesh/TriSubChannelMesh.h index 14be2cf50e1e..b66acf9a1ce5 100644 --- a/modules/subchannel/include/mesh/TriSubChannelMesh.h +++ b/modules/subchannel/include/mesh/TriSubChannelMesh.h @@ -41,7 +41,7 @@ class TriSubChannelMesh : public SubChannelMesh const Real & getDuctToPinGap() const { return _duct_to_pin_gap; } /** - * Return the number of rings + * Return the number of fuel-pin rings, counting the center pin as the first ring */ const unsigned int & getNumOfRings() const { return _n_rings; } @@ -131,7 +131,7 @@ class TriSubChannelMesh : public SubChannelMesh unsigned int pinIndex(const Point & p) const override; protected: - /// number of rings of fuel pins + /// number of fuel-pin rings, counting the center pin as the first ring unsigned int _n_rings; /// number of subchannels unsigned int _n_channels; diff --git a/modules/subchannel/src/mesh/TriSubChannelMesh.C b/modules/subchannel/src/mesh/TriSubChannelMesh.C index cff114f60cb1..15ab8fa3bd9b 100644 --- a/modules/subchannel/src/mesh/TriSubChannelMesh.C +++ b/modules/subchannel/src/mesh/TriSubChannelMesh.C @@ -82,17 +82,15 @@ TriSubChannelMesh::channelIndex(const Point & p) const // subchannel Real distance_outer_ring = _flat_to_flat / 2 - _duct_to_pin_gap - _pin_diameter / 2; Real channel_distance = std::sqrt(std::pow(p(0), 2) + std::pow(p(1), 2)); - Real angle = std::abs(std::atan(p(1) / p(0))); + Real angle = std::abs(std::atan2(p(1), p(0))); Real projection_angle = angle - libMesh::pi / 6 - std::trunc(angle / (libMesh::pi / 3)) * (libMesh::pi / 3); channel_distance = channel_distance * std::cos(projection_angle); // Projecting point on top edge to determine if the point is a corner or edge subchannel by x // coordinate - Real loc_angle = std::atan(p(1) / p(0)); - if (p(0) <= 0) - loc_angle += libMesh::pi; - else if (p(0) >= 0 && p(1) <= 0) + Real loc_angle = std::atan2(p(1), p(0)); + if (loc_angle < 0.0) loc_angle += 2 * libMesh::pi; Real rem_ang = std::trunc(loc_angle / (libMesh::pi / 3)) * (libMesh::pi / 3) - libMesh::pi / 3; Real x_coord_new = (std::cos(-rem_ang) * p(0) - std::sin(-rem_ang) * p(1)); @@ -101,46 +99,36 @@ TriSubChannelMesh::channelIndex(const Point & p) const // looping over all channels for (unsigned int i = 0; i < _n_channels; i++) { + // Distance from the point to subchannel + distance1 = std::sqrt(std::pow((p(0) - _subchannel_position[i][0]), 2.0) + + std::pow((p(1) - _subchannel_position[i][1]), 2.0)); - if (_n_rings == 1) + // If subchannel belongs to center ring + if (channel_distance < distance_outer_ring) { - Real angle = std::atan(p(1) / p(0)); - if ((i * libMesh::pi / 6.0 < angle) && (angle <= (i + 1) * libMesh::pi / 6.0)) - return i; - } + if ((distance1 < distance0) && (_subch_type[i] == EChannelType::CENTER)) + { + j = i; + distance0 = distance1; + } // if + } // if + // If subchannel belongs to outer ring else { - // Distance from the point to subchannel - distance1 = std::sqrt(std::pow((p(0) - _subchannel_position[i][0]), 2.0) + - std::pow((p(1) - _subchannel_position[i][1]), 2.0)); - - // If subchannel belongs to center ring - if (channel_distance < distance_outer_ring) + if ((distance1 < distance0) && + (_subch_type[i] == EChannelType::EDGE || _subch_type[i] == EChannelType::CORNER)) { - if ((distance1 < distance0) && (_subch_type[i] == EChannelType::CENTER)) + if (((x_coord_new > x_lim) || (x_coord_new < -x_lim)) && + _subch_type[i] == EChannelType::CORNER) { j = i; distance0 = distance1; } // if - } // if - // If subchannel belongs to outer ring - else - { - if ((distance1 < distance0) && - (_subch_type[i] == EChannelType::EDGE || _subch_type[i] == EChannelType::CORNER)) + else if ((x_coord_new <= x_lim && x_coord_new >= -x_lim) && + _subch_type[i] == EChannelType::EDGE) { - if (((x_coord_new > x_lim) || (x_coord_new < -x_lim)) && - _subch_type[i] == EChannelType::CORNER) - { - j = i; - distance0 = distance1; - } // if - else if (((x_coord_new > x_lim) || (x_coord_new > -x_lim)) && - _subch_type[i] == EChannelType::EDGE) - { - j = i; - distance0 = distance1; - } + j = i; + distance0 = distance1; } } } @@ -205,7 +193,7 @@ TriSubChannelMesh::pinPositions(std::vector & positions, Real theta_corrected = 0.0; Real pi = libMesh::pi; unsigned int k = 0; - positions.emplace_back(0.0, 0.0); + positions.emplace_back(center(0), center(1)); for (unsigned int i = 1; i < nrings; i++) { dtheta = 2.0 * pi / (i * 6); diff --git a/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C index 662186bcf1d3..0469bbdd8a7d 100644 --- a/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C +++ b/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C @@ -27,7 +27,9 @@ SCMDetailedTriAssemblyMeshGenerator::validParams() params.addParam("unheated_length_entry", 0.0, "Unheated length at entry [m]"); params.addRequiredParam("heated_length", "Heated length [m]"); params.addParam("unheated_length_exit", 0.0, "Unheated length at exit [m]"); - params.addRequiredParam("nrings", "Number of fuel Pin rings per assembly [-]"); + params.addRequiredParam( + "nrings", + "Number of fuel-pin rings per assembly, counting the center pin as the first ring [-]"); params.addRequiredParam("flat_to_flat", "Flat to flat distance for the hexagonal assembly [m]"); params.addRequiredParam("n_cells", "The number of cells in the axial direction"); @@ -63,6 +65,11 @@ SCMDetailedTriAssemblyMeshGenerator::SCMDetailedTriAssemblyMeshGenerator( _verbose(getParam("verbose_flag")), _elem_id(0) { + if (_n_rings < 2) + mooseError(name(), + ": 'nrings' must be at least 2. In this mesh generator, the center pin counts as " + "the first ring, so a 7-pin bundle uses nrings = 2."); + Real L = _unheated_length_entry + _heated_length + _unheated_length_exit; Real dz = L / _n_cells; for (unsigned int i = 0; i < _n_cells + 1; i++) @@ -293,18 +300,6 @@ SCMDetailedTriAssemblyMeshGenerator::SCMDetailedTriAssemblyMeshGenerator( _subchannel_position[i][0] = (a2 * x1 - a1 * x0) / (a2 - a1); _subchannel_position[i][1] = (a2 * y1 - a1 * y0) / (a2 - a1); } - - /// Special case _n_rings == 1 - if (_n_rings == 1) - { - for (unsigned int i = 0; i < _n_channels; i++) - { - Real angle = (2 * i + 1) * libMesh::pi / 6.0; - _subch_type[i] = EChannelType::CORNER; - _subchannel_position[i][0] = std::cos(angle) * _flat_to_flat / 2.0; - _subchannel_position[i][1] = std::sin(angle) * _flat_to_flat / 2.0; - } - } } } @@ -399,19 +394,9 @@ SCMDetailedTriAssemblyMeshGenerator::generate() } // specify number and type of sub-channel - unsigned int n_center, n_side, n_corner; - if (_n_rings == 1) - { - n_corner = 6; - n_side = 0; - n_center = _n_channels - n_side - n_corner; - } - else - { - n_corner = 6; - n_side = (_n_rings - 1) * 6; - n_center = _n_channels - n_side - n_corner; - } + unsigned int n_corner = 6; + unsigned int n_side = (_n_rings - 1) * 6; + unsigned int n_center = _n_channels - n_side - n_corner; if (_verbose) { _console << "Centers: " << n_center << std::endl; diff --git a/modules/subchannel/src/meshgenerators/SCMTriAssemblyMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMTriAssemblyMeshGenerator.C index f36aac191455..63e2560f775a 100644 --- a/modules/subchannel/src/meshgenerators/SCMTriAssemblyMeshGenerator.C +++ b/modules/subchannel/src/meshgenerators/SCMTriAssemblyMeshGenerator.C @@ -27,7 +27,9 @@ SCMTriAssemblyMeshGenerator::validParams() params.addParam("unheated_length_entry", 0.0, "Unheated length at entry [m]"); params.addRequiredParam("heated_length", "Heated length [m]"); params.addParam("unheated_length_exit", 0.0, "Unheated length at exit [m]"); - params.addRequiredParam("nrings", "Number of fuel Pin rings per assembly [-]"); + params.addRequiredParam( + "nrings", + "Number of fuel-pin rings per assembly, counting the center pin as the first ring [-]"); params.addRequiredParam("flat_to_flat", "Flat to flat distance for the hexagonal assembly [m]"); params.addRequiredParam("dwire", "Wire diameter [m]"); @@ -86,6 +88,11 @@ SCMTriAssemblyMeshGenerator::SCMTriAssemblyMeshGenerator(const InputParameters & _n_gaps(0), _elem_id(0) { + if (_n_rings < 2) + mooseError(name(), + ": 'nrings' must be at least 2. In this mesh generator, the center pin counts as " + "the first ring, so a 7-pin bundle uses nrings = 2."); + if (_spacer_z.size() != _spacer_k.size()) mooseError(name(), ": Size of vector spacer_z should be equal to size of vector spacer_k"); @@ -739,18 +746,6 @@ SCMTriAssemblyMeshGenerator::SCMTriAssemblyMeshGenerator(const InputParameters & } } - /// Special case _n_rings == 1 - if (_n_rings == 1) - { - for (unsigned int i = 0; i < _n_channels; i++) - { - Real angle = (2 * i + 1) * libMesh::pi / 6.0; - _subch_type[i] = EChannelType::CORNER; - _subchannel_position[i][0] = std::cos(angle) * _flat_to_flat / 2.0; - _subchannel_position[i][1] = std::sin(angle) * _flat_to_flat / 2.0; - } - } - // Reduce reserved memory in the channel-to-gap map. for (auto & gap : _chan_to_gap_map) { diff --git a/modules/subchannel/test/tests/ics/FCTFdisplacementIC/gold/test_out.csv b/modules/subchannel/test/tests/ics/FCTFdisplacementIC/gold/test_out.csv new file mode 100644 index 000000000000..bdb46ed5df44 --- /dev/null +++ b/modules/subchannel/test/tests/ics/FCTFdisplacementIC/gold/test_out.csv @@ -0,0 +1,3 @@ +time,center_S,center_w_perim,corner_S,corner_w_perim,edge_S,edge_w_perim +0,0,0,0,0,0,0 +1,1.78771169811e-05,0.017645070068785,1.6955350355555e-05,0.014091834788374,4.3125203206028e-05,0.028871590068785 diff --git a/modules/subchannel/test/tests/ics/FCTFdisplacementIC/gold/test_out.e b/modules/subchannel/test/tests/ics/FCTFdisplacementIC/gold/test_out.e deleted file mode 100644 index a2fdfe228cdc57d35a23d43b334e797be27b41a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633672 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 diff --git a/modules/subchannel/test/tests/ics/FCTFdisplacementIC/test.i b/modules/subchannel/test/tests/ics/FCTFdisplacementIC/test.i index a6a2029ccd57..ef045b046f19 100644 --- a/modules/subchannel/test/tests/ics/FCTFdisplacementIC/test.i +++ b/modules/subchannel/test/tests/ics/FCTFdisplacementIC/test.i @@ -211,11 +211,57 @@ unheated_length_exit = 0.855 #m [] [] -[Outputs] - exodus = true +[Postprocessors] + [center_S] + type = SubChannelPointValue + variable = S + index = 0 + execute_on = 'timestep_end' + height = 0.5 + [] + [edge_S] + type = SubChannelPointValue + variable = S + index = 96 + execute_on = 'timestep_end' + height = 0.5 + [] + [corner_S] + type = SubChannelPointValue + variable = S + index = 97 + execute_on = 'timestep_end' + height = 0.5 + [] + [center_w_perim] + type = SubChannelPointValue + variable = w_perim + index = 0 + execute_on = 'timestep_end' + height = 0.5 + [] + [edge_w_perim] + type = SubChannelPointValue + variable = w_perim + index = 96 + execute_on = 'timestep_end' + height = 0.5 + [] + [corner_w_perim] + type = SubChannelPointValue + variable = w_perim + index = 97 + execute_on = 'timestep_end' + height = 0.5 + [] [] [Executioner] type = Steady [] +[Outputs] + exodus = false + csv = true +[] + diff --git a/modules/subchannel/test/tests/ics/FCTFdisplacementIC/tests b/modules/subchannel/test/tests/ics/FCTFdisplacementIC/tests index 05b1f08a550f..ccbd9bcd9726 100644 --- a/modules/subchannel/test/tests/ics/FCTFdisplacementIC/tests +++ b/modules/subchannel/test/tests/ics/FCTFdisplacementIC/tests @@ -2,10 +2,14 @@ design = 'FCTFdisplacementIC.md' issues = '#29501' [test] - type = Exodiff + type = CSVDiff + csvdiff = test_out.csv + capabilities = 'method!=dbg' + valgrind = NONE + recover = false + abs_zero = 1e-6 + max_threads = 1 input = 'test.i' - exodiff = 'test_out.e' - recover = False requirement = 'The system will calculate the geometric parameters for FCTF' [] [] diff --git a/modules/subchannel/test/tests/ics/marvel/gold/test_out.csv b/modules/subchannel/test/tests/ics/marvel/gold/test_out.csv new file mode 100644 index 000000000000..66b5b7c07da3 --- /dev/null +++ b/modules/subchannel/test/tests/ics/marvel/gold/test_out.csv @@ -0,0 +1,3 @@ +time,center_S,center_w_perim,corner_S,corner_w_perim,edge_S,edge_w_perim +0,0,0,0,0,0,0 +1,0.00010027438927853,0.051349331922925,6.8990726400969e-05,0.038032143671196,0.0001714043629727,0.093295238070336 diff --git a/modules/subchannel/test/tests/ics/marvel/gold/test_out.e b/modules/subchannel/test/tests/ics/marvel/gold/test_out.e deleted file mode 100644 index fdd8593808871b87a6ba9ac27423b14e1d36f8fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378688 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%0Amq<$xWea>x!-Ibuht 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 diff --git a/modules/subchannel/test/tests/ics/marvel/test.i b/modules/subchannel/test/tests/ics/marvel/test.i index c0bc8784fcbf..d9f46b35f005 100644 --- a/modules/subchannel/test/tests/ics/marvel/test.i +++ b/modules/subchannel/test/tests/ics/marvel/test.i @@ -47,11 +47,56 @@ heated_length = 0.51 [] [] - -[Outputs] - exodus = true +[Postprocessors] + [center_S] + type = SubChannelPointValue + variable = S + index = 0 + execute_on = 'timestep_end' + height = 0.5 + [] + [edge_S] + type = SubChannelPointValue + variable = S + index = 54 + execute_on = 'timestep_end' + height = 0.5 + [] + [corner_S] + type = SubChannelPointValue + variable = S + index = 55 + execute_on = 'timestep_end' + height = 0.5 + [] + [center_w_perim] + type = SubChannelPointValue + variable = w_perim + index = 0 + execute_on = 'timestep_end' + height = 0.5 + [] + [edge_w_perim] + type = SubChannelPointValue + variable = w_perim + index = 54 + execute_on = 'timestep_end' + height = 0.5 + [] + [corner_w_perim] + type = SubChannelPointValue + variable = w_perim + index = 55 + execute_on = 'timestep_end' + height = 0.5 + [] [] [Executioner] type = Steady [] + +[Outputs] + exodus = false + csv = true +[] diff --git a/modules/subchannel/test/tests/ics/marvel/tests b/modules/subchannel/test/tests/ics/marvel/tests index 8ba275919023..3b83e3310f3d 100644 --- a/modules/subchannel/test/tests/ics/marvel/tests +++ b/modules/subchannel/test/tests/ics/marvel/tests @@ -2,10 +2,14 @@ design = 'MarvelTriFlowAreaIC.md MarvelTriWettedPerimIC.md' issues = '#30295' [test] - type = Exodiff + type = CSVDiff + csvdiff = test_out.csv + capabilities = 'method!=dbg' + valgrind = NONE + recover = false + abs_zero = 1e-6 + max_threads = 1 input = 'test.i' - exodiff = 'test_out.e' - recover = False requirement = 'The system shall calculate the flow area and wetted perimeter for a MARVEL-type microreactor core modeled in SCM' [] [] \ No newline at end of file diff --git a/modules/subchannel/test/tests/ics/mass_flow/gold/test_out.csv b/modules/subchannel/test/tests/ics/mass_flow/gold/test_out.csv new file mode 100644 index 000000000000..8851c8123c04 --- /dev/null +++ b/modules/subchannel/test/tests/ics/mass_flow/gold/test_out.csv @@ -0,0 +1,3 @@ +time,center,corner,edge +0,0,0,0 +1,237.18850356876,224.57490366997,236.64980733994 diff --git a/modules/subchannel/test/tests/ics/mass_flow/gold/test_out.e b/modules/subchannel/test/tests/ics/mass_flow/gold/test_out.e deleted file mode 100644 index 25cdc5a22f274f51891bbad25085d5565142aa8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49560 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 diff --git a/modules/subchannel/test/tests/ics/tri_flow_area/test.i b/modules/subchannel/test/tests/ics/tri_flow_area/test.i index 7b429ae2f4e7..7ee7ef3ab417 100644 --- a/modules/subchannel/test/tests/ics/tri_flow_area/test.i +++ b/modules/subchannel/test/tests/ics/tri_flow_area/test.i @@ -16,6 +16,7 @@ [Variables] [S] + block = subchannel [] [] @@ -23,6 +24,31 @@ [S_IC] type = SCMTriFlowAreaIC variable = S + block = subchannel + [] +[] + +[Postprocessors] + [center] + type = SubChannelPointValue + variable = S + index = 0 + execute_on = 'timestep_end' + height = 0.5 + [] + [edge] + type = SubChannelPointValue + variable = S + index = 24 + execute_on = 'timestep_end' + height = 0.5 + [] + [corner] + type = SubChannelPointValue + variable = S + index = 25 + execute_on = 'timestep_end' + height = 0.5 [] [] @@ -35,5 +61,6 @@ [] [Outputs] - exodus = true + exodus = false + csv = true [] diff --git a/modules/subchannel/test/tests/ics/tri_flow_area/tests b/modules/subchannel/test/tests/ics/tri_flow_area/tests index 9f1f7b7c1f1b..acbd4ff67c89 100644 --- a/modules/subchannel/test/tests/ics/tri_flow_area/tests +++ b/modules/subchannel/test/tests/ics/tri_flow_area/tests @@ -2,10 +2,14 @@ design = 'SCMTriFlowAreaIC.md' issues = '#29194' [test] - type = Exodiff - input = 'test.i' - exodiff = 'test_out.e' + type = CSVDiff + csvdiff = test_out.csv + capabilities = 'method!=dbg' + valgrind = NONE recover = false + abs_zero = 1e-6 + max_threads = 1 + input = 'test.i' requirement = 'The system will calculate the subchannel flow area for triangular assemblies' [] [] diff --git a/modules/subchannel/test/tests/ics/tri_wetted_perimeter/gold/test_out.csv b/modules/subchannel/test/tests/ics/tri_wetted_perimeter/gold/test_out.csv new file mode 100644 index 000000000000..9508d0386e53 --- /dev/null +++ b/modules/subchannel/test/tests/ics/tri_wetted_perimeter/gold/test_out.csv @@ -0,0 +1,3 @@ +time,center,corner,edge +0,0,0,0 +1,0.23667985307134,0.16530344587089,0.36667985307134 diff --git a/modules/subchannel/test/tests/ics/tri_wetted_perimeter/gold/test_out.e b/modules/subchannel/test/tests/ics/tri_wetted_perimeter/gold/test_out.e deleted file mode 100644 index e05df84bd0a63781f6e8df77521486bd19826684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46500 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 Di7*e| diff --git a/modules/subchannel/test/tests/ics/tri_wetted_perimeter/test.i b/modules/subchannel/test/tests/ics/tri_wetted_perimeter/test.i index 18f0aae48ac2..e49b9e43f1de 100644 --- a/modules/subchannel/test/tests/ics/tri_wetted_perimeter/test.i +++ b/modules/subchannel/test/tests/ics/tri_wetted_perimeter/test.i @@ -16,6 +16,7 @@ [Variables] [w_perim] + block = subchannel [] [] @@ -23,6 +24,31 @@ [w_perim_IC] type = SCMTriWettedPerimIC variable = w_perim + block = subchannel + [] +[] + +[Postprocessors] + [center] + type = SubChannelPointValue + variable = w_perim + index = 0 + execute_on = 'timestep_end' + height = 0.5 + [] + [edge] + type = SubChannelPointValue + variable = w_perim + index = 24 + execute_on = 'timestep_end' + height = 0.5 + [] + [corner] + type = SubChannelPointValue + variable = w_perim + index = 25 + execute_on = 'timestep_end' + height = 0.5 [] [] @@ -35,5 +61,6 @@ [] [Outputs] - exodus = true + exodus = false + csv = true [] diff --git a/modules/subchannel/test/tests/ics/tri_wetted_perimeter/tests b/modules/subchannel/test/tests/ics/tri_wetted_perimeter/tests index c97565649cbb..51c221ecc1ef 100644 --- a/modules/subchannel/test/tests/ics/tri_wetted_perimeter/tests +++ b/modules/subchannel/test/tests/ics/tri_wetted_perimeter/tests @@ -2,10 +2,14 @@ design = 'SCMTriWettedPerimIC.md' issues = '#29194' [test] - type = Exodiff - input = 'test.i' - exodiff = 'test_out.e' + type = CSVDiff + csvdiff = test_out.csv + capabilities = 'method!=dbg' + valgrind = NONE recover = false + abs_zero = 1e-6 + max_threads = 1 + input = 'test.i' requirement = 'The system will calculate the wetted perimeter of subchannels in a triangular lattice' [] [] diff --git a/modules/subchannel/test/tests/problems/psbt/psbt_monolithic.i b/modules/subchannel/test/tests/problems/psbt/psbt_monolithic.i index 32cf9c1d7cb5..8523f21801f2 100644 --- a/modules/subchannel/test/tests/problems/psbt/psbt_monolithic.i +++ b/modules/subchannel/test/tests/problems/psbt/psbt_monolithic.i @@ -19,28 +19,6 @@ pin_diameter = 0.00950 subchannel_block_id = 0 pin_block_id = 1 [] - # [sub_channel] - # type = SCMQuadAssemblyMeshGenerator - # nx = 6 - # ny = 6 - # n_cells = 10 - # pitch = 0.0126 - # pin_diameter = ${pin_diameter} - # side_gap = 0.00095 - # heated_length = 1.0 - # spacer_z = '0.0' - # spacer_k = '0.0' - # [] - - # [fuel_pins] - # type = SCMQuadAssemblyMeshGenerator - # input = sub_channel - # nx = 6 - # ny = 6 - # n_cells = 10 - # pitch = 0.0126 - # heated_length = 1.0 - # [] [] [FluidProperties] From bbb604bcc2b80cf0157163f56506bd9990a2e3c9 Mon Sep 17 00:00:00 2001 From: Vasileios Kyriakopoulos Date: Thu, 30 Apr 2026 09:36:39 -0600 Subject: [PATCH 5/6] Improve subchannel mesh generator validation Guard quad and tri assembly mesh generators against invalid axial grids, zero-length domains, and malformed spacer/blockage inputs before mesh construction. Keep quadrilateral assemblies consistent by rejecting only 1x1 layouts while allowing valid 1xN and Nx1 subchannel meshes. Fix triangular assembly block-id fallback handling so the deprecated block_id parameter is still honored when subchannel_block_id is not set. Also add a quad mesh-object guard so pin index lookup on no-pin 1xN/Nx1 meshes reports a clear error instead of evaluating unsigned underflow arithmetic. Add detailed quad coverage for the 1x1 rejection while preserving 1x2 and Nx1 generation behavior. Refs #32847 --- .../subchannel/src/mesh/QuadSubChannelMesh.C | 6 +++ .../SCMDetailedQuadAssemblyMeshGenerator.C | 19 ++++++++- .../SCMDetailedTriAssemblyMeshGenerator.C | 11 ++++- .../SCMQuadAssemblyMeshGenerator.C | 40 ++++++++++++++----- .../SCMTriAssemblyMeshGenerator.C | 21 +++++++--- .../tests/mesh/detailed_quad_assembly/tests | 7 ++++ 6 files changed, 85 insertions(+), 19 deletions(-) diff --git a/modules/subchannel/src/mesh/QuadSubChannelMesh.C b/modules/subchannel/src/mesh/QuadSubChannelMesh.C index 4d2196ba0981..da9e645c44cc 100644 --- a/modules/subchannel/src/mesh/QuadSubChannelMesh.C +++ b/modules/subchannel/src/mesh/QuadSubChannelMesh.C @@ -97,6 +97,9 @@ QuadSubChannelMesh::channelIndex(const Point & pt) const unsigned int QuadSubChannelMesh::getPinIndexFromPoint(const Point & p) const { + if (_n_pins == 0) + mooseError(name(), ": Cannot compute a pin index because this mesh has no pins."); + Real offset_x = (_nx - 2) * _pitch / 2.0; Real offset_y = (_ny - 2) * _pitch / 2.0; unsigned int i = (p(0) + offset_x) / _pitch; @@ -107,6 +110,9 @@ QuadSubChannelMesh::getPinIndexFromPoint(const Point & p) const unsigned int QuadSubChannelMesh::pinIndex(const Point & p) const { + if (_n_pins == 0) + mooseError(name(), ": Cannot compute a pin index because this mesh has no pins."); + Real offset_x = (_nx - 2) * _pitch / 2.0; Real offset_y = (_ny - 2) * _pitch / 2.0; unsigned int i = (p(0) + offset_x) / _pitch; diff --git a/modules/subchannel/src/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.C index 9bcefab78313..43f8b29963bb 100644 --- a/modules/subchannel/src/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.C +++ b/modules/subchannel/src/meshgenerators/SCMDetailedQuadAssemblyMeshGenerator.C @@ -63,7 +63,7 @@ SCMDetailedQuadAssemblyMeshGenerator::SCMDetailedQuadAssemblyMeshGenerator( _n_cells(getParam("n_cells")), _nx(getParam("nx")), _ny(getParam("ny")), - _n_channels(_nx * _ny), + _n_channels(0), _side_gap(isParamValid("side_gap") ? getParam("side_gap") : getParam("gap")), _num_radial_parts(getParam("num_radial_parts")), _subchannel_block_id(getParam("subchannel_block_id")), @@ -71,6 +71,23 @@ SCMDetailedQuadAssemblyMeshGenerator::SCMDetailedQuadAssemblyMeshGenerator( _elem_id(0) { const Real L = _unheated_length_entry + _heated_length + _unheated_length_exit; + + if (_n_cells == 0) + mooseError(name(), ": The number of axial cells must be greater than zero"); + + if (L <= 0.0) + mooseError(name(), ": Total bundle length must be greater than zero"); + + if (_nx == 0 || _ny == 0) + mooseError(name(), ": The number of subchannels must be greater than zero in each direction"); + + if (_nx < 2 && _ny < 2) + mooseError(name(), + ": The number of subchannels cannot be less than 2 in both directions. " + "Smallest assembly allowed is either 2X1 or 1X2."); + + _n_channels = _nx * _ny; + const Real dz = L / _n_cells; for (unsigned int i = 0; i < _n_cells + 1; i++) _z_grid.push_back(dz * i); diff --git a/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C index 0469bbdd8a7d..c7dcc272d9d1 100644 --- a/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C +++ b/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C @@ -55,7 +55,7 @@ SCMDetailedTriAssemblyMeshGenerator::SCMDetailedTriAssemblyMeshGenerator( _n_rings(getParam("nrings")), _flat_to_flat(getParam("flat_to_flat")), _num_radial_parts(getParam("num_radial_parts")), - _subchannel_block_id(isParamValid("subchannel_block_id") + _subchannel_block_id(parameters.isParamSetByUser("subchannel_block_id") ? getParam("subchannel_block_id") : getParam("block_id")), _pin_block_id(getParam("pin_block_id")), @@ -65,12 +65,19 @@ SCMDetailedTriAssemblyMeshGenerator::SCMDetailedTriAssemblyMeshGenerator( _verbose(getParam("verbose_flag")), _elem_id(0) { + const Real L = _unheated_length_entry + _heated_length + _unheated_length_exit; + if (_n_rings < 2) mooseError(name(), ": 'nrings' must be at least 2. In this mesh generator, the center pin counts as " "the first ring, so a 7-pin bundle uses nrings = 2."); - Real L = _unheated_length_entry + _heated_length + _unheated_length_exit; + if (_n_cells == 0) + mooseError(name(), ": The number of axial cells must be greater than zero"); + + if (L <= 0.0) + mooseError(name(), ": Total bundle length must be greater than zero"); + Real dz = L / _n_cells; for (unsigned int i = 0; i < _n_cells + 1; i++) _z_grid.push_back(dz * i); diff --git a/modules/subchannel/src/meshgenerators/SCMQuadAssemblyMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMQuadAssemblyMeshGenerator.C index b19835b53a4e..a5542a71f885 100644 --- a/modules/subchannel/src/meshgenerators/SCMQuadAssemblyMeshGenerator.C +++ b/modules/subchannel/src/meshgenerators/SCMQuadAssemblyMeshGenerator.C @@ -83,24 +83,46 @@ SCMQuadAssemblyMeshGenerator::SCMQuadAssemblyMeshGenerator(const InputParameters _n_cells(getParam("n_cells")), _nx(getParam("nx")), _ny(getParam("ny")), - _n_channels(_nx * _ny), - _n_gaps((_nx - 1) * _ny + (_ny - 1) * _nx), - _n_pins((_nx - 1) * (_ny - 1)), + _n_channels(0), + _n_gaps(0), + _n_pins(0), _side_gap(getParam("side_gap")), _subchannel_block_id(getParam("subchannel_block_id")), _pin_block_id(getParam("pin_block_id")) { - if (_spacer_z.size() != _spacer_k.size()) - mooseError(name(), ": Size of vector spacer_z should equal size of spacer_k"); + const Real total_length = _unheated_length_entry + _heated_length + _unheated_length_exit; - if (_z_blockage.size() != 2) - mooseError(name(), ": Size of vector z_blockage must be 2"); + if (_n_cells == 0) + mooseError(name(), ": The number of axial cells must be greater than zero"); + + if (total_length <= 0.0) + mooseError(name(), ": Total bundle length must be greater than zero"); + + if (_nx == 0 || _ny == 0) + mooseError(name(), ": The number of subchannels must be greater than zero in each direction"); if (_nx < 2 && _ny < 2) mooseError(name(), ": The number of subchannels cannot be less than 2 in both directions. " "Smallest assembly allowed is either 2X1 or 1X2."); + _n_channels = _nx * _ny; + _n_gaps = (_nx - 1) * _ny + (_ny - 1) * _nx; + _n_pins = (_nx - 1) * (_ny - 1); + + if (_spacer_z.size() != _spacer_k.size()) + mooseError(name(), ": Size of vector spacer_z should equal size of spacer_k"); + + for (const auto spacer_z : _spacer_z) + if (spacer_z < 0.0 || spacer_z > total_length) + mooseError(name(), ": Spacer locations must be between zero and total bundle length"); + + if (_z_blockage.size() != 2) + mooseError(name(), ": Size of vector z_blockage must be 2"); + + if (_z_blockage.front() > _z_blockage.back()) + mooseError(name(), ": z_blockage inlet location must not exceed outlet location"); + if (!_index_blockage.empty() && *std::max_element(_index_blockage.begin(), _index_blockage.end()) > (_n_channels - 1)) mooseError(name(), ": Blocked subchannel index exceeds valid subchannel range"); @@ -122,10 +144,6 @@ SCMQuadAssemblyMeshGenerator::SCMQuadAssemblyMeshGenerator(const InputParameters SubChannelMesh::generateZGrid( _unheated_length_entry, _heated_length, _unheated_length_exit, _n_cells, _z_grid); - if (_spacer_z.size() && - _spacer_z.back() > _unheated_length_entry + _heated_length + _unheated_length_exit) - mooseError(name(), ": Location of spacers must be less than total bundle length"); - initializeChannelData(); } diff --git a/modules/subchannel/src/meshgenerators/SCMTriAssemblyMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMTriAssemblyMeshGenerator.C index 63e2560f775a..aac8dfa13af8 100644 --- a/modules/subchannel/src/meshgenerators/SCMTriAssemblyMeshGenerator.C +++ b/modules/subchannel/src/meshgenerators/SCMTriAssemblyMeshGenerator.C @@ -63,7 +63,7 @@ SCMTriAssemblyMeshGenerator::SCMTriAssemblyMeshGenerator(const InputParameters & _unheated_length_entry(getParam("unheated_length_entry")), _heated_length(getParam("heated_length")), _unheated_length_exit(getParam("unheated_length_exit")), - _subchannel_block_id(isParamValid("subchannel_block_id") + _subchannel_block_id(params.isParamSetByUser("subchannel_block_id") ? getParam("subchannel_block_id") : getParam("block_id")), _pin_block_id(getParam("pin_block_id")), @@ -88,21 +88,32 @@ SCMTriAssemblyMeshGenerator::SCMTriAssemblyMeshGenerator(const InputParameters & _n_gaps(0), _elem_id(0) { + const Real total_length = _unheated_length_entry + _heated_length + _unheated_length_exit; + if (_n_rings < 2) mooseError(name(), ": 'nrings' must be at least 2. In this mesh generator, the center pin counts as " "the first ring, so a 7-pin bundle uses nrings = 2."); + if (_n_cells == 0) + mooseError(name(), ": The number of axial cells must be greater than zero"); + + if (total_length <= 0.0) + mooseError(name(), ": Total bundle length must be greater than zero"); + if (_spacer_z.size() != _spacer_k.size()) mooseError(name(), ": Size of vector spacer_z should be equal to size of vector spacer_k"); - if (_spacer_z.size() && - _spacer_z.back() > _unheated_length_entry + _heated_length + _unheated_length_exit) - mooseError(name(), ": Location of spacers should be less than the total bundle length"); + for (const auto spacer_z : _spacer_z) + if (spacer_z < 0.0 || spacer_z > total_length) + mooseError(name(), ": Location of spacers should be between zero and total bundle length"); if (_z_blockage.size() != 2) mooseError(name(), ": Size of vector z_blockage must be 2"); + if (_z_blockage.front() > _z_blockage.back()) + mooseError(name(), ": z_blockage inlet location must not exceed outlet location"); + if (*max_element(_reduction_blockage.begin(), _reduction_blockage.end()) > 1) mooseError(name(), ": The area reduction of the blocked subchannels cannot be more than 1"); @@ -117,7 +128,7 @@ SCMTriAssemblyMeshGenerator::SCMTriAssemblyMeshGenerator(const InputParameters & _unheated_length_entry, _heated_length, _unheated_length_exit, _n_cells, _z_grid); // Defining the total length from 3 axial sections - Real L = _unheated_length_entry + _heated_length + _unheated_length_exit; + Real L = total_length; // Defining the position of the spacer grid in the numerical solution array std::vector spacer_cell; diff --git a/modules/subchannel/test/tests/mesh/detailed_quad_assembly/tests b/modules/subchannel/test/tests/mesh/detailed_quad_assembly/tests index 672d6d247705..c091166b9fba 100644 --- a/modules/subchannel/test/tests/mesh/detailed_quad_assembly/tests +++ b/modules/subchannel/test/tests/mesh/detailed_quad_assembly/tests @@ -9,6 +9,13 @@ recover = false requirement = 'The system will create a detailed mesh of the subchannels and fuel pins for quadrilateral assemblies (3x3)' [] + [subchannel_number] + type = 'RunException' + input = 'coords.i' + cli_args = 'Mesh/assembly/nx=1 Mesh/assembly/ny=1' + expect_err = "The number of subchannels cannot be less than 2 in both directions\. Smallest assembly allowed is either 2X1 or 1X2\." + requirement = 'The system shall check the minimum number of subchannels for detailed quadrilateral assemblies' + [] [1x2] type = Exodiff From c2bfa590c1507355074e9a99cb2017dd64ec03da Mon Sep 17 00:00:00 2001 From: Vasileios Kyriakopoulos Date: Thu, 30 Apr 2026 17:14:03 -0600 Subject: [PATCH 6/6] =?UTF-8?q?=E2=80=A2=20Clean=20up=20subchannel=20power?= =?UTF-8?q?=20mesh=20assumptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove unused detailed pin mesh generator code and an unused tri assembly helper. Make quad and tri power IC/Aux objects require a pin mesh and apply q_prime only on pin nodes. Update added-heat calculations to source heat from pin nodes only, returning zero for no-pin meshes. Refresh related power object documentation to match the pin-only behavior. Refs #32847 --- .../source/auxkernels/SCMQuadPowerAux.md | 3 +- .../source/auxkernels/SCMTriPowerAux.md | 3 +- .../doc/content/source/ics/SCMQuadPowerIC.md | 5 +- .../doc/content/source/ics/SCMTriPowerIC.md | 5 +- .../SCMPinPowerPostprocessor.md | 2 +- .../include/auxkernels/SCMQuadPowerAux.h | 2 +- .../subchannel/include/ics/SCMQuadPowerIC.h | 2 +- .../DetailedPinMeshGeneratorBase.h | 48 ---------- .../SCMDetailedTriAssemblyMeshGenerator.h | 1 - .../src/auxkernels/SCMQuadPowerAux.C | 44 +++------ .../src/auxkernels/SCMTriPowerAux.C | 47 ++------- modules/subchannel/src/ics/SCMQuadPowerIC.C | 44 +++------ modules/subchannel/src/ics/SCMTriPowerIC.C | 47 ++------- .../DetailedPinMeshGeneratorBase.C | 96 ------------------- .../SCMDetailedTriAssemblyMeshGenerator.C | 13 --- .../problems/QuadSubChannel1PhaseProblem.C | 28 +++--- .../src/problems/TriSubChannel1PhaseProblem.C | 56 +++++------ .../tests/mesh/detailed_tri_assembly/coords.i | 2 +- 18 files changed, 86 insertions(+), 362 deletions(-) delete mode 100644 modules/subchannel/include/meshgenerators/DetailedPinMeshGeneratorBase.h delete mode 100644 modules/subchannel/src/meshgenerators/DetailedPinMeshGeneratorBase.C diff --git a/modules/subchannel/doc/content/source/auxkernels/SCMQuadPowerAux.md b/modules/subchannel/doc/content/source/auxkernels/SCMQuadPowerAux.md index e18f6eac9374..ee3abdabab0c 100644 --- a/modules/subchannel/doc/content/source/auxkernels/SCMQuadPowerAux.md +++ b/modules/subchannel/doc/content/source/auxkernels/SCMQuadPowerAux.md @@ -12,8 +12,7 @@ This AuxKernel does the same thing as the [SCMQuadPowerIC](SCMQuadPowerIC.md) IC !! Intentional comment to provide extra spacing -If the user has created a mesh for the pins, the axial heat rate `q_prime` will be assigned to the nodes of the pin mesh. If the user hasn't created a pin mesh the appropriate heat rate `q_prime` will be assigned to -the nodes of the subchannel mesh. +This AuxKernel requires a pin mesh. The axial heat rate `q_prime` is assigned only to the nodes of the pin mesh. If the subchannel mesh has no pin mesh, this object reports an error. !syntax parameters /AuxKernels/SCMQuadPowerAux diff --git a/modules/subchannel/doc/content/source/auxkernels/SCMTriPowerAux.md b/modules/subchannel/doc/content/source/auxkernels/SCMTriPowerAux.md index a81cf1854ca3..a80482d9e224 100644 --- a/modules/subchannel/doc/content/source/auxkernels/SCMTriPowerAux.md +++ b/modules/subchannel/doc/content/source/auxkernels/SCMTriPowerAux.md @@ -12,8 +12,7 @@ This AuxKernel does the same thing as the [SCMTriPowerIC](SCMTriPowerIC.md) IC k !! Intentional comment to provide extra spacing -If the user has created a mesh for the pins, the axial heat rate `q_prime` will be assigned to the nodes of the pin mesh. If the user hasn't created a pin mesh the appropriate heat rate `q_prime` will be assigned to -the nodes of the subchannel mesh. +This AuxKernel requires a pin mesh. The axial heat rate `q_prime` is assigned only to the nodes of the pin mesh. If the subchannel mesh has no pin mesh, this object reports an error. !syntax parameters /AuxKernels/SCMTriPowerAux diff --git a/modules/subchannel/doc/content/source/ics/SCMQuadPowerIC.md b/modules/subchannel/doc/content/source/ics/SCMQuadPowerIC.md index 88a79bb3086f..95c2d2fe271e 100644 --- a/modules/subchannel/doc/content/source/ics/SCMQuadPowerIC.md +++ b/modules/subchannel/doc/content/source/ics/SCMQuadPowerIC.md @@ -6,7 +6,7 @@ !! Intentional comment to provide extra spacing -This IC assigns the axial heat rate ([!param](/ICs/SCMQuadPowerIC/variable) = `q_prime`) on the subchannels or pins in the case of a problem with subchannels/pins in a square lattice arrangement. +This IC assigns the axial heat rate ([!param](/ICs/SCMQuadPowerIC/variable) = `q_prime`) to the fuel pins in a square lattice arrangement. The user must provide the total power of the subassembly [!param](/ICs/SCMQuadPowerIC/power), the axial shape of the power profile and the radial power distribution (power per pin). The axial power profile is given as a function over the -z direction, which integral over the length of the heated portion of the pin, is equal to the length of the heated portion of the pin. The radial power distribution is given as a column of numbers in a .txt file [!param](/ICs/SCMQuadPowerIC/filename) that has as many entries as the number of pins. @@ -24,8 +24,7 @@ The axial heat rate at a specific height is the product of the total power of th !! Intentional comment to provide extra spacing -If the user has created a mesh for the pins, the axial heat rate will be assigned to the nodes of the pin mesh. If the user hasn't created a pin mesh the appropriate heat rate will be assigned to -the nodes of the subchannel mesh. When the user has defined a fuel-pin mesh, the axial heat rate ([!param](/ICs/SCMTriPowerIC/variable) = `q_prime`) is the heat rate at the surface of the fuels pins and it is distributed equally to each neighboring subchannel. +This IC requires a pin mesh. The axial heat rate ([!param](/ICs/SCMQuadPowerIC/variable) = `q_prime`) is assigned only to the nodes of the pin mesh. If the subchannel mesh has no pin mesh, this object reports an error. The subchannel solver distributes this pin heat to neighboring subchannels when computing the heat added to the coolant. !syntax parameters /ICs/SCMQuadPowerIC diff --git a/modules/subchannel/doc/content/source/ics/SCMTriPowerIC.md b/modules/subchannel/doc/content/source/ics/SCMTriPowerIC.md index 38a482d4f5fe..908ca0b6e025 100644 --- a/modules/subchannel/doc/content/source/ics/SCMTriPowerIC.md +++ b/modules/subchannel/doc/content/source/ics/SCMTriPowerIC.md @@ -6,7 +6,7 @@ !! Intentional comment to provide extra spacing -This IC assigns the axial heat rate ([!param](/ICs/SCMTriPowerIC/variable) = `q_prime`) on the subchannels or pins in the case of a problem with subchannels/pins in a triangular lattice arrangement. +This IC assigns the axial heat rate ([!param](/ICs/SCMTriPowerIC/variable) = `q_prime`) to the fuel pins in a triangular lattice arrangement. The user must provide the total power of the subassembly [!param](/ICs/SCMTriPowerIC/power), the axial shape of the power profile and the radial power distribution (power per pin). The axial power profile is given as a function, which integral over the length of the heated portion of the pin, is equal @@ -26,8 +26,7 @@ The axial heat rate at a specific height is the product of the total power of th !! Intentional comment to provide extra spacing -If the user has created a mesh for the pins, the axial hear rate will be assigned to the nodes of the pin mesh. If the user hasn't created a pin mesh the appropiate heat rate will be assigned to -the nodes of the subchannel mesh. When the user has defined a fuel-pin mesh, the axial heat rate ([!param](/ICs/SCMTriPowerIC/variable) = `q_prime`) is the heat rate at the surface of the fuels pins and it is distributed equally to each neighboring subchannel. +This IC requires a pin mesh. The axial heat rate ([!param](/ICs/SCMTriPowerIC/variable) = `q_prime`) is assigned only to the nodes of the pin mesh. If the subchannel mesh has no pin mesh, this object reports an error. The subchannel solver distributes this pin heat to neighboring subchannels when computing the heat added to the coolant. !syntax parameters /ICs/SCMTriPowerIC diff --git a/modules/subchannel/doc/content/source/postprocessors/SCMPinPowerPostprocessor.md b/modules/subchannel/doc/content/source/postprocessors/SCMPinPowerPostprocessor.md index 6f9ba03788df..5d71790daba2 100644 --- a/modules/subchannel/doc/content/source/postprocessors/SCMPinPowerPostprocessor.md +++ b/modules/subchannel/doc/content/source/postprocessors/SCMPinPowerPostprocessor.md @@ -6,7 +6,7 @@ !! this comment introduces vertical space -The user needs to specify a subchannel problem. Either a [QuadSubChannel1PhaseProblem.md] or a [TriSubChannel1PhaseProblem.md]. The postprocessor will calculate the total heat rate $[W]$ that goes into the coolant, based on the distribution of the aux variable q_prime $[W/m]$, on the fuel pins or the subchannels. It will integrate this variable over the heated section using an axial trapezoidal rule. +The user needs to specify a subchannel problem. Either a [QuadSubChannel1PhaseProblem.md] or a [TriSubChannel1PhaseProblem.md]. The postprocessor will calculate the total heat rate $[W]$ that goes into the coolant, based on the distribution of the aux variable q_prime $[W/m]$ on the fuel pins. It will integrate this variable over the heated section using an axial trapezoidal rule. ## Example Input File Syntax diff --git a/modules/subchannel/include/auxkernels/SCMQuadPowerAux.h b/modules/subchannel/include/auxkernels/SCMQuadPowerAux.h index c5eb296cc83e..49c567e08ab6 100644 --- a/modules/subchannel/include/auxkernels/SCMQuadPowerAux.h +++ b/modules/subchannel/include/auxkernels/SCMQuadPowerAux.h @@ -34,7 +34,7 @@ class SCMQuadPowerAux : public AuxKernel unsigned int _numberoflines; /// The name of the radial power profile file std::string _filename; - /// matrix that holds the values of the relative pin power + /// Matrix that holds the relative pin power Eigen::MatrixXd _power_dis; const Function & _axial_heat_rate; /// Average linear heat rate over the whole pin [W/m] diff --git a/modules/subchannel/include/ics/SCMQuadPowerIC.h b/modules/subchannel/include/ics/SCMQuadPowerIC.h index 99f574f10607..8de35006e6c6 100644 --- a/modules/subchannel/include/ics/SCMQuadPowerIC.h +++ b/modules/subchannel/include/ics/SCMQuadPowerIC.h @@ -30,7 +30,7 @@ class SCMQuadPowerIC : public QuadSubChannelBaseIC unsigned int _numberoflines; /// The name of the radial power profile file std::string _filename; - /// matrix that holds the values of the relative pin power + /// Matrix that holds the relative pin power Eigen::MatrixXd _power_dis; const Function & _axial_heat_rate; /// Average linear heat rate over the whole pin [W/m] diff --git a/modules/subchannel/include/meshgenerators/DetailedPinMeshGeneratorBase.h b/modules/subchannel/include/meshgenerators/DetailedPinMeshGeneratorBase.h deleted file mode 100644 index 77199307a679..000000000000 --- a/modules/subchannel/include/meshgenerators/DetailedPinMeshGeneratorBase.h +++ /dev/null @@ -1,48 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#pragma once - -#include "MeshGenerator.h" - -/** - * Base class for generating fuel pins - */ -class DetailedPinMeshGeneratorBase : public MeshGenerator -{ -public: - DetailedPinMeshGeneratorBase(const InputParameters & parameters); - -protected: - void generatePin(std::unique_ptr & mesh_base, const Point & center); - - /// unheated length of the fuel Pin at the entry of the assembly - const Real _unheated_length_entry; - /// heated length of the fuel Pin - const Real _heated_length; - /// unheated length of the fuel Pin at the exit of the assembly - const Real _unheated_length_exit; - /// axial location of nodes - std::vector _z_grid; - /// Distance between the neighbor fuel pins, pitch - const Real _pitch; - /// fuel Pin diameter - const Real _pin_diameter; - /// Number of cells in the axial direction - const unsigned int _n_cells; - /// Subdomain ID used for the mesh block - const unsigned int & _block_id; - /// Number of radial parts - const unsigned int & _num_radial_parts; - /// Counter for element numbering - dof_id_type _elem_id; - -public: - static InputParameters validParams(); -}; diff --git a/modules/subchannel/include/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.h b/modules/subchannel/include/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.h index ca4b4c67e148..c897854fc549 100644 --- a/modules/subchannel/include/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.h +++ b/modules/subchannel/include/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.h @@ -25,7 +25,6 @@ class SCMDetailedTriAssemblyMeshGenerator : public MeshGenerator /// returns the type of the subchannel given the index EChannelType getSubchannelType(unsigned int index) const { return _subch_type[index]; } Point rotatePoint(Point b, Real theta); - Point translatePoint(Point & b, Point & translation_vector); void generatePin(std::unique_ptr & mesh_base, const Point & center); /// returns the position of pin given pin index Point getPinPosition(unsigned int i) { return _pin_position[i]; } diff --git a/modules/subchannel/src/auxkernels/SCMQuadPowerAux.C b/modules/subchannel/src/auxkernels/SCMQuadPowerAux.C index 19bcc102154a..53d7ed8b1678 100644 --- a/modules/subchannel/src/auxkernels/SCMQuadPowerAux.C +++ b/modules/subchannel/src/auxkernels/SCMQuadPowerAux.C @@ -20,8 +20,8 @@ SCMQuadPowerAux::validParams() { InputParameters params = AuxKernel::validParams(); params.addClassDescription( - "Computes axial power rate (W/m) that goes into the subchannel cells " - "or is assigned to the fuel pins, in a quadrilateral lattice arrangement"); + "Computes axial power rate (W/m) assigned to the fuel pins in a quadrilateral lattice " + "arrangement"); params.addRequiredParam( "power", "The postprocessor or Real to use for the total power of the subassembly [W]"); params.addRequiredParam( @@ -44,12 +44,14 @@ SCMQuadPowerAux::SCMQuadPowerAux(const InputParameters & parameters) if (processor_id() > 0) return; - auto nx = _quadMesh.getNx(); - auto ny = _quadMesh.getNy(); + if (!_quadMesh.pinMeshExist()) + mooseError(name(), ": This object requires a pin mesh."); + + auto n_pins = _quadMesh.getNumOfPins(); // Matrix sizing - _power_dis.resize((ny - 1) * (nx - 1), 1); + _power_dis.resize(n_pins, 1); _power_dis.setZero(); - _pin_power_correction.resize((ny - 1) * (nx - 1), 1); + _pin_power_correction.resize(n_pins, 1); _pin_power_correction.setOnes(); Real vin; @@ -65,8 +67,8 @@ SCMQuadPowerAux::SCMQuadPowerAux(const InputParameters & parameters) if (inFile.fail() && !inFile.eof()) mooseError(name(), " non numerical input at line : ", _numberoflines); - if (_numberoflines != (ny - 1) * (nx - 1)) - mooseError(name(), " Radial profile file doesn't have correct size : ", (ny - 1) * (nx - 1)); + if (_numberoflines != n_pins) + mooseError(name(), " Radial profile file doesn't have correct size : ", n_pins); inFile.close(); inFile.open(_filename); @@ -86,9 +88,7 @@ SCMQuadPowerAux::initialSetup() if (processor_id() > 0) return; - auto nx = _quadMesh.getNx(); - auto ny = _quadMesh.getNy(); - auto n_pins = (nx - 1) * (ny - 1); + auto n_pins = _quadMesh.getNumOfPins(); auto nz = _quadMesh.getNumOfAxialCells(); auto z_grid = _quadMesh.getZGrid(); auto heated_length = _quadMesh.getHeatedLength(); @@ -169,31 +169,13 @@ SCMQuadPowerAux::computeValue() auto unheated_length_entry = _quadMesh.getHeatedLengthEntry(); Point p1(0, 0, unheated_length_entry); Point P = p - p1; - auto pin_mesh_exist = _quadMesh.pinMeshExist(); /// assign power to the nodes located within the heated section if (MooseUtils::absoluteFuzzyGreaterEqual(p(2), unheated_length_entry) && MooseUtils::absoluteFuzzyLessEqual(p(2), unheated_length_entry + heated_length)) { - if (pin_mesh_exist) - { - // project axial heat rate on pins - auto i_pin = _quadMesh.getPinIndexFromPoint(p); - return _ref_qprime(i_pin) * _pin_power_correction(i_pin) * _axial_heat_rate.value(_t, P); - } - else - { - // project axial heat rate on subchannels - auto i_ch = _quadMesh.getSubchannelIndexFromPoint(p); - // if we are adjacent to the heated part of the fuel Pin - auto heat_rate = 0.0; - for (auto i_pin : _quadMesh.getChannelPins(i_ch)) - { - heat_rate += 0.25 * _ref_qprime(i_pin) * _pin_power_correction(i_pin) * - _axial_heat_rate.value(_t, P); - } - return heat_rate; - } + auto i_pin = _quadMesh.getPinIndexFromPoint(p); + return _ref_qprime(i_pin) * _pin_power_correction(i_pin) * _axial_heat_rate.value(_t, P); } else return 0.0; diff --git a/modules/subchannel/src/auxkernels/SCMTriPowerAux.C b/modules/subchannel/src/auxkernels/SCMTriPowerAux.C index 5f7fecabcba1..d7ffa1efc0e2 100644 --- a/modules/subchannel/src/auxkernels/SCMTriPowerAux.C +++ b/modules/subchannel/src/auxkernels/SCMTriPowerAux.C @@ -20,8 +20,8 @@ SCMTriPowerAux::validParams() { InputParameters params = AuxKernel::validParams(); params.addClassDescription( - "Computes axial power rate (W/m) that goes into the subchannel cells " - "or is assigned to the fuel pins, in a triangular lattice arrangement"); + "Computes axial power rate (W/m) assigned to the fuel pins in a triangular lattice " + "arrangement"); params.addRequiredParam( "power", "The postprocessor or Real to use for the total power of the subassembly [W]"); params.addRequiredParam( @@ -43,6 +43,9 @@ SCMTriPowerAux::SCMTriPowerAux(const InputParameters & parameters) { if (processor_id() > 0) return; + if (!_triMesh.pinMeshExist()) + mooseError(name(), ": This object requires a pin mesh."); + auto n_pins = _triMesh.getNumOfPins(); // Matrix sizing _power_dis.resize(n_pins, 1); @@ -159,53 +162,17 @@ Real SCMTriPowerAux::computeValue() { Point p = *_current_node; - auto heat_rate = 0.0; auto heated_length = _triMesh.getHeatedLength(); auto unheated_length_entry = _triMesh.getHeatedLengthEntry(); Point p1(0, 0, unheated_length_entry); Point P = p - p1; - auto pin_triMesh_exist = _triMesh.pinMeshExist(); /// assign power to the nodes located within the heated section if (MooseUtils::absoluteFuzzyGreaterEqual(p(2), unheated_length_entry) && MooseUtils::absoluteFuzzyLessEqual(p(2), unheated_length_entry + heated_length)) { - if (pin_triMesh_exist) - { - // project axial heat rate on pins - auto i_pin = _triMesh.getPinIndexFromPoint(p); - return _ref_qprime(i_pin) * _pin_power_correction(i_pin) * _axial_heat_rate.value(_t, P); - } - else - { - // Determine which subchannel this point is in. - auto i_ch = _triMesh.getSubchannelIndexFromPoint(p); - auto subch_type = _triMesh.getSubchannelType(i_ch); - // project axial heat rate on subchannels - { - double factor; - switch (subch_type) - { - case EChannelType::CENTER: - factor = 1.0 / 6.0; - break; - case EChannelType::EDGE: - factor = 1.0 / 4.0; - break; - case EChannelType::CORNER: - factor = 1.0 / 6.0; - break; - default: - return 0.0; // handle invalid subch_type if needed - } - for (auto i_pin : _triMesh.getChannelPins(i_ch)) - { - heat_rate += factor * _ref_qprime(i_pin) * _pin_power_correction(i_pin) * - _axial_heat_rate.value(_t, P); - } - return heat_rate; - } - } + auto i_pin = _triMesh.getPinIndexFromPoint(p); + return _ref_qprime(i_pin) * _pin_power_correction(i_pin) * _axial_heat_rate.value(_t, P); } else return 0.0; diff --git a/modules/subchannel/src/ics/SCMQuadPowerIC.C b/modules/subchannel/src/ics/SCMQuadPowerIC.C index 9c5bace348d8..ed5a3df2c576 100644 --- a/modules/subchannel/src/ics/SCMQuadPowerIC.C +++ b/modules/subchannel/src/ics/SCMQuadPowerIC.C @@ -21,8 +21,8 @@ InputParameters SCMQuadPowerIC::validParams() { InputParameters params = QuadSubChannelBaseIC::validParams(); - params.addClassDescription("Computes axial heat rate (W/m) that goes into the subchannel cells " - "or is assigned to the fuel pins, in a square lattice arrangement"); + params.addClassDescription("Computes axial heat rate (W/m) assigned to the fuel pins in a square " + "lattice arrangement"); // params.addRequiredParam("power", "The total power of the subassembly [W]"); params.addRequiredParam( "power", "The postprocessor or Real to use for the total power of the subassembly [W]"); @@ -46,13 +46,15 @@ SCMQuadPowerIC::SCMQuadPowerIC(const InputParameters & params) if (processor_id() > 0) return; - auto nx = _mesh.getNx(); - auto ny = _mesh.getNy(); + if (!_mesh.pinMeshExist()) + mooseError(name(), ": This object requires a pin mesh."); + + auto n_pins = _mesh.getNumOfPins(); auto heated_length = _mesh.getHeatedLength(); - _power_dis.resize((ny - 1) * (nx - 1), 1); + _power_dis.resize(n_pins, 1); _power_dis.setZero(); - _pin_power_correction.resize((ny - 1) * (nx - 1), 1); + _pin_power_correction.resize(n_pins, 1); _pin_power_correction.setOnes(); Real vin; @@ -68,8 +70,8 @@ SCMQuadPowerIC::SCMQuadPowerIC(const InputParameters & params) if (inFile.fail() && !inFile.eof()) mooseError(name(), " non numerical input at line : ", _numberoflines); - if (_numberoflines != (ny - 1) * (nx - 1)) - mooseError(name(), " Radial profile file doesn't have correct size : ", (ny - 1) * (nx - 1)); + if (_numberoflines != n_pins) + mooseError(name(), " Radial profile file doesn't have correct size : ", n_pins); inFile.close(); inFile.open(_filename); @@ -96,9 +98,7 @@ SCMQuadPowerIC::initialSetup() { if (processor_id() > 0) return; - auto nx = _mesh.getNx(); - auto ny = _mesh.getNy(); - auto n_pins = (nx - 1) * (ny - 1); + auto n_pins = _mesh.getNumOfPins(); auto nz = _mesh.getNumOfAxialCells(); auto z_grid = _mesh.getZGrid(); auto heated_length = _mesh.getHeatedLength(); @@ -169,31 +169,13 @@ SCMQuadPowerIC::value(const Point & p) auto unheated_length_entry = _mesh.getHeatedLengthEntry(); Point p1(0, 0, unheated_length_entry); Point P = p - p1; - auto pin_mesh_exist = _mesh.pinMeshExist(); /// assign power to the nodes located within the heated section if (MooseUtils::absoluteFuzzyGreaterEqual(p(2), unheated_length_entry) && MooseUtils::absoluteFuzzyLessEqual(p(2), unheated_length_entry + heated_length)) { - if (pin_mesh_exist) - { - // project axial heat rate on pins - auto i_pin = _mesh.getPinIndexFromPoint(p); - return _ref_qprime(i_pin) * _pin_power_correction(i_pin) * _axial_heat_rate.value(_t, P); - } - else - { - // project axial heat rate on subchannels - auto i_ch = _mesh.getSubchannelIndexFromPoint(p); - // if we are adjacent to the heated part of the fuel Pin - auto heat_rate = 0.0; - for (auto i_pin : _mesh.getChannelPins(i_ch)) - { - heat_rate += 0.25 * _ref_qprime(i_pin) * _pin_power_correction(i_pin) * - _axial_heat_rate.value(_t, P); - } - return heat_rate; - } + auto i_pin = _mesh.getPinIndexFromPoint(p); + return _ref_qprime(i_pin) * _pin_power_correction(i_pin) * _axial_heat_rate.value(_t, P); } else return 0.0; diff --git a/modules/subchannel/src/ics/SCMTriPowerIC.C b/modules/subchannel/src/ics/SCMTriPowerIC.C index a342e35ac0db..1730ae550597 100644 --- a/modules/subchannel/src/ics/SCMTriPowerIC.C +++ b/modules/subchannel/src/ics/SCMTriPowerIC.C @@ -19,8 +19,8 @@ SCMTriPowerIC::validParams() { InputParameters params = TriSubChannelBaseIC::validParams(); params.addClassDescription( - "Computes axial power rate (W/m) that goes into the subchannel cells " - "or is assigned to the fuel pins, in a triangular lattice arrangement"); + "Computes axial power rate (W/m) assigned to the fuel pins in a triangular lattice " + "arrangement"); params.addRequiredParam( "power", "The postprocessor or Real to use for the total power of the subassembly [W]"); params.addRequiredParam( @@ -42,6 +42,9 @@ SCMTriPowerIC::SCMTriPowerIC(const InputParameters & params) if (processor_id() > 0) return; + if (!_mesh.pinMeshExist()) + mooseError(name(), ": This object requires a pin mesh."); + auto n_pins = _mesh.getNumOfPins(); auto heated_length = _mesh.getHeatedLength(); @@ -157,53 +160,17 @@ SCMTriPowerIC::initialSetup() Real SCMTriPowerIC::value(const Point & p) { - auto heat_rate = 0.0; auto heated_length = _mesh.getHeatedLength(); auto unheated_length_entry = _mesh.getHeatedLengthEntry(); Point p1(0, 0, unheated_length_entry); Point P = p - p1; - auto pin_mesh_exist = _mesh.pinMeshExist(); /// assign power to the nodes located inside the heated section if (MooseUtils::absoluteFuzzyGreaterEqual(p(2), unheated_length_entry) && MooseUtils::absoluteFuzzyLessEqual(p(2), unheated_length_entry + heated_length)) { - if (pin_mesh_exist) - { - // project axial heat rate on pins - auto i_pin = _mesh.getPinIndexFromPoint(p); - return _ref_qprime(i_pin) * _pin_power_correction(i_pin) * _axial_heat_rate.value(_t, P); - } - else - { - // Determine which subchannel this point is in. - auto i_ch = _mesh.getSubchannelIndexFromPoint(p); - auto subch_type = _mesh.getSubchannelType(i_ch); - // project axial heat rate on subchannels - { - double factor; - switch (subch_type) - { - case EChannelType::CENTER: - factor = 1.0 / 6.0; - break; - case EChannelType::EDGE: - factor = 1.0 / 4.0; - break; - case EChannelType::CORNER: - factor = 1.0 / 6.0; - break; - default: - return 0.0; // handle invalid subch_type if needed - } - for (auto i_pin : _mesh.getChannelPins(i_ch)) - { - heat_rate += factor * _ref_qprime(i_pin) * _pin_power_correction(i_pin) * - _axial_heat_rate.value(_t, P); - } - return heat_rate; - } - } + auto i_pin = _mesh.getPinIndexFromPoint(p); + return _ref_qprime(i_pin) * _pin_power_correction(i_pin) * _axial_heat_rate.value(_t, P); } else return 0.0; diff --git a/modules/subchannel/src/meshgenerators/DetailedPinMeshGeneratorBase.C b/modules/subchannel/src/meshgenerators/DetailedPinMeshGeneratorBase.C deleted file mode 100644 index 97bb70e35b6f..000000000000 --- a/modules/subchannel/src/meshgenerators/DetailedPinMeshGeneratorBase.C +++ /dev/null @@ -1,96 +0,0 @@ -//* This file is part of the MOOSE framework -//* https://mooseframework.inl.gov -//* -//* All rights reserved, see COPYRIGHT for full restrictions -//* https://github.com/idaholab/moose/blob/master/COPYRIGHT -//* -//* Licensed under LGPL 2.1, please see LICENSE for details -//* https://www.gnu.org/licenses/lgpl-2.1.html - -#include "DetailedPinMeshGeneratorBase.h" -#include "libmesh/cell_prism6.h" - -InputParameters -DetailedPinMeshGeneratorBase::validParams() -{ - InputParameters params = MeshGenerator::validParams(); - params.addClassDescription( - "Base Class used to create the detailed pin mesh in a square lattice arrangement"); - params.addRequiredParam("pitch", "Pitch [m]"); - params.addRequiredParam("pin_diameter", "Rod diameter [m]"); - params.addParam("unheated_length_entry", 0.0, "Unheated length at entry [m]"); - params.addRequiredParam("heated_length", "Heated length [m]"); - params.addParam("unheated_length_exit", 0.0, "Unheated length at exit [m]"); - params.addRequiredParam("n_cells", "The number of cells in the axial direction"); - params.addParam("block_id", 1, "Block ID used for the mesh subdomain."); - params.addRangeCheckedParam("num_radial_parts", - 16, - "num_radial_parts>=4", - "Number of radial parts (must be at least 4)."); - return params; -} - -DetailedPinMeshGeneratorBase::DetailedPinMeshGeneratorBase(const InputParameters & parameters) - : MeshGenerator(parameters), - _unheated_length_entry(getParam("unheated_length_entry")), - _heated_length(getParam("heated_length")), - _unheated_length_exit(getParam("unheated_length_exit")), - _pitch(getParam("pitch")), - _pin_diameter(getParam("pin_diameter")), - _n_cells(getParam("n_cells")), - _block_id(getParam("block_id")), - _num_radial_parts(getParam("num_radial_parts")) -{ - Real L = _unheated_length_entry + _heated_length + _unheated_length_exit; - Real dz = L / _n_cells; - for (unsigned int i = 0; i < _n_cells + 1; i++) - _z_grid.push_back(dz * i); -} - -void -DetailedPinMeshGeneratorBase::generatePin(std::unique_ptr & mesh_base, - const Point & center) -{ - const Real dalpha = 360. / _num_radial_parts; - Real radius = _pin_diameter / 2.; - - // nodes - std::vector> nodes; - nodes.resize(_n_cells + 1); - for (unsigned int k = 0; k < _n_cells + 1; k++) - { - const Real elev = _z_grid[k]; - // center node - nodes[k].push_back(mesh_base->add_point(Point(center(0), center(1), elev))); - // ring around the center - Real alpha = 0.; - for (unsigned int i = 0; i < _num_radial_parts; i++, alpha += dalpha) - { - const Real dx = radius * std::cos(alpha * M_PI / 180.); - const Real dy = radius * std::sin(alpha * M_PI / 180.); - Point pt(center(0) + dx, center(1) + dy, elev); - nodes[k].push_back(mesh_base->add_point(pt)); - } - } - - // elements - for (unsigned int k = 0; k < _n_cells; k++) - { - for (unsigned int i = 0; i < _num_radial_parts; i++) - { - Elem * elem = new Prism6; - elem->subdomain_id() = _block_id; - elem->set_id(_elem_id++); - mesh_base->add_elem(elem); - const unsigned int ctr_idx = 0; - const unsigned int idx1 = (i % _num_radial_parts) + 1; - const unsigned int idx2 = ((i + 1) % _num_radial_parts) + 1; - elem->set_node(0, nodes[k][ctr_idx]); - elem->set_node(1, nodes[k][idx1]); - elem->set_node(2, nodes[k][idx2]); - elem->set_node(3, nodes[k + 1][ctr_idx]); - elem->set_node(4, nodes[k + 1][idx1]); - elem->set_node(5, nodes[k + 1][idx2]); - } - } -} diff --git a/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C b/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C index c7dcc272d9d1..8bede4ad1097 100644 --- a/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C +++ b/modules/subchannel/src/meshgenerators/SCMDetailedTriAssemblyMeshGenerator.C @@ -874,16 +874,3 @@ SCMDetailedTriAssemblyMeshGenerator::rotatePoint(Point b, Real theta) return rotated_vector; } - -Point -SCMDetailedTriAssemblyMeshGenerator::translatePoint(Point & b, Point & translation_vector) -{ - // Translating point - Point translated_vector = Point(0.0, 0.0, 0.0); - for (unsigned int i = 0; i < 3; i++) - { - translated_vector(i) = b(i) + translation_vector(i); - } - - return translated_vector; -} diff --git a/modules/subchannel/src/problems/QuadSubChannel1PhaseProblem.C b/modules/subchannel/src/problems/QuadSubChannel1PhaseProblem.C index 0358f6e4c3ed..23060c139e21 100644 --- a/modules/subchannel/src/problems/QuadSubChannel1PhaseProblem.C +++ b/modules/subchannel/src/problems/QuadSubChannel1PhaseProblem.C @@ -269,6 +269,9 @@ QuadSubChannel1PhaseProblem::computeBeta(unsigned int i_gap, unsigned int iz, bo Real QuadSubChannel1PhaseProblem::computeAddedHeatPin(unsigned int i_ch, unsigned int iz) const { + if (!_pin_mesh_exist) + return 0.0; + // Compute axial location of nodes. auto z2 = _z_grid[iz]; auto z1 = _z_grid[iz - 1]; @@ -279,25 +282,16 @@ QuadSubChannel1PhaseProblem::computeAddedHeatPin(unsigned int i_ch, unsigned int { // Compute the height of this element. auto dz = z2 - z1; - if (_pin_mesh_exist) - { - auto heat_rate_in = 0.0; - auto heat_rate_out = 0.0; - for (auto i_pin : _subchannel_mesh.getChannelPins(i_ch)) - { - auto * node_in = _subchannel_mesh.getPinNode(i_pin, iz - 1); - auto * node_out = _subchannel_mesh.getPinNode(i_pin, iz); - heat_rate_out += 0.25 * (*_q_prime_soln)(node_out); - heat_rate_in += 0.25 * (*_q_prime_soln)(node_in); - } - return (heat_rate_in + heat_rate_out) * dz / 2.0; - } - else + auto heat_rate_in = 0.0; + auto heat_rate_out = 0.0; + for (auto i_pin : _subchannel_mesh.getChannelPins(i_ch)) { - auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1); - auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz); - return ((*_q_prime_soln)(node_out) + (*_q_prime_soln)(node_in)) * dz / 2.0; + auto * node_in = _subchannel_mesh.getPinNode(i_pin, iz - 1); + auto * node_out = _subchannel_mesh.getPinNode(i_pin, iz); + heat_rate_out += 0.25 * (*_q_prime_soln)(node_out); + heat_rate_in += 0.25 * (*_q_prime_soln)(node_in); } + return (heat_rate_in + heat_rate_out) * dz / 2.0; } else return 0.0; diff --git a/modules/subchannel/src/problems/TriSubChannel1PhaseProblem.C b/modules/subchannel/src/problems/TriSubChannel1PhaseProblem.C index d474b94f7bab..412b813ad6ab 100644 --- a/modules/subchannel/src/problems/TriSubChannel1PhaseProblem.C +++ b/modules/subchannel/src/problems/TriSubChannel1PhaseProblem.C @@ -443,6 +443,9 @@ TriSubChannel1PhaseProblem::computeBeta(unsigned int i_gap, unsigned int iz, boo Real TriSubChannel1PhaseProblem::computeAddedHeatPin(unsigned int i_ch, unsigned int iz) const { + if (!_pin_mesh_exist) + return 0.0; + // Compute axial location of nodes. auto z2 = _z_grid[iz]; auto z1 = _z_grid[iz - 1]; @@ -453,41 +456,32 @@ TriSubChannel1PhaseProblem::computeAddedHeatPin(unsigned int i_ch, unsigned int { // Compute the height of this element. auto dz = z2 - z1; - if (_pin_mesh_exist) + double factor; + auto subch_type = _subchannel_mesh.getSubchannelType(i_ch); + switch (subch_type) { - double factor; - auto subch_type = _subchannel_mesh.getSubchannelType(i_ch); - switch (subch_type) - { - case EChannelType::CENTER: - factor = 1.0 / 6.0; - break; - case EChannelType::EDGE: - factor = 1.0 / 4.0; - break; - case EChannelType::CORNER: - factor = 1.0 / 6.0; - break; - default: - return 0.0; // handle invalid subch_type if needed - } - double heat_rate_in = 0.0; - double heat_rate_out = 0.0; - for (auto i_pin : _subchannel_mesh.getChannelPins(i_ch)) - { - auto * node_in = _subchannel_mesh.getPinNode(i_pin, iz - 1); - auto * node_out = _subchannel_mesh.getPinNode(i_pin, iz); - heat_rate_out += factor * (*_q_prime_soln)(node_out); - heat_rate_in += factor * (*_q_prime_soln)(node_in); - } - return (heat_rate_in + heat_rate_out) * dz / 2.0; + case EChannelType::CENTER: + factor = 1.0 / 6.0; + break; + case EChannelType::EDGE: + factor = 1.0 / 4.0; + break; + case EChannelType::CORNER: + factor = 1.0 / 6.0; + break; + default: + return 0.0; // handle invalid subch_type if needed } - else + double heat_rate_in = 0.0; + double heat_rate_out = 0.0; + for (auto i_pin : _subchannel_mesh.getChannelPins(i_ch)) { - auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1); - auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz); - return ((*_q_prime_soln)(node_out) + (*_q_prime_soln)(node_in)) * dz / 2.0; + auto * node_in = _subchannel_mesh.getPinNode(i_pin, iz - 1); + auto * node_out = _subchannel_mesh.getPinNode(i_pin, iz); + heat_rate_out += factor * (*_q_prime_soln)(node_out); + heat_rate_in += factor * (*_q_prime_soln)(node_in); } + return (heat_rate_in + heat_rate_out) * dz / 2.0; } else return 0.0; diff --git a/modules/subchannel/test/tests/mesh/detailed_tri_assembly/coords.i b/modules/subchannel/test/tests/mesh/detailed_tri_assembly/coords.i index 1f069bf87309..08358598a98c 100644 --- a/modules/subchannel/test/tests/mesh/detailed_tri_assembly/coords.i +++ b/modules/subchannel/test/tests/mesh/detailed_tri_assembly/coords.i @@ -10,6 +10,6 @@ [subchannel] type = SCMDetailedTriAssemblyMeshGenerator pin_diameter = 0.01 - verbose_flag = false + verbose_flag = true [] []