https://mooseframework.inl.gov
ReactorMeshParams.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #include "ReactorMeshParams.h"
11 #include "CastUniquePointer.h"
13 
14 // libMesh includes
15 #include "libmesh/mesh_generation.h"
16 #include "libmesh/unstructured_mesh.h"
17 #include "libmesh/replicated_mesh.h"
18 #include "libmesh/point.h"
19 #include "libmesh/elem.h"
20 #include "libmesh/node.h"
21 
23 
26 {
28  MooseEnum dims("2=2 3", "2");
29  params.addRequiredParam<MooseEnum>("dim", dims, "The dimension of the mesh to be generated");
30 
31  MooseEnum geoms("Square Hex", "Square");
32  params.addRequiredParam<MooseEnum>("geom", geoms, "The geometry type of the reactor mesh");
33 
34  params.addRequiredParam<Real>("assembly_pitch", "Center to center distance of assemblies");
35  params.addParam<boundary_id_type>("top_boundary_id",
36  "The boundary ID to set on top boundary of the extruded mesh");
37  params.addParam<boundary_id_type>(
38  "bottom_boundary_id", "The boundary ID to set on bottom boundary of the extruded mesh");
39  params.addParam<boundary_id_type>(
40  "radial_boundary_id",
41  "The boundary ID to set on the outer radial boundary of a CoreMeshGenerator object");
42  params.addParam<std::vector<Real>>("axial_regions", "Length of each axial region");
43  params.addParam<std::vector<unsigned int>>(
44  "axial_mesh_intervals",
45  "Number of elements in the Z direction for each axial region");
46  params.addParam<bool>("region_id_as_block_name", false, "Set block names based on region id");
47  params.addParam<bool>(
48  "flexible_assembly_stitching",
49  false,
50  "Use FlexiblePatternGenerator for stitching dissimilar assemblies together");
51  params.addRangeCheckedParam<unsigned int>(
52  "num_sectors_at_flexible_boundary",
53  6,
54  "num_sectors_at_flexible_boundary>2",
55  "Number of sectors to use at assembly boundary interface when flexible patterning is used "
56  "(Defaults to 6)");
57  params.addClassDescription("This ReactorMeshParams object acts as storage for persistent "
58  "information about the reactor geometry.");
59 
60  // Declare that this generator has a generateData method
62  return params;
63 }
64 
66  : MeshGenerator(parameters),
67  _dim(getParam<MooseEnum>("dim")),
68  _geom(getParam<MooseEnum>("geom")),
69  _assembly_pitch(getParam<Real>("assembly_pitch"))
70 {
71  if ((unsigned int)(_dim) == 2)
72  {
73  std::vector<std::string> invalid_params = {
74  "axial_regions", "axial_mesh_intervals", "top_boundary_id", "bottom_boundary_id"};
75  for (const auto & param : invalid_params)
76  if (isParamValid(param))
77  paramError(param, param + " should not be defined for 2-D meshes");
78  }
79  else
80  {
81  _axial_regions = getParam<std::vector<Real>>("axial_regions");
82  _axial_mesh_intervals = getParam<std::vector<unsigned int>>("axial_mesh_intervals");
83 
84  if (_axial_regions.size() != _axial_mesh_intervals.size())
85  mooseError(
86  "The number of axial regions is not consistent with the number of axial intervals.");
88  this->declareMeshProperty(RGMB::axial_mesh_intervals, _axial_mesh_intervals);
89  }
90 
91  this->declareMeshProperty(RGMB::mesh_dimensions, (unsigned int)std::stoul(_dim));
92  this->declareMeshProperty(RGMB::mesh_geometry, std::string(_geom));
95  getParam<bool>(RGMB::region_id_as_block_name));
96 
98  this->declareMeshProperty(RGMB::flexible_assembly_stitching, flexible_assembly_stitching);
101  getParam<unsigned int>("num_sectors_at_flexible_boundary"));
102  if (parameters.isParamSetByUser("num_sectors_at_flexible_boundary") &&
104  paramWarning(
105  "num_sectors_at_flexible_boundary",
106  "This parameter is only relevant when ReactorMeshParams/flexible_assembly_stitching is set "
107  "to true. This value will be ignored");
108 
109  // Option to bypass mesh generation is controlled by presence of Mesh/data_driven_generator
110  // and whether the current generator is in data only mode
111  const auto & moose_mesh = _app.actionWarehouse().getMesh();
112  const auto data_driven_generator =
113  moose_mesh->parameters().get<std::string>("data_driven_generator");
114  bool bypass_meshgen = (data_driven_generator != "") && isDataOnly();
115  this->declareMeshProperty(RGMB::bypass_meshgen, bypass_meshgen);
116 
117  if (isParamValid("top_boundary_id"))
118  {
119  _top_boundary = getParam<boundary_id_type>("top_boundary_id");
121  }
122  if (isParamValid("bottom_boundary_id"))
123  {
124  _bottom_boundary = getParam<boundary_id_type>("bottom_boundary_id");
126  }
127  if (isParamValid("radial_boundary_id"))
128  {
129  _radial_boundary = getParam<boundary_id_type>("radial_boundary_id");
131  if (isParamValid("top_boundary_id") && _radial_boundary == _top_boundary)
132  mooseError("top_boundary_id and radial_boundary_id must be unique values");
133  if (isParamValid("bottom_boundary_id") && _radial_boundary == _bottom_boundary)
134  mooseError("bottom_boundary_id and radial_boundary_id must be unique values");
135  }
136  if (isParamValid("top_boundary_id") && isParamValid("bottom_boundary_id") &&
138  mooseError("top_boundary_id and bottom_boundary_id must be unique values");
139 }
140 
141 std::unique_ptr<MeshBase>
143 {
144  // If mesh generation is requested and bypass_mesh is true, return a null mesh. generate()
145  // mesh should not be called with this option specified
146  if (getMeshProperty<bool>(RGMB::bypass_meshgen))
147  {
148  auto null_mesh = nullptr;
149  return null_mesh;
150  }
151  auto mesh = buildMeshBaseObject();
152  return dynamic_pointer_cast<MeshBase>(mesh);
153 }
A class to store mesh information that is globally applicable to a reactor.
static const std::string region_id_as_block_name
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const MooseEnum _geom
The geometry type for the reactor.
const std::shared_ptr< MooseMesh > & getMesh() const
ReactorMeshParams(const InputParameters &parameters)
static const std::string mesh_geometry
MeshBase & mesh
std::unique_ptr< MeshBase > generate() override
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
static const std::string axial_mesh_sizes
static const std::string assembly_pitch
static const std::string radial_boundary_id
void addRequiredParam(const std::string &name, const std::string &doc_string)
bool isParamValid(const std::string &name) const
static InputParameters validParams()
boundary_id_type _bottom_boundary
Boundary id assigned to bottom boundary of extruded mesh.
int8_t boundary_id_type
static const std::string mesh_dimensions
boundary_id_type _radial_boundary
Boundary id assigned to outer radial boundary of core mesh.
const Real _assembly_pitch
The the flat-to-flat size of assemblies in the reactor.
ActionWarehouse & actionWarehouse()
static const std::string top_boundary_id
void paramError(const std::string &param, Args... args) const
static InputParameters validParams()
std::vector< unsigned int > _axial_mesh_intervals
The number of mesh divisions in each axial region.
registerMooseObject("ReactorApp", ReactorMeshParams)
bool isParamSetByUser(const std::string &name) const
const MooseEnum _dim
The number of dimension in the mesh.
static const std::string flexible_assembly_stitching
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
MooseApp & _app
static const std::string axial_mesh_intervals
boundary_id_type _top_boundary
Boundary id assigned to top boundary of extruded mesh.
void mooseError(Args &&... args) const
static void setHasGenerateData(InputParameters &params)
void addClassDescription(const std::string &doc_string)
const InputParameters & parameters() const
T & declareMeshProperty(const std::string &data_name, Args &&... args)
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
void paramWarning(const std::string &param, Args... args) const
static const std::string bypass_meshgen
std::unique_ptr< MeshBase > buildMeshBaseObject(unsigned int dim=libMesh::invalid_uint)
bool isDataOnly() const
static const std::string num_sectors_flexible_stitching
static const std::string bottom_boundary_id
std::vector< Real > _axial_regions
The heights of the axial regions.