Line data Source code
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 "DetailedPinMeshGeneratorBase.h" 11 : #include "libmesh/cell_prism6.h" 12 : 13 : InputParameters 14 74 : DetailedPinMeshGeneratorBase::validParams() 15 : { 16 74 : InputParameters params = MeshGenerator::validParams(); 17 74 : params.addClassDescription( 18 : "Base Class used to create the detailed pin mesh in a square lattice arrangement"); 19 148 : params.addRequiredParam<Real>("pitch", "Pitch [m]"); 20 148 : params.addRequiredParam<Real>("pin_diameter", "Rod diameter [m]"); 21 148 : params.addParam<Real>("unheated_length_entry", 0.0, "Unheated length at entry [m]"); 22 148 : params.addRequiredParam<Real>("heated_length", "Heated length [m]"); 23 148 : params.addParam<Real>("unheated_length_exit", 0.0, "Unheated length at exit [m]"); 24 148 : params.addRequiredParam<unsigned int>("n_cells", "The number of cells in the axial direction"); 25 148 : params.addParam<unsigned int>("block_id", 1, "Block ID used for the mesh subdomain."); 26 222 : params.addRangeCheckedParam<unsigned int>("num_radial_parts", 27 148 : 16, 28 : "num_radial_parts>=4", 29 : "Number of radial parts (must be at least 4)."); 30 74 : return params; 31 0 : } 32 : 33 37 : DetailedPinMeshGeneratorBase::DetailedPinMeshGeneratorBase(const InputParameters & parameters) 34 : : MeshGenerator(parameters), 35 37 : _unheated_length_entry(getParam<Real>("unheated_length_entry")), 36 74 : _heated_length(getParam<Real>("heated_length")), 37 74 : _unheated_length_exit(getParam<Real>("unheated_length_exit")), 38 74 : _pitch(getParam<Real>("pitch")), 39 74 : _pin_diameter(getParam<Real>("pin_diameter")), 40 74 : _n_cells(getParam<unsigned int>("n_cells")), 41 74 : _block_id(getParam<unsigned int>("block_id")), 42 111 : _num_radial_parts(getParam<unsigned int>("num_radial_parts")) 43 : { 44 37 : Real L = _unheated_length_entry + _heated_length + _unheated_length_exit; 45 37 : Real dz = L / _n_cells; 46 762 : for (unsigned int i = 0; i < _n_cells + 1; i++) 47 725 : _z_grid.push_back(dz * i); 48 37 : } 49 : 50 : void 51 343 : DetailedPinMeshGeneratorBase::generatePin(std::unique_ptr<MeshBase> & mesh_base, 52 : const Point & center) 53 : { 54 343 : const Real dalpha = 360. / _num_radial_parts; 55 343 : Real radius = _pin_diameter / 2.; 56 : 57 : // nodes 58 : std::vector<std::vector<Node *>> nodes; 59 343 : nodes.resize(_n_cells + 1); 60 9474 : for (unsigned int k = 0; k < _n_cells + 1; k++) 61 : { 62 9131 : const Real elev = _z_grid[k]; 63 : // center node 64 9131 : nodes[k].push_back(mesh_base->add_point(Point(center(0), center(1), elev))); 65 : // ring around the center 66 : Real alpha = 0.; 67 155227 : for (unsigned int i = 0; i < _num_radial_parts; i++, alpha += dalpha) 68 : { 69 146096 : const Real dx = radius * std::cos(alpha * M_PI / 180.); 70 146096 : const Real dy = radius * std::sin(alpha * M_PI / 180.); 71 146096 : Point pt(center(0) + dx, center(1) + dy, elev); 72 146096 : nodes[k].push_back(mesh_base->add_point(pt)); 73 : } 74 : } 75 : 76 : // elements 77 9131 : for (unsigned int k = 0; k < _n_cells; k++) 78 : { 79 149396 : for (unsigned int i = 0; i < _num_radial_parts; i++) 80 : { 81 140608 : Elem * elem = new Prism6; 82 140608 : elem->subdomain_id() = _block_id; 83 140608 : elem->set_id(_elem_id++); 84 140608 : mesh_base->add_elem(elem); 85 : const unsigned int ctr_idx = 0; 86 140608 : const unsigned int idx1 = (i % _num_radial_parts) + 1; 87 140608 : const unsigned int idx2 = ((i + 1) % _num_radial_parts) + 1; 88 140608 : elem->set_node(0, nodes[k][ctr_idx]); 89 140608 : elem->set_node(1, nodes[k][idx1]); 90 140608 : elem->set_node(2, nodes[k][idx2]); 91 140608 : elem->set_node(3, nodes[k + 1][ctr_idx]); 92 140608 : elem->set_node(4, nodes[k + 1][idx1]); 93 140608 : elem->set_node(5, nodes[k + 1][idx2]); 94 : } 95 : } 96 343 : }