From a6daedd1a445dcd2fd130fb93869fecc0fc39219 Mon Sep 17 00:00:00 2001 From: victor Date: Tue, 21 Jan 2025 11:32:24 +0100 Subject: [PATCH] add onsager ising free energy const using high precision quadgk --- src/models/ising.jl | 2 ++ test/finalize.jl | 10 +++++----- test/ising.jl | 18 ++++-------------- 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/src/models/ising.jl b/src/models/ising.jl index d13367c..e0cadb1 100644 --- a/src/models/ising.jl +++ b/src/models/ising.jl @@ -1,6 +1,8 @@ const Ising_βc = log(1.0 + sqrt(2)) / 2.0 Potts_βc(q) = log(1.0 + sqrt(q)) +const f_onsager::BigFloat = -2.10965114460820745966777928351108478082549327543540531781696107967700291143188081390114126499095041781 + function classical_ising(β::Number; h=0) function σ(i::Int64) return 2i - 3 diff --git a/test/finalize.jl b/test/finalize.jl index b5278ff..84160af 100644 --- a/test/finalize.jl +++ b/test/finalize.jl @@ -16,7 +16,7 @@ end criterion_f(steps::Int, data) = abs(log(data[end]) * 2.0^(1 - steps)) T = classical_ising_symmetric(Ising_βc) -fs_onsager = onsager_free_energy(Ising_βc) +f_onsager = onsager_free_energy(Ising_βc) # TRG @testset "TRG - Ising Model" begin @@ -30,7 +30,7 @@ fs_onsager = onsager_free_energy(Ising_βc) fs = lnz * -1 / Ising_βc - relerror = abs((fs - fs_onsager) / fs_onsager) + relerror = abs((fs - f_onsager) / f_onsager) @test relerror < 2e-6 end @@ -46,7 +46,7 @@ end fs = lnz * -1 / Ising_βc - relerror = abs((fs - fs_onsager) / fs_onsager) + relerror = abs((fs - f_onsager) / f_onsager) @test relerror < 6e-8 end @@ -62,7 +62,7 @@ end fs = lnz * -1 / Ising_βc - relerror = abs((fs - fs_onsager) / fs_onsager) + relerror = abs((fs - f_onsager) / f_onsager) @test relerror < 6e-7 end @@ -78,6 +78,6 @@ end fs = lnz * -1 / Ising_βc - relerror = abs((fs - fs_onsager) / fs_onsager) + relerror = abs((fs - f_onsager) / f_onsager) @test relerror < 3e-6 end diff --git a/test/ising.jl b/test/ising.jl index ad5ce47..15e28f8 100644 --- a/test/ising.jl +++ b/test/ising.jl @@ -3,20 +3,10 @@ println(" Ising Model ") println("-------------") # Onsager solution -function onsager_integrand(θ, T) - k = 1 / sinh(2 / T)^(2) - integrand = 1 / (2π) * log(cosh(2 / T)^2 + 1 / k * sqrt(1 + k^2 - 2k * cos(2 * θ))) - return integrand -end - -function onsager_free_energy(β) - return -(quadgk(θ -> onsager_integrand(θ, 1 / β), 0, π)[1] + log(2) / 2) / β -end criterion_f(steps::Int, data) = abs(log(data[end]) * 2.0^(1 - steps)) T = classical_ising_symmetric(Ising_βc) -fs_onsager = onsager_free_energy(Ising_βc) # TRG @testset "TRG - Ising Model" begin @@ -30,7 +20,7 @@ fs_onsager = onsager_free_energy(Ising_βc) fs = lnz * -1 / Ising_βc - relerror = abs((fs - fs_onsager) / fs_onsager) + relerror = abs((fs - f_onsager) / f_onsager) @test relerror < 2e-6 end @@ -46,7 +36,7 @@ end fs = lnz * -1 / Ising_βc - relerror = abs((fs - fs_onsager) / fs_onsager) + relerror = abs((fs - f_onsager) / f_onsager) @test relerror < 6e-8 end @@ -62,7 +52,7 @@ end fs = lnz * -1 / Ising_βc - relerror = abs((fs - fs_onsager) / fs_onsager) + relerror = abs((fs - f_onsager) / f_onsager) @test relerror < 6e-7 end @@ -78,6 +68,6 @@ end fs = lnz * -1 / Ising_βc - relerror = abs((fs - fs_onsager) / fs_onsager) + relerror = abs((fs - f_onsager) / f_onsager) @test relerror < 3e-6 end