www.mooseframework.org
XFEMMaterialTensorMarkerUserObject.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 #include "libmesh/quadrature.h"
13 
15 
16 template <>
17 InputParameters
19 {
20  InputParameters params = validParams<XFEMMaterialStateMarkerBase>();
22  params.addRequiredParam<std::string>("tensor", "The material tensor name.");
23  params.addRequiredParam<Real>("threshold", "The threshold for crack growth.");
24  params.addRequiredParam<bool>(
25  "average", "Should the tensor quantity be averaged over the quadruature points?");
26  params.addParam<Real>(
27  "random_range", 0.0, "Range of a uniform random distribution for the threshold");
28  return params;
29 }
30 
32  const InputParameters & parameters)
33  : XFEMMaterialStateMarkerBase(parameters),
34  _material_tensor_calculator(parameters),
35  _tensor(getMaterialProperty<SymmTensor>(getParam<std::string>("tensor"))),
36  _threshold(getParam<Real>("threshold")),
37  _average(getParam<bool>("average")),
38  _random_range(getParam<Real>("random_range"))
39 {
40  setRandomResetFrequency(EXEC_INITIAL);
41 }
42 
43 bool
45 {
46  bool does_it_crack = false;
47  unsigned int numqp = _qrule->n_points();
48 
49  Real rnd_mult = (1.0 - _random_range / 2.0) + _random_range * getRandomReal();
50 
51  if (_average)
52  {
53  SymmTensor average_tensor;
54  for (unsigned int qp = 0; qp < numqp; ++qp)
55  {
56  average_tensor += _tensor[qp];
57  }
58  average_tensor *= 1.0 / (Real)numqp;
59  Real tensor_quantity =
60  _material_tensor_calculator.getTensorQuantity(average_tensor, _q_point[0], direction);
61  if (tensor_quantity > _threshold * rnd_mult)
62  does_it_crack = true;
63  }
64  else
65  {
66  unsigned int max_index = 999999;
67  std::vector<Real> tensor_quantities;
68  tensor_quantities.reserve(numqp);
69  Real max_quantity = 0;
70  std::vector<RealVectorValue> directions;
71  directions.resize(numqp);
72  for (unsigned int qp = 0; qp < numqp; ++qp)
73  {
74  tensor_quantities[qp] =
75  _material_tensor_calculator.getTensorQuantity(_tensor[qp], _q_point[qp], directions[qp]);
76  if (directions[qp](0) == 0 && directions[qp](1) == 0 && directions[qp](2) == 0)
77  {
78  mooseError("Direction has zero length in XFEMMaterialTensorMarkerUserObject");
79  }
80  if (tensor_quantities[qp] > max_quantity)
81  {
82  max_quantity = tensor_quantities[qp];
83  max_index = qp;
84  }
85  }
86  if (max_quantity > _threshold * rnd_mult)
87  {
88  does_it_crack = true;
89  direction = directions[max_index];
90  }
91  }
92 
93  return does_it_crack;
94 }
XFEMMaterialTensorMarkerUserObject::_random_range
Real _random_range
Definition: XFEMMaterialTensorMarkerUserObject.h:31
registerMooseObject
registerMooseObject("XFEMApp", XFEMMaterialTensorMarkerUserObject)
MaterialTensorCalculator::getTensorQuantity
Real getTensorQuantity(const SymmTensor &tensor, const Point &curr_point, RealVectorValue &direction)
Definition: MaterialTensorCalculator.C:71
validParams< MaterialTensorCalculator >
InputParameters validParams< MaterialTensorCalculator >()
Definition: MaterialTensorCalculator.C:15
XFEMMaterialTensorMarkerUserObject::_material_tensor_calculator
MaterialTensorCalculator _material_tensor_calculator
Definition: XFEMMaterialTensorMarkerUserObject.h:27
XFEMMaterialTensorMarkerUserObject::_tensor
const MaterialProperty< SymmTensor > & _tensor
Definition: XFEMMaterialTensorMarkerUserObject.h:28
validParams< XFEMMaterialStateMarkerBase >
InputParameters validParams< XFEMMaterialStateMarkerBase >()
Definition: XFEMMaterialStateMarkerBase.C:20
XFEMMaterialTensorMarkerUserObject
Definition: XFEMMaterialTensorMarkerUserObject.h:20
XFEMMaterialTensorMarkerUserObject::XFEMMaterialTensorMarkerUserObject
XFEMMaterialTensorMarkerUserObject(const InputParameters &parameters)
Definition: XFEMMaterialTensorMarkerUserObject.C:31
validParams< XFEMMaterialTensorMarkerUserObject >
InputParameters validParams< XFEMMaterialTensorMarkerUserObject >()
Definition: XFEMMaterialTensorMarkerUserObject.C:18
XFEMMaterialTensorMarkerUserObject::_average
bool _average
Definition: XFEMMaterialTensorMarkerUserObject.h:30
SymmTensor
Definition: SymmTensor.h:21
XFEMMaterialTensorMarkerUserObject::doesElementCrack
virtual bool doesElementCrack(RealVectorValue &direction)
Determine whether the current element should be cut by a new crack.
Definition: XFEMMaterialTensorMarkerUserObject.C:44
XFEMMaterialStateMarkerBase
Coupled auxiliary value.
Definition: XFEMMaterialStateMarkerBase.h:19
XFEMMaterialTensorMarkerUserObject::_threshold
Real _threshold
Definition: XFEMMaterialTensorMarkerUserObject.h:29
XFEMMaterialTensorMarkerUserObject.h