Kindfield
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Properties Friends Pages
plot_two_particle_states.py
Go to the documentation of this file.
1 import h5py
2 from pylab import *
3 from glob import glob
4 from sys import argv
5 import os
6 import os.path
7 import time
8 from argparse import ArgumentParser
9 from scipy.optimize import curve_fit
10 
11 def shifted_lennard_jones(x, epsilon, sigma, a):
12  return 4 * epsilon * ((sigma / (a + x))**12 - (sigma/(a + x))**6)
13 
14 parser = ArgumentParser()
15 parser.add_argument("states_files", nargs="+")
16 parser.add_argument("--id", default="tmp")
17 args = parser.parse_args()
18 
19 output_dir = os.path.abspath("tmp")
20 
21 if args.id != "tmp":
22  try:
23  from sumatra.projects import load_project
24  output_dir = os.path.join(os.path.abspath(load_project().data_store.root), args.id)
25  except ImportError:
26  pass
27 
28 states_files = args.states_files
29 if len(states_files) == 1:
30  states_files = glob(states_files[0])
31 
32 if not os.path.exists(output_dir):
33  os.makedirs(output_dir)
34 
35 output_file = os.path.join(output_dir, "two_particle_plot.pdf")
36 
37 energy_min = inf
38 energy_max = -inf
39 
40 energies = []
41 r12s = []
42 
43 for statesFile in states_files:
44  f = h5py.File(statesFile, "r")
45  atomsMeta = f.get("atomMeta")
46  energyOffset = atomsMeta.attrs["energyOffset"]
47  if len(atomsMeta) != 2:
48  raise Exception("Wrong number of atoms in atomsMeta. Found %d, should be 2." % len(atomsMeta))
49  states = f.get("/states")
50  for stateName in states:
51  atoms = states.get(stateName)
52  #r12 = atoms[1]["x"] - atoms[0]["x"]
53  #r13 = sqrt((atoms[2]["x"] - atoms[0]["x"])**2 + (atoms[2]["y"] - atoms[0]["y"])**2)
54  #angle = arctan2(atoms[2]["y"], atoms[2]["x"])
55  r12 = atoms.attrs["r12"]
56  energy = atoms.attrs["energy"]
57 
58  r12s.append(r12)
59  energies.append(energy)
60 
61  energy_min = min(energy_min, energy)
62  energy_max = max(energy_max, energy)
63  f.close()
64 
65 # Sort r12 and energies by r12
66 r12s, energies = [list(x) for x in zip(*sorted(zip(r12s, energies), key=lambda pair: pair[0]))]
67 
68 r12s = array(r12s)
69 energies = array(energies)
70 
71 diffs = abs(diff(energies) / diff(r12s))
72 
73 print "Plotting", len(r12s), "data points."
74 
75 grid()
76 #plot(r12s, energies - energyOffset)
77 plot(r12s, energies)
78 #popt,errs = curve_fit(shifted_lennard_jones, r12s, energies - energyOffset, p0=(0.01938786, 1.93348366, -0.65246251))
79 #plot(r12s, shifted_lennard_jones(r12s, *popt))
80 #plot(r12s[:-1], diffs)
81 #plot(r12s, 0.13*((1.41/r12s)**12 - 2*(1.41/r12s)**6) - 1.0)
82 xlabel(r"$r$")
83 ylabel(r"$E$")
84 savefig(output_file)
85 savefig(output_file + ".png")
86 
87 print "Results saved to", output_file