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 "RZSymmetry.h" 11 : #include "BlockRestrictable.h" 12 : #include "BoundaryRestrictable.h" 13 : #include "FEProblemBase.h" 14 : #include "libmesh/point.h" 15 : 16 : InputParameters 17 4170 : RZSymmetry::validParams() 18 : { 19 4170 : InputParameters params = emptyInputParameters(); 20 8340 : params.addRequiredParam<Point>("axis_point", "A point on the axis of RZ symmetry."); 21 8340 : params.addRequiredParam<RealVectorValue>("axis_dir", "The direction of the axis of RZ symmetry."); 22 8340 : params.addParam<Real>("offset", 0., "Radial offset of the axis of RZ symmetry."); 23 4170 : return params; 24 0 : } 25 : 26 2073 : RZSymmetry::RZSymmetry(const MooseObject * moose_object, const InputParameters & parameters) 27 : : _axis_point(0., 0., 0.), 28 2073 : _axis_dir(parameters.get<RealVectorValue>("axis_dir")), 29 2073 : _offset(parameters.get<Real>("offset")) 30 : { 31 : const FEProblemBase * fe_problem = 32 2073 : moose_object->isParamValid("_fe_problem_base") 33 6219 : ? moose_object->getParam<FEProblemBase *>("_fe_problem_base") 34 : : nullptr; 35 2073 : if (fe_problem != nullptr) 36 : { 37 2073 : const MooseMesh & mesh = fe_problem->mesh(); 38 : 39 2073 : const BlockRestrictable * blk_restr = dynamic_cast<const BlockRestrictable *>(moose_object); 40 : const BoundaryRestrictable * bnd_restr = 41 2073 : dynamic_cast<const BoundaryRestrictable *>(moose_object); 42 : 43 2073 : if (blk_restr != nullptr) 44 : { 45 1743 : const std::set<SubdomainID> & blks = blk_restr->meshBlockIDs(); 46 : 47 6776 : for (auto & b : blks) 48 : { 49 5035 : if (fe_problem->getCoordSystem(b) != Moose::COORD_XYZ) 50 2 : mooseError( 51 : moose_object->name(), 52 : ": This is a THM-specific object can be applied only on subdomains with Cartesian " 53 : "coordinate system. If your domain has RZ cooridnate system associated with it, you " 54 : "need to use the object without the RZ suffix to obtain the desired result."); 55 : } 56 : } 57 2071 : if (bnd_restr != nullptr) 58 : { 59 : std::set<SubdomainID> blks; 60 330 : const std::set<BoundaryID> & bnds = bnd_restr->boundaryIDs(); 61 660 : for (auto & bid : bnds) 62 : { 63 330 : std::set<SubdomainID> conn_blks = mesh.getBoundaryConnectedBlocks(bid); 64 660 : for (auto & cb : conn_blks) 65 330 : blks.insert(cb); 66 : } 67 : 68 658 : for (auto & b : blks) 69 : { 70 330 : if (fe_problem->getCoordSystem(b) != Moose::COORD_XYZ) 71 2 : mooseError( 72 : moose_object->name(), 73 : ": This is a THM-specific object can be applied only on subdomains with Cartesian " 74 : "coordinate system. If your domain has RZ cooridnate system associated with it, you " 75 : "need to use the object without the RZ suffix to obtain the desired result."); 76 : } 77 : } 78 : } 79 : 80 2069 : const Point pt = parameters.get<Point>("axis_point"); 81 2069 : _axis_point = Point(pt(0), pt(1), pt(2)); 82 2069 : } 83 : 84 : Real 85 20907482 : RZSymmetry::computeCircumference(const RealVectorValue & pt) 86 : { 87 : RealVectorValue v = (pt - _axis_point); 88 20907482 : const Real r = v.cross(_axis_dir).norm() / _axis_dir.norm(); 89 20907482 : return 2 * libMesh::pi * (r + _offset); 90 : }