LCOV - code coverage report
Current view: top level - math - pol_angle.f90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 30 35 85.7 %
Date: 2024-04-28 04:28:00 Functions: 1 2 50.0 %

          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

Generated by: LCOV version 1.14