https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
22template <typename T>
23class CHInterfaceBase : public DerivativeMaterialInterface<JvarMapKernelInterface<Kernel>>
24{
25public:
26 CHInterfaceBase(const InputParameters & parameters);
27
29
30protected:
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
65template <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
94 _coupled_grad_vars[i] = &coupledGradient("coupled_variables", i);
95 }
96}
97
98template <typename T>
101{
103 params.addClassDescription("Gradient energy Cahn-Hilliard base Kernel");
104 params.addRequiredParam<MaterialPropertyName>("kappa_name", "The kappa used with the kernel");
105 params.addRequiredParam<MaterialPropertyName>("mob_name", "The mobility used with the kernel");
106 params.addCoupledVar("coupled_variables", "Vector of variable arguments of the mobility");
107 return params;
108}
109
110template <typename T>
111Real
113{
114 RealGradient grad_M = _dMdc[_qp] * _grad_u[_qp];
115 for (unsigned int i = 0; i < _nvar; ++i)
116 grad_M += (*_dMdarg[i])[_qp] * (*_coupled_grad_vars[i])[_qp];
117
118 return _kappa[_qp] * _second_u[_qp].tr() *
119 ((_M[_qp] * _second_test[_i][_qp]).tr() + grad_M * _grad_test[_i][_qp]);
120}
121
122template <typename T>
123Real
125{
126 // Set the gradient and gradient derivative values
127 RealGradient grad_M = _dMdc[_qp] * _grad_u[_qp];
128
129 RealGradient dgrad_Mdc =
130 _d2Mdc2[_qp] * _phi[_j][_qp] * _grad_u[_qp] + _dMdc[_qp] * _grad_phi[_j][_qp];
131
132 for (unsigned int i = 0; i < _nvar; ++i)
133 {
134 grad_M += (*_dMdarg[i])[_qp] * (*_coupled_grad_vars[i])[_qp];
135 dgrad_Mdc += (*_d2Mdcdarg[i])[_qp] * _phi[_j][_qp] * (*_coupled_grad_vars[i])[_qp];
136 }
137
138 // Jacobian value using product rule
139 Real value = _kappa[_qp] * _second_phi[_j][_qp].tr() *
140 ((_M[_qp] * _second_test[_i][_qp]).tr() + grad_M * _grad_test[_i][_qp]) +
141 _kappa[_qp] * _second_u[_qp].tr() *
142 ((_dMdc[_qp] * _second_test[_i][_qp]).tr() * _phi[_j][_qp] +
143 dgrad_Mdc * _grad_test[_i][_qp]);
144
145 return value;
146}
147
148template <typename T>
149Real
151{
152 // get the coupled variable jvar is referring to
153 const unsigned int cvar = mapJvarToCvar(jvar);
154
155 // Set the gradient derivative
156 RealGradient dgrad_Mdarg = (*_d2Mdcdarg[cvar])[_qp] * _phi[_j][_qp] * _grad_u[_qp] +
157 (*_dMdarg[cvar])[_qp] * _grad_phi[_j][_qp];
158
159 for (unsigned int i = 0; i < _nvar; ++i)
160 dgrad_Mdarg += (*_d2Mdargdarg[cvar][i])[_qp] * _phi[_j][_qp] * (*_coupled_grad_vars[cvar])[_qp];
161
162 // Jacobian value using product rule
163 Real value = _kappa[_qp] * _second_u[_qp].tr() *
164 (((*_dMdarg[cvar])[_qp] * _second_test[_i][_qp]).tr() * _phi[_j][_qp] +
165 dgrad_Mdarg * _grad_test[_i][_qp]);
166
167 return value;
168}
const double T
OutputTools< Real >::VariableSecond VariableSecond
OutputTools< Real >::VariableTestSecond VariableTestSecond
OutputTools< Real >::VariablePhiSecond VariablePhiSecond
const std::string name
Definition Setup.h:21
This is the Cahn-Hilliard equation base class that implements the interfacial or gradient energy term...
CHInterfaceBase(const InputParameters &parameters)
static InputParameters validParams()
std::vector< std::vector< const MaterialProperty< T > * > > _d2Mdargdarg
unsigned int _nvar
Number of variables.
const VariableSecond & _second_u
std::vector< const MaterialProperty< T > * > _d2Mdcdarg
const VariableTestSecond & _second_test
virtual Real computeQpJacobian()
virtual Real computeQpOffDiagJacobian(unsigned int jvar)
const MaterialProperty< T > & _dMdc
const MaterialProperty< Real > & _kappa
virtual Real computeQpResidual()
const VariablePhiSecond & _second_phi
const MaterialProperty< T > & _M
const MaterialProperty< T > & _d2Mdc2
std::vector< const VariableGradient * > _coupled_grad_vars
Coupled variables used in mobility.
std::vector< const MaterialProperty< T > * > _dMdarg
void addRequiredParam(const std::string &name, 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()