www.mooseframework.org
InterfaceOrientationMultiphaseMaterial.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 #include "MooseMesh.h"
12 #include "MathUtils.h"
13 
15 
16 template <>
17 InputParameters
19 {
20  InputParameters params = validParams<Material>();
21  params.addClassDescription(
22  "This Material accounts for the the orientation dependence "
23  "of interfacial energy for multi-phase multi-order parameter phase-field model.");
24  params.addRequiredParam<MaterialPropertyName>("kappa_name",
25  "Name of the kappa for the given phase");
26  params.addRequiredParam<MaterialPropertyName>(
27  "dkappadgrad_etaa_name", "Name of the derivative of kappa w.r.t. the gradient of eta");
28  params.addRequiredParam<MaterialPropertyName>(
29  "d2kappadgrad_etaa_name",
30  "Name of the second derivative of kappa w.r.t. the gradient of eta");
31  params.addParam<Real>(
32  "anisotropy_strength", 0.04, "Strength of the anisotropy (typically < 0.05)");
33  params.addParam<unsigned int>("mode_number", 4, "Mode number for anisotropy");
34  params.addParam<Real>(
35  "reference_angle", 90, "Reference angle for defining anisotropy in degrees");
36  params.addParam<Real>("kappa_bar", 0.1125, "Average value of the interface parameter kappa");
37  params.addRequiredCoupledVar("etaa", "Order parameter for the current phase alpha");
38  params.addRequiredCoupledVar("etab", "Order parameter for the neighboring phase beta");
39  return params;
40 }
41 
43  const InputParameters & parameters)
44  : Material(parameters),
45  _kappa_name(getParam<MaterialPropertyName>("kappa_name")),
46  _dkappadgrad_etaa_name(getParam<MaterialPropertyName>("dkappadgrad_etaa_name")),
47  _d2kappadgrad_etaa_name(getParam<MaterialPropertyName>("d2kappadgrad_etaa_name")),
48  _delta(getParam<Real>("anisotropy_strength")),
49  _j(getParam<unsigned int>("mode_number")),
50  _theta0(getParam<Real>("reference_angle")),
51  _kappa_bar(getParam<Real>("kappa_bar")),
52  _kappa(declareProperty<Real>(_kappa_name)),
53  _dkappadgrad_etaa(declareProperty<RealGradient>(_dkappadgrad_etaa_name)),
54  _d2kappadgrad_etaa(declareProperty<RealTensorValue>(_d2kappadgrad_etaa_name)),
55  _etaa(coupledValue("etaa")),
56  _grad_etaa(coupledGradient("etaa")),
57  _etab(coupledValue("etab")),
58  _grad_etab(coupledGradient("etab"))
59 {
60  // this currently only works in 2D simulations
61  if (_mesh.dimension() != 2)
62  mooseError("InterfaceOrientationMultiphaseMaterial requires a two-dimensional mesh.");
63 }
64 
65 void
67 {
68  const Real tol = 1e-9;
69  const Real cutoff = 1.0 - tol;
70 
71  // Normal direction of the interface
72  Real n = 0.0;
73  const RealGradient nd = _grad_etaa[_qp] - _grad_etab[_qp];
74  const Real nx = nd(0);
75  const Real ny = nd(1);
76  const Real n2x = nd(0) * nd(0);
77  const Real n2y = nd(1) * nd(1);
78  const Real nsq = nd.norm_sq();
79  const Real n2sq = nsq * nsq;
80  if (nsq > tol)
81  n = nx / std::sqrt(nsq);
82 
83  if (n > cutoff)
84  n = cutoff;
85 
86  if (n < -cutoff)
87  n = -cutoff;
88 
89  // Calculate the orientation angle
90  const Real angle = std::acos(n) * MathUtils::sign(ny);
91 
92  // Compute derivatives of the angle wrt n
93  const Real dangledn = -MathUtils::sign(ny) / std::sqrt(1.0 - n * n);
94  const Real d2angledn2 = -MathUtils::sign(ny) * n / (1.0 - n * n) / std::sqrt(1.0 - n * n);
95 
96  // Compute derivative of n wrt grad_eta
97  RealGradient dndgrad_etaa;
98  if (nsq > tol)
99  {
100  dndgrad_etaa(0) = ny * ny;
101  dndgrad_etaa(1) = -nx * ny;
102  dndgrad_etaa /= nsq * std::sqrt(nsq);
103  }
104 
105  // Compute the square of dndgrad_etaa
106  RealTensorValue dndgrad_etaa_sq;
107  if (nsq > tol)
108  {
109  dndgrad_etaa_sq(0, 0) = n2y * n2y;
110  dndgrad_etaa_sq(0, 1) = -nx * ny * n2y;
111  dndgrad_etaa_sq(1, 0) = -nx * ny * n2y;
112  dndgrad_etaa_sq(1, 1) = n2x * n2y;
113  dndgrad_etaa_sq /= n2sq * nsq;
114  }
115 
116  // Compute the second derivative of n wrt grad_eta
117  RealTensorValue d2ndgrad_etaa2;
118  if (nsq > tol)
119  {
120  d2ndgrad_etaa2(0, 0) = -3.0 * nx * n2y;
121  d2ndgrad_etaa2(0, 1) = -ny * n2y + 2.0 * ny * n2x;
122  d2ndgrad_etaa2(1, 0) = -ny * n2y + 2.0 * ny * n2x;
123  d2ndgrad_etaa2(1, 1) = -nx * n2x + 2.0 * nx * n2y;
124  d2ndgrad_etaa2 /= n2sq * std::sqrt(nsq);
125  }
126 
127  // Calculate interfacial coefficient kappa and its derivatives wrt the angle
128  Real anglediff = _j * (angle - _theta0 * libMesh::pi / 180.0);
129  _kappa[_qp] =
130  _kappa_bar * (1.0 + _delta * std::cos(anglediff)) * (1.0 + _delta * std::cos(anglediff));
131  Real dkappadangle =
132  -2.0 * _kappa_bar * _delta * _j * (1.0 + _delta * std::cos(anglediff)) * std::sin(anglediff);
133  Real d2kappadangle =
134  2.0 * _kappa_bar * _delta * _delta * _j * _j * std::sin(anglediff) * std::sin(anglediff) -
135  2.0 * _kappa_bar * _delta * _j * _j * (1.0 + _delta * std::cos(anglediff)) *
136  std::cos(anglediff);
137 
138  // Compute derivatives of kappa wrt grad_eta
139  _dkappadgrad_etaa[_qp] = dkappadangle * dangledn * dndgrad_etaa;
140  _d2kappadgrad_etaa[_qp] = d2kappadangle * dangledn * dangledn * dndgrad_etaa_sq +
141  dkappadangle * d2angledn2 * dndgrad_etaa_sq +
142  dkappadangle * dangledn * d2ndgrad_etaa2;
143 }
validParams< InterfaceOrientationMultiphaseMaterial >
InputParameters validParams< InterfaceOrientationMultiphaseMaterial >()
Definition: InterfaceOrientationMultiphaseMaterial.C:18
InterfaceOrientationMultiphaseMaterial::computeQpProperties
virtual void computeQpProperties()
Definition: InterfaceOrientationMultiphaseMaterial.C:66
InterfaceOrientationMultiphaseMaterial::_theta0
Real _theta0
Definition: InterfaceOrientationMultiphaseMaterial.h:37
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
InterfaceOrientationMultiphaseMaterial::_grad_etaa
const VariableGradient & _grad_etaa
Definition: InterfaceOrientationMultiphaseMaterial.h:45
InterfaceOrientationMultiphaseMaterial.h
InterfaceOrientationMultiphaseMaterial::_delta
Real _delta
Definition: InterfaceOrientationMultiphaseMaterial.h:35
InterfaceOrientationMultiphaseMaterial::_grad_etab
const VariableGradient & _grad_etab
Definition: InterfaceOrientationMultiphaseMaterial.h:48
InterfaceOrientationMultiphaseMaterial::_j
unsigned int _j
Definition: InterfaceOrientationMultiphaseMaterial.h:36
InterfaceOrientationMultiphaseMaterial::_d2kappadgrad_etaa
MaterialProperty< RealTensorValue > & _d2kappadgrad_etaa
Definition: InterfaceOrientationMultiphaseMaterial.h:42
InterfaceOrientationMultiphaseMaterial::_kappa_bar
Real _kappa_bar
Definition: InterfaceOrientationMultiphaseMaterial.h:38
tol
const double tol
Definition: Setup.h:18
InterfaceOrientationMultiphaseMaterial::_kappa
MaterialProperty< Real > & _kappa
Definition: InterfaceOrientationMultiphaseMaterial.h:40
InterfaceOrientationMultiphaseMaterial
Material to compute the angular orientation of order parameter interfaces.
Definition: InterfaceOrientationMultiphaseMaterial.h:23
InterfaceOrientationMultiphaseMaterial::_dkappadgrad_etaa
MaterialProperty< RealGradient > & _dkappadgrad_etaa
Definition: InterfaceOrientationMultiphaseMaterial.h:41
InterfaceOrientationMultiphaseMaterial::InterfaceOrientationMultiphaseMaterial
InterfaceOrientationMultiphaseMaterial(const InputParameters &parameters)
Definition: InterfaceOrientationMultiphaseMaterial.C:42
registerMooseObject
registerMooseObject("PhaseFieldApp", InterfaceOrientationMultiphaseMaterial)