www.mooseframework.org
EllipseCutUserObject.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 "EllipseCutUserObject.h"
11 
12 // MOOSE includes
13 #include "MooseError.h"
14 
15 // XFEM includes
16 #include "XFEMFuncs.h"
17 
19 
20 template <>
21 InputParameters
23 {
24  // Get input parameters from parent class
25  InputParameters params = validParams<GeometricCut3DUserObject>();
26 
27  // Add required parameters
28  params.addRequiredParam<std::vector<Real>>("cut_data",
29  "Vector of Real values providing cut information");
30  // Class description
31  params.addClassDescription("Creates a UserObject for elliptical cuts on 3D meshes for XFEM");
32  // Return the parameters
33  return params;
34 }
35 
36 EllipseCutUserObject::EllipseCutUserObject(const InputParameters & parameters)
37  : GeometricCut3DUserObject(parameters), _cut_data(getParam<std::vector<Real>>("cut_data"))
38 {
39  // Set up constant parameters
40  const int cut_data_len = 9;
41 
42  // Throw error if length of cut_data is incorrect
43  if (_cut_data.size() != cut_data_len)
44  mooseError("Length of EllipseCutUserObject cut_data must be 9");
45 
46  // Assign cut_data to vars used to construct cuts
47  _center = Point(_cut_data[0], _cut_data[1], _cut_data[2]);
48  _vertices.push_back(Point(_cut_data[3], _cut_data[4], _cut_data[5]));
49  _vertices.push_back(Point(_cut_data[6], _cut_data[7], _cut_data[8]));
50 
51  std::pair<Point, Point> rays = std::make_pair(_vertices[0] - _center, _vertices[1] - _center);
52 
53  if (std::abs(rays.first * rays.second) > 1e-6)
54  mooseError(
55  "EllipseCutUserObject only works on an elliptic cut. Users should provide two points at "
56  "the long and short axis.");
57 
58  _normal = rays.first.cross(rays.second);
60 
61  std::pair<Real, Real> ray_radii =
62  std::make_pair(std::sqrt(rays.first.norm_sq()), std::sqrt(rays.second.norm_sq()));
63 
64  // Determine which the long and short axes
65  if (ray_radii.first > ray_radii.second)
66  {
67  _unit_vec1 = rays.first;
68  _unit_vec2 = rays.second;
69  _long_axis = ray_radii.first;
70  _short_axis = ray_radii.second;
71  }
72  else
73  {
74  _unit_vec1 = rays.second;
75  _unit_vec2 = rays.first;
76  _long_axis = ray_radii.second;
77  _short_axis = ray_radii.first;
78  }
79 
82 }
83 
84 bool
86 {
87  Point ray = p - _center;
88  if (std::abs(ray * _normal) < 1e-6)
89  {
90  std::pair<Real, Real> xy_loc = std::make_pair(ray * _unit_vec1, ray * _unit_vec2);
91 
92  if (std::sqrt(xy_loc.first * xy_loc.first / (_long_axis * _long_axis) +
93  xy_loc.second * xy_loc.second / (_short_axis * _short_axis)) < 1)
94  return true;
95  }
96  return false;
97 }
98 
99 const std::vector<Point>
100 EllipseCutUserObject::getCrackFrontPoints(unsigned int /*num_crack_front_points*/) const
101 {
102  mooseError("getCrackFrontPoints() is not implemented for this object.");
103 }
EllipseCutUserObject::_cut_data
std::vector< Real > _cut_data
Definition: EllipseCutUserObject.h:29
EllipseCutUserObject::_vertices
std::vector< Point > _vertices
Definition: EllipseCutUserObject.h:32
EllipseCutUserObject::_unit_vec1
Point _unit_vec1
Definition: EllipseCutUserObject.h:33
GeometricCut3DUserObject
Definition: GeometricCut3DUserObject.h:21
EllipseCutUserObject
Definition: EllipseCutUserObject.h:20
registerMooseObject
registerMooseObject("XFEMApp", EllipseCutUserObject)
EllipseCutUserObject::getCrackFrontPoints
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
Definition: EllipseCutUserObject.C:100
EllipseCutUserObject::_long_axis
Real _long_axis
Definition: EllipseCutUserObject.h:35
XFEMFuncs.h
EllipseCutUserObject::EllipseCutUserObject
EllipseCutUserObject(const InputParameters &parameters)
Definition: EllipseCutUserObject.C:36
validParams< EllipseCutUserObject >
InputParameters validParams< EllipseCutUserObject >()
Definition: EllipseCutUserObject.C:22
EllipseCutUserObject::_unit_vec2
Point _unit_vec2
Definition: EllipseCutUserObject.h:34
EllipseCutUserObject.h
EllipseCutUserObject::_short_axis
Real _short_axis
Definition: EllipseCutUserObject.h:36
EllipseCutUserObject::isInsideCutPlane
virtual bool isInsideCutPlane(Point p) const override
Definition: EllipseCutUserObject.C:85
GeometricCut3DUserObject::_normal
Point _normal
Definition: GeometricCut3DUserObject.h:43
Xfem::normalizePoint
void normalizePoint(Point &p)
Definition: XFEMFuncs.C:621
validParams< GeometricCut3DUserObject >
InputParameters validParams< GeometricCut3DUserObject >()
Definition: GeometricCut3DUserObject.C:22
GeometricCut3DUserObject::_center
Point _center
Definition: GeometricCut3DUserObject.h:42