www.mooseframework.org
ElasticEnergyMaterial.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 "ElasticEnergyMaterial.h"
11 #include "RankTwoTensor.h"
12 #include "RankFourTensor.h"
13 
15 
16 template <>
17 InputParameters
19 {
20  InputParameters params = validParams<DerivativeFunctionMaterialBase>();
21  params.addClassDescription("Free energy material for the elastic energy contributions.");
22  params.addParam<std::string>("base_name", "Material property base name");
23  params.addRequiredCoupledVar("args", "Arguments of F() - use vector coupling");
24  params.addCoupledVar("displacement_gradients",
25  "Vector of displacement gradient variables (see "
26  "Modules/PhaseField/DisplacementGradients "
27  "action)");
28  return params;
29 }
30 
31 ElasticEnergyMaterial::ElasticEnergyMaterial(const InputParameters & parameters)
32  : DerivativeFunctionMaterialBase(parameters),
33  _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
34  _stress(getMaterialPropertyByName<RankTwoTensor>(_base_name + "stress")),
35  _elasticity_tensor(getMaterialPropertyByName<RankFourTensor>(_base_name + "elasticity_tensor")),
36  _strain(getMaterialPropertyByName<RankTwoTensor>(_base_name + "elastic_strain"))
37 {
38  _dstrain.resize(_nargs);
39  _d2strain.resize(_nargs);
40  _delasticity_tensor.resize(_nargs);
41  _d2elasticity_tensor.resize(_nargs);
42 
43  // fetch stress and elasticity tensor derivatives (in simple eigenstrain models this is is only
44  // w.r.t. 'c')
45  for (unsigned int i = 0; i < _nargs; ++i)
46  {
47  _dstrain[i] = &getMaterialPropertyDerivativeByName<RankTwoTensor>(_base_name + "elastic_strain",
48  _arg_names[i]);
49  _delasticity_tensor[i] = &getMaterialPropertyDerivativeByName<RankFourTensor>(
50  _base_name + "elasticity_tensor", _arg_names[i]);
51 
52  _d2strain[i].resize(_nargs);
53  _d2elasticity_tensor[i].resize(_nargs);
54 
55  for (unsigned int j = 0; j < _nargs; ++j)
56  {
57  _d2strain[i][j] = &getMaterialPropertyDerivativeByName<RankTwoTensor>(
58  _base_name + "elastic_strain", _arg_names[i], _arg_names[j]);
59  _d2elasticity_tensor[i][j] = &getMaterialPropertyDerivativeByName<RankFourTensor>(
60  _base_name + "elasticity_tensor", _arg_names[i], _arg_names[j]);
61  }
62  }
63 }
64 
65 void
67 {
68  validateCoupling<RankTwoTensor>(_base_name + "elastic_strain");
69  validateCoupling<RankFourTensor>(_base_name + "elasticity_tensor");
70 }
71 
72 Real
74 {
75  return 0.5 * _stress[_qp].doubleContraction(_strain[_qp]);
76 }
77 
78 Real
80 {
81  unsigned int i = argIndex(i_var);
82 
83  // product rule d/di computeF (doubleContraction commutes)
84  return 0.5 * ((*_delasticity_tensor[i])[_qp] * _strain[_qp]).doubleContraction(_strain[_qp]) +
85  (_elasticity_tensor[_qp] * (*_dstrain[i])[_qp]).doubleContraction(_strain[_qp]);
86 }
87 
88 Real
89 ElasticEnergyMaterial::computeD2F(unsigned int i_var, unsigned int j_var)
90 {
91  unsigned int i = argIndex(i_var);
92  unsigned int j = argIndex(j_var);
93 
94  // product rule d/dj computeDF
95  // TODO: simplify because doubleContraction commutes
96  return 0.5 * (((*_d2elasticity_tensor[i][j])[_qp] * _strain[_qp] +
97  (*_delasticity_tensor[i])[_qp] * (*_dstrain[j])[_qp] +
98  (*_delasticity_tensor[j])[_qp] * (*_dstrain[i])[_qp] +
99  _elasticity_tensor[_qp] * (*_d2strain[i][j])[_qp])
100  .doubleContraction(_strain[_qp]) +
101  ((*_delasticity_tensor[i])[_qp] * _strain[_qp] +
102  _elasticity_tensor[_qp] * (*_dstrain[i])[_qp])
103  .doubleContraction((*_dstrain[j])[_qp])
104 
105  +
106  ( // dstress/dj
107  (*_delasticity_tensor[j])[_qp] * _strain[_qp] +
108  _elasticity_tensor[_qp] * (*_dstrain[j])[_qp])
109  .doubleContraction((*_dstrain[i])[_qp]) +
110  _stress[_qp].doubleContraction((*_d2strain[i][j])[_qp]));
111 }
ElasticEnergyMaterial::computeD2F
virtual Real computeD2F(unsigned int i_var, unsigned int j_var) override
Definition: ElasticEnergyMaterial.C:89
ElasticEnergyMaterial::ElasticEnergyMaterial
ElasticEnergyMaterial(const InputParameters &parameters)
Definition: ElasticEnergyMaterial.C:31
ElasticEnergyMaterial::_stress
const MaterialProperty< RankTwoTensor > & _stress
Stress tensor.
Definition: ElasticEnergyMaterial.h:44
ElasticEnergyMaterial.h
ElasticEnergyMaterial::_strain
const MaterialProperty< RankTwoTensor > & _strain
Strain and derivatives.
Definition: ElasticEnergyMaterial.h:55
ElasticEnergyMaterial::_d2strain
std::vector< std::vector< const MaterialProperty< RankTwoTensor > * > > _d2strain
Definition: ElasticEnergyMaterial.h:57
ElasticEnergyMaterial::_dstrain
std::vector< const MaterialProperty< RankTwoTensor > * > _dstrain
Definition: ElasticEnergyMaterial.h:56
ElasticEnergyMaterial::_delasticity_tensor
std::vector< const MaterialProperty< RankFourTensor > * > _delasticity_tensor
Definition: ElasticEnergyMaterial.h:50
RankFourTensorTempl
Definition: ACGrGrElasticDrivingForce.h:20
ElasticEnergyMaterial::_d2elasticity_tensor
std::vector< std::vector< const MaterialProperty< RankFourTensor > * > > _d2elasticity_tensor
Definition: ElasticEnergyMaterial.h:51
registerMooseObject
registerMooseObject("PhaseFieldApp", ElasticEnergyMaterial)
ElasticEnergyMaterial::_elasticity_tensor
const MaterialProperty< RankFourTensor > & _elasticity_tensor
Elasticity tensor derivatives.
Definition: ElasticEnergyMaterial.h:49
RankTwoTensorTempl< Real >
validParams< ElasticEnergyMaterial >
InputParameters validParams< ElasticEnergyMaterial >()
Definition: ElasticEnergyMaterial.C:18
ElasticEnergyMaterial::computeDF
virtual Real computeDF(unsigned int i_var) override
Definition: ElasticEnergyMaterial.C:79
ElasticEnergyMaterial::initialSetup
virtual void initialSetup() override
Definition: ElasticEnergyMaterial.C:66
ElasticEnergyMaterial::computeF
virtual Real computeF() override
Definition: ElasticEnergyMaterial.C:73
ElasticEnergyMaterial::_base_name
const std::string _base_name
Definition: ElasticEnergyMaterial.h:41
ElasticEnergyMaterial
Material class to compute the elastic free energy and its derivatives.
Definition: ElasticEnergyMaterial.h:29