21 params.
addRequiredParam<Point>(
"position",
"Start position of axis in 3-D space [m]");
24 "Direction of axis from start position to end position (no need to normalize)");
25 params.
addParam<
Real>(
"rotation", 0.0,
"Angle of rotation about the x-axis [degrees]");
26 params.
addRequiredParam<std::vector<Real>>(
"length",
"Length of each axial section [m]");
28 "Number of elements in each axial section");
34 : _position(moose_object->parameters().
get<Point>(
"position")),
36 _dir(initializeDirectionVector(_dir_unnormalized)),
37 _rotation(moose_object->parameters().
get<
Real>(
"rotation")),
38 _lengths(moose_object->parameters().
get<
std::vector<
Real>>(
"length")),
39 _length(
std::accumulate(_lengths.begin(), _lengths.end(), 0.0)),
40 _end_point(_position + _dir * _length),
41 _n_elems(moose_object->parameters().
get<
std::vector<unsigned
int>>(
"n_elems")),
42 _n_elem(
std::accumulate(_n_elems.begin(), _n_elems.end(), 0)),
43 _n_sections(_lengths.size()),
44 _section_end(_n_sections),
46 _R(computeDirectionTransformationTensor(_dir)),
47 _Rx(computeXRotationTransformationTensor(_rotation)),
50 _moose_object_name_dlsi(moose_object->
name())
55 mooseError(
"The parameters 'length' and 'n_elems' must have the same number of entries.");
58 unsigned int k_section_begin = 0;
60 _dx_min = std::numeric_limits<Real>::max();
65 for (
unsigned int i = 0; i <
_n_elems[
j]; i++)
67 const unsigned int k = k_section_begin + i;
78 if (!MooseUtils::absoluteFuzzyEqual(dir_unnormalized.
norm(), 0.0))
79 return dir_unnormalized / dir_unnormalized.
norm();
81 mooseError(
"The parameter 'orientation' must not be the zero vector.");
87 if (MooseUtils::absoluteFuzzyEqual(dir.
norm(), 0.0))
88 mooseError(
"The direction vector must not be the zero vector.");
90 const auto dir_normalized = dir / dir.
norm();
91 const Real theta = acos(dir_normalized(2));
92 const Real aphi = atan2(dir_normalized(1), dir_normalized(0));
102 const Real rotation_rad = M_PI * rotation / 180.;
113 if (MooseUtils::absoluteFuzzyLessThan(ax_coord, 0.0) ||
114 MooseUtils::absoluteFuzzyGreaterThan(ax_coord,
_length))
118 " has an invalid axial coordinate (",
120 "). Valid axial coordinates are in the range (0,",
131 return v.cross(
_dir).norm();
139 if (MooseUtils::absoluteFuzzyLessEqual(axial_coordinate,
_section_end[i]))
142 mooseError(
"No axial section index was found.");
149 for (
unsigned int i = 0; i <
_n_elem; ++i)
150 if (MooseUtils::absoluteFuzzyEqual(axial_coordinate,
_x_centers[i]))
153 mooseError(
"No axial element index was found.");
162 return R * (Rx *
p) + position;
177 return Rx_inv * R_inv * (
p - position);
210 const Real & rotation,
211 const std::vector<Real> & lengths,
212 const std::vector<unsigned int> & n_elems)
219 else if (
axis ==
"y")
221 else if (
axis ==
"z")
229 const unsigned int n_elems_total = std::accumulate(n_elems.begin(), n_elems.end(), 0);
230 const unsigned int n_sections = lengths.size();
232 unsigned int i_section_start = 0;
233 Real section_start_ref_position = 0.0;
234 std::vector<Real> element_boundary_coordinates(n_elems_total + 1);
235 element_boundary_coordinates[0] =
237 for (
unsigned int j = 0;
j < n_sections; ++
j)
239 const Real section_dx = lengths[
j] / n_elems[
j];
240 for (
unsigned int k = 0;
k < n_elems[
j]; ++
k)
242 const unsigned int i = i_section_start +
k + 1;
243 const Real ref_position = section_start_ref_position + section_dx *
k;
244 const Point ref_point = Point(ref_position, 0, 0);
245 element_boundary_coordinates[i] =
249 section_start_ref_position += lengths[
j];
250 i_section_start += n_elems[
j];
253 return element_boundary_coordinates;
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sin(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tan
Real _length
Total axial length.
void mooseError(Args &&... args)
Real computeAxialCoordinate(const Point &p) const
unsigned int getAxialSectionIndex(const Point &p) const
static RealTensorValue computeXRotationTransformationTensor(const Real &rotation)
Computes the rotation transformation tensor.
const RealTensorValue _Rx_inv
Inverse rotational transformation tensor about x-axis.
std::vector< Real > _lengths
Length of each axial section.
static RealTensorValue computeDirectionTransformationTensor(const RealVectorValue &dir)
Computes the direction transformation tensor.
static const std::string axis
bool areParallelVectors(const RealVectorValue &a, const RealVectorValue &b, const Real &tol=libMesh::TOLERANCE *libMesh::TOLERANCE)
Tests if two real-valued vectors are parallel within some absolute tolerance.
const Real & _rotation
Angle of rotation about the x-axis.
Real _dx_min
Minimum element size.
const RealVectorValue _dir
Normalized direction of axis from start position to end position.
TensorValue< Real > RealTensorValue
std::vector< Real > _section_end
Axial coordinate of the end of each axial section using the line 'position' as the origin...
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template cos(_arg) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(cos
unsigned int _n_elem
Total number of axial elements.
const unsigned int _n_sections
Number of axial sections.
const Point & _position
Start position of axis in 3-D space.
Real computeRadialCoordinate(const Point &p) const
Point computeReferencePointFromRealPoint(const Point &p) const
Computes point in reference space from a point in 3-D space.
static InputParameters validParams()
const RealTensorValue _R_inv
Inverse direction transformation tensor.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const RealTensorValue _Rx
Rotational transformation tensor about x-axis.
const RealTensorValue _R
Direction transformation tensor.
MooseEnum getAlignmentAxis() const
Gets an axis MooseEnum for the axis the component is aligned with.
unsigned int getAxialElementIndex(const Point &p_center) const
std::vector< unsigned int > _n_elems
Number of elements in each axial section.
const std::string _moose_object_name_dlsi
Name of the MOOSE object.
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
DiscreteLineSegmentInterface(const MooseObject *moose_object)
static RealVectorValue initializeDirectionVector(const RealVectorValue &dir_unnormalized)
Computes a normalized direction vector or reports an error if the zero vector is provided.
std::vector< Real > getElementBoundaryCoordinates() const
Gets the element boundary coordinates for the aligned axis.
Point computeRealPointFromReferencePoint(const Point &p) const
Computes point in 3-D space from a point in reference space.
static const std::string k
std::vector< Real > _x_centers
Center axial coordinate of each axial element.
void ErrorVector unsigned int
const Elem & get(const ElemType type_in)