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 448463 : 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 448463 : symbol = ""
53 :
54 448463 : IF ((n > 0) .AND. (n < 100)) THEN
55 448463 : WRITE (symbol(1:2), "(I2)") n
56 : ELSE
57 0 : CPABORT("Invalid principal quantum number specified")
58 : END IF
59 :
60 1793852 : l = SUM(lxyz(1:3))
61 :
62 448463 : IF ((l >= 0) .AND. (l <= 11)) THEN
63 448463 : 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 1793852 : DO i = 1, 3
71 1793852 : IF (lxyz(i) > 0) THEN
72 274104 : symbol(ipos:ipos) = xyz(i)
73 274104 : ipos = ipos + 1
74 274104 : IF (lxyz(i) > 1) THEN
75 59673 : IF (lxyz(i) < 10) THEN
76 59673 : WRITE (symbol(ipos:ipos), "(I1)") lxyz(i)
77 59673 : 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 448463 : 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 183541 : 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 183541 : symbol = ""
115 :
116 183541 : IF (n == 0) THEN
117 : i = 1
118 183399 : ELSE IF ((n > 0) .AND. (n < 100)) THEN
119 183399 : WRITE (symbol(1:2), "(I2)") n
120 183399 : i = 3
121 : ELSE
122 0 : CPABORT("Invalid principal quantum number specified")
123 : END IF
124 :
125 183541 : IF ((l >= 0) .AND. (l <= 11)) THEN
126 183541 : symbol(i:i) = l_sym(l)
127 183541 : i = i + 1
128 : ELSE
129 0 : CPABORT("Invalid angular momentum quantum number specified")
130 : END IF
131 :
132 183541 : IF (ABS(m) <= l) THEN
133 183541 : IF (l == 1) THEN
134 74445 : symbol(i:i) = yzx(m)
135 109096 : ELSE IF (l > 1) THEN
136 72633 : IF (m == 0) THEN
137 13377 : WRITE (symbol(i:i), "(I1)") m
138 59256 : ELSE IF (ABS(m) < 10) THEN
139 59256 : 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 183541 : END FUNCTION sgf_symbol
149 :
150 : END MODULE orbital_symbols
|