subroutine w90_project_overlap(common_data, istdout, istderr, ierr)
use w90_error_base, only: w90_error_type
use w90_error, only: set_error_fatal
use w90_overlap, only: overlap_project, overlap_project_gamma
use w90_overlap, only: overlap_write
implicit none
! arguments
integer, intent(in) :: istdout, istderr
integer, intent(out) :: ierr
type(lib_common_type), intent(inout) :: common_data
! local variables
type(w90_error_type), allocatable :: error
integer :: ik, iw
ierr = 0
if (.not. associated(common_data%m_matrix_local)) then
call set_error_fatal(error, 'm_matrix_local not set for w90_project_overlap call', common_data%comm)
call prterr(error, ierr, istdout, istderr, common_data%comm)
return
else if (.not. associated(common_data%u_matrix_opt)) then
call set_error_fatal(error, 'u_matrix_opt not set for w90_project_overlap call', common_data%comm)
call prterr(error, ierr, istdout, istderr, common_data%comm)
return
else if (.not. associated(common_data%u_matrix)) then
call set_error_fatal(error, 'u_matrixt not set for w90_project_overlap call', common_data%comm)
call prterr(error, ierr, istdout, istderr, common_data%comm)
return
end if
if (common_data%output_file%write_win_ammats .and. .not. common_data%have_disentangled) then
! for writing input m,a matrices
call overlap_write(common_data%kmesh_info, common_data%u_matrix_opt, common_data%m_matrix_local, &
common_data%eigval, common_data%num_bands, common_data%num_kpts, &
common_data%num_proj, common_data%dist_kpoints, common_data%seedname, error, &
common_data%comm)
end if
if (.not. common_data%have_disentangled) then
if (common_data%num_wann /= common_data%num_bands) then
call set_error_fatal(error, 'Error: w90_project_overlap(): num_bands /= num_wann but disentanglement() was not called', &
common_data%comm)
call prterr(error, ierr, istdout, istderr, common_data%comm)
return
end if
! fixme, document!
common_data%u_matrix(:, :, :) = common_data%u_matrix_opt(:, :, :) ! u_matrix_opt contains initial projections
common_data%u_matrix_opt(:, :, :) = 0.d0
do ik = 1, common_data%num_kpts
do iw = 1, common_data%num_wann
common_data%u_matrix_opt(iw, iw, ik) = 1.d0
end do
end do
if (common_data%gamma_only) then
call overlap_project_gamma(common_data%m_matrix_local, common_data%u_matrix, &
common_data%kmesh_info%nntot, common_data%num_wann, &
common_data%print_output%timing_level, istdout, &
common_data%timer, error, common_data%comm)
else
call overlap_project(common_data%sitesym, common_data%m_matrix_local, common_data%u_matrix, &
common_data%kmesh_info%nnlist, common_data%kmesh_info%nntot, &
common_data%num_wann, common_data%num_kpts, common_data%num_wann, &
common_data%print_output%timing_level, common_data%lsitesymmetry, &
istdout, common_data%timer, common_data%dist_kpoints, error, &
common_data%comm)
end if
if (allocated(error)) then
call prterr(error, ierr, istdout, istderr, common_data%comm)
return
end if
end if
end subroutine w90_project_overlap