1 #ifndef MODEL_INTERFACE_GB_H
2 #define MODEL_INTERFACE_GB_H
5 #include <AMReX_AmrCore.H>
7 #include <eigen3/Eigen/Eigenvalues>
32 std::ofstream outFile;
35 for (amrex::Real theta = 0; theta < 2 *
pi; theta = theta + dTheta)
37 outFile << theta <<
" " <<
W(theta) << std::endl;
45 std::tuple<Set::Scalar, Set::Scalar>
48 #if AMREX_SPACEDIM == 2
60 -(sigma * DDeta.trace() +
61 Dsigma * (cos(2.0 * Theta) * DDeta(0, 1) + 0.5 * sin(2.0 * Theta) * (DDeta(1, 1) - DDeta(0, 0))) +
62 0.5 * DDsigma * (sin2Theta * DDeta(0, 0) - 2. * cosThetasinTheta * DDeta(0, 1) + cos2Theta * DDeta(1, 1)));
65 DDDDeta(0, 0, 0, 0) * (sin2Theta * sin2Theta) +
66 DDDDeta(0, 0, 0, 1) * (4.0 * sin2Theta * cosThetasinTheta) +
67 DDDDeta(0, 0, 1, 1) * (6.0 * sin2Theta * cos2Theta) +
68 DDDDeta(0, 1, 1, 1) * (4.0 * cosThetasinTheta * cos2Theta) +
69 DDDDeta(1, 1, 1, 1) * (cos2Theta * cos2Theta);
70 return std::make_tuple(boundary_term, curvature_term);
72 #elif AMREX_SPACEDIM == 3
77 const Set::Vector e1(1, 0, 0), e2(0, 1, 0), e3(0, 0, 1);
79 if (fabs(normal(0)) > fabs(normal(1)) && fabs(normal(0)) > fabs(normal(2)))
81 _t2 = e2 - normal.dot(e2) * normal; _t2 /= _t2.lpNorm<2>();
82 _t3 = e3 - normal.dot(e3) * normal - _t2.dot(e3) * _t2; _t3 /= _t3.lpNorm<2>();
84 else if (fabs(normal(1)) > fabs(normal(0)) && fabs(normal(1)) > fabs(normal(2)))
86 _t2 = e1 - normal.dot(e1) * normal; _t2 /= _t2.lpNorm<2>();
87 _t3 = e3 - normal.dot(e3) * normal - _t2.dot(e3) * _t2; _t3 /= _t3.lpNorm<2>();
91 _t2 = e1 - normal.dot(e1) * normal; _t2 /= _t2.lpNorm<2>();
92 _t3 = e2 - normal.dot(e2) * normal - _t2.dot(e2) * _t2; _t3 /= _t3.lpNorm<2>();
96 Eigen::Matrix2d DDeta2D;
98 _t2.dot(DDeta * _t2), _t2.dot(DDeta * _t3),
99 _t3.dot(DDeta * _t2), _t3.dot(DDeta * _t3);
100 Eigen::SelfAdjointEigenSolver<Eigen::Matrix2d> eigensolver(2);
101 eigensolver.computeDirect(DDeta2D);
102 Eigen::Matrix2d eigenvecs = eigensolver.eigenvectors();
105 Set::Vector t2 = _t2 * eigenvecs(0, 0) + _t3 * eigenvecs(0, 1),
106 t3 = _t2 * eigenvecs(1, 0) + _t3 * eigenvecs(1, 1);
111 for (
int p = 0; p < 3; p++)
112 for (
int q = 0; q < 3; q++)
113 for (
int r = 0; r < 3; r++)
114 for (
int s = 0; s < 3; s++)
116 DH2 += DDDDeta(p, q, r, s) * t2(p) * t2(q) * t2(r) * t2(s);
117 DH3 += DDDDeta(p, q, r, s) * t3(p) * t3(q) * t3(r) * t3(s);
118 DH23 += DDDDeta(p, q, r, s) * t2(p) * t2(q) * t3(r) * t3(s);
126 Set::Scalar gbenergy_df = -sigma * DDeta.trace() - DDK2 * DDeta2D(0, 0) - DDK3 * DDeta2D(1, 1);
130 if (
regularization == Regularization::Wilhelm) reg_df = DH2 + DH3 + 2.0 * DH23;
131 else if (
regularization == Regularization::K23) reg_df = DH2 + DH3;
133 return std::make_tuple(gbenergy_df, reg_df);
140 static constexpr amrex::Real
pi = 3.14159265359;