LCOV - code coverage report
Current view: top level - ldau - uj2f.f90 (source / functions) Hit Total Coverage
Test: combined.info Lines: 23 56 41.1 %
Date: 2019-09-08 04:53:50 Functions: 1 1 100.0 %

          Line data    Source code
       1             : MODULE m_uj2f
       2             :   USE m_juDFT
       3             : !  *********************************************************************
       4             : !  * The calculation of slater integrals from u&j                      *
       5             : !  * input in eV; output in htr.                                       *
       6             : !  *-------------------------------------------------------------------*
       7             : !  * Extension to multiple U per atom type by G.M. 2017                *
       8             : !  *********************************************************************
       9             : CONTAINS
      10          28 :   SUBROUTINE uj2f(&
      11             :        jspins,atoms,&
      12          28 :        f0,f2,f4,f6)
      13             : 
      14             :     USE m_types
      15             :     IMPLICIT NONE
      16             :     !
      17             :     !  .. Arguments ..
      18             :     INTEGER,        INTENT(IN)  :: jspins
      19             :     TYPE(t_atoms),  INTENT(IN)  :: atoms
      20             :     REAL,           INTENT (OUT):: f0(atoms%n_u,jspins),f2(atoms%n_u,jspins)
      21             :     REAL,           INTENT (OUT):: f4(atoms%n_u,jspins),f6(atoms%n_u,jspins)
      22             :     !
      23             :     !  .. Local variables ..
      24             :     INTEGER l,itype,ltest,ispin,i_u
      25             :     REAL u,j,a,ftest(4)
      26             :     LOGICAL l_exist
      27             : 
      28          28 :     l_exist=.FALSE.
      29          28 :     INQUIRE (file='slaterf',exist=l_exist)
      30             : 
      31          28 :     IF (l_exist) THEN
      32             :        !
      33             :        ! --> f's have been calculated in cored ; read from file
      34             :        !
      35           0 :        OPEN (45,file='slaterf',form='formatted',status='old')
      36           0 :        DO ispin = 1, jspins
      37           0 :           DO i_u = 1, atoms%n_u
      38           0 :              itype = atoms%lda_u(i_u)%atomType
      39           0 :              l = atoms%lda_u(i_u)%l
      40           0 :              f2(i_u,ispin)=0.0 ; f4(i_u,ispin)=0.0 ; f6(i_u,ispin)=0.0
      41           0 : 100          READ (45,'(i3,4f20.10)') ltest,ftest(1:4)
      42           0 :              IF (ltest.EQ.l) THEN
      43           0 :                 f0(i_u,ispin) = ftest(1)
      44           0 :                 IF (l.GT.0) THEN
      45           0 :                    f2(i_u,ispin) = ftest(2)
      46           0 :                    IF (l.GT.1) THEN
      47           0 :                       f4(i_u,ispin) = ftest(3)
      48           0 :                       IF (l.GT.2) THEN
      49           0 :                          f6(i_u,ispin) = ftest(4)
      50             :                       END IF
      51             :                    END IF
      52             :                 END IF
      53             :              ELSE
      54             :                 GOTO 100
      55             :              END IF
      56           0 :              READ (45,'(i3,4f20.10)') ltest,ftest(1)
      57             :              !                IF (ltest.EQ.0) THEN
      58             :              !                   f0(n,ispin) = f0(n,ispin) - ftest(1)
      59             :              !                ENDIF
      60             : 
      61             :              !              write(*,*) n,ispin,l,f0(n,ispin),f2(n,ispin),
      62             :              !    +                              f4(n,ispin),f6(n,ispin)
      63             :           END DO
      64             :        ENDDO
      65           0 :        CLOSE (45)
      66             :     ELSE
      67             :        !
      68             :        ! lda_u%l: orb.mom; lda_u%u,j: in eV
      69             :        !
      70         252 :        DO i_u = 1, atoms%n_u
      71         112 :           itype = atoms%lda_u(i_u)%atomType
      72         112 :           l = atoms%lda_u(i_u)%l
      73         112 :           u = atoms%lda_u(i_u)%u
      74         112 :           j = atoms%lda_u(i_u)%j
      75             :           !
      76             :           !        l.eq.0 :  f0 = u (the l=0 and l=1 case approximated g.b.`01)
      77             :           !
      78         112 :           IF (l.EQ.0) THEN
      79           0 :              f0(i_u,1) = u
      80           0 :              f2(i_u,1) = 0.0
      81           0 :              f4(i_u,1) = 0.0
      82           0 :              f6(i_u,1) = 0.0
      83           0 :              IF (j>0.00001) CALL juDFT_error("lda+u: no magnetic s-states", calledby ="uj2f")
      84             :              !
      85             :              !        l == 1 :  j = f2 / 5  (from PRL 80,5758 g.b.)
      86             :              !
      87         112 :           ELSE IF (l.EQ.1) THEN
      88          56 :              f0(i_u,1) = u
      89          56 :              f2(i_u,1) = 5.0*j
      90          56 :              f4(i_u,1) = 0.0
      91          56 :              f6(i_u,1) = 0.0
      92             :              !
      93             :              !        l.eq.2 : 3d: j=(f2+f4)/14; f4/f2 = 0.625
      94             :              !
      95          56 :           ELSE IF (l.EQ.2) THEN
      96             :              !             PRINT*, 'd-states'
      97          56 :              f0(i_u,1) = u
      98          56 :              f2(i_u,1) = 14.0*j/1.625
      99          56 :              f4(i_u,1) = f2(i_u,1)*0.625
     100          56 :              f6(i_u,1) = 0.0
     101             :              !
     102             :              !        l.eq. 3 : 4f: j=(286f2+195f4+250f6)/6435; f2/f4 = 675/451; f2/f6=2025/1001
     103             :              !
     104           0 :           ELSE IF (l.EQ.3) THEN
     105             :              !             PRINT*, 'f-states'
     106           0 :              f0(i_u,1) = u
     107           0 :              a= 286.0 + 195.0*451.0/675.0 + 250.0*1001.0/2025.0
     108           0 :              f2(i_u,1) = 6435.0*j/a
     109           0 :              f4(i_u,1) = 451.0/675.0*f2(i_u,1)
     110           0 :              f6(i_u,1) = 1001.0/2025.0*f2(i_u,1)
     111             :           ELSE
     112           0 :              PRINT*, 'lda+U is restricted to l<=3 ! You used l=', l
     113             :           END IF
     114         140 :           IF (jspins.EQ.2) THEN
     115           0 :              f0(i_u,jspins) = f0(i_u,1)
     116           0 :              f2(i_u,jspins) = f2(i_u,1)
     117           0 :              f4(i_u,jspins) = f4(i_u,1)
     118           0 :              f6(i_u,jspins) = f6(i_u,1)
     119             :           ENDIF
     120             : 
     121             :        END DO ! atoms%n_u
     122             :        ! 
     123             :     ENDIF
     124             : 
     125          28 :   END SUBROUTINE uj2f
     126             : END MODULE m_uj2f

Generated by: LCOV version 1.13