LCOV - code coverage report
Current view: top level - wannier - wann_rw_eig.F (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 64 0.0 %
Date: 2019-09-08 04:53:50 Functions: 0 2 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_rw_eig
       8             :       use m_juDFT
       9             : #ifdef CPP_MPI
      10             : #define CPP_HYBEIG
      11             : #endif
      12             : c****************************************************************
      13             : c    write WF1.eig and determine maximum of number of bands
      14             : c      Frank Freimuth, October 2006
      15             : c****************************************************************
      16             :       CONTAINS
      17           0 :       SUBROUTINE wann_write_eig(
      18             :      >              eig_id,l_real,
      19             :      >              lmaxd,ntypd,nlod,neigd,nvd,jspd,
      20             :      >              isize,jspin,nbasfcn,nlotot,
      21             :      >              l_ss,l_noco,nrec,fullnkpts,
      22             :      >              l_bzsym,l_byindex,l_bynumber,l_byenergy,
      23           0 :      >              irreduc,odi,band_min,band_max,numbands,
      24             :      >              e1s,e2s,ef,l_paulimag,nkpt,    
      25           0 :      <              nbnd,kpoints,l_gwf,iqpt)
      26             : 
      27             :       use m_cdnread, only:cdn_read
      28             :       use m_types
      29             : 
      30             :       IMPLICIT NONE
      31             :       integer,intent(in) :: eig_id
      32             :       integer,intent(in) :: lmaxd,ntypd,nlod,neigd,nvd,jspd
      33             :       integer,intent(in) :: isize,jspin,nbasfcn,nlotot
      34             :       logical,intent(in) :: l_ss,l_noco,l_real
      35             :       integer,intent(in) :: nrec,fullnkpts
      36             : 
      37             :       logical,intent(in) :: l_byindex,l_bynumber,l_byenergy
      38             :       integer,intent(in) :: irreduc(fullnkpts)
      39             :       type (od_inp),intent(in) :: odi
      40             :       integer,intent(in) :: band_min,band_max,numbands
      41             :       logical,intent(in) :: l_bzsym
      42             :       real,intent(in)    :: e1s,e2s,ef
      43             :       logical,intent(in) :: l_paulimag
      44             :       integer,intent(in) :: nkpt
      45             : 
      46             :       integer,intent(out):: nbnd
      47             :       real,intent(out)   :: kpoints(fullnkpts)
      48             : 
      49             :       logical          :: l_eig
      50             :       character(len=3) :: spin12(2)
      51             :       data spin12/'WF1' , 'WF2'/
      52             :       integer          :: ikpt,kptibz
      53             :       integer          :: nmat,nbands,nv(jspd)
      54           0 :       real             :: wk, bkpt(3),eig(neigd),cp_time(9)
      55             :       integer          :: k1(nvd,jspd),k2(nvd,jspd),k3(nvd,jspd)
      56             :       integer          :: nkbnd,i
      57             :       REAL             :: ello(nlod,ntypd,jspd),evdu(2,jspd)
      58             :       REAL             :: epar(0:lmaxd,ntypd,jspd)
      59             :       integer          :: n_start,n_end,co
      60             :       integer          :: bnd1,bnd2,kpt
      61           0 :       complex, allocatable :: paulimat(:,:,:,:) 
      62             :       real             :: sum1,sum2,sum3
      63             :       integer          :: num_bands,err
      64             :       
      65             : ! BEGIN QPOINTS
      66             :       LOGICAL, INTENT(IN) :: l_gwf
      67             :       INTEGER, INTENT(IN) :: iqpt
      68             :       CHARACTER(len=12) :: fname
      69             : ! END QPOINTS
      70             :       real,parameter   :: hartree=27.21138505
      71             : 
      72           0 :       TYPE(t_mat) :: zMat !z(nbasfcn,noccbd) !can be real/complex
      73             : 
      74           0 :       zMat%l_real = l_real
      75           0 :       zMat%matsize1 = nbasfcn
      76           0 :       zMat%matsize2 = neigd
      77           0 :       IF(l_real) THEN
      78           0 :          ALLOCATE (zMat%data_r(zMat%matsize1,zMat%matsize2))
      79             :       ELSE
      80           0 :          ALLOCATE (zMat%data_c(zMat%matsize1,zMat%matsize2))
      81             :       END IF
      82             : 
      83             : !      WRITE(*,*)'min',band_min,'max',band_max,'num',numbands
      84             : !      WRITE(*,*)'wann_rw_eig: neigd',neigd
      85           0 :       n_start=1
      86           0 :       n_end=neigd
      87           0 :       IF (l_gwf) THEN
      88           0 :          WRITE(fname,'("_",i4.4,".eig")')iqpt
      89           0 :          fname=spin12(jspin)//trim(fname)
      90             :       ELSE
      91           0 :          fname=spin12(jspin)//'.eig'
      92             :       ENDIF
      93             : 
      94             : !      WRITE(*,*)'wann_rw_eig.F: writing eig file ',fname
      95             : 
      96           0 :       inquire (file=fname,exist=l_eig)
      97           0 :       if (l_eig) then
      98             :          open (306,file=fname,
      99           0 :      &                               form='formatted',status='old')
     100           0 :          rewind (306)
     101             :       else
     102             :          open (306,file=fname,
     103           0 :      &                               form='formatted',status='new')
     104             :       endif!l_eig
     105             : 
     106             :       if(l_paulimag.and..false.)then
     107             :         num_bands=band_max-band_min+1
     108             :         allocate( paulimat(num_bands,num_bands,3,nkpt),stat=err )
     109             :         IF (err/=0)  CALL juDFT_error
     110             :      +       ("error allocating paulimat",calledby
     111             :      +       ="wann_rw_eig")
     112             :         open(655,file='wpmat')
     113             :         do ikpt=1,nkpt
     114             :           read(655,*)
     115             :           do co=1,3
     116             :             read(655,*)
     117             :             do bnd2=1,num_bands
     118             :                do bnd1=1,num_bands
     119             :                   read(655,*)paulimat(bnd1,bnd2,co,ikpt)
     120             :                enddo
     121             :             enddo
     122             :           enddo
     123             :         enddo      
     124             :         close(655)
     125             :       endif
     126           0 :       sum1=0.0
     127           0 :       sum2=0.0
     128           0 :       sum3=0.0
     129             : 
     130           0 :       nbnd=0
     131           0 :       do ikpt = 1,fullnkpts
     132             : 
     133           0 :         kptibz=ikpt 
     134           0 :         if(l_bzsym) kptibz=irreduc(ikpt)
     135             :             call wann_read_eig(
     136             :      >              eig_id,     
     137             :      >              lmaxd,ntypd,nlod,neigd,nvd,jspd,
     138             :      >              0,isize,kptibz,jspin,nbasfcn,nlotot,
     139             :      >              l_ss,l_noco,nrec,
     140             :      <              nmat,nbands,eig,zMat,
     141           0 :      >              l_gwf,iqpt)
     142             : 
     143             : 
     144           0 :         nkbnd = 0
     145             : !        WRITE(*,*)'wann_rw_eig: nbands',nbands
     146           0 :         do i = 1,nbands
     147             :          if((eig(i).ge.e1s .and. nkbnd.lt.numbands.and.l_bynumber).or.
     148           0 :      &      (eig(i).ge.e1s.and.eig(i).le.e2s.and.l_byenergy ).or.
     149           0 :      &      (i.ge.band_min.and.i.le.band_max.and.l_byindex))  then
     150           0 :            nkbnd = nkbnd + 1
     151           0 :            if(l_bynumber.or.l_byindex)then
     152           0 :               write (306,'(2i12,f19.13)') nkbnd,ikpt,(eig(i)-ef)*
     153           0 :      &                                    hartree
     154             :            endif
     155             :            if(l_paulimag.and..false.)then
     156             :               if(eig(i).le.ef)then
     157             :                  sum1=sum1+paulimat(nkbnd,nkbnd,1,kptibz)
     158             :                  sum2=sum2+paulimat(nkbnd,nkbnd,2,kptibz)
     159             :                  sum3=sum3+paulimat(nkbnd,nkbnd,3,kptibz)
     160             :               endif
     161             :            endif   
     162             :          endif 
     163             :         enddo
     164             : !        WRITE(*,*)'wann_rw_eig: nkbnd',nkbnd,'nbnd',nbnd 
     165           0 :         if (nkbnd.ge.nbnd) nbnd = nkbnd
     166             : 
     167           0 :         if (odi%d1) kpoints(ikpt) = bkpt(3)
     168             : 
     169             :       enddo !ikpt
     170             : 
     171           0 :       if(l_paulimag)then
     172           0 :         write(6,*)"sum1=",sum1/fullnkpts
     173           0 :         write(6,*)"sum2=",sum2/fullnkpts
     174           0 :         write(6,*)"sum3=",sum3/fullnkpts
     175             :       endif  
     176             : 
     177             : 
     178           0 :       if(l_byenergy)then   !now we know the maximum of bands
     179           0 :          do ikpt=1,fullnkpts
     180           0 :             kptibz=ikpt
     181           0 :             if(l_bzsym)kptibz=irreduc(ikpt)
     182             :             call wann_read_eig(     
     183             :      >              eig_id,       
     184             :      >              lmaxd,ntypd,nlod,neigd,nvd,jspd,
     185             :      >              0,isize,kptibz,jspin,nbasfcn,nlotot,
     186             :      >              l_ss,l_noco,nrec,
     187             :      <              nmat,nbands,eig,zMat,
     188           0 :      >              l_gwf,iqpt)
     189             : 
     190             : 
     191           0 :               nkbnd = 0
     192           0 :               do i = 1,nbands
     193           0 :                 if(eig(i).ge.e1s .and. nkbnd.lt.nbnd)then
     194           0 :                      nkbnd = nkbnd + 1
     195           0 :                   write (306,'(2i12,f19.13)')nkbnd,ikpt,(eig(i)-ef)*
     196           0 :      &                                       hartree
     197             :                 endif
     198             :               enddo 
     199             :          enddo   
     200             :       endif
     201           0 :       close (306)
     202           0 :       end subroutine wann_write_eig
     203             :  
     204             : c*****************************************************************
     205             : c     read in eig file
     206             : c*****************************************************************
     207           0 :       subroutine wann_read_eig(     
     208             :      >              eig_id,
     209             :      >              lmaxd,ntypd,nlod,neigd,nvd,jspd,
     210             :      >              irank,isize,kptibz,jspin,nbasfcn,nlotot,
     211             :      >              l_ss,l_noco,nrec,
     212           0 :      <              nmat,nbands,eig,zMat,
     213             :      >              l_gwf,iqpt)
     214             :       USE m_judft
     215             :       USE m_types
     216             :       use m_cdnread, only:cdn_read
     217             :       implicit none
     218             :       integer, intent (in) :: eig_id
     219             :       INTEGER, INTENT (IN) :: irank,isize,kptibz,nbasfcn,neigd,nlotot
     220             :       INTEGER, INTENT (IN) :: nrec,nvd,jspd,jspin
     221             :       INTEGER, INTENT (IN) :: lmaxd,ntypd,nlod,iqpt
     222             :       LOGICAL, INTENT (IN) :: l_ss,l_noco,l_gwf
     223             : 
     224             :       INTEGER, INTENT (OUT) :: nbands,nmat
     225             :   
     226             :       REAL,    INTENT (OUT) :: eig(neigd)
     227             : 
     228             :       TYPE(t_mat), INTENT (INOUT) :: zMat !z(nbasfcn,noccbd) !can be real/complex
     229             : 
     230             :       integer :: n_start,n_end
     231             : 
     232           0 :       n_start=1
     233           0 :       n_end=neigd
     234             : 
     235             :       CALL cdn_read(
     236             :      >              eig_id,
     237             :      >              nvd,jspd,irank,isize,kptibz,jspin,nbasfcn,
     238             :      >              l_ss,l_noco,neigd,n_start,n_end,
     239           0 :      <              nbands,eig,zMat)
     240             : !      CALL judft_error("BUG: wann_read in wann_rw_eig not implemented")
     241           0 :       END SUBROUTINE wann_read_eig  
     242             :       END MODULE m_wann_rw_eig

Generated by: LCOV version 1.13