Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import matplotlib.pyplot as plt
- import argparse, os, sys
- import numpy as np
- from scipy.misc import factorial2
- parser = argparse.ArgumentParser(description="Plot Basis Sets")
- parser.add_argument("-a", "--atom", type=str, dest="atom", help="atom set to plot", default="H")
- parser.add_argument("-b", "--bases", type=str, nargs="+", dest="bases", help="basis sets to plot, maximum of four", default=["3-21G"])
- parser.add_argument("-l", "--list", action='store_true', dest="list", help="list available basis sets", default=False)
- parser.add_argument("--lmax", type=int, dest="l_max", help="Only plot up to a maximum l", default=-1)
- parser.add_argument("--lmin", type=int, dest="l_min", help="Only plot above a minimum l", default=-1)
- parser.add_argument("-gs", action='store_true', dest="gs", help="Plot a comparison between a GTO and an STO")
- parser.add_argument("-r", "--rrange", type=float, nargs=2, dest="r", help="limits for r", default=[-4, 4])
- parser.add_argument("-pub", action="store_true", dest="pub")
- parser.add_argument("--inset", action='store_true', dest="inset", help="Add an axes zoom inset")
- parser.add_argument("--inset-extent", type=float, nargs=4, dest="inset_extent", help="Axes limits for the zoomed plot", default=[None, None, None, None])
- parser.add_argument("--inset-loc", type=int, dest="inset_loc", help="Axes inset location", default=1)
- parser.add_argument("--inset-zoom", type=int, dest="inset_zoom", help="Axes inset zoom", default=1)
- parser.add_argument("--inset-aspect", type=float, dest="inset_aspect", help="Alter the inset's aspect ratio. A larger number will widen the inset axes", default=1)
- args = parser.parse_args()
- atom_names = {"H":"Hydrogen", "He":"Helium", "Li":"Lithium", "Be":"Beryllium", "B":"Boron", "C":"Carbon", "N":"Nitrogen", "O":"Oxygen", "F":"Fluorine", "Ne":"Neon", "Na":"Sodium", "Mg":"Magnesium", "Al":"Aluminum", "Si":"Silicon", "P":"Phosphorous", "S":"Sulfur", "Cl":"Chlorine", "Ar":"Argon", "K":"Potassium", "Ca":"Calcium", "Sc":"Scandium", "Ti":"Titanium", "V":"Vanadium", "Cr":"Chromium", "Mn":"Manganese", "Fe":"Iron", "Co":"Cobalt", "Ni":"Nickel", "Cu":"Copper", "Zn":"Zinc", "Ga":"Gallium", "Ge":"Germanium", "As":"Arsenic", "Se":"Selenium", "Br":"Bromine", "Kr":"Krypton", "Rb":"Rubidium", "Sr":"Strontium", "Y":"Yttrium", "Zr":"Zirconium", "Nb":"Niobium", "Mo":"Molybdenum", "Tc":"Technetium", "Ru":"Ruthenium", "Rh":"Rhodium", "Pd":"Palladium", "Ag":"Silver", "Cd":"Cadmium", "In":"Indium", "Sn":"Tin", "Sb":"Antimony", "Te":"Tellurium", "I":"Iodine", "Xe":"Xenon", "Cs":"Cesium", "Ba":"Barium", "La":"Lanthanum", "Ce":"Cerium", "Pr":"Praseodymium", "Nd":"Neodymium", "Pm":"Promethium", "Sm":"Samarium", "Eu":"Europium", "Gd":"Gadolinium", "Tb":"Terbium", "Dy":"Dysprosium", "Ho":"Holmium", "Er":"Erbium", "Tm":"Thulium", "Yb":"Ytterbium", "Lu":"Lutetium", "Hf":"Hafnium", "Ta":"Tantalum", "W":"Tungsten", "Re":"Rhenium", "Os":"Osmium", "Ir":"Iridium", "Pt":"Platinum", "Au":"Gold", "Hg":"Mercury", "Tl":"Thallium", "Pb":"Lead", "Bi":"Bismuth", "Po":"Polonium", "At":"Astatine", "Rn":"Radon", "Fr":"Francium", "Ra":"Radium", "Ac":"Actinium", "Th":"Thorium", "Pa":"Protactinium", "U":"Uranium", "Np":"Neptunium", "Pu":"Plutonium", "Am":"Americium", "Cm":"Curium", "Bk":"Berkelium", "Cf":"Californium", "Es":"Einsteinium", "Fm":"Fermium", "Md":"Mendelevium", "No":"Nobelium", "Lr":"Lawrencium", "Rf":"Rutherfordium", "Db":"Dubnium", "Sg":"Seaborgium", "Bh":"Bohrium", "Hs":"Hassium", "Mt":"Meitnerium", "Ds":"Darmstadtium", "Rg":"Roentgenium", "Cp":"Copernicium", "Uut":"Ununtrium", "Fl":"Flerovium", "Uup":"Ununpentium", "Lv":"Liermorium", "Uus":"Ununseptium", "Uuo":"Ununoctium"}
- inv_atom_names = {v:k for k,v in atom_names.items()}
- rs = np.linspace(args.r[0],args.r[1],10000)
- if args.gs:
- fig = plt.figure()
- ax1 = fig.add_subplot(1,2,1)
- ax2 = fig.add_subplot(1,2,2)
- ax1.plot(rs, np.exp(-(rs**2)), color="blue")
- ax2.plot(rs, np.exp(-abs(rs)), color="orange")
- ax2.set_yticklabels([])
- # ax1.set_xticklabels(ax1.get_xticks().tolist()[:-1] + [""])
- # ax2.set_xticklabels([""] + ax2.get_xticks().tolist()[1:])
- plt.subplots_adjust(wspace=0.1)
- if args.pub:
- plt.savefig("GTO_vs_STO.pdf")
- else:
- plt.show()
- sys.exit(0)
- if args.list:
- for _, _, files in os.walk("./basis_sets/"):
- for basis_set_file_name in files:
- sys.stdout.write(basis_set_file_name[:-4] + "\n")
- if len(args.bases) == 1:
- sys.stdout.write("\nCurrent selected basis: " + args.bases[0] + "\n")
- else:
- sys.stdout.write("\nCurrent selected bases: " + " ".join(args.bases) + "\n")
- sys.stdout.write("Available atoms:\n")
- basis_sets = {}
- for basis in args.bases:
- basis_sets[basis] = {}
- with open("./basis_sets/" + basis + ".dat") as f:
- l_dict = dict([(letter, i) for i,letter in enumerate("SPDFGHIJKL")])
- L = 0
- atom = None
- for line in f:
- if line.startswith("$"):
- if "-TYPE FUNCTIONS" in line:
- line = f.next()
- primitives, functions, _ = [int(e) for e in line.split()]
- basis_sets[basis][atom].append([])
- for i in range(primitives):
- line = f.next()
- basis_sets[basis][atom][-1].append([float(e) for e in line.replace("D","E").split()])
- tmp = zip(*basis_sets[basis][atom][-1])
- basis_sets[basis][atom][-1] = {"primitives":tmp[0], "contractions":tmp[1:]}
- else:
- atom = line.split()[1]
- if atom not in basis_sets[basis]:
- basis_sets[basis][atom] = []
- if args.list:
- atom_sets = [[key for key in basis_set] for basis_set in basis_sets.values()]
- atom_set = set(atom_sets[0])
- for atoms in atom_sets[1:]:
- atom_set = atom_set & set(atoms)
- atoms = sorted(list(atom_set))
- atoms = [inv_atom_names[atom.title()] for atom in atoms]
- sys.stdout.write(" ".join(atoms) + "\n")
- sys.exit(0)
- def N(alpha, l):
- return np.sqrt(np.power(2*alpha/np.pi, 1.5) * np.power(4*alpha, l) / factorial2(2*l-1))
- def R(l, alpha, r):
- return N(alpha,l) * r**l * np.exp(-alpha * r**2)
- def GTO(l, alphas, cs, r):
- if type(r) is list:
- result = np.zeros_like(r)
- else:
- result = 0
- for alpha, c in zip(alphas, cs):
- result += c * R(l, alpha, r)
- return result# / len(alphas)
- fig = plt.figure()
- ax = fig.add_subplot(1,1,1)
- if args.inset:
- from mpl_toolkits.axes_grid1.inset_locator import inset_axes, zoomed_inset_axes, mark_inset
- extent = args.inset
- axins = zoomed_inset_axes(ax, args.inset_zoom, loc=args.inset_loc)
- colours = "red blue green cyan gold purple".split()
- #colours = "red orange yellow green blue purple violet".split()
- line_styles = "- :".split()
- if len(args.bases) == 3:
- line_styles = "- -- :".split()
- elif len(args.bases) == 4:
- line_styles = "- -- -. :".split()
- elif len(args.bases) > 4:
- raise Exception("Maximum comparison is of 4 basis sets")
- for line_no, basis in enumerate(args.bases):
- for l, basis_set_segment in enumerate(basis_sets[basis][atom_names[args.atom].upper()]):
- if l < args.l_min: continue
- elif l > args.l_max and args.l_max is not -1: break
- alphas = basis_set_segment["primitives"]
- for contraction in basis_set_segment["contractions"]:
- ax.plot(rs, GTO(l, alphas, contraction, rs), color=colours[l], linestyle=line_styles[line_no])
- if args.inset: axins.plot(rs, GTO(l, alphas, contraction, rs), color=colours[l], linestyle=line_styles[line_no])
- if args.inset:
- if args.inset_extent[0] is None: pass
- else:
- axins.axis(args.inset_extent)
- axins.set_xticklabels([])
- mark_inset(ax, axins, loc1=2, loc2=3, fc="none", ec="0.5")
- pos = axins.get_position()
- pos = [pos.x0, pos.y0, pos.width * 2, pos.height]
- axins.set_position(pos)
- print pos
- print axins.get_position()
- if args.pub:
- plt.savefig("GTO_" + args.atom + "_" + "_".join(args.bases) + ".pdf")
- else:
- plt.show()
Advertisement
Add Comment
Please, Sign In to add comment