https://mooseframework.inl.gov
Loading...
Searching...
No Matches
NestedKKSMultiSplitCHCRes.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
11
13
16{
19 "KKS model kernel for the split Bulk Cahn-Hilliard term. This kernel operates on the "
20 "physical concentration 'c' as the non-linear variable.");
21 params.addCoupledVar("all_etas", "Phase parameters for all phases.");
22 params.addRequiredCoupledVar("global_cs", "The interpolated concentrations c, b, etc.");
23 params.addCoupledVar("w", "Chemical potential non-linear helper variable for the split solve.");
24 params.addParam<std::vector<MaterialPropertyName>>(
25 "c1_names",
26 "Phase concentrations in the frist phase of all_etas. The order must match global_cs, for "
27 "example, c1, b1, etc.");
28 params.addParam<MaterialPropertyName>("F1_name", "Free energy of the first phase in all_etas.");
29 return params;
30}
31
34 _eta_names(coupledNames("all_etas")),
35 _num_j(_eta_names.size()),
36 _eta_map(getParameterJvarMap("all_etas")),
37 _c_names(coupledNames("global_cs")),
38 _num_c(coupledComponents("global_cs")),
39 _c_map(getParameterJvarMap("global_cs")),
40 _o(-1),
41 _w_var(coupled("w")),
42 _w(coupledValue("w")),
43 _c1_names(getParam<std::vector<MaterialPropertyName>>("c1_names")),
44 _F1_name(getParam<MaterialPropertyName>("F1_name")),
45 _dF1dc1(_num_c),
46 _d2F1dc1db1(_num_c),
47 _dc1db(_num_c),
48 _dc1detaj(_num_c),
49 _d2F1dc1darg(_n_args)
50
51{
52 for (const auto i : make_range(_num_c))
53 {
54 // Set _o to the position of the nonlinear variable in the list of global_cs
55 if (coupled("global_cs", i) == _var.number())
56 _o = i;
57 }
58
59 // _dcideta and _dcidb are computed in KKSPhaseConcentrationDerivatives
60 for (const auto m : make_range(_num_c))
61 {
62 _dc1detaj[m].resize(_num_j);
63 for (const auto n : make_range(_num_j))
64 _dc1detaj[m][n] = &getMaterialPropertyDerivative<Real>(_c1_names[m], _eta_names[n]);
65
66 _dc1db[m].resize(_num_c);
67 for (const auto n : make_range(_num_c))
68 _dc1db[m][n] = &getMaterialPropertyDerivative<Real>(_c1_names[m], _c_names[n]);
69 }
70
71 // _dF1dc1 and _d2F1dc1db1 are computed in KKSPhaseConcentrationMaterial
72 for (const auto m : make_range(_num_c))
73 {
74 _dF1dc1[m] = &getMaterialPropertyDerivative<Real>(_F1_name, _c1_names[m]);
75 _d2F1dc1db1[m] = &getMaterialPropertyDerivative<Real>(_F1_name, _c1_names[_o], _c1_names[m]);
76 }
77
78 // _d2F1dc1darg is computed in KKSPhaseConcentrationMaterial
79 for (const auto m : make_range(_n_args))
80 _d2F1dc1darg[m] = &getMaterialPropertyDerivative<Real>(_F1_name, _c1_names[_o], m);
81}
82
83Real
85{
86 return ((*_dF1dc1[_o])[_qp] - _w[_qp]) * _test[_i][_qp];
87}
88
89Real
91{
92 Real sum = 0.0;
93
94 for (const auto m : make_range(_num_c))
95 sum += (*_d2F1dc1db1[m])[_qp] * (*_dc1db[m][_o])[_qp];
96
97 return sum * _phi[_j][_qp] * _test[_i][_qp];
98}
99
100Real
102{
103 Real sum = 0.0;
104
105 // treat w variable explicitly
106 if (jvar == _w_var)
107 return -_phi[_j][_qp] * _test[_i][_qp];
108
109 // if b is the coupled variable
110 auto compvar = mapJvarToCvar(jvar, _c_map);
111 if (compvar >= 0)
112 {
113 for (const auto m : make_range(_num_c))
114 sum += (*_d2F1dc1db1[m])[_qp] * (*_dc1db[m][compvar])[_qp];
115
116 return sum * _phi[_j][_qp] * _test[_i][_qp];
117 }
118
119 // if order parameters are the coupled variables
120 auto etavar = mapJvarToCvar(jvar, _eta_map);
121 if (etavar >= 0)
122 {
123 for (const auto m : make_range(_num_c))
124 sum += (*_d2F1dc1db1[m])[_qp] * (*_dc1detaj[m][etavar])[_qp];
125
126 return sum * _phi[_j][_qp] * _test[_i][_qp];
127 }
128
129 // for all other vars get the coupled variable jvar is referring to
130 const unsigned int cvar = mapJvarToCvar(jvar);
131
132 return (*_d2F1dc1darg[cvar])[_qp] * _phi[_j][_qp] * _test[_i][_qp];
133}
registerMooseObject("PhaseFieldApp", NestedKKSMultiSplitCHCRes)
void addRequiredCoupledVar(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)
void addCoupledVar(const std::string &name, const std::string &doc_string)
static InputParameters validParams()
In the KKS split form for the term .
std::vector< std::vector< const MaterialProperty< Real > * > > _dc1detaj
Derivative of the phase concentrations wrt phase parameter .
const std::vector< MaterialPropertyName > _c1_names
Phase concentration of the first phase in _eta_names.
const unsigned int _w_var
Chemical potential.
virtual Real computeQpResidual() override
const std::vector< VariableName > _c_names
Global concentrations.
virtual Real computeQpJacobian() override
std::vector< const MaterialProperty< Real > * > _d2F1dc1db1
Second derivative of the free energy function .
const unsigned int _num_c
Number of global concentrations.
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
std::vector< std::vector< const MaterialProperty< Real > * > > _dc1db
Derivative of the phase concentrations wrt global concentrations .
static InputParameters validParams()
std::vector< const MaterialProperty< Real > * > _dF1dc1
Derivative of the free energy function .
const MaterialPropertyName _F1_name
Free energy.
NestedKKSMultiSplitCHCRes(const InputParameters &parameters)
const std::vector< VariableName > _eta_names
Phase parameters.
std::vector< const MaterialProperty< Real > * > _d2F1dc1darg
Second derivative of the free energy function wrt phase concentration and a coupled variable.
const unsigned int _num_j
Number of phase parameters.