quantum-espresso/GWW/pw4gww/write_wannier_matrix_c.f90

78 lines
1.8 KiB
Fortran

! FOR GWW
!
! Author: P. Umari
!
subroutine write_wannier_matrix_c
!this subroutine writes the inverse transfromation matrix from KS eigenstates
!to ML wanniers on file, to be read by GWW code
!the INVERSE matrix is calculated here
! #ifdef __GWW
USE kinds, ONLY : DP
USE wannier_gw, ONLY : u_trans, num_nbndv, lnonorthogonal, num_nbndc_set, nbnd_normal
USE wvfct, ONLY : nbnd,et
USE io_global, ONLY : stdout
USE io_files, ONLY : find_free_unit, prefix
implicit none
COMPLEX(kind=DP) :: sca
INTEGER :: iunu, iw,jw
INTEGER :: ivpt(num_nbndc_set), info
COMPLEX(kind=DP) :: cdet(2),det
COMPLEX(kind=DP), ALLOCATABLE :: cdwork(:)
COMPLEX(kind=DP), ALLOCATABLE :: u_trans_c(:,:)
allocate(u_trans_c(num_nbndc_set,num_nbndc_set))
do iw=1,num_nbndc_set
do jw=1,num_nbndc_set
u_trans_c(iw,jw)=u_trans(iw+num_nbndv,jw+num_nbndv)
enddo
enddo
if(.not.lnonorthogonal) then
do iw=1,num_nbndc_set
do jw=iw,num_nbndc_set
sca=u_trans_c(iw,jw)
u_trans_c(iw,jw)=conjg(u_trans_c(jw,iw))
u_trans_c(jw,iw)=conjg(sca)
enddo
enddo
else
allocate(cdwork(num_nbndc_set))
CALL zgefa(u_trans_c,num_nbndc_set,num_nbndc_set,ivpt,info)
CALL errore('write_wannier_matrix','error in zgefa',abs(info))
CALL zgedi(u_trans_c,num_nbndc_set,num_nbndc_set,ivpt,cdet,cdwork,11)
det=cdet(1)*10.d0**cdet(2)
write(stdout,*) 'DETERMINANT OF A MATRIX:', det
deallocate(cdwork)
endif
iunu = find_free_unit()
open(unit=iunu,file=trim(prefix)//'.wannier_prim',status='unknown',form='unformatted')
write(iunu) num_nbndc_set
write(iunu) num_nbndv
write(iunu) nbnd_normal
do iw=1,num_nbndc_set
write(iunu) u_trans_c(1:num_nbndc_set,iw)
enddo
close(iunu)
deallocate(u_trans_c)
! #endif
return
end subroutine write_wannier_matrix_c