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