subroutine w90_postw90_readwrite_mem_estimate(mem_param, mem_bw, dis_manifold, do_boltzwann, &
pw90_boltzwann, spin_decomp, num_wann, stdout)
!================================================!
! note, should only be called from root node
!================================================!
implicit none
type(dis_manifold_type), intent(in) :: dis_manifold
type(pw90_boltzwann_type) :: pw90_boltzwann
integer, intent(in) :: num_wann
integer, intent(in) :: stdout
!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), intent(in) :: mem_param
real(kind=dp), intent(inout) :: mem_bw
logical, intent(in) :: do_boltzwann, spin_decomp
integer :: NumPoints1, NumPoints2, NumPoints3, ndim
real(kind=dp) :: TDF_exceeding_energy
if (do_boltzwann) then
if (spin_decomp) then
ndim = 3
else
ndim = 1
end if
! I set a big value to have a rough estimate
TDF_exceeding_energy = 2._dp
NumPoints1 = int(floor((pw90_boltzwann%temp_max - pw90_boltzwann%temp_min)/ &
pw90_boltzwann%temp_step)) + 1 ! temperature array
NumPoints2 = int(floor((pw90_boltzwann%mu_max - pw90_boltzwann%mu_min)/ &
pw90_boltzwann%mu_step)) + 1 ! mu array
NumPoints3 = int(floor((dis_manifold%win_max - dis_manifold%win_min &
+ 2._dp*TDF_exceeding_energy)/ &
pw90_boltzwann%tdf_energy_step)) + 1 ! tdfenergyarray
mem_bw = mem_bw + NumPoints1*size_real !TempArray
mem_bw = mem_bw + NumPoints1*size_real !KTArray
mem_bw = mem_bw + NumPoints2*size_real !MuArray
mem_bw = mem_bw + NumPoints3*size_real !TDFEnergyArray
mem_bw = mem_bw + 6*NumPoints3*ndim*size_real !TDFArray
mem_bw = mem_bw + 6*NumPoints3*size_real !IntegrandArray
mem_bw = mem_bw + (9*4 + 6)*size_real
!ElCondTimesSeebeckFP,ThisElCond,ElCondInverse,ThisSeebeck,ElCondTimesSeebeck
mem_bw = mem_bw + 6*NumPoints1*NumPoints2*size_real !ElCond
mem_bw = mem_bw + 6*NumPoints1*NumPoints2*size_real !Seebeck
mem_bw = mem_bw + 6*NumPoints1*NumPoints2*size_real !ThermCond
! I put a upper bound here below (as if there was only 1 node), because I do not have any knowledge at this point
! of the number of processors, so I cannot have a correct estimate
mem_bw = mem_bw + 6*NumPoints1*NumPoints2*size_real !LocalElCond
mem_bw = mem_bw + 6*NumPoints1*NumPoints2*size_real !LocalSeebeck
mem_bw = mem_bw + 6*NumPoints1*NumPoints2*size_real !LocalThermCond
mem_bw = mem_bw + num_wann*num_wann*size_cmplx !HH
mem_bw = mem_bw + 3*num_wann*num_wann*size_cmplx !delHH
mem_bw = mem_bw + num_wann*num_wann*size_cmplx !UU
mem_bw = mem_bw + 3*num_wann*size_real !del_eig
mem_bw = mem_bw + num_wann*size_real !eig
mem_bw = mem_bw + num_wann*size_real !levelspacing_k
NumPoints1 = int(floor((pw90_boltzwann%dos_energy_max - pw90_boltzwann%dos_energy_min)/ &
pw90_boltzwann%dos_energy_step)) + 1!dosnumpoints
mem_bw = mem_bw + NumPoints1*size_real !DOS_EnergyArray
mem_bw = mem_bw + 6*ndim*NumPoints3*size_real !TDF_k
mem_bw = mem_bw + ndim*NumPoints1*size_real !DOS_k
mem_bw = mem_bw + ndim*NumPoints1*size_real !DOS_all
end if
if (do_boltzwann) &
write (stdout, '(1x,"|",24x,a15,f16.2,a,18x,"|")') 'BoltzWann:', &
(mem_param + mem_bw)/(1024**2), ' Mb'
end subroutine w90_postw90_readwrite_mem_estimate