www.mooseframework.org
LineSegmentCutSetUserObject.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 
11 
12 // MOOSE includes
13 #include "MooseError.h"
14 
16 
19 {
20  // Get input parameters from parent class
22 
23  // Add required parameters
24  params.addRequiredParam<std::vector<Real>>("cut_data",
25  "Vector of Real values providing cut information");
26  // Add optional parameters
27  params.addParam<std::vector<Real>>("cut_scale", "X,Y scale factors for geometric cuts");
28  params.addParam<std::vector<Real>>("cut_translate", "X,Y translations for geometric cuts");
29  // Class description
30  params.addClassDescription("Creates a UserObject for a line segment cut on 2D meshes for XFEM");
31  // Return the parameters
32  return params;
33 }
34 
36  : GeometricCut2DUserObject(parameters), _cut_data(getParam<std::vector<Real>>("cut_data"))
37 {
38  // Set up constant parameters
39  const int line_cut_data_len = 6;
40 
41  // Throw error if length of cut_data is incorrect
42  if (_cut_data.size() % line_cut_data_len != 0)
43  mooseError("Length of LineSegmentCutSetUserObject cut_data must be a multiple of 6.");
44 
45  unsigned int num_cuts = _cut_data.size() / line_cut_data_len;
46 
47  // Assign scale and translate parameters
48  std::pair<Real, Real> scale;
49  if (isParamValid("cut_scale"))
50  {
51  auto vec_scale = getParam<std::vector<Real>>("cut_scale");
52  scale = std::make_pair(vec_scale[0], vec_scale[1]);
53  }
54  else
55  {
56  scale = std::make_pair(1.0, 1.0);
57  }
58 
59  std::pair<Real, Real> trans;
60  if (isParamValid("cut_translate"))
61  {
62  auto vec_trans = getParam<std::vector<Real>>("cut_translate");
63  trans = std::make_pair(vec_trans[0], vec_trans[1]);
64  }
65  else
66  {
67  trans = std::make_pair(0.0, 0.0);
68  }
69 
70  // Clear _start_times & _end_times vectors initialized from
71  // time_start_cut & time_end_cut values
72  _cut_time_ranges.clear();
73 
74  for (unsigned int i = 0; i < num_cuts; ++i)
75  {
76  Real x0 = (_cut_data[i * line_cut_data_len + 0] + trans.first) * scale.first;
77  Real y0 = (_cut_data[i * line_cut_data_len + 1] + trans.second) * scale.second;
78  Real x1 = (_cut_data[i * line_cut_data_len + 2] + trans.first) * scale.first;
79  Real y1 = (_cut_data[i * line_cut_data_len + 3] + trans.second) * scale.second;
80  _cut_line_endpoints.push_back(std::make_pair(Point(x0, y0, 0.0), Point(x1, y1, 0.0)));
81 
82  _cut_time_ranges.push_back(
83  std::make_pair(_cut_data[i * line_cut_data_len + 4], _cut_data[i * line_cut_data_len + 5]));
84  }
85 
86  if (_cut_line_endpoints.size() != _cut_time_ranges.size())
87  mooseError("Number of start/end times must match number of cut line endpoint sets");
88 }
89 
90 const std::vector<Point>
91 LineSegmentCutSetUserObject::getCrackFrontPoints(unsigned int /*num_crack_front_points*/) const
92 {
93  mooseError("getCrackFrontPoints() is not implemented for this object.");
94 }
95 
96 const std::vector<RealVectorValue>
97 LineSegmentCutSetUserObject::getCrackPlaneNormals(unsigned int /*num_crack_front_points*/) const
98 {
99  mooseError("getCrackPlaneNormals() is not implemented for this object.");
100 }
std::vector< std::pair< Point, Point > > _cut_line_endpoints
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
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 ...
registerMooseObject("XFEMApp", LineSegmentCutSetUserObject)
void scale(MeshBase &mesh, const Real xs, const Real ys=0., const Real zs=0.)
static InputParameters validParams()
void addRequiredParam(const std::string &name, const std::string &doc_string)
bool isParamValid(const std::string &name) const
static InputParameters validParams()
LineSegmentCutSetUserObject(const InputParameters &parameters)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void mooseError(Args &&... args) const
std::vector< std::pair< Real, Real > > _cut_time_ranges
Vector of start/end times for each cut segment.
void addClassDescription(const std::string &doc_string)
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