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 0 : paramError("coupled_variables", 50 : "The kernel variable should not be specified in the coupled `coupled_variables` " 51 : "parameter."); 52 : 53 447 : _dLdarg[i] = &getMaterialPropertyDerivative<Real>("mob_name", i); 54 447 : _dkappadarg[i] = &getMaterialPropertyDerivative<Real>("kappa_name", i); 55 447 : _d2Ldargdop[i] = &getMaterialPropertyDerivative<Real>("mob_name", iname, _var.name()); 56 : 57 447 : _gradarg[i] = &(ivar->gradSln()); 58 : 59 447 : _d2Ldarg2[i].resize(_n_args); 60 1038 : for (unsigned int j = 0; j < _n_args; ++j) 61 591 : _d2Ldarg2[i][j] = &getMaterialPropertyDerivative<Real>("mob_name", i, j); 62 : } 63 6637 : } 64 : 65 : void 66 5530 : ACInterface::initialSetup() 67 : { 68 16590 : validateCoupling<Real>("mob_name"); 69 11060 : validateCoupling<Real>("kappa_name"); 70 5530 : } 71 : 72 : RealGradient 73 6109627312 : ACInterface::gradL() 74 : { 75 6109627312 : RealGradient g = _grad_u[_qp] * _dLdop[_qp]; 76 6892260688 : for (unsigned int i = 0; i < _n_args; ++i) 77 782633376 : g += (*_gradarg[i])[_qp] * (*_dLdarg[i])[_qp]; 78 6109627312 : return g; 79 : } 80 : 81 : RealGradient 82 4555653952 : ACInterface::nablaLPsi() 83 : { 84 : // sum is the product rule gradient \f$ \nabla (L\psi) \f$ 85 4555653952 : RealGradient sum = _L[_qp] * _grad_test[_i][_qp]; 86 : 87 4555653952 : if (_variable_L) 88 4343584400 : sum += gradL() * _test[_i][_qp]; 89 : 90 4555653952 : return sum; 91 : } 92 : 93 : RealGradient 94 4535565952 : ACInterface::kappaNablaLPsi() 95 : { 96 4535565952 : return _kappa[_qp] * nablaLPsi(); 97 : } 98 : 99 : Real 100 2754108432 : ACInterface::computeQpResidual() 101 : { 102 2754108432 : return _grad_u[_qp] * kappaNablaLPsi(); 103 : } 104 : 105 : Real 106 1781457520 : ACInterface::computeQpJacobian() 107 : { 108 : // dsum is the derivative \f$ \frac\partial{\partial \eta} \left( \nabla (L\psi) \right) \f$ 109 : RealGradient dsum = 110 1781457520 : (_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 1781457520 : if (_variable_L) 114 : { 115 : RealGradient dgradL = 116 1607488736 : _grad_phi[_j][_qp] * _dLdop[_qp] + _grad_u[_qp] * _phi[_j][_qp] * _d2Ldop2[_qp]; 117 : 118 1787879712 : for (unsigned int i = 0; i < _n_args; ++i) 119 180390976 : dgradL += (*_gradarg[i])[_qp] * _phi[_j][_qp] * (*_d2Ldargdop[i])[_qp]; 120 : 121 1607488736 : dsum += (_kappa[_qp] * dgradL + _dkappadop[_qp] * _phi[_j][_qp] * gradL()) * _test[_i][_qp]; 122 : } 123 : 124 1781457520 : return _grad_phi[_j][_qp] * kappaNablaLPsi() + _grad_u[_qp] * dsum; 125 : } 126 : 127 : Real 128 199923776 : 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 199923776 : RealGradient dsum = ((*_dkappadarg[cvar])[_qp] * _L[_qp] + _kappa[_qp] * (*_dLdarg[cvar])[_qp]) * 135 199923776 : _phi[_j][_qp] * _grad_test[_i][_qp]; 136 : 137 : // compute the derivative of the gradient of the mobility 138 199923776 : if (_variable_L) 139 : { 140 158554176 : RealGradient dgradL = _grad_phi[_j][_qp] * (*_dLdarg[cvar])[_qp] + 141 158554176 : _grad_u[_qp] * _phi[_j][_qp] * (*_d2Ldargdop[cvar])[_qp]; 142 : 143 394091136 : for (unsigned int i = 0; i < _n_args; ++i) 144 235536960 : dgradL += (*_gradarg[i])[_qp] * _phi[_j][_qp] * (*_d2Ldarg2[cvar][i])[_qp]; 145 : 146 158554176 : dsum += (_kappa[_qp] * dgradL + _dkappadop[_qp] * _phi[_j][_qp] * gradL()) * _test[_i][_qp]; 147 : } 148 : 149 199923776 : return _grad_u[_qp] * dsum; 150 : }