From c22daadf40fc5537ed8ee61fd0a8a01b1e1fde3d Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Mon, 27 Jan 2020 22:30:01 +0100 Subject: [PATCH 01/13] Moving to Python3. --- bin/qp_convert_output_to_ezfio | 54 +++++++++++++++++----------------- bin/qp_set_frozen_core | 6 ++-- external/Python/.gitignore | 46 +++++++++++++++++++++++++++++ ocaml/qp_tunnel.ml | 48 ------------------------------ scripts/utility/qp_path.py | 5 ++-- tests/bats_to_sh.py | 8 ++--- 6 files changed, 83 insertions(+), 84 deletions(-) diff --git a/bin/qp_convert_output_to_ezfio b/bin/qp_convert_output_to_ezfio index 30faa686..5f0c4771 100755 --- a/bin/qp_convert_output_to_ezfio +++ b/bin/qp_convert_output_to_ezfio @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 """ convert output of GAMESS/GAU$$IAN to ezfio @@ -22,7 +22,7 @@ try: QP_ROOT = os.environ["QP_ROOT"] QP_EZFIO = os.environ["QP_EZFIO"] except KeyError: - print "Error: QP_ROOT environment variable not found." + print("Error: QP_ROOT environment variable not found.") sys.exit(1) else: sys.path = [QP_EZFIO + "/Python", @@ -30,10 +30,11 @@ else: QP_ROOT + "/install", QP_ROOT + "/scripts"] + sys.path +from resultsFile import * try: from resultsFile import * except: - print "Error: resultsFile Python library not installed" + print("Error: resultsFile Python library not installed") sys.exit(1) @@ -48,17 +49,17 @@ def write_ezfio(res, filename): # |_ | _ _ _|_ ._ _ ._ _ # |_ | (/_ (_ |_ | (_) | | _> # - print "Electrons\t...\t", + print("Electrons\t...\t", end=' ') ezfio.set_electrons_elec_alpha_num(res.num_alpha) ezfio.set_electrons_elec_beta_num(res.num_beta) - print "OK" + print("OK") # # |\ | _ | _ o # | \| |_| (_ | (/_ | # - print "Nuclei\t\t...\t", + print("Nuclei\t\t...\t", end=' ') # ~#~#~#~ # # I n i t # # ~#~#~#~ # @@ -93,24 +94,23 @@ def write_ezfio(res, filename): # Transformt H1 into H import re - p = re.compile(ur'(\d*)$') + p = re.compile(r'(\d*)$') label = [p.sub("", x.name).capitalize() for x in res.geometry] ezfio.set_nuclei_nucl_label(label) ezfio.set_nuclei_nucl_coord(coord_x + coord_y + coord_z) - print "OK" + print("OK") # _ # /\ _ _ |_) _. _ o _ # /--\ (_) _> |_) (_| _> | _> # - print "AOS\t\t...\t", + print("AOS\t\t...\t", end=' ') # ~#~#~#~ # # I n i t # # ~#~#~#~ # - import string at = [] num_prim = [] power_x = [] @@ -131,9 +131,9 @@ def write_ezfio(res, filename): at.append(i + 1) num_prim.append(len(b.prim)) s = b.sym - power_x.append(string.count(s, "x")) - power_y.append(string.count(s, "y")) - power_z.append(string.count(s, "z")) + power_x.append(str.count(s, "x")) + power_y.append(str.count(s, "y")) + power_z.append(str.count(s, "z")) coefficient.append(b.coef) exponent.append([p.expo for p in b.prim]) @@ -175,14 +175,14 @@ def write_ezfio(res, filename): ezfio.set_ao_basis_ao_expo(expo) ezfio.set_ao_basis_ao_basis("Read by resultsFile") - print "OK" + print("OK") # _ # |\/| _ _ |_) _. _ o _ # | | (_) _> |_) (_| _> | _> # - print "MOS\t\t...\t", + print("MOS\t\t...\t", end=' ') # ~#~#~#~ # # I n i t # # ~#~#~#~ # @@ -205,9 +205,9 @@ def write_ezfio(res, filename): virtual = [] active = [(allMOs[i].eigenvalue, i) for i in range(len(allMOs))] - closed = map(lambda x: x[1], closed) - active = map(lambda x: x[1], active) - virtual = map(lambda x: x[1], virtual) + closed = [x[1] for x in closed] + active = [x[1] for x in active] + virtual = [x[1] for x in virtual] MOindices = closed + active + virtual MOs = [] @@ -223,7 +223,7 @@ def write_ezfio(res, filename): MOmap[i] = MOindices.index(i) energies = [] - for i in xrange(mo_num): + for i in range(mo_num): energies.append(MOs[i].eigenvalue) if res.occ_num is not None: @@ -237,11 +237,11 @@ def write_ezfio(res, filename): MoMatrix = [] sym0 = [i.sym for i in res.mo_sets[MO_type]] sym = [i.sym for i in res.mo_sets[MO_type]] - for i in xrange(len(sym)): + for i in range(len(sym)): sym[MOmap[i]] = sym0[i] MoMatrix = [] - for i in xrange(len(MOs)): + for i in range(len(MOs)): m = MOs[i] for coef in m.vector: MoMatrix.append(coef) @@ -256,10 +256,10 @@ def write_ezfio(res, filename): ezfio.set_mo_basis_mo_num(mo_num) ezfio.set_mo_basis_mo_occ(OccNum) ezfio.set_mo_basis_mo_coef(MoMatrix) - print "OK" + print("OK") - print "Pseudos\t\t...\t", + print("Pseudos\t\t...\t", end=' ') try: lmax = 0 nucl_charge_remove = [] @@ -327,7 +327,7 @@ def write_ezfio(res, filename): else: ezfio.set_pseudo_do_pseudo(True) - print "OK" + print("OK") @@ -354,15 +354,15 @@ if __name__ == '__main__': except: raise else: - print FILE, 'recognized as', str(RES_FILE).split('.')[-1].split()[0] + print(FILE, 'recognized as', str(RES_FILE).split('.')[-1].split()[0]) write_ezfio(RES_FILE, EZFIO_FILE) sys.stdout.flush() if os.system("qp_run save_ortho_mos "+EZFIO_FILE) != 0: - print """Warning: You need to run + print("""Warning: You need to run qp run save_ortho_mos to be sure your MOs will be orthogonal, which is not the case when -the MOs are read from output files (not enough precision in output).""" +the MOs are read from output files (not enough precision in output).""") diff --git a/bin/qp_set_frozen_core b/bin/qp_set_frozen_core index 25b450dd..b00797e2 100755 --- a/bin/qp_set_frozen_core +++ b/bin/qp_set_frozen_core @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 """ @@ -49,7 +49,7 @@ import os.path try: import qp_path except ImportError: - print "source .quantum_package.rc" + print("source .quantum_package.rc") raise from docopt import docopt @@ -102,7 +102,7 @@ def main(arguments): mo_num = ezfio.mo_basis_mo_num if arguments["--query"]: - print n_frozen + print(n_frozen) sys.exit(0) if n_frozen == 0: diff --git a/external/Python/.gitignore b/external/Python/.gitignore index e69de29b..1cd79fd6 100644 --- a/external/Python/.gitignore +++ b/external/Python/.gitignore @@ -0,0 +1,46 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo +*.pot + +# Django stuff: +*.log + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ diff --git a/ocaml/qp_tunnel.ml b/ocaml/qp_tunnel.ml index e7322995..84e50eb5 100644 --- a/ocaml/qp_tunnel.ml +++ b/ocaml/qp_tunnel.ml @@ -21,10 +21,6 @@ let () = doc="Downloads the EZFIO directory." ; arg=Without_arg; } ; - { short='v' ; long="verbose" ; opt=Optional ; - doc="Prints the transfer speed." ; - arg=Without_arg; } ; - anonymous "(EZFIO_DIR|ADDRESS)" Mandatory @@ -47,11 +43,6 @@ let () = ADDRESS x in - let verbose = - Command_line.get_bool "verbose" - in - - let localhost = Lazy.force TaskServer.ip_address @@ -155,45 +146,6 @@ let () = Zmq.Socket.subscribe socket_in ""; - (* - let action = - if verbose then - begin - match req_or_sub with - | REQ -> (fun () -> - let msg = - Zmq.Socket.recv_all socket_in - in - let t0 = Unix.gettimeofday () in - Zmq.Socket.send_all socket_out msg; - let in_size = - float_of_int ( List.fold_left (fun accu x -> accu + String.length x) 0 msg ) - /. 8192. /. 1024. - in - let msg = - Zmq.Socket.recv_all socket_out - in - let t1 = Unix.gettimeofday () in - Zmq.Socket.send_all socket_in msg; - let in_time = t1 -. t0 in - in_time_sum := !in_time_sum +. in_time; - in_size_sum := !in_size_sum +. in_size; - Printf.printf " %16.2f MiB/s -- %16.2f MiB/s\n%!" (in_size /. in_time) (!in_size_sum /. !in_time_sum); - ) - | SUB -> (fun () -> - Zmq.Socket.recv_all socket_in |> Zmq.Socket.send_all socket_out) - end - else - begin - match req_or_sub with - | REQ -> (fun () -> - Zmq.Socket.recv_all socket_in |> Zmq.Socket.send_all socket_out; - Zmq.Socket.recv_all socket_out |> Zmq.Socket.send_all socket_in ) - | SUB -> (fun () -> - Zmq.Socket.recv_all socket_in |> Zmq.Socket.send_all socket_out) - end - in - *) let action_in = match req_or_sub with diff --git a/scripts/utility/qp_path.py b/scripts/utility/qp_path.py index 0844c06f..5a5c8ca7 100644 --- a/scripts/utility/qp_path.py +++ b/scripts/utility/qp_path.py @@ -1,13 +1,14 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- coding: utf-8 -*- +from __future__ import print_function import os import sys try: QP_ROOT = os.environ['QP_ROOT'] except: - print "source quantum_package.rc" + print("source quantum_package.rc") sys.exit(1) else: QP_EZFIO = os.environ["QP_EZFIO"] diff --git a/tests/bats_to_sh.py b/tests/bats_to_sh.py index 89bf1eb5..7194af77 100755 --- a/tests/bats_to_sh.py +++ b/tests/bats_to_sh.py @@ -1,11 +1,11 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 import sys with open(sys.argv[1],'r') as f: raw_data = f.read() -print "set -x" +print("set -x") output = [] inside = False @@ -25,9 +25,9 @@ for i in raw_data: level -= 1 output.append(new_i) -print "".join(output).replace("@test ", +print("".join(output).replace("@test ", """[[ -z $BATS_TEST_NUMBER ]] && BATS_TEST_NUMBER=0 || ((++BATS_TEST_NUMBER)) ; -export BATS_TEST_DESCRIPTION=""").replace("skip","return") +export BATS_TEST_DESCRIPTION=""").replace("skip","return")) From 4a58d5cc1518d92907ce5b345ad0b3f3105ed019 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 12 Feb 2020 21:12:19 +0100 Subject: [PATCH 02/13] Updated configure --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index e8c22483..2a6cc50f 100755 --- a/configure +++ b/configure @@ -20,14 +20,14 @@ export CC=gcc BATS_URL="https://github.com/bats-core/bats-core/archive/v1.1.0.tar.gz" BUBBLE_URL="https://github.com/projectatomic/bubblewrap/releases/download/v0.3.3/bubblewrap-0.3.3.tar.xz" DOCOPT_URL="https://github.com/docopt/docopt/archive/0.6.2.tar.gz" -EZFIO_URL="https://gitlab.com/scemama/EZFIO/-/archive/v1.6.1/EZFIO-v1.6.1.tar.gz" +EZFIO_URL="https://gitlab.com/scemama/EZFIO/-/archive/v2.0.1/EZFIO-v2.0.1.tar.gz" F77ZMQ_URL="https://github.com/scemama/f77_zmq/archive/v4.2.5.tar.gz" GMP_URL="ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.bz2" IRPF90_URL="https://gitlab.com/scemama/irpf90/-/archive/v1.7.6/irpf90-v1.7.6.tar.gz" LIBCAP_URL="https://git.kernel.org/pub/scm/linux/kernel/git/morgan/libcap.git/snapshot/libcap-2.25.tar.gz" NINJA_URL="https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip" OCAML_URL="https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh" -RESULTS_URL="https://gitlab.com/scemama/resultsFile/-/archive/master/resultsFile-master.tar.gz" +RESULTS_URL="https://gitlab.com/scemama/resultsFile/-/archive/v2.0/resultsFile-v2.0.tar.gz" ZEROMQ_URL="https://github.com/zeromq/libzmq/releases/download/v4.2.5/zeromq-4.2.5.tar.gz" ZLIB_URL="https://www.zlib.net/zlib-1.2.11.tar.gz" From 28578c05626133262dd5d1e2df26de6d9f7349f4 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 5 Mar 2020 08:51:39 +0100 Subject: [PATCH 03/13] use zmq_f77_free.h --- configure | 10 ++++++---- etc/paths.rc | 1 + src/determinants/h_apply.template.f | 3 --- src/zmq/f77_zmq.h | 1 - src/zmq/f77_zmq_module.f90 | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) delete mode 120000 src/zmq/f77_zmq.h diff --git a/configure b/configure index 50046cb1..14e38065 100755 --- a/configure +++ b/configure @@ -278,6 +278,8 @@ EOF download ${ZEROMQ_URL} "${QP_ROOT}"/external/zeromq.tar.gz execute << EOF + export CC=gcc + export CXX=g++ cd "\${QP_ROOT}"/external tar --gunzip --extract --file zeromq.tar.gz rm zeromq.tar.gz @@ -326,8 +328,8 @@ EOF rm ${QP_ROOT}/external/opam_installer.sh # source ${OPAMROOT}/opam-init/init.sh > /dev/null 2> /dev/null || true # -# opam switch create ocaml-base-compiler.4.07.1 - opam init --verbose --yes --compiler=4.07.1 --disable-sandboxing +# opam switch create ocaml-base-compiler.4.10.0 + opam init --verbose --yes --compiler=4.10.0 --disable-sandboxing eval $(opam env) opam install -y ${OCAML_PACKAGES} || exit 1 @@ -346,9 +348,9 @@ EOF EOF rm ${QP_ROOT}/external/opam_installer.sh # source ${OPAMROOT}/opam-init/init.sh > /dev/null 2> /dev/null || true -# opam switch create ocaml-base-compiler.4.07.1 || exit 1 +# opam switch create ocaml-base-compiler.4.10.0 || exit 1 - opam init --verbose --yes --compiler=4.07.1 --disable-sandboxing + opam init --verbose --yes --compiler=4.10.0 --disable-sandboxing eval $(opam env) execute << EOF opam install -y \${OCAML_PACKAGES} || exit 1 diff --git a/etc/paths.rc b/etc/paths.rc index ce82358a..366286d7 100644 --- a/etc/paths.rc +++ b/etc/paths.rc @@ -38,5 +38,6 @@ export LD_LIBRARY_PATH=$(qp_prepend_export "LD_LIBRARY_PATH" "${QP_ROOT}"/lib) export LIBRARY_PATH=$(qp_prepend_export "LIBRARY_PATH" "${QP_ROOT}"/lib:"${QP_ROOT}"/lib64) export C_INCLUDE_PATH=$(qp_prepend_export "C_INCLUDE_PATH" "${QP_ROOT}"/include) +export CPATH=$(qp_prepend_export "CPATH" "${QP_ROOT}"/include) diff --git a/src/determinants/h_apply.template.f b/src/determinants/h_apply.template.f index f16d2e7f..c57f93b5 100644 --- a/src/determinants/h_apply.template.f +++ b/src/determinants/h_apply.template.f @@ -240,9 +240,6 @@ subroutine $subroutine_diexcOrg(key_in,key_mask,hole_1,particl_1,hole_2, particl ! hole = a^(+)_j_a(ispin) a_i_a(ispin)|key_in> : single exc :: orb(i_a,ispin) --> orb(j_a,ispin) hole_save = hole - ! Build array of the non-zero integrals of second excitation - $filter_integrals - if (ispin == 1) then integer :: jjj diff --git a/src/zmq/f77_zmq.h b/src/zmq/f77_zmq.h deleted file mode 120000 index ac5e33cd..00000000 --- a/src/zmq/f77_zmq.h +++ /dev/null @@ -1 +0,0 @@ -../../include/f77_zmq_free.h \ No newline at end of file diff --git a/src/zmq/f77_zmq_module.f90 b/src/zmq/f77_zmq_module.f90 index d0f551fa..1e4a5af3 100644 --- a/src/zmq/f77_zmq_module.f90 +++ b/src/zmq/f77_zmq_module.f90 @@ -1,4 +1,4 @@ module f77_zmq - include 'f77_zmq.h' + include 'f77_zmq_free.h' end module From f79d5fbeb516dee77856bed36cc5b24da779d91b Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 5 Mar 2020 09:36:52 +0100 Subject: [PATCH 04/13] Flags for AMD --- config/ifort_avx.cfg | 8 ++--- config/ifort_avx_mpi.cfg | 8 ++--- config/ifort_debug.cfg | 8 ++--- config/ifort_epyc.cfg | 63 ---------------------------------------- config/ifort_mpi.cfg | 8 ++--- 5 files changed, 16 insertions(+), 79 deletions(-) delete mode 100644 config/ifort_epyc.cfg diff --git a/config/ifort_avx.cfg b/config/ifort_avx.cfg index d3fcd1f0..25bf35eb 100644 --- a/config/ifort_avx.cfg +++ b/config/ifort_avx.cfg @@ -9,14 +9,14 @@ FC : ifort -fpic LAPACK_LIB : -mkl=parallel IRPF90 : irpf90 -IRPF90_FLAGS : --ninja --align=32 +IRPF90_FLAGS : --ninja --align=32 # Global options ################ # # 1 : Activate # 0 : Deactivate -# +# [OPTION] MODE : OPT ; [ OPT | PROFILE | DEBUG ] : Chooses the section below CACHE : 0 ; Enable cache_compile.py @@ -32,14 +32,14 @@ OPENMP : 1 ; Append OpenMP flags # [OPT] FC : -traceback -FCFLAGS : -xAVX -O2 -ip -ftz -g +FCFLAGS : -mavx -axAVX -O2 -ip -ftz -g # Profiling flags ################# # [PROFILE] FC : -p -g -FCFLAGS : -xSSE4.2 -O2 -ip -ftz +FCFLAGS : -xSSE4.2 -O2 -ip -ftz # Debugging flags ################# diff --git a/config/ifort_avx_mpi.cfg b/config/ifort_avx_mpi.cfg index 550dbf91..9a839e66 100644 --- a/config/ifort_avx_mpi.cfg +++ b/config/ifort_avx_mpi.cfg @@ -9,14 +9,14 @@ FC : mpiifort -fpic LAPACK_LIB : -mkl=parallel IRPF90 : irpf90 -IRPF90_FLAGS : --ninja --align=32 -DMPI +IRPF90_FLAGS : --ninja --align=32 -DMPI # Global options ################ # # 1 : Activate # 0 : Deactivate -# +# [OPTION] MODE : OPT ; [ OPT | PROFILE | DEBUG ] : Chooses the section below CACHE : 0 ; Enable cache_compile.py @@ -31,14 +31,14 @@ OPENMP : 1 ; Append OpenMP flags # -ftz : Flushes denormal results to zero # [OPT] -FCFLAGS : -march=corei7-avx -O2 -ip -ftz -g -traceback +FCFLAGS : -mavx -axAVX -O2 -ip -ftz -g -traceback # Profiling flags ################# # [PROFILE] FC : -p -g -FCFLAGS : -march=corei7 -O2 -ip -ftz +FCFLAGS : -march=corei7 -O2 -ip -ftz # Debugging flags diff --git a/config/ifort_debug.cfg b/config/ifort_debug.cfg index 32e4d895..f0f90f34 100644 --- a/config/ifort_debug.cfg +++ b/config/ifort_debug.cfg @@ -32,7 +32,7 @@ OPENMP : 1 ; Append OpenMP flags # [OPT] FC : -traceback -FCFLAGS : -xSSE4.2 -O2 -ip -ftz -g +FCFLAGS : -msse4.2 -O2 -ip -ftz -g # Profiling flags @@ -40,7 +40,7 @@ FCFLAGS : -xSSE4.2 -O2 -ip -ftz -g # [PROFILE] FC : -p -g -FCFLAGS : -xSSE4.2 -O2 -ip -ftz +FCFLAGS : -msse4.2 -O2 -ip -ftz # Debugging flags @@ -50,11 +50,11 @@ FCFLAGS : -xSSE4.2 -O2 -ip -ftz # -fpe0 : All floating point exaceptions # -C : Checks uninitialized variables, array subscripts, etc... # -g : Extra debugging information -# -xSSE2 : Valgrind needs a very simple x86 executable +# -msse4.2 : Valgrind needs a very simple x86 executable # [DEBUG] FC : -g -traceback -FCFLAGS : -xSSE4.2 -C -fpe0 -implicitnone +FCFLAGS : -msse4.2 -C -fpe0 -implicitnone # OpenMP flags diff --git a/config/ifort_epyc.cfg b/config/ifort_epyc.cfg deleted file mode 100644 index 1b2427de..00000000 --- a/config/ifort_epyc.cfg +++ /dev/null @@ -1,63 +0,0 @@ -# Common flags -############## -# -# -mkl=[parallel|sequential] : Use the MKL library -# --ninja : Allow the utilisation of ninja. It is mandatory ! -# --align=32 : Align all provided arrays on a 32-byte boundary -# -[COMMON] -FC : ifort -fpic -LAPACK_LIB : -mkl=parallel -IRPF90 : irpf90 -IRPF90_FLAGS : --ninja --align=32 - -# Global options -################ -# -# 1 : Activate -# 0 : Deactivate -# -[OPTION] -MODE : OPT ; [ OPT | PROFILE | DEBUG ] : Chooses the section below -CACHE : 0 ; Enable cache_compile.py -OPENMP : 1 ; Append OpenMP flags - -# Optimization flags -#################### -# -# -xHost : Compile a binary optimized for the current architecture -# -O2 : O3 not better than O2. -# -ip : Inter-procedural optimizations -# -ftz : Flushes denormal results to zero -# -[OPT] -FC : -traceback -FCFLAGS : -march=core-avx2 -O2 -ip -ftz -g - -# Profiling flags -################# -# -[PROFILE] -FC : -p -g -FCFLAGS : -march=core-avx2 -O2 -ip -ftz - -# Debugging flags -################# -# -# -traceback : Activate backtrace on runtime -# -fpe0 : All floating point exaceptions -# -C : Checks uninitialized variables, array subscripts, etc... -# -g : Extra debugging information -# -xSSE2 : Valgrind needs a very simple x86 executable -# -[DEBUG] -FC : -g -traceback -FCFLAGS : -xSSE2 -C -fpe0 -implicitnone - -# OpenMP flags -################# -# -[OPENMP] -FC : -qopenmp -IRPF90_FLAGS : --openmp - diff --git a/config/ifort_mpi.cfg b/config/ifort_mpi.cfg index 5c3b1782..57087847 100644 --- a/config/ifort_mpi.cfg +++ b/config/ifort_mpi.cfg @@ -9,14 +9,14 @@ FC : mpiifort -fpic LAPACK_LIB : -mkl=parallel IRPF90 : irpf90 -IRPF90_FLAGS : --ninja --align=32 -DMPI +IRPF90_FLAGS : --ninja --align=32 -DMPI # Global options ################ # # 1 : Activate # 0 : Deactivate -# +# [OPTION] MODE : OPT ; [ OPT | PROFILE | DEBUG ] : Chooses the section below CACHE : 0 ; Enable cache_compile.py @@ -31,14 +31,14 @@ OPENMP : 1 ; Append OpenMP flags # -ftz : Flushes denormal results to zero # [OPT] -FCFLAGS : -xSSE4.2 -O2 -ip -ftz -g -traceback +FCFLAGS : -msse4.2 -O2 -ip -ftz -g -traceback # Profiling flags ################# # [PROFILE] FC : -p -g -FCFLAGS : -xSSE4.2 -O2 -ip -ftz +FCFLAGS : -msse4.2 -O2 -ip -ftz # Debugging flags From ac35c8dbbbc950cc2b2a16a7bf9131742386f39e Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Thu, 5 Mar 2020 14:19:43 +0100 Subject: [PATCH 05/13] Added f77_zmq_free.h for gfortran --- scripts/compilation/qp_create_ninja | 2 +- src/zmq/f77_zmq_free.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 120000 src/zmq/f77_zmq_free.h diff --git a/scripts/compilation/qp_create_ninja b/scripts/compilation/qp_create_ninja index 8381d1a2..bb064d85 100755 --- a/scripts/compilation/qp_create_ninja +++ b/scripts/compilation/qp_create_ninja @@ -511,7 +511,7 @@ def ninja_irpf90_make_build(path_module, l_needed_molule, d_irp): # N i n j a _ b u i l d # # ~#~#~#~#~#~#~#~#~#~#~ # - l_include_dir = ["-I {0}".format(m.rel) for m in l_needed_molule] + l_include_dir = ["-I {0}".format(m.rel) for m in l_needed_molule] l_string = [ "build {0}: build_irpf90.ninja {1}".format(str_creation, str_depend), diff --git a/src/zmq/f77_zmq_free.h b/src/zmq/f77_zmq_free.h new file mode 120000 index 00000000..ac5e33cd --- /dev/null +++ b/src/zmq/f77_zmq_free.h @@ -0,0 +1 @@ +../../include/f77_zmq_free.h \ No newline at end of file From 5951d4338a069d9bf3186789067c08e28f2abb4e Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 6 Mar 2020 13:36:46 +0100 Subject: [PATCH 06/13] More robust SCF --- src/scf_utils/diagonalize_fock.irp.f | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/scf_utils/diagonalize_fock.irp.f b/src/scf_utils/diagonalize_fock.irp.f index 865b4d31..288fb3e8 100644 --- a/src/scf_utils/diagonalize_fock.irp.f +++ b/src/scf_utils/diagonalize_fock.irp.f @@ -7,11 +7,11 @@ BEGIN_PROVIDER [ double precision, eigenvectors_Fock_matrix_mo, (ao_num,mo_num) integer :: i,j integer :: liwork, lwork, n, info integer, allocatable :: iwork(:) - double precision, allocatable :: work(:), F(:,:), S(:,:) + double precision, allocatable :: work(:), F(:,:), F_save(:,:) double precision, allocatable :: diag(:) - allocate( F(mo_num,mo_num) ) + allocate( F(mo_num,mo_num), F_save(mo_num,mo_num) ) allocate (diag(mo_num) ) do j=1,mo_num @@ -51,6 +51,7 @@ BEGIN_PROVIDER [ double precision, eigenvectors_Fock_matrix_mo, (ao_num,mo_num) lwork = -1 liwork = -1 + F_save = F call dsyevd( 'V', 'U', mo_num, F, & size(F,1), diag, work, lwork, iwork, liwork, info) @@ -71,6 +72,7 @@ BEGIN_PROVIDER [ double precision, eigenvectors_Fock_matrix_mo, (ao_num,mo_num) if (info /= 0) then + F = F_save call dsyev( 'V', 'L', mo_num, F, & size(F,1), diag, work, lwork, info) @@ -83,7 +85,7 @@ BEGIN_PROVIDER [ double precision, eigenvectors_Fock_matrix_mo, (ao_num,mo_num) call dgemm('N','N',ao_num,mo_num,mo_num, 1.d0, & mo_coef, size(mo_coef,1), F, size(F,1), & 0.d0, eigenvectors_Fock_matrix_mo, size(eigenvectors_Fock_matrix_mo,1)) - deallocate(work, F, diag) + deallocate(work, F, F_save, diag) END_PROVIDER From 2d81db391178f7e7b0a25175016a74647672cab5 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 6 Mar 2020 13:55:37 +0100 Subject: [PATCH 07/13] More stable SCF --- src/scf_utils/diagonalize_fock.irp.f | 6 ++++-- src/scf_utils/roothaan_hall_scf.irp.f | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/scf_utils/diagonalize_fock.irp.f b/src/scf_utils/diagonalize_fock.irp.f index 865b4d31..1e6fa1af 100644 --- a/src/scf_utils/diagonalize_fock.irp.f +++ b/src/scf_utils/diagonalize_fock.irp.f @@ -7,11 +7,11 @@ BEGIN_PROVIDER [ double precision, eigenvectors_Fock_matrix_mo, (ao_num,mo_num) integer :: i,j integer :: liwork, lwork, n, info integer, allocatable :: iwork(:) - double precision, allocatable :: work(:), F(:,:), S(:,:) + double precision, allocatable :: work(:), F(:,:), F_save(:,:) double precision, allocatable :: diag(:) - allocate( F(mo_num,mo_num) ) + allocate( F(mo_num,mo_num), F_save(mo_num,mo_num) ) allocate (diag(mo_num) ) do j=1,mo_num @@ -51,6 +51,7 @@ BEGIN_PROVIDER [ double precision, eigenvectors_Fock_matrix_mo, (ao_num,mo_num) lwork = -1 liwork = -1 + F_save = F call dsyevd( 'V', 'U', mo_num, F, & size(F,1), diag, work, lwork, iwork, liwork, info) @@ -71,6 +72,7 @@ BEGIN_PROVIDER [ double precision, eigenvectors_Fock_matrix_mo, (ao_num,mo_num) if (info /= 0) then + F = F_save call dsyev( 'V', 'L', mo_num, F, & size(F,1), diag, work, lwork, info) diff --git a/src/scf_utils/roothaan_hall_scf.irp.f b/src/scf_utils/roothaan_hall_scf.irp.f index faf23a51..ea472cdf 100644 --- a/src/scf_utils/roothaan_hall_scf.irp.f +++ b/src/scf_utils/roothaan_hall_scf.irp.f @@ -299,6 +299,7 @@ END_DOC Fock_matrix_AO_(i,j) = 0.d0 enddo do k=1,dim_DIIS + if (dabs(X_vector_DIIS(k)) < 1.d-10) cycle do i=1,ao_num Fock_matrix_AO_(i,j) = Fock_matrix_AO_(i,j) + & X_vector_DIIS(k)*Fock_matrix_DIIS(i,j,dim_DIIS-k+1) From 22e54cecd1ba522d44e10bd14958f3a0d1e60492 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 6 Mar 2020 15:47:33 +0100 Subject: [PATCH 08/13] Fixed broken filter_integrals in h_apply --- scripts/generate_h_apply.py | 6 ++++++ src/determinants/h_apply.template.f | 9 ++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/scripts/generate_h_apply.py b/scripts/generate_h_apply.py index 8c399e55..ef22a539 100644 --- a/scripts/generate_h_apply.py +++ b/scripts/generate_h_apply.py @@ -11,6 +11,7 @@ declarations decls_main deinit_thread init_main +filter_integrals filter2p filter2h2p_double filter2h2p_single @@ -104,6 +105,11 @@ class H_apply(object): s["do_mono_excitations"] = d[do_mono_exc] s["do_double_excitations"] = d[do_double_exc] s["keys_work"] += "call fill_H_apply_buffer_no_selection(key_idx,keys_out,N_int,iproc)" + s["filter_integrals"] = "array_pairs = .True." + if SingleRef: + s["filter_integrals"] = """ + call get_mo_bielec_integrals_existing_ik(i_a,j_a,mo_num,array_pairs,mo_integrals_map) + """ s["generate_psi_guess"] = """ ! Sort H_jj to find the N_states lowest states diff --git a/src/determinants/h_apply.template.f b/src/determinants/h_apply.template.f index c57f93b5..abdd6862 100644 --- a/src/determinants/h_apply.template.f +++ b/src/determinants/h_apply.template.f @@ -240,7 +240,10 @@ subroutine $subroutine_diexcOrg(key_in,key_mask,hole_1,particl_1,hole_2, particl ! hole = a^(+)_j_a(ispin) a_i_a(ispin)|key_in> : single exc :: orb(i_a,ispin) --> orb(j_a,ispin) hole_save = hole - if (ispin == 1) then + ! Build array of the non-zero integrals of second excitation + $filter_integrals + + if (ispin == 1) then integer :: jjj i=0 @@ -282,7 +285,7 @@ subroutine $subroutine_diexcOrg(key_in,key_mask,hole_1,particl_1,hole_2, particl $only_1h_double $only_1p_double $only_2h1p_double - $filter_only_connected_to_hf_double + $filter_only_connected_to_hf_double key_idx += 1 do k=1,N_int keys_out(k,1,key_idx) = key(k,1) @@ -494,7 +497,7 @@ subroutine $subroutine_monoexc(key_in, hole_1,particl_1,fock_diag_tmp,i_generato $filter_only_1h1p_single $filter_only_1h2p_single $filter_only_2h2p_single - $filter_only_connected_to_hf_single + $filter_only_connected_to_hf_single key_idx += 1 do k=1,N_int keys_out(k,1,key_idx) = hole(k,1) From 77ca529072cce4dc31adb77c278ccf008801f6eb Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 6 Mar 2020 18:12:04 +0100 Subject: [PATCH 09/13] Perturbation type --- ocaml/qptypes_generator.ml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ocaml/qptypes_generator.ml b/ocaml/qptypes_generator.ml index 2c54a218..ce99fc78 100644 --- a/ocaml/qptypes_generator.ml +++ b/ocaml/qptypes_generator.ml @@ -219,22 +219,19 @@ module Perturbation : sig end = struct type t = | EN - | Barycentric - | Variance + | HF | SOP [@@deriving sexp] let to_string = function | EN -> \"EN\" - | Variance -> \"Variance\" - | Barycentric -> \"Barycentric\" + | HF -> \"HF\" | SOP -> \"SOP\" let of_string s = match (String.lowercase_ascii s) with | \"sop\" -> SOP | \"en\" -> EN - | \"variance\" -> Variance - | \"barycentric\" -> Barycentric + | \"hf\" -> HF | _ -> raise (Invalid_argument (\"Wrong Perturbation type : \"^s)) end " From d9e20245547ef26a05c8c3c6ad79b66114ab1dc3 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sat, 7 Mar 2020 11:40:42 +0100 Subject: [PATCH 10/13] Cleaning in CIPSI --- src/cipsi/cipsi.irp.f | 1 + src/cipsi/energy.irp.f | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cipsi/cipsi.irp.f b/src/cipsi/cipsi.irp.f index ba922c49..a6ab6f8e 100644 --- a/src/cipsi/cipsi.irp.f +++ b/src/cipsi/cipsi.irp.f @@ -108,6 +108,7 @@ subroutine run_cipsi n_det_before = N_det to_select = int(sqrt(dble(N_states))*dble(N_det)*selection_factor) to_select = max(N_states_diag, to_select) + to_select = max(to_select,1) call ZMQ_selection(to_select, pt2, variance, norm) PROVIDE psi_coef diff --git a/src/cipsi/energy.irp.f b/src/cipsi/energy.irp.f index 0ae5ad79..37b29593 100644 --- a/src/cipsi/energy.irp.f +++ b/src/cipsi/energy.irp.f @@ -22,8 +22,6 @@ BEGIN_PROVIDER [ double precision, pt2_E0_denominator, (N_states) ] enddo else if (h0_type == "Barycentric") then pt2_E0_denominator(1:N_states) = barycentric_electronic_energy(1:N_states) - else if (h0_type == "Variance") then - pt2_E0_denominator(1:N_states) = psi_energy(1:N_states) !1.d0-nuclear_repulsion else if (h0_type == "SOP") then pt2_E0_denominator(1:N_states) = psi_energy(1:N_states) else From 1a1d73cd6c3d4cee6b097b95aac377bd6cb1d065 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 17 Mar 2020 16:14:55 +0100 Subject: [PATCH 11/13] Message for S2 eigenvalues --- bin/qp_reset | 1 + src/davidson/diagonalize_ci.irp.f | 40 ++++++++++++++--------------- src/determinants/determinants.irp.f | 2 +- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/bin/qp_reset b/bin/qp_reset index b8c07adf..59646835 100755 --- a/bin/qp_reset +++ b/bin/qp_reset @@ -95,6 +95,7 @@ qp set_file $ezfio if [[ $dets -eq 1 ]] ; then rm --force -- ${ezfio}/determinants/n_det rm --force -- ${ezfio}/determinants/psi_{det,coef}.gz + rm --force -- ${ezfio}/determinants/psi_{det,coef}_qp_edit.gz fi if [[ $mos -eq 1 ]] ; then diff --git a/src/davidson/diagonalize_ci.irp.f b/src/davidson/diagonalize_ci.irp.f index 8339406f..996011cd 100644 --- a/src/davidson/diagonalize_ci.irp.f +++ b/src/davidson/diagonalize_ci.irp.f @@ -118,22 +118,22 @@ END_PROVIDER call u_0_S2_u_0(s2_eigvalues,eigenvectors,N_det,psi_det,N_int,& N_det,size(eigenvectors,1)) if (only_expected_s2) then - do j=1,N_det - ! Select at least n_states states with S^2 values closed to "expected_s2" - if(dabs(s2_eigvalues(j)-expected_s2).le.0.5d0)then - i_state +=1 - index_good_state_array(i_state) = j - good_state_array(j) = .True. - endif - if(i_state.eq.N_states) then - exit - endif - enddo - else - do j=1,N_det - index_good_state_array(j) = j + do j=1,N_det + ! Select at least n_states states with S^2 values closed to "expected_s2" + if(dabs(s2_eigvalues(j)-expected_s2).le.0.5d0)then + i_state +=1 + index_good_state_array(i_state) = j good_state_array(j) = .True. - enddo + endif + if(i_state.eq.N_states) then + exit + endif + enddo + else + do j=1,N_det + index_good_state_array(j) = j + good_state_array(j) = .True. + enddo endif if(i_state .ne.0)then ! Fill the first "i_state" states that have a correct S^2 value @@ -163,7 +163,7 @@ END_PROVIDER print*,'!!!!!!!! WARNING !!!!!!!!!' print*,' Within the ',N_det,'determinants selected' print*,' and the ',N_states_diag,'states requested' - print*,' We did not find any state with S^2 values close to ',expected_s2 + print*,' We did not find only states with S^2 values close to ',expected_s2 print*,' We will then set the first N_states eigenvectors of the H matrix' print*,' as the CI_eigenvectors' print*,' You should consider more states and maybe ask for s2_eig to be .True. or just enlarge the CI space' @@ -179,11 +179,11 @@ END_PROVIDER deallocate(index_good_state_array,good_state_array) deallocate(s2_eigvalues) else - call lapack_diag(eigenvalues,eigenvectors, & + call lapack_diag(eigenvalues,eigenvectors, & H_matrix_all_dets,size(H_matrix_all_dets,1),N_det) CI_electronic_energy(:) = 0.d0 - call u_0_S2_u_0(CI_s2,eigenvectors,N_det,psi_det,N_int,& - min(N_det,N_states_diag),size(eigenvectors,1)) + call u_0_S2_u_0(CI_s2,eigenvectors,N_det,psi_det,N_int, & + min(N_det,N_states_diag),size(eigenvectors,1)) ! Select the "N_states_diag" states of lowest energy do j=1,min(N_det,N_states_diag) do i=1,N_det @@ -213,7 +213,7 @@ subroutine diagonalize_CI ! Replace the coefficients of the |CI| states by the coefficients of the ! eigenstates of the |CI| matrix. END_DOC - integer :: i,j + integer :: i,j do j=1,N_states do i=1,N_det psi_coef(i,j) = CI_eigenvectors(i,j) diff --git a/src/determinants/determinants.irp.f b/src/determinants/determinants.irp.f index 71ee3d89..79621648 100644 --- a/src/determinants/determinants.irp.f +++ b/src/determinants/determinants.irp.f @@ -771,7 +771,7 @@ subroutine apply_excitation(det, exc, res, ok, Nint) case default print *, degree print *, "apply ex" -! print *, 1.d0/0.d0 ! For traceback + print *, 1.d0/0.d0 ! For traceback STOP end select ! END INLINE From 79f47d024bfbae8bfb3bc46ab8c7142d787c4e50 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Tue, 17 Mar 2020 16:39:43 +0100 Subject: [PATCH 12/13] First python3 3 working installation --- INSTALL.rst | 44 ++++---- bin/qp_basis | 4 +- bin/qp_name | 28 +++--- bin/qp_plugins | 68 ++++++------- bin/qp_set_frozen_large_core | 6 +- bin/qp_test | 18 ++-- configure | 6 +- docs/Makefile | 2 +- docs/source/auto_generate.py | 6 +- etc/irpf90.rc | 6 +- external/EZFIO.1.6.2.tar.gz | Bin 26530 -> 0 bytes external/EZFIO.2.0.2.tar.gz | Bin 0 -> 26640 bytes scripts/compilation/cache_compile.py | 8 +- scripts/compilation/qp_create_ninja | 45 +++++---- scripts/compilation/read_compilation_cfg.py | 14 +-- scripts/ezfio_interface/ei_handler.py | 54 +++++----- .../ezfio_interface/ezfio_generate_ocaml.py | 10 +- .../ezfio_generate_provider.py | 8 +- scripts/generate_h_apply.py | 4 +- scripts/hello.py | 6 +- scripts/module/module_handler.py | 27 ++--- scripts/perturbation.py | 8 +- scripts/utility/get_groups | 26 ++--- scripts/utility/qp_bitmasks.py | 2 +- scripts/utility/qp_path.py | 2 +- src/cis/h_apply.irp.f | 6 +- src/cisd/h_apply.irp.f | 6 +- src/density_for_dft/EZFIO.cfg | 12 +-- src/determinants/EZFIO.cfg | 1 - src/dft_one_e/e_xc_general.irp.f | 42 ++++---- src/dft_one_e/pot_general.irp.f | 94 +++++++++--------- src/perturbation/perturbation.irp.f | 4 +- src/perturbation/perturbation.template.f | 2 +- 33 files changed, 284 insertions(+), 285 deletions(-) delete mode 100644 external/EZFIO.1.6.2.tar.gz create mode 100644 external/EZFIO.2.0.2.tar.gz diff --git a/INSTALL.rst b/INSTALL.rst index 979c8edd..f1657dbb 100644 --- a/INSTALL.rst +++ b/INSTALL.rst @@ -25,8 +25,8 @@ sets all the environment variables required for the normal operation of the Running this script will also tell you which external dependencies are missing and need to be installed. -When all dependencies have been installed, ( the :command:`configure` will tell you) -source the :file:`quantum_package.rc` in order to load all environment variables and compile the |QP|. +When all dependencies have been installed, ( the :command:`configure` will tell you) +source the :file:`quantum_package.rc` in order to load all environment variables and compile the |QP|. Requirements @@ -36,7 +36,7 @@ Requirements - Fortran compiler : GNU Fortran, Intel Fortran or IBM XL Fortran - `GNU make`_ - `Autoconf`_ -- `Python`_ > 2.6 +- `Python`_ > 3.0 - |IRPF90| : Fortran code generator - |EZFIO| : Easy Fortran Input/Output library generator - |BLAS| and |LAPACK| @@ -44,7 +44,7 @@ Requirements - `GNU Patch`_ - |ZeroMQ| : networking library - `GMP `_ : Gnu Multiple Precision Arithmetic Library -- |OCaml| compiler with |OPAM| package manager +- |OCaml| compiler with |OPAM| package manager - `Bubblewrap `_ : Sandboxing tool required by Opam - `libcap `_ : POSIX capabilities required by Bubblewrap - |Ninja| : a parallel build system @@ -74,29 +74,29 @@ Help for installing external dependencies Using the :command:`configure` executable ----------------------------------------- -The :command:`configure` executable can help you in installing the minimal dependencies you will need to compile the |QP|. -The command is to be used as follows: +The :command:`configure` executable can help you in installing the minimal dependencies you will need to compile the |QP|. +The command is to be used as follows: .. code:: bash ./configure --install -The following packages are supported by the :command:`configure` installer: +The following packages are supported by the :command:`configure` installer: -* ninja -* irpf90 -* zeromq +* ninja +* irpf90 +* zeromq * f77zmq * gmp * libcap * bwrap * ocaml ( :math:`\approx` 10 minutes) -* ezfio -* docopt -* resultsFile +* ezfio +* docopt +* resultsFile * bats -Example: +Example: .. code:: bash @@ -115,7 +115,7 @@ Example: If the :command:`configure` executable fails to install a specific dependency ----------------------------------------------------------------------------- -If the :command:`configure` executable does not succeed to install a specific dependency, +If the :command:`configure` executable does not succeed to install a specific dependency, there are some proposition of how to download and install the minimal dependencies to compile and use the |QP|. @@ -140,7 +140,7 @@ IRPF90 ------ *IRPF90* is a Fortran code generator for programming using the Implicit Reference -to Parameters (IRP) method. +to Parameters (IRP) method. * Download the latest version of IRPF90 here : ``_ and move @@ -312,26 +312,26 @@ OCaml ``_ and move it in the :file:`${QP_ROOT}/external` directory -* If you use OCaml only with the |qp|, you can install the OPAM directory +* If you use OCaml only with the |qp|, you can install the OPAM directory containing the compiler and all the installed libraries in the :file:`${QP_ROOT}/external` directory as .. code:: bash - + export OPAMROOT=${QP_ROOT}/external/opam * Run the installer .. code:: bash - + echo ${QP_ROOT}/bin ${QP_ROOT}/external/opam_installer.sh --no-backup --fresh The :command:`opam` command can be installed in the :file:`${QP_ROOT}/bin` directory. To do this, take the output of ``echo ${QP_ROOT}/bin`` and use it as an answer to where :command:`opam` should be installed. - + * Install the OCaml compiler @@ -370,11 +370,11 @@ Docopt *Docopt* is a Python package defining a command-line interface description language. -If you have *pip* for Python2, you can do +If you have *pip* for Python3, you can do .. code:: bash - pip2 install --user docopt + python3 -m pip install --user docopt Otherwise, diff --git a/bin/qp_basis b/bin/qp_basis index 87a04ccc..8722205b 100755 --- a/bin/qp_basis +++ b/bin/qp_basis @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @@ -12,7 +12,7 @@ Usage: """ -from __future__ import print_function + import sys import os import subprocess diff --git a/bin/qp_name b/bin/qp_name index f0551652..d15e16d0 100755 --- a/bin/qp_name +++ b/bin/qp_name @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 """ Displays the names of all the files in which the provider/subroutine/function @@ -30,7 +30,7 @@ try: from docopt import docopt from qp_path import QP_SRC, QP_ROOT except ImportError: - print "source .quantum_package.rc" + print("source .quantum_package.rc") raise @@ -38,7 +38,7 @@ def main(arguments): """Main function""" # Check that name exist in */IRPF90_man - print "Checking that name exists..." + print("Checking that name exists...") all_modules = os.listdir(QP_SRC) f = arguments[""]+".l" @@ -52,21 +52,21 @@ def main(arguments): if found: break if not found: - print "Error:" - print "The variable/subroutine/function \""+arguments[""] \ - + "\" was not found in the sources." - print "Did you compile the code at the root?" - print "Continue? [y/N] ", + print("Error:") + print("The variable/subroutine/function \""+arguments[""] \ + + "\" was not found in the sources.") + print("Did you compile the code at the root?") + print("Continue? [y/N] ", end=' ') cont = sys.stdin.read(1).strip() in ["y", "Y"] if not cont: - print "Aborted" + print("Aborted") sys.exit(1) # Now search in all the files if arguments["--rename"]: - print "Replacing..." + print("Replacing...") else: - print "Searching..." + print("Searching...") name = re.compile(r"\b"+arguments[""]+r"\b", re.IGNORECASE) @@ -84,15 +84,15 @@ def main(arguments): with open(filename, "r") as f: f_in = f.read() if name.search(f_in): - print filename + print(filename) if arguments["--rename"]: f_new = name.sub(arguments["--rename"], f_in) with open(filename, "w") as f: f.write(f_new) - print "Done" + print("Done") with open(os.path.join(QP_ROOT, "REPLACE"), 'a') as f: - print >>f, "qp_name "+" ".join(sys.argv[1:]) + print("qp_name "+" ".join(sys.argv[1:]), file=f) diff --git a/bin/qp_plugins b/bin/qp_plugins index b32f907f..ef0f5a45 100755 --- a/bin/qp_plugins +++ b/bin/qp_plugins @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Usage: @@ -43,9 +43,9 @@ try: from module_handler import get_l_module_descendant from qp_path import QP_SRC, QP_PLUGINS, QP_DATA, QP_ROOT except ImportError: - print "Please check if you have sourced the ${QP_ROOT}/quantum_package.rc" - print "(`source ${QP_ROOT}/quantum_package.rc`)" - print sys.exit(1) + print("Please check if you have sourced the ${QP_ROOT}/quantum_package.rc") + print("(`source ${QP_ROOT}/quantum_package.rc`)") + print(sys.exit(1)) def save_new_module(path, l_child): @@ -58,7 +58,7 @@ def save_new_module(path, l_child): try: os.makedirs(path) except OSError: - print "The module ({0}) already exists...".format(path) + print("The module ({0}) already exists...".format(path)) sys.exit(1) with open(os.path.join(path, "NEED"), "w") as f: @@ -105,7 +105,7 @@ def main(arguments): if arguments["list"]: if arguments["--repositories"]: for repo in get_repositories(): - print repo + print(repo) else: # Search in QP_PLUGINS all directories with a NEED file @@ -121,7 +121,7 @@ def main(arguments): for (x, y) in l_tmp: d_tmp[x] = y repo_of_plugin[y] = x.replace(QP_PLUGINS+'/','') - l_repository = d_tmp.keys() + l_repository = list(d_tmp.keys()) if l_repository == []: l_result = [] else: @@ -142,7 +142,7 @@ def main(arguments): l_result = [f for f in l_plugins if f not in l_installed] for module in sorted(l_result): - print "%-30s %-30s"%(module, repo_of_plugin[module]) + print("%-30s %-30s"%(module, repo_of_plugin[module])) if arguments["create"]: @@ -159,29 +159,29 @@ def main(arguments): path = os.path.join(QP_PLUGINS, repository, name) - print "Created plugin:" - print path, '\n' + print("Created plugin:") + print(path, '\n') for children in l_children: if children not in m_instance.dict_descendant: - print "Error: {0} is not a valid module.".format(children) + print("Error: {0} is not a valid module.".format(children)) sys.exit(1) - print "Needed modules:" - print l_children, '\n' + print("Needed modules:") + print(l_children, '\n') - print "This corresponds to using the following modules:" - print l_children + m_instance.l_descendant_unique(l_children), '\n' + print("This corresponds to using the following modules:") + print(l_children + m_instance.l_descendant_unique(l_children), '\n') - print "Which is reduced to:" + print("Which is reduced to:") l_child_reduce = m_instance.l_reduce_tree(l_children) - print l_child_reduce, '\n' + print(l_child_reduce, '\n') - print "Installation", + print("Installation", end=' ') save_new_module(path, l_child_reduce) - print " [ OK ]" - print "" + print(" [ OK ]") + print("") arguments["create"] = False arguments["install"] = True main(arguments) @@ -228,7 +228,7 @@ def main(arguments): for (x, y) in [os.path.split(f) for f in l_tmp]: d_repo_of_plugin[y] = x d_repo[x] = None - l_repository = d_repo.keys() + l_repository = list(d_repo.keys()) d_plugin = get_dict_child(l_repository) @@ -236,7 +236,7 @@ def main(arguments): d_child.update(d_plugin) normalize_case = {} - for name in d_local.keys() + d_plugin.keys(): + for name in list(d_local.keys()) + list(d_plugin.keys()): normalize_case[name.lower()] = name l_name = [normalize_case[name.lower()] for name in arguments[""]] @@ -244,7 +244,7 @@ def main(arguments): for name in l_name: if name in d_local: - print "{0} Is already installed".format(name) + print("{0} Is already installed".format(name)) l_module_descendant = get_l_module_descendant(d_child, l_name) @@ -252,10 +252,10 @@ def main(arguments): if l_module_to_cp: - print "Required dependencies:" - print l_module_to_cp + print("Required dependencies:") + print(l_module_to_cp) - print "Installation...", + print("Installation...", end=' ') for module_to_cp in l_module_to_cp: src = os.path.join(d_repo_of_plugin[module_to_cp], module_to_cp) @@ -269,10 +269,10 @@ def main(arguments): subprocess.check_call([install]) os.chdir(wd) except OSError: - print "The src directory is broken. Please remove %s" % des + print("The src directory is broken. Please remove %s" % des) raise subprocess.check_call(["qp_create_ninja", "update"]) - print "[ OK ]" + print("[ OK ]") elif arguments["uninstall"]: @@ -285,17 +285,17 @@ def main(arguments): l_failed = [name for name in l_name if name not in d_local] if l_failed: - print "Plugins not installed:" + print("Plugins not installed:") for name in sorted(l_failed): - print "%s" % name + print("%s" % name) sys.exit(1) l_name_to_remove = l_name + \ [module for module in m_instance.l_module \ for name in l_name if name in d_descendant[module]] - print "Removing plugins:" - print l_name_to_remove + print("Removing plugins:") + print(l_name_to_remove) for module in set(l_name_to_remove): @@ -310,7 +310,7 @@ def main(arguments): try: os.unlink(os.path.join(QP_SRC, module)) except OSError: - print "%s is a core module which can't be removed" % module + print("%s is a core module which can't be removed" % module) elif arguments["update"]: @@ -321,7 +321,7 @@ def main(arguments): l_repositories = get_repositories() for repo in l_repositories: - print "Updating ", repo + print("Updating ", repo) os.chdir(os.path.join(QP_PLUGINS,repo)) git_cmd=["git", "pull"] subprocess.check_call(git_cmd) diff --git a/bin/qp_set_frozen_large_core b/bin/qp_set_frozen_large_core index cce5ca70..6950b90c 100755 --- a/bin/qp_set_frozen_large_core +++ b/bin/qp_set_frozen_large_core @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 """ @@ -23,7 +23,7 @@ import os.path try: import qp_path except ImportError: - print "source .quantum_package.rc" + print("source .quantum_package.rc") raise from docopt import docopt @@ -62,7 +62,7 @@ def main(arguments): mo_num = ezfio.mo_basis_mo_num if arguments["--query"]: - print n_frozen + print(n_frozen) sys.exit(0) if n_frozen == 0: diff --git a/bin/qp_test b/bin/qp_test index e1730cc8..67b3ea02 100755 --- a/bin/qp_test +++ b/bin/qp_test @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @@ -21,8 +21,8 @@ try: from docopt import docopt from qp_path import QP_SRC, QP_TESTS except ImportError: - print "Please check if you have sourced the ${QP_ROOT}/quantum_package.rc" - print "(`source ${QP_ROOT}/quantum_package.rc`)" + print("Please check if you have sourced the ${QP_ROOT}/quantum_package.rc") + print("(`source ${QP_ROOT}/quantum_package.rc`)") sys.exit(1) @@ -54,11 +54,11 @@ def main(arguments): os.chdir(QP_TESTS) for bats_file in l_bats: - print "" - print "-~-~-~-~-~-~" - print "" - print "Running tests for %s"%(bats_file) - print "" + print("") + print("-~-~-~-~-~-~") + print("") + print("Running tests for %s"%(bats_file)) + print("") if arguments["-v"]: p = None if arguments["TEST"]: @@ -66,7 +66,7 @@ def main(arguments): else: test = "" try: - os.system(test+" python2 bats_to_sh.py "+bats_file+ + os.system(test+" python3 bats_to_sh.py "+bats_file+ "| bash") except: if p: diff --git a/configure b/configure index b786cc52..5c5ce1ab 100755 --- a/configure +++ b/configure @@ -17,14 +17,14 @@ export CC=gcc # /!\ When updating version, update also etc files -EZFIO_TGZ="EZFIO.1.6.2.tar.gz" +EZFIO_TGZ="EZFIO.2.0.2.tar.gz" BATS_URL="https://github.com/bats-core/bats-core/archive/v1.1.0.tar.gz" BUBBLE_URL="https://github.com/projectatomic/bubblewrap/releases/download/v0.3.3/bubblewrap-0.3.3.tar.xz" DOCOPT_URL="https://github.com/docopt/docopt/archive/0.6.2.tar.gz" BSE_URL="https://github.com/MolSSI-BSE/basis_set_exchange/archive/v0.8.11.tar.gz" F77ZMQ_URL="https://github.com/scemama/f77_zmq/archive/v4.2.5.tar.gz" GMP_URL="ftp://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.bz2" -IRPF90_URL="https://gitlab.com/scemama/irpf90/-/archive/v1.7.6/irpf90-v1.7.6.tar.gz" +IRPF90_URL="https://gitlab.com/scemama/irpf90/-/archive/v2.0.0/irpf90-v2.0.0.tar.gz" LIBCAP_URL="https://git.kernel.org/pub/scm/linux/kernel/git/morgan/libcap.git/snapshot/libcap-2.25.tar.gz" NINJA_URL="https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip" OCAML_URL="https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh" @@ -154,7 +154,7 @@ function find_exe() { } function find_python_lib() { - python2 -c "import $1" &> /dev/null && echo "$1" || not_found + python3 -c "import $1" &> /dev/null && echo "$1" || not_found } function find_lib() { diff --git a/docs/Makefile b/docs/Makefile index 7f886cbc..8ec191fc 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -14,7 +14,7 @@ help: .PHONY: help Makefile auto auto: - cd source ; python2 auto_generate.py + cd source ; python3 auto_generate.py # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). diff --git a/docs/source/auto_generate.py b/docs/source/auto_generate.py index a4dd32ca..11029c3b 100755 --- a/docs/source/auto_generate.py +++ b/docs/source/auto_generate.py @@ -1,9 +1,9 @@ #!/usr/bin/env python2 -from __future__ import print_function + import os import sys -import ConfigParser +import configparser from module_handler import get_binaries @@ -27,7 +27,7 @@ def generate_modules(abs_module, entities): EZFIO = os.path.join(abs_module,'EZFIO.cfg') if os.path.exists(EZFIO): rst += ["", "EZFIO parameters", "----------------", ""] - config_file = ConfigParser.ConfigParser() + config_file = configparser.ConfigParser() with open(EZFIO, 'r') as f: config_file.readfp(f) for section in config_file.sections(): diff --git a/etc/irpf90.rc b/etc/irpf90.rc index 42ec4502..8016edf6 100644 --- a/etc/irpf90.rc +++ b/etc/irpf90.rc @@ -1,7 +1,7 @@ # Configuration of IRPF90 package # Set the path of IRPF90 here: -export IRPF90_PATH=${QP_ROOT}/external/irpf90-v1.7.6 +export IRPF90_PATH=${QP_ROOT}/external/irpf90-v2.0.0 export PATH=${PATH}:${IRPF90_PATH}/bin export IRPF90=${IRPF90_PATH}/bin/irpf90 @@ -10,10 +10,10 @@ function source_if_exists() { if [[ -f $1 ]]; then cd $(dirname $1) ; source $(basename $1) ; cd - fi &> /dev/null -} +} source ${QP_ROOT}/etc/autocomplete.rc source_if_exists "${IRPF90_PATH}/irpman-completions.bash" - + diff --git a/external/EZFIO.1.6.2.tar.gz b/external/EZFIO.1.6.2.tar.gz deleted file mode 100644 index f364f88f0df3da14ea1eac8f2bc5792f70b190a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26530 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 literal 0 HcmV?d00001 diff --git a/scripts/compilation/cache_compile.py b/scripts/compilation/cache_compile.py index d95adbda..440f6498 100755 --- a/scripts/compilation/cache_compile.py +++ b/scripts/compilation/cache_compile.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 """ Save the .o from a .f90 and is the .o is asked a second time, retur it @@ -13,9 +13,9 @@ import re import shutil import subprocess -r = re.compile(ur'-c\s+(\S+\.[fF]90)\s+-o\s+(\S+\.o)') -p = re.compile(ur'-I IRPF90_temp/\S*\s+') -mod = re.compile(ur'module\s+(?P\S+).+end\s?module\s+(?P=mod)?', +r = re.compile(r'-c\s+(\S+\.[fF]90)\s+-o\s+(\S+\.o)') +p = re.compile(r'-I IRPF90_temp/\S*\s+') +mod = re.compile(r'module\s+(?P\S+).+end\s?module\s+(?P=mod)?', re.MULTILINE | re.IGNORECASE) tmpdir_root = os.environ.get("TMPDIR", failobj="/dev/shm") diff --git a/scripts/compilation/qp_create_ninja b/scripts/compilation/qp_create_ninja index bb064d85..3d4e56dc 100755 --- a/scripts/compilation/qp_create_ninja +++ b/scripts/compilation/qp_create_ninja @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Usage: qp_create_ninja create (--development | --production) @@ -24,7 +24,7 @@ except ImportError: "..", "quantum_package.rc")) - print "\n".join(["", "Error:", "source %s" % f, ""]) + print("\n".join(["", "Error:", "source %s" % f, ""])) sys.exit(1) # Compress path @@ -124,7 +124,7 @@ def dict_module_genelogy_path(d_module_genelogy): d_module_genelogy """ d = dict() - for module_rel, l_children_rel in d_module_genelogy.iteritems(): + for module_rel, l_children_rel in d_module_genelogy.items(): module_abs = real_join(QP_SRC, module_rel) p = Path(module_abs, module_rel) @@ -235,11 +235,11 @@ def ninja_ezfio_cfg_build(l_util): """ l_string = [] - for m in l_util.itervalues(): + for m in l_util.values(): str_ = "build {1} {2}: build_ezfio_interface {0}" - l_string += [str_.format(*map(comp_path,(m.ez_cfg.abs, m.ez_interface.abs, - m.ez_config.abs)))] + l_string += [str_.format(*list(map(comp_path,(m.ez_cfg.abs, m.ez_interface.abs, + m.ez_config.abs))))] l_string += [" sub_module = {0}".format(comp_path(m.ez_module.abs))] l_string += [""] @@ -257,8 +257,8 @@ def ninja_ezfio_config_build(l_ezfio_config): file_source = m.path_in_module file_create = m.path_in_ezfio - l_string += ["build {0}: build_ezfio_config {1}".format(*map(comp_path,(file_create, - file_source)))] + l_string += ["build {0}: build_ezfio_config {1}".format(*list(map(comp_path,(file_create, + file_source))))] l_string += [""] return l_string @@ -291,7 +291,7 @@ def ninja_ezfio_build(l_ezfio_config, l_util): """ l_ezfio_config = [i.path_in_ezfio for i in l_ezfio_config] - l_ezfio_from_cfg = [i.ez_config.abs for i in l_util.itervalues()] + l_ezfio_from_cfg = [i.ez_config.abs for i in l_util.values()] str_ = " ".join(map(comp_path,(l_ezfio_config + l_ezfio_from_cfg))) l_string = ["build {0}: build_ezfio {1}".format(EZFIO_LIB, str_), ""] @@ -335,7 +335,7 @@ def ninja_symlink_build(path_module, l_symlink): ""] for symlink in l_symlink: - l_string += ["build {0}: build_symlink {1}".format(*map(comp_path,(symlink.destination, symlink.source))), ""] + l_string += ["build {0}: build_symlink {1}".format(*list(map(comp_path,(symlink.destination, symlink.source)))), ""] return l_string @@ -360,7 +360,7 @@ def ninja_gitignore_build(path_module, d_binaries, l_symlink): path_gitignore = comp_path(join(path_module.abs, ".gitignore")) - l_b = map(comp_path,[i.abs for i in d_binaries[path_module]]) + l_b = list(map(comp_path,[i.abs for i in d_binaries[path_module]])) root = "build {0}: build_gitignore {1}".format(path_gitignore, " ".join(l_b)) @@ -420,9 +420,9 @@ def get_file_dependency(d_info_module): """ d_irp = defaultdict(dict) - for module, l_children in d_info_module.iteritems(): + for module, l_children in d_info_module.items(): - for key, values in get_l_file_for_module(module).iteritems(): + for key, values in get_l_file_for_module(module).items(): if key in ["l_src"]: values = [join(module.abs, o) for o in values] if key in ["l_obj"]: @@ -431,7 +431,7 @@ def get_file_dependency(d_info_module): d_irp[module][key] = values for children in l_children: - for key, values in get_l_file_for_module(children).iteritems(): + for key, values in get_l_file_for_module(children).items(): if key in ["l_src"]: values = [join(module.abs, children.rel, o) for o in values] @@ -495,10 +495,10 @@ def ninja_irpf90_make_build(path_module, l_needed_molule, d_irp): # D e p e n d a n c y # # ~#~#~#~#~#~#~#~#~#~ # - l_depend = map(comp_path,d_irp[path_module]["l_depend"]) - l_src = map(comp_path,d_irp[path_module]["l_src"]) - l_obj = map(comp_path,d_irp[path_module]["l_obj"]) - l_template = map(comp_path,d_irp[path_module]["l_template"]) + l_depend = list(map(comp_path,d_irp[path_module]["l_depend"])) + l_src = list(map(comp_path,d_irp[path_module]["l_src"])) + l_obj = list(map(comp_path,d_irp[path_module]["l_obj"])) + l_template = list(map(comp_path,d_irp[path_module]["l_template"])) if l_needed_molule: l_symlink = ["l_symlink_{0}".format(path_module.rel)] @@ -544,6 +544,7 @@ def get_binaries(path_module): stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() + stdout = stdout.decode() except OSError: return [] else: @@ -641,7 +642,7 @@ def ninja_binaries_build(path_module, l_children, d_binaries): # ~#~#~ # ninja_module_path = join(comp_path(path_module.abs), "IRPF90_temp/build.ninja") - l_abs_bin = map(comp_path,[binary.abs for binary in d_binaries[path_module]]) + l_abs_bin = list(map(comp_path,[binary.abs for binary in d_binaries[path_module]])) # ~#~#~#~#~#~ # # s t r i n g # @@ -658,7 +659,7 @@ def ninja_binaries_build(path_module, l_children, d_binaries): def ninja_module_build(path_module, d_binaries): - l_abs_bin = map(comp_path,[binary.abs for binary in d_binaries[path_module]]) + l_abs_bin = list(map(comp_path,[binary.abs for binary in d_binaries[path_module]])) path_readme = os.path.join(comp_path(path_module.abs), "README.rst") @@ -829,14 +830,14 @@ if __name__ == "__main__": dict_root = module_instance.dict_root dict_root_path = dict_module_genelogy_path(dict_root) - l_all_module = d_genealogy_path.keys() + l_all_module = list(d_genealogy_path.keys()) # ~#~#~#~#~#~#~#~#~#~#~#~#~ # # M o d u l e _ t o _ i r p # # ~#~#~#~#~#~#~#~#~#~#~#~#~ # d_binaries = get_dict_binaries(l_all_module, mode="development") - l_module = d_binaries.keys() + l_module = list(d_binaries.keys()) # ~#~#~#~#~#~#~#~#~#~#~#~ # diff --git a/scripts/compilation/read_compilation_cfg.py b/scripts/compilation/read_compilation_cfg.py index 7a9af801..45518701 100755 --- a/scripts/compilation/read_compilation_cfg.py +++ b/scripts/compilation/read_compilation_cfg.py @@ -1,8 +1,8 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- coding: utf-8 -*- import os, sys -import ConfigParser +import configparser def get_l_option_section(config): @@ -17,10 +17,10 @@ def get_compilation_option(pwd_cfg, flag_name): Return the flag compilation of a compile.cfg located in pwd_cfg """ if not os.path.isfile(pwd_cfg): - print "Configuration file %s not found"%(pwd_cfg) + print("Configuration file %s not found"%(pwd_cfg)) sys.exit(1) - config = ConfigParser.ConfigParser() + config = configparser.ConfigParser(inline_comment_prefixes=(';','#')) config.read(pwd_cfg) if flag_name == "FC" and config.getboolean("OPTION","CACHE"): @@ -33,7 +33,7 @@ def get_compilation_option(pwd_cfg, flag_name): for section in ["COMMON"] + l_option_section: try: l.extend(config.get(section, flag_name).split()) - except ConfigParser.NoOptionError: + except configparser.NoOptionError: pass return " ".join(l) @@ -43,5 +43,5 @@ if __name__ == '__main__': qpackage_root = os.environ['QP_ROOT'] pwd_cfg = os.path.join(qpackage_root, "config/ifort_gpi2.cfg") - print get_compilation_option(pwd_cfg, "FC") - print get_compilation_option(pwd_cfg, "FCFLAGS") + print(get_compilation_option(pwd_cfg, "FC")) + print(get_compilation_option(pwd_cfg, "FCFLAGS")) diff --git a/scripts/ezfio_interface/ei_handler.py b/scripts/ezfio_interface/ei_handler.py index 23a0ce53..446d60d0 100755 --- a/scripts/ezfio_interface/ei_handler.py +++ b/scripts/ezfio_interface/ei_handler.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Welcome to the ei_handler. @@ -72,7 +72,7 @@ import sys import os import os.path -import ConfigParser +import configparser from collections import defaultdict from collections import namedtuple @@ -220,8 +220,8 @@ def get_dict_config_file(module_obj): # L o a d _ C o n f i g # # ~#~#~#~#~#~#~#~#~#~#~ # - config_file = ConfigParser.ConfigParser() - config_file.readfp(open(module_obj.path)) + config_file = configparser.ConfigParser() + config_file.read_file(open(module_obj.path)) # ~#~#~#~#~#~#~#~#~ # # F i l l _ d i c t # @@ -229,7 +229,7 @@ def get_dict_config_file(module_obj): def error(o, p, c): "o option ; p provider_name ;c module_obj.path" - print "You need a {0} for {1} in {2}".format(o, p, c) + print("You need a {0} for {1} in {2}".format(o, p, c)) for section in config_file.sections(): # pvd = provider @@ -245,13 +245,13 @@ def get_dict_config_file(module_obj): # Check if type is avalaible try: type_ = config_file.get(section, "type").strip() - except ConfigParser.NoOptionError: + except configparser.NoOptionError: error("type", pvd, module_obj.path) sys.exit(1) if type_ not in type_dict: - print "{0} not avalaible. Choose in:".format(type_).strip() - print ", ".join(sorted([i for i in type_dict])) + print("{0} not avalaible. Choose in:".format(type_).strip()) + print(", ".join(sorted([i for i in type_dict]))) sys.exit(1) else: d[pvd]["type"] = type_dict[type_] @@ -259,18 +259,18 @@ def get_dict_config_file(module_obj): # Fill the dict with REQUIRED information try: d[pvd]["doc"] = config_file.get(section, "doc") - except ConfigParser.NoOptionError: + except configparser.NoOptionError: error("doc", pvd, module_obj.path) sys.exit(1) try: interface = [i.lower().strip() for i in config_file.get(section, "interface").split(",")] - except ConfigParser.NoOptionError: + except configparser.NoOptionError: error("doc", pvd, module_obj.path) sys.exit(1) else: if not any(i in ["ezfio", "provider", "ocaml"] for i in interface): - print "Bad keyword for interface for {0}".format(pvd) + print("Bad keyword for interface for {0}".format(pvd)) sys.exit(1) else: d[pvd]["interface"] = interface @@ -279,7 +279,7 @@ def get_dict_config_file(module_obj): for option in l_info_optional: try: d[pvd][option] = config_file.get(section, option).lower() - except ConfigParser.NoOptionError: + except configparser.NoOptionError: if option in d_default: d[pvd][option] = d_default[option] @@ -287,7 +287,7 @@ def get_dict_config_file(module_obj): try: default_raw = config_file.get(section, "default") - except ConfigParser.NoOptionError: + except configparser.NoOptionError: if "ocaml" in d[pvd]["interface"]: error("default", pvd, module_obj.path) sys.exit(1) @@ -322,7 +322,7 @@ def create_ezfio_provider(dict_ezfio_cfg): dict_code_provider = dict() ez_p = EZFIO_Provider() - for provider_name, dict_info in dict_ezfio_cfg.iteritems(): + for provider_name, dict_info in dict_ezfio_cfg.items(): if "provider" in dict_info["interface"]: ez_p.set_type(dict_info['type'].fortran) ez_p.set_name(provider_name) @@ -364,7 +364,7 @@ def save_ezfio_provider(path_head, dict_code_provider): "! from file {0}/EZFIO.cfg".format(path_head), "\n"] - l_output += [code for code in dict_code_provider.values()] + l_output += [code for code in list(dict_code_provider.values())] output = "\n".join(l_output) @@ -381,22 +381,22 @@ def create_ezfio_stuff(dict_ezfio_cfg, config_or_default="config"): def size_format_to_ezfio(size_raw): """ If size_raw == "=" is a formula -> do nothing; return - Else convert the born of a multidimential array + Else convert the range of a multidimential array (12,begin:end) into (12,begin+end+1) for example - If the value are between parenthses -> do nothing; return + If the values are between parenthses -> do nothing; return """ size_raw = str(size_raw) if size_raw.startswith('='): size_convert = size_raw.replace('.', '_') else: - size_raw = provider_info["size"].translate(None, "()") + size_raw = provider_info["size"].translate(str.maketrans("","","()")) size_raw = size_raw.replace('.', '_') a_size_raw = [] for dim in size_raw.split(","): try: - (begin, end) = map(str.strip, dim.split(":")) + (begin, end) = list(map(str.strip, dim.split(":"))) except ValueError: a_size_raw.append(dim) else: @@ -423,7 +423,7 @@ def create_ezfio_stuff(dict_ezfio_cfg, config_or_default="config"): lenmax_name = max([len(i) for i in dict_ezfio_cfg]) lenmax_type = max([len(i["type"].fortran) - for i in dict_ezfio_cfg.values()]) + for i in list(dict_ezfio_cfg.values())]) str_name_format = create_format_string(lenmax_name + 2) str_type_format = create_format_string(lenmax_type + 2) @@ -433,15 +433,15 @@ def create_ezfio_stuff(dict_ezfio_cfg, config_or_default="config"): # ~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~#~# # # Checking is many ezfio_dir provided - l_ezfio_dir = [d['ezfio_dir'] for d in dict_ezfio_cfg.values()] + l_ezfio_dir = [d['ezfio_dir'] for d in list(dict_ezfio_cfg.values())] if not l_ezfio_dir.count(l_ezfio_dir[0]) == len(l_ezfio_dir): - print >> sys.stderr, "You have many ezfio_dir. Not supported yet" + print("You have many ezfio_dir. Not supported yet", file=sys.stderr) raise TypeError else: result = [l_ezfio_dir[0]] - for provider_name, provider_info in sorted(dict_ezfio_cfg.iteritems()): + for provider_name, provider_info in sorted(dict_ezfio_cfg.items()): # Get the value from dict name_raw = provider_info["ezfio_name"].lower() @@ -532,7 +532,7 @@ def create_ocaml_input(dict_ezfio_cfg, module_lower): l_type = [] l_doc = [] - for k, v in dict_ezfio_cfg.iteritems(): + for k, v in dict_ezfio_cfg.items(): if "ocaml" in v['interface']: l_ezfio_name.append(v['ezfio_name']) l_type.append(v["type"]) @@ -580,7 +580,7 @@ def create_ocaml_input(dict_ezfio_cfg, module_lower): '(* =~=~=~==~=~~=~=~=~=~=~=~=~ *)', ""] - for provider_name, d_val in sorted(dict_ezfio_cfg.iteritems()): + for provider_name, d_val in sorted(dict_ezfio_cfg.items()): if 'default' not in d_val: continue @@ -655,7 +655,7 @@ def get_l_module_with_auto_generate_ocaml_lower(): l_module_lower = [] import re - p = re.compile(ur'interface:.*ocaml') + p = re.compile(r'interface:.*ocaml') for f in l_folder: path = "{0}/{1}/EZFIO.cfg".format(QP_SRC, f) @@ -782,7 +782,7 @@ if __name__ == "__main__": # if arguments["list_supported_types"]: for i in sorted(get_type_dict()): - print i + print(i) sys.exit(0) if arguments["ocaml_global"]: diff --git a/scripts/ezfio_interface/ezfio_generate_ocaml.py b/scripts/ezfio_interface/ezfio_generate_ocaml.py index 3c905122..191470d8 100755 --- a/scripts/ezfio_interface/ezfio_generate_ocaml.py +++ b/scripts/ezfio_interface/ezfio_generate_ocaml.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 """ This program generates all the OCaml templates needed by qp_edit @@ -17,12 +17,12 @@ class EZFIO_ocaml(object): def __init__(self, **kwargs): - for k, v in kwargs.iteritems(): + for k, v in kwargs.items(): try: - exec "self.{0} = {1}".format(k, v) + exec("self.{0} = {1}".format(k, v)) except NameError: - exec "self.{0} = '{1}'".format(k, v) + exec("self.{0} = '{1}'".format(k, v)) @property def Ocaml_type(self): @@ -39,7 +39,7 @@ class EZFIO_ocaml(object): def check_if_init(self, l_arg, name): for i in l_arg: try: - exec "self.{0}".format(i) + exec("self.{0}".format(i)) except AttributeError: msg = "You need to provide a '{0}' for creating {1}" raise KeyError(msg.format(i, name)) diff --git a/scripts/ezfio_interface/ezfio_generate_provider.py b/scripts/ezfio_interface/ezfio_generate_provider.py index 46df7e5e..4b43a88a 100755 --- a/scripts/ezfio_interface/ezfio_generate_provider.py +++ b/scripts/ezfio_interface/ezfio_generate_provider.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 __author__ = "Applencourt PEP8" __date__ = "jeudi 26 mars 2015, 12:49:35 (UTC+0100)" @@ -88,7 +88,7 @@ END_PROVIDER def __init__(self): self.values = "type doc name ezfio_dir ezfio_name write output".split() for v in self.values: - exec "self.{0} = None".format(v) + exec("self.{0} = None".format(v)) def __repr__(self): self.set_write() @@ -96,7 +96,7 @@ END_PROVIDER for v in self.values: if not v: msg = "Error : %s is not set in EZFIO.cfg" % (v) - print >>sys.stderr, msg + print(msg, file=sys.stderr) sys.exit(1) if "size" not in self.__dict__: self.__dict__["size"] = "" @@ -167,7 +167,7 @@ def test_module(): T.set_ezfio_dir("Hartree_Fock") T.set_ezfio_name("thresh_SCF") T.set_output("output_Hartree_Fock") - print T + print(T) if __name__ == '__main__': test_module() diff --git a/scripts/generate_h_apply.py b/scripts/generate_h_apply.py index ef22a539..dc7d340e 100644 --- a/scripts/generate_h_apply.py +++ b/scripts/generate_h_apply.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 import os @@ -155,7 +155,7 @@ class H_apply(object): def __repr__(self): buffer = self.template - for key,value in self.data.items(): + for key,value in list(self.data.items()): buffer = buffer.replace('$'+key, value) return buffer diff --git a/scripts/hello.py b/scripts/hello.py index c533a0f4..a575026e 100644 --- a/scripts/hello.py +++ b/scripts/hello.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 import random @@ -131,8 +131,8 @@ _ __ `/___ __ \__ ___/__ __ \ """ ] - print random.choice(hello) - print "\n -- Quantum Package Shell --\n" + print(random.choice(hello)) + print("\n -- Quantum Package Shell --\n") diff --git a/scripts/module/module_handler.py b/scripts/module/module_handler.py index 160a1ce9..a6bb6d3f 100755 --- a/scripts/module/module_handler.py +++ b/scripts/module/module_handler.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Module utilitary @@ -25,7 +25,7 @@ try: from docopt import docopt from qp_path import QP_SRC, QP_ROOT, QP_PLUGINS, QP_EZFIO except ImportError: - print "source .quantum_package.rc" + print("source .quantum_package.rc") raise @@ -50,6 +50,7 @@ def get_binaries(path_module): stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() + stdout = stdout.decode() except OSError: return [] else: @@ -106,9 +107,9 @@ def get_l_module_descendant(d_child, l_module): try: l.extend(get_l_module_descendant(d_child, d_child[module])) except KeyError: - print >> sys.stderr, "Error: " - print >> sys.stderr, "`{0}` is not a submodule".format(module) - print >> sys.stderr, "Check the typo (spelling, case, '/', etc.) " + print("Error: ", file=sys.stderr) + print("`{0}` is not a submodule".format(module), file=sys.stderr) + print("Check the typo (spelling, case, '/', etc.) ", file=sys.stderr) sys.exit(1) return list(set(l)) @@ -120,7 +121,7 @@ class ModuleHandler(): @property def l_module(self): - return self.dict_child.keys() + return list(self.dict_child.keys()) @property def dict_parent(self): @@ -132,7 +133,7 @@ class ModuleHandler(): d = {} for module_name in d_child: - d[module_name] = [i for i in d_child.keys() + d[module_name] = [i for i in list(d_child.keys()) if module_name in d_child[i]] return d @@ -151,8 +152,8 @@ class ModuleHandler(): d[module_name] = get_l_module_descendant(d_child, d_child[module_name]) except KeyError: - print "Check NEED for {0}".format( - module_name) + print("Check NEED for {0}".format( + module_name)) sys.exit(1) return d @@ -185,7 +186,7 @@ class ModuleHandler(): for e in d_desc[module]: d[e] = 1 - return d.keys() + return list(d.keys()) def l_reduce_tree(self, l_module): """For a list of module in input return only the root""" @@ -218,8 +219,8 @@ if __name__ == '__main__': for module in l_module: if not is_module(module): - print "{0} is not a valid module. Abort".format(module) - print "No NEED in it" + print("{0} is not a valid module. Abort".format(module)) + print("No NEED in it") sys.exit(1) m = ModuleHandler() @@ -227,7 +228,7 @@ if __name__ == '__main__': if arguments['print_descendant']: for module in l_module: - print " ".join(sorted(m.l_descendant_unique([module]))) + print(" ".join(sorted(m.l_descendant_unique([module])))) if arguments["clean"]: diff --git a/scripts/perturbation.py b/scripts/perturbation.py index cefb89b2..0fe6cfc8 100644 --- a/scripts/perturbation.py +++ b/scripts/perturbation.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 import os from qp_path import QP_SRC @@ -7,7 +7,7 @@ Pert_dir = os.path.join(QP_SRC,"perturbation") perturbations = [] -for filename in filter(lambda x: x.endswith(".irp.f"), os.listdir(Pert_dir)): +for filename in [x for x in os.listdir(Pert_dir) if x.endswith(".irp.f")]: filename = os.path.join(Pert_dir,filename) file = open(filename,'r') @@ -22,6 +22,6 @@ for filename in filter(lambda x: x.endswith(".irp.f"), os.listdir(Pert_dir)): if __name__ == '__main__': - print 'Perturbations:' + print('Perturbations:') for k in perturbations: - print '* ', k + print('* ', k) diff --git a/scripts/utility/get_groups b/scripts/utility/get_groups index 0d79cae2..418ea6ec 100755 --- a/scripts/utility/get_groups +++ b/scripts/utility/get_groups @@ -1,7 +1,7 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- coding: utf-8 -*- -import urllib +import urllib.request, urllib.parse, urllib.error import sys from bs4 import BeautifulSoup @@ -35,11 +35,11 @@ def clean_up(text): return False else: return y[0] in irred - data = filter(f,data)[:len(irred)] + data = list(filter(f,data))[:len(irred)] for line in data: s = line.replace('*','').split() l = irred[s[0]] - data[l] = map(float,s[1:len(irred)+1]) + data[l] = list(map(float,s[1:len(irred)+1])) d = {} e = {} @@ -48,23 +48,23 @@ def clean_up(text): for k in sop: e[sop[k]] = k n = len(irred) - print "Group\t", group, "\nn\t", n - print "\n \tIrred \tOperation" + print("Group\t", group, "\nn\t", n) + print("\n \tIrred \tOperation") for i in range(n): - print "%4d \t %s \t %s"%(i+1, d[i].ljust(10), e[i].ljust(10)) + print("%4d \t %s \t %s"%(i+1, d[i].ljust(10), e[i].ljust(10))) - print "\nTable\n ", + print("\nTable\n ", end=' ') for j in range(n): - print "%8s "%(str(j+1).center(8)), + print("%8s "%(str(j+1).center(8)), end=' ') for i in range(n): - print "\n%4d "%(i+1), + print("\n%4d "%(i+1), end=' ') for j in range(n): - print "%8.5f "%(data[i][j]), - print "\n" + print("%8.5f "%(data[i][j]), end=' ') + print("\n") def main(): for group in sys.argv[1:]: - f = urllib.urlopen(address%(group)) + f = urllib.request.urlopen(address%(group)) html = f.read().split('\n',1)[1] text = clean_up(html) diff --git a/scripts/utility/qp_bitmasks.py b/scripts/utility/qp_bitmasks.py index 5107576b..38aa48d7 100644 --- a/scripts/utility/qp_bitmasks.py +++ b/scripts/utility/qp_bitmasks.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 BIT_KIND_SIZE=64 diff --git a/scripts/utility/qp_path.py b/scripts/utility/qp_path.py index 5a5c8ca7..11756920 100644 --- a/scripts/utility/qp_path.py +++ b/scripts/utility/qp_path.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from __future__ import print_function + import os import sys diff --git a/src/cis/h_apply.irp.f b/src/cis/h_apply.irp.f index 95aa52e4..14389bed 100644 --- a/src/cis/h_apply.irp.f +++ b/src/cis/h_apply.irp.f @@ -1,14 +1,14 @@ ! Generates subroutine H_apply_cis ! -------------------------------- -BEGIN_SHELL [ /usr/bin/env python2 ] +BEGIN_SHELL [ /usr/bin/env python3 ] from generate_h_apply import H_apply H = H_apply("cis",do_double_exc=False) -print H +print(H) H = H_apply("cis_sym",do_double_exc=False) H.filter_only_connected_to_hf() -print H +print(H) END_SHELL diff --git a/src/cisd/h_apply.irp.f b/src/cisd/h_apply.irp.f index b18f6373..fa647f8a 100644 --- a/src/cisd/h_apply.irp.f +++ b/src/cisd/h_apply.irp.f @@ -1,13 +1,13 @@ ! Generates subroutine H_apply_cisd ! ---------------------------------- -BEGIN_SHELL [ /usr/bin/env python2 ] +BEGIN_SHELL [ /usr/bin/env python3 ] from generate_h_apply import H_apply H = H_apply("cisd",do_double_exc=True) -print H +print(H) H = H_apply("cisd_sym",do_double_exc=True) H.filter_only_connected_to_hf() -print H +print(H) END_SHELL diff --git a/src/density_for_dft/EZFIO.cfg b/src/density_for_dft/EZFIO.cfg index 86bbaeb1..42b8eab4 100644 --- a/src/density_for_dft/EZFIO.cfg +++ b/src/density_for_dft/EZFIO.cfg @@ -1,25 +1,23 @@ [density_for_dft] type: character*(32) -doc: Type of density used for DFT calculation. If set to WFT , it uses the density of the wave function stored in (psi_det,psi_coef). If set to input_density it uses the one-body dm stored in aux_quantities/ . If set to damping_rs_dft it uses the damped density between WFT and input_density. In the ks_scf and rs_ks_scf programs, it is set to WFT. +doc: Type of density used for DFT calculation. If set to WFT , it uses the density of the wave function stored in (psi_det,psi_coef). If set to input_density it uses the one-body dm stored in aux_quantities/ . If set to damping_rs_dft it uses the damped density between WFT and input_density. In the ks_scf and rs_ks_scf programs, it is set to WFT. interface: ezfio, provider, ocaml -default: WFT +default: WFT [damping_for_rs_dft] type: double precision -doc: damping factor for the density used in RSFT. +doc: damping factor for the density used in RSFT. interface: ezfio,provider,ocaml default: 0.5 [no_core_density] type: character*(32) -doc: Type of density -doc: if [no_core_dm] then all elements of the density matrix involving at least one orbital set as core are set to zero +doc: Type of density. If [no_core_dm] then all elements of the density matrix involving at least one orbital set as core are set to zero interface: ezfio, provider, ocaml default: full_density [normalize_dm] type: logical -doc: Type of density -doc: if .True., then you normalize the no_core_dm to elec_alpha_num - n_core_orb and elec_beta_num - n_core_orb +doc: Type of density. If .True., then you normalize the no_core_dm to elec_alpha_num - n_core_orb and elec_beta_num - n_core_orb interface: ezfio, provider, ocaml default: True diff --git a/src/determinants/EZFIO.cfg b/src/determinants/EZFIO.cfg index 40897159..ef00080b 100644 --- a/src/determinants/EZFIO.cfg +++ b/src/determinants/EZFIO.cfg @@ -76,7 +76,6 @@ type: integer interface: ezfio doc: Number of determinants to print in qp_edit type: integer -interface: ezfio [psi_coef] interface: ezfio diff --git a/src/dft_one_e/e_xc_general.irp.f b/src/dft_one_e/e_xc_general.irp.f index fc9f9fd2..6c9e7bd3 100644 --- a/src/dft_one_e/e_xc_general.irp.f +++ b/src/dft_one_e/e_xc_general.irp.f @@ -3,8 +3,8 @@ BEGIN_PROVIDER [double precision, energy_x, (N_states)] BEGIN_DOC ! correlation energies general providers. END_DOC - - BEGIN_SHELL [ /usr/bin/env python2 ] + + BEGIN_SHELL [ /usr/bin/env python3 ] import os import glob from qp_path import QP_SRC @@ -13,32 +13,32 @@ os.chdir(funcdir) functionals = map(lambda x : x.replace(".irp.f",""), glob.glob("*.irp.f")) prefix = "" for f in functionals: - print """ + print(""" %sif (trim(exchange_functional) == '%s') then - energy_x = (1.d0 - HF_exchange ) * energy_x_%s"""%(prefix, f, f) + energy_x = (1.d0 - HF_exchange ) * energy_x_%s"""%(prefix, f, f)) prefix = "else " -print """ +print(""" else print *, 'exchange functional required does not exist ...' print *, 'exchange_functional ',exchange_functional - stop""" -print "endif" + stop""") +print("endif") END_SHELL - - + + END_PROVIDER - - - - + + + + BEGIN_PROVIDER [double precision, energy_c, (N_states)] implicit none BEGIN_DOC ! correlation and exchange energies general providers. END_DOC - - BEGIN_SHELL [ /usr/bin/env python2 ] + + BEGIN_SHELL [ /usr/bin/env python3 ] import os import glob from qp_path import QP_SRC @@ -47,19 +47,19 @@ os.chdir(funcdir) functionals = map(lambda x : x.replace(".irp.f",""), glob.glob("*.irp.f")) prefix = "" for f in functionals: - print """ + print(""" %sif (trim(correlation_functional) == '%s') then - energy_c = energy_c_%s"""%(prefix, f, f) + energy_c = energy_c_%s"""%(prefix, f, f) ) prefix = "else " -print """ +print(""" else print*, 'Correlation functional required does not exist ...' print*,'correlation_functional ',correlation_functional - stop""" -print "endif" + stop""") +print("endif") END_SHELL - + END_PROVIDER diff --git a/src/dft_one_e/pot_general.irp.f b/src/dft_one_e/pot_general.irp.f index 2f45a464..df292422 100644 --- a/src/dft_one_e/pot_general.irp.f +++ b/src/dft_one_e/pot_general.irp.f @@ -4,8 +4,8 @@ BEGIN_DOC ! general providers for the alpha/beta exchange potentials on the AO basis END_DOC - - BEGIN_SHELL [ /usr/bin/env python2 ] + + BEGIN_SHELL [ /usr/bin/env python3 ] import os import glob from qp_path import QP_SRC @@ -15,33 +15,33 @@ functionals = map(lambda x : x.replace(".irp.f",""), glob.glob("*.irp.f")) prefix = "" for f in functionals: - print """ + print(""" %sif (trim(exchange_functional) == '%s') then potential_x_alpha_ao = ( 1.d0 - HF_exchange ) * potential_x_alpha_ao_%s - potential_x_beta_ao = ( 1.d0 - HF_exchange ) * potential_x_beta_ao_%s"""%(prefix, f, f, f) + potential_x_beta_ao = ( 1.d0 - HF_exchange ) * potential_x_beta_ao_%s"""%(prefix, f, f, f) ) prefix = "else " -print """ +print(""" else print*, 'exchange functional required does not exist ...' print*,'exchange_functional ',exchange_functional - stop""" -print "endif" + stop""") +print("endif") END_SHELL - - + + END_PROVIDER - - - + + + BEGIN_PROVIDER [double precision, potential_c_alpha_ao,(ao_num,ao_num,N_states)] &BEGIN_PROVIDER [double precision, potential_c_beta_ao,(ao_num,ao_num,N_states)] implicit none BEGIN_DOC ! general providers for the alpha/beta correlation potentials on the AO basis END_DOC - - BEGIN_SHELL [ /usr/bin/env python2 ] + + BEGIN_SHELL [ /usr/bin/env python3 ] import os import glob from qp_path import QP_SRC @@ -51,27 +51,27 @@ functionals = map(lambda x : x.replace(".irp.f",""), glob.glob("*.irp.f")) prefix = "" for f in functionals: - print """ + print(""" %sif (trim(correlation_functional) == '%s') then potential_c_alpha_ao = potential_c_alpha_ao_%s - potential_c_beta_ao = potential_c_beta_ao_%s"""%(prefix, f, f, f) + potential_c_beta_ao = potential_c_beta_ao_%s"""%(prefix, f, f, f) ) prefix = "else " -print """ +print(""" else print*, 'Correlation functional required does not exist ...' print*,'correlation_functional ',correlation_functional - stop""" -print "endif" + stop""" ) +print("endif") END_SHELL - + END_PROVIDER - - - - - + + + + + BEGIN_PROVIDER [double precision, potential_x_alpha_mo,(mo_num,mo_num,N_states)] &BEGIN_PROVIDER [double precision, potential_x_beta_mo ,(mo_num,mo_num,N_states)] implicit none @@ -86,7 +86,7 @@ print "endif" potential_x_alpha_mo(1,1,istate), & size(potential_x_alpha_mo,1) & ) - + call ao_to_mo( & potential_x_beta_ao(1,1,istate), & size(potential_x_beta_ao,1), & @@ -94,9 +94,9 @@ print "endif" size(potential_x_beta_mo,1) & ) enddo - + END_PROVIDER - + BEGIN_PROVIDER [double precision, potential_c_alpha_mo,(mo_num,mo_num,N_states)] &BEGIN_PROVIDER [double precision, potential_c_beta_mo, (mo_num,mo_num,N_states)] implicit none @@ -111,7 +111,7 @@ print "endif" potential_c_alpha_mo(1,1,istate), & size(potential_c_alpha_mo,1) & ) - + call ao_to_mo( & potential_c_beta_ao(1,1,istate), & size(potential_c_beta_ao,1), & @@ -119,7 +119,7 @@ print "endif" size(potential_c_beta_mo,1) & ) enddo - + END_PROVIDER @@ -147,9 +147,9 @@ print "endif" enddo Trace_v_Hxc(istate) = Trace_v_xc(istate) + Trace_v_H(istate) enddo - + END_PROVIDER - + BEGIN_PROVIDER [double precision, Trace_v_xc_new, (N_states)] implicit none integer :: i,j,istate @@ -166,14 +166,14 @@ print "endif" enddo enddo enddo - + END_PROVIDER - + BEGIN_PROVIDER [double precision, potential_xc_alpha_mo,(mo_num,mo_num,N_states)] &BEGIN_PROVIDER [double precision, potential_xc_beta_mo,(mo_num,mo_num,N_states)] implicit none integer :: istate - + do istate = 1, N_states call ao_to_mo( & potential_xc_alpha_ao(1,1,istate), & @@ -181,7 +181,7 @@ print "endif" potential_xc_alpha_mo(1,1,istate), & size(potential_xc_alpha_mo,1) & ) - + call ao_to_mo( & potential_xc_beta_ao(1,1,istate), & size(potential_xc_beta_ao,1), & @@ -189,18 +189,18 @@ print "endif" size(potential_xc_beta_mo,1) & ) enddo - + END_PROVIDER - - + + BEGIN_PROVIDER [double precision, potential_xc_alpha_ao,(ao_num,ao_num,N_states)] &BEGIN_PROVIDER [double precision, potential_xc_beta_ao,(ao_num,ao_num,N_states)] implicit none BEGIN_DOC ! general providers for the alpha/beta exchange/correlation potentials on the AO basis END_DOC - - BEGIN_SHELL [ /usr/bin/env python2 ] + + BEGIN_SHELL [ /usr/bin/env python3 ] import os import glob from qp_path import QP_SRC @@ -210,19 +210,19 @@ functionals = map(lambda x : x.replace(".irp.f",""), glob.glob("*.irp.f")) prefix = "" for f in functionals: - print """ + print(""" %sif (trim(exchange_functional) == '%s') then potential_xc_alpha_ao = potential_xc_alpha_ao_%s - potential_xc_beta_ao = potential_xc_beta_ao_%s"""%(prefix, f, f, f) + potential_xc_beta_ao = potential_xc_beta_ao_%s"""%(prefix, f, f, f) ) prefix = "else " -print """ +print(""" else print*, 'exchange functional required does not exist ...' print*,'exchange_functional ',exchange_functional - stop""" -print "endif" + stop""") +print("endif") END_SHELL - + END_PROVIDER diff --git a/src/perturbation/perturbation.irp.f b/src/perturbation/perturbation.irp.f index 040f3026..cde52027 100644 --- a/src/perturbation/perturbation.irp.f +++ b/src/perturbation/perturbation.irp.f @@ -1,4 +1,4 @@ -BEGIN_SHELL [ /usr/bin/env python2 ] +BEGIN_SHELL [ /usr/bin/env python3 ] from perturbation import perturbations import os @@ -8,6 +8,6 @@ template = file.read() file.close() for p in perturbations: - print template.replace("$PERT",p) + print(template.replace("$PERT",p)) END_SHELL diff --git a/src/perturbation/perturbation.template.f b/src/perturbation/perturbation.template.f index 0a7ca181..558b92a9 100644 --- a/src/perturbation/perturbation.template.f +++ b/src/perturbation/perturbation.template.f @@ -1,4 +1,4 @@ -BEGIN_SHELL [ /usr/bin/env python2 ] +BEGIN_SHELL [ /usr/bin/env python3 ] import perturbation END_SHELL From be3aa1af71765a0b43dd775b8f2363a19a4c8759 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Wed, 18 Mar 2020 10:50:09 +0100 Subject: [PATCH 13/13] Removed divide by zero for travis --- src/determinants/determinants.irp.f | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/determinants/determinants.irp.f b/src/determinants/determinants.irp.f index 79621648..71ee3d89 100644 --- a/src/determinants/determinants.irp.f +++ b/src/determinants/determinants.irp.f @@ -771,7 +771,7 @@ subroutine apply_excitation(det, exc, res, ok, Nint) case default print *, degree print *, "apply ex" - print *, 1.d0/0.d0 ! For traceback +! print *, 1.d0/0.d0 ! For traceback STOP end select ! END INLINE