LCOV - code coverage report
Current view: top level - wannier - wann_socmat_rs.f (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 100 0.0 %
Date: 2019-09-08 04:53:50 Functions: 0 1 0.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_wann_socmat_rs
       8             :       use m_juDFT
       9             :       contains 
      10           0 :       subroutine wann_socmat_rs(
      11           0 :      >          rvecnum,rvec,kpoints,
      12             :      >          jspins_in,nkpts,l_bzsym,film,l_onedimens,
      13             :      >          l_soc,band_min,band_max,neigd,
      14             :      >          l_socmmn0,wan90version)
      15             : c*************************************************
      16             : c     Calculate the matrix elements of SOC perturbation 
      17             : c     in real space from the
      18             : c     files WF1.chk (and WF1_um.dat) (produced
      19             : c     by wannier90) and WF1.hsomtx.
      20             : c     FF, April 2010
      21             : c*************************************************
      22             :       use m_constants, only:pimach
      23             :       use m_wann_read_umatrix
      24             : 
      25             :       implicit none
      26             :       integer, intent(in) :: rvecnum
      27             :       integer, intent(in) :: rvec(:,:)
      28             :       real,    intent(in) :: kpoints(:,:)
      29             : 
      30             :       integer, intent(in) :: jspins_in
      31             :       integer, intent(in) :: nkpts
      32             :       logical,intent (in) :: l_bzsym,l_soc
      33             :       logical,intent(in)  :: film
      34             :       integer,intent(in)  :: band_min(2),band_max(2),neigd
      35             :       logical, intent(in) :: l_socmmn0
      36             :       logical,intent(in)  :: l_onedimens
      37             :       integer, intent(in) :: wan90version
      38             : 
      39             : 
      40             :       integer             :: ikpt,jspins
      41             :       integer             :: kpts
      42             :       logical             :: l_file
      43             : c      real                :: kpoints(3,nkpts)
      44             :       integer             :: num_wann,num_kpts,num_nnmax,jspin
      45             :       integer             :: kspin,kkspin
      46             :       integer             :: wann_shift,num_wann2
      47             :       integer             :: i,j,k,m,info,r1,r2,r3,dummy1
      48             :       integer             :: dummy2,dummy3,dummy4,dummy5
      49             :       integer             :: hopmin,hopmax,counter,m1,m2
      50             :       integer             :: num_bands2
      51             :       integer,allocatable :: iwork(:)
      52             :       real,allocatable    :: energy(:,:),ei(:)
      53             :       real,allocatable    :: eigw(:,:),rwork(:)
      54             :       complex,allocatable :: work(:),vec(:,:)
      55           0 :       complex,allocatable :: u_matrix(:,:,:,:)
      56           0 :       complex,allocatable :: hwann(:,:,:,:,:)
      57           0 :       complex,allocatable :: hreal(:,:,:,:,:)
      58           0 :       complex,allocatable :: hsomtx(:,:,:,:,:)
      59           0 :       complex,allocatable :: hsomtx2(:,:,:,:,:)
      60             :       complex             :: fac,eulav,eulav1
      61             :       real                :: tmp_omi,rdotk,tpi,minenerg,maxenerg
      62             :       real, allocatable   :: minieni(:),maxieni(:)
      63             :       character           :: jobz,uplo
      64             :       integer             :: kpt,band,lee,lwork,lrwork,liwork,n,lda
      65             :       complex             :: value(4)
      66             :       logical             :: um_format
      67             :       logical             :: repro_eig
      68             :       logical             :: l_chk,l_proj
      69             :       logical             :: have_disentangled
      70           0 :       integer,allocatable :: ndimwin(:,:)
      71           0 :       logical,allocatable :: lwindow(:,:,:)
      72             :       integer             :: chk_unit,nkp,ntmp,ierr
      73             :       character(len=33)   :: header
      74             :       character(len=20)   :: checkpoint
      75             :       real                :: tmp_latt(3,3), tmp_kpt_latt(3,nkpts)
      76             :       real                :: omega_invariant
      77           0 :       complex,allocatable :: u_matrix_opt(:,:,:,:)
      78             :       integer             :: num_bands
      79             :       logical             :: l_umdat
      80             :       real,allocatable    :: eigval2(:,:)
      81             :       real,allocatable    :: eigval_opt(:,:)
      82             :       real                :: scale,a,b
      83             :       character(len=2)    :: spinspin12(0:2)
      84             :       character(len=3)    :: spin12(2)
      85             :       character(len=6)    :: filename
      86             :       integer             :: jp,mp,kk,ii,jj,rvecind
      87             :       complex,parameter   :: ci=(0.0,1.0)
      88             : 
      89             :       data spinspin12/'  ','.1' , '.2'/
      90             :       data spin12/'WF1','WF2'/
      91             : 
      92           0 :       tpi=2*pimach()
      93             : 
      94           0 :       jspins=jspins_in
      95           0 :       if(l_soc)jspins=1
      96             : 
      97           0 :       write(6,*)"nkpts=",nkpts
      98             : 
      99             : c*****************************************************
     100             : c     get num_bands and num_wann from the proj file
     101             : c*****************************************************
     102           0 :       do j=1,0,-1
     103           0 :           inquire(file=trim('proj'//spinspin12(j)),exist=l_file)
     104           0 :           if(l_file)then
     105           0 :             filename='proj'//spinspin12(j)
     106           0 :             exit
     107             :           endif
     108             :       enddo
     109           0 :       if(l_file)then
     110           0 :           open (203,file=trim(filename),status='old')
     111           0 :           rewind (203)
     112             :       else
     113             :          CALL juDFT_error("no proj/proj.1/proj.2",calledby
     114           0 :      +        ="wann_socmat_rs")
     115             :       endif
     116           0 :       read (203,*) num_wann,num_bands
     117           0 :       close (203)
     118           0 :       write(6,*)'According to proj there are ',num_bands,' bands'
     119           0 :       write(6,*)"and ",num_wann," wannier functions."
     120             : 
     121             : c****************************************************************
     122             : c        read in chk
     123             : c****************************************************************
     124           0 :       num_kpts=nkpts
     125           0 :       allocate( u_matrix_opt(num_bands,num_wann,nkpts,2) )
     126           0 :       allocate( u_matrix(num_wann,num_wann,nkpts,2) )
     127           0 :       allocate( lwindow(num_bands,nkpts,2) )
     128           0 :       allocate( ndimwin(nkpts,2) )
     129             : 
     130           0 :       do jspin=1,jspins  !spin loop
     131             :          call wann_read_umatrix2(
     132             :      >       nkpts,num_wann,num_bands,
     133             :      >       um_format,jspin,wan90version,
     134             :      <       have_disentangled,
     135             :      <       lwindow(:,:,jspin),
     136             :      <       ndimwin(:,jspin),
     137             :      <       u_matrix_opt(:,:,:,jspin),
     138           0 :      <       u_matrix(:,:,:,jspin))
     139           0 :          num_bands2=num_bands
     140             :       enddo !jspin   
     141           0 :       if(jspins.eq.1)then
     142           0 :          lwindow(:,:,2)        = lwindow(:,:,1)
     143           0 :          ndimwin(:,2)          = ndimwin(:,1)
     144           0 :          u_matrix_opt(:,:,:,2) = u_matrix_opt(:,:,:,1)
     145           0 :          u_matrix(:,:,:,2)     = u_matrix(:,:,:,1)
     146             :       endif
     147             : 
     148             : c****************************************************
     149             : c        Read the file "WF1.hsomtx".
     150             : c**************************************************** 
     151           0 :       allocate( hsomtx(2,2,num_bands2,num_bands2,nkpts) )
     152           0 :       open(304,file='WF1.hsomtx',form='formatted')
     153           0 :       do nkp=1,num_kpts
     154           0 :        do i=1,num_bands2
     155           0 :         do j=1,num_bands2
     156           0 :          do ii=1,2
     157           0 :           do jj=1,2
     158           0 :             read(304,*)dummy1,dummy2,dummy3,dummy4,dummy5,a,b
     159           0 :             hsomtx(jj,ii,j,i,nkp)=cmplx(a,-b)
     160             :           enddo !jj
     161             :          enddo !ii 
     162             :         enddo !j
     163             :        enddo !i
     164             :       enddo !nkp
     165           0 :       close(304)
     166             : 
     167             : c****************************************************************
     168             : c        Calculate matrix elements of SOC in the basis of
     169             : c        rotated Bloch functions.
     170             : c****************************************************************
     171           0 :       allocate( hsomtx2(2,2,num_wann,num_wann,nkpts) )
     172             :       write(6,*)"calculate matrix elements of SOC operator
     173           0 :      &between wannier orbitals"
     174             : 
     175           0 :       if(have_disentangled) then       
     176           0 :        hsomtx2=0.0  
     177           0 :        do nkp=1,num_kpts
     178           0 :         do j=1,num_wann
     179           0 :          do jp=1,num_wann  
     180           0 :           do ii=1,2
     181           0 :            do jj=1,2
     182           0 :             do m=1,ndimwin(nkp,ii)
     183           0 :              do mp=1,ndimwin(nkp,jj)  
     184             :               hsomtx2(jj,ii,jp,j,nkp)=hsomtx2(jj,ii,jp,j,nkp)+ 
     185             :      &            conjg(u_matrix_opt(mp,jp,nkp,jj))*
     186             :      &                  hsomtx(jj,ii,mp,m,nkp)*
     187           0 :      &                  u_matrix_opt(m,j,nkp,ii)
     188             :              enddo !mp   
     189             :             enddo !m
     190             :            enddo !jj  
     191             :           enddo !ii
     192             :          enddo !jp 
     193             :         enddo !j
     194             :        enddo !nkp
     195             :       else
     196           0 :        hsomtx2 = hsomtx
     197             :       end if !have_disentangled
     198             : 
     199           0 :       allocate(hwann(2,2,num_wann,num_wann,num_kpts))
     200           0 :       hwann(:,:,:,:,:)=cmplx(0.0,0.0)
     201             :       wann_shift=0
     202           0 :       do k=1,num_kpts
     203           0 :        do m=1,num_wann
     204           0 :         do mp=1,num_wann
     205           0 :          do ii=1,2
     206           0 :           do jj=1,2
     207           0 :            do i=1,num_wann
     208           0 :             do j=1,num_wann
     209             :              hwann(jj,ii,mp,m,k)=hwann(jj,ii,mp,m,k)+
     210             :      *        conjg(u_matrix(j,mp,k,jj))*
     211             :      *                hsomtx2(jj,ii,j,i,k)*
     212           0 :      *              u_matrix(i,m,k,ii)
     213             :             enddo !j
     214             :            enddo !i     
     215             :           enddo !jj 
     216             :          enddo !ii
     217             :         enddo !mp
     218             :        enddo !m
     219             :       enddo !k
     220             : 
     221             : c************************************************************
     222             : c        Calculate matrix elements in real space.
     223             : c***********************************************************      
     224           0 :       write(6,*)"calculate SOC-mat in rs"
     225             : 
     226           0 :       allocate(hreal(2,2,num_wann,num_wann,rvecnum))
     227           0 :       hreal=cmplx(0.0,0.0)
     228           0 :       do rvecind=1,rvecnum
     229           0 :        do k=1,nkpts  
     230             :         rdotk=tpi*(  kpoints(1,k)*rvec(1,rvecind)+
     231             :      +                  kpoints(2,k)*rvec(2,rvecind)+
     232           0 :      +                  kpoints(3,k)*rvec(3,rvecind)  )
     233           0 :         fac=cmplx(cos(rdotk),-sin(rdotk))
     234           0 :         do m2=1,num_wann
     235           0 :          do m1=1,num_wann
     236           0 :           do ii=1,2
     237           0 :            do jj=1,2
     238             :             hreal(jj,ii,m1,m2,rvecind)=hreal(jj,ii,m1,m2,rvecind)+
     239           0 :      &            fac*hwann(jj,ii,m1,m2,k)
     240             :            enddo 
     241             :           enddo 
     242             :          enddo 
     243             :         enddo 
     244             :        enddo !k
     245             :       enddo !rvecind
     246           0 :       hreal=hreal/cmplx(real(nkpts),0.0)
     247             : 
     248           0 :       open(321,file='rssocmat.1',form='formatted')
     249             : 
     250           0 :       do rvecind=1,rvecnum
     251           0 :          r3=rvec(3,rvecind)
     252           0 :          r2=rvec(2,rvecind)
     253           0 :          r1=rvec(1,rvecind)
     254           0 :          do i=1,num_wann
     255           0 :            do j=1,num_wann
     256           0 :             do ii=1,2
     257           0 :              do jj=1,2  
     258             :               write(321,'(i3,1x,i3,1x,i3,1x,i3,1x,i3,1x,
     259             :      &                      i3,1x,i3,1x,f20.8,1x,f20.8)')
     260           0 :      &                r1,r2,r3,i,j,jj,ii,hreal(jj,ii,i,j,rvecind) 
     261             :              enddo
     262             :             enddo !kk  
     263             :            enddo !j
     264             :          enddo !i
     265             :       enddo !rvecind    
     266             : 
     267           0 :       close(321)
     268             : 
     269           0 :       deallocate(lwindow,u_matrix_opt,ndimwin)
     270           0 :       deallocate(u_matrix,hwann,hreal)
     271             : 
     272           0 :       end subroutine wann_socmat_rs
     273             :       end module m_wann_socmat_rs

Generated by: LCOV version 1.13