https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
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)
63 "etas", "Kernel variable must be listed in etas for ACMultiInterface kernel ", name());
64 else
65 _a = a;
66}
67
68Real
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
100Real
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
126Real
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}
registerMooseObject("PhaseFieldApp", ACMultiInterface)
Compute the gradient interface terms for a multiphase system.
std::vector< MaterialPropertyName > _kappa_names
Interface gradient prefactor.
ACMultiInterface(const InputParameters &parameters)
static InputParameters validParams()
virtual Real computeQpResidual()
std::vector< const MaterialProperty< Real > * > _kappa
std::vector< int > _eta_vars
Lookup table from couple variable number into the etas vector.
const MaterialProperty< Real > & _L
Mobility.
virtual Real computeQpOffDiagJacobian(unsigned int)
const unsigned int _num_etas
Order parameters.
unsigned int _a
Index of the eta this kernel is operating on.
const std::vector< const VariableGradient * > _grad_eta
virtual Real computeQpJacobian()
const std::vector< const VariableValue * > _eta
virtual unsigned int coupled(const std::string &var_name, unsigned int comp=0) const
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
unsigned int _qp
unsigned int _j
unsigned int _i
const VariableGradient & _grad_u
MooseVariable & _var
const VariablePhiValue & _phi
const VariableTestValue & _test
static InputParameters validParams()
const VariablePhiGradient & _grad_phi
const VariableTestGradient & _grad_test
const VariableValue & _u
const std::string & name() const
void paramError(const std::string &param, Args... args) const
unsigned int number() const
SystemBase & _sys
virtual unsigned int nVariables() const
VariableValueTempl< false > VariableValue
VariableGradientTempl< false > VariableGradient