Line data Source code
1 : !-------------------------------------------------------------------------------- 2 : ! Copyright (c) 2016 Peter Grünberg Institut, Forschungszentrum Jülich, Germany 3 : ! This file is part of FLEUR and available as free software under the conditions 4 : ! of the MIT license as expressed in the LICENSE file in more detail. 5 : !-------------------------------------------------------------------------------- 6 : 7 : MODULE m_polangle 8 : !----------------------------------------------------------------------------- 9 : ! Calculates the polar angles theta and phi of a vector with components 10 : ! vx, vy and vz. 11 : ! Philipp Kurz 2000-02-08 12 : ! Modernised A.N. 2020 13 : !----------------------------------------------------------------------------- 14 : CONTAINS 15 : 16 12126856 : SUBROUTINE pol_angle(vx, vy, vz, theta, phi,l_minimize) 17 : USE m_constants, ONLY : pimach 18 : IMPLICIT NONE 19 : 20 : REAL, INTENT(IN) :: vx, vy, vz 21 : REAL, INTENT(OUT) :: theta, phi 22 : LOGICAL,INTENT(IN),OPTIONAL :: l_minimize 23 : 24 : REAL :: eps, r, rho, pi 25 : 26 12126856 : pi = pimach() 27 12126856 : eps = 1.0e-9 28 : 29 12126856 : rho = SQRT(vx**2 + vy**2) 30 12126856 : r = SQRT(vx**2 + vy**2 + vz**2) 31 : 32 : ! Zero vector: 33 12126856 : IF ( (r.LT.eps) .AND. (rho.LT.eps) ) THEN 34 2887146 : theta = 0.0 35 2887146 : phi = 0.0 36 : ! v on positive z-axis: 37 9239710 : ELSE IF ( (rho.LT.eps) .AND. vz.GT.0) THEN 38 1308435 : theta = 0.0 39 1308435 : phi = 0.0 40 : ! v on negative z-axis: 41 7931275 : ELSE IF ( (rho.LT.eps) .AND. vz.LT.0) THEN 42 2404192 : theta = pi 43 2404192 : phi = 0.0 44 : ELSE 45 : ! v in xy-plane: 46 5527083 : IF (ABS(vz).LT.eps) THEN 47 2291927 : theta = pi/2 48 : ELSE 49 3235156 : theta = ASIN(rho/r) 50 : END IF 51 : 52 5527083 : IF ( vz.LT.0 ) THEN 53 2715851 : theta = pi - theta 54 : END IF 55 : 56 : ! v in yz-plane 57 5527083 : IF (ABS(vx).LT.eps) THEN 58 922022 : phi = pi/2 59 : 60 : ELSE 61 4605061 : phi = ASIN(ABS(vy)/rho) 62 : END IF 63 : 64 5527083 : IF ( vx.LT.0 ) phi = pi - phi 65 5527083 : IF ( vy.LT.0 ) phi = -phi 66 : 67 5527083 : if (present(l_minimize))Then 68 275 : if (l_minimize) THEN 69 : !Make phi and theta minimal 70 275 : if (abs(phi)>pi/2) THEN 71 121 : phi=phi-sign(pi,phi) 72 121 : theta=-theta 73 : endif 74 : ENDIF 75 : endif 76 : END IF 77 : 78 : 79 : 80 12126856 : END SUBROUTINE pol_angle 81 : 82 0 : SUBROUTINE sphericaltocart(r, theta, phi, x, y, z) 83 : IMPLICIT NONE 84 : 85 : REAL, INTENT(IN) :: r, theta, phi 86 : REAL, INTENT(OUT) :: x, y, z 87 : 88 0 : x=r*SIN(theta)*COS(phi) 89 0 : y=r*SIN(theta)*SIN(phi) 90 0 : z=r*COS(theta) 91 0 : END SUBROUTINE sphericaltocart 92 : 93 : END MODULE m_polangle