www.mooseframework.org
DomainIntegralQFunction.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 registerMooseObject("TensorMechanicsApp", DomainIntegralQFunction);
13 
15 
16 InputParameters
18 {
19  InputParameters params = AuxKernel::validParams();
20  params.addClassDescription("Computes the q-function for a segment along the crack front, used in "
21  "the calculation of the J-integral");
22  params.addRequiredParam<Real>("j_integral_radius_inner", "Radius for J-Integral calculation");
23  params.addRequiredParam<Real>("j_integral_radius_outer", "Radius for J-Integral calculation");
24  params.addRequiredParam<UserObjectName>("crack_front_definition",
25  "The CrackFrontDefinition user object name");
26  params.addParam<unsigned int>(
27  "crack_front_point_index",
28  "The index of the point on the crack front corresponding to this q function");
29  params.set<bool>("use_displaced_mesh") = false;
30  return params;
31 }
32 
33 DomainIntegralQFunction::DomainIntegralQFunction(const InputParameters & parameters)
34  : AuxKernel(parameters),
35  _j_integral_radius_inner(getParam<Real>("j_integral_radius_inner")),
36  _j_integral_radius_outer(getParam<Real>("j_integral_radius_outer")),
37  _crack_front_definition(&getUserObject<CrackFrontDefinition>("crack_front_definition")),
38  _has_crack_front_point_index(isParamValid("crack_front_point_index")),
39  _crack_front_point_index(
40  _has_crack_front_point_index ? getParam<unsigned int>("crack_front_point_index") : 0),
41  _treat_as_2d(false),
42  _is_point_on_intersecting_boundary(false)
43 {
44 }
45 
46 void
48 {
50 
51  if (_treat_as_2d)
52  {
54  {
55  mooseWarning(
56  "crack_front_point_index ignored because CrackFrontDefinition is set to treat as 2D");
57  }
58  }
59  else
60  {
62  {
63  mooseError("crack_front_point_index must be specified in DomainIntegralQFunction");
64  }
65  }
68 }
69 
70 Real
72 {
73  Real dist_to_crack_front;
74  Real dist_along_tangent;
75  projectToFrontAtPoint(dist_to_crack_front, dist_along_tangent);
76 
77  Real q = 1.0;
78  if (dist_to_crack_front > _j_integral_radius_inner &&
79  dist_to_crack_front < _j_integral_radius_outer)
80  q = (_j_integral_radius_outer - dist_to_crack_front) /
82  else if (dist_to_crack_front >= _j_integral_radius_outer)
83  q = 0.0;
84 
85  if (q > 0.0)
86  {
87  Real tangent_multiplier = 1.0;
88  if (!_treat_as_2d)
89  {
90  const Real forward_segment_length =
92  const Real backward_segment_length =
94 
95  if (dist_along_tangent >= 0.0)
96  {
97  if (forward_segment_length > 0.0)
98  tangent_multiplier = 1.0 - dist_along_tangent / forward_segment_length;
99  }
100  else
101  {
102  if (backward_segment_length > 0.0)
103  tangent_multiplier = 1.0 + dist_along_tangent / backward_segment_length;
104  }
105  }
106 
107  tangent_multiplier = std::max(tangent_multiplier, 0.0);
108  tangent_multiplier = std::min(tangent_multiplier, 1.0);
109 
110  // Set to zero if a node is on a designated free surface and its crack front node is not.
113  tangent_multiplier = 0.0;
114 
115  q *= tangent_multiplier;
116  }
117 
118  return q;
119 }
120 
121 void
122 DomainIntegralQFunction::projectToFrontAtPoint(Real & dist_to_front, Real & dist_along_tangent)
123 {
124  const Point * crack_front_point =
126 
127  Point p = *_current_node;
128  const RealVectorValue & crack_front_tangent =
130 
131  RealVectorValue crack_node_to_current_node = p - *crack_front_point;
132  dist_along_tangent = crack_node_to_current_node * crack_front_tangent;
133  RealVectorValue projection_point = *crack_front_point + dist_along_tangent * crack_front_tangent;
134  RealVectorValue axis_to_current_node = p - projection_point;
135  dist_to_front = axis_to_current_node.norm();
136 }
DomainIntegralQFunction::_j_integral_radius_outer
const Real _j_integral_radius_outer
Definition: DomainIntegralQFunction.h:38
CrackFrontDefinition::getCrackFrontTangent
const RealVectorValue & getCrackFrontTangent(const unsigned int point_index) const
Definition: CrackFrontDefinition.C:1071
DomainIntegralQFunction::_is_point_on_intersecting_boundary
bool _is_point_on_intersecting_boundary
Definition: DomainIntegralQFunction.h:43
DomainIntegralQFunction::_has_crack_front_point_index
bool _has_crack_front_point_index
Definition: DomainIntegralQFunction.h:40
CrackFrontDefinition::isNodeOnIntersectingBoundary
bool isNodeOnIntersectingBoundary(const Node *const node) const
Definition: CrackFrontDefinition.C:1290
DomainIntegralQFunction::computeValue
virtual Real computeValue()
Definition: DomainIntegralQFunction.C:71
CrackFrontDefinition
Works on top of NodalNormalsPreprocessor.
Definition: CrackFrontDefinition.h:36
DomainIntegralQFunction.h
registerMooseObject
registerMooseObject("TensorMechanicsApp", DomainIntegralQFunction)
CrackFrontDefinition::isPointWithIndexOnIntersectingBoundary
bool isPointWithIndexOnIntersectingBoundary(const unsigned int point_index) const
Definition: CrackFrontDefinition.C:1307
CrackFrontDefinition::getCrackFrontPoint
const Point * getCrackFrontPoint(const unsigned int point_index) const
Definition: CrackFrontDefinition.C:1057
validParams
InputParameters validParams()
DomainIntegralQFunction::projectToFrontAtPoint
void projectToFrontAtPoint(Real &dist_to_front, Real &dist_along_tangent)
Definition: DomainIntegralQFunction.C:122
defineLegacyParams
defineLegacyParams(DomainIntegralQFunction)
DomainIntegralQFunction::_treat_as_2d
bool _treat_as_2d
Definition: DomainIntegralQFunction.h:42
DomainIntegralQFunction::_crack_front_definition
const CrackFrontDefinition *const _crack_front_definition
Definition: DomainIntegralQFunction.h:39
DomainIntegralQFunction::DomainIntegralQFunction
DomainIntegralQFunction(const InputParameters &parameters)
Factory constructor, takes parameters so that all derived classes can be built using the same constru...
Definition: DomainIntegralQFunction.C:33
CrackFrontDefinition::treatAs2D
bool treatAs2D() const
Definition: CrackFrontDefinition.h:59
DomainIntegralQFunction::validParams
static InputParameters validParams()
Definition: DomainIntegralQFunction.C:17
DomainIntegralQFunction
Coupled auxiliary value.
Definition: DomainIntegralQFunction.h:18
DomainIntegralQFunction::_crack_front_point_index
const unsigned int _crack_front_point_index
Definition: DomainIntegralQFunction.h:41
CrackFrontDefinition::getCrackFrontBackwardSegmentLength
Real getCrackFrontBackwardSegmentLength(const unsigned int point_index) const
Definition: CrackFrontDefinition.C:1084
DomainIntegralQFunction::initialSetup
virtual void initialSetup()
Definition: DomainIntegralQFunction.C:47
CrackFrontDefinition::getCrackFrontForwardSegmentLength
Real getCrackFrontForwardSegmentLength(const unsigned int point_index) const
Definition: CrackFrontDefinition.C:1078
DomainIntegralQFunction::_j_integral_radius_inner
const Real _j_integral_radius_inner
Definition: DomainIntegralQFunction.h:37