w90_disentangle Subroutine

public subroutine w90_disentangle(common_data, istdout, istderr, ierr)

Uses

  • proc~~w90_disentangle~2~~UsesGraph proc~w90_disentangle~2 w90_disentangle module~w90_disentangle_mod w90_disentangle_mod proc~w90_disentangle~2->module~w90_disentangle_mod module~w90_error w90_error proc~w90_disentangle~2->module~w90_error module~w90_error_base w90_error_base proc~w90_disentangle~2->module~w90_error_base module~w90_overlap w90_overlap proc~w90_disentangle~2->module~w90_overlap module~w90_constants w90_constants module~w90_disentangle_mod->module~w90_constants module~w90_error->module~w90_error_base module~w90_comms w90_comms module~w90_error->module~w90_comms module~w90_overlap->module~w90_comms module~w90_overlap->module~w90_constants module~w90_comms->module~w90_error_base module~w90_comms->module~w90_constants

perform disentanglement; assumes library data object is already setup after w90_input_setopt() call no effect if number of bands == number of WF

Arguments

Type IntentOptional Attributes Name
type(lib_common_type), intent(inout) :: common_data
integer, intent(in) :: istdout
integer, intent(in) :: istderr
integer, intent(out) :: ierr

Calls

proc~~w90_disentangle~2~~CallsGraph proc~w90_disentangle~2 w90_disentangle proc~dis_main dis_main proc~w90_disentangle~2->proc~dis_main proc~overlap_write overlap_write proc~w90_disentangle~2->proc~overlap_write proc~prterr prterr proc~w90_disentangle~2->proc~prterr proc~set_error_fatal set_error_fatal proc~w90_disentangle~2->proc~set_error_fatal proc~setup_m_loc setup_m_loc proc~w90_disentangle~2->proc~setup_m_loc proc~dis_main->proc~set_error_fatal proc~dis_extract dis_extract proc~dis_main->proc~dis_extract proc~dis_extract_gamma dis_extract_gamma proc~dis_main->proc~dis_extract_gamma proc~dis_proj_froz dis_proj_froz proc~dis_main->proc~dis_proj_froz proc~dis_project dis_project proc~dis_main->proc~dis_project proc~dis_windows dis_windows proc~dis_main->proc~dis_windows proc~dis_windows_proj dis_windows_proj proc~dis_main->proc~dis_windows_proj proc~internal_check_orthonorm internal_check_orthonorm proc~dis_main->proc~internal_check_orthonorm proc~internal_find_u internal_find_u proc~dis_main->proc~internal_find_u proc~internal_find_u_gamma internal_find_u_gamma proc~dis_main->proc~internal_find_u_gamma proc~internal_slim_m internal_slim_m proc~dis_main->proc~internal_slim_m proc~io_stopwatch_start io_stopwatch_start proc~dis_main->proc~io_stopwatch_start proc~io_stopwatch_stop io_stopwatch_stop proc~dis_main->proc~io_stopwatch_stop proc~mpirank mpirank proc~dis_main->proc~mpirank proc~set_error_alloc set_error_alloc proc~dis_main->proc~set_error_alloc proc~set_error_dealloc set_error_dealloc proc~dis_main->proc~set_error_dealloc proc~sitesym_replace_d_matrix_band sitesym_replace_d_matrix_band proc~dis_main->proc~sitesym_replace_d_matrix_band proc~sitesym_symmetrize_u_matrix sitesym_symmetrize_u_matrix proc~dis_main->proc~sitesym_symmetrize_u_matrix proc~utility_recip_lattice_base utility_recip_lattice_base proc~dis_main->proc~utility_recip_lattice_base zgemm zgemm proc~dis_main->zgemm interface~comms_allreduce comms_allreduce proc~overlap_write->interface~comms_allreduce proc~overlap_write->proc~mpirank proc~overlap_write->proc~set_error_alloc proc~overlap_write->proc~set_error_dealloc proc~set_error_file set_error_file proc~overlap_write->proc~set_error_file interface~comms_no_sync_bcast comms_no_sync_bcast proc~prterr->interface~comms_no_sync_bcast interface~comms_no_sync_recv comms_no_sync_recv proc~prterr->interface~comms_no_sync_recv interface~comms_no_sync_send comms_no_sync_send proc~prterr->interface~comms_no_sync_send proc~prterr->proc~mpirank proc~mpisize mpisize proc~prterr->proc~mpisize proc~comms_sync_error comms_sync_error proc~set_error_fatal->proc~comms_sync_error proc~set_base_error set_base_error proc~set_error_fatal->proc~set_base_error proc~setup_m_loc->proc~io_stopwatch_start proc~setup_m_loc->proc~io_stopwatch_stop proc~setup_m_loc->proc~mpirank proc~setup_m_loc->proc~set_error_alloc proc~setup_m_loc->proc~set_error_dealloc proc~setup_m_loc->zgemm proc~comms_allreduce_cmplx comms_allreduce_cmplx interface~comms_allreduce->proc~comms_allreduce_cmplx proc~comms_allreduce_real comms_allreduce_real interface~comms_allreduce->proc~comms_allreduce_real proc~comms_no_sync_bcast_char comms_no_sync_bcast_char interface~comms_no_sync_bcast->proc~comms_no_sync_bcast_char proc~comms_no_sync_bcast_cmplx comms_no_sync_bcast_cmplx interface~comms_no_sync_bcast->proc~comms_no_sync_bcast_cmplx proc~comms_no_sync_bcast_int comms_no_sync_bcast_int interface~comms_no_sync_bcast->proc~comms_no_sync_bcast_int proc~comms_no_sync_bcast_logical comms_no_sync_bcast_logical interface~comms_no_sync_bcast->proc~comms_no_sync_bcast_logical proc~comms_no_sync_bcast_real comms_no_sync_bcast_real interface~comms_no_sync_bcast->proc~comms_no_sync_bcast_real proc~comms_no_sync_recv_char comms_no_sync_recv_char interface~comms_no_sync_recv->proc~comms_no_sync_recv_char proc~comms_no_sync_recv_cmplx comms_no_sync_recv_cmplx interface~comms_no_sync_recv->proc~comms_no_sync_recv_cmplx proc~comms_no_sync_recv_int comms_no_sync_recv_int interface~comms_no_sync_recv->proc~comms_no_sync_recv_int proc~comms_no_sync_recv_logical comms_no_sync_recv_logical interface~comms_no_sync_recv->proc~comms_no_sync_recv_logical proc~comms_no_sync_recv_real comms_no_sync_recv_real interface~comms_no_sync_recv->proc~comms_no_sync_recv_real proc~comms_no_sync_send_char comms_no_sync_send_char interface~comms_no_sync_send->proc~comms_no_sync_send_char proc~comms_no_sync_send_cmplx comms_no_sync_send_cmplx interface~comms_no_sync_send->proc~comms_no_sync_send_cmplx proc~comms_no_sync_send_int comms_no_sync_send_int interface~comms_no_sync_send->proc~comms_no_sync_send_int proc~comms_no_sync_send_logical comms_no_sync_send_logical interface~comms_no_sync_send->proc~comms_no_sync_send_logical proc~comms_no_sync_send_real comms_no_sync_send_real interface~comms_no_sync_send->proc~comms_no_sync_send_real proc~dis_extract->proc~set_error_fatal proc~dis_extract->interface~comms_allreduce proc~dis_extract->proc~io_stopwatch_start proc~dis_extract->proc~io_stopwatch_stop proc~dis_extract->proc~set_error_alloc proc~dis_extract->proc~set_error_dealloc proc~dis_extract->proc~sitesym_symmetrize_u_matrix proc~dis_extract->zgemm interface~comms_bcast comms_bcast proc~dis_extract->interface~comms_bcast proc~internal_test_convergence~2 internal_test_convergence proc~dis_extract->proc~internal_test_convergence~2 proc~internal_zmatrix internal_zmatrix proc~dis_extract->proc~internal_zmatrix proc~io_wallclocktime io_wallclocktime proc~dis_extract->proc~io_wallclocktime proc~sitesym_dis_extract_symmetry sitesym_dis_extract_symmetry proc~dis_extract->proc~sitesym_dis_extract_symmetry proc~sitesym_symmetrize_zmatrix sitesym_symmetrize_zmatrix proc~dis_extract->proc~sitesym_symmetrize_zmatrix zhpevx zhpevx proc~dis_extract->zhpevx proc~dis_extract_gamma->proc~set_error_fatal proc~dis_extract_gamma->proc~io_stopwatch_start proc~dis_extract_gamma->proc~io_stopwatch_stop proc~dis_extract_gamma->proc~set_error_alloc proc~dis_extract_gamma->proc~set_error_dealloc proc~dis_extract_gamma->zgemm dspevx dspevx proc~dis_extract_gamma->dspevx proc~dis_extract_gamma->proc~internal_test_convergence~2 proc~internal_zmatrix_gamma internal_zmatrix_gamma proc~dis_extract_gamma->proc~internal_zmatrix_gamma proc~io_time io_time proc~dis_extract_gamma->proc~io_time proc~dis_proj_froz->proc~set_error_fatal proc~dis_proj_froz->proc~io_stopwatch_start proc~dis_proj_froz->proc~io_stopwatch_stop proc~dis_proj_froz->proc~set_error_alloc proc~dis_proj_froz->proc~set_error_dealloc proc~dis_proj_froz->zhpevx proc~dis_project->proc~set_error_fatal proc~dis_project->proc~io_stopwatch_start proc~dis_project->proc~io_stopwatch_stop proc~dis_project->proc~set_error_alloc proc~dis_project->proc~set_error_dealloc zgesvd zgesvd proc~dis_project->zgesvd proc~dis_windows->proc~set_error_fatal proc~dis_windows->proc~io_stopwatch_start proc~dis_windows->proc~io_stopwatch_stop 10 10 proc~dis_windows->10 proc~set_error_input set_error_input proc~dis_windows->proc~set_error_input proc~dis_windows_proj->proc~set_error_fatal proc~dis_windows_proj->proc~io_stopwatch_start proc~dis_windows_proj->proc~io_stopwatch_stop proc~dis_windows_proj->proc~set_error_alloc proc~dis_windows_proj->10 proc~dis_otsu_thresholds dis_otsu_thresholds proc~dis_windows_proj->proc~dis_otsu_thresholds proc~internal_check_orthonorm->proc~set_error_fatal proc~internal_check_orthonorm->proc~io_stopwatch_start proc~internal_check_orthonorm->proc~io_stopwatch_stop proc~internal_find_u->proc~set_error_fatal proc~internal_find_u->proc~io_stopwatch_start proc~internal_find_u->proc~io_stopwatch_stop proc~internal_find_u->proc~set_error_alloc proc~internal_find_u->proc~set_error_dealloc proc~internal_find_u->proc~sitesym_symmetrize_u_matrix proc~internal_find_u->zgemm proc~internal_find_u->interface~comms_bcast proc~internal_find_u->zgesvd proc~internal_find_u_gamma->proc~set_error_fatal proc~internal_find_u_gamma->proc~io_stopwatch_start proc~internal_find_u_gamma->proc~io_stopwatch_stop proc~internal_find_u_gamma->proc~set_error_alloc proc~internal_find_u_gamma->proc~set_error_dealloc dgemm dgemm proc~internal_find_u_gamma->dgemm dgesvd dgesvd proc~internal_find_u_gamma->dgesvd proc~internal_slim_m->proc~io_stopwatch_start proc~internal_slim_m->proc~io_stopwatch_stop proc~internal_slim_m->proc~mpirank proc~internal_slim_m->proc~set_error_alloc proc~internal_slim_m->proc~set_error_dealloc proc~set_error_alloc->proc~comms_sync_error proc~set_error_alloc->proc~set_base_error proc~set_error_dealloc->proc~comms_sync_error proc~set_error_dealloc->proc~set_base_error proc~set_error_file->proc~comms_sync_error proc~set_error_file->proc~set_base_error proc~sitesym_replace_d_matrix_band->proc~set_error_alloc proc~sitesym_replace_d_matrix_band->proc~set_error_dealloc proc~sitesym_symmetrize_u_matrix->proc~set_error_fatal proc~sitesym_symmetrize_u_matrix->zgemm proc~symmetrize_ukirr symmetrize_ukirr proc~sitesym_symmetrize_u_matrix->proc~symmetrize_ukirr proc~utility_inv3 utility_inv3 proc~utility_recip_lattice_base->proc~utility_inv3 proc~comms_bcast_char comms_bcast_char interface~comms_bcast->proc~comms_bcast_char proc~comms_bcast_cmplx comms_bcast_cmplx interface~comms_bcast->proc~comms_bcast_cmplx proc~comms_bcast_int comms_bcast_int interface~comms_bcast->proc~comms_bcast_int proc~comms_bcast_logical comms_bcast_logical interface~comms_bcast->proc~comms_bcast_logical proc~comms_bcast_real comms_bcast_real interface~comms_bcast->proc~comms_bcast_real proc~comms_allreduce_cmplx->proc~comms_sync_error proc~comms_no_sync_allreduce_cmplx comms_no_sync_allreduce_cmplx proc~comms_allreduce_cmplx->proc~comms_no_sync_allreduce_cmplx proc~comms_allreduce_real->proc~comms_sync_error proc~comms_no_sync_allreduce_real comms_no_sync_allreduce_real proc~comms_allreduce_real->proc~comms_no_sync_allreduce_real proc~internal_test_convergence~2->proc~set_error_alloc proc~internal_test_convergence~2->proc~set_error_dealloc proc~internal_zmatrix->proc~io_stopwatch_start proc~internal_zmatrix->proc~io_stopwatch_stop proc~internal_zmatrix->zgemm proc~internal_zmatrix_gamma->proc~io_stopwatch_start proc~internal_zmatrix_gamma->proc~io_stopwatch_stop proc~internal_zmatrix_gamma->zgemm proc~set_error_input->proc~comms_sync_error proc~set_error_input->proc~set_base_error proc~sitesym_dis_extract_symmetry->proc~set_error_fatal proc~sitesym_dis_extract_symmetry->proc~set_error_alloc proc~sitesym_dis_extract_symmetry->proc~set_error_dealloc proc~sitesym_dis_extract_symmetry->zgemm proc~sitesym_dis_extract_symmetry->proc~symmetrize_ukirr zhpgvx zhpgvx proc~sitesym_dis_extract_symmetry->zhpgvx proc~sitesym_symmetrize_zmatrix->zgemm proc~symmetrize_ukirr->proc~set_error_fatal proc~symmetrize_ukirr->zgemm proc~orthogonalize_u orthogonalize_u proc~symmetrize_ukirr->proc~orthogonalize_u proc~set_error_unconv set_error_unconv proc~symmetrize_ukirr->proc~set_error_unconv proc~comms_bcast_char->proc~comms_sync_error proc~comms_bcast_char->proc~comms_no_sync_bcast_char proc~comms_bcast_cmplx->proc~comms_sync_error proc~comms_bcast_cmplx->proc~comms_no_sync_bcast_cmplx proc~comms_bcast_int->proc~comms_sync_error proc~comms_bcast_int->proc~comms_no_sync_bcast_int proc~comms_bcast_logical->proc~comms_sync_error proc~comms_bcast_logical->proc~comms_no_sync_bcast_logical proc~comms_bcast_real->proc~comms_sync_error proc~comms_bcast_real->proc~comms_no_sync_bcast_real proc~orthogonalize_u->proc~set_error_fatal proc~orthogonalize_u->proc~set_error_dealloc proc~orthogonalize_u->zgesvd proc~set_error_unconv->proc~comms_sync_error proc~set_error_unconv->proc~set_base_error

Called by

proc~~w90_disentangle~2~~CalledByGraph proc~w90_disentangle~2 w90_disentangle proc~w90_disentangle w90_disentangle proc~w90_disentangle->proc~w90_disentangle~2 program~wannier wannier program~wannier->proc~w90_disentangle~2

Source Code

  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