#!/usr/bin/python import os from molecule import get_N, get_labels, get_xyz def E(i,j,hi,hj): path = "x%dx%d_%d%d/output.dat" % (i,j,hi,hj) if os.path.isfile(path): for line in reversed( open(path).readlines() ): if line[:18] == " Total Energy =": return float(line[19:]) ########################### # BEGIN COMPUTING HESSIAN # ########################### h = 0.005 # displacement size N = get_N() # number of atoms H = [[0.0 for i in range(3*N)] for j in range(3*N)] # Hessian matrix -- initialize with zeros # diagonal elements for i in range(3*N): H[i][i] = ( E(i,0,+1,0)+E(i,0,-1,0)-2*E(0,0,0,0) ) / (h*h) # off-diagonal elements for i in range(3*N): for j in range(i): H[i][j] = ( E(i,j,+1,+1)+E(i,j,-1,-1)-E(i,0,+1,0)-E(i,0,-1,0)-E(j,0,+1,0)-E(j,0,-1,0)+2*E(0,0,0,0) ) / (2*h*h) H[j][i] = H[i][j] ######################### # END COMPUTING HESSIAN # ######################### outfile = open('hessian.txt','w')
energy('scf') """ def make_input(dirname,labels,coords): coordstring = "" for a in range(len(labels)): coordstring += ("%3s %10.7f %10.7f %10.7f\n" % (labels[a],coords[3*a+0],coords[3*a+1],coords[3*a+2])) if not os.path.exists(dirname): os.makedirs(dirname) f = open(dirname+'/input.dat','w+') f.write(template % coordstring) print dirname + template % coordstring h = 0.005 N = get_N() make_input("x0x0_00",get_labels(),get_xyz()) for i in range(3*N): disp_forward = get_xyz() disp_backward = get_xyz() disp_forward[i] += h disp_backward[i] -= h make_input("x%dx0_10"%i, get_labels(), disp_forward) make_input("x%dx0_-10"%i, get_labels(), disp_backward) for i in range(3*N): for j in range(0,i): disp_forward = get_xyz() disp_backward = get_xyz() disp_forward[i] += h disp_backward[i] -= h
#!/usr/bin/python import os from molecule import get_N, get_labels, get_xyz def run_input(dirname): os.chdir(dirname) os.system("psi4") print "running in ... " + os.getcwd() os.chdir("../") run_input("x0x0_00") for i in range(3*get_N()): run_input("x%dx0_10" % i) run_input("x%dx0_-10" % i) for i in range(3*get_N()): for j in range(i): run_input("x%dx%d_11" %(i,j)) run_input("x%dx%d_-1-1" %(i,j))