Line data Source code
1 : //* This file is part of the MOOSE framework 2 : //* https://mooseframework.inl.gov 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 : InputParameters 15 8885 : ACInterface::validParams() 16 : { 17 8885 : InputParameters params = JvarMapKernelInterface<Kernel>::validParams(); 18 8885 : params.addClassDescription("Gradient energy Allen-Cahn Kernel"); 19 17770 : params.addParam<MaterialPropertyName>("mob_name", "L", "The mobility used with the kernel"); 20 17770 : params.addParam<MaterialPropertyName>("kappa_name", "kappa_op", "The kappa used with the kernel"); 21 17770 : params.addParam<bool>("variable_L", 22 17770 : 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 8885 : return params; 27 0 : } 28 : 29 4785 : ACInterface::ACInterface(const InputParameters & parameters) 30 : : DerivativeMaterialInterface<JvarMapKernelInterface<Kernel>>(parameters), 31 4785 : _L(getMaterialProperty<Real>("mob_name")), 32 9570 : _kappa(getMaterialProperty<Real>("kappa_name")), 33 9570 : _variable_L(getParam<bool>("variable_L")), 34 4785 : _dLdop(getMaterialPropertyDerivative<Real>("mob_name", _var.name())), 35 4785 : _d2Ldop2(getMaterialPropertyDerivative<Real>("mob_name", _var.name(), _var.name())), 36 4785 : _dkappadop(getMaterialPropertyDerivative<Real>("kappa_name", _var.name())), 37 4785 : _dLdarg(_n_args), 38 4785 : _d2Ldargdop(_n_args), 39 4785 : _d2Ldarg2(_n_args), 40 4785 : _dkappadarg(_n_args), 41 9570 : _gradarg(_n_args) 42 : { 43 : // Get mobility and kappa derivatives and coupled variable gradients 44 5086 : for (unsigned int i = 0; i < _n_args; ++i) 45 : { 46 301 : MooseVariable * ivar = _coupled_standard_moose_vars[i]; 47 : const VariableName iname = ivar->name(); 48 301 : if (iname == _var.name()) 49 0 : paramError("coupled_variables", 50 : "The kernel variable should not be specified in the coupled `coupled_variables` " 51 : "parameter."); 52 : 53 301 : _dLdarg[i] = &getMaterialPropertyDerivative<Real>("mob_name", i); 54 301 : _dkappadarg[i] = &getMaterialPropertyDerivative<Real>("kappa_name", i); 55 301 : _d2Ldargdop[i] = &getMaterialPropertyDerivative<Real>("mob_name", iname, _var.name()); 56 : 57 301 : _gradarg[i] = &(ivar->gradSln()); 58 : 59 301 : _d2Ldarg2[i].resize(_n_args); 60 698 : for (unsigned int j = 0; j < _n_args; ++j) 61 397 : _d2Ldarg2[i][j] = &getMaterialPropertyDerivative<Real>("mob_name", i, j); 62 : } 63 4785 : } 64 : 65 : void 66 3940 : ACInterface::initialSetup() 67 : { 68 11820 : validateCoupling<Real>("mob_name"); 69 7880 : validateCoupling<Real>("kappa_name"); 70 3940 : } 71 : 72 : RealGradient 73 5128332352 : ACInterface::gradL() 74 : { 75 5128332352 : RealGradient g = _grad_u[_qp] * _dLdop[_qp]; 76 5787394704 : for (unsigned int i = 0; i < _n_args; ++i) 77 659062352 : g += (*_gradarg[i])[_qp] * (*_dLdarg[i])[_qp]; 78 5128332352 : return g; 79 : } 80 : 81 : RealGradient 82 3818218960 : ACInterface::nablaLPsi() 83 : { 84 : // sum is the product rule gradient \f$ \nabla (L\psi) \f$ 85 3818218960 : RealGradient sum = _L[_qp] * _grad_test[_i][_qp]; 86 : 87 3818218960 : if (_variable_L) 88 3640846976 : sum += gradL() * _test[_i][_qp]; 89 : 90 3818218960 : return sum; 91 : } 92 : 93 : RealGradient 94 3801435760 : ACInterface::kappaNablaLPsi() 95 : { 96 3801435760 : return _kappa[_qp] * nablaLPsi(); 97 : } 98 : 99 : Real 100 2304228544 : ACInterface::computeQpResidual() 101 : { 102 2304228544 : return _grad_u[_qp] * kappaNablaLPsi(); 103 : } 104 : 105 : Real 106 1497207216 : ACInterface::computeQpJacobian() 107 : { 108 : // dsum is the derivative \f$ \frac\partial{\partial \eta} \left( \nabla (L\psi) \right) \f$ 109 : RealGradient dsum = 110 1497207216 : (_dkappadop[_qp] * _L[_qp] + _kappa[_qp] * _dLdop[_qp]) * _phi[_j][_qp] * _grad_test[_i][_qp]; 111 : 112 : // compute the derivative of the gradient of the mobility 113 1497207216 : if (_variable_L) 114 : { 115 : RealGradient dgradL = 116 1351706688 : _grad_phi[_j][_qp] * _dLdop[_qp] + _grad_u[_qp] * _phi[_j][_qp] * _d2Ldop2[_qp]; 117 : 118 1505712576 : for (unsigned int i = 0; i < _n_args; ++i) 119 154005888 : dgradL += (*_gradarg[i])[_qp] * _phi[_j][_qp] * (*_d2Ldargdop[i])[_qp]; 120 : 121 1351706688 : dsum += (_kappa[_qp] * dgradL + _dkappadop[_qp] * _phi[_j][_qp] * gradL()) * _test[_i][_qp]; 122 : } 123 : 124 1497207216 : return _grad_phi[_j][_qp] * kappaNablaLPsi() + _grad_u[_qp] * dsum; 125 : } 126 : 127 : Real 128 170389888 : ACInterface::computeQpOffDiagJacobian(unsigned int jvar) 129 : { 130 : // get the coupled variable jvar is referring to 131 : const unsigned int cvar = mapJvarToCvar(jvar); 132 : 133 : // dsum is the derivative \f$ \frac\partial{\partial \eta} \left( \nabla (L\psi) \right) \f$ 134 170389888 : RealGradient dsum = ((*_dkappadarg[cvar])[_qp] * _L[_qp] + _kappa[_qp] * (*_dLdarg[cvar])[_qp]) * 135 170389888 : _phi[_j][_qp] * _grad_test[_i][_qp]; 136 : 137 : // compute the derivative of the gradient of the mobility 138 170389888 : if (_variable_L) 139 : { 140 135778688 : RealGradient dgradL = _grad_phi[_j][_qp] * (*_dLdarg[cvar])[_qp] + 141 135778688 : _grad_u[_qp] * _phi[_j][_qp] * (*_d2Ldargdop[cvar])[_qp]; 142 : 143 335918848 : for (unsigned int i = 0; i < _n_args; ++i) 144 200140160 : dgradL += (*_gradarg[i])[_qp] * _phi[_j][_qp] * (*_d2Ldarg2[cvar][i])[_qp]; 145 : 146 135778688 : dsum += (_kappa[_qp] * dgradL + _dkappadop[_qp] * _phi[_j][_qp] * gradL()) * _test[_i][_qp]; 147 : } 148 : 149 170389888 : return _grad_u[_qp] * dsum; 150 : }