LCOV - code coverage report
Current view: top level - eigen - hsmt_spinor.F90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 38 38 100.0 %
Date: 2024-04-16 04:21:52 Functions: 2 2 100.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_hsmt_spinor
       8             :    !!Module for the calculation of transformation matrices between 
       9             :    !!Spin-dependent matrices in the local frame and the global frame
      10             :    IMPLICIT NONE
      11             : CONTAINS
      12             : 
      13             : 
      14        2594 :   SUBROUTINE hsmt_spinor(iSpinNum, n, nococonv, chi_mat)
      15             :    !! Obtain the part of the transformation that maps the local spin
      16             :    !! iSpinNum to the global spin frame. 
      17             :       USE m_types
      18             :       USE m_constants
      19             : 
      20             :       TYPE(t_nococonv), INTENT(IN)  :: nococonv
      21             :       INTEGER,          INTENT(IN)  :: iSpinNum     !! local spin
      22             :       INTEGER,          INTENT(IN)  :: n            !! atom number
      23             :       COMPLEX,          INTENT(OUT) :: chi_mat(2,2) !! Matrix describing the mapping
      24             : 
      25             :       INTEGER           :: iSpinPr, iSpin
      26             :       COMPLEX           :: umat(2,2)
      27             : 
      28             :       !--->       set up the spinors of this atom within global
      29             :       !--->       spin-coordinateframe
      30        2594 :       umat = nococonv%umat(n) 
      31             :       !--->       and determine the prefactors for the Hamitonian- and
      32             :       !--->       overlapp-matrix elements
      33        2594 :       IF (iSpinNum<3) THEN
      34             :          iSpinPr = iSpinNum
      35             :          iSpin   = iSpinNum
      36         444 :       ELSE IF(iSpinNum==4) THEN
      37             :          iSpinPr = 2
      38             :          iSpin   = 1
      39             :       ELSE
      40         222 :          iSpinPr = 1
      41         222 :          iSpin   = 2
      42             :       ENDIF
      43             : 
      44        2594 :       chi_mat(1, 1) = umat(1,iSpinPr)*CONJG(umat(1,iSpin))
      45        2594 :       chi_mat(1, 2) = umat(1,iSpinPr)*CONJG(umat(2,iSpin))
      46        2594 :       chi_mat(2, 1) = umat(2,iSpinPr)*CONJG(umat(1,iSpin))
      47        2594 :       chi_mat(2, 2) = umat(2,iSpinPr)*CONJG(umat(2,iSpin))
      48             : 
      49        2594 :    END SUBROUTINE hsmt_spinor
      50             : 
      51       69951 :   SUBROUTINE hsmt_spinor_soc(n,ki,nococonv,lapw,chi_so,angso,kj_start,kj_end)
      52             :     !!Generalization of hsmt_spinor to SOC case. 
      53             :     USE m_types
      54             :     use m_constants
      55             : 
      56             :     TYPE(t_nococonv),INTENT(IN)  :: nococonv
      57             :     TYPE(t_lapw),INTENT(IN)      :: lapw
      58             :     INTEGER,INTENT(IN)           :: n   !!index of atom
      59             :     INTEGER,INTENT(IN)           :: ki  !! index of first k+G in angso
      60             :     COMPLEX,INTENT(out)          :: chi_so(:,:,:,:) !! Transformation from local to global spin
      61             :     COMPLEX,INTENT(out),OPTIONAL :: angso(:,:,:)    !! $$\vec\sigma(\vec{k_{ki}}\times\vec{k)$$
      62             :     INTEGER,INTENT(in), OPTIONAL :: kj_start,kj_end !! indices for the second k+G in angso
      63             : 
      64             :     REAL     :: cross_k(3)
      65             :     INTEGER  :: j1,j2,kj
      66             :     COMPLEX  :: isigma(2,2,3)
      67             :     COMPLEX  :: chi(2,2)
      68             :     COMPLEX  :: isigma_x(2,2),isigma_y(2,2),isigma_z(2,2),d(2,2)
      69             : 
      70             :     !     isigma= i * sigma, where sigma is Pauli matrix
      71       69951 :     isigma = CMPLX(0.0,0.0)
      72             : 
      73       69951 :     isigma(1,2,1)=CMPLX(0.0,1.0)  !     (0  1)   ( 0  i)
      74       69951 :     isigma(2,1,1)=CMPLX(0.0,1.0)  ! i * (1  0) = ( i  0)
      75       69951 :     isigma(1,2,2)=CMPLX(1.0,0.0)  !     (0 -i)   ( 0  1) 
      76       69951 :     isigma(2,1,2)=CMPLX(-1.0,0.0) ! i * (i  0) = (-1  0) 
      77       69951 :     isigma(1,1,3)=CMPLX(0.0,1.0)  !     (1  0)   ( i  0)
      78       69951 :     isigma(2,2,3)=CMPLX(0.0,-1.0) ! i * (0 -1) = ( 0 -i)
      79             : 
      80             :     !--->       set up the spinors of this atom within global
      81             :     !--->       spin-coordinateframe
      82             :     !chi=conjg(nococonv%umat(n))
      83             : 
      84       69951 :     chi=nococonv%umat(n)
      85             :     
      86             :    
      87     2028579 :     isigma_x=MATMUL(conjg(transpose(chi)), MATMUL(isigma(:,:,1),chi))
      88     2028579 :     isigma_y=MATMUL(conjg(transpose(chi)), MATMUL(isigma(:,:,2),chi))
      89     2028579 :     isigma_z=MATMUL(conjg(transpose(chi)), MATMUL(isigma(:,:,3),chi))
      90             :     !isigma_x=MATMUL(chi, MATMUL(isigma(:,:,1),conjg(transpose(chi))))
      91             :     !isigma_y=MATMUL(chi, MATMUL(isigma(:,:,2),conjg(transpose(chi))))
      92             :     !isigma_z=MATMUL(chi, MATMUL(isigma(:,:,3),conjg(transpose(chi))))
      93             :     
      94             :     
      95             :     
      96             :     
      97             :     !chi=conjg(nococonv%umat(n))
      98      209853 :     DO j1=1,2
      99      489657 :        DO j2=1,2
     100      279804 :           chi_so(1,1,j1,j2)=chi(1,j1)*CONJG(chi(1,j2))
     101      279804 :           chi_so(2,1,j1,j2)=chi(2,j1)*CONJG(chi(1,j2))
     102      279804 :           chi_so(2,2,j1,j2)=chi(2,j1)*CONJG(chi(2,j2))
     103      419706 :           chi_so(1,2,j1,j2)=chi(1,j1)*CONJG(chi(2,j2))
     104             :        ENDDO
     105             :     ENDDO
     106       69951 :     IF (.not.present(angso)) RETURN !only chis are needed
     107             :     !In the first variation SOC case the off-diagonal spinors are needed
     108             :     IF (present(angso)) THEN
     109       69951 :       IF ((.not.present(kj_start)).or.((.not.present(kj_end)))) RETURN
     110             :     ENDIF
     111     6347468 :     DO kj = kj_start,kj_end
     112     6277517 :        cross_k(1)=lapw%gk(2,ki,1)*lapw%gk(3,kj,1)- lapw%gk(3,ki,1)*lapw%gk(2,kj,1)
     113     6277517 :        cross_k(2)=lapw%gk(3,ki,1)*lapw%gk(1,kj,1)- lapw%gk(1,ki,1)*lapw%gk(3,kj,1)
     114     6277517 :        cross_k(3)=lapw%gk(1,ki,1)*lapw%gk(2,kj,1)- lapw%gk(2,ki,1)*lapw%gk(1,kj,1)
     115    18902502 :        DO j1=1,2
     116    43942619 :           DO j2=1,2
     117             :              angso(kj-kj_start+1,j1,j2)= (isigma_x(j1,j2)*cross_k(1)+&
     118    37665102 :                      isigma_y(j1,j2)*cross_k(2)+ isigma_z(j1,j2)*cross_k(3))
     119             :           ENDDO
     120             :        ENDDO
     121             :     ENDDO
     122             : 
     123             :   END SUBROUTINE hsmt_spinor_soc
     124             : 
     125             : 
     126             : END MODULE m_hsmt_spinor

Generated by: LCOV version 1.14