www.mooseframework.org
RectangleCutUserObject.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 "RectangleCutUserObject.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 planar cuts on 3D meshes for XFEM");
32  // Return the parameters
33  return params;
34 }
35 
36 RectangleCutUserObject::RectangleCutUserObject(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 = 12;
41  const int num_vertices = 4;
42 
43  // Throw error if length of cut_data is incorrect
44  if (_cut_data.size() != cut_data_len)
45  mooseError("Length of RectangleCutUserObject cut_data must be 12");
46 
47  // Assign cut_data to vars used to construct cuts
48  _vertices.push_back(Point(_cut_data[0], _cut_data[1], _cut_data[2]));
49  _vertices.push_back(Point(_cut_data[3], _cut_data[4], _cut_data[5]));
50  _vertices.push_back(Point(_cut_data[6], _cut_data[7], _cut_data[8]));
51  _vertices.push_back(Point(_cut_data[9], _cut_data[10], _cut_data[11]));
52 
53  for (unsigned int i = 0; i < num_vertices; ++i)
54  _center += _vertices[i];
55  _center *= 0.25;
56 
57  for (unsigned int i = 0; i < num_vertices; ++i)
58  {
59  unsigned int iplus1(i < 3 ? i + 1 : 0);
60  std::pair<Point, Point> rays =
61  std::make_pair(_vertices[i] - _center, _vertices[iplus1] - _center);
62  _normal += rays.first.cross(rays.second);
63  }
64  _normal *= 0.25;
66 }
67 
68 bool
70 {
71  const int num_vertices = 4;
72 
73  bool inside = false;
74  unsigned int counter = 0;
75  for (unsigned int i = 0; i < num_vertices; ++i)
76  {
77  unsigned int iplus1 = (i < 3 ? i + 1 : 0);
78  Point middle2p = p - 0.5 * (_vertices[i] + _vertices[iplus1]);
79  const Point side_tang = _vertices[iplus1] - _vertices[i];
80  Point side_norm = side_tang.cross(_normal);
81  Xfem::normalizePoint(middle2p);
82  Xfem::normalizePoint(side_norm);
83  if (middle2p * side_norm <= 0.0)
84  counter += 1;
85  }
86  if (counter == num_vertices)
87  inside = true;
88  return inside;
89 }
90 
91 const std::vector<Point>
92 RectangleCutUserObject::getCrackFrontPoints(unsigned int /*num_crack_front_points*/) const
93 {
94  mooseError("getCrackFrontPoints() is not implemented for this object.");
95 }
RectangleCutUserObject::RectangleCutUserObject
RectangleCutUserObject(const InputParameters &parameters)
Definition: RectangleCutUserObject.C:36
RectangleCutUserObject::isInsideCutPlane
bool isInsideCutPlane(Point p) const override
Definition: RectangleCutUserObject.C:69
GeometricCut3DUserObject
Definition: GeometricCut3DUserObject.h:21
counter
static unsigned int counter
Definition: ContactPenetrationAuxAction.C:17
XFEMFuncs.h
RectangleCutUserObject::_vertices
std::vector< Point > _vertices
Definition: RectangleCutUserObject.h:32
validParams< RectangleCutUserObject >
InputParameters validParams< RectangleCutUserObject >()
Definition: RectangleCutUserObject.C:22
RectangleCutUserObject.h
RectangleCutUserObject::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: RectangleCutUserObject.C:92
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
RectangleCutUserObject
Definition: RectangleCutUserObject.h:20
registerMooseObject
registerMooseObject("XFEMApp", RectangleCutUserObject)
RectangleCutUserObject::_cut_data
std::vector< Real > _cut_data
Definition: RectangleCutUserObject.h:29
GeometricCut3DUserObject::_center
Point _center
Definition: GeometricCut3DUserObject.h:42