12#include "libmesh/fe_interface.h"
13#include "libmesh/string_to_enum.h"
15#include "libmesh/quadrature_gauss.h"
24 "Computes the crack tip enrichment at a point within a small strain formulation.");
25 params.
addRequiredParam<std::vector<NonlinearVariableName>>(
"enrichment_displacements",
26 "The enrichment displacement");
28 "The CrackFrontDefinition user object name");
39 _phi(_assembly.phi()),
40 _grad_phi(_assembly.gradPhi()),
48 const std::vector<NonlinearVariableName> & nl_vnames =
49 getParam<std::vector<NonlinearVariableName>>(
"enrichment_displacements");
51 if (
_ndisp == 2 && nl_vnames.size() != 8)
52 mooseError(
"The number of enrichment displacements should be total 8 for 2D.");
53 else if (
_ndisp == 3 && nl_vnames.size() != 12)
54 mooseError(
"The number of enrichment displacements should be total 12 for 3D.");
56 _nl = &(_fe_problem.getNonlinearSystem(0));
58 for (
unsigned int j = 0; j <
_ndisp; ++j)
59 for (
unsigned int i = 0; i < 4; ++i)
67 for (
unsigned int i = 0; i <
_BI.size(); ++i)
75 unsigned int crack_front_point_index =
78 for (
unsigned int i = 0; i < 4; ++i)
83 for (
unsigned int m = 0; m <
_ndisp; ++m)
87 for (
unsigned int i = 0; i < _current_elem->n_nodes(); ++i)
89 const Node * node_i = _current_elem->node_ptr(i);
90 for (
unsigned int j = 0; j < 4; ++j)
93 Real soln = (*_sln)(dof);
95 RealVectorValue grad_B(
_dBX[j]);
97 ((*_fe_dphi)[i][_qp] * (
_B[j] -
_BI[i][j]) + (*
_fe_phi)[i][_qp] * grad_B) * soln;
105 RankTwoTensor enrich_strain = (grad_tensor_enrich + grad_tensor_enrich.transpose()) / 2.0;
110 _total_strain[_qp] = (grad_tensor + grad_tensor.transpose()) / 2.0;
124 FEType fe_type(Utility::string_to_enum<Order>(
"first"),
125 Utility::string_to_enum<FEFamily>(
"lagrange"));
126 const unsigned int dim = _current_elem->dim();
127 std::unique_ptr<FEBase> fe(FEBase::build(
dim, fe_type));
128 fe->attach_quadrature_rule(
const_cast<QBase *
>(_qrule));
132 if (isBoundaryMaterial())
133 fe->reinit(_current_elem, _current_side);
135 fe->reinit(_current_elem);
137 for (
unsigned int i = 0; i <
_BI.size(); ++i)
140 ComputeStrainBase::computeProperties();
registerMooseObject("XFEMApp", ComputeCrackTipEnrichmentSmallStrain)
void mooseError(Args &&... args)
ComputeCrackTipEnrichmentSmallStrain calculates the sum of standard strain and enrichement strain.
const std::vector< std::vector< Real > > * _fe_phi
shape function
std::vector< RealVectorValue > _dBX
derivatives of enrichment function respect to global cooridnate
std::vector< RealVectorValue > _grad_enrich_disp
gradient of enrichment displacement
std::vector< std::vector< MooseVariableFEBase * > > _enrich_variable
enrichment displacement variables
static InputParameters validParams()
virtual void computeQpProperties() override
const std::vector< std::vector< RealGradient > > * _fe_dphi
gradient of shape function
std::vector< Real > _enrich_disp
enrichment displacement
std::vector< Real > _B
enrichment function value
const NumericVector< Number > * _sln
std::vector< std::vector< Real > > _BI
enrichment function at node I
ComputeCrackTipEnrichmentSmallStrain(const InputParameters ¶meters)
std::vector< RealVectorValue > _dBx
derivatives of enrichment function respect to crack front cooridnate
virtual void computeProperties() override
ComputeStrainBase is the base class for strain tensors.
std::vector< const VariableGradient * > _grad_disp
Gradient of displacements.
MaterialProperty< RankTwoTensor > & _mechanical_strain
unsigned int _ndisp
Coupled displacement variables.
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains
MaterialProperty< RankTwoTensor > & _total_strain
static InputParameters validParams()
Class used in fracture integrals to define geometric characteristics of the crack front.
Perform calculation of enrichment function values and derivatives.
virtual unsigned int crackTipEnrichementFunctionAtPoint(const Point &point, std::vector< Real > &B)
calculate the enrichment function values at point
void rotateFromCrackFrontCoordsToGlobal(const RealVectorValue &vector, RealVectorValue &rotated_vector, const unsigned int point_index)
rotate a vector from crack front coordinate to global cooridate
virtual unsigned int crackTipEnrichementFunctionDerivativeAtPoint(const Point &point, std::vector< RealVectorValue > &dB)
calculate the enrichment function derivatives at point
static RankTwoTensorTempl initializeFromRows(const libMesh::TypeVector< T > &row0, const libMesh::TypeVector< T > &row1, const libMesh::TypeVector< T > &row2)
virtual const NumericVector< Number > *const & currentSolution() const override final
MooseVariableFieldBase & getVariable(THREAD_ID tid, const std::string &var_name) const
unsigned int number() const