18 #ifndef viskores_filter_flow_internal_LagrangianStructureHelpers_h
19 #define viskores_filter_flow_internal_LagrangianStructureHelpers_h
44 T a = j1[0] * j1[0] + j1[1] * j1[1];
45 T b = j1[0] * j2[0] + j1[1] * j2[1];
47 T d = j2[0] * j2[0] + j2[1] * j2[1];
65 T a = j1[0] * j1[0] + j1[1] * j1[1] + j1[2] * j1[2];
66 T b = j1[0] * j2[0] + j1[1] * j2[1] + j1[2] * j2[2];
67 T c = j1[0] * j3[0] + j1[1] * j3[1] + j1[2] * j3[2];
69 T d = j2[0] * j2[0] + j2[1] * j2[1] + j2[2] * j2[2];
70 T e = j2[0] * j3[0] + j2[1] * j3[1] + j2[2] * j3[2];
72 T f = j3[0] * j3[0] + j3[1] * j3[1] + j3[2] * j3[2];
89 T a = j1[0] * j1[0] + j2[0] * j2[0];
90 T b = j1[0] * j1[1] + j2[0] * j2[1];
92 T d = j1[1] * j1[1] + j2[1] * j2[1];
110 T a = j1[0] * j1[0] + j2[0] * j2[0] + j3[0] * j3[0];
111 T b = j1[0] * j1[1] + j2[0] * j2[1] + j3[0] * j3[1];
112 T c = j1[0] * j1[2] + j2[0] * j2[2] + j3[0] * j3[2];
114 T d = j1[1] * j1[1] + j2[1] * j2[1] + j3[1] * j3[1];
115 T e = j1[1] * j1[2] + j2[1] * j2[2] + j3[1] * j3[2];
117 T f = j1[2] * j1[2] + j2[2] * j2[2] + j3[2] * j3[2];
124 template <
typename T>
137 T trace = (a + c) / 2.0f;
138 T det = a * c - b * b;
142 eigen[0] = trace + sqrtr;
143 eigen[1] = trace - sqrtr;
146 template <
typename T>
164 T x = (a + d + f) / 3.0f;
171 T q = (a * d * f + b * e * c + c * b * e - c * d * c - e * e * a - f * b * b) / 2.0f;
172 T r = (a * a + b * b + c * c + b * b + d * d + e * e + c * c + e * e + f * f) / 6.0f;
174 T D = (r * r * r - q * q);
177 if (D < viskores::Epsilon<T>())
184 phi +=
static_cast<T
>(viskores::Pi());
190 T sinphi = 0.0f, cosphi = 0.0f;
194 T w0 = x + 2.0f * sqrtr * cosphi;
195 T w1 = x - sqrtr * (cosphi - sqrt3 * sinphi);
196 T w2 = x - sqrtr * (cosphi + sqrt3 * sinphi);
216 #endif //viskores_filter_flow_internal_LagrangianStructureHelpers_h