Estimate how much memory we will allocate
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(atom_data_type), | intent(in) | :: | atom_data | |||
| type(kmesh_info_type), | intent(in) | :: | kmesh_info | |||
| type(wann_control_type), | intent(in) | :: | wann_control | |||
| type(proj_type), | intent(in), | allocatable | :: | proj_input(:) | ||
| type(print_output_type), | intent(in) | :: | print_output | |||
| integer, | intent(in) | :: | num_bands | |||
| integer, | intent(in) | :: | num_kpts | |||
| integer, | intent(in) | :: | num_proj | |||
| integer, | intent(in) | :: | num_wann | |||
| integer, | intent(in) | :: | optimisation | |||
| logical, | intent(in) | :: | gamma_only | |||
| integer, | intent(in) | :: | stdout |
subroutine w90_wannier90_readwrite_memory_estimate(atom_data, kmesh_info, wann_control, & proj_input, print_output, num_bands, & num_kpts, num_proj, num_wann, optimisation, & gamma_only, stdout) !================================================! ! !! Estimate how much memory we will allocate ! !================================================! implicit none ! arguments type(print_output_type), intent(in) :: print_output type(wann_control_type), intent(in) :: wann_control type(kmesh_info_type), intent(in) :: kmesh_info type(proj_type), allocatable, intent(in) :: proj_input(:) type(atom_data_type), intent(in) :: atom_data integer, intent(in) :: num_bands integer, intent(in) :: num_wann integer, intent(in) :: stdout integer, intent(in) :: num_proj integer, intent(in) :: num_kpts integer, intent(in) :: optimisation logical, intent(in) :: gamma_only ! local variables real(kind=dp), parameter :: size_log = 1.0_dp real(kind=dp), parameter :: size_int = 4.0_dp real(kind=dp), parameter :: size_real = 8.0_dp real(kind=dp), parameter :: size_cmplx = 16.0_dp real(kind=dp) :: mem_wan, mem_wan1, mem_param, mem_dis, mem_dis2, mem_dis1 real(kind=dp) :: mem_bw logical :: disentanglement disentanglement = (num_bands > num_wann) mem_param = 0 mem_dis = 0 mem_dis1 = 0 mem_dis2 = 0 mem_wan = 0 mem_wan1 = 0 mem_bw = 0 ! First the data stored in the parameters module mem_param = mem_param + num_wann*num_wann*num_kpts*size_cmplx !u_matrix if (.not. disentanglement) & mem_param = mem_param + num_wann*num_wann*kmesh_info%nntot*num_kpts*size_cmplx !m_matrix if (disentanglement) then mem_param = mem_param + num_bands*num_wann*num_kpts*size_cmplx ! u_matrix_opt end if if (allocated(atom_data%species_num)) then mem_param = mem_param + (atom_data%num_species)*size_int !atoms_species_num mem_param = mem_param + (atom_data%num_species)*size_real !atoms_label mem_param = mem_param + (atom_data%num_species)*size_real !atoms_symbol !mem_param = mem_param + (3*maxval(atom_data%species_num)*atom_data%num_species)*size_real !atoms_pos_frac mem_param = mem_param + (3*maxval(atom_data%species_num)*atom_data%num_species)*size_real !atoms_pos_cart end if if (allocated(proj_input)) then mem_param = mem_param + (3*num_proj)*size_real !input_proj_site mem_param = mem_param + (num_proj)*size_int !input_proj_l mem_param = mem_param + (num_proj)*size_int !input_proj_m mem_param = mem_param + (3*num_proj)*size_real !input_proj_z mem_param = mem_param + (3*num_proj)*size_real !input_proj_x mem_param = mem_param + (num_proj)*size_real !input_proj_radial mem_param = mem_param + (num_proj)*size_real !input_proj_zona end if if (allocated(wann_control%guiding_centres%centres)) then mem_param = mem_param + (3*num_wann)*size_real !proj_site mem_param = mem_param + (num_wann)*size_int !proj_l mem_param = mem_param + (num_wann)*size_int !proj_m mem_param = mem_param + (3*num_wann)*size_real !proj_z mem_param = mem_param + (3*num_wann)*size_real !proj_x mem_param = mem_param + (num_wann)*size_real !proj_radial mem_param = mem_param + (num_wann)*size_real !proj_zona end if mem_param = mem_param + num_kpts*kmesh_info%nntot*size_int !nnlist mem_param = mem_param + num_kpts*kmesh_info%nntot/2*size_int !neigh mem_param = mem_param + 3*num_kpts*kmesh_info%nntot*size_int !nncell mem_param = mem_param + kmesh_info%nntot*size_real !wb mem_param = mem_param + 3*kmesh_info%nntot/2*size_real !bka mem_param = mem_param + 3*kmesh_info%nntot*num_kpts*size_real !bk mem_param = mem_param + num_bands*num_kpts*size_real !eigval !mem_param = mem_param + 3*num_kpts*size_real !kpt_cart mem_param = mem_param + 3*num_kpts*size_real !kpt_latt if (disentanglement) then mem_param = mem_param + num_kpts*size_int !ndimwin mem_param = mem_param + num_bands*num_kpts*size_log !lwindow end if mem_param = mem_param + 3*num_wann*size_real !wannier_centres mem_param = mem_param + num_wann*size_real !wannier_spreads if (disentanglement) then ! Module vars mem_dis = mem_dis + num_bands*num_kpts*size_real !eigval_opt mem_dis = mem_dis + num_kpts*size_int !nfirstwin mem_dis = mem_dis + num_kpts*size_int !ndimfroz mem_dis = mem_dis + num_bands*num_kpts*size_int !indxfroz mem_dis = mem_dis + num_bands*num_kpts*size_int !indxnfroz mem_dis = mem_dis + num_bands*num_kpts*size_log !lfrozen !the memory high-water wiil occur in dis_extract or when we allocate m_matrix mem_dis1 = mem_dis1 + num_wann*num_bands*size_cmplx !cwb mem_dis1 = mem_dis1 + num_wann*num_wann*size_cmplx !cww mem_dis1 = mem_dis1 + num_bands*num_wann*size_cmplx !cbw mem_dis1 = mem_dis1 + 5*num_bands*size_int !iwork mem_dis1 = mem_dis1 + num_bands*size_int !ifail mem_dis1 = mem_dis1 + num_bands*size_real !w if (gamma_only) then mem_dis1 = mem_dis1 + (num_bands*(num_bands + 1))/2*size_real !cap_r mem_dis1 = mem_dis1 + 8*num_bands*size_real !work mem_dis1 = mem_dis1 + num_bands*num_bands*size_real !rz else mem_dis1 = mem_dis1 + 7*num_bands*size_real !rwork mem_dis1 = mem_dis1 + (num_bands*(num_bands + 1))/2*size_cmplx !cap mem_dis1 = mem_dis1 + 2*num_bands*size_cmplx !cwork mem_dis1 = mem_dis1 + num_bands*num_bands*size_cmplx !cz end if mem_dis1 = mem_dis1 + num_kpts*size_real !wkomegai1 mem_dis1 = mem_dis1 + num_bands*num_bands*num_kpts*size_cmplx !ceamp mem_dis1 = mem_dis1 + num_bands*num_bands*num_kpts*size_cmplx !cham mem_dis2 = mem_dis2 + num_wann*num_wann*kmesh_info%nntot*num_kpts*size_cmplx!m_matrix if (optimisation <= 0) then mem_dis = mem_dis + mem_dis1 else mem_dis = mem_dis + max(mem_dis1, mem_dis2) end if mem_dis = mem_dis + num_bands*num_bands*kmesh_info%nntot*num_kpts*size_cmplx ! m_matrix_orig mem_dis = mem_dis + num_bands*num_wann*num_kpts*size_cmplx ! a_matrix end if !Wannierise mem_wan1 = mem_wan1 + (num_wann*num_wann*kmesh_info%nntot*num_kpts)*size_cmplx ! 'm0' if (optimisation > 0) then mem_wan = mem_wan + mem_wan1 end if mem_wan = mem_wan + (num_wann*num_wann*num_kpts)*size_cmplx ! 'u0' mem_wan = mem_wan + (num_wann*kmesh_info%nntot*num_kpts)*size_real ! 'rnkb' mem_wan = mem_wan + (num_wann*kmesh_info%nntot*num_kpts)*size_real ! 'ln_tmp' mem_wan = mem_wan + (num_wann*kmesh_info%nntot*num_kpts)*size_cmplx ! 'csheet' mem_wan = mem_wan + (num_wann*kmesh_info%nntot*num_kpts)*size_real ! 'sheet' mem_wan = mem_wan + (3*num_wann)*size_real ! 'rave' mem_wan = mem_wan + (num_wann)*size_real ! 'r2ave' mem_wan = mem_wan + (num_wann)*size_real ! 'rave2' mem_wan = mem_wan + (3*num_wann)*size_real ! 'rguide' mem_wan = mem_wan + (num_wann*num_wann)*size_cmplx ! 'cz' if (gamma_only) then mem_wan = mem_wan + num_wann*num_wann*kmesh_info%nntot*2*size_cmplx ! m_w mem_wan = mem_wan + num_wann*num_wann*size_cmplx ! uc_rot mem_wan = mem_wan + num_wann*num_wann*size_real ! ur_rot !internal_svd_omega_i mem_wan = mem_wan + 10*num_wann*size_cmplx ! cw1 mem_wan = mem_wan + 10*num_wann*size_cmplx ! cw2 mem_wan = mem_wan + num_wann*num_wann*size_cmplx ! cv1 mem_wan = mem_wan + num_wann*num_wann*size_cmplx ! cv2 mem_wan = mem_wan + num_wann*num_wann*size_real ! cpad1 mem_wan = mem_wan + num_wann*size_cmplx ! singvd else mem_wan = mem_wan + (num_wann)*size_cmplx ! 'cwschur1' mem_wan = mem_wan + (10*num_wann)*size_cmplx ! 'cwschur2' mem_wan = mem_wan + (num_wann)*size_cmplx ! 'cwschur3' mem_wan = mem_wan + (num_wann)*size_cmplx ! 'cwschur4' mem_wan = mem_wan + (num_wann*num_wann*num_kpts)*size_cmplx ! 'cdq' mem_wan = mem_wan + (num_wann*num_wann)*size_cmplx ! 'cmtmp' mem_wan = mem_wan + (num_wann*num_wann*num_kpts)*size_cmplx ! 'cdqkeep' mem_wan = mem_wan + (num_wann*num_wann)*size_cmplx ! 'tmp_cdq' mem_wan = mem_wan + (num_wann)*size_real ! 'evals' mem_wan = mem_wan + (4*num_wann)*size_cmplx ! 'cwork' mem_wan = mem_wan + (3*num_wann - 2)*size_real ! 'rwork' !d_omega mem_wan = mem_wan + (num_wann*num_wann)*size_cmplx ! 'cr' mem_wan = mem_wan + (num_wann*num_wann)*size_cmplx ! 'crt' end if if (disentanglement) & mem_wan = mem_wan + num_wann*num_wann*kmesh_info%nntot*num_kpts*size_cmplx !m_matrix if (print_output%iprint > 0) then write (stdout, '(1x,a)') '*============================================================================*' write (stdout, '(1x,a)') '| MEMORY ESTIMATE |' write (stdout, '(1x,a)') '| Maximum RAM allocated during each phase of the calculation |' write (stdout, '(1x,a)') '*============================================================================*' if (disentanglement) & write (stdout, '(1x,"|",24x,a15,f16.2,a,18x,"|")') 'Disentanglement:', (mem_param + mem_dis)/(1024**2), ' Mb' write (stdout, '(1x,"|",24x,a15,f16.2,a,18x,"|")') 'Wannierise:', (mem_param + mem_wan)/(1024**2), ' Mb' if (optimisation > 0 .and. print_output%iprint > 1) then write (stdout, '(1x,a)') '| |' write (stdout, '(1x,a)') '| N.B. by setting optimisation=0 memory usage will be reduced to: |' if (disentanglement) & write (stdout, '(1x,"|",24x,a15,f16.2,a,18x,"|")') 'Disentanglement:', & (mem_param + mem_dis - max(mem_dis1, mem_dis2) + mem_dis1)/(1024**2), ' Mb' if (gamma_only) then write (stdout, '(1x,"|",24x,a15,f16.2,a,18x,"|")') 'Wannierise:', (mem_param + mem_wan)/(1024**2), ' Mb' else write (stdout, '(1x,"|",24x,a15,f16.2,a,18x,"|")') 'Wannierise:', & (mem_param + mem_wan - mem_wan1)/(1024**2), ' Mb' end if write (stdout, '(1x,a)') '| However, this will result in more i/o and slow down the calculation |' end if write (stdout, '(1x,"|",24x,a15,f16.2,a,18x,"|")') 'plot_wannier:', (mem_param + mem_wan)/(1024**2), ' Mb' write (stdout, '(1x,a)') '*----------------------------------------------------------------------------*' write (stdout, *) ' ' end if ! if(w90_calculation%disentanglement) then ! write(*,'(a12,f12.4,a)') 'Disentangle',(mem_param+mem_dis)/(1024**2),' Mb' ! end if ! write(*,'(a12,f12.4,a)') 'Wannierise ',(mem_wan+mem_param)/(1024**2),' Mb' ! write(*,'(a12,f12.4,a)') 'Module',(mem_param)/(1024**2),' Mb' return end subroutine w90_wannier90_readwrite_memory_estimate