www.mooseframework.org
ComputeReducedOrderEigenstrain.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 
11 
12 #include "MooseMesh.h"
13 #include "libmesh/quadrature.h"
14 
16 
18 
19 InputParameters
21 {
22  InputParameters params = ComputeEigenstrainBase::validParams();
23  params.addClassDescription("accepts eigenstrains and computes a reduced order eigenstrain for "
24  "consistency in the order of strain and eigenstrains.");
25  params.addRequiredParam<std::vector<MaterialPropertyName>>(
26  "input_eigenstrain_names", "List of eigenstrains to be applied in this strain calculation");
27  return params;
28 }
29 
31  : ComputeEigenstrainBase(parameters),
32  _input_eigenstrain_names(
33  getParam<std::vector<MaterialPropertyName>>("input_eigenstrain_names")),
34  _eigenstrains(_input_eigenstrain_names.size()),
35  _subproblem(*parameters.get<SubProblem *>("_subproblem")),
36  _ncols(1 + _subproblem.mesh().dimension()),
37  _second_order(_subproblem.mesh().hasSecondOrderElements()),
38  _eigsum(),
39  _A(),
40  _b(6),
41  _AT(),
42  _ATb(_ncols),
43  _x(6, DenseVector<Real>(_ncols)),
44  _vals(6),
45  _adjusted_eigenstrain()
46 {
47  for (unsigned int i = 0; i < _eigenstrains.size(); ++i)
48  {
50  _eigenstrains[i] = &getMaterialProperty<RankTwoTensor>(_input_eigenstrain_names[i]);
51  }
52 }
53 
54 void
56 {
57  _eigenstrain[_qp].zero();
58 }
59 
60 void
62 {
64 
66 
67  Material::computeProperties();
68 }
69 
70 void
72 {
73  if (_second_order)
74  {
75  for (unsigned i = 0; i < 6; ++i)
76  {
77  _vals[i] = _x[i](0);
78  for (unsigned j = 1; j < _ncols; ++j)
79  _vals[i] += _x[i](j) * _q_point[_qp](j - 1);
80  }
81  _adjusted_eigenstrain.fillFromInputVector(_vals);
82  }
84 }
85 
86 void
88 {
89  _eigsum.resize(_qrule->n_points());
90  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
91  {
92  _eigsum[_qp].zero();
93  for (auto es : _eigenstrains)
94  _eigsum[_qp] += (*es)[_qp];
95  }
96 }
97 
98 void
100 {
101  // The eigenstrains can either be constant in an element or linear in x, y, z
102  // If constant, do volume averaging.
103  if (!_second_order || _qrule->n_points() == 1)
104  {
105  // Volume average
106  _adjusted_eigenstrain.zero();
107  Real vol = 0.0;
108  for (unsigned qp = 0; qp < _qrule->n_points(); ++qp)
109  {
110  _adjusted_eigenstrain += _eigsum[qp] * _JxW[qp] * _coord[qp];
111  vol += _JxW[qp] * _coord[qp];
112  }
113  _adjusted_eigenstrain /= vol;
114  }
115  else
116  {
117  // 1 x y z
118 
119  // Six sets (one for each unique component of eigen) of qp data
120  _A.resize(_qrule->n_points(), _ncols);
121  for (auto && b : _b)
122  b.resize(_qrule->n_points());
123 
124  for (unsigned qp = 0; qp < _qrule->n_points(); ++qp)
125  {
126  _A(qp, 0) = 1.0;
127  for (unsigned j = 1; j < _ncols; ++j)
128  _A(qp, j) = _q_point[qp](j - 1);
129 
130  _b[0](qp) = _eigsum[qp](0, 0);
131  _b[1](qp) = _eigsum[qp](1, 1);
132  _b[2](qp) = _eigsum[qp](2, 2);
133  _b[3](qp) = _eigsum[qp](1, 2);
134  _b[4](qp) = _eigsum[qp](0, 2);
135  _b[5](qp) = _eigsum[qp](0, 1);
136  }
137 
138  _A.get_transpose(_AT);
139  _A.left_multiply(_AT);
140  for (unsigned i = 0; i < 6; ++i)
141  {
142  _AT.vector_mult(_ATb, _b[i]);
143 
144  _A.cholesky_solve(_ATb, _x[i]);
145  }
146  }
147 }
ComputeReducedOrderEigenstrain::initQpStatefulProperties
void initQpStatefulProperties()
Definition: ComputeReducedOrderEigenstrain.C:55
ComputeReducedOrderEigenstrain::_AT
DenseMatrix< Real > _AT
Transpose of A.
Definition: ComputeReducedOrderEigenstrain.h:64
registerMooseObject
registerMooseObject("TensorMechanicsApp", ComputeReducedOrderEigenstrain)
ComputeReducedOrderEigenstrain::_x
std::vector< DenseVector< Real > > _x
The solution vector for each unique component of the adjusted eigenstrain.
Definition: ComputeReducedOrderEigenstrain.h:68
ComputeReducedOrderEigenstrain::_A
DenseMatrix< Real > _A
The (num q points x ncols) array for the least squares. Holds 1, xcoor, ycoor, zcoor.
Definition: ComputeReducedOrderEigenstrain.h:60
ComputeReducedOrderEigenstrain::_vals
std::vector< Real > _vals
Vector to hold the adjusted strain as computed with _x.
Definition: ComputeReducedOrderEigenstrain.h:70
ComputeReducedOrderEigenstrain::ComputeReducedOrderEigenstrain
ComputeReducedOrderEigenstrain(const InputParameters &parameters)
Definition: ComputeReducedOrderEigenstrain.C:30
ComputeReducedOrderEigenstrain::prepareEigenstrain
void prepareEigenstrain()
Compute either the volume average or linear eigenstrain field in an element.
Definition: ComputeReducedOrderEigenstrain.C:99
ComputeReducedOrderEigenstrain::_second_order
const bool _second_order
Whether the mesh is made of second order elements.
Definition: ComputeReducedOrderEigenstrain.h:56
ComputeEigenstrainBase::_base_name
const std::string _base_name
Base name prepended to material property name.
Definition: ComputeEigenstrainBase.h:41
ComputeEigenstrainBase::validParams
static InputParameters validParams()
Definition: ComputeEigenstrainBase.C:17
ComputeReducedOrderEigenstrain::validParams
static InputParameters validParams()
Definition: ComputeReducedOrderEigenstrain.C:20
ComputeReducedOrderEigenstrain.h
ComputeReducedOrderEigenstrain
Definition: ComputeReducedOrderEigenstrain.h:28
defineLegacyParams
defineLegacyParams(ComputeReducedOrderEigenstrain)
ComputeReducedOrderEigenstrain::_ncols
const unsigned _ncols
Number of columns in A matrix (1 plus mesh dimension)
Definition: ComputeReducedOrderEigenstrain.h:54
ComputeReducedOrderEigenstrain::_eigsum
std::vector< RankTwoTensor > _eigsum
The sum of all eigenstrains at each integration point.
Definition: ComputeReducedOrderEigenstrain.h:58
ComputeReducedOrderEigenstrain::_b
std::vector< DenseVector< Real > > _b
The b array holding the unique eigenstrain components for each integration point.
Definition: ComputeReducedOrderEigenstrain.h:62
ComputeReducedOrderEigenstrain::sumEigenstrain
void sumEigenstrain()
Add contributions from every eigenstrain at each integration point.
Definition: ComputeReducedOrderEigenstrain.C:87
ComputeReducedOrderEigenstrain::computeProperties
void computeProperties()
Definition: ComputeReducedOrderEigenstrain.C:61
ComputeReducedOrderEigenstrain::_adjusted_eigenstrain
RankTwoTensor _adjusted_eigenstrain
Filled with _vals and subracted from strain.
Definition: ComputeReducedOrderEigenstrain.h:72
ComputeReducedOrderEigenstrain::_ATb
DenseVector< Real > _ATb
Transpose of A times b.
Definition: ComputeReducedOrderEigenstrain.h:66
ComputeReducedOrderEigenstrain::computeQpEigenstrain
void computeQpEigenstrain()
Compute the eigenstrain and store in _eigenstrain.
Definition: ComputeReducedOrderEigenstrain.C:71
ComputeReducedOrderEigenstrain::_eigenstrains
std::vector< const MaterialProperty< RankTwoTensor > * > _eigenstrains
Definition: ComputeReducedOrderEigenstrain.h:50
ComputeReducedOrderEigenstrain::_input_eigenstrain_names
std::vector< MaterialPropertyName > _input_eigenstrain_names
Definition: ComputeReducedOrderEigenstrain.h:49
ComputeEigenstrainBase
ComputeEigenstrainBase is the base class for eigenstrain tensors.
Definition: ComputeEigenstrainBase.h:26
ComputeEigenstrainBase::_eigenstrain
MaterialProperty< RankTwoTensor > & _eigenstrain
Stores the current total eigenstrain.
Definition: ComputeEigenstrainBase.h:47