10
0
mirror of https://github.com/LCPQ/quantum_package synced 2024-11-04 05:03:54 +01:00

Merge Anouar (#69)

* Converter for Pyscf

* Scripts to read integrals and metadata and generates fake ezfio

* update README

* Trying to fix jbuilder bug in OCaml installation

* Do AO->MO  transformation from pyscf in QP

* Optimization of reader due to format creux

* Optimization of reader due to format creux 2
This commit is contained in:
Anthony Scemama 2018-05-07 12:06:25 +02:00 committed by GitHub
parent db72510ce4
commit b91c9ebad1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 432 additions and 5 deletions

View File

@ -333,11 +333,14 @@ if do_pseudo:
# |_/ (/_ |_
#
psi_coef = ezfio.get_determinants_psi_coef()
psi_det = ezfio.get_determinants_psi_det()
bit_kind = ezfio.get_determinants_bit_kind()
nexcitedstate = ezfio.get_determinants_n_states()
print ""
print "BEGIN_DET"
print ""
@ -349,7 +352,11 @@ if "QP_STATE" in os.environ:
state = int(os.environ["QP_STATE"])-1
else:
state = 0
psi_coef = psi_coef[state]
psi_coef_small = psi_coef[state]
encode = 8*bit_kind
@ -359,11 +366,35 @@ def bindigits(n, bits):
decode = lambda det: ''.join(bindigits(i,encode)[::-1] for i in det)[:mo_num]
for coef, (det_a, det_b) in zip(psi_coef, psi_det):
MultiDetAlpha = []
MultiDetBeta = []
for coef, (det_a, det_b) in zip(psi_coef_small, psi_det):
print coef
print decode(det_a)
print decode(det_b)
MyDetA=decode(det_a)
MyDetB=decode(det_b)
print MyDetA
print MyDetB
print ''
MultiDetAlpha.append( det_a )
MultiDetBeta.append( det_b )
print "END_DET"
import h5py
H5_qmcpack=h5py.File('MultiDet.h5','w')
groupMultiDet=H5_qmcpack.create_group("MultiDet")
groupMultiDet.create_dataset("NbDet",(1,),dtype="f8",data=len(psi_coef_small))
groupMultiDet.create_dataset("Coeff",(len(psi_coef_small),),dtype="f8",data=psi_coef)
groupMultiDet.create_dataset("nstate",(1,),dtype="i4",data=len(MyDetA))
groupMultiDet.create_dataset("nexcitedstate",(1,),dtype="i4",data=nexcitedstate)
groupMultiDet.create_dataset("Nbits",(1,),dtype="i4",data=len(det_a))
print "temp=",MultiDetAlpha[0]
mylen="S"+str(len(MyDetA))
groupMultiDet.create_dataset("CI_Alpha",(len(psi_coef_small),len(det_a)),dtype='i8',data=MultiDetAlpha)
mylen="S"+str(len(MyDetB))
groupMultiDet.create_dataset("CI_Beta",(len(psi_coef_small),len(det_b)),dtype='i8',data=MultiDetBeta)
H5_qmcpack.close()

View File

@ -0,0 +1 @@

137
plugins/pyscf/PyscfToQp.py Normal file
View File

@ -0,0 +1,137 @@
import numpy,re,sys
def pyscf2QP(cell,mf, kpts=[], int_threshold = 1E-15):
# The integral will be not printed in they are bellow that
PBC=False
ComputeMode= re.split('[. ]', str(mf))
print 'ComputeMode=',ComputeMode
for n in ComputeMode:
if n in ("UHF","KUHF","UKS"):
sys.exit('Unrestricted calculation unsupported in Quantum Package')
if n == "pbc":
PBC=True
if PBC and len(kpts) == 0:
sys.exit("ERROR (read!): You need to specify explicit the list of K-point (including gamma)")
print 'Performing PBC?:',PBC
if PBC:
from pyscf.pbc import ao2mo
from pyscf.pbc import tools
else:
from pyscf import ao2mo
natom = len(cell.atom_coords())
print 'n_atom', natom
print 'num_elec', cell.nelectron
print 'nucl_num', len(cell.atom_coords())
print ''
mo_coeff = mf.mo_coeff # List of mo_coeff for each k-point
if not PBC:
nmo = mo_coeff.shape[1]
else:
nmo = mo_coeff[0].shape[1]
# Wrote all the parameter need to creat a dummy EZFIO folder who will containt the integral after.
# More an implentation detail than a real thing
with open('param','w') as f:
f.write(' '.join(map(str,(cell.nelectron, nmo, natom))))
# _
# |\ | _ | _ _. ._ |_) _ ._ | _ o _ ._
# | \| |_| (_ | (/_ (_| | | \ (/_ |_) |_| | _> | (_) | |
# |
print 'mf, cell', mf.energy_nuc(), cell.energy_nuc()
shift = tools.pbc.madelung(cell, numpy.zeros(3))*cell.nelectron * -.5 if PBC else 0
e_nuc = cell.energy_nuc() + shift
print 'nucl_repul', e_nuc
with open('e_nuc','w') as f:
f.write(str(e_nuc))
from itertools import product
# ___
# | ._ _|_ _ _ ._ _. | _ |\/| _ ._ _
# _|_ | | |_ (/_ (_| | (_| | _> | | (_) | | (_)
# _|
if PBC:
h_ao = ('kinetic', mf.get_hcore(kpts=kpts) ) # Give only one k point ?
dummy_ao = ('nuclear', numpy.zeros( (len(kpts),nmo,nmo), dtype=numpy.float ))
else:
h_ao = ('kinetic', mf.get_hcore() )
dummy_ao = ('nuclear', numpy.zeros( (nmo,nmo), dtype=numpy.float ))
def gen_mono_MO(mo_coeff,l_int,shift=0):
# 2Id transfortion Transformation. For now we handle only one or zero K point.
print 'l_int.shape=',l_int.shape
l_int_mo = reduce(numpy.dot, (mo_coeff.T, l_int, mo_coeff)) #This formula is only right for one kpt.
print 'l_int_mo=',l_int_mo
for i,j in product(range(nmo), repeat=2):
int_ = l_int_mo[i,j]
yield (i+1+shift,j+1+shift, int_)
# Print
for name, ao in (h_ao,dummy_ao):
with open('%s_mo' % name,'w') as f:
print '%s_mo' % name
if not PBC:
for mono in gen_mono_MO(mo_coeff,ao):
f.write('%s %s %s\n'% mono)
else:
for i,(m,a) in enumerate(zip(mo_coeff,ao)):
for mono in gen_mono_MO(m,a,i):
f.write('%s %s %s\n'% mono)
# ___ _
# | ._ _|_ _ _ ._ _. | _ |_) o
# _|_ | | |_ (/_ (_| | (_| | _> |_) |
# _|
#
def ao2mo_amazing(mo_coeff):
if PBC:
eri_4d= mf.with_df.ao2mo(mo_coeff,compact=False)
else:
eri_4d= ao2mo.kernel(cell,mo_coeff,compact=False)
return eri_4d.reshape((nmo,)*4)
def write_amazing(eri_4d, shift=0):
# HANDLE 8 FOLD by Scemama way. Maybe we can use compact=True
for l in range(nmo):
for k in range(nmo):
for j in range(l,nmo):
for i in range(max(j,k),nmo):
v = eri_4d[i,k,j,l]
if abs(v) > int_threshold:
f.write('%s %s %s %s %s\n' % (i+1+shift,j+1+shift,k+1+shift,l+1+shift,v))
if PBC:
eri_4d= mf.with_df.ao2mo(mo_coeff[0],compact=False)
else: #Molecular
eri_4d= ao2mo.kernel(cell,mo_coeff,compact=False)
eri_4d = eri_4d.reshape((nmo,)*4)
f = open('bielec_mo','w')
for i,mc in enumerate(mo_coeff):
eri = ao2mo_amazing(mc)
write_amazing(eri, nmo*i)

21
plugins/pyscf/README.rst Normal file
View File

@ -0,0 +1,21 @@
=====
pyscf
=====
Converter from Pyscf to Quatum Package for Molecules AND Solids
Import this script in your Pyscf input.
Use as follow:
```
from MolPyscfToQP import pyscf2QP
pyscf2QP(cell,mf,kpts=kpts,int_threshold = 1E-15)
```
Needed Modules
==============
.. Do not edit this section It was auto-generated
.. by the `update_README.py` script.
Documentation
=============
.. Do not edit this section It was auto-generated
.. by the `update_README.py` script.

View File

@ -0,0 +1,38 @@
program pyscf
implicit none
BEGIN_DOC
! TODO
END_DOC
print *, ' _/ '
print *, ' -:\_?, _Jm####La '
print *, 'J"(:" > _]#AZ#Z#UUZ##, '
print *, '_,::./ %(|i%12XmX1*1XL _?, '
print *, ' \..\ _\(vmWQwodY+ia%lnL _",/ ( '
print *, ' .:< ]J=mQD?WXn<uQWmmvd, -.-:=!'
print *, ' "{Z jC]QW|=3Zv)Bi3BmXv3 = _7'
print *, ' ]h[Z6)WQ;)jZs]C;|$BZv+, : ./ '
print *, ' -#sJX%$Wmm#ev]hinW#Xi:` c ; '
print *, ' #X#X23###1}vI$WWmX1>|,)nr" '
print *, ' 4XZ#Xov1v}=)vnXAX1nnv;1n" '
print *, ' ]XX#ZXoovvvivnnnlvvo2*i7 '
print *, ' "23Z#1S2oo2XXSnnnoSo2>v" '
print *, ' miX#L -~`""!!1}oSoe|i7 '
print *, ' 4cn#m, v221=|v[ '
print *, ' ]hI3Zma,;..__wXSe=+vo '
print *, ' ]Zov*XSUXXZXZXSe||vo2 '
print *, ' ]Z#><iiii|i||||==vn2( '
print *, ' ]Z#i<ii||+|=||=:{no2[ '
print *, ' ]ZUsiiiiivi|=||=vo22[ '
print *, ' ]XZvlliiIi|i=|+|vooo '
print *, ' =v1llli||||=|||||lii( '
print *, ' ]iillii||||||||=>=|< '
print *, ' -ziiiii||||||+||==+> '
print *, ' -%|+++||=|=+|=|==/ '
print *, ' -a>====+|====-:- '
print *, ' "~,- -- /- '
print *, ' -. )> '
print *, ' .~ +- '
print *, ' . .... : . '
print *, ' -------~ '
print *, ''
end

View File

@ -0,0 +1,17 @@
#!/bin/bash
ezfio=$1
# Create the integral
echo 'Create Integral'
echo 'Create EZFIO'
read nel nmo natom <<< $(cat param)
read e_nucl <<< $(cat e_nuc)
./create_ezfio.py $ezfio $nel $natom $nmo $e_nucl
#Handle the orbital consitensy check
qp_edit -c $ezfio &> /dev/null
cp $ezfio/{ao,mo}_basis/ao_md5
#Read the integral
echo 'Read Integral'
qp_run read_integrals_mo $ezfio

View File

@ -3,6 +3,7 @@ read_integral
=============
Warning: CAN NOT CHANGE THE NUMBER OF MO !
Scripts to read integrals and metadata and generates fake ezfio
Needed Modules
==============

View File

@ -0,0 +1,48 @@
#!/usr/bin/env python
from ezfio import ezfio
import sys
filename = sys.argv[1]
num_elec, nucl_num, mo_tot_num = map(int,sys.argv[2:5])
nuclear_repulsion = float(sys.argv[5])
ezfio.set_file(filename)
#Important !
import math
ezfio.electrons_elec_alpha_num = int(math.ceil(num_elec / 2.))
ezfio.electrons_elec_beta_num = int(math.floor(num_elec / 2.))
#Important
ezfio.set_nuclei_nucl_num(nucl_num)
ezfio.set_nuclei_nucl_charge([0.]*nucl_num)
ezfio.set_nuclei_nucl_coord( [ [0.], [0.], [0.] ]*nucl_num )
ezfio.set_nuclei_nucl_label( ['He'] * nucl_num )
ezfio.set_nuclei_disk_access_nuclear_repulsion('Read')
ezfio.set_nuclei_nuclear_repulsion(nuclear_repulsion)
# Ao num
ao_num = mo_tot_num
ezfio.set_ao_basis_ao_basis("Dummy one. We read MO")
ezfio.set_ao_basis_ao_num(ao_num)
ezfio.set_ao_basis_ao_nucl([1]*ao_num) #Maybe put a realy incorrect stuff
#Just need one
ao_prim_num_max = 5
d = [ [0] *ao_prim_num_max]*ao_num
ezfio.set_ao_basis_ao_prim_num([ao_prim_num_max]*ao_num)
ezfio.set_ao_basis_ao_power(d)
ezfio.set_ao_basis_ao_coef(d)
ezfio.set_ao_basis_ao_expo(d)
#Dummy one
ao_md5 = '3b8b464dfc95f282129bde3efef3c502'
ezfio.set_ao_basis_ao_md5(ao_md5)
ezfio.set_mo_basis_ao_md5(ao_md5)
ezfio.set_mo_basis_mo_tot_num(mo_tot_num)
ezfio.set_mo_basis_mo_coef([ [0]*mo_tot_num] * ao_num)

View File

@ -0,0 +1,47 @@
program read_integrals
PROVIDE ezfio_filename
call ezfio_set_integrals_monoelec_disk_access_ao_one_integrals("None")
call run
end
subroutine run
use map_module
implicit none
integer :: iunit
integer :: getunitandopen
integer ::i,j,k,l
double precision :: integral
double precision, allocatable :: A(:,:)
integer :: n_integrals
integer(key_kind), allocatable :: buffer_i(:)
real(integral_kind), allocatable :: buffer_values(:)
integer(key_kind) :: key
call ezfio_set_integrals_monoelec_disk_access_ao_one_integrals("Read")
allocate(buffer_i(ao_num**4/8), buffer_values(ao_num**4/8))
iunit = getunitandopen('bielec_ao','r')
n_integrals=0
do
read (iunit,*,end=13) i,j,k,l, integral
n_integrals += 1
call bielec_integrals_index(i, j, k, l, buffer_i(n_integrals) )
buffer_values(n_integrals) = integral
enddo
13 continue
close(iunit)
call insert_into_ao_integrals_map(n_integrals,buffer_i,buffer_values)
call map_sort(ao_integrals_map)
call map_unique(ao_integrals_map)
call map_save_to_disk(trim(ezfio_filename)//'/work/ao_ints',ao_integrals_map)
call ezfio_set_integrals_bielec_disk_access_ao_integrals('Read')
end

View File

@ -0,0 +1,86 @@
program read_integrals
BEGIN_DOC
! Reads the integrals from the following files:
! - kinetic_mo
! - nuclear_mo
! - bielec_mo
END_DOC
integer :: iunit
integer :: getunitandopen
integer :: i,j,n
PROVIDE ezfio_filename
call ezfio_set_integrals_monoelec_disk_access_mo_one_integrals("None")
logical :: has
call ezfio_has_mo_basis_mo_tot_num(has)
if (.not.has) then
iunit = getunitandopen('nuclear_mo','r')
n=0
do
read (iunit,*,end=12) i
n = max(n,i)
enddo
12 continue
close(iunit)
call ezfio_set_mo_basis_mo_tot_num(n)
call ezfio_has_ao_basis_ao_num(has)
mo_label = "None"
if (has) then
call huckel_guess
else
call ezfio_set_ao_basis_ao_num(n)
endif
endif
call run
end
subroutine run
use map_module
implicit none
integer :: iunit
integer :: getunitandopen
integer ::i,j,k,l
double precision :: integral
double precision, allocatable :: A(:,:)
integer :: n_integrals
integer(key_kind), allocatable :: buffer_i(:)
real(integral_kind), allocatable :: buffer_values(:)
integer(key_kind) :: key
call ezfio_get_mo_basis_mo_tot_num(mo_tot_num)
allocate (A(mo_tot_num,mo_tot_num))
A = 0.d0
iunit = getunitandopen('kinetic_mo','r')
do
read (iunit,*,end=10) i,j, integral
A(i,j) = integral
enddo
10 continue
close(iunit)
call write_one_e_integrals('mo_kinetic_integral', A, size(A,1), size(A,2))
iunit = getunitandopen('nuclear_mo','r')
do
read (iunit,*,end=12) i,j, integral
A(i,j) = integral
enddo
12 continue
close(iunit)
call write_one_e_integrals('mo_ne_integral', A, size(A,1), size(A,2))
call write_one_e_integrals('mo_pseudo_integral', mo_pseudo_integral,&
size(mo_pseudo_integral,1), size(mo_pseudo_integral,2))
call ezfio_set_integrals_monoelec_disk_access_mo_one_integrals("Read")
end