Advertisement
Guest User

Untitled

a guest
Jun 21st, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 1.49 KB | None | 0 0
  1. using Parameters
  2. using StaticArrays
  3. using HCubature
  4. using NLsolve
  5. include("ForwardDiff.jl")
  6. include("LinearAlgebra.jl/src/LinearAlgebra.jl")
  7.  
  8. """ Cubic Anderson model parameters (units of t_c)"""
  9. @with_kw mutable struct PAM
  10.     hyb0::Float64 = 0.  # Hybridization strength
  11.     t_f::Float64 = 0.   # F-electron hopping
  12.     ε⁰f::Float64 = 0.   # F-electron ground state e
  13.     μ::Float64 = 0.     # Chemical potential
  14.     β::Float64 = Inf    # Inverse temperature
  15.    
  16.     b::Real = NaN       # Saddle-point condensed slave boson
  17.     λ::Real = NaN       # Saddle-point lagrange multiplier
  18. end
  19.  
  20. function Hamiltonian(k::SVector, pam::PAM)
  21.     # σ = [[0 1; 1 0], [0 -1im; 1im 0], [1 0; 0 -1]]
  22.     σ = [[0 1; 1 0]]
  23.     c = kron([1 0; 0 0], eye(2)) * (-2.0 * sum(cos, k) - pam.μ)
  24.     f = kron([0 0; 0 1], eye(2)) * (-2.0 * pam.t_f * sum(cos, k) * pam.b^2 + pam.ε⁰f + pam.λ - pam.μ)
  25.     cf = kron([0 1; 0 0], sin.(k)' * σ) * (pam.hyb0 * pam.b)
  26.    return Hermitian(c + f + cf, :U)
  27. end
  28.  
  29. function FreeEnergy(x::AbstractArray, pam::PAM)
  30.    const integration(f) = hcubature(f, [-π],[π]; atol=1e-3, rtol=1e-3, maxevals=100)[1] / (2π)^1
  31.    const lower_bands(k::SVector) = first(LinearAlgebra.EigenSelfAdjoint.eig!(Hamiltonian(k,pam)))[1:2]
  32.  
  33.    pam.b, pam.λ = x
  34.    
  35.    return pam.λ * (pam.b^2 - 1) + integration(q -> sum(lower_bands(q)))
  36. end
  37.  
  38. PAM(hyb0=1.0, t_f=-0.1, ε⁰f=-2.5)
  39. nlsolve(x -> ForwardDiff.gradient(x0 -> FreeEnergy(x0, pam), x), [0.1, -pam.ε⁰f]; inplace=false)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement