https://mooseframework.inl.gov
Loading...
Searching...
No Matches
CircleCutUserObject.C
Go to the documentation of this file.
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 "CircleCutUserObject.h"
11
12// MOOSE includes
13#include "MooseError.h"
14
15// XFEM includes
16#include "XFEMFuncs.h"
17
19
22{
23 // Get input parameters from parent class
25
26 // Add required parameters
27 params.addRequiredParam<std::vector<Real>>("cut_data",
28 "Vector of Real values providing cut information");
29 // Class description
30 params.addClassDescription("Creates a UserObject for circular cuts on 3D meshes for XFEM");
31 // Return the parameters
32 return params;
33}
34
36 : GeometricCut3DUserObject(parameters), _cut_data(getParam<std::vector<Real>>("cut_data"))
37{
38 // Set up constant parameters
39 const int cut_data_len = 9;
40
41 // Throw error if length of cut_data is incorrect
42 if (_cut_data.size() != cut_data_len)
43 mooseError("Length of CircleCutUserObject cut_data must be 9");
44
45 // Assign cut_data to vars used to construct cuts
46 _center = Point(_cut_data[0], _cut_data[1], _cut_data[2]);
47 _vertices.push_back(Point(_cut_data[3], _cut_data[4], _cut_data[5]));
48 _vertices.push_back(Point(_cut_data[6], _cut_data[7], _cut_data[8]));
49
50 std::pair<Point, Point> rays = std::make_pair(_vertices[0] - _center, _vertices[1] - _center);
51
52 _normal = rays.first.cross(rays.second);
54
55 std::pair<Real, Real> ray_radii =
56 std::make_pair(std::sqrt(rays.first.norm_sq()), std::sqrt(rays.second.norm_sq()));
57
58 if (std::abs(ray_radii.first - ray_radii.second) > 1e-10)
59 mooseError("CircleCutUserObject only works for a circular cut");
60
61 _radius = 0.5 * (ray_radii.first + ray_radii.second);
62 _angle = std::acos((rays.first * rays.second) / (ray_radii.first * ray_radii.second));
63}
64
65bool
67{
68 Point ray = p - _center;
69 if (std::abs(ray * _normal) < 1e-15 && std::sqrt(ray.norm_sq()) < _radius)
70 return true;
71 return false;
72}
73
74const std::vector<Point>
75CircleCutUserObject::getCrackFrontPoints(unsigned int number_crack_front_points) const
76{
77 std::vector<Point> crack_front_points(number_crack_front_points);
78 Point v1 = _vertices[0] - _center;
79 Point v2 = _normal.cross(v1);
80 v1 /= v1.norm();
81 v2 /= v2.norm();
82 // parametric circle in 3D: center + r * cos(theta) * v1 + r * sin(theta) * v2
83 for (unsigned int i = 0; i < number_crack_front_points; ++i)
84 {
85 Real theta = 2.0 * libMesh::pi / number_crack_front_points * i;
86 crack_front_points[i] =
87 _center + _radius * std::cos(theta) * v1 + _radius * std::sin(theta) * v2;
88 }
89
90 return crack_front_points;
91}
92
93const std::vector<RealVectorValue>
94CircleCutUserObject::getCrackPlaneNormals(unsigned int /*num_crack_front_points*/) const
95{
96 mooseError("getCrackPlaneNormals() is not implemented for this object.");
97}
registerMooseObject("XFEMApp", CircleCutUserObject)
const Real p
virtual const std::vector< RealVectorValue > getCrackPlaneNormals(unsigned int num_crack_front_points) const override
get a set of normal vectors along a crack front from a XFEM GeometricCutUserObject
virtual const std::vector< Point > getCrackFrontPoints(unsigned int num_crack_front_points) const override
get a set of points along a crack front from a XFEM GeometricCutUserObject
virtual bool isInsideCutPlane(Point p) const override
CircleCutUserObject(const InputParameters &parameters)
static InputParameters validParams()
std::vector< Point > _vertices
std::vector< Real > _cut_data
static InputParameters validParams()
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
void mooseError(Args &&... args) const
TypeVector< typename CompareTypes< Real, T2 >::supertype > cross(const TypeVector< T2 > &v) const
void normalizePoint(Point &p)
Definition XFEMFuncs.C:621
const Real pi