From ae9599c6011f9ecb5fa3d7334e3cd9a96eb16d48 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 19 Jan 2016 17:06:57 +0100 Subject: [PATCH 1/2] Added qmcpack module --- plugins/qmcpack/NEEDED_CHILDREN_MODULES | 1 + plugins/qmcpack/README.rst | 15 ++ .../qmcpack/qp_convert_qmcpack_from_ezfio.py | 236 ++++++++++++++++++ plugins/qmcpack/save_for_qmcpack.irp.f | 20 ++ src/AO_Basis/aos.irp.f | 6 +- 5 files changed, 276 insertions(+), 2 deletions(-) create mode 100644 plugins/qmcpack/NEEDED_CHILDREN_MODULES create mode 100644 plugins/qmcpack/README.rst create mode 100755 plugins/qmcpack/qp_convert_qmcpack_from_ezfio.py create mode 100644 plugins/qmcpack/save_for_qmcpack.irp.f diff --git a/plugins/qmcpack/NEEDED_CHILDREN_MODULES b/plugins/qmcpack/NEEDED_CHILDREN_MODULES new file mode 100644 index 00000000..e2422607 --- /dev/null +++ b/plugins/qmcpack/NEEDED_CHILDREN_MODULES @@ -0,0 +1 @@ +AO_Basis Determinants Hartree_Fock diff --git a/plugins/qmcpack/README.rst b/plugins/qmcpack/README.rst new file mode 100644 index 00000000..b49b2144 --- /dev/null +++ b/plugins/qmcpack/README.rst @@ -0,0 +1,15 @@ +======= +qmcpack +======= + +Normalize the AO basis using GAMESS convention and save it inside the EZFIO. +Then the python script is called. + +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. diff --git a/plugins/qmcpack/qp_convert_qmcpack_from_ezfio.py b/plugins/qmcpack/qp_convert_qmcpack_from_ezfio.py new file mode 100755 index 00000000..010e277d --- /dev/null +++ b/plugins/qmcpack/qp_convert_qmcpack_from_ezfio.py @@ -0,0 +1,236 @@ +#!/usr/bin/python + +print "#QP -> QMCPACK" + +from ezfio import ezfio + +import sys +ezfio_path = sys.argv[1] + +ezfio.set_file(ezfio_path) + + +do_pseudo = ezfio.get_pseudo_do_pseudo() +if do_pseudo: + print "do_pseudo True" + zcore = ezfio.get_pseudo_nucl_charge_remove() +else: + print "do_pseudo False" + +try: + n_det =ezfio.get_determinants_n_det() +except IOError: + n_det = 1 + +if n_det == 1: + print "multi_det False" +else: + print "multi_det True" + +ao_num = ezfio.get_ao_basis_ao_num() +print "ao_num", ao_num + +mo_num = ezfio.get_mo_basis_mo_tot_num() +print "mo_num", mo_num + + +alpha = ezfio.get_electrons_elec_alpha_num() +beta = ezfio.get_electrons_elec_beta_num() +print "elec_alpha_num", alpha +print "elec_beta_num", beta +print "elec_tot_num", alpha + beta +print "spin_multiplicity", 2*(alpha-beta)+1 + +l_label = ezfio.get_nuclei_nucl_label() +l_charge = ezfio.get_nuclei_nucl_charge() +l_coord = ezfio.get_nuclei_nucl_coord() + +l_coord_str = [" ".join(map(str,i)) for i in l_coord] + +print "nucl_num",len(l_label) +print "Atomic coord in Bohr" + +for i,t in enumerate(zip(l_label,l_charge,l_coord_str)): + try : + l = (t[0],t[1]+zcore[i],t[2]) + except NameError: + l = t + print " ".join(map(str,l)) + + +import subprocess +process = subprocess.Popen(['qp_print_basis', ezfio_path], stdout=subprocess.PIPE) +out, err = process.communicate() + +basis_raw, sym_raw, mo_raw = out.split("\n\n\n") + +basis_without_header = "\n".join(basis_raw.split("\n")[7:]) +for i,l in enumerate(l_label): + basis_without_header=basis_without_header.replace('Atom {0}'.format(i+1),l) + +print "BEGIN_BASIS_SET" +print "" +print basis_without_header +print "END_BASIS_SET" + +# _ +# |\/| / \ _ +# | | \_/ _> +# +def same_character(item1): + return item1==item1[0]* len(item1) + +def compare_gamess_style(item1, item2): + if len(item1) < len(item2): + return -1 + elif len(item1) > len(item2): + return 1 + elif same_character(item1) and same_character(item2): + if item1 < item2: + return -1 + else: + return 1 + elif same_character(item1) and not same_character(item2): + return -1 + elif not same_character(item1) and same_character(item2): + return 1 + else: + return compare_gamess_style(item1[:-1],item2[:-1]) + +def expend_and_order_sym(str_): + #Expend + for i,c in enumerate(str_): + try: + n = int(c) + except ValueError: + pass + else: + str_ = str_[:i-1] + str_[i-1]*n + str_[i+1:] + + #Order by frequency + return "".join(sorted(str_,key=str_.count,reverse=True)) + +def get_nb_permutation(str_): + + l = len(str_)-1 + if l==0: + return 1 + else: + return 2*(2*l + 1) + +## We will order the symetry +l_sym_without_header = sym_raw.split("\n")[3:-2] + +l_l_sym = [i.split() for i in l_sym_without_header] + +for l in l_l_sym: + l[2] = expend_and_order_sym(l[2]) + +l_l_sym_iter = iter(l_l_sym) +for i,l in enumerate(l_l_sym_iter): + n = get_nb_permutation(l[2]) + if n !=1: + l_l_sym[i:i+n] = sorted(l_l_sym[i:i+n],key=lambda x : x[2], cmp=compare_gamess_style) + for next_ in range(n-1): + next(l_l_sym_iter) + +#Is orderd now + +l_block = mo_raw.split("\n\n")[5:-1] + + +l_block_format=[] + +print "" +print "BEGIN_MO" +for block in l_block: + print "" + l_ligne = block.split("\n") + print l_ligne.pop(0) + + for l in l_l_sym: + i = int(l[0]) - 1 + i_a = int(l[1]) - 1 + sym = l[2] + + print l_label[i_a],sym,l_ligne[i] + +print "END_MO" + +if do_pseudo: + print "" + print "BEGIN_PSEUDO" + klocmax = ezfio.get_pseudo_pseudo_klocmax() + kmax = ezfio.get_pseudo_pseudo_kmax() + lmax = ezfio.get_pseudo_pseudo_lmax() + + + n_k = ezfio.get_pseudo_pseudo_n_k() + v_k = ezfio.get_pseudo_pseudo_v_k() + dz_k = ezfio.get_pseudo_pseudo_dz_k() + + n_kl = ezfio.get_pseudo_pseudo_n_kl() + v_kl = ezfio.get_pseudo_pseudo_v_kl() + dz_kl = ezfio.get_pseudo_pseudo_dz_kl() + + def list_to_string(l): + return " ".join(map(str,l)) + + for i,a in enumerate(l_label): + + l_str = [] + + l_dump = [] + for k in range(klocmax): + if v_k[k][i]: + l_ = list_to_string([v_k[k][i], n_k[k][i]+2, dz_k[k][i]]) + l_dump.append(l_) + + l_str.append(l_dump) + for l in range(lmax+1): + l_dump = [] + for k in range(kmax): + if v_kl[l][k][i]: + l_ = list_to_string([v_kl[l][k][i], n_kl[l][k][i]+2, dz_kl[l][k][i]]) + l_dump.append(l_) + if l_dump: + l_str.append(l_dump) + + str_ = "PARAMETERS FOR {0} ON ATOM {1} WITH ZCORE {2} AND LMAX {3} ARE" + print str_.format(a,i+1,int(zcore[i]),int(len(l_str)-1)) + + for i, l in enumerate(l_str): + str_ = "FOR L= {0} COEFF N ZETA" + print str_.format(int(len(l_str)-i-1)) + for ii, ll in enumerate(l): + print " ",ii+1, ll + + str_ = "THE ECP RUN REMOVES {0} CORE ELECTRONS, AND THE SAME NUMBER OF PROTONS." + print str_.format(sum(zcore)) + print "END_PSEUDO" + +print "" +print "BEGIN_DET" +print "" +print "mo_num", mo_num +print "det_num", n_det +print "" + +psi_det = ezfio.get_determinants_psi_det() +psi_coef = ezfio.get_determinants_psi_coef()[0] + + +for c, (l_det_bit_alpha, l_det_bit_beta) in zip(psi_coef,psi_det): + print c + for det in l_det_bit_alpha: + bin_det_raw = "{0:b}".format(det)[::-1] + bin_det = bin_det_raw+"0"*(mo_num-len(bin_det_raw)) + print bin_det + + for det in l_det_bit_beta: + bin_det_raw = "{0:b}".format(det)[::-1] + bin_det = bin_det_raw+"0"*(mo_num-len(bin_det_raw)) + print bin_det + print "" + +print "END_DET" diff --git a/plugins/qmcpack/save_for_qmcpack.irp.f b/plugins/qmcpack/save_for_qmcpack.irp.f new file mode 100644 index 00000000..28cae9f9 --- /dev/null +++ b/plugins/qmcpack/save_for_qmcpack.irp.f @@ -0,0 +1,20 @@ +program qmcpack + implicit none + BEGIN_DOC +! Generates a file for QMCPACK + END_DOC + + integer :: i,j + read_wf = .True. + TOUCH read_wf + call save_wavefunction + do j=1,ao_prim_num_max + do i=1,ao_num + ao_coef(i,j) = ao_coef(i,j) * ao_coef_normalization_factor(i) + enddo + enddo + call ezfio_set_ao_basis_ao_coef(ao_coef) + call system('rm '//trim(ezfio_filename)//'/mo_basis/ao_md5') + call system('./qp_convert_qmcpack_from_ezfio.py '//trim(ezfio_filename)) + +end diff --git a/src/AO_Basis/aos.irp.f b/src/AO_Basis/aos.irp.f index ea426c2f..7627878b 100644 --- a/src/AO_Basis/aos.irp.f +++ b/src/AO_Basis/aos.irp.f @@ -19,7 +19,8 @@ END_PROVIDER ao_prim_num_max_align = align_double(ao_prim_num_max) END_PROVIDER -BEGIN_PROVIDER [ double precision, ao_coef_normalized, (ao_num_align,ao_prim_num_max) ] + BEGIN_PROVIDER [ double precision, ao_coef_normalized, (ao_num_align,ao_prim_num_max) ] +&BEGIN_PROVIDER [ double precision, ao_coef_normalization_factor, (ao_num) ] implicit none BEGIN_DOC ! Coefficients including the AO normalization @@ -48,8 +49,9 @@ BEGIN_PROVIDER [ double precision, ao_coef_normalized, (ao_num_align,ao_prim_num norm = norm+c*ao_coef_normalized(i,j)*ao_coef_normalized(i,k) enddo enddo + ao_coef_normalization_factor(i) = 1.d0/sqrt(norm) do j=1,ao_prim_num(i) - ao_coef_normalized(i,j) = ao_coef_normalized(i,j)/sqrt(norm) + ao_coef_normalized(i,j) = ao_coef_normalized(i,j) * ao_coef_normalization_factor(i) enddo enddo END_PROVIDER From ef81bcb0b4f22c0887e1dce6cd2030aa35432bc7 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 19 Jan 2016 17:35:32 +0100 Subject: [PATCH 2/2] Corrected --- plugins/qmcpack/save_for_qmcpack.irp.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/qmcpack/save_for_qmcpack.irp.f b/plugins/qmcpack/save_for_qmcpack.irp.f index 28cae9f9..b66fdf45 100644 --- a/plugins/qmcpack/save_for_qmcpack.irp.f +++ b/plugins/qmcpack/save_for_qmcpack.irp.f @@ -15,6 +15,6 @@ program qmcpack enddo call ezfio_set_ao_basis_ao_coef(ao_coef) call system('rm '//trim(ezfio_filename)//'/mo_basis/ao_md5') - call system('./qp_convert_qmcpack_from_ezfio.py '//trim(ezfio_filename)) + call system('$QP_ROOT/src/qmcpack/qp_convert_qmcpack_from_ezfio.py '//trim(ezfio_filename)) end