www.mooseframework.org
ACGrGrMulti.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 "ACGrGrMulti.h"
11 
12 registerMooseObject("PhaseFieldApp", ACGrGrMulti);
13 
14 template <>
15 InputParameters
17 {
18  InputParameters params = validParams<ACGrGrBase>();
19  params.addClassDescription("Multi-phase poly-crystalline Allen-Cahn Kernel");
20  params.addRequiredParam<std::vector<MaterialPropertyName>>(
21  "gamma_names",
22  "List of gamma material property names for each other order parameter. Place "
23  "in same order as order parameters (v)!");
24  return params;
25 }
26 
27 ACGrGrMulti::ACGrGrMulti(const InputParameters & parameters)
28  : ACGrGrBase(parameters),
29  _gamma_names(getParam<std::vector<MaterialPropertyName>>("gamma_names")),
30  _num_j(_gamma_names.size()),
31  _prop_gammas(_num_j),
32  _uname(getParam<NonlinearVariableName>("variable")),
33  _dmudu(getMaterialPropertyDerivative<Real>("mu", _uname)),
34  _vname(getParam<std::vector<VariableName>>("v")),
35  _dmudEtaj(_num_j)
36 {
37  // check passed in parameter vectors
38  if (_num_j != coupledComponents("v"))
39  paramError("gamma_names",
40  "Need to pass in as many gamma_names as coupled variables in v in ACGrGrMulti");
41 
42  for (unsigned int n = 0; n < _num_j; ++n)
43  {
44  _prop_gammas[n] = &getMaterialPropertyByName<Real>(_gamma_names[n]);
45  _dmudEtaj[n] = &getMaterialPropertyDerivative<Real>("mu", _vname[n]);
46  }
47 }
48 
49 Real
50 ACGrGrMulti::computeDFDOP(PFFunctionType type)
51 {
52  // Sum all other order parameters
53  Real SumGammaEtaj = 0.0;
54  for (unsigned int i = 0; i < _op_num; ++i)
55  SumGammaEtaj += (*_prop_gammas[i])[_qp] * (*_vals[i])[_qp] * (*_vals[i])[_qp];
56 
57  // Calculate either the residual or Jacobian of the grain growth free energy
58  switch (type)
59  {
60  case Residual:
61  {
62  return _mu[_qp] * computedF0du();
63  }
64 
65  case Jacobian:
66  {
67  Real d2f0du2 = 3.0 * _u[_qp] * _u[_qp] - 1.0 + 2.0 * SumGammaEtaj;
68  return _phi[_j][_qp] * (_mu[_qp] * d2f0du2 + _dmudu[_qp] * computedF0du());
69  }
70 
71  default:
72  mooseError("Invalid type passed in");
73  }
74 }
75 
76 Real
78 {
79  for (unsigned int i = 0; i < _op_num; ++i)
80  if (jvar == _vals_var[i])
81  {
82  // Derivative of SumGammaEtaj
83  const Real dSumGammaEtaj = 2.0 * (*_prop_gammas[i])[_qp] * (*_vals[i])[_qp];
84  const Real dDFDOP = _mu[_qp] * 2.0 * _u[_qp] * dSumGammaEtaj;
85 
86  return _L[_qp] * _test[_i][_qp] * _phi[_j][_qp] *
87  (dDFDOP + (*_dmudEtaj[i])[_qp] * computedF0du());
88  }
89 
90  return 0.0;
91 }
92 
93 Real
95 {
96  Real SumGammaEtaj = 0.0;
97  for (unsigned int i = 0; i < _op_num; ++i)
98  SumGammaEtaj += (*_prop_gammas[i])[_qp] * (*_vals[i])[_qp] * (*_vals[i])[_qp];
99 
100  return _u[_qp] * _u[_qp] * _u[_qp] - _u[_qp] + 2.0 * _u[_qp] * SumGammaEtaj;
101 }
ACGrGrMulti
This kernel calculates the residual for grain growth for a multi-phase, poly-crystal system.
Definition: ACGrGrMulti.h:25
ACGrGrMulti::_gamma_names
std::vector< MaterialPropertyName > _gamma_names
Names of gammas for each order parameter.
Definition: ACGrGrMulti.h:35
ACGrGrMulti::_num_j
unsigned int _num_j
Definition: ACGrGrMulti.h:36
ACGrGrMulti::computeDFDOP
virtual Real computeDFDOP(PFFunctionType type)
Definition: ACGrGrMulti.C:50
ACGrGrMulti::_dmudu
const MaterialProperty< Real > & _dmudu
Definition: ACGrGrMulti.h:42
ACBulk< Real >::Residual
Definition: ACBulk.h:40
ACGrGrBase::_vals
std::vector< const VariableValue * > _vals
Definition: ACGrGrBase.h:33
registerMooseObject
registerMooseObject("PhaseFieldApp", ACGrGrMulti)
ACGrGrBase::_op_num
const unsigned int _op_num
Definition: ACGrGrBase.h:31
ACGrGrMulti::_prop_gammas
std::vector< const MaterialProperty< Real > * > _prop_gammas
Values of gammas for each order parameter.
Definition: ACGrGrMulti.h:39
ACGrGrMulti::computeQpOffDiagJacobian
virtual Real computeQpOffDiagJacobian(unsigned int jvar)
Definition: ACGrGrMulti.C:77
validParams< ACGrGrMulti >
InputParameters validParams< ACGrGrMulti >()
Definition: ACGrGrMulti.C:16
ACGrGrMulti::_dmudEtaj
std::vector< const MaterialProperty< Real > * > _dmudEtaj
Definition: ACGrGrMulti.h:44
ACGrGrBase::_vals_var
std::vector< unsigned int > _vals_var
Definition: ACGrGrBase.h:34
ACGrGrBase
This is the base class for kernels that calculate the residual for grain growth.
Definition: ACGrGrBase.h:25
validParams< ACGrGrBase >
InputParameters validParams< ACGrGrBase >()
Definition: ACGrGrBase.C:14
ACBulk< Real >::Jacobian
Definition: ACBulk.h:39
ACGrGrMulti::computedF0du
Real computedF0du()
Definition: ACGrGrMulti.C:94
ACGrGrMulti::_vname
const std::vector< VariableName > _vname
Definition: ACGrGrMulti.h:43
ACGrGrMulti::ACGrGrMulti
ACGrGrMulti(const InputParameters &parameters)
Definition: ACGrGrMulti.C:27
ACBulk< Real >::_L
const MaterialProperty< Real > & _L
Mobility.
Definition: ACBulk.h:46
ACGrGrMulti.h
ACGrGrBase::_mu
const MaterialProperty< Real > & _mu
Definition: ACGrGrBase.h:36