52#if AMREX_SPACEDIM == 2
64 -(sigma * DDeta.trace() +
65 Dsigma * (cos(2.0 * Theta) * DDeta(0, 1) + 0.5 * sin(2.0 * Theta) * (DDeta(1, 1) - DDeta(0, 0))) +
66 0.5 * DDsigma * (sin2Theta * DDeta(0, 0) - 2. * cosThetasinTheta * DDeta(0, 1) + cos2Theta * DDeta(1, 1)));
69 DDDDeta(0, 0, 0, 0) * (sin2Theta * sin2Theta) +
70 DDDDeta(0, 0, 0, 1) * (4.0 * sin2Theta * cosThetasinTheta) +
71 DDDDeta(0, 0, 1, 1) * (6.0 * sin2Theta * cos2Theta) +
72 DDDDeta(0, 1, 1, 1) * (4.0 * cosThetasinTheta * cos2Theta) +
73 DDDDeta(1, 1, 1, 1) * (cos2Theta * cos2Theta);
74 return std::make_tuple(boundary_term, curvature_term);
76#elif AMREX_SPACEDIM == 3
81 const Set::Vector e1(1, 0, 0), e2(0, 1, 0), e3(0, 0, 1);
83 if (fabs(normal(0)) > fabs(normal(1)) && fabs(normal(0)) > fabs(normal(2)))
85 _t2 = e2 - normal.dot(e2) * normal; _t2 /= _t2.lpNorm<2>();
86 _t3 = e3 - normal.dot(e3) * normal - _t2.dot(e3) * _t2; _t3 /= _t3.lpNorm<2>();
88 else if (fabs(normal(1)) > fabs(normal(0)) && fabs(normal(1)) > fabs(normal(2)))
90 _t2 = e1 - normal.dot(e1) * normal; _t2 /= _t2.lpNorm<2>();
91 _t3 = e3 - normal.dot(e3) * normal - _t2.dot(e3) * _t2; _t3 /= _t3.lpNorm<2>();
95 _t2 = e1 - normal.dot(e1) * normal; _t2 /= _t2.lpNorm<2>();
96 _t3 = e2 - normal.dot(e2) * normal - _t2.dot(e2) * _t2; _t3 /= _t3.lpNorm<2>();
100 Eigen::Matrix2d DDeta2D;
102 _t2.dot(DDeta * _t2), _t2.dot(DDeta * _t3),
103 _t3.dot(DDeta * _t2), _t3.dot(DDeta * _t3);
104 Eigen::SelfAdjointEigenSolver<Eigen::Matrix2d> eigensolver(2);
105 eigensolver.computeDirect(DDeta2D);
106 Eigen::Matrix2d eigenvecs = eigensolver.eigenvectors();
109 Set::Vector t2 = _t2 * eigenvecs(0, 0) + _t3 * eigenvecs(0, 1),
110 t3 = _t2 * eigenvecs(1, 0) + _t3 * eigenvecs(1, 1);
115 for (
int p = 0; p < 3; p++)
116 for (
int q = 0; q < 3; q++)
117 for (
int r = 0; r < 3; r++)
118 for (
int s = 0; s < 3; s++)
120 DH2 += DDDDeta(p, q, r, s) * t2(p) * t2(q) * t2(r) * t2(s);
121 DH3 += DDDDeta(p, q, r, s) * t3(p) * t3(q) * t3(r) * t3(s);
122 DH23 += DDDDeta(p, q, r, s) * t2(p) * t2(q) * t3(r) * t3(s);
130 Set::Scalar gbenergy_df = -sigma * DDeta.trace() - DDK2 * DDeta2D(0, 0) - DDK3 * DDeta2D(1, 1);
137 return std::make_tuple(gbenergy_df, reg_df);