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