27 #include "WTensorFunctions.h"
34 const double M_SQRT3 = 1.73205080756887729352744634151;
35 double de = m( 1, 2 ) * m( 1, 0 );
36 double dd = m( 1, 2 ) * m( 1, 2 );
37 double ee = m( 1, 0 ) * m( 1, 0 );
38 double ff = m( 2, 0 ) * m( 2, 0 );
39 double m0 = m( 0, 0 ) + m( 1, 1 ) + m( 2, 2 );
40 double c1 = m( 0, 0 ) * m( 1, 1 ) + m( 0, 0 ) * m( 2, 2 ) + m( 1, 1 ) * m( 2, 2 )
42 double c0 = m( 2, 2 ) * dd + m( 0, 0 ) * ee + m( 1, 1 ) * ff - m( 0, 0 ) * m( 1, 1 ) * m( 2, 2 ) - 2. * m( 2, 0 ) * de;
44 double p, sqrt_p, q, c, s, phi;
45 p = m0 * m0 - 3. * c1;
46 q = m0 * ( p - ( 3. / 2. ) * c1 ) - ( 27. / 2. ) * c0;
47 sqrt_p = sqrt( fabs( p ) );
49 phi = 27. * ( 0.25 * c1 * c1 * ( p - c1 ) + c0 * ( q + 27. / 4. * c0 ) );
50 phi = ( 1. / 3. ) * atan2( sqrt( fabs( phi ) ), q );
52 c = sqrt_p * cos( phi );
53 s = ( 1. / M_SQRT3 ) * sqrt_p * sin( phi );
55 std::vector< double > w( 3 );
57 w[ 2 ] = ( 1. / 3. ) * ( m0 - c );