https://mooseframework.inl.gov
ACMultiInterface.C
Go to the documentation of this file.
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 "ACMultiInterface.h"
11 
12 // MOOSE includes
13 #include "MooseVariable.h"
14 #include "NonlinearSystem.h"
15 
16 registerMooseObject("PhaseFieldApp", ACMultiInterface);
17 
20 {
22  params.addClassDescription("Gradient energy Allen-Cahn Kernel with cross terms");
23  params.addRequiredCoupledVar("etas", "All eta_i order parameters of the multiphase problem");
24  params.addRequiredParam<std::vector<MaterialPropertyName>>("kappa_names",
25  "The kappa used with the kernel");
26  params.addParam<MaterialPropertyName>("mob_name", "L", "The mobility used with the kernel");
27  return params;
28 }
29 
31  : Kernel(parameters),
32  _num_etas(coupledComponents("etas")),
33  _eta(coupledValues("etas")),
34  _grad_eta(coupledGradients("etas")),
35  _eta_vars(_sys.nVariables(), -1),
36  _kappa_names(getParam<std::vector<MaterialPropertyName>>("kappa_names")),
37  _kappa(_num_etas),
38  _L(getMaterialProperty<Real>("mob_name"))
39 {
40  if (_num_etas != _kappa_names.size())
41  paramError("kappa_names", "Supply the same number of etas and kappa_names.");
42 
43  unsigned int nvariables = _sys.nVariables();
44 
45  int a = -1;
46  for (unsigned int i = 0; i < _num_etas; ++i)
47  {
48  // populate lookup table form jvar to _eta index
49  unsigned int var = coupled("etas", i);
50  if (var < nvariables)
51  _eta_vars[var] = i;
52 
53  // get the index of the variable the kernel is operating on
54  if (coupled("etas", i) == _var.number())
55  a = i;
56 
57  // get gradient prefactors
58  _kappa[i] = &getMaterialPropertyByName<Real>(_kappa_names[i]);
59  }
60 
61  if (a < 0)
62  paramError(
63  "etas", "Kernel variable must be listed in etas for ACMultiInterface kernel ", name());
64  else
65  _a = a;
66 }
67 
68 Real
70 {
71  const VariableValue & _eta_a = _u;
72  const VariableGradient & _grad_eta_a = _grad_u;
73 
74  Real sum = 0.0;
75  for (unsigned int b = 0; b < _num_etas; ++b)
76  {
77  // skip the diagonal term (does not contribute)
78  if (b == _a)
79  continue;
80 
81  sum += (*_kappa[b])[_qp] *
82  (
83  // order 1 terms
84  2.0 * _test[_i][_qp] *
85  (_eta_a[_qp] * (*_grad_eta[b])[_qp] - (*_eta[b])[_qp] * _grad_eta_a[_qp]) *
86  (*_grad_eta[b])[_qp]
87  // volume terms
88  + (-(_eta_a[_qp] * (*_eta[b])[_qp] * _grad_test[_i][_qp] +
89  _test[_i][_qp] * (*_eta[b])[_qp] * _grad_eta_a[_qp] +
90  _test[_i][_qp] * _eta_a[_qp] * (*_grad_eta[b])[_qp]) *
91  (*_grad_eta[b])[_qp]) -
92  (-((*_eta[b])[_qp] * (*_eta[b])[_qp] * _grad_test[_i][_qp] +
93  2.0 * _test[_i][_qp] * (*_eta[b])[_qp] * (*_grad_eta[b])[_qp]) *
94  _grad_eta_a[_qp]));
95  }
96 
97  return _L[_qp] * sum;
98 }
99 
100 Real
102 {
103  Real sum = 0.0;
104  for (unsigned int b = 0; b < _num_etas; ++b)
105  {
106  // skip the diagonal term (does not contribute)
107  if (b == _a)
108  continue;
109 
110  sum += (*_kappa[b])[_qp] *
111  (2.0 * _test[_i][_qp] *
112  ((_phi[_j][_qp] * (*_grad_eta[b])[_qp] - (*_eta[b])[_qp] * _grad_phi[_j][_qp]) *
113  (*_grad_eta[b])[_qp]) +
114  (-(_phi[_j][_qp] * (*_eta[b])[_qp] * _grad_test[_i][_qp] +
115  _test[_i][_qp] * (*_eta[b])[_qp] * _grad_phi[_j][_qp] +
116  _test[_i][_qp] * _phi[_j][_qp] * (*_grad_eta[b])[_qp]) *
117  (*_grad_eta[b])[_qp]) -
118  (-((*_eta[b])[_qp] * (*_eta[b])[_qp] * _grad_test[_i][_qp] +
119  2.0 * _test[_i][_qp] * (*_eta[b])[_qp] * (*_grad_eta[b])[_qp]) *
120  _grad_phi[_j][_qp]));
121  }
122 
123  return _L[_qp] * sum;
124 }
125 
126 Real
128 {
129  const VariableValue & _eta_a = _u;
130  const VariableGradient & _grad_eta_a = _grad_u;
131 
132  const int b = _eta_vars[jvar];
133  if (b < 0)
134  return 0.0;
135 
136  return _L[_qp] * (*_kappa[b])[_qp] *
137  (2.0 * _test[_i][_qp] *
138  ((_eta_a[_qp] * _grad_phi[_j][_qp] - _phi[_j][_qp] * _grad_eta_a[_qp]) *
139  (*_grad_eta[b])[_qp] +
140  (_eta_a[_qp] * (*_grad_eta[b])[_qp] - (*_eta[b])[_qp] * _grad_eta_a[_qp]) *
141  _grad_phi[_j][_qp]) +
142  (-(_eta_a[_qp] * _phi[_j][_qp] * _grad_test[_i][_qp] +
143  _test[_i][_qp] * _phi[_j][_qp] * _grad_eta_a[_qp] +
144  _test[_i][_qp] * _eta_a[_qp] * _grad_phi[_j][_qp]) *
145  (*_grad_eta[b])[_qp] -
146  (_eta_a[_qp] * (*_eta[b])[_qp] * _grad_test[_i][_qp] +
147  _test[_i][_qp] * (*_eta[b])[_qp] * _grad_eta_a[_qp] +
148  _test[_i][_qp] * _eta_a[_qp] * (*_grad_eta[b])[_qp]) *
149  _grad_phi[_j][_qp]) -
150  (-(2.0 * (*_eta[b])[_qp] * _phi[_j][_qp] * _grad_test[_i][_qp] +
151  2.0 * _test[_i][_qp] *
152  (_phi[_j][_qp] * (*_grad_eta[b])[_qp] + (*_eta[b])[_qp] * _grad_phi[_j][_qp])) *
153  _grad_eta_a[_qp]));
154 }
unsigned int _a
Index of the eta this kernel is operating on.
OutputTools< Real >::VariableGradient VariableGradient
ACMultiInterface(const InputParameters &parameters)
virtual unsigned int coupled(const std::string &var_name, unsigned int comp=0) const
registerMooseObject("PhaseFieldApp", ACMultiInterface)
const VariableGradient & _grad_u
static InputParameters validParams()
std::vector< int > _eta_vars
Lookup table from couple variable number into the etas vector.
MooseVariable & _var
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
unsigned int number() const
const VariablePhiGradient & _grad_phi
virtual Real computeQpResidual()
virtual const std::string & name() const
void addRequiredParam(const std::string &name, const std::string &doc_string)
virtual unsigned int nVariables() const
SystemBase & _sys
const VariableTestValue & _test
std::vector< const MaterialProperty< Real > * > _kappa
unsigned int _i
void paramError(const std::string &param, Args... args) const
virtual Real computeQpOffDiagJacobian(unsigned int)
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
OutputTools< Real >::VariableValue VariableValue
unsigned int _j
const std::vector< const VariableGradient * > _grad_eta
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Compute the gradient interface terms for a multiphase system.
const VariableTestGradient & _grad_test
static InputParameters validParams()
const std::vector< const VariableValue * > _eta
const MaterialProperty< Real > & _L
Mobility.
void addClassDescription(const std::string &doc_string)
virtual Real computeQpJacobian()
const unsigned int _num_etas
Order parameters.
const VariablePhiValue & _phi
const VariableValue & _u
std::vector< MaterialPropertyName > _kappa_names
Interface gradient prefactor.
unsigned int _qp