https://mooseframework.inl.gov
Loading...
Searching...
No Matches
CahnHilliardBase.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 "CHBulk.h"
13
19template <typename T>
20class CahnHilliardBase : public CHBulk<T>
21{
22public:
23 CahnHilliardBase(const InputParameters & parameters);
24
26 virtual void initialSetup();
27
28protected:
30 virtual RealGradient computeGradDFDCons(PFFunctionType type);
31 virtual Real computeQpOffDiagJacobian(unsigned int jvar);
32
33 // Explicitly declare the use of the following members of the parent class
34 // https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-members
35 using CHBulk<T>::_M;
36 using CHBulk<T>::_i;
37 using CHBulk<T>::_j;
38 using CHBulk<T>::_qp;
39 using CHBulk<T>::_var;
40 using CHBulk<T>::_phi;
41 using CHBulk<T>::_grad_u;
42 using CHBulk<T>::_grad_phi;
43 using CHBulk<T>::_grad_test;
44 using CHBulk<T>::_coupled_moose_vars;
45 using CHBulk<T>::_subproblem;
46 using CHBulk<T>::_tid;
47
48private:
49 const unsigned int _nvar;
50 std::vector<const MaterialProperty<Real> *> _second_derivatives;
51 std::vector<const MaterialProperty<Real> *> _third_derivatives;
52 std::vector<std::vector<const MaterialProperty<Real> *>> _third_cross_derivatives;
53 std::vector<const VariableGradient *> _grad_vars;
54};
55
56template <typename T>
59{
61 params.addClassDescription("Cahn-Hilliard Kernel that uses a DerivativeMaterial Free Energy");
62 params.addRequiredParam<MaterialPropertyName>(
63 "f_name", "Base name of the free energy function F defined in a DerivativeParsedMaterial");
64 params.addCoupledVar("displacement_gradients",
65 "Vector of displacement gradient variables (see "
66 "Modules/PhaseField/DisplacementGradients "
67 "action)");
68 return params;
69}
70
71template <typename T>
73 : CHBulk<T>(parameters),
74 _nvar(_coupled_moose_vars.size()),
75 _second_derivatives(_nvar + 1),
76 _third_derivatives(_nvar + 1),
77 _third_cross_derivatives(_nvar),
78 _grad_vars(_nvar + 1)
79{
80 // derivatives w.r.t. and gradients of the kernel variable
82 &this->template getMaterialPropertyDerivative<Real>("f_name", _var.name(), _var.name());
83 _third_derivatives[0] = &this->template getMaterialPropertyDerivative<Real>(
84 "f_name", _var.name(), _var.name(), _var.name());
85 _grad_vars[0] = &(_grad_u);
86
87 // Iterate over all coupled variables
88 for (unsigned int i = 0; i < _nvar; ++i)
89 {
90 const VariableName iname = _coupled_moose_vars[i]->name();
91 if (iname == _var.name())
92 this->paramError("coupled_variables",
93 "The kernel variable should not be specified in the coupled "
94 "`coupled_variables` parameter.");
95 _second_derivatives[i + 1] =
96 &this->template getMaterialPropertyDerivative<Real>("f_name", _var.name(), iname);
97 _third_derivatives[i + 1] = &this->template getMaterialPropertyDerivative<Real>(
98 "f_name", _var.name(), _var.name(), iname);
99
101 for (unsigned int j = 0; j < _nvar; ++j)
102 {
103 VariableName jname = _coupled_moose_vars[j]->name();
105 &this->template getMaterialPropertyDerivative<Real>("f_name", _var.name(), iname, jname);
106 }
107
108 _grad_vars[i + 1] = &_subproblem.getStandardVariable(_tid, iname).gradSln();
109 }
110}
111
112template <typename T>
113void
115{
121 this->template validateCoupling<Real>("f_name", _var.name());
122 this->template validateDerivativeMaterialPropertyBase<Real>("f_name");
123}
124
125template <typename T>
126RealGradient
128{
129 RealGradient res = 0.0;
130
131 switch (type)
132 {
134 for (unsigned int i = 0; i <= _nvar; ++i)
135 res += (*_grad_vars[i])[_qp] * (*_second_derivatives[i])[_qp];
136 return res;
137
139 res = _grad_phi[_j][_qp] * (*_second_derivatives[0])[_qp];
140 for (unsigned int i = 0; i <= _nvar; ++i)
141 res += _phi[_j][_qp] * (*_grad_vars[i])[_qp] * (*_third_derivatives[i])[_qp];
142 return res;
143 }
144
145 mooseError("Internal error");
146}
147
148template <typename T>
149Real
151{
152 // get the coupled variable jvar is referring to
153 const unsigned int cvar = this->mapJvarToCvar(jvar);
154
155 RealGradient J = _grad_u[_qp] * _phi[_j][_qp] * (*_third_derivatives[cvar + 1])[_qp] +
156 _grad_phi[_j][_qp] * (*_second_derivatives[cvar + 1])[_qp];
157
158 for (unsigned int i = 0; i < _nvar; ++i)
159 J += _phi[_j][_qp] * (*_grad_vars[i + 1])[_qp] * (*_third_cross_derivatives[i][cvar])[_qp];
160
161 return CHBulk<T>::computeQpOffDiagJacobian(jvar) + _M[_qp] * _grad_test[_i][_qp] * J;
162}
const double T
void mooseError(Args &&... args)
This is the Cahn-Hilliard equation base class that implements the bulk or local energy term of the eq...
Definition CHBulk.h:26
virtual Real computeQpOffDiagJacobian(unsigned int jvar)
Definition CHBulk.h:110
static InputParameters validParams()
Definition CHBulk.h:75
PFFunctionType
Definition CHBulk.h:39
const MaterialProperty< T > & _M
Mobility.
Definition CHBulk.h:47
CahnHilliardBase implements the residual of the Cahn-Hilliard equation in a general way that can be t...
std::vector< const MaterialProperty< Real > * > _third_derivatives
std::vector< const VariableGradient * > _grad_vars
virtual Real computeQpOffDiagJacobian(unsigned int jvar)
static InputParameters validParams()
CHBulk< T >::PFFunctionType PFFunctionType
virtual void initialSetup()
const unsigned int _nvar
CahnHilliardBase(const InputParameters &parameters)
std::vector< std::vector< const MaterialProperty< Real > * > > _third_cross_derivatives
virtual RealGradient computeGradDFDCons(PFFunctionType type)
std::vector< const MaterialProperty< Real > * > _second_derivatives
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)