Initial commit

This commit is contained in:
Ian Jauslin
2018-05-05 23:18:02 +00:00
commit 618f6b678a
19 changed files with 1714 additions and 0 deletions

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

@ -0,0 +1,15 @@
PROJECTNAME=nematic liquid crystal 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 "#ff00ff", 1 "#00ff00")
splot \

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

@ -0,0 +1,26 @@
#!/usr/bin/env python3
from math import *
import random
import sys
# number of Cl atoms
N=5
for i in range(N):
for j in range(N):
for k in range(N):
if ((i+j+k)%2==0):
color=1
size=1
else:
color=0
size=0.5
print("'++' u", end=" ")
print("("+str(1.5*i)+"+("+str(size)+")*cos($1)*sin($2))", end=":")
print("("+str(1.5*j)+"+("+str(size)+")*sin($1)*sin($2))", end=":")
print("("+str(1.5*k)+"+("+str(size)+")*cos($2))", end=":")
print("("+str(color)+")", end=" ")
print("with pm3d", end="")
if i<N**3-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,32 @@
PROJECTNAME=interaction
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
$(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,167 @@
#!/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)
# 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)
# 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)
# 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")
# 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)

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
}

BIN
figs/pyrite.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB