Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions src/ElectronicStructureModels.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@ module ElectronicStructureModels

hello_world() = "Hello, World!"

# temperature
export FiniteTemperature, ZeroTemperature

# matter model
export AbstractMatterModel

Expand All @@ -27,7 +24,7 @@ export AbstractLocalFieldCorrection, NoLocalFieldCorrection

# concrete electron systems
export IdealElectronSystem
export AbstractResponseApproximation, NoApprox, NonDegenerated, Degenerated
export AbstractResponseApproximation, NoApprox, NonDegenerated, Degenerated, ZeroTemperatureApprox
export response_approximation
export InteractingElectronSystem

Expand All @@ -51,7 +48,6 @@ using SpecialFunctions
include("utils.jl")
include("units.jl")
include("constants.jl")
include("temperature.jl")
include("interface.jl")
include("generic.jl")
include("lookup.jl")
Expand All @@ -61,6 +57,7 @@ include("electron_system/interface.jl")
include("electron_system/generic.jl")
include("electron_system/ideal/approximations/interface.jl")
include("electron_system/ideal/approximations/no_approx.jl")
include("electron_system/ideal/approximations/zero_temperature.jl")
include("electron_system/ideal/approximations/non_degenerated.jl")
include("electron_system/ideal/approximations/degenerated.jl")
include("electron_system/ideal/utils.jl")
Expand Down
6 changes: 3 additions & 3 deletions src/electron_system/ideal/approximations/degenerated.jl
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ function _deg_integral(x::Real)
end
end

function _real_lindhard_nonzero_temperature(::Degenerated, ombar::T, qbar::T, bbar::T) where {T <: Real}
function _real_ideal_dynamic_response(::Degenerated, ombar::T, qbar::T, bbar::T) where {T <: Real}

prefac = inv(qbar)
num = _nu_minus(ombar, qbar)
Expand All @@ -42,7 +42,7 @@ function _real_lindhard_nonzero_temperature(::Degenerated, ombar::T, qbar::T, bb
if ombar < 1.0e-4 * qbar
# fallback on no-approx
# TODO: find an improved formula for this case!
return _real_lindhard_zero_temperature(NoApprox(), ombar, qbar)
return _real_ideal_dynamic_response(NoApprox(), ombar, qbar, bbar)
end

# general degenerated case
Expand All @@ -54,7 +54,7 @@ end

# general degenerated case
# source: AB84, eq. 26
function _imag_lindhard_nonzero_temperature(::Degenerated, ombar::T, qbar::T, bbar::T) where {T <: Real}
function _imag_ideal_dynamic_response(::Degenerated, ombar::T, qbar::T, bbar::T) where {T <: Real}
prefac = -pi / (2 * qbar * bbar)

num = _nu_minus(ombar, qbar)
Expand Down
7 changes: 2 additions & 5 deletions src/electron_system/ideal/approximations/interface.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,11 @@ abstract type AbstractResponseApproximation <: AbstractApproximation end
# most naive implementation
struct NoApprox <: AbstractResponseApproximation end

# using integral transforms and identities to make integration more stable
struct TransformedIntegral <: AbstractResponseApproximation end
# using the zero temperature limit (betabar to infty)
struct ZeroTemperatureApprox <: AbstractResponseApproximation end

# using the limit for non-degenerated electron gases (betabar << 1)
struct NonDegenerated <: AbstractResponseApproximation end

# using the limit for degenerated electron gases (betabar >> 1)
struct Degenerated <: AbstractResponseApproximation end

const AbstractZeroTemperatureApproximation = Union{NoApprox}
const AbstractFiniteTemperatureApproximation = Union{NoApprox, NonDegenerated, Degenerated}
40 changes: 2 additions & 38 deletions src/electron_system/ideal/approximations/no_approx.jl
Original file line number Diff line number Diff line change
@@ -1,39 +1,3 @@
# zero temperature Lindhard, without any further approximation

function _imag_lindhardDSF_zeroT_minus(omb::T, qb::T) where {T <: Real}
num = _nu_minus(omb, qb)

if abs(num) >= one(T)
return zero(T)
end
return one(omb) - num^2

end

function _imag_lindhardDSF_zeroT_plus(omb::T, qb::T) where {T <: Real}
nup = _nu_plus(omb, qb)
if abs(nup) >= one(T)
return zero(T)
end
return one(omb) - nup^2

end

function _imag_lindhard_zero_temperature(::NoApprox, ombar::T, qbar::T) where {T <: Real}
return -pi / (2 * qbar) *
(_imag_lindhardDSF_zeroT_minus(ombar, qbar) - _imag_lindhardDSF_zeroT_plus(ombar, qbar))
end

function _real_lindhard_zero_temperature(::NoApprox, ombar::T, qbar::T) where {T <: Real}
num = _nu_minus(ombar, qbar)
nup = _nu_plus(ombar, qbar)

term1 = (1 - num^2) / 4 * _stable_log_term(num)
term2 = (1 - nup^2) / 4 * _stable_log_term(nup)

return -2 * (qbar / 2 - term1 + term2) / qbar
end

# finite temperature Lindhard, without any further approximation

## Real part
Expand Down Expand Up @@ -62,7 +26,7 @@ function _general_integral(nu, beta)
return -nu^2 * res
end

function _real_lindhard_nonzero_temperature(::NoApprox, ombar, qbar, bbar)
function _real_ideal_dynamic_response(::NoApprox, ombar, qbar, bbar)
num = _nu_minus(ombar, qbar)
nup = _nu_plus(ombar, qbar)

Expand All @@ -75,7 +39,7 @@ end

## Imaginary part

function _imag_lindhard_nonzero_temperature(::NoApprox, ombar::T, qbar::T, bbar::T) where {T <: Real}
function _imag_ideal_dynamic_response(::NoApprox, ombar::T, qbar::T, bbar::T) where {T <: Real}

prefac = -pi / (2 * qbar)

Expand Down
4 changes: 2 additions & 2 deletions src/electron_system/ideal/approximations/non_degenerated.jl
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ function _non_deg_integal(nu, beta)
return prefac * dawson(nu * sqrt(beta)) * sqrt(pi)
end

function _real_lindhard_nonzero_temperature(::NonDegenerated, ombar::T, qbar::T, bbar::T) where {T <: Real}
function _real_ideal_dynamic_response(::NonDegenerated, ombar::T, qbar::T, bbar::T) where {T <: Real}
num = _nu_minus(ombar, qbar)
nup = _nu_plus(ombar, qbar)

Expand All @@ -14,7 +14,7 @@ function _real_lindhard_nonzero_temperature(::NonDegenerated, ombar::T, qbar::T,
end


function _imag_lindhard_nonzero_temperature(::NonDegenerated, ombar::T, qbar::T, bbar::T) where {T <: Real}
function _imag_ideal_dynamic_response(::NonDegenerated, ombar::T, qbar::T, bbar::T) where {T <: Real}
prefac = -pi / (2 * qbar * bbar)

num = _nu_minus(ombar, qbar)
Expand Down
35 changes: 35 additions & 0 deletions src/electron_system/ideal/approximations/zero_temperature.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# zero temperature Lindhard, without any further approximation

function _imag_lindhardDSF_zeroT_minus(omb::T, qb::T) where {T <: Real}
num = _nu_minus(omb, qb)

if abs(num) >= one(T)
return zero(T)
end
return one(omb) - num^2

end

function _imag_lindhardDSF_zeroT_plus(omb::T, qb::T) where {T <: Real}
nup = _nu_plus(omb, qb)
if abs(nup) >= one(T)
return zero(T)
end
return one(omb) - nup^2

end

function _imag_ideal_dynamic_response(::ZeroTemperatureApprox, ombar::T, qbar::T, betabar::T) where {T <: Real}
return -pi / (2 * qbar) *
(_imag_lindhardDSF_zeroT_minus(ombar, qbar) - _imag_lindhardDSF_zeroT_plus(ombar, qbar))
end

function _real_ideal_dynamic_response(::ZeroTemperatureApprox, ombar::T, qbar::T, betabar::T) where {T <: Real}
num = _nu_minus(ombar, qbar)
nup = _nu_plus(ombar, qbar)

term1 = (1 - num^2) / 4 * _stable_log_term(num)
term2 = (1 - nup^2) / 4 * _stable_log_term(nup)

return -2 * (qbar / 2 - term1 + term2) / qbar
end
10 changes: 5 additions & 5 deletions src/electron_system/ideal/generic.jl
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ function imag_dynamic_response(

if ombar <= zero(ombar)
if qbar < zero(qbar)
return N0 * _imag_ideal_dynamic_response(elsys, approx, -ombar, -qbar)
return N0 * _imag_ideal_dynamic_response(approx, -ombar, -qbar, betabar(elsys))
else
return -N0 * _imag_ideal_dynamic_response(elsys, approx, -ombar, qbar)
return -N0 * _imag_ideal_dynamic_response(approx, -ombar, qbar, betabar(elsys))
end
end

return N0 * _imag_ideal_dynamic_response(elsys, approx, ombar, qbar)
return N0 * _imag_ideal_dynamic_response(approx, ombar, qbar, betabar(elsys))
end

function real_dynamic_response(
Expand All @@ -31,8 +31,8 @@ function real_dynamic_response(
N0 = KF / (2 * pi^2)

if ombar <= zero(ombar)
return N0 * _real_ideal_dynamic_response(elsys, response_approximation(elsys), -ombar, qbar)
return N0 * _real_ideal_dynamic_response(response_approximation(elsys), -ombar, qbar, betabar(elsys))
end

return N0 * _real_ideal_dynamic_response(elsys, response_approximation(elsys), ombar, qbar)
return N0 * _real_ideal_dynamic_response(response_approximation(elsys), ombar, qbar, betabar(elsys))
end
Loading
Loading