Skip to content

Commit 7065bf2

Browse files
committed
Lots of molecules are working. 2s and 2p orbitals are running.
1 parent bb0870d commit 7065bf2

File tree

3 files changed

+62
-28
lines changed

3 files changed

+62
-28
lines changed

GenerateStartingFunctions.py

+31-25
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,19 @@
2828

2929
def Y1all(rvec, Z=1.0):
3030
rmag = np.sqrt(np.sum(rvec*rvec,1))
31-
return np.sqrt(0.75/np.pi) * rvec/rmag
31+
return np.sqrt(0.75/np.pi) * rvec / np.array([rmag,rmag,rmag]).T
32+
33+
def Y1x(rvec, Z=1.0):
34+
rmag = np.sqrt(np.sum(rvec*rvec,1))
35+
return np.sqrt(0.75/np.pi) * rvec[:,0] / rmag
36+
37+
def Y1y(rvec, Z=1.0):
38+
rmag = np.sqrt(np.sum(rvec*rvec,1))
39+
return np.sqrt(0.75/np.pi) * rvec[:,1] / rmag
40+
41+
def Y1z(rvec, Z=1.0):
42+
rmag = np.sqrt(np.sum(rvec*rvec,1))
43+
return np.sqrt(0.75/np.pi) * rvec[:,2] / rmag
3244

3345
# Radial functions
3446
# Note: this function requires that position coordinates are along dimension 1 of the array (not 0)
@@ -80,13 +92,13 @@ def psi_2p_all(e_pos_vec, i_pos, Z=1.0):
8092
return Y1all(e_pos_vec - i_pos) * R21(e_pos_vec - i_pos, Z)
8193

8294
def psi_2px(e_pos_vec, i_pos, Z=1.0):
83-
return Y1all(e_pos_vec - i_pos)[0] * R21(e_pos_vec - i_pos, Z)
95+
return Y1x(e_pos_vec - i_pos)[0] * R21(e_pos_vec - i_pos, Z)
8496

8597
def psi_2py(e_pos_vec, i_pos, Z=1.0):
86-
return Y1all(e_pos_vec - i_pos)[1] * R21(e_pos_vec - i_pos, Z)
98+
return Y1y(e_pos_vec - i_pos)[1] * R21(e_pos_vec - i_pos, Z)
8799

88100
def psi_2pz(e_pos_vec, i_pos, Z=1.0):
89-
return Y1all(e_pos_vec - i_pos)[2] * R21(e_pos_vec - i_pos, Z)
101+
return Y1z(e_pos_vec - i_pos)[2] * R21(e_pos_vec - i_pos, Z)
90102

91103
# Laplacian of S orbitals
92104
def Lpsi_1s(e_pos_vec, i_pos):
@@ -123,13 +135,16 @@ def psi_1s(self, e_pos_vec):
123135
class Atom:
124136
Z = 1.0
125137
i_pos = np.zeros(3)
126-
138+
139+
last_e_vec = np.zeros(3)
140+
last_2p_vec = np.zeros(3)
141+
127142
def __init__(self, pos=np.array([0,0,0]), Z=1.0):
128143
self.i_pos = pos
129144
self.Z = float(Z)
130145

131-
last_e_vec = np.zeros(3)
132-
last_2p_vec = np.zeros(3)
146+
147+
133148

134149
def setPosition(self, pos):
135150
self.i_pos = pos
@@ -144,26 +159,17 @@ def psi_2p_all(self, e_pos_vec):
144159
return Y1all(e_pos_vec - self.i_pos) * R21(e_pos_vec - self.i_pos, self.Z)
145160

146161
def psi_2px(self, e_pos_vec):
147-
if (last_e_vec == e_pos_vec).all():
148-
return last_2p_vec[0]
149-
else:
150-
last_e_vec = e_pos_vec.copy()
151-
last_2p_vec = Y1all(e_pos_vec - self.i_pos)[0] * R21(e_pos_vec - self.i_pos, self.Z)
152-
return last_2p_vec[0]
162+
#if (self.last_e_vec == e_pos_vec).all():
163+
# return self.last_2p_vec[0]
164+
#else:
165+
# self.last_e_vec = e_pos_vec.copy()
166+
# self.last_2p_vec = Y1all(e_pos_vec - self.i_pos) * R21(e_pos_vec - self.i_pos, self.Z)
167+
return Y1x(e_pos_vec - self.i_pos) * R21(e_pos_vec - self.i_pos,self.Z)
153168

154169
def psi_2py(self, e_pos_vec):
155-
if (last_e_vec == e_pos_vec).all():
156-
return last_2p_vec[1]
157-
else:
158-
last_e_vec = e_pos_vec.copy()
159-
last_2p_vec = Y1all(e_pos_vec - self.i_pos)[0] * R21(e_pos_vec - self.i_pos, self.Z)
160-
return last_2p_vec[1]
170+
return Y1y(e_pos_vec - self.i_pos) * R21(e_pos_vec - self.i_pos,self.Z)
171+
161172

162173
def psi_2pz(self, e_pos_vec):
163-
if (last_e_vec == e_pos_vec).all():
164-
return last_2p_vec[2]
165-
else:
166-
last_e_vec = e_pos_vec.copy()
167-
last_2p_vec = Y1all(e_pos_vec - self.i_pos)[0] * R21(e_pos_vec - self.i_pos, self.Z)
168-
return last_2p_vec[2]
174+
return Y1z(e_pos_vec - self.i_pos) * R21(e_pos_vec - self.i_pos,self.Z)
169175

TrialFunctions2.py

+28
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,34 @@ def H2Molecule(ion_sep):
101101
#print 'Simulating H2Molecule'
102102
return wf
103103

104+
def H3Molecule(ion_sep):
105+
# ion_sep is in atomic units of Bohr radius
106+
ion_positions = np.array([
107+
[-0.5*ion_sep, 0, 0],
108+
[0.5*ion_sep, 0, 0],
109+
[0,0.5*ion_sep, 0]]) * GSF.a_B
110+
H_atom1 = GSF.H_atom(pos=np.array(ion_positions[0]))#,Z=1.0)
111+
H_atom2 = GSF.H_atom(pos=np.array(ion_positions[1]))#,Z=1.0)
112+
H_atom3 = GSF.H_atom(pos=np.array(ion_positions[2]))#,Z=1.0)
113+
psi_laplacian = []
114+
# two options for 2 electrons --> 2(up and down):0 or 1:1 (up: down or up:up)
115+
# using 1:1 and up for both for now
116+
psi_array_up = np.array([H_atom1.psi_1s,H_atom2.psi_1s])
117+
psi_array_down = np.array([H_atom3.psi_1s])
118+
119+
wf = WaveFunctionClass()
120+
wf.setUpWavefunctions(psi_array_up)
121+
wf.setDownWavefunctions(psi_array_down)
122+
wf.setAtomicLaplacians(psi_laplacian)
123+
wf.setAtomList([H_atom1,H_atom2,H_atom3])
124+
#wf.setIonPositions(ion_positions)
125+
#wf.setIonCharges(ion_charges)
126+
wf.setNumUp(len(psi_array_up))
127+
wf.setNumDown(len(psi_array_down))
128+
129+
#print 'Simulating H2Molecule'
130+
return wf
131+
104132
def He2Molecule(ion_sep):
105133
# ion_sep is in atomic units of Bohr radius
106134
ion_positions = np.array([

VMC.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ def MC_loop(WF, steps=1000, sig=0.5):
6868
index += 1
6969

7070
E[t] = WF.LocalEnergy(Psi)
71-
printtime = 1000
72-
if (t+1)%printtime == 0: print 'Finished step '+str(t+1)+str(WF.e_positions)
71+
printtime = 250
72+
if (t+1)%printtime == 0: print 'Finished step '+str(t+1) #str(WF.e_positions)
7373

7474
print 'Final prob ratio',prob_ratio
7575
print('Acceptance Rate:',(moves_accepted/(N*steps)))
@@ -125,7 +125,7 @@ def parseArgs(args,x):
125125
steps_input, bond_distance, sigma, jastrowB, jastrowD = parseArgs(sys.argv,x)
126126

127127
#WF = GTF.H2Molecule(bond_distance, N_e=1)
128-
WF = GTF.H2Molecule(bond_distance)
128+
WF = GTF.HFMolecule(bond_distance)
129129
#WF = GTF.LithiumAtom()
130130
#WF = GTF.HeliumAtom()
131131
WF.Bee_same = jastrowB

0 commit comments

Comments
 (0)