41real(8),
intent(in) :: eps,rot(3,3)
42real(8),
intent(out) :: det,v(3),th
44real(8),
parameter :: pi=3.1415926535897932385d0
45real(8) rotp(3,3),t1,t2
47det=rot(1,1)*(rot(2,2)*rot(3,3)-rot(3,2)*rot(2,3)) &
48 +rot(2,1)*(rot(3,2)*rot(1,3)-rot(1,2)*rot(3,3)) &
49 +rot(3,1)*(rot(1,2)*rot(2,3)-rot(2,2)*rot(1,3))
50if (abs(det-1.d0) < eps)
then
52 rotp(1:3,1:3)=rot(1:3,1:3)
53else if (abs(det+1.d0) < eps)
then
55 rotp(1:3,1:3)=-rot(1:3,1:3)
59v(1)=0.5d0*(rotp(2,3)-rotp(3,2))
60v(2)=0.5d0*(rotp(3,1)-rotp(1,3))
61v(3)=0.5d0*(rotp(1,2)-rotp(2,1))
62t1=sqrt(v(1)**2+v(2)**2+v(3)**2)
63t2=0.5d0*(rotp(1,1)+rotp(2,2)+rotp(3,3)-1.d0)
64if (abs(abs(t2)-1.d0) > eps)
then
73 v(1)=0.d0; v(2)=0.d0; v(3)=1.d0
77 if ((rotp(1,1) >= rotp(2,2)).and.(rotp(1,1) >= rotp(3,3)))
then
78 if (rotp(1,1) < (-1.d0+eps))
goto 10
79 v(1)=sqrt(0.5d0*abs(rotp(1,1)+1.d0))
80 v(2)=(rotp(2,1)+rotp(1,2))/(4.d0*v(1))
81 v(3)=(rotp(3,1)+rotp(1,3))/(4.d0*v(1))
82 else if ((rotp(2,2) >= rotp(1,1)).and.(rotp(2,2) >= rotp(3,3)))
then
83 if (rotp(2,2) < (-1.d0+eps))
goto 10
84 v(2)=sqrt(0.5d0*abs(rotp(2,2)+1.d0))
85 v(3)=(rotp(3,2)+rotp(2,3))/(4.d0*v(2))
86 v(1)=(rotp(1,2)+rotp(2,1))/(4.d0*v(2))
88 if (rotp(3,3) < (-1.d0+eps))
goto 10
89 v(3)=sqrt(0.5d0*abs(rotp(3,3)+1.d0))
90 v(1)=(rotp(1,3)+rotp(3,1))/(4.d0*v(3))
91 v(2)=(rotp(2,3)+rotp(3,2))/(4.d0*v(3))
98write(*,
'("Error(rotaxang): invalid rotation matrix:")')
99write(*,
'(3G18.10)') rot(1,1:3)
100write(*,
'(3G18.10)') rot(2,1:3)
101write(*,
'(3G18.10)') rot(3,1:3)