www.mooseframework.org
PlaneStrain.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 "PlaneStrain.h"
11 #include "SolidModel.h"
12 #include "libmesh/quadrature.h"
13 
14 namespace SolidMechanics
15 {
16 
18  const std::string & name,
19  const InputParameters & parameters)
20  : Element(solid_model, name, parameters),
21  ScalarCoupleable(&solid_model),
22  _large_strain(solid_model.getParamTempl<bool>("large_strain")),
23  _grad_disp_x(coupledGradient("disp_x")),
24  _grad_disp_y(coupledGradient("disp_y")),
25  _have_strain_zz(isCoupled("strain_zz")),
26  _strain_zz(_have_strain_zz ? coupledValue("strain_zz") : _zero),
27  _have_scalar_strain_zz(isCoupledScalar("scalar_strain_zz")),
28  _scalar_strain_zz(_have_scalar_strain_zz ? coupledScalarValue("scalar_strain_zz") : _zero),
29  _volumetric_locking_correction(solid_model.getParamTempl<bool>("volumetric_locking_correction"))
30 {
32  mooseError("Must define only one of strain_zz or scalar_strain_zz");
33 }
34 
36 
37 void
38 PlaneStrain::computeStrain(const unsigned qp,
39  const SymmTensor & total_strain_old,
40  SymmTensor & total_strain_new,
41  SymmTensor & strain_increment)
42 {
43  strain_increment.xx() = _grad_disp_x[qp](0);
44  strain_increment.yy() = _grad_disp_y[qp](1);
45 
46  if (_have_strain_zz)
47  strain_increment.zz() = _strain_zz[qp];
48  else if (_have_scalar_strain_zz && _scalar_strain_zz.size() > 0)
49  strain_increment.zz() = _scalar_strain_zz[0];
50  else
51  strain_increment.zz() = 0;
52 
53  strain_increment.xy() = 0.5 * (_grad_disp_x[qp](1) + _grad_disp_y[qp](0));
54  strain_increment.yz() = 0;
55  strain_increment.zx() = 0;
56  if (_large_strain)
57  {
58  strain_increment.xx() += 0.5 * (_grad_disp_x[qp](0) * _grad_disp_x[qp](0) +
59  _grad_disp_y[qp](0) * _grad_disp_y[qp](0));
60  strain_increment.yy() += 0.5 * (_grad_disp_x[qp](1) * _grad_disp_x[qp](1) +
61  _grad_disp_y[qp](1) * _grad_disp_y[qp](1));
62  strain_increment.xy() += 0.5 * (_grad_disp_x[qp](0) * _grad_disp_x[qp](1) +
63  _grad_disp_y[qp](0) * _grad_disp_y[qp](1));
64  }
65 
67  {
68  // volumetric locking correction
69  Real volumetric_strain = 0.0;
70  Real volume = 0.0;
71  Real dim = 3.0;
72  for (unsigned int qp_loop = 0; qp_loop < _solid_model.qrule()->n_points(); ++qp_loop)
73  {
74  if (_have_strain_zz)
75  volumetric_strain +=
76  (_grad_disp_x[qp_loop](0) + _grad_disp_y[qp_loop](1) + _strain_zz[qp_loop]) / dim *
77  _solid_model.JxW(qp_loop);
78  else if (_have_scalar_strain_zz && _scalar_strain_zz.size() > 0)
79  volumetric_strain +=
80  (_grad_disp_x[qp_loop](0) + _grad_disp_y[qp_loop](1) + _scalar_strain_zz[0]) / dim *
81  _solid_model.JxW(qp_loop);
82  else
83  volumetric_strain +=
84  (_grad_disp_x[qp_loop](0) + _grad_disp_y[qp_loop](1)) / dim * _solid_model.JxW(qp_loop);
85 
86  volume += _solid_model.JxW(qp_loop);
87 
88  if (_large_strain)
89  {
90  volumetric_strain += 0.5 *
91  (_grad_disp_x[qp_loop](0) * _grad_disp_x[qp_loop](0) +
92  _grad_disp_y[qp_loop](0) * _grad_disp_y[qp_loop](0)) /
93  dim * _solid_model.JxW(qp_loop);
94  volumetric_strain += 0.5 *
95  (_grad_disp_x[qp_loop](1) * _grad_disp_x[qp_loop](1) +
96  _grad_disp_y[qp_loop](1) * _grad_disp_y[qp_loop](1)) /
97  dim * _solid_model.JxW(qp_loop);
98  }
99  }
100 
101  volumetric_strain /= volume; // average volumetric strain
102 
103  // strain increment at _qp
104  Real trace = strain_increment.trace();
105  strain_increment.xx() += volumetric_strain - trace / dim;
106  strain_increment.yy() += volumetric_strain - trace / dim;
107  strain_increment.zz() += volumetric_strain - trace / dim;
108  }
109 
110  total_strain_new = strain_increment;
111 
112  strain_increment -= total_strain_old;
113 }
114 
115 void
116 PlaneStrain::computeDeformationGradient(unsigned int qp, ColumnMajorMatrix & F)
117 {
118  mooseAssert(F.n() == 3 && F.m() == 3, "computeDefGrad requires 3x3 matrix");
119 
120  F(0, 0) = _grad_disp_x[qp](0) + 1.0;
121  F(0, 1) = _grad_disp_x[qp](1);
122  F(0, 2) = 0.0;
123  F(1, 0) = _grad_disp_y[qp](0);
124  F(1, 1) = _grad_disp_y[qp](1) + 1.0;
125  F(1, 2) = 0.0;
126  F(2, 0) = 0.0;
127  F(2, 1) = 0.0;
128  F(2, 2) = 1.0;
129 }
130 }
SymmTensor::xx
Real xx() const
Definition: SymmTensor.h:131
SymmTensor::trace
Real trace() const
Definition: SymmTensor.h:97
SolidMechanics::PlaneStrain::~PlaneStrain
virtual ~PlaneStrain()
Definition: PlaneStrain.C:35
SymmTensor::zx
Real zx() const
Definition: SymmTensor.h:136
SymmTensor::zz
Real zz() const
Definition: SymmTensor.h:133
SolidMechanics::PlaneStrain::_have_scalar_strain_zz
bool _have_scalar_strain_zz
Definition: PlaneStrain.h:42
SolidMechanics::PlaneStrain::_have_strain_zz
bool _have_strain_zz
Definition: PlaneStrain.h:40
SymmTensor::xy
Real xy() const
Definition: SymmTensor.h:134
SolidMechanics
Definition: AxisymmetricRZ.h:16
SolidMechanics::PlaneStrain::_strain_zz
const VariableValue & _strain_zz
Definition: PlaneStrain.h:41
SolidMechanics::PlaneStrain::PlaneStrain
PlaneStrain(SolidModel &solid_model, const std::string &name, const InputParameters &parameters)
Definition: PlaneStrain.C:17
SolidModel
SolidModel is the base class for all this module's solid mechanics material models.
Definition: SolidModel.h:33
SolidMechanics::PlaneStrain::_grad_disp_x
const VariableGradient & _grad_disp_x
Definition: PlaneStrain.h:38
name
const std::string name
Definition: Setup.h:21
SymmTensor::yz
Real yz() const
Definition: SymmTensor.h:135
SolidMechanics::Element::_solid_model
SolidModel & _solid_model
Definition: Element.h:74
SolidMechanics::PlaneStrain::computeDeformationGradient
virtual void computeDeformationGradient(unsigned int qp, ColumnMajorMatrix &F)
Definition: PlaneStrain.C:116
SolidMechanics::Element
Element is the base class for all of this module's solid mechanics element formulations.
Definition: Element.h:25
SymmTensor
Definition: SymmTensor.h:21
SolidMechanics::PlaneStrain::_large_strain
const bool _large_strain
Definition: PlaneStrain.h:36
SolidMechanics::PlaneStrain::_scalar_strain_zz
const VariableValue & _scalar_strain_zz
Definition: PlaneStrain.h:43
SolidMechanics::PlaneStrain::computeStrain
virtual void computeStrain(const unsigned qp, const SymmTensor &total_strain_old, SymmTensor &total_strain_new, SymmTensor &strain_increment)
Definition: PlaneStrain.C:38
SymmTensor::yy
Real yy() const
Definition: SymmTensor.h:132
SolidModel.h
SolidModel::qrule
const QBase * qrule()
Definition: SolidModel.h:55
SolidMechanics::PlaneStrain::_volumetric_locking_correction
const bool _volumetric_locking_correction
Definition: PlaneStrain.h:44
PlaneStrain.h
SolidModel::JxW
Real JxW(unsigned i) const
Definition: SolidModel.h:57
SolidMechanics::PlaneStrain::_grad_disp_y
const VariableGradient & _grad_disp_y
Definition: PlaneStrain.h:39