To be able to edit code and run cells, you need to run the notebook yourself. Where would you like to run the notebook?

This notebook takes about 5 minutes to run.

In the cloud (experimental)

Binder is a free, open source service that runs scientific notebooks in the cloud! It will take a while, usually 2-7 minutes to get a session.

On your computer

(Recommended if you want to store your changes.)

  1. Download the notebook:
  2. Run Pluto

    (Also see: How to install Julia and Pluto)

  3. Open the notebook file

    Type the saved filename in the open box.

Frontmatter

If you are publishing this notebook on the web, you can set the parameters below to provide HTML metadata. This is useful for search engines and social media.

Author 1
👀 Reading hidden code
using Plots, LinearAlgebra, ForwardDiff, Roots, PlutoUI
1.9 s
👀 Reading hidden code
TableOfContents(title="Table of Contents", indent=true)
29.5 μs
👀 Reading hidden code
plotly()
For saving to png with the Plotly backend PlotlyBase has to be installed.
112 ms

Ising Model and Z2 Gauge Theory

Topics

  • Duality and Wilson Loops

  • Gauge Field Theory

  • Legendre Transform

Reading

👀 Reading hidden code
md"

# Ising Model and Z2 Gauge Theory

# Topics

* Duality and Wilson Loops
* Gauge Field Theory
* Legendre Transform

# Reading

* M. Kardar Stat. Theory of Fields ch. 7
* [J. Greensite: Center vortices, and other scenarios of quark confinement](https://link.springer.com/content/pdf/10.1140/epjst/e2007-00002-6.pdf)
* Kohsuke Yagi, Tetsuo Hatsuda, and Yasuo Miake: QGP: From Big Bang to Little Bang
* Cheng & Li: Gauge theory of elementary particle physics

"
1.0 ms

Story Telling Time:

From spins to links and plaquettes

  • Self-Duality does NOT work in 3D Ising: Low and High T expansions do not match

  • Low T: theory of faces

  • total no. of faces = Area

(e2K)Area

  • High T: t-theory of links, forming loops / plaquettes

  • counting no. of links: i.e. perimeter of loop

tPerimeter

  • this will NOT match!

Find a new theory with High T expansion compatible with Low T 3D Ising Model

  • new variables: links uP = dual spins

  • unit = face at low T 3d Ising, surrounding islands of - in sea of +'s

  • face formed from links: u, e.g. 4 u's make a plaquette.

  • glue (via u) faces together to form a cube = low T island

Zplaq.(1+t~uPuPuPuP)eK~plaq.uPuPuPuP

  • this describes a Z(2) gauge theory

and to Wilson loops

  • The new theory is NOT supposed to have no Spontaneous Symmetry Breaking.

  • global Z(2): all uu

  • local gauge symmetry: pick a site and flip all the relevant u's

  • local order parameter like σi will not work!

  • but ''extended'' object like a Wilson loop could...

Wilson loop:

High Temperature

rough notes:

  • need to cancel out the links of C,

  • draw plaquettes inside,

  • each brings in a factor of t~, Area times!

CuC{uP}CuCP(1+t~uPuPuPuP){uP}P(1+t~uPuPuPuP)t~ACeAC#

Low Temperature

rough notes:

  • start with all links +'s, including those in C, this gives 1.

  • Then flip one link to -1, 4 surfaces are affected, hence factor of e2K~4.

  • For C, if the flipped link is not one of the PC links in C, value of loop unchanged,

  • otherwise it flips the value also.

CuCNGe3K~Nsd(1+(3NsdPC)e2K~4+(1)×PCe2K~4)NGe3K~Nsd(1+3Nsde2K~4)12PCe2K~4ePC×2e2K~4

Spatial Wilson loop: Perimeter law -> Area law from low to high T: sensitive to the phase transition in between!

👀 Reading hidden code
22.2 ms

A glimpse of Gauge Field Theory

  • from continuum to lattice

  • pure gauge theory

  • confinement

👀 Reading hidden code
318 μs

Z2 gauge theory in Julia

  • one of the simplest gauge theory, closely related to 3D (and above) Ising Model

👀 Reading hidden code
202 μs
Z2gauge (generic function with 3 methods)
function Z2gauge(beta, Ns = 20, dim = 4)

latt = ones(Int64, ntuple(i1 -> i1 <= dim ? Ns : dim, dim + 1))
links = CartesianIndices(latt)

function mvup(x::CartesianIndex, d::Int64)

local dim::Int64 = length(x)
i_tmp::Int64 = x[d] == Ns ? 1 : x[d] + 1
return CartesianIndex(ntuple(i1-> i1!=d ? x[i1] : i_tmp, dim))

end

function mvdown(x::CartesianIndex, d::Int64)
local dim::Int64 = length(x)
i_tmp::Int64 = x[d] == 1 ? Ns : x[d] - 1
return CartesianIndex(ntuple(i1-> i1!=d ? x[i1] : i_tmp, dim))
end

function coldstart()
latt .= 1
end

function randomstart()
latt .= rand([-1, 1])
end

function staplecal(link::CartesianIndex)::Int64

x = CartesianIndex(link.I[1:end-1])
d = link.I[end]

# following M. Creutz
# staples around link(1->4)
# dperp 6--5
# ^ | |
# | 1--4
# | | |
# -----> d 2--3

staplesum = 0
for dperp = 1:length(x)
if dperp != d

# plaquette 1234
x = mvdown(x, dperp)
linkA = latt[x, dperp]
linkA *= latt[x, d]
x = mvup(x, d)
linkA *= latt[x, dperp]
x = mvup(x, dperp)
# plaquette 4561
linkB = latt[x, dperp]
x = mvup(x, dperp)
x = mvdown(x, d)
linkB *= latt[x, d]
x = mvdown(x, dperp)
linkB *= latt[x, dperp]
staplesum += linkA + linkB

end
end
return staplesum
end

function sweep1!()
# heatbath

action = 0.0
for link in links

staplesum = staplecal(link)
# calculate the Boltzmann weight
bplus = exp(beta * staplesum * 1)
bplus /= (bplus + 1 / bplus)

# the heatbath algorithm
if rand() < bplus
latt[link] = 1
action += staplesum
else
latt[link] = -1
action -= staplesum
end
end

# return 1.0 - action / Ns^dim / dim / 6.0
end

function sweep!()
# metropolis

action = 0
for link in links
# Esite = staplecal(link)

# dE = -2 * (Const. - latt[link] * staplecal(link))
if rand() < exp(-beta * 2*latt[link] * staplecal(link))
latt[link] *= -1
end
end

# return 1.0 - action / Ns^dim / dim / 6.0
end

function update!(N = 40)
for i1 = 1:N
sweep!()
end
end

function plaqcal(x::CartesianIndex, d, dperp)::Int64

# compute plaq
#=
2-- link2 --x
link3 link1
0-- LINK --1
=#

if dperp != d
ret = latt[x, d]
x = mvup(x, d)
ret *= latt[x, dperp]
x = mvup(x, dperp)
x = mvdown(x, d)
ret *= latt[x, d]
x = mvdown(x, dperp)
ret *= latt[x, dperp]
else
ret = 0
end

return ret
end

function measure()

plaqval = 0
Eval = 0
for link in links
x = CartesianIndex(link.I[1:end-1])
d = link.I[end]

Eval += latt[link] * staplecal(link)
for dperp in 1:length(x)
if dperp > d
plaqval += plaqcal(x, d, dperp)
end
end
end

# per X
Npair = dim*(dim-1)/2
plaqval /= Ns^dim * Npair
Eval /= Ns^dim * dim * Npair
return plaqval, Eval
end

# stir well
update!(180)

plaq = 0.0
Eav = 0.0

Nm = 25
for i1 = 1:Nm
_p, _E = measure()
plaq += _p / Nm
Eav += _E / Nm
update!(10)
end
return plaq, Eav

end
👀 Reading hidden code
12.8 ms
plaq_exact (generic function with 2 methods)
function plaq_exact(beta, dim=4)
K = beta * 1.0
highB = exp(-2*4*exp(-4*(dim-1)*K))
lowB = tanh(K)
return lowB, highB
end
👀 Reading hidden code
546 μs
0.20.30.40.50.60.20.40.60.81.0
plaqlow betahigh betabetaZ2 gauge theory (4D)
let

dim = 4
betaC = 0.43
beta_arr = range(0.45*betaC, 1.5*betaC, length = 14)

obs = []
for beta in beta_arr
push!(obs, [beta, Z2gauge(beta, 10, dim)..., plaq_exact(beta, dim)...]')
end
obs = vcat(obs...)

for i1 in eachindex(obs[:, 1])
obs[i1, 4] = obs[i1, 1] < 1.3 * betaC ? obs[i1, 4] : Inf
obs[i1, 5] = obs[i1, 1] > 0.7 * betaC ? obs[i1, 5] : Inf
end
scatter(
obs[:,1], obs[:,2],
label="plaq",
xlabel="beta",
title="Z2 gauge theory (4D)"
)
plot!(obs[:, 1], obs[:, 4], label = "low beta", line = (dash = :dash), color = "blue")
plot!(obs[:, 1], obs[:, 5], label = "high beta", line = (dash = :dash), color = "red")

end
👀 Reading hidden code
18.8 s
0.20.40.60.81.00.20.40.60.81.0
plaqlow betahigh betabetaZ2 gauge theory (3D)
let

dim = 3
betaC = 0.755
beta_arr = range(0.3*betaC, 1.5*betaC, length = 20)

obs = []
for beta in beta_arr
push!(obs, [beta, Z2gauge(beta, 14, dim)..., plaq_exact(beta, dim)...]')
end
obs = vcat(obs...)

for i1 in eachindex(obs[:, 1])
obs[i1, 4] = obs[i1, 1] < 1.3 * betaC ? obs[i1, 4] : Inf
obs[i1, 5] = obs[i1, 1] > 0.7 * betaC ? obs[i1, 5] : Inf
end
scatter(
obs[:,1], obs[:,2],
label="plaq",
xlabel="beta",
title="Z2 gauge theory (3D)"
)
plot!(obs[:, 1], obs[:, 4], label = "low beta", line = (dash = :dash), color = "blue")
plot!(obs[:, 1], obs[:, 5], label = "high beta", line = (dash = :dash), color = "red")

end
👀 Reading hidden code
3.3 s

The Polyakov Loops and the Susceptibilities

  • An order parameter for Z(Nc) SSB

  • effective order parameter for deconfinement

  • order parameter is NOT Unique: SUS can also do the job! (and better)

Lx=x4U4(x4;x)

In the end, we will measure

L=1Ns3Lx

The Polyakov loop susceptibility is constructed via

χL=Ns3(L2L2).

Why do we need the factor of Ns3?

(we may need to multiply beta's for better rendering)

How to (re)normalize the Polyakov loop susceptiblity is a research topic!!

👀 Reading hidden code
488 μs
Z2gaugePL (generic function with 3 methods)
👀 Reading hidden code
17.3 ms
0.300.350.400.450.500.550.00.20.40.60.81.01.2
<L><|L|>susLsusAPML ansatzbetaZ2 gauge theory (4D)
let

dim = 4
betaC = 0.43
beta_arr = range(0.7*betaC, 1.3*betaC, length = 25)

obs = []
for beta in beta_arr
push!(obs, [beta, Z2gaugePL(beta, 10)...]')
end
obs = vcat(obs...)

plot(obs[:,1], obs[:,2], label="<L>", xlabel="beta",
title="Z2 gauge theory (4D)")
plot!(obs[:,1], obs[:,3], label="<|L|>")
scatter!(obs[:,1], obs[:,4], label="susL")
scatter!(obs[:,1], obs[:,5], label="susA")

_f(x) = x < betaC ? 1-2/pi : Inf
plot!(obs[:,1], _f, label="PML ansatz")

end
👀 Reading hidden code
93.9 s