www.mooseframework.org
Linear.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 "Linear.h"
11 #include "SolidModel.h"
12 #include "Problem.h"
13 #include "MooseMesh.h"
14 #include "libmesh/quadrature.h"
15 
16 namespace SolidMechanics
17 {
18 
19 Linear::Linear(SolidModel & solid_model,
20  const std::string & name,
21  const InputParameters & parameters)
22  : Element(solid_model, name, parameters),
23  _large_strain(solid_model.getParamTempl<bool>("large_strain")),
24  _grad_disp_x(coupledGradient("disp_x")),
25  _grad_disp_y(coupledGradient("disp_y")),
26  _grad_disp_z(parameters.get<SubProblem *>("_subproblem")->mesh().dimension() == 3
27  ? coupledGradient("disp_z")
28  : _grad_zero),
29  _volumetric_locking_correction(solid_model.getParamTempl<bool>("volumetric_locking_correction"))
30 {
31 }
32 
34 
35 void
36 Linear::computeStrain(const unsigned qp,
37  const SymmTensor & total_strain_old,
38  SymmTensor & total_strain_new,
39  SymmTensor & strain_increment)
40 {
41  strain_increment.xx(_grad_disp_x[qp](0));
42  strain_increment.yy(_grad_disp_y[qp](1));
43  strain_increment.zz(_grad_disp_z[qp](2));
44  strain_increment.xy(0.5 * (_grad_disp_x[qp](1) + _grad_disp_y[qp](0)));
45  strain_increment.yz(0.5 * (_grad_disp_y[qp](2) + _grad_disp_z[qp](1)));
46  strain_increment.zx(0.5 * (_grad_disp_z[qp](0) + _grad_disp_x[qp](2)));
47  if (_large_strain)
48  {
49  strain_increment.xx() += 0.5 * (_grad_disp_x[qp](0) * _grad_disp_x[qp](0) +
50  _grad_disp_y[qp](0) * _grad_disp_y[qp](0) +
51  _grad_disp_z[qp](0) * _grad_disp_z[qp](0));
52  strain_increment.yy() += 0.5 * (_grad_disp_x[qp](1) * _grad_disp_x[qp](1) +
53  _grad_disp_y[qp](1) * _grad_disp_y[qp](1) +
54  _grad_disp_z[qp](1) * _grad_disp_z[qp](1));
55  strain_increment.zz() += 0.5 * (_grad_disp_x[qp](2) * _grad_disp_x[qp](2) +
56  _grad_disp_y[qp](2) * _grad_disp_y[qp](2) +
57  _grad_disp_z[qp](2) * _grad_disp_z[qp](2));
58  strain_increment.xy() += 0.5 * (_grad_disp_x[qp](0) * _grad_disp_x[qp](1) +
59  _grad_disp_y[qp](0) * _grad_disp_y[qp](1) +
60  _grad_disp_z[qp](0) * _grad_disp_z[qp](1));
61  strain_increment.yz() += 0.5 * (_grad_disp_x[qp](1) * _grad_disp_x[qp](2) +
62  _grad_disp_y[qp](1) * _grad_disp_y[qp](2) +
63  _grad_disp_z[qp](1) * _grad_disp_z[qp](2));
64  strain_increment.zx() += 0.5 * (_grad_disp_x[qp](2) * _grad_disp_x[qp](0) +
65  _grad_disp_y[qp](2) * _grad_disp_y[qp](0) +
66  _grad_disp_z[qp](2) * _grad_disp_z[qp](0));
67  }
68 
70  {
71  // volumetric locking correction - averaging the volumertic strain over the element
72  Real volumetric_strain = 0.0;
73  Real volume = 0.0;
74  for (unsigned int qp_loop = 0; qp_loop < _solid_model.qrule()->n_points(); ++qp_loop)
75  {
76  volumetric_strain +=
77  (_grad_disp_x[qp_loop](0) + _grad_disp_y[qp_loop](1) + _grad_disp_z[qp_loop](2)) / 3.0 *
78  _solid_model.JxW(qp_loop);
79 
80  volume += _solid_model.JxW(qp_loop);
81 
82  if (_large_strain)
83  {
84  volumetric_strain += 0.5 *
85  (_grad_disp_x[qp_loop](0) * _grad_disp_x[qp_loop](0) +
86  _grad_disp_y[qp_loop](0) * _grad_disp_y[qp_loop](0) +
87  _grad_disp_z[qp_loop](0) * _grad_disp_z[qp_loop](0)) /
88  3.0 * _solid_model.JxW(qp_loop);
89  volumetric_strain += 0.5 *
90  (_grad_disp_x[qp_loop](1) * _grad_disp_x[qp_loop](1) +
91  _grad_disp_y[qp_loop](1) * _grad_disp_y[qp_loop](1) +
92  _grad_disp_z[qp_loop](1) * _grad_disp_z[qp_loop](1)) /
93  3.0 * _solid_model.JxW(qp_loop);
94  volumetric_strain += 0.5 *
95  (_grad_disp_x[qp_loop](2) * _grad_disp_x[qp_loop](2) +
96  _grad_disp_y[qp_loop](2) * _grad_disp_y[qp_loop](2) +
97  _grad_disp_z[qp_loop](2) * _grad_disp_z[qp_loop](2)) /
98  3.0 * _solid_model.JxW(qp_loop);
99  }
100  }
101 
102  volumetric_strain /= volume; // average volumetric strain
103 
104  // strain increment at _qp
105  Real trace = strain_increment.trace();
106  strain_increment.xx() += volumetric_strain - trace / 3.0;
107  strain_increment.yy() += volumetric_strain - trace / 3.0;
108  strain_increment.zz() += volumetric_strain - trace / 3.0;
109  }
110 
111  total_strain_new = strain_increment;
112  strain_increment -= total_strain_old;
113 }
114 }
SymmTensor::xx
Real xx() const
Definition: SymmTensor.h:131
SymmTensor::trace
Real trace() const
Definition: SymmTensor.h:97
SymmTensor::zx
Real zx() const
Definition: SymmTensor.h:136
SymmTensor::zz
Real zz() const
Definition: SymmTensor.h:133
SolidMechanics::Linear::_grad_disp_x
const VariableGradient & _grad_disp_x
Definition: Linear.h:34
SolidMechanics::Linear::computeStrain
virtual void computeStrain(const unsigned qp, const SymmTensor &total_strain_old, SymmTensor &total_strain_new, SymmTensor &strain_increment)
Definition: Linear.C:36
SolidMechanics::Linear::Linear
Linear(SolidModel &solid_model, const std::string &name, const InputParameters &parameters)
Definition: Linear.C:19
SymmTensor::xy
Real xy() const
Definition: SymmTensor.h:134
SolidMechanics
Definition: AxisymmetricRZ.h:16
SolidMechanics::Linear::_grad_disp_y
const VariableGradient & _grad_disp_y
Definition: Linear.h:35
SolidMechanics::Linear::_volumetric_locking_correction
const bool _volumetric_locking_correction
Definition: Linear.h:37
SolidModel
SolidModel is the base class for all this module's solid mechanics material models.
Definition: SolidModel.h:33
SolidMechanics::Linear::~Linear
virtual ~Linear()
Definition: Linear.C:33
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::Element
Element is the base class for all of this module's solid mechanics element formulations.
Definition: Element.h:25
SolidMechanics::Linear::_grad_disp_z
const VariableGradient & _grad_disp_z
Definition: Linear.h:36
SymmTensor
Definition: SymmTensor.h:21
Linear.h
SymmTensor::yy
Real yy() const
Definition: SymmTensor.h:132
SolidModel.h
SolidMechanics::Linear::_large_strain
const bool _large_strain
Definition: Linear.h:32
SolidModel::qrule
const QBase * qrule()
Definition: SolidModel.h:55
SolidModel::JxW
Real JxW(unsigned i) const
Definition: SolidModel.h:57