www.mooseframework.org
DerivativeMultiPhaseBase.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 template <>
13 InputParameters
15 {
16  InputParameters params = validParams<DerivativeFunctionMaterialBase>();
17 
18  // Phase materials 1-n
19  params.addRequiredParam<std::vector<MaterialPropertyName>>(
20  "fi_names", "List of free energies for the n phases");
21  params.addParam<std::vector<MaterialPropertyName>>(
22  "hi_names", "Switching Function Materials that provide h(eta_i)");
23 
24  // All arguments of the phase free energies
25  params.addCoupledVar("args", "Arguments of the fi free energies - use vector coupling");
26  params.addCoupledVar("displacement_gradients",
27  "Vector of displacement gradient variables (see "
28  "Modules/PhaseField/DisplacementGradients "
29  "action)");
30 
31  // Barrier
32  params.addParam<MaterialPropertyName>(
33  "g", "g", "Barrier Function Material that provides g(eta_i)");
34  params.addParam<Real>("W", 0.0, "Energy barrier for the phase transformation from A to B");
35 
36  return params;
37 }
38 
39 DerivativeMultiPhaseBase::DerivativeMultiPhaseBase(const InputParameters & parameters)
40  : DerivativeFunctionMaterialBase(parameters),
41  _eta_index(_nargs, -1),
42  _num_etas(coupledComponents("etas")),
43  _eta_names(_num_etas),
44  _eta_vars(_num_etas),
45  _fi_names(getParam<std::vector<MaterialPropertyName>>("fi_names")),
46  _num_fi(_fi_names.size()),
47  _prop_Fi(_num_fi),
48  _prop_dFi(_num_fi),
49  _prop_d2Fi(_num_fi),
50  _prop_d3Fi(_num_fi),
51  _hi_names(getParam<std::vector<MaterialPropertyName>>("hi_names")),
52  _num_hi(_hi_names.size()),
53  _hi(_num_hi),
54  _g(getMaterialProperty<Real>("g")),
55  _dg(_num_etas),
56  _d2g(_num_etas),
57  _d3g(_num_etas),
58  _W(getParam<Real>("W"))
59 {
60  // check passed in parameter vectors
61  if (_num_fi != _num_hi)
62  mooseError("Need to pass in as many hi_names as fi_names in DerivativeMultiPhaseBase ", name());
63 
64  // get order parameter names and libmesh variable names, set barrier function derivatives
65  for (unsigned int i = 0; i < _num_etas; ++i)
66  {
67  _eta_names[i] = getVar("etas", i)->name();
68  _eta_vars[i] = coupled("etas", i);
69 
70  // for each coupled variable we need to know if it was coupled through "etas"
71  // and - if so - which coupled component of "etas" it comes from
72  _eta_index[argIndex(_eta_vars[i])] = i;
73 
74  // barrier function derivatives
75  _dg[i] = &getMaterialPropertyDerivative<Real>("g", _eta_names[i]);
76  _d2g[i].resize(_num_etas);
77  if (_third_derivatives)
78  _d3g[i].resize(_num_etas);
79 
80  for (unsigned int j = 0; j < _num_etas; ++j)
81  {
82  _d2g[i][j] = &getMaterialPropertyDerivative<Real>("g", _eta_names[i], _eta_names[j]);
83 
84  if (_third_derivatives)
85  {
86  _d3g[i][j].resize(_num_etas);
87  for (unsigned int k = 0; k < _num_etas; ++k)
88  _d3g[i][j][k] = &getMaterialPropertyDerivative<Real>(
89  "g", _eta_names[i], _eta_names[j], _eta_names[k]);
90  }
91  }
92  }
93 
94  // reserve space and set phase material properties
95  for (unsigned int n = 0; n < _num_fi; ++n)
96  {
97  // get phase free energy
98  _prop_Fi[n] = &getMaterialPropertyByName<Real>(_fi_names[n]);
99  _prop_dFi[n].resize(_nargs);
100  _prop_d2Fi[n].resize(_nargs);
101  _prop_d3Fi[n].resize(_nargs);
102 
103  // get switching function
104  _hi[n] = &getMaterialPropertyByName<Real>(_hi_names[n]);
105 
106  for (unsigned int i = 0; i < _nargs; ++i)
107  {
108  _prop_dFi[n][i] = &getMaterialPropertyDerivative<Real>(_fi_names[n], _arg_names[i]);
109  _prop_d2Fi[n][i].resize(_nargs);
110 
111  if (_third_derivatives)
112  _prop_d3Fi[n][i].resize(_nargs);
113 
114  for (unsigned int j = 0; j < _nargs; ++j)
115  {
116  _prop_d2Fi[n][i][j] =
117  &getMaterialPropertyDerivative<Real>(_fi_names[n], _arg_names[i], _arg_names[j]);
118 
119  if (_third_derivatives)
120  {
121  _prop_d3Fi[n][i][j].resize(_nargs);
122 
123  for (unsigned int k = 0; k < _nargs; ++k)
124  _prop_d3Fi[n][i][j][k] = &getMaterialPropertyDerivative<Real>(
125  _fi_names[n], _arg_names[i], _arg_names[j], _arg_names[k]);
126  }
127  }
128  }
129  }
130 }
131 
132 void
134 {
135  for (unsigned int n = 0; n < _num_fi; ++n)
136  validateCoupling<Real>(_fi_names[n]);
137 }
138 
139 Real
141 {
142  Real F = 0.0;
143  for (unsigned n = 0; n < _num_fi; ++n)
144  F += (*_hi[n])[_qp] * (*_prop_Fi[n])[_qp];
145  return F + _W * _g[_qp];
146 }
DerivativeMultiPhaseBase::_eta_names
std::vector< VariableName > _eta_names
Definition: DerivativeMultiPhaseBase.h:47
DerivativeMultiPhaseBase::_hi
std::vector< const MaterialProperty< Real > * > _hi
Switching functions.
Definition: DerivativeMultiPhaseBase.h:71
DerivativeMultiPhaseBase::_num_etas
unsigned int _num_etas
name of the order parameter variable
Definition: DerivativeMultiPhaseBase.h:46
DerivativeMultiPhaseBase::_dg
std::vector< const MaterialProperty< Real > * > _dg
Barrier function derivatives.
Definition: DerivativeMultiPhaseBase.h:80
validParams< DerivativeMultiPhaseBase >
InputParameters validParams< DerivativeMultiPhaseBase >()
Definition: DerivativeMultiPhaseBase.C:14
DerivativeMultiPhaseBase::_eta_vars
std::vector< unsigned int > _eta_vars
Definition: DerivativeMultiPhaseBase.h:48
DerivativeMultiPhaseBase::_d3g
std::vector< std::vector< std::vector< const MaterialProperty< Real > * > > > _d3g
Definition: DerivativeMultiPhaseBase.h:82
DerivativeMultiPhaseBase::initialSetup
virtual void initialSetup()
Definition: DerivativeMultiPhaseBase.C:133
DerivativeMultiPhaseBase::_num_hi
unsigned int _num_hi
Definition: DerivativeMultiPhaseBase.h:68
name
const std::string name
Definition: Setup.h:21
DerivativeMultiPhaseBase::_prop_d2Fi
std::vector< std::vector< std::vector< const MaterialProperty< Real > * > > > _prop_d2Fi
Second derivatives of Fi.
Definition: DerivativeMultiPhaseBase.h:61
DerivativeMultiPhaseBase.h
DerivativeMultiPhaseBase::_num_fi
unsigned int _num_fi
Definition: DerivativeMultiPhaseBase.h:52
DerivativeMultiPhaseBase::_prop_dFi
std::vector< std::vector< const MaterialProperty< Real > * > > _prop_dFi
Derivatives of Fi w.r.t. arg[i].
Definition: DerivativeMultiPhaseBase.h:58
DerivativeMultiPhaseBase::_fi_names
std::vector< MaterialPropertyName > _fi_names
phase derivative material names
Definition: DerivativeMultiPhaseBase.h:51
DerivativeMultiPhaseBase::_prop_d3Fi
std::vector< std::vector< std::vector< std::vector< const MaterialProperty< Real > * > > > > _prop_d3Fi
Third derivatives of Fi.
Definition: DerivativeMultiPhaseBase.h:64
DerivativeMultiPhaseBase::_W
Real _W
Phase transformation energy barrier.
Definition: DerivativeMultiPhaseBase.h:85
DerivativeMultiPhaseBase::_hi_names
std::vector< MaterialPropertyName > _hi_names
phase switching function names
Definition: DerivativeMultiPhaseBase.h:67
DerivativeMultiPhaseBase::computeF
virtual Real computeF()
Definition: DerivativeMultiPhaseBase.C:140
DerivativeMultiPhaseBase::DerivativeMultiPhaseBase
DerivativeMultiPhaseBase(const InputParameters &parameters)
Definition: DerivativeMultiPhaseBase.C:39
DerivativeMultiPhaseBase::_prop_Fi
std::vector< const MaterialProperty< Real > * > _prop_Fi
Function value of the i phase.
Definition: DerivativeMultiPhaseBase.h:55
DerivativeMultiPhaseBase::_g
const MaterialProperty< Real > & _g
Barrier function .
Definition: DerivativeMultiPhaseBase.h:77
DerivativeMultiPhaseBase::_eta_index
std::vector< int > _eta_index
If the variable a non-conserved OP this array holds the index into the etas parameter vector for a gi...
Definition: DerivativeMultiPhaseBase.h:40
DerivativeMultiPhaseBase::_d2g
std::vector< std::vector< const MaterialProperty< Real > * > > _d2g
Definition: DerivativeMultiPhaseBase.h:81