LCOV - code coverage report
Current view: top level - src/aobasis - orbital_symbols.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:b279b6b) Lines: 34 45 75.6 %
Date: 2024-04-24 07:13:09 Functions: 2 2 100.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2024 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \brief orbital_symbols
      10             : !> \par History
      11             : !>      none
      12             : !> \author Matthias Krack (08.06.2000)
      13             : ! **************************************************************************************************
      14             : MODULE orbital_symbols
      15             : 
      16             : ! Index:
      17             : ! FUNCTION cgf_symbol(n,lxyz) RESULT(symbol)
      18             : ! FUNCTION sgf_symbol(n,l,m) RESULT(symbol)
      19             : #include "../base/base_uses.f90"
      20             :    IMPLICIT NONE
      21             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'orbital_symbols'
      22             :    PRIVATE
      23             : 
      24             :    CHARACTER(LEN=1), PARAMETER, DIMENSION(0:11) :: l_sym = (/"s", "p", "d", &
      25             :                                                              "f", "g", "h", &
      26             :                                                              "i", "j", "k", &
      27             :                                                              "l", "m", "n"/)
      28             : 
      29             :    PUBLIC :: cgf_symbol, sgf_symbol
      30             :    PUBLIC :: l_sym
      31             : 
      32             : CONTAINS
      33             : 
      34             : ! **************************************************************************************************
      35             : !> \brief   Build a Cartesian orbital symbol (orbital labels for printing).
      36             : !> \param n ...
      37             : !> \param lxyz ...
      38             : !> \return ...
      39             : !> \date    07.07.99
      40             : !> \author  Matthias Krack
      41             : !> \version 1.0
      42             : ! **************************************************************************************************
      43      410475 :    FUNCTION cgf_symbol(n, lxyz) RESULT(symbol)
      44             :       INTEGER, INTENT(IN)                                :: n
      45             :       INTEGER, DIMENSION(3), INTENT(IN)                  :: lxyz
      46             :       CHARACTER(LEN=12)                                  :: symbol
      47             : 
      48             :       CHARACTER(LEN=1), DIMENSION(3), PARAMETER          :: xyz = (/"x", "y", "z"/)
      49             : 
      50             :       INTEGER                                            :: i, ipos, l
      51             : 
      52      410475 :       symbol = ""
      53             : 
      54      410475 :       IF ((n > 0) .AND. (n < 100)) THEN
      55      410475 :          WRITE (symbol(1:2), "(I2)") n
      56             :       ELSE
      57           0 :          CPABORT("Invalid principal quantum number specified")
      58             :       END IF
      59             : 
      60     1641900 :       l = SUM(lxyz(1:3))
      61             : 
      62      410475 :       IF ((l >= 0) .AND. (l <= 11)) THEN
      63      410475 :          symbol(3:3) = l_sym(l)
      64             :       ELSE
      65           0 :          CPABORT("Invalid angular momentum quantum number specified")
      66             :       END IF
      67             : 
      68             :       ipos = 4
      69             : 
      70     1641900 :       DO i = 1, 3
      71     1641900 :          IF (lxyz(i) > 0) THEN
      72      264198 :             symbol(ipos:ipos) = xyz(i)
      73      264198 :             ipos = ipos + 1
      74      264198 :             IF (lxyz(i) > 1) THEN
      75       57567 :                IF (lxyz(i) < 10) THEN
      76       57567 :                   WRITE (symbol(ipos:ipos), "(I1)") lxyz(i)
      77       57567 :                   ipos = ipos + 1
      78           0 :                ELSE IF (lxyz(i) < 100) THEN
      79           0 :                   WRITE (symbol(ipos:ipos + 1), "(I2)") lxyz(i)
      80           0 :                   ipos = ipos + 2
      81             :                ELSE
      82           0 :                   CPABORT("Invalid magnetic quantum number specified")
      83             :                END IF
      84             :             END IF
      85             :          END IF
      86             :       END DO
      87             : 
      88      410475 :    END FUNCTION cgf_symbol
      89             : 
      90             : ! **************************************************************************************************
      91             : !> \brief   Build a spherical orbital symbol (orbital labels for printing).
      92             : !> \param n ...
      93             : !> \param l ...
      94             : !> \param m ...
      95             : !> \return ...
      96             : !> \date    11.03.99
      97             : !> \par Variables
      98             : !>       - l: Angular momentum quantum number l of the orbital.
      99             : !>       - m: Magnetic quantum number m of the orbital.
     100             : !>       - n: Principle quantum number n of the orbital.
     101             : !> \par History
     102             : !>  - Ignore n value for n = 0 (16.02.2009,MK)
     103             : !> \author  Matthias Krack
     104             : !> \version 1.0
     105             : ! **************************************************************************************************
     106      177759 :    FUNCTION sgf_symbol(n, l, m) RESULT(symbol)
     107             :       INTEGER, INTENT(IN)                                :: n, l, m
     108             :       CHARACTER(LEN=6)                                   :: symbol
     109             : 
     110             :       CHARACTER(LEN=1), DIMENSION(-1:1), PARAMETER       :: yzx = (/"y", "z", "x"/)
     111             : 
     112             :       INTEGER                                            :: i
     113             : 
     114      177759 :       symbol = ""
     115             : 
     116      177759 :       IF (n == 0) THEN
     117             :          i = 1
     118      177617 :       ELSE IF ((n > 0) .AND. (n < 100)) THEN
     119      177617 :          WRITE (symbol(1:2), "(I2)") n
     120      177617 :          i = 3
     121             :       ELSE
     122           0 :          CPABORT("Invalid principal quantum number specified")
     123             :       END IF
     124             : 
     125      177759 :       IF ((l >= 0) .AND. (l <= 11)) THEN
     126      177759 :          symbol(i:i) = l_sym(l)
     127      177759 :          i = i + 1
     128             :       ELSE
     129           0 :          CPABORT("Invalid angular momentum quantum number specified")
     130             :       END IF
     131             : 
     132      177759 :       IF (ABS(m) <= l) THEN
     133      177759 :          IF (l == 1) THEN
     134       72375 :             symbol(i:i) = yzx(m)
     135      105384 :          ELSE IF (l > 1) THEN
     136       70035 :             IF (m == 0) THEN
     137       12903 :                WRITE (symbol(i:i), "(I1)") m
     138       57132 :             ELSE IF (ABS(m) < 10) THEN
     139       57132 :                WRITE (symbol(i:i + 1), "(SP,I2)") m
     140           0 :             ELSE IF (ABS(m) < 100) THEN
     141           0 :                WRITE (symbol(i:i + 2), "(SP,I3)") m
     142             :             END IF
     143             :          END IF
     144             :       ELSE
     145           0 :          CPABORT("Invalid magnetic quantum number specified")
     146             :       END IF
     147             : 
     148      177759 :    END FUNCTION sgf_symbol
     149             : 
     150             : END MODULE orbital_symbols

Generated by: LCOV version 1.15