www.mooseframework.org
ACInterface.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 "ACInterface.h"
11 
12 registerMooseObject("PhaseFieldApp", ACInterface);
13 
16 {
18  params.addClassDescription("Gradient energy Allen-Cahn Kernel");
19  params.addParam<MaterialPropertyName>("mob_name", "L", "The mobility used with the kernel");
20  params.addParam<MaterialPropertyName>("kappa_name", "kappa_op", "The kappa used with the kernel");
21  params.addParam<bool>("variable_L",
22  true,
23  "The mobility is a function of any MOOSE variable (if "
24  "this is set to false L must be constant over the "
25  "entire domain!)");
26  return params;
27 }
28 
31  _L(getMaterialProperty<Real>("mob_name")),
32  _kappa(getMaterialProperty<Real>("kappa_name")),
33  _variable_L(getParam<bool>("variable_L")),
34  _dLdop(getMaterialPropertyDerivative<Real>("mob_name", _var.name())),
35  _d2Ldop2(getMaterialPropertyDerivative<Real>("mob_name", _var.name(), _var.name())),
36  _dkappadop(getMaterialPropertyDerivative<Real>("kappa_name", _var.name())),
37  _dLdarg(_n_args),
38  _d2Ldargdop(_n_args),
39  _d2Ldarg2(_n_args),
40  _dkappadarg(_n_args),
41  _gradarg(_n_args)
42 {
43  // Get mobility and kappa derivatives and coupled variable gradients
44  for (unsigned int i = 0; i < _n_args; ++i)
45  {
47  const VariableName iname = ivar->name();
48  if (iname == _var.name())
49  {
50  if (isCoupled("args"))
51  paramError("args",
52  "The kernel variable should not be specified in the coupled `args` parameter.");
53  else
54  paramError("coupled_variables",
55  "The kernel variable should not be specified in the coupled `coupled_variables` "
56  "parameter.");
57  }
58 
59  _dLdarg[i] = &getMaterialPropertyDerivative<Real>("mob_name", i);
60  _dkappadarg[i] = &getMaterialPropertyDerivative<Real>("kappa_name", i);
61  _d2Ldargdop[i] = &getMaterialPropertyDerivative<Real>("mob_name", iname, _var.name());
62 
63  _gradarg[i] = &(ivar->gradSln());
64 
65  _d2Ldarg2[i].resize(_n_args);
66  for (unsigned int j = 0; j < _n_args; ++j)
67  _d2Ldarg2[i][j] = &getMaterialPropertyDerivative<Real>("mob_name", i, j);
68  }
69 }
70 
71 void
73 {
74  validateCoupling<Real>("mob_name");
75  validateCoupling<Real>("kappa_name");
76 }
77 
80 {
82  for (unsigned int i = 0; i < _n_args; ++i)
83  g += (*_gradarg[i])[_qp] * (*_dLdarg[i])[_qp];
84  return g;
85 }
86 
89 {
90  // sum is the product rule gradient \f$ \nabla (L\psi) \f$
91  RealGradient sum = _L[_qp] * _grad_test[_i][_qp];
92 
93  if (_variable_L)
94  sum += gradL() * _test[_i][_qp];
95 
96  return sum;
97 }
98 
101 {
102  return _kappa[_qp] * nablaLPsi();
103 }
104 
105 Real
107 {
108  return _grad_u[_qp] * kappaNablaLPsi();
109 }
110 
111 Real
113 {
114  // dsum is the derivative \f$ \frac\partial{\partial \eta} \left( \nabla (L\psi) \right) \f$
115  RealGradient dsum =
116  (_dkappadop[_qp] * _L[_qp] + _kappa[_qp] * _dLdop[_qp]) * _phi[_j][_qp] * _grad_test[_i][_qp];
117 
118  // compute the derivative of the gradient of the mobility
119  if (_variable_L)
120  {
121  RealGradient dgradL =
123 
124  for (unsigned int i = 0; i < _n_args; ++i)
125  dgradL += (*_gradarg[i])[_qp] * _phi[_j][_qp] * (*_d2Ldargdop[i])[_qp];
126 
127  dsum += (_kappa[_qp] * dgradL + _dkappadop[_qp] * _phi[_j][_qp] * gradL()) * _test[_i][_qp];
128  }
129 
130  return _grad_phi[_j][_qp] * kappaNablaLPsi() + _grad_u[_qp] * dsum;
131 }
132 
133 Real
135 {
136  // get the coupled variable jvar is referring to
137  const unsigned int cvar = mapJvarToCvar(jvar);
138 
139  // dsum is the derivative \f$ \frac\partial{\partial \eta} \left( \nabla (L\psi) \right) \f$
140  RealGradient dsum = ((*_dkappadarg[cvar])[_qp] * _L[_qp] + _kappa[_qp] * (*_dLdarg[cvar])[_qp]) *
141  _phi[_j][_qp] * _grad_test[_i][_qp];
142 
143  // compute the derivative of the gradient of the mobility
144  if (_variable_L)
145  {
146  RealGradient dgradL = _grad_phi[_j][_qp] * (*_dLdarg[cvar])[_qp] +
147  _grad_u[_qp] * _phi[_j][_qp] * (*_d2Ldargdop[cvar])[_qp];
148 
149  for (unsigned int i = 0; i < _n_args; ++i)
150  dgradL += (*_gradarg[i])[_qp] * _phi[_j][_qp] * (*_d2Ldarg2[cvar][i])[_qp];
151 
152  dsum += (_kappa[_qp] * dgradL + _dkappadop[_qp] * _phi[_j][_qp] * gradL()) * _test[_i][_qp];
153  }
154 
155  return _grad_u[_qp] * dsum;
156 }
virtual bool isCoupled(const std::string &var_name, unsigned int i=0) const
static InputParameters validParams()
Definition: ACInterface.C:15
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
const FieldVariableGradient & gradSln() const override
registerMooseObject("PhaseFieldApp", ACInterface)
std::vector< const VariableGradient * > _gradarg
Gradients for all coupled variables.
Definition: ACInterface.h:68
virtual Real computeQpJacobian()
Definition: ACInterface.C:112
const std::string & name() const override
const MaterialProperty< Real > & _L
Mobility.
Definition: ACInterface.h:43
const bool _variable_L
flag set if L is a function of non-linear variables in args
Definition: ACInterface.h:48
RealGradient nablaLPsi()
the term
Definition: ACInterface.C:88
RealGradient kappaNablaLPsi()
the term
Definition: ACInterface.C:100
ACInterface(const InputParameters &parameters)
Definition: ACInterface.C:29
const MaterialProperty< Real > & _dLdop
Mobility derivatives w.r.t. order parameter.
Definition: ACInterface.h:51
std::vector< const MaterialProperty< Real > * > _d2Ldargdop
Definition: ACInterface.h:60
std::vector< const MaterialProperty< Real > * > _dkappadarg
kappa derivative w.r.t. other coupled variables
Definition: ACInterface.h:65
Compute the Allen-Cahn interface term with the weak form residual .
Definition: ACInterface.h:20
virtual void initialSetup()
Definition: ACInterface.C:72
const std::string name
Definition: Setup.h:20
static InputParameters validParams()
std::vector< const MaterialProperty< Real > * > _dLdarg
Mobility derivative w.r.t. other coupled variables.
Definition: ACInterface.h:59
void paramError(const std::string &param, Args... args) const
std::vector< std::vector< const MaterialProperty< Real > * > > _d2Ldarg2
Definition: ACInterface.h:61
const MaterialProperty< Real > & _dkappadop
kappa derivative w.r.t. order parameter
Definition: ACInterface.h:56
const MaterialProperty< Real > & _kappa
Interfacial parameter.
Definition: ACInterface.h:45
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const MaterialProperty< Real > & _d2Ldop2
Definition: ACInterface.h:52
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
virtual Real computeQpResidual()
Definition: ACInterface.C:106
virtual Real computeQpOffDiagJacobian(unsigned int jvar)
Definition: ACInterface.C:134
RealGradient gradL()
Definition: ACInterface.C:79