Line data Source code
1 : MODULE m_hf_init
2 : !
3 : ! preparations for HF and fi%hybinp functional calculation
4 : !
5 : CONTAINS
6 24 : SUBROUTINE hf_init(mpdata,fi, hybdat)
7 : USE m_types
8 : USE m_hybrid_core
9 : USE m_util
10 : use m_intgrf
11 : USE m_types_hybdat
12 : IMPLICIT NONE
13 : TYPE(t_mpdata), intent(inout) :: mpdata
14 : type(t_fleurinput), intent(in) :: fi
15 : TYPE(t_hybdat), INTENT(INOUT) :: hybdat
16 :
17 : INTEGER:: l, m, i, l1, l2, m1, m2
18 :
19 :
20 : !initialize hybdat%gridf for radial integration
21 12 : CALL intgrf_init(fi%atoms%ntype, fi%atoms%jmtd, fi%atoms%jri, fi%atoms%dx, fi%atoms%rmsh, hybdat%gridf)
22 : ! preparations for core states
23 12 : CALL core_init( fi%input, fi%atoms, hybdat%lmaxcd, hybdat%maxindxc)
24 32 : hybdat%maxfac = max(2*fi%atoms%lmaxd + maxval(fi%hybinp%lcutm1) + 1, 2*hybdat%lmaxcd + 2*fi%atoms%lmaxd + 1)
25 :
26 : !Alloc variables
27 12 : call hybdat%free()
28 12 : call hybdat%allocate(fi, mpdata%num_radfun_per_l)
29 :
30 : ! pre-calculate gaunt coefficients
31 12 : hybdat%fac(0) = 1
32 12 : hybdat%sfac(0) = 1
33 280 : DO i = 1, hybdat%maxfac
34 268 : hybdat%fac(i) = hybdat%fac(i - 1)*i ! hybdat%fac(i) = i!
35 280 : hybdat%sfac(i) = hybdat%sfac(i - 1)*sqrt(i*1.0) ! hybdat%sfac(i) = sqrt(i!)
36 : END DO
37 :
38 128 : DO l2 = 0, fi%atoms%lmaxd
39 1260 : DO l1 = 0, fi%atoms%lmaxd
40 5368 : DO l = abs(l1 - l2), min(l1 + l2, maxval(fi%hybinp%lcutm1))
41 17052 : DO m = -l, l
42 163148 : DO m1 = -l1, l1
43 147228 : m2 = m1 + m ! Gaunt condition -m1+m2-m = 0
44 147228 : IF (abs(m2) <= l2) hybdat%gauntarr(1, l1, l2, l, m1, m) = gaunt(l1, l2, l, m1, m2, m, hybdat%maxfac, hybdat%fac, hybdat%sfac)
45 147228 : m2 = m1 - m ! switch role of l2-index
46 160968 : IF (abs(m2) <= l2) hybdat%gauntarr(2, l1, l2, l, m1, m) = gaunt(l2, l1, l, m2, m1, m, hybdat%maxfac, hybdat%fac, hybdat%sfac)
47 : END DO
48 : END DO
49 : END DO
50 : END DO
51 : END DO
52 12 : END SUBROUTINE hf_init
53 : END MODULE m_hf_init
|