Ian Jauslin
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Jauslin <jauslin@ias.edu>2018-04-04 06:21:21 +0000
committerIan Jauslin <jauslin@ias.edu>2018-04-04 06:21:21 +0000
commitf950c74e38d120e42637983d504f85843a63e95d (patch)
treeeb2ded33fc156da7adaf096c3816432b4262c8d4 /figs/nematic.fig
As presented at Princeton University on 2018-04-04HEADv1.0master
Diffstat (limited to 'figs/nematic.fig')
-rw-r--r--figs/nematic.fig/Makefile15
-rw-r--r--figs/nematic.fig/nematic-base.gp21
-rw-r--r--figs/nematic.fig/nematic.py90
3 files changed, 126 insertions, 0 deletions
diff --git a/figs/nematic.fig/Makefile b/figs/nematic.fig/Makefile
new file mode 100644
index 0000000..8e8462f
--- /dev/null
+++ b/figs/nematic.fig/Makefile
@@ -0,0 +1,15 @@
+PROJECTNAME=nematic
+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)
diff --git a/figs/nematic.fig/nematic-base.gp b/figs/nematic.fig/nematic-base.gp
new file mode 100644
index 0000000..4de0ee2
--- /dev/null
+++ b/figs/nematic.fig/nematic-base.gp
@@ -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 \
diff --git a/figs/nematic.fig/nematic.py b/figs/nematic.fig/nematic.py
new file mode 100644
index 0000000..5c779c0
--- /dev/null
+++ b/figs/nematic.fig/nematic.py
@@ -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(", \\")