www.mooseframework.org
ComputeStrainBaseNOSPD.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 "ComputeStrainBaseNOSPD.h"
11 #include "ElasticityTensorTools.h"
12 
13 #include "libmesh/quadrature.h"
14 
15 template <>
16 InputParameters
18 {
19  InputParameters params = validParams<MechanicsMaterialBasePD>();
20  params.addClassDescription(
21  "Base class for Self-stabilized Non-Ordinary State-based PeriDynamic (SNOSPD) "
22  "correspondence material model");
23 
24  params.addParam<bool>("plane_strain",
25  false,
26  "Plane strain problem or not, this will affect the mechanical stretch "
27  "calculation for problem with eigenstrains");
28  params.addParam<std::vector<MaterialPropertyName>>(
29  "eigenstrain_names", "List of eigenstrains to be applied in this strain calculation");
30 
31  return params;
32 }
33 
34 ComputeStrainBaseNOSPD::ComputeStrainBaseNOSPD(const InputParameters & parameters)
35  : DerivativeMaterialInterface<MechanicsMaterialBasePD>(parameters),
36  _plane_strain(getParam<bool>("plane_strain")),
37  _Cijkl(getMaterialProperty<RankFourTensor>("elasticity_tensor")),
38  _eigenstrain_names(getParam<std::vector<MaterialPropertyName>>("eigenstrain_names")),
39  _eigenstrains(_eigenstrain_names.size()),
40  _shape2(declareProperty<RankTwoTensor>("rank_two_shape_tensor")),
41  _deformation_gradient(declareProperty<RankTwoTensor>("deformation_gradient")),
42  _ddgraddu(declareProperty<RankTwoTensor>("ddeformation_gradient_du")),
43  _ddgraddv(declareProperty<RankTwoTensor>("ddeformation_gradient_dv")),
44  _ddgraddw(declareProperty<RankTwoTensor>("ddeformation_gradient_dw")),
45  _total_strain(declareProperty<RankTwoTensor>("total_strain")),
46  _mechanical_strain(declareProperty<RankTwoTensor>("mechanical_strain")),
47  _multi(declareProperty<Real>("multi"))
48 {
49  for (unsigned int i = 0; i < _eigenstrains.size(); ++i)
50  {
52  _eigenstrains[i] = &getMaterialProperty<RankTwoTensor>(_eigenstrain_names[i]);
53  }
54 }
55 
56 void
58 {
59  _mechanical_strain[_qp].zero();
60  _total_strain[_qp].zero();
61  _deformation_gradient[_qp].zero();
62  _deformation_gradient[_qp].addIa(1.0);
63 
64  if (_qrule->n_points() < 2) // Gauss_Lobatto: order = 2n-3 (n is number of qp)
65  mooseError(
66  "NOSPD models require Gauss_Lobatto rule and a minimum of 2 quadrature points, i.e., "
67  "order of FIRST");
68 }
69 
70 void
72 {
73  _shape2[_qp].zero();
74  _deformation_gradient[_qp].zero();
75  _ddgraddu[_qp].zero();
76  _ddgraddv[_qp].zero();
77  _ddgraddw[_qp].zero();
78  _multi[_qp] = 0.0;
79 
80  // for cases when current bond was broken, assign shape tensor and deformation gradient to unity
81  if (_bond_status_var->getElementalValue(_current_elem) < 0.5)
82  {
83  _shape2[_qp] = RankTwoTensor::initIdentity;
84  _deformation_gradient[_qp] = _shape2[_qp];
85  }
86  else
87  {
88  if (_dim == 2)
89  _shape2[_qp](2, 2) = _deformation_gradient[_qp](2, 2) = 1.0;
90 
91  const Node * cur_nd = _current_elem->node_ptr(_qp);
92  const Node * end_nd = _current_elem->node_ptr(1 - _qp); // two nodes for edge2 element
93  std::vector<dof_id_type> neighbors = _pdmesh.getNeighbors(cur_nd->id());
94  std::vector<dof_id_type> bonds = _pdmesh.getBonds(cur_nd->id());
95 
96  unsigned int nb =
97  std::find(neighbors.begin(), neighbors.end(), end_nd->id()) - neighbors.begin();
98  std::vector<dof_id_type> dg_neighbors = _pdmesh.getDefGradNeighbors(cur_nd->id(), nb);
99 
100  // calculate the shape tensor and prepare the deformation gradient tensor
101  Real dgnodes_vsum = 0.0;
102  RealGradient ori_vec(_dim), cur_vec(_dim);
103 
104  for (unsigned int j = 0; j < dg_neighbors.size(); ++j)
105  if (_bond_status_var->getElementalValue(_pdmesh.elemPtr(bonds[dg_neighbors[j]])) > 0.5)
106  {
107  Node * node_j = _pdmesh.nodePtr(neighbors[dg_neighbors[j]]);
108  Real vol_j = _pdmesh.getPDNodeVolume(neighbors[dg_neighbors[j]]);
109  dgnodes_vsum += vol_j;
110  ori_vec = *node_j - *_pdmesh.nodePtr(cur_nd->id());
111 
112  for (unsigned int k = 0; k < _dim; ++k)
113  cur_vec(k) = ori_vec(k) + _disp_var[k]->getNodalValue(*node_j) -
114  _disp_var[k]->getNodalValue(*cur_nd);
115 
116  Real ori_len = ori_vec.norm();
117  for (unsigned int k = 0; k < _dim; ++k)
118  {
119  for (unsigned int l = 0; l < _dim; ++l)
120  {
121  _shape2[_qp](k, l) += _horiz_rad[_qp] / ori_len * ori_vec(k) * ori_vec(l) * vol_j;
122  _deformation_gradient[_qp](k, l) +=
123  _horiz_rad[_qp] / ori_len * cur_vec(k) * ori_vec(l) * vol_j;
124  }
125  // calculate derivatives of deformation_gradient w.r.t displacements of node i
126  _ddgraddu[_qp](0, k) += -_horiz_rad[_qp] / ori_len * ori_vec(k) * vol_j;
127  _ddgraddv[_qp](1, k) += -_horiz_rad[_qp] / ori_len * ori_vec(k) * vol_j;
128  if (_dim == 3)
129  _ddgraddw[_qp](2, k) += -_horiz_rad[_qp] / ori_len * ori_vec(k) * vol_j;
130  }
131  }
132  // finalize the deformation gradient and its derivatives
133  _deformation_gradient[_qp] *= _shape2[_qp].inverse();
134  _ddgraddu[_qp] *= _shape2[_qp].inverse();
135  _ddgraddv[_qp] *= _shape2[_qp].inverse();
136  _ddgraddw[_qp] *= _shape2[_qp].inverse();
137 
138  // force state multiplier
139  _multi[_qp] = _horiz_rad[_qp] / _origin_length * _node_vol[0] * _node_vol[1] * dgnodes_vsum /
140  _horiz_vol[_qp];
141  }
142 }
143 
144 void
146 {
147  setupMeshRelatedData(); // function from base class
148  computeBondCurrentLength(); // current length of a bond from base class
149  computeBondStretch(); // stretch of a bond
150 
151  for (_qp = 0; _qp < _nnodes; ++_qp)
152  computeQpStrain();
153 }
154 
155 void
157 {
158  _total_stretch[0] = _current_length / _origin_length - 1.0;
159  _total_stretch[1] = _total_stretch[0];
160  _mechanical_stretch[0] = _total_stretch[0];
161 
162  Real factor = 1.0;
163  if (_plane_strain)
165 
166  for (auto es : _eigenstrains)
167  _mechanical_stretch[0] -= 0.5 * factor * ((*es)[0](2, 2) + (*es)[1](2, 2));
168 
169  _mechanical_stretch[1] = _mechanical_stretch[0];
170 }
ComputeStrainBaseNOSPD::_mechanical_strain
MaterialProperty< RankTwoTensor > & _mechanical_strain
Definition: ComputeStrainBaseNOSPD.h:62
ComputeStrainBaseNOSPD::_ddgraddv
MaterialProperty< RankTwoTensor > & _ddgraddv
Definition: ComputeStrainBaseNOSPD.h:58
ComputeStrainBaseNOSPD::initQpStatefulProperties
virtual void initQpStatefulProperties() override
Definition: ComputeStrainBaseNOSPD.C:57
ComputeStrainBaseNOSPD::_shape2
MaterialProperty< RankTwoTensor > & _shape2
Material properties to store.
Definition: ComputeStrainBaseNOSPD.h:54
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
ComputeStrainBaseNOSPD::_plane_strain
const bool _plane_strain
Plane strain problem or not, this is only used for mechanical stretch calculation.
Definition: ComputeStrainBaseNOSPD.h:45
ComputeStrainBaseNOSPD::_deformation_gradient
MaterialProperty< RankTwoTensor > & _deformation_gradient
Definition: ComputeStrainBaseNOSPD.h:55
ElasticityTensorTools::getIsotropicPoissonsRatio
T getIsotropicPoissonsRatio(const RankFourTensorTempl< T > &elasticity_tensor)
Get the Poisson's modulus for an isotropic elasticity tensor param elasticity_tensor the tensor (must...
Definition: ElasticityTensorTools.h:115
ComputeStrainBaseNOSPD::_Cijkl
const MaterialProperty< RankFourTensor > & _Cijkl
Material properties to fetch.
Definition: ComputeStrainBaseNOSPD.h:48
ComputeStrainBaseNOSPD::computeQpDeformationGradient
virtual void computeQpDeformationGradient()
Function to compute bond-associated deformation gradient.
Definition: ComputeStrainBaseNOSPD.C:71
ComputeStrainBaseNOSPD::_eigenstrain_names
std::vector< MaterialPropertyName > _eigenstrain_names
Definition: ComputeStrainBaseNOSPD.h:49
ElasticityTensorTools.h
ComputeStrainBaseNOSPD::_multi
MaterialProperty< Real > & _multi
Definition: ComputeStrainBaseNOSPD.h:64
ComputeStrainBaseNOSPD::ComputeStrainBaseNOSPD
ComputeStrainBaseNOSPD(const InputParameters &parameters)
Definition: ComputeStrainBaseNOSPD.C:34
ComputeStrainBaseNOSPD::_ddgraddw
MaterialProperty< RankTwoTensor > & _ddgraddw
Definition: ComputeStrainBaseNOSPD.h:59
ComputeStrainBaseNOSPD.h
ComputeStrainBaseNOSPD::_eigenstrains
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains
Definition: ComputeStrainBaseNOSPD.h:50
RankFourTensorTempl< Real >
ComputeStrainBaseNOSPD::computeProperties
virtual void computeProperties() override
Definition: ComputeStrainBaseNOSPD.C:145
ComputeStrainBaseNOSPD::computeQpStrain
virtual void computeQpStrain()=0
Function to compute strain tensors.
validParams< MechanicsMaterialBasePD >
InputParameters validParams< MechanicsMaterialBasePD >()
Definition: MechanicsMaterialBasePD.C:15
ComputeStrainBaseNOSPD::computeBondStretch
virtual void computeBondStretch() override
Definition: ComputeStrainBaseNOSPD.C:156
validParams< ComputeStrainBaseNOSPD >
InputParameters validParams< ComputeStrainBaseNOSPD >()
Definition: ComputeStrainBaseNOSPD.C:17
RankTwoTensorTempl< Real >
ComputeStrainBaseNOSPD::_ddgraddu
MaterialProperty< RankTwoTensor > & _ddgraddu
Definition: ComputeStrainBaseNOSPD.h:57
ComputeStrainBaseNOSPD::_total_strain
MaterialProperty< RankTwoTensor > & _total_strain
Definition: ComputeStrainBaseNOSPD.h:61
MechanicsMaterialBasePD
Base material class for peridynamic solid mechanics models.
Definition: MechanicsMaterialBasePD.h:22