perform disentanglement; assumes library data object is already setup after w90_input_setopt() call no effect if number of bands == number of WF
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(lib_common_type), | intent(inout) | :: | common_data | |||
| integer, | intent(in) | :: | istdout | |||
| integer, | intent(in) | :: | istderr | |||
| integer, | intent(out) | :: | ierr |
subroutine w90_disentangle(common_data, istdout, istderr, ierr) !! perform disentanglement; assumes library data object is already setup after w90_input_setopt() call !! no effect if number of bands == number of WF use w90_disentangle_mod, only: dis_main, setup_m_loc use w90_error_base, only: w90_error_type use w90_error, only: set_error_fatal use w90_overlap, only: overlap_write implicit none ! arguments type(lib_common_type), intent(inout) :: common_data integer, intent(in) :: istdout, istderr integer, intent(out) :: ierr ! local variables type(w90_error_type), allocatable :: error ierr = 0 ! m_matrix_orig_local (nband*nwann for disentangle) if (.not. associated(common_data%m_matrix_local)) then ! (nband*nwann*nknode for wannierise) call set_error_fatal(error, 'Error: m_matrix_local not associated for w90_disentangle() 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, 'Error: u_matrix not associated for w90_disentangle() 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, 'Error: u_matrix_opt not associated for w90_disentangle() call', common_data%comm) call prterr(error, ierr, istdout, istderr, common_data%comm) return else if (.not. associated(common_data%eigval)) then call set_error_fatal(error, 'Error: eigval not associated for w90_disentangle() call', common_data%comm) call prterr(error, ierr, istdout, istderr, common_data%comm) return end if ! if not already initialised, set disentanglement window to limits of spectrum if (common_data%dis_manifold%win_min == -huge(0.0_dp)) common_data%dis_manifold%win_min = minval(common_data%eigval) if (common_data%dis_manifold%win_max == huge(0.0_dp)) common_data%dis_manifold%win_max = maxval(common_data%eigval) if (common_data%dis_manifold%frozen_states) then if (common_data%dis_manifold%froz_min == -huge(0.0_dp)) then common_data%dis_manifold%froz_min = minval(common_data%eigval(:, :)) end if end if if (common_data%output_file%write_win_ammats) 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) if (allocated(error)) then call prterr(error, ierr, istdout, istderr, common_data%comm) return end if end if ! condition for disentanglement is number of bands > number of WF if (common_data%num_bands > common_data%num_wann) then call dis_main(common_data%dis_control, common_data%dis_spheres, common_data%dis_manifold, & common_data%kmesh_info, common_data%kpt_latt, common_data%sitesym, & common_data%print_output, common_data%m_matrix_local, common_data%u_matrix, & common_data%u_matrix_opt, common_data%eigval, common_data%real_lattice, & common_data%omega%invariant, common_data%num_bands, common_data%num_kpts, & common_data%num_wann, common_data%gamma_only, common_data%lsitesymmetry, & istdout, common_data%timer, common_data%dist_kpoints, error, common_data%comm) if (allocated(error)) then call prterr(error, ierr, istdout, istderr, common_data%comm) return end if call setup_m_loc(common_data%kmesh_info, common_data%print_output, common_data%m_matrix_local, & common_data%m_matrix_local, common_data%u_matrix, common_data%num_bands, & common_data%num_kpts, common_data%num_wann, common_data%timer, & common_data%dist_kpoints, error, common_data%comm) if (allocated(error)) then call prterr(error, ierr, istdout, istderr, common_data%comm) return end if common_data%have_disentangled = .true. end if end subroutine w90_disentangle