Initial commit

This commit is contained in:
Ian Jauslin
2018-04-07 07:16:28 +00:00
commit f2af89a0b6
26 changed files with 2331 additions and 0 deletions

15
figs/atoms.fig/Makefile Normal file
View File

@ -0,0 +1,15 @@
PROJECTNAME=crystal liquid gas nematic chiral
PNGS=$(addsuffix .png, $(PROJECTNAME))
all: $(PNGS)
$(PNGS):
cp $(patsubst %.png, %, $@)-base.gp $(patsubst %.png, %, $@).gp
python $(patsubst %.png, %, $@).py >> $(patsubst %.png, %, $@).gp
gnuplot $(patsubst %.png, %, $@).gp > $@
clean-aux:
rm -f $(addsuffix .gp, $(PROJECTNAME))
clean: clean-aux
rm -f $(PNGS)

View File

@ -0,0 +1,22 @@
set terminal pngcairo size 2048,2048
set key off
unset colorbox
unset border
unset xtics
unset ytics
unset ztics
set parametric
set view 80,10,1.5
set view equal xyz
set isosample 100
set pm3d depthorder
set pm3d lighting primary 0.50 specular 0.6
set palette defined (0 "#339999", 1 "#339999")
splot \

102
figs/atoms.fig/chiral.py Normal file
View File

@ -0,0 +1,102 @@
#!/usr/bin/env python3
from math import *
import random
import sys
# size of space
L=30
# number of lines
H=5
# heigh of lines
height=5
# number of rods per line
N=16
# aspect ratio
a=10
# spread in theta angle
spread_t=pi/60
# in phi
spread_p=pi/60
# in height
spread_h=1/120
# check whether two rods overlap
def check_overlap(rod1,rod2):
# relative placement
relative_pos=unrotate(subtract(rod2[0],rod1[0]), rod1[1])
if(abs(relative_pos[0])<2 and abs(relative_pos[1])<2 and abs(relative_pos[2])<2):
return(True)
# relative angle
relative_ang=cart_to_spherical(unrotate(spherical_to_cart(rod2[1]), rod1[1]))
# exclusion volume
# rotate other rod
relative_pos=unrotate(relative_pos, [0,relative_ang[1]])
#if(abs(relative_pos[1])<2 and abs(relative_pos[0])-2<abs(sin(relative_ang[0]))*a and abs(relative_pos[2])-a-2<abs(cos(relative_ang[0])*a)):
if(abs(relative_pos[1])<2 and abs(relative_pos[0])-2<abs(sin(relative_ang[0]))*a and abs(sin(relative_ang[0])*relative_pos[2]-cos(relative_ang[0])*relative_pos[0])-2<abs(sin(relative_ang[0])*a)):
return(True)
return(False)
# def subtract vectors
def subtract(x,y):
return([x[0]-y[0],x[1]-y[1],x[2]-y[2]])
# rotate vector
def unrotate(x,w):
ret=[x[0],x[1],x[2]]
# rotate phi
tmp=cos(w[1])*ret[0]+sin(w[1])*ret[1]
ret[1]=-sin(w[1])*ret[0]+cos(w[1])*ret[1]
ret[0]=tmp
# rotate theta
tmp=cos(w[0])*ret[0]-sin(w[0])*ret[2]
ret[2]=sin(w[0])*ret[0]+cos(w[0])*ret[2]
ret[0]=tmp
return(ret)
# convert coordinates
def spherical_to_cart(w):
return([cos(w[1])*sin(w[0]),sin(w[1])*sin(w[0]),cos(w[0])])
def cart_to_spherical(x):
w=[0,0]
w[0]=acos(x[2])
if(sin(w[0]==0)):
return([w[0],0])
c=x[0]/sin(w[0])
s=x[1]/sin(w[0])
# to avoid truncation errors
if(abs(c)>1 and abs(c)<1.0001):
if(c>0):
return([w[0],0])
else:
return([w[0],pi])
if(s>=0):
return([w[0],acos(c)])
return([w[0],2*pi-acos(c)])
# configuration
config=[]
# add rods
for h in range(H):
config_h=[]
while len(config_h)<N:
# random position and angles
x=[random.uniform(0,L), random.uniform(0,L), random.gauss(h*height,spread_h)]
w=[abs(random.gauss(pi/2,spread_t)), random.gauss(pi/2*(1-h/(H-1)),spread_p)]
# chek it does not interfere with other rods
fine=True
for rod in config+config_h:
if(check_overlap(rod,[x,w])):
fine=False
break
if fine:
config_h.append([x,w])
config=config+config_h
for i in range(len(config)):
rod=config[i]
print(str(rod[0][0])+"+("+str(cos(rod[1][1])*cos(rod[1][0]))+")*cos(u)*sin(v)+("+str(-sin(rod[1][1]))+")*sin(u)*sin(v)+("+str(cos(rod[1][1])*sin(rod[1][0])*a)+")*cos(v)", end=", ")
print(str(rod[0][1])+"+("+str(sin(rod[1][1])*cos(rod[1][0]))+")*cos(u)*sin(v)+("+str(cos(rod[1][1]))+")*sin(u)*sin(v)+("+str(sin(rod[1][1])*sin(rod[1][0])*a)+")*cos(v)", end=", ")
print(str(rod[0][2])+"+("+str(-sin(rod[1][0]))+")*cos(u)*sin(v)+("+str(cos(rod[1][0])*a)+")*cos(v)", end=" ")
print("with pm3d", end="")
if i<len(config)-1:
print(", \\")

View File

@ -0,0 +1,21 @@
set terminal pngcairo size 2048,2048
set key off
unset colorbox
unset border
unset xtics
unset ytics
unset ztics
set parametric
set view equal xyz
set isosample 100
set pm3d depthorder
set pm3d lighting primary 0.50 specular 0.6
set palette defined (0 "#339999", 1"#339999")
splot \

24
figs/atoms.fig/crystal.py Normal file
View File

@ -0,0 +1,24 @@
#!/usr/bin/env python3
from math import *
import random
import sys
# size of lattice
N=5
# configuration
config=[]
for i in range(N):
for j in range(N):
for k in range(N):
config.append([2*i+((j+k)%2),sqrt(3)*(j+(k%2)/3),2*sqrt(6)/3*k])
for i in range(len(config)):
print(str(config[i][0])+"+cos(u)*sin(v)", end=",")
print(str(config[i][1])+"+sin(u)*sin(v)", end=",")
print(str(config[i][2])+"+cos(v)", end=" ")
print("with pm3d", end="")
if i<len(config)-1:
print(", \\")

View File

@ -0,0 +1,21 @@
set terminal pngcairo size 2048,2048
set key off
unset colorbox
unset border
unset xtics
unset ytics
unset ztics
set parametric
set view equal xyz
set isosample 100
set pm3d depthorder
set pm3d lighting primary 0.5 specular 0.6
set palette defined (0 "#339999", 1"#339999")
splot \

39
figs/atoms.fig/gas.py Normal file
View File

@ -0,0 +1,39 @@
#!/usr/bin/env python3
from math import *
import random
# size of space
L=15
# number of particles
N=6
# check whether two rods overlap
def check_overlap(sphere1,sphere2):
if(sqrt((sphere2[0]-sphere1[0])**2+(sphere2[1]-sphere1[1])**2+(sphere2[2]-sphere1[2])**2)<2):
return(True)
return(False)
# configuration
config=[]
# add spheres
while len(config)<N:
# random position
x=[random.uniform(0,L), random.uniform(0,L), random.uniform(0,L)]
# check it does not interfere with other spheres
fine=True
for sphere in config:
if(check_overlap(sphere,x)):
fine=False
break
if fine:
config.append(x)
for i in range(len(config)):
sphere=config[i]
print(str(sphere[0])+"+cos(u)*sin(v)", end=", ")
print(str(sphere[1])+"+sin(u)*sin(v)", end=", ")
print(str(sphere[2])+"+cos(v)", end=" ")
print("with pm3d", end="")
if i<len(config)-1:
print(", \\")

View File

@ -0,0 +1,21 @@
set terminal pngcairo size 2048,2048
set key off
unset colorbox
unset border
unset xtics
unset ytics
unset ztics
set parametric
set view equal xyz
set isosample 100
set pm3d depthorder
set pm3d lighting primary 0.50 specular 0.6
set palette defined (0 "#339999", 1"#339999")
splot \

39
figs/atoms.fig/liquid.py Normal file
View File

@ -0,0 +1,39 @@
#!/usr/bin/env python3
from math import *
import random
# size of space
L=15
# number of particles
N=100
# check whether two rods overlap
def check_overlap(sphere1,sphere2):
if(sqrt((sphere2[0]-sphere1[0])**2+(sphere2[1]-sphere1[1])**2+(sphere2[2]-sphere1[2])**2)<2):
return(True)
return(False)
# configuration
config=[]
# add spheres
while len(config)<N:
# random position
x=[random.uniform(0,L), random.uniform(0,L), random.uniform(0,L)]
# check it does not interfere with other spheres
fine=True
for sphere in config:
if(check_overlap(sphere,x)):
fine=False
break
if fine:
config.append(x)
for i in range(len(config)):
sphere=config[i]
print(str(sphere[0])+"+cos(u)*sin(v)", end=", ")
print(str(sphere[1])+"+sin(u)*sin(v)", end=", ")
print(str(sphere[2])+"+cos(v)", end=" ")
print("with pm3d", end="")
if i<len(config)-1:
print(", \\")

View File

@ -0,0 +1,21 @@
set terminal pngcairo size 2048,2048
set key off
unset colorbox
unset border
unset xtics
unset ytics
unset ztics
set parametric
set view equal xyz
set isosample 100
set pm3d depthorder
set pm3d lighting primary 0.50 specular 0.6
set palette defined (0 "#339999", 1 "#339999")
splot \

90
figs/atoms.fig/nematic.py Normal file
View File

@ -0,0 +1,90 @@
#!/usr/bin/env python3
from math import *
import random
# size of space
L=30
# number of rods
N=75
# aspect ratio
a=10
# spread in theta angle
spread=pi/30
# check whether two rods overlap
def check_overlap(rod1,rod2):
# relative placement
relative_pos=unrotate(subtract(rod2[0],rod1[0]), rod1[1])
if(abs(relative_pos[0])<2 and abs(relative_pos[1])<2 and abs(relative_pos[2])<2):
return(True)
# relative angle
relative_ang=cart_to_spherical(unrotate(spherical_to_cart(rod2[1]), rod1[1]))
# exclusion volume
# rotate other rod
relative_pos=unrotate(relative_pos, [0,relative_ang[1]])
#if(abs(relative_pos[1])<2 and abs(relative_pos[0])-2<abs(sin(relative_ang[0]))*a and abs(relative_pos[2])-a-2<abs(cos(relative_ang[0])*a)):
if(abs(relative_pos[1])<2 and abs(relative_pos[0])-2<abs(sin(relative_ang[0]))*a and abs(sin(relative_ang[0])*relative_pos[2]-cos(relative_ang[0])*relative_pos[0])-2<abs(sin(relative_ang[0])*a)):
return(True)
return(False)
# def subtract vectors
def subtract(x,y):
return([x[0]-y[0],x[1]-y[1],x[2]-y[2]])
# rotate vector
def unrotate(x,w):
ret=[x[0],x[1],x[2]]
# rotate phi
tmp=cos(w[1])*ret[0]+sin(w[1])*ret[1]
ret[1]=-sin(w[1])*ret[0]+cos(w[1])*ret[1]
ret[0]=tmp
# rotate theta
tmp=cos(w[0])*ret[0]-sin(w[0])*ret[2]
ret[2]=sin(w[0])*ret[0]+cos(w[0])*ret[2]
ret[0]=tmp
return(ret)
# convert coordinates
def spherical_to_cart(w):
return([cos(w[1])*sin(w[0]),sin(w[1])*sin(w[0]),cos(w[0])])
def cart_to_spherical(x):
w=[0,0]
w[0]=acos(x[2])
if(sin(w[0]==0)):
return([w[0],0])
c=x[0]/sin(w[0])
s=x[1]/sin(w[0])
# to avoid truncation errors
if(abs(c)>1 and abs(c)<1.0001):
if(c>0):
return([w[0],0])
else:
return([w[0],pi])
if(s>=0):
return([w[0],acos(c)])
return([w[0],2*pi-acos(c)])
# configuration
config=[]
# add rods
while len(config)<N:
# random position and angles
x=[random.uniform(0,L), random.uniform(0,L), random.uniform(0,L)]
w=[abs(random.gauss(0,spread)), random.uniform(0,2*pi)]
# chek it does not interfere with other rods
fine=True
for rod in config:
if(check_overlap(rod,[x,w])):
fine=False
break
if fine:
config.append([x,w])
for i in range(len(config)):
rod=config[i]
print(str(rod[0][0])+"+("+str(cos(rod[1][1])*cos(rod[1][0]))+")*cos(u)*sin(v)+("+str(-sin(rod[1][1]))+")*sin(u)*sin(v)+("+str(cos(rod[1][1])*sin(rod[1][0])*a)+")*cos(v)", end=", ")
print(str(rod[0][1])+"+("+str(sin(rod[1][1])*cos(rod[1][0]))+")*cos(u)*sin(v)+("+str(cos(rod[1][1]))+")*sin(u)*sin(v)+("+str(sin(rod[1][1])*sin(rod[1][0])*a)+")*cos(v)", end=", ")
print(str(rod[0][2])+"+("+str(-sin(rod[1][0]))+")*cos(u)*sin(v)+("+str(cos(rod[1][0])*a)+")*cos(v)", end=" ")
print("with pm3d", end="")
if i<len(config)-1:
print(", \\")

View File

@ -0,0 +1,38 @@
PROJECTNAME=interaction boundary dimer_contour
LIBS=$(notdir $(wildcard libs/*))
PDFS=$(addsuffix .pdf, $(PROJECTNAME))
SOURCES=$(addsuffix .tikz.tex, $(PROJECTNAME))
all: $(PDFS)
$(PDFS): $(SOURCES) $(LIBS)
echo $(LIBS)
pdflatex -jobname $(basename $@) -file-line-error $(patsubst %.pdf, %.tikz.tex, $@)
$(SOURCES):
python3 dimer_conf.py
install: $(PDFS)
cp $^ $(INSTALLDIR)/
install-sources: $(SOURCES)
cp $^ $(INSTALLDIR)/
$(LIBS):
ln -fs libs/$@ ./
clean-libs:
rm -f $(LIBS)
clean-aux:
rm -f $(addsuffix .aux, $(PROJECTNAME))
rm -f $(addsuffix .log, $(PROJECTNAME))
clean-tex:
rm -f $(PDFS)
clean-sources:
rm -f $(SOURCES)
clean: clean-libs clean-aux clean-tex clean-sources

View File

@ -0,0 +1,261 @@
#!/usr/bin/env python3
import random
from math import *
# size of the grid
L=24
# boundary thickness (must be even)
l0=4
# activity and interaction
z=3
J=5
# draw random dimers in a select area
def fill_dimers(mask,direction):
if(direction=="h"):
d=[1,0]
else:
d=[0,1]
dimers=[]
# keep track of which sites are occupied
occupied=[]
for i in range(L):
occupied.append([])
for j in range(L):
occupied[i].append(0)
for i in range(10000):
# pick a random edge (indexed by its lower-left corner)
e=None
while(e==None or e[0]+d[0]>=L or e[1]+d[1]>=L or mask[e[0]][e[1]]==0 or mask[e[0]+d[0]][e[1]+d[1]]==0):
e=[random.randint(0,L-1),random.randint(0,L-1)]
# check whether a dimer can be added to the edge
if(occupied[e[0]][e[1]]==0 and occupied[e[0]+d[0]][e[1]+d[1]]==0):
# number of interactions
interactions=0
if(e[0]+2*d[0]<L and e[1]+2*d[1]<L and occupied[e[0]+2*d[0]][e[1]+2*d[1]]==1):
interactions=interactions+1
if(e[0]-d[0]>=0 and e[1]-d[1]>=0 and occupied[e[0]-d[0]][e[1]-d[1]]==1):
interactions=interactions+1
# probability of adding the dimer
p=1/(1+1/z*exp(-J*interactions))
if(p>random.random()):
# add dimer
dimers.append(e)
occupied[e[0]][e[1]]=1
occupied[e[0]+d[0]][e[1]+d[1]]=1
return(dimers)
# find interactions
def interactions(dimers,direction):
if(direction=="h"):
d=[1,0]
else:
d=[0,1]
out=[]
for d1 in dimers:
for d2 in dimers:
if(d1[0]-d2[0]==2*d[0] and d1[1]-d2[1]==2*d[1]):
out.append([d2[0]+d[0],d2[1]+d[1]])
return(out)
# find interactions with boundary
def boundary_interactions(dimers,rho):
out=[]
for d in dimers:
for v in rho:
if(d[0]==v[0] and d[1]==v[1]):
out.append([d[0],d[1]-1])
elif(d[0]==v[0] and d[1]==v[1]-1):
out.append([d[0],d[1]+1])
return(out)
# draw dimers
def draw_dimers(v_dimers,h_dimers,file_desc,color):
for d in v_dimers:
print("\\dimer{[color="+color+"]("+str(d[0])+","+str(d[1])+")}v", file=file_desc)
print("", file=file_desc)
for d in h_dimers:
print("\\dimer{[color="+color+"]("+str(d[0])+","+str(d[1])+")}h", file=file_desc)
print("", file=file_desc)
# draw interactions
def draw_interactions(v_interactions,h_interactions,file_desc):
for d in v_interactions:
print("\\interaction{("+str(d[0])+","+str(d[1])+")}v", file=file_desc)
print("", file=file_desc)
for d in h_interactions:
print("\\interaction{("+str(d[0])+","+str(d[1])+")}h", file=file_desc)
print("", file=file_desc)
# draw loops
def draw_loops(loops,file_desc,color):
for loop in loops:
print("\\draw[color="+color+", line width=3pt]",end="",file=file_desc)
for e in loop:
print("("+str(e[0])+","+str(e[1])+")--",end="",file=file_desc)
print("cycle;",file=file_desc)
# init tikz file
def init_tikz(filename):
file_desc=open(filename,"w")
print("\\documentclass{standalone}\n\n\\usepackage{tikz}\n\\usepackage{dimer}\n\\usetikzlibrary{decorations.pathmorphing}\n\n\\begin{document}\n\\begin{tikzpicture}\n\n", file=file_desc)
return(file_desc)
# close tikz file
def close_tikz(file_desc):
print("\\end{tikzpicture}\n\\end{document}", file=file_desc)
file_desc.close()
mu=int(L/2)
# loops
loop1=[]
for i in range(0,2*l0):
loop1.append([mu-l0+i,mu+4.5])
for i in range(0,4):
loop1.append([mu+l0-1+0.5,mu+4-i])
for i in range(0,l0):
loop1.append([mu+l0+i,mu+0.5])
for i in range(0,6):
loop1.append([mu+2*l0-1+0.5,mu-i])
for i in range(0,4*l0):
loop1.append([mu+2*l0-1-i,mu-5.5])
for i in range(0,6):
loop1.append([mu-2*l0-0.5,mu-5+i])
for i in range(0,l0):
loop1.append([mu-2*l0+i,mu+0.5])
for i in range(0,4):
loop1.append([mu-l0-0.5,mu+1+i])
# core of loop1
core_loop1=[]
for i in range(0,2*l0-4):
core_loop1.append([mu-l0+2+i,mu+3.5])
for i in range(0,3):
core_loop1.append([mu+l0-3+0.5,mu+3-i])
core_loop1.append([mu+l0-2,mu+0.5])
core_loop1.append([mu+l0-1,mu+0.5])
for i in range(0,l0-2):
core_loop1.append([mu+l0+i,mu-1+0.5])
for i in range(0,4):
core_loop1.append([mu+2*l0-3+0.5,mu-1-i])
for i in range(0,4*l0-4):
core_loop1.append([mu+2*l0-3-i,mu-4.5])
for i in range(0,4):
core_loop1.append([mu-2*l0+2-0.5,mu-4+i])
for i in range(0,l0-2):
core_loop1.append([mu-2*l0+2+i,mu-1+0.5])
core_loop1.append([mu-l0,mu+0.5])
core_loop1.append([mu-l0+1,mu+0.5])
for i in range(0,3):
core_loop1.append([mu-l0+2-0.5,mu+1+i])
loop2=[[mu-1,mu+2.5],[mu-0.5,mu+2],[mu-0.5,mu+1],[mu-1,mu+0.5],[mu-1.5,mu+1],[mu-1.5,mu+2]]
loop3=[[mu-1,mu-1.5],[mu,mu-1.5],[mu+0.5,mu-2],[mu+0.5,mu-3],[mu,mu-3.5],[mu-1,mu-3.5],[mu-1.5,mu-3],[mu-1.5,mu-2]]
loops=[loop1,loop2,loop3]
# masks
# init
v_mask=[]
h_mask=[]
for i in range(L):
v_mask.append([])
h_mask.append([])
for j in range(L):
v_mask[i].append(1)
h_mask[i].append(0)
# draw masks
for i in range(mu-l0,mu+l0):
for j in range(mu+1,mu+5):
v_mask[i][j]=0
for i in range(mu-2*l0,mu+2*l0):
for j in range(mu-5,mu+1):
v_mask[i][j]=0
for i in range(mu-l0+2,mu+l0-2):
for j in range(mu+1,mu+4):
h_mask[i][j]=1
for i in range(mu-l0,mu+l0):
h_mask[i][mu]=1
for i in range(mu-2*l0+2,mu+2*l0-2):
for j in range(mu-4,mu):
h_mask[i][j]=1
h_mask[mu-1][mu+1]=0
h_mask[mu-1][mu+2]=0
h_mask[mu-1][mu-3]=0
h_mask[mu-1][mu-2]=0
h_mask[mu][mu-3]=0
h_mask[mu][mu-2]=0
# random dimers in mask
v_dimers=fill_dimers(v_mask,"v")
h_dimers=fill_dimers(h_mask,"h")
# mantle dimers
h_mantle=[]
for i in range(0,l0):
h_mantle.append([mu-l0+2*i,mu+4])
for i in range(0,4):
h_mantle.append([mu+l0-2,mu+4-i])
h_mantle.append([mu-l0,mu+4-i])
for i in range(0,int(l0/2)):
h_mantle.append([mu+l0+2*i,mu])
h_mantle.append([mu-l0-2-2*i,mu])
for i in range(0,5):
h_mantle.append([mu+2*l0-2,mu-i])
h_mantle.append([mu-2*l0,mu-i])
for i in range(0,2*l0):
h_mantle.append([mu-2*l0+2*i,mu-5])
v_mantle=[]
v_mantle.append([mu-1,mu+1])
v_mantle.append([mu-1,mu-3])
v_mantle.append([mu,mu-3])
# interactions
v_interactions=interactions(v_dimers+v_mantle,"v")
h_interactions=interactions(h_dimers+h_mantle,"h")
# magnetized part of the boundary
rho=[]
for i in range(0,L):
if(random.randint(0,1)==0):
rho.append([i,0])
if(random.randint(0,1)==0):
rho.append([i,L-1])
# files
interaction=init_tikz("interaction.tikz.tex")
print("\\grid{"+str(L-1)+"}{"+str(L-1)+"}{(0,0)}\n", file=interaction)
draw_interactions(v_interactions,h_interactions,interaction)
draw_dimers(v_dimers+v_mantle,h_dimers+h_mantle,interaction,"black")
close_tikz(interaction)
boundary=init_tikz("boundary.tikz.tex")
print("\\fill[color=cyan](-0.5,-0.5)--++("+str(L)+",0)--++(0,"+str(l0)+")--++("+str(-L)+",0)--cycle;", file=boundary)
print("\\fill[color=cyan](-0.5,"+str(L-l0-0.5)+")--++("+str(L)+",0)--++(0,"+str(l0)+")--++("+str(-L)+",0)--cycle;", file=boundary)
print("", file=boundary)
print("\\grid{"+str(L-1)+"}{"+str(L-1)+"}{(0,0)}\n", file=boundary)
draw_dimers(v_dimers+v_mantle,h_dimers+h_mantle,boundary,"black")
close_tikz(boundary)
contour=init_tikz("dimer_contour.tikz.tex")
print("\\grid{"+str(L-1)+"}{"+str(L-1)+"}{(0,0)}\n", file=contour)
draw_loops([loop1,loop2,loop3],contour,"blue")
draw_interactions(v_interactions,h_interactions,contour)
draw_dimers(v_dimers,h_dimers,contour,"black")
draw_dimers(v_mantle,h_mantle,contour,"black")
close_tikz(contour)

View File

@ -0,0 +1 @@
../../libs/dimer.sty

25
figs/libs/Makefile Normal file
View File

@ -0,0 +1,25 @@
PROJECTNAME=$(basename $(basename $(wildcard *.tikz.tex)))
LIBS=$(notdir $(wildcard libs/*))
PDFS=$(addsuffix .pdf, $(PROJECTNAME))
all: $(PDFS)
$(PDFS): $(LIBS)
echo $(LIBS)
pdflatex -jobname $(basename $@) -file-line-error $(patsubst %.pdf, %.tikz.tex, $@)
$(LIBS):
ln -fs libs/$@ ./
clean-libs:
rm -f $(LIBS)
clean-aux:
rm -f $(addsuffix .aux, $(PROJECTNAME))
rm -f $(addsuffix .log, $(PROJECTNAME))
clean-tex:
rm -f $(PDFS)
clean: clean-libs clean-aux clean-tex

33
figs/libs/dimer.sty Normal file
View File

@ -0,0 +1,33 @@
% square lattice (width #1, height #2, origin #3)
\def\grid#1#2#3{
\foreach\i in {0,...,#2}{
\draw#3++(0,\i)--++(#1,0);
}
\foreach\i in {0,...,#1}{
\draw#3++(\i,0)--++(0,#2);
}
}
% dimer (bottom-left vertex #1, vertical or horizontal #2)
\def\dimer#1#2{
\if#2h
\draw[line width=5pt]#1--++(1,0);
\fill#1circle(7pt);
\fill#1++(1,0)circle(7pt);
\else
\draw[line width=5pt]#1--++(0,1);
\fill#1circle(7pt);
\fill#1++(0,1)circle(7pt);
\fi
}
% interactions (bottom-left vertex #1, vertical or horizontal #2)
\def\interaction#1#2{
\if#2h
\draw[line width=5pt, color=white]#1--++(1,0);
\draw[line width=4pt, decorate, decoration={snake}, color=red]#1--++(1,0);
\else
\draw[line width=5pt, color=white]#1--++(0,1);
\draw[line width=4pt, decorate, decoration={snake}, color=red]#1--++(0,1);
\fi
}

View File

@ -0,0 +1 @@
../libs/Makefile

View File

@ -0,0 +1 @@
../../libs/dimer.sty

View File

@ -0,0 +1,132 @@
\documentclass{standalone}
\usepackage{tikz}
\usepackage{dimer}
\begin{document}
\begin{tikzpicture}
%% mantles
% blue
\fill[color=blue](2,6.5)--++(13,0)--++(0.5,0.5)--++(0,8)--++(-0.5,0.5)--++(-13,0)--++(-0.5,-0.5)--++(0,-8)--cycle;
\fill[color=white](4,7.5)--++(9,0)--++(0.5,0.5)--++(0,6)--++(-0.5,0.5)--++(-9,0)--++(-0.5,-0.5)--++(0,-6)--cycle;
% red
\fill[color=red](6,8.5)--++(4,0)--++(0.5,0.5)--++(0,5)--++(-0.5,0.5)--++(-4,0)--++(-0.5,-0.5)--++(0,-5)--cycle;
\fill[color=white](7,10.5)--++(2,0)--++(0.5,0.5)--++(0,1)--++(-0.5,0.5)--++(-2,0)--++(-0.5,-0.5)--++(0,-1)--cycle;
% teal
\fill[color=teal](9,19.5)--++(9,0)--++(0.5,-0.5)--++(0,-10)--++(0.5,-0.5)--++(15,0)--++(0.5,0.5)--++(0,22)--++(-0.5,0.5)--++(-25,0)--++(-0.5,-0.5)--++(0,-11)--cycle;
\fill[color=white](11,20.5)--++(7,0)--++(0.5,-0.5)--++(0.5,-0.5)--++(1,0)--++(0.5,-0.5)--++(0,-9)--++(0.5,-0.5)--++(11,0)--++(0.5,0.5)--++(0,20)--++(-0.5,0.5)--++(-21,0)--++(-0.5,-0.5)--++(0,-9)--cycle;
% magenta
\fill[color=magenta](13,21.5)--++(18,0)--++(0.5,0.5)--++(0,7)--++(-0.5,0.5)--++(-18,0)--++(-0.5,-0.5)--++(0,-7)--cycle;
\fill[color=white](14,23.5)--++(16,0)--++(0.5,0.5)--++(0,3)--++(-0.5,0.5)--++(-16,0)--++(-0.5,-0.5)--++(0,-3)--cycle;
% cyan
\fill[color=cyan](23,11.5)--++(7,0)--++(0.5,0.5)--++(0,5)--++(-0.5,0.5)--++(-7,0)--++(-0.5,-0.5)--++(0,-5)--cycle;
\fill[color=white](24,13.5)--++(5,0)--++(0.5,0.5)--++(0,1)--++(-0.5,0.5)--++(-5,0)--++(-0.5,-0.5)--++(0,-1)--cycle;
% orange
\fill[color=orange](15,23.5)--++(5,0)--++(0.5,0.5)--++(0,3)--++(-0.5,0.5)--++(-5,0)--++(-0.5,-0.5)--++(0,-3)--cycle;
\fill[color=white](17,24.5)--++(1,0)--++(0.5,0.5)--++(0,1)--++(-0.5,0.5)--++(-1,0)--++(-0.5,-0.5)--++(0,-1)--cycle;
% green
\fill[color=green](23,24.5)--++(3,0)--++(0.5,0.5)--++(0,1)--++(-0.5,0.5)--++(-3,0)--++(-0.5,-0.5)--++(0,-1)--cycle;
%% segments
\foreach \i in {0,...,1}{
\draw[color=gray, line width=15pt](\i,-0.5)--++(0,37);
}
\foreach \i in {2,...,8}{
\draw[color=gray, line width=15pt](\i,-0.5)--++(0,7);
\draw[color=gray, line width=15pt](\i,15.5)--++(0,21);
}
\foreach \i in {9,...,15}{
\draw[color=gray, line width=15pt](\i,-0.5)--++(0,7);
\draw[color=gray, line width=15pt](\i,15.5)--++(0,4);
\draw[color=gray, line width=15pt](\i,31.5)--++(0,5);
}
\foreach \i in {16,...,18}{
\draw[color=gray, line width=15pt](\i,-0.5)--++(0,20);
\draw[color=gray, line width=15pt](\i,31.5)--++(0,5);
}
\foreach \i in {19,...,34}{
\draw[color=gray, line width=15pt](\i,-0.5)--++(0,9);
\draw[color=gray, line width=15pt](\i,31.5)--++(0,5);
}
\foreach \i in {35,...,36}{
\draw[color=gray, line width=15pt](\i,-0.5)--++(0,37);
}
\draw[color=blue, line width=15pt](3.5,8)--++(10,0);
\foreach \i in {9,...,14}{
\draw[color=blue, line width=15pt](3.5,\i)--++(2,0);
\draw[color=blue, line width=15pt](10.5,\i)--++(3,0);
}
\foreach \i in {7,...,9}{
\draw[color=red, line width=15pt](\i,10.5)--++(0,2);
}
\foreach \i in {10,...,11}{
\draw[color=teal, line width=15pt](20.5,\i)--++(12,0);
}
\foreach \i in {12,...,17}{
\draw[color=teal, line width=15pt](20.5,\i)--++(2,0);
\draw[color=teal, line width=15pt](30.5,\i)--++(2,0);
}
\foreach \i in {18,...,19}{
\draw[color=teal, line width=15pt](20.5,\i)--++(12,0);
}
\draw[color=teal, line width=15pt](18.5,20)--++(14,0);
\draw[color=teal, line width=15pt](10.5,21)--++(22,0);
\foreach \i in {22,...,29}{
\draw[color=teal, line width=15pt](10.5,\i)--++(2,0);
\draw[color=teal, line width=15pt](31.5,\i)--++(1,0);
}
\draw[color=teal, line width=15pt](10.5,30)--++(22,0);
\foreach \i in {24,...,29}{
\draw[color=cyan, line width=15pt](\i,13.5)--++(0,2);
}
\draw[color=magenta, line width=15pt](14,23.5)--++(0,4);
\foreach \i in {21,...,22}{
\draw[color=magenta, line width=15pt](\i,23.5)--++(0,4);
}
\foreach \i in {23,...,26}{
\draw[color=magenta, line width=15pt](\i,23.5)--++(0,1);
\draw[color=magenta, line width=15pt](\i,26.5)--++(0,1);
}
\foreach \i in {27,...,30}{
\draw[color=magenta, line width=15pt](\i,23.5)--++(0,4);
}
\foreach \i in {25,...,26}{
\draw[color=orange, line width=15pt](16.5,\i)--++(2,0);
}
%% grid
\grid{36}{36}{[color=lightgray](0,0)}
%% loops
% blue
\draw[color=black, line width=5pt](2,6.5)--++(13,0)--++(0.5,0.5)--++(0,8)--++(-0.5,0.5)--++(-13,0)--++(-0.5,-0.5)--++(0,-8)--cycle;
% red
\draw[color=black, line width=5pt](6,8.5)--++(4,0)--++(0.5,0.5)--++(0,5)--++(-0.5,0.5)--++(-4,0)--++(-0.5,-0.5)--++(0,-5)--cycle;
% teal
\draw[color=black, line width=5pt](9,19.5)--++(9,0)--++(0.5,-0.5)--++(0,-10)--++(0.5,-0.5)--++(15,0)--++(0.5,0.5)--++(0,22)--++(-0.5,0.5)--++(-25,0)--++(-0.5,-0.5)--++(0,-11)--cycle;
% magenta
\draw[color=black, line width=5pt](13,21.5)--++(18,0)--++(0.5,0.5)--++(0,7)--++(-0.5,0.5)--++(-18,0)--++(-0.5,-0.5)--++(0,-7)--cycle;
% cyan
\draw[color=black, line width=5pt](23,11.5)--++(7,0)--++(0.5,0.5)--++(0,5)--++(-0.5,0.5)--++(-7,0)--++(-0.5,-0.5)--++(0,-5)--cycle;
% orange
\draw[color=black, line width=5pt](15,23.5)--++(5,0)--++(0.5,0.5)--++(0,3)--++(-0.5,0.5)--++(-5,0)--++(-0.5,-0.5)--++(0,-3)--cycle;
%green
\draw[color=black, line width=5pt](23,24.5)--++(3,0)--++(0.5,0.5)--++(0,1)--++(-0.5,0.5)--++(-3,0)--++(-0.5,-0.5)--++(0,-1)--cycle;
\end{tikzpicture}
\end{document}