-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Create ExtendedHubbardMom1D.jl - New model (i.e. ``ExtendedHubbardMom1D`` is added to Rimu * Update excitations.jl - ``extended_momentum_transfer_diagonal`` is added for the nearest neighbour term in ``ExtendedHubbardMom1D`` * Update Hamiltonians.jl - ``ExtendedHubbardMom1D`` is added to all the necessary test sets. * Update Hamiltonians.jl * Update hamiltonians.md * Update Hamiltonians.jl * Update src/Hamiltonians/ExtendedHubbardMom1D.jl Co-authored-by: Joachim Brand <[email protected]> * Update src/Hamiltonians/ExtendedHubbardMom1D.jl Co-authored-by: Joachim Brand <[email protected]> * Update src/Hamiltonians/excitations.jl Co-authored-by: Joachim Brand <[email protected]> * Update src/Hamiltonians/ExtendedHubbardMom1D.jl Co-authored-by: Joachim Brand <[email protected]> * Update HubbardMom1D.jl * Update HubbardMom1D.jl * Update HubbardMom1D.jl * Update HubbardMom1D.jl * Update HubbardMom1D.jl * Update excitations.jl * Update ExtendedHubbardMom1D.jl * Update HubbardMom1D.jl * Update Hamiltonians.jl * Update Hamiltonians.jl * Update HubbardMom1D.jl * Update Hamiltonians.jl * Update excitations.jl * Update ExtendedHubbardMom1D.jl * Update ExtendedHubbardMom1D.jl * docstring fix for HubbardMom1DEP * Update HubbardMom1DEP.jl * Update excitations.jl * Update ExtendedHubbardMom1D.jl * Update ExtendedHubbardMom1D.jl * Update HubbardMom1D.jl * Update ExtendedHubbardMom1D.jl * Update Hamiltonians.jl - Added test for comparison between energies of ``ExtendedHubbardMom1D`` and ``ExtendedHubbardReal1D`` * Update src/Hamiltonians/ExtendedHubbardMom1D.jl Co-authored-by: mtsch <[email protected]> * Update src/Hamiltonians/ExtendedHubbardMom1D.jl Co-authored-by: mtsch <[email protected]> * Update Hamiltonians.jl * Update Hamiltonians.jl * Update Hamiltonians.jl * Update Hamiltonians.jl * Update Hamiltonians.jl * Update Hamiltonians.jl * Update ExtendedHubbardMom1D.jl * Update src/Hamiltonians/excitations.jl Co-authored-by: Joachim Brand <[email protected]> * Update ExtendedHubbardMom1D.jl * Update Hamiltonians.jl * Update Hamiltonians.jl * Update excitations.jl * Update ExtendedHubbardMom1D.jl * Update excitations.jl * Update excitations.jl --------- Co-authored-by: Joachim Brand <[email protected]> Co-authored-by: mtsch <[email protected]>
- Loading branch information
1 parent
034174b
commit adc7f10
Showing
7 changed files
with
183 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
""" | ||
ExtendedHubbardMom1D( | ||
address; | ||
u=1.0, t=1.0, v=1.0, dispersion=hubbard_dispersion, boundary_condition = 0.0 | ||
) | ||
Implements a one-dimensional extended Hubbard chain, also known as the ``t - V`` model, | ||
in momentum space. | ||
```math | ||
\\hat{H} = \\sum_{k} ϵ_k n_k + \\frac{1}{2M} \\sum_{kpqr} (u + 2v \\cos(q-p)) a^†_{r} a^†_{q} a_p a_k δ_{r+q,p+k} | ||
``` | ||
# Arguments | ||
* `address`: the starting address, defines number of particles and sites. | ||
* `u`: the interaction parameter. | ||
* `t`: the hopping strength. | ||
* `boundary_condition`: `θ <: Number`: hopping over the boundary incurs a | ||
factor ``\\exp(iθ)`` for a hop to the right and ``\\exp(−iθ)`` for a hop to the left. | ||
* `dispersion`: defines ``ϵ_k =``` dispersion(t, k + θ)` | ||
- [`hubbard_dispersion`](@ref): ``ϵ_k = -2 (\\Re(t) \\cos(k + θ) + \\Im(t) \\sin(k + θ))`` | ||
- [`continuum_dispersion`](@ref): ``ϵ_k = \\Re(t) (k + θ)^2 - 2 \\Im(t) (k + θ)`` | ||
# See also | ||
* [`HubbardMom1D`](@ref) | ||
* [`HubbardReal1D`](@ref) | ||
* [`ExtendedHubbardReal1D`](@ref) | ||
""" | ||
struct ExtendedHubbardMom1D{TT,M,AD<:AbstractFockAddress,U,V,T,BOUNDARY_CONDITION} <: AbstractHamiltonian{TT} | ||
address::AD # default starting address, should have N particles and M modes | ||
ks::SVector{M,TT} # values for k | ||
kes::SVector{M,TT} # values for kinetic energy | ||
end | ||
|
||
function ExtendedHubbardMom1D( | ||
address::SingleComponentFockAddress; | ||
u=1.0, v=1.0, t=1.0, dispersion = hubbard_dispersion, boundary_condition = 0.0 | ||
) | ||
M = num_modes(address) | ||
U, V, T= promote(float(u), float(v), float(t)) | ||
step = 2π/M | ||
if isodd(M) | ||
start = -π*(1+1/M) + step | ||
else | ||
start = -π + step | ||
end | ||
kr = range(start; step = step, length = M) | ||
ks = SVector{M}(kr) | ||
kes = SVector{M}(dispersion.(T , kr .+ (boundary_condition/M))) | ||
return ExtendedHubbardMom1D{typeof(U),M,typeof(address),U,V,T,boundary_condition}(address, ks, kes) | ||
end | ||
|
||
function Base.show(io::IO, h::ExtendedHubbardMom1D) | ||
compact_addr = repr(h.address, context=:compact => true) # compact print address | ||
print(io, "ExtendedHubbardMom1D($(compact_addr); u=$(h.u), v=$(h.v), t=$(h.t), boundary_condition=$(h.boundary_condition))") | ||
end | ||
|
||
function starting_address(h::ExtendedHubbardMom1D) | ||
return h.address | ||
end | ||
|
||
dimension(::ExtendedHubbardMom1D, address) = number_conserving_dimension(address) | ||
|
||
LOStructure(::Type{<:ExtendedHubbardMom1D{<:Real}}) = IsHermitian() | ||
|
||
Base.getproperty(h::ExtendedHubbardMom1D, s::Symbol) = getproperty(h, Val(s)) | ||
Base.getproperty(h::ExtendedHubbardMom1D, ::Val{:ks}) = getfield(h, :ks) | ||
Base.getproperty(h::ExtendedHubbardMom1D, ::Val{:kes}) = getfield(h, :kes) | ||
Base.getproperty(h::ExtendedHubbardMom1D, ::Val{:address}) = getfield(h, :address) | ||
Base.getproperty(h::ExtendedHubbardMom1D{<:Any,<:Any,<:Any,U}, ::Val{:u}) where {U} = U | ||
Base.getproperty(h::ExtendedHubbardMom1D{<:Any,<:Any,<:Any,<:Any,V}, ::Val{:v}) where {V} = V | ||
Base.getproperty(h::ExtendedHubbardMom1D{<:Any,<:Any,<:Any,<:Any,<:Any,T}, ::Val{:t}) where {T} = T | ||
Base.getproperty(h::ExtendedHubbardMom1D{<:Any,<:Any,<:Any,<:Any,<:Any,<:Any,BOUNDARY_CONDITION}, | ||
::Val{:boundary_condition}) where {BOUNDARY_CONDITION} = BOUNDARY_CONDITION | ||
|
||
ks(h::ExtendedHubbardMom1D) = getfield(h, :ks) | ||
|
||
# standard interface function | ||
function num_offdiagonals(ham::ExtendedHubbardMom1D, address::SingleComponentFockAddress) | ||
singlies, doublies = num_singly_doubly_occupied_sites(address) | ||
return num_offdiagonals(ham, address, singlies, doublies) | ||
end | ||
|
||
# 4-argument version | ||
@inline function num_offdiagonals(ham::ExtendedHubbardMom1D, ::SingleComponentFockAddress, singlies, doublies) | ||
M = num_modes(ham) | ||
return singlies * (singlies - 1) * (M - 2) + doublies * (M - 1) | ||
end | ||
|
||
@inline function diagonal_element(h::ExtendedHubbardMom1D{<:Any,M,A}, address::A) where {M,A<:SingleComponentFockAddress} | ||
map = OccupiedModeMap(address) | ||
return (dot(h.kes, map) + (h.u/ 2M) * momentum_transfer_diagonal(map) | ||
+ (h.v/ M) * extended_momentum_transfer_diagonal(map, 2π / M)) | ||
end | ||
|
||
@inline function diagonal_element(h::ExtendedHubbardMom1D{<:Any,M,A}, address::A) where {M,A<:FermiFS} | ||
map = OccupiedModeMap(address) | ||
return dot(h.kes, map) + (h.v/ M) * extended_momentum_transfer_diagonal(map, 2π / M) | ||
end | ||
|
||
@inline function get_offdiagonal( | ||
ham::ExtendedHubbardMom1D{<:Any,M,A}, address::A, chosen, map=OccupiedModeMap(address) | ||
) where {M,A<:SingleComponentFockAddress} | ||
address, onproduct,_,_,q = momentum_transfer_excitation(address, chosen, map) | ||
return address, ham.u * onproduct / 2M + ham.v * cos(q * 2π / M) * onproduct / M | ||
end | ||
|
||
@inline function get_offdiagonal( | ||
ham::ExtendedHubbardMom1D{<:Any,M,A}, address::A, chosen, map=OccupiedModeMap(address) | ||
) where {M,A<:FermiFS} | ||
address, onproduct,_,_,q = momentum_transfer_excitation(address, chosen, map) | ||
return address, -ham.v * onproduct * cos(q * 2π / M) / M | ||
end | ||
momentum(ham::ExtendedHubbardMom1D) = MomentumMom1D(ham) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters