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