24 "The SolutionUserObject to extract data from.");
25 params.
addParam<std::vector<std::string>>(
27 "The names of the variables in the file that are to be extracted, in x, y " 28 "order if they are vector components");
33 "Scale factor (a) to be applied to the solution (x): ax+b, where b is the 'add_factor'");
37 "Add this value (b) to the solution (x): ax+b, where a is the 'scale_factor'");
40 "Ratio of the axial dimension in the 3d model to that in the 2d model. " 41 "Optionally permits the 3d model to be larger than the 2d model in that " 42 "dimension, and scales vector solutions in that direction by this factor.");
46 "Start point for axis of symmetry for the 2d model");
49 "End point for axis of symmetry for the 2d model");
52 "Start point for axis of symmetry for the 3d model");
55 "End point for axis of symmetry for the 3d model");
57 params.
addParam<
unsigned int>(
"component",
58 "Component of the variable to be computed if it is a vector");
61 "mapping it to a 3D Cartesian model");
69 _solution_object_ptr(NULL),
70 _scale_factor(getParam<
Real>(
"scale_factor")),
71 _add_factor(getParam<
Real>(
"add_factor")),
72 _axial_dim_ratio(getParam<
Real>(
"axial_dimension_ratio")),
77 _has_component(isParamValid(
"component")),
78 _component(_has_component ? getParam<unsigned
int>(
"component") : 99999),
79 _var_names(getParam<
std::vector<
std::string>>(
"from_variables"))
82 mooseError(
"Must supply names of 2 variables in 'from_variables' if 'component' is specified");
84 mooseError(
"Must supply 'component' if 2 variables specified in 'from_variables'");
86 mooseError(
"If 'from_variables' is specified, it must have either 1 (scalar) or 2 (vector " 87 "components) variables");
99 mooseError(
"3d_axis_point1 and 3d_axis_point2 must be different points");
101 mooseError(
"2d_axis_point1 and 2d_axis_point2 must be different points");
120 mooseError(
"If the SolutionUserObject contains multiple variables, the variable name must be " 121 "specified in the input file with 'from_variables'");
127 mooseError(
"3rd component of 2d_axis_point1 must be zero");
129 mooseError(
"3rd component of 2d_axis_point2 must be zero");
132 for (
unsigned int i = 0; i <
_var_names.size(); ++i)
144 bool r_gt_zero =
false;
152 Real r = r_dir_3d.norm();
159 xypoint(0) =
std::sqrt(p(0) * p(0) + p(2) * p(2));
166 z_dir_3d /= z_dir_3d.
norm();
168 Real z = z_dir_3d * v3dp1p;
170 Point axis_proj_to_p = p - axis_proj;
171 Real r = axis_proj_to_p.norm();
175 r_dir_3d = axis_proj_to_p / r;
180 z_dir_2d /= z_dir_2d.
norm();
181 Point out_of_plane_vec(0, 0, 1);
182 r_dir_2d = z_dir_2d.cross(out_of_plane_vec);
183 r_dir_2d /= r_dir_2d.norm();
195 val_vec_rz(0) = r_dir_2d(0) * val_x + r_dir_2d(1) * val_y;
196 val_vec_rz(1) = z_dir_2d(0) * val_x + z_dir_2d(1) * val_y;
198 mooseError(
"In Axisymmetric2D3DSolutionFunction r=0 and r component of value vector != 0");
199 Point val_vec_3d = val_vec_rz(0) * r_dir_3d + val_vec_rz(1) * z_dir_3d;
const Real _add_factor
Factor to add to the solution (default = 0)
Base class for function objects.
auto norm() const -> decltype(std::norm(Real()))
bool absoluteFuzzyEqual(const T &var1, const T2 &var2, const T3 &tol=libMesh::TOLERANCE *libMesh::TOLERANCE)
Function to check whether two variables are equal within an absolute tolerance.
const RealVectorValue _3d_axis_point2
std::vector< unsigned int > _solution_object_var_indices
The local SolutionUserObject indices for the variables extracted from the file.
const RealVectorValue _2d_axis_point2
Axisymmetric2D3DSolutionFunction(const InputParameters ¶meters)
const unsigned int _component
The index of the component.
const RealVectorValue _2d_axis_point1
Two points that define the axis of rotation for the 2d model.
const RealVectorValue _3d_axis_point1
Two points that define the axis of rotation for the 3d model.
static InputParameters validParams()
Constructor.
virtual Real value(Real t, const Point &p) const override
Override this to evaluate the scalar function at point (t,x,y,z), by default this returns zero...
const SolutionUserObjectBase * _solution_object_ptr
Pointer to SolutionUserObject containing the solution of interest.
bool _default_axes
Are the default axes of rotation being used?
std::vector< std::string > _var_names
The variable names to extract from the file.
Function for reading a 2D axisymmetric solution from file and mapping it to a 3D Cartesian system...
const Real _axial_dim_ratio
Ratio of axial dimension of 3d model to its counterpart in the 2d model.
virtual void initialSetup() override
Setup the function for use Gathers a pointer to the SolutionUserObject containing the solution that w...
const std::vector< std::string > & variableNames() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
const bool _has_component
If the solution field is a vector, the desired component must be specified Has the component been spe...
registerMooseObject("MooseApp", Axisymmetric2D3DSolutionFunction)
static InputParameters validParams()
Class constructor.
const Real _scale_factor
Factor to scale the solution by (default = 1)
bool relative_fuzzy_equals(const TypeVector< Real > &rhs, Real tol=TOLERANCE) const
void ErrorVector unsigned int
Real pointValue(Real t, const Point &p, const unsigned int local_var_index, const std::set< subdomain_id_type > *subdomain_ids=nullptr) const
Returns a value at a specific location and variable (see SolutionFunction)
bool absoluteFuzzyGreaterThan(const T &var1, const T2 &var2, const T3 &tol=libMesh::TOLERANCE *libMesh::TOLERANCE)
Function to check whether a variable is greater than another variable within an absolute tolerance...
unsigned int getLocalVarIndex(const std::string &var_name) const
Returns the local index for a given variable name.