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 12593 : ACInterface::validParams() 16 : { 17 12593 : InputParameters params = JvarMapKernelInterface<Kernel>::validParams(); 18 12593 : params.addClassDescription("Gradient energy Allen-Cahn Kernel"); 19 25186 : params.addParam<MaterialPropertyName>("mob_name", "L", "The mobility used with the kernel"); 20 25186 : params.addParam<MaterialPropertyName>("kappa_name", "kappa_op", "The kappa used with the kernel"); 21 25186 : params.addParam<bool>("variable_L", 22 25186 : 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 12593 : return params; 27 0 : } 28 : 29 6637 : ACInterface::ACInterface(const InputParameters & parameters) 30 : : DerivativeMaterialInterface<JvarMapKernelInterface<Kernel>>(parameters), 31 6637 : _L(getMaterialProperty<Real>("mob_name")), 32 13274 : _kappa(getMaterialProperty<Real>("kappa_name")), 33 13274 : _variable_L(getParam<bool>("variable_L")), 34 6637 : _dLdop(getMaterialPropertyDerivative<Real>("mob_name", _var.name())), 35 6637 : _d2Ldop2(getMaterialPropertyDerivative<Real>("mob_name", _var.name(), _var.name())), 36 6637 : _dkappadop(getMaterialPropertyDerivative<Real>("kappa_name", _var.name())), 37 6637 : _dLdarg(_n_args), 38 6637 : _d2Ldargdop(_n_args), 39 6637 : _d2Ldarg2(_n_args), 40 6637 : _dkappadarg(_n_args), 41 13274 : _gradarg(_n_args) 42 : { 43 : // Get mobility and kappa derivatives and coupled variable gradients 44 7084 : for (unsigned int i = 0; i < _n_args; ++i) 45 : { 46 447 : MooseVariable * ivar = _coupled_standard_moose_vars[i]; 47 : const VariableName iname = ivar->name(); 48 447 : if (iname == _var.name()) 49 : { 50 0 : if (isCoupled("args")) 51 0 : paramError("args", 52 : "The kernel variable should not be specified in the coupled `args` parameter."); 53 : else 54 0 : paramError("coupled_variables", 55 : "The kernel variable should not be specified in the coupled `coupled_variables` " 56 : "parameter."); 57 : } 58 : 59 447 : _dLdarg[i] = &getMaterialPropertyDerivative<Real>("mob_name", i); 60 447 : _dkappadarg[i] = &getMaterialPropertyDerivative<Real>("kappa_name", i); 61 447 : _d2Ldargdop[i] = &getMaterialPropertyDerivative<Real>("mob_name", iname, _var.name()); 62 : 63 447 : _gradarg[i] = &(ivar->gradSln()); 64 : 65 447 : _d2Ldarg2[i].resize(_n_args); 66 1038 : for (unsigned int j = 0; j < _n_args; ++j) 67 591 : _d2Ldarg2[i][j] = &getMaterialPropertyDerivative<Real>("mob_name", i, j); 68 : } 69 6637 : } 70 : 71 : void 72 5530 : ACInterface::initialSetup() 73 : { 74 16590 : validateCoupling<Real>("mob_name"); 75 11060 : validateCoupling<Real>("kappa_name"); 76 5530 : } 77 : 78 : RealGradient 79 6109899632 : ACInterface::gradL() 80 : { 81 6109899632 : RealGradient g = _grad_u[_qp] * _dLdop[_qp]; 82 6892533008 : for (unsigned int i = 0; i < _n_args; ++i) 83 782633376 : g += (*_gradarg[i])[_qp] * (*_dLdarg[i])[_qp]; 84 6109899632 : return g; 85 : } 86 : 87 : RealGradient 88 4555926272 : ACInterface::nablaLPsi() 89 : { 90 : // sum is the product rule gradient \f$ \nabla (L\psi) \f$ 91 4555926272 : RealGradient sum = _L[_qp] * _grad_test[_i][_qp]; 92 : 93 4555926272 : if (_variable_L) 94 4343856720 : sum += gradL() * _test[_i][_qp]; 95 : 96 4555926272 : return sum; 97 : } 98 : 99 : RealGradient 100 4535838272 : ACInterface::kappaNablaLPsi() 101 : { 102 4535838272 : return _kappa[_qp] * nablaLPsi(); 103 : } 104 : 105 : Real 106 2754380752 : ACInterface::computeQpResidual() 107 : { 108 2754380752 : return _grad_u[_qp] * kappaNablaLPsi(); 109 : } 110 : 111 : Real 112 1781457520 : ACInterface::computeQpJacobian() 113 : { 114 : // dsum is the derivative \f$ \frac\partial{\partial \eta} \left( \nabla (L\psi) \right) \f$ 115 : RealGradient dsum = 116 1781457520 : (_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 1781457520 : if (_variable_L) 120 : { 121 : RealGradient dgradL = 122 1607488736 : _grad_phi[_j][_qp] * _dLdop[_qp] + _grad_u[_qp] * _phi[_j][_qp] * _d2Ldop2[_qp]; 123 : 124 1787879712 : for (unsigned int i = 0; i < _n_args; ++i) 125 180390976 : dgradL += (*_gradarg[i])[_qp] * _phi[_j][_qp] * (*_d2Ldargdop[i])[_qp]; 126 : 127 1607488736 : dsum += (_kappa[_qp] * dgradL + _dkappadop[_qp] * _phi[_j][_qp] * gradL()) * _test[_i][_qp]; 128 : } 129 : 130 1781457520 : return _grad_phi[_j][_qp] * kappaNablaLPsi() + _grad_u[_qp] * dsum; 131 : } 132 : 133 : Real 134 199923776 : ACInterface::computeQpOffDiagJacobian(unsigned int jvar) 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 199923776 : RealGradient dsum = ((*_dkappadarg[cvar])[_qp] * _L[_qp] + _kappa[_qp] * (*_dLdarg[cvar])[_qp]) * 141 199923776 : _phi[_j][_qp] * _grad_test[_i][_qp]; 142 : 143 : // compute the derivative of the gradient of the mobility 144 199923776 : if (_variable_L) 145 : { 146 158554176 : RealGradient dgradL = _grad_phi[_j][_qp] * (*_dLdarg[cvar])[_qp] + 147 158554176 : _grad_u[_qp] * _phi[_j][_qp] * (*_d2Ldargdop[cvar])[_qp]; 148 : 149 394091136 : for (unsigned int i = 0; i < _n_args; ++i) 150 235536960 : dgradL += (*_gradarg[i])[_qp] * _phi[_j][_qp] * (*_d2Ldarg2[cvar][i])[_qp]; 151 : 152 158554176 : dsum += (_kappa[_qp] * dgradL + _dkappadop[_qp] * _phi[_j][_qp] * gradL()) * _test[_i][_qp]; 153 : } 154 : 155 199923776 : return _grad_u[_qp] * dsum; 156 : }