Calculates eigenvalues based on the trigonometric solution of A = pB + qI
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
real(kind=wp), | intent(in) | :: | a(3,3) |
The symmetric input matrix |
||
real(kind=wp), | intent(out) | :: | w(3) |
Contains eigenvalues on exit |
pure subroutine eigval_3x3(a, w) !> The symmetric input matrix real(wp), intent(in) :: a(3, 3) !> Contains eigenvalues on exit real(wp), intent(out) :: w(3) real(wp) :: q, p, r r = a(1, 2) * a(1, 2) + a(1, 3) * a(1, 3) + a(2, 3) * a(2, 3) q = (a(1, 1) + a(2, 2) + a(3, 3)) / 3.0_wp w(1) = a(1, 1) - q w(2) = a(2, 2) - q w(3) = a(3, 3) - q p = sqrt((w(1) * w(1) + w(2) * w(2) + w(3) * w(3) + 2*r) / 6.0_wp) r = (w(1) * (w(2) * w(3) - a(2, 3) * a(2, 3)) & & - a(1, 2) * (a(1, 2) * w(3) - a(2, 3) * a(1, 3)) & & + a(1, 3) * (a(1, 2) * a(2, 3) - w(2) * a(1, 3))) / (p*p*p) * 0.5_wp if (r <= -1.0_wp) then r = 0.5_wp * twothirdpi else if (r >= 1.0_wp) then r = 0.0_wp else r = acos(r) / 3.0_wp end if w(3) = q + 2 * p * cos(r) w(1) = q + 2 * p * cos(r + twothirdpi) w(2) = 3 * q - w(1) - w(3) end subroutine eigval_3x3