13 #include "MooseError.h"
28 params.addRequiredParam<std::vector<Real>>(
"cut_data",
29 "Vector of Real values providing cut information");
31 params.addClassDescription(
"Creates a UserObject for circular cuts on 3D meshes for XFEM");
40 const int cut_data_len = 9;
44 mooseError(
"Length of CircleCutUserObject cut_data must be 9");
53 _normal = rays.first.cross(rays.second);
56 std::pair<Real, Real> ray_radii =
57 std::make_pair(std::sqrt(rays.first.norm_sq()), std::sqrt(rays.second.norm_sq()));
59 if (std::abs(ray_radii.first - ray_radii.second) > 1e-10)
60 mooseError(
"CircleCutUserObject only works for a circular cut");
62 _radius = 0.5 * (ray_radii.first + ray_radii.second);
63 _angle = std::acos((rays.first * rays.second) / (ray_radii.first * ray_radii.second));
70 if (std::abs(ray *
_normal) < 1e-15 && std::sqrt(ray.norm_sq()) <
_radius)
75 const std::vector<Point>
78 std::vector<Point> crack_front_points(number_crack_front_points);
84 for (
unsigned int i = 0; i < number_crack_front_points; ++i)
86 Real theta = 2.0 * libMesh::pi / number_crack_front_points * i;
87 crack_front_points[i] =
91 return crack_front_points;