w90_postw90_readwrite_mem_estimate Subroutine

private subroutine w90_postw90_readwrite_mem_estimate(mem_param, mem_bw, dis_manifold, do_boltzwann, pw90_boltzwann, spin_decomp, num_wann, stdout)

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(in) :: mem_param
real(kind=dp), intent(inout) :: mem_bw
type(dis_manifold_type), intent(in) :: dis_manifold
logical, intent(in) :: do_boltzwann
type(pw90_boltzwann_type) :: pw90_boltzwann
logical, intent(in) :: spin_decomp
integer, intent(in) :: num_wann
integer, intent(in) :: stdout

Source Code

  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