https://mooseframework.inl.gov
CHInterfaceBase.h
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 #pragma once
11 
12 #include "Kernel.h"
13 #include "Material.h"
14 #include "JvarMapInterface.h"
16 
22 template <typename T>
23 class CHInterfaceBase : public DerivativeMaterialInterface<JvarMapKernelInterface<Kernel>>
24 {
25 public:
27 
29 
30 protected:
31  virtual Real computeQpResidual();
32  virtual Real computeQpJacobian();
33  virtual Real computeQpOffDiagJacobian(unsigned int jvar);
34 
36 
43 
50 
52  unsigned int _nvar;
53 
56  std::vector<const MaterialProperty<T> *> _dMdarg;
57  std::vector<const MaterialProperty<T> *> _d2Mdcdarg;
58  std::vector<std::vector<const MaterialProperty<T> *>> _d2Mdargdarg;
60 
62  std::vector<const VariableGradient *> _coupled_grad_vars;
63 };
64 
65 template <typename T>
68  _kappa(getMaterialProperty<Real>("kappa_name")),
69  _M(getMaterialProperty<T>("mob_name")),
70  _dMdc(getMaterialPropertyDerivative<T>("mob_name", _var.name())),
71  _d2Mdc2(getMaterialPropertyDerivative<T>("mob_name", _var.name(), _var.name())),
72  _second_u(second()),
73  _second_test(secondTest()),
74  _second_phi(secondPhi()),
75  _nvar(_coupled_moose_vars.size()),
76  _dMdarg(_nvar),
77  _d2Mdcdarg(_nvar),
78  _d2Mdargdarg(_nvar),
79  _coupled_grad_vars(_nvar)
80 {
81  // Iterate over all coupled variables
82  for (unsigned int i = 0; i < _nvar; ++i)
83  {
84  // Set material property values
85  _dMdarg[i] = &getMaterialPropertyDerivative<T>("mob_name", _coupled_moose_vars[i]->name());
86  _d2Mdcdarg[i] =
87  &getMaterialPropertyDerivative<T>("mob_name", _var.name(), _coupled_moose_vars[i]->name());
88  _d2Mdargdarg[i].resize(_nvar);
89  for (unsigned int j = 0; j < _nvar; ++j)
90  _d2Mdargdarg[i][j] = &getMaterialPropertyDerivative<T>(
91  "mob_name", _coupled_moose_vars[i]->name(), _coupled_moose_vars[j]->name());
92 
93  // Set coupled variable gradients
95  isCoupled("args") ? &coupledGradient("args", i) : &coupledGradient("coupled_variables", i);
96  }
97 }
98 
99 template <typename T>
102 {
104  params.addClassDescription("Gradient energy Cahn-Hilliard base Kernel");
105  params.addRequiredParam<MaterialPropertyName>("kappa_name", "The kappa used with the kernel");
106  params.addRequiredParam<MaterialPropertyName>("mob_name", "The mobility used with the kernel");
107  params.addCoupledVar("args", "Vector of variable arguments of the mobility");
108  params.deprecateCoupledVar("args", "coupled_variables", "02/27/2024");
109  return params;
110 }
111 
112 template <typename T>
113 Real
115 {
116  RealGradient grad_M = _dMdc[_qp] * _grad_u[_qp];
117  for (unsigned int i = 0; i < _nvar; ++i)
118  grad_M += (*_dMdarg[i])[_qp] * (*_coupled_grad_vars[i])[_qp];
119 
120  return _kappa[_qp] * _second_u[_qp].tr() *
121  ((_M[_qp] * _second_test[_i][_qp]).tr() + grad_M * _grad_test[_i][_qp]);
122 }
123 
124 template <typename T>
125 Real
127 {
128  // Set the gradient and gradient derivative values
129  RealGradient grad_M = _dMdc[_qp] * _grad_u[_qp];
130 
131  RealGradient dgrad_Mdc =
132  _d2Mdc2[_qp] * _phi[_j][_qp] * _grad_u[_qp] + _dMdc[_qp] * _grad_phi[_j][_qp];
133 
134  for (unsigned int i = 0; i < _nvar; ++i)
135  {
136  grad_M += (*_dMdarg[i])[_qp] * (*_coupled_grad_vars[i])[_qp];
137  dgrad_Mdc += (*_d2Mdcdarg[i])[_qp] * _phi[_j][_qp] * (*_coupled_grad_vars[i])[_qp];
138  }
139 
140  // Jacobian value using product rule
141  Real value = _kappa[_qp] * _second_phi[_j][_qp].tr() *
142  ((_M[_qp] * _second_test[_i][_qp]).tr() + grad_M * _grad_test[_i][_qp]) +
143  _kappa[_qp] * _second_u[_qp].tr() *
144  ((_dMdc[_qp] * _second_test[_i][_qp]).tr() * _phi[_j][_qp] +
145  dgrad_Mdc * _grad_test[_i][_qp]);
146 
147  return value;
148 }
149 
150 template <typename T>
151 Real
153 {
154  // get the coupled variable jvar is referring to
155  const unsigned int cvar = mapJvarToCvar(jvar);
156 
157  // Set the gradient derivative
158  RealGradient dgrad_Mdarg = (*_d2Mdcdarg[cvar])[_qp] * _phi[_j][_qp] * _grad_u[_qp] +
159  (*_dMdarg[cvar])[_qp] * _grad_phi[_j][_qp];
160 
161  for (unsigned int i = 0; i < _nvar; ++i)
162  dgrad_Mdarg += (*_d2Mdargdarg[cvar][i])[_qp] * _phi[_j][_qp] * (*_coupled_grad_vars[cvar])[_qp];
163 
164  // Jacobian value using product rule
165  Real value = _kappa[_qp] * _second_u[_qp].tr() *
166  (((*_dMdarg[cvar])[_qp] * _second_test[_i][_qp]).tr() * _phi[_j][_qp] +
167  dgrad_Mdarg * _grad_test[_i][_qp]);
168 
169  return value;
170 }
const VariablePhiSecond & _second_phi
virtual bool isCoupled(const std::string &var_name, unsigned int i=0) const
unsigned int _nvar
Number of variables.
This is the Cahn-Hilliard equation base class that implements the interfacial or gradient energy term...
static InputParameters validParams()
virtual Real computeQpJacobian()
static InputParameters validParams()
std::vector< const VariableGradient * > _coupled_grad_vars
Coupled variables used in mobility.
virtual Real computeQpResidual()
const MaterialProperty< T > & _d2Mdc2
const std::string & name() const override
virtual const VariableGradient & coupledGradient(const std::string &var_name, unsigned int comp=0) const
OutputTools< Real >::VariablePhiSecond VariablePhiSecond
void addRequiredParam(const std::string &name, const std::string &doc_string)
virtual Real computeQpOffDiagJacobian(unsigned int jvar)
std::vector< const MaterialProperty< T > * > _dMdarg
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
const VariableTestSecond & _second_test
const std::string name
Definition: Setup.h:20
const MaterialProperty< T > & _M
void deprecateCoupledVar(const std::string &old_name, const std::string &new_name, const std::string &removal_date)
void addCoupledVar(const std::string &name, const std::string &doc_string)
const VariableSecond & _second_u
std::vector< MooseVariableFieldBase *> _coupled_moose_vars
const MaterialProperty< Real > & _kappa
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
OutputTools< Real >::VariableTestSecond VariableTestSecond
CHInterfaceBase(const InputParameters &parameters)
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
OutputTools< Real >::VariableSecond VariableSecond
std::vector< const MaterialProperty< T > * > _d2Mdcdarg
std::vector< std::vector< const MaterialProperty< T > * > > _d2Mdargdarg
const MaterialProperty< T > & _dMdc