eplf/scripts/to_ezfio.py

201 lines
5.1 KiB
Python
Raw Normal View History

2020-06-03 00:28:14 +02:00
#!/usr/bin/env python3
2009-10-12 17:37:07 +02:00
2009-12-04 16:14:23 +01:00
import common
2009-10-12 17:37:07 +02:00
import sys,os,time
2020-06-03 00:28:14 +02:00
from functools import reduce
2009-10-12 17:37:07 +02:00
from resultsFile import *
# Check command line
2010-12-03 16:06:01 +01:00
det_thr = 1.e-6
2009-10-12 17:37:07 +02:00
if len(sys.argv) == 2:
State=0
elif len(sys.argv) == 3:
State=int(sys.argv[2])
else:
2020-06-03 00:28:14 +02:00
print("usage: "+sys.argv[0]+" file.out")
2009-10-12 17:37:07 +02:00
sys.exit(2)
firstArg = sys.argv[1]
file = getFile(firstArg)
2009-12-21 23:39:00 +01:00
file.convert_to_cartesian()
2020-06-03 00:28:14 +02:00
print(firstArg, 'recognized as', str(file).split('.')[-1].split()[0])
2009-10-12 17:37:07 +02:00
from ezfio import ezfio
def write_ezfioFile(res,filename):
ezfio.set_file(filename)
# Electrons
2009-12-04 16:14:23 +01:00
ezfio.electrons_elec_alpha_num = res.num_alpha
ezfio.electrons_elec_beta_num = res.num_beta
2020-06-03 00:28:14 +02:00
ezfio.electrons_elec_num = res.num_beta + res.num_alpha
2009-10-12 17:37:07 +02:00
# Nuclei
2009-12-04 16:14:23 +01:00
ezfio.nuclei_nucl_num = len(res.geometry)
2009-10-12 17:37:07 +02:00
charge = []
coord = []
coord_x = []
coord_y = []
coord_z = []
for a in res.geometry:
charge.append(a.charge)
if res.units == 'BOHR':
coord_x.append(a.coord[0])
coord_y.append(a.coord[1])
coord_z.append(a.coord[2])
else:
coord_x.append(a.coord[0]/a0)
coord_y.append(a.coord[1]/a0)
coord_z.append(a.coord[2]/a0)
2009-12-04 16:14:23 +01:00
ezfio.nuclei_nucl_charge = charge
ezfio.nuclei_nucl_coord = coord_x+coord_y+coord_z
2009-10-12 17:37:07 +02:00
# AO Basis
import string
at = []
num_prim = []
magnetic_number = []
angular_number = []
power_x = []
power_y = []
power_z = []
coefficient = []
exponent = []
for b in res.basis:
c = b.center
for i,atom in enumerate(res.geometry):
if atom.coord == c:
at.append(i+1)
num_prim.append(len(b.prim))
2009-12-21 23:39:00 +01:00
s = b.sym
2020-06-03 00:28:14 +02:00
power_x.append( s.count("x") )
power_y.append( s.count("y") )
power_z.append( s.count("z") )
2009-10-12 17:37:07 +02:00
coefficient.append( b.coef )
exponent.append( [ p.expo for p in b.prim ] )
2009-12-04 16:14:23 +01:00
ezfio.ao_basis_ao_num = len(res.basis)
ezfio.ao_basis_ao_nucl = at
ezfio.ao_basis_ao_prim_num = num_prim
ezfio.ao_basis_ao_power = power_x+power_y+power_z
2020-06-03 00:28:14 +02:00
prim_num_max = max(num_prim)
ezfio.ao_basis_ao_prim_num_max = prim_num_max
2009-10-12 17:37:07 +02:00
len_res_basis = len(res.basis)
for i in range(len(res.basis)):
coefficient[i] += [ 0. for j in range(len(coefficient[i]),prim_num_max) ]
exponent[i] += [ 0. for j in range(len(exponent[i]),prim_num_max) ]
coefficient = reduce(lambda x, y: x+y, coefficient, [])
exponent = reduce(lambda x, y: x+y, exponent, [])
coef = []
expo = []
for i in range(prim_num_max):
for j in range(i,len(coefficient),prim_num_max):
coef.append ( coefficient[j] )
expo.append ( exponent[j] )
2009-12-04 16:14:23 +01:00
ezfio.ao_basis_ao_coef = coef
ezfio.ao_basis_ao_expo = expo
2009-10-12 17:37:07 +02:00
# MOs
MoTag = res.mo_types[-1]
2010-06-11 13:17:33 +02:00
if MoTag == 'Natural':
res.mo_types.pop()
MoTag = res.mo_types[-1]
2010-07-16 17:50:42 +02:00
mo_tot_num = len(res.mo_sets[MoTag])
ezfio.mo_basis_mo_tot_num = mo_tot_num
2009-12-10 00:58:43 +01:00
try:
2010-05-05 13:08:36 +02:00
newocc = [0. for i in range(mo_tot_num)]
while len(res.occ_num[MoTag]) < mo_tot_num:
res.occ_num[MoTag].append(newmo)
2009-12-04 16:14:23 +01:00
ezfio.mo_basis_mo_occ = res.occ_num[MoTag]
2009-12-10 00:58:43 +01:00
except:
pass
2009-12-04 11:14:58 +01:00
2009-10-12 17:37:07 +02:00
mo = res.mo_sets[MoTag]
if len(mo) < mo_tot_num:
newmo = orbital()
newmo.eigenvalue = 0.
newmo.vector = [0. for i in range(mo_tot_num)]
while len(mo) < mo_tot_num:
mo.append(newmo)
Energies = [ m.eigenvalue for m in mo ]
2009-12-04 16:14:23 +01:00
ezfio.mo_basis_mo_energy = Energies
2009-10-12 17:37:07 +02:00
if res.occ_num is not None:
OccNum = res.occ_num[MoTag]
while len(OccNum) < mo_tot_num:
OccNum.append(0.)
2009-12-04 16:14:23 +01:00
ezfio.mo_basis_mo_occ = OccNum
2009-10-12 17:37:07 +02:00
cls = [ "v" for i in mo ]
for i in res.closed_mos:
cls[i] = 'c'
for i in res.active_mos:
cls[i] = 'a'
2009-12-04 16:14:23 +01:00
ezfio.mo_basis_mo_classif = cls
2009-10-12 17:37:07 +02:00
MoMatrix = []
for m in mo:
for coef in m.vector:
MoMatrix.append(coef)
while len(MoMatrix) < len(mo[0].vector)**2:
MoMatrix.append(0.)
2009-12-04 16:14:23 +01:00
ezfio.mo_basis_mo_coef = MoMatrix
2009-10-12 17:37:07 +02:00
# Determinants
closed_mos = res.closed_mos
2010-07-13 19:45:35 +02:00
virtual_mos = res.virtual_mos
2009-10-12 17:37:07 +02:00
dets_a = []
dets_b = []
for d in res.determinants:
dnew_a = []
dnew_b = []
for x in d['alpha']:
2010-07-13 19:45:35 +02:00
if x not in closed_mos+virtual_mos:
2009-10-12 17:37:07 +02:00
dnew_a.append(x+1)
for x in d['beta']:
2010-07-13 19:45:35 +02:00
if x not in closed_mos+virtual_mos:
2009-10-12 17:37:07 +02:00
dnew_b.append(x+1)
2010-04-28 16:07:18 +02:00
for x in range(res.num_alpha-len(dnew_a)-len(closed_mos)):
dnew_a.append(0)
for x in range(res.num_alpha-len(dnew_b)-len(closed_mos)):
2009-10-12 17:37:07 +02:00
dnew_b.append(0)
dets_a.append( dnew_a )
dets_b.append( dnew_b )
coef = reduce(lambda x, y: x+y,res.det_coefficients,[])
2020-06-03 00:28:14 +02:00
ezfio.mo_basis_mo_closed_num = len(res.closed_mos)
ezfio.mo_basis_mo_active_num = len(res.active_mos)
ezfio.mo_basis_mo_virtual_num = len(res.virtual_mos)
2009-10-12 17:37:07 +02:00
if len(dets_a[0]) > 0:
2020-06-03 00:28:14 +02:00
for i in range(len(coef),0,-1):
2010-04-28 16:07:18 +02:00
i -= 1
2010-06-09 15:10:14 +02:00
if abs(coef[i]) < det_thr :
2010-04-28 16:07:18 +02:00
dets_a.pop(i)
dets_b.pop(i)
coef.pop(i)
2010-05-27 18:11:19 +02:00
ezfio.determinants_det_num = len(coef)
2009-12-04 16:14:23 +01:00
ezfio.determinants_det_coef = coef
ezfio.determinants_det_occ = dets_a+dets_b
2009-10-12 17:37:07 +02:00
else:
2009-12-04 16:14:23 +01:00
ezfio.determinants_det_num = 1
ezfio.determinants_det_coef = [1.]
ezfio.determinants_det_occ = dets_a+dets_b
2009-10-12 17:37:07 +02:00
2009-12-04 16:14:23 +01:00
ezfio.compute_eplf = True
2009-12-10 00:58:43 +01:00
for i in "density density_lapl elf elf_grad eplf_lapl density_grad elf_grad elf_lapl eplf_grad".split():
2020-06-03 00:28:14 +02:00
exec("ezfio.compute_%s = False" % i)
2009-12-04 11:14:58 +01:00
2010-02-25 15:18:15 +01:00
def main():
write_ezfioFile(file,firstArg+".ezfio")
if __name__ == '__main__':
main()
2009-12-04 16:14:23 +01:00