From 6eb9a00101cc64a3953e7e63d4d350ae96b06974 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Sun, 20 Dec 2015 01:09:14 +0100 Subject: [PATCH] Added scripts --- README.md | 49 +++++++++++++--- build.ninja | 91 +++++++++++++++++++++++++++++ ocaml/compile.sh | 4 +- scripts/clean.sh | 21 +++++++ scripts/compile_ezfio.sh | 18 ++++++ scripts/compile_irpf90.sh | 49 ++++++++++++++++ scripts/compile_ocaml.sh | 13 +++++ scripts/compile_ocaml_dep.sh | 39 +++++++++++++ scripts/compile_src.sh | 11 ++++ scripts/create_properties_python.py | 81 +++++++++++++++++++++++++ src/MAIN/qmcchem_info.irp.f | 11 ++-- 11 files changed, 371 insertions(+), 16 deletions(-) create mode 100644 build.ninja create mode 100755 scripts/clean.sh create mode 100755 scripts/compile_ezfio.sh create mode 100755 scripts/compile_irpf90.sh create mode 100755 scripts/compile_ocaml.sh create mode 100755 scripts/compile_ocaml_dep.sh create mode 100755 scripts/compile_src.sh create mode 100755 scripts/create_properties_python.py diff --git a/README.md b/README.md index 04bec50..5eb562e 100644 --- a/README.md +++ b/README.md @@ -37,15 +37,48 @@ Warnings: Requirements ------------ -* Ninja building system (replacement for GNU make) -* EZFIO library generator -* ZeroMQ library -* ZeroMQ Fortran77 binding -* IRPF90 Fortran code generator -* OCaml compiler -* Fortran compiler (Intel Fortran recommended) +* [Ninja build tool](http://github.com/martine/ninja) +* [Ocaml compiler with Opam and Core library](http://github.com/ocaml) +* [ZeroMQ high performance communication library](http://www.zeromq.org) +* [F77_ZMQ ZeroMQ Fortran interface](http://github.com/scemama/f77_zmq/) +* [IRPF90 Fortran code generator](http://irpf90.ups-tlse.fr) +* [EZFIO Easy Fortran I/O library generator](http://github.com/scemama/EZFIO) +* GNU C++ Compiler (g++) for ZeroMQ +* Python >= 2.6 for install scripts +* Bash +* Fortran compiler, Intel Fortran recommended +* Lapack library, Intel MKL recommended + + +Most of the dependencies are open-source will be downloaded automatically. +The Fortran and C++ compilers, Python and Bash interpreters and the Lapack +library need to be installed manually by the user. + +Installation +------------ + +This script will first download the [Ninja](http://github.com/martine/ninja) +build tool, and will then run Ninja using the ``install/build.ninja`` file. +The configuration script will work in the ``install`` directory. It will first +download into the ``install/Downloads`` directory everything that needs to be +installed. The building of the dependencies takes place in the ``install/_build`` +directory, and the packages that are being installed can be followed by looking +at the log files in this directory. When a package was successfully installed, +a ``*.ok`` file is created and the log file is deleted. + +Before using or compiling QMC=Chem, environment variables need to be loaded. The +environment variables are located in the ``qmcchemrc`` file: + +```bash +$ source qmcchemrc +``` + +To compile the program, run + +```bash +$ ninja +``` -All the dependencies will be downloaded automatically Example of a QMC=Chem calculation --------------------------------- diff --git a/build.ninja b/build.ninja new file mode 100644 index 0000000..ec8597b --- /dev/null +++ b/build.ninja @@ -0,0 +1,91 @@ +rule compile_ezfio + command = ./scripts/compile_ezfio.sh + description = Compiling the EZFIO library + pool = console + +rule build_properties_config + command = bash -c "source qmcchemrc ; exec python ./scripts/create_properties_ezfio.py" + pool = console + +rule compile_irpf90 + command = ./scripts/compile_irpf90.sh + description = Compiling IRPF90 + pool = console + +rule compile_src + command = ./scripts/compile_src.sh + description = Compiling src + pool = console + +rule create_archive + command = git archive --format tar.gz HEAD --prefix "QmcChem/" -7 -o qmcchem.tar.gz + description = Creating archive + pool = console + +rule compile_ocaml_dep + command = scripts/compile_ocaml_dep.sh + description = Finding dependencies in OCaml files + pool = console + +rule compile_ocaml + command = scripts/compile_ocaml.sh $target + description = Compiling OCaml tools + pool = console + +rule copy_to_bin + command = bash -c "cp $in $out ; touch $out" + description = Copying $in into bin/ + pool = console + +rule clean + command = ./scripts/clean.sh + pool = console + +# put all files of PROPERTIES here +# -------------------------------- + +build ezfio_config/properties.config: build_properties_config | src/PROPERTIES/density.irp.f src/PROPERTIES/properties.irp.f src/PROPERTIES/properties_energy.irp.f src/PROPERTIES/voronoi.irp.f src/PROPERTIES/properties_general.irp.f scripts/create_properties_python.py || src/IRPF90_temp/build.ninja + +# EZFIO +# ----- + +build lib/libezfio.a lib/libezfio_irp.a EZFIO/lib/libezfio.a EZFIO/lib/libezfio_irp.a EZFIO/Ocaml/ezfio.ml EZFIO/Python/ezfio.py: compile_ezfio | ezfio_config/qmc.config ezfio_config/properties.config make.config scripts/create_properties_ezfio.py || src/tags src/irpf90_entities src/irpf90.make src/IRPF90_temp/build.ninja + +# Fortran executables +# ------------------- + +build always: phony + +build src/tags src/irpf90_entities src/irpf90.make src/IRPF90_temp/build.ninja: compile_irpf90 | make.config always + +build src/MAIN/qmc src/MAIN/qmc_nozmq src/MAIN/qmc_create_walkers src/MAIN/qmcchem_info: compile_src | lib/libezfio.a lib/libezfio_irp.a src/tags || src/irpf90_entities src/irpf90.make src/IRPF90_temp/build.ninja + +# Archive +# ------- + +build qmcchem.tar.gz: create_archive + +# Ocaml +# ----- + +build ocaml/generated.ninja : compile_ocaml_dep | always +build ocaml/qmcchem : compile_ocaml | ocaml/generated.ninja EZFIO/Ocaml/ezfio.ml + target = qmcchem + + +# Copy binaries in bin +# -------------------- + +build bin/qmc: copy_to_bin src/MAIN/qmc +build bin/qmcchem_info: copy_to_bin src/MAIN/qmcchem_info +build bin/qmc_create_walkers: copy_to_bin src/MAIN/qmc_create_walkers +build bin/qmc_nozmq: copy_to_bin src/MAIN/qmc_nozmq +build bin/qmcchem: copy_to_bin ocaml/qmcchem + +default bin/qmc bin/qmcchem_info bin/qmc_create_walkers bin/qmc_nozmq bin/qmcchem + +# Clean +# ----- + +build clean: clean + diff --git a/ocaml/compile.sh b/ocaml/compile.sh index 19ae8c6..8ae5c7c 100755 --- a/ocaml/compile.sh +++ b/ocaml/compile.sh @@ -6,7 +6,8 @@ then exit -1 fi -cd ${QMCCHEM_PATH}/ocaml +cd ${QMCCHEM_PATH}/ocaml || exit -1 +cp ${QMCCHEM_PATH}/EZFIO/Ocaml/ezfio.ml . || exit -1 LSMD5_FILE=${QMCCHEM_PATH}/ocaml/.ls_md5 FILES="*.ml *.mli" @@ -19,6 +20,7 @@ then REF=$(cat ${LSMD5_FILE}) fi + if [[ ${MD5} != ${REF} ]] then echo ${MD5} > ${LSMD5_FILE} diff --git a/scripts/clean.sh b/scripts/clean.sh new file mode 100755 index 0000000..978f9a3 --- /dev/null +++ b/scripts/clean.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# This script is supposed to run in $QMCCHEM_PATH + +ninja -C ocaml clean +if [[ -d src/IRPF90_temp ]] +then + ninja -C src/IRPF90_temp -t clean +fi +ninja -t clean + +rm -f ocaml/qmcchem ocaml/.ls_md5 ocaml/generated.ninja +rm -f EZFIO/Ocaml/ezfio.ml +cd src + rm -rf tags irpf90_entities irpf90.make IRPF90_temp IRPF90_man .ls_md5 + cd MAIN + rm -f qmc qmcchem_info qmc_create_walkers +cd ../.. + + + + diff --git a/scripts/compile_ezfio.sh b/scripts/compile_ezfio.sh new file mode 100755 index 0000000..ecdcef7 --- /dev/null +++ b/scripts/compile_ezfio.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +if [[ ! -f qmcchemrc ]] +then + echo "Error: qmcchemrc not found" + exit -1 +fi + +source make.config +source qmcchemrc +FCFLAGS="${FCFLAGS} -fPIC" +export IRPF90 FC FCFLAGS AR RANLIB +cd EZFIO +rm -f make.config +${NINJA} || exit -1 +cp lib/libezfio{,_irp}.a ${QMCCHEM_PATH}/lib/ || exit 1 + + diff --git a/scripts/compile_irpf90.sh b/scripts/compile_irpf90.sh new file mode 100755 index 0000000..e61583f --- /dev/null +++ b/scripts/compile_irpf90.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +if [[ -z ${QMCCHEM_PATH} ]] +then + echo "Error: qmcchemrc not loaded" + exit -1 +fi + +cd ${QMCCHEM_PATH}/src + +LSMD5_FILE=${QMCCHEM_PATH}/src/.ls_md5 +FILES="*.f *.f90 *.F *.py */*.f */*.f90 */*.F */*.py" +MD5=$(ls -ltr --full-time ${FILES} 2>/dev/null | md5sum | cut -d ' ' -f 1) + +REF=0 + +if [[ -f ${LSMD5_FILE} ]] +then + REF=$(cat ${LSMD5_FILE}) +fi + +if [[ ${MD5} != ${REF} ]] +then + echo ${MD5} > ${LSMD5_FILE} + echo Running IRPF90 + + source ${QMCCHEM_PATH}/make.config + + LIB="${LIB} ${QMCCHEM_PATH}/lib/libezfio_irp.a ${QMCCHEM_PATH}/lib/libf77zmq.a ${QMCCHEM_PATH}/lib/libzmq.a -lstdc++ -lrt" + SRC="${SRC} ZMQ/f77_zmq_module.f90" + OBJ="${OBJ} IRPF90_temp/ZMQ/f77_zmq_module.o" + INCLUDES="${INCLUDES} -I AO -I SAMPLING -I TOOLS -I JASTROW -I TESTING -I MAIN -I PROPERTIES -I ZMQ" + IRPF90_FLAGS="${IRPF90_FLAGS} --ninja" + + # Check IRPF90 version + if [[ $( ${IRPF90} -v | python -c "import sys ; print float(sys.stdin.read().rsplit('.',1)[0]) >= 1.6") == False ]] + then + echo "IRPF90 version >= 1.6 required" + exit -1 + fi + + export IRPF90 IRPF90_FLAGS INCLUDES LIB SRC OBJ + + exec ${IRPF90} ${IRPF90_FLAGS} ${INCLUDES} || exit -1 +fi + + + + diff --git a/scripts/compile_ocaml.sh b/scripts/compile_ocaml.sh new file mode 100755 index 0000000..f7db780 --- /dev/null +++ b/scripts/compile_ocaml.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +if [[ -z ${QMCCHEM_PATH} ]] +then + echo "Error: qmcchemrc not loaded" + exit -1 +fi + +cd ${QMCCHEM_PATH}/ocaml || exit -1 + +cp ${QMCCHEM_PATH}/EZFIO/Ocaml/ezfio.ml . || exit -1 + +exec ninja -f generated.ninja ${@} diff --git a/scripts/compile_ocaml_dep.sh b/scripts/compile_ocaml_dep.sh new file mode 100755 index 0000000..5df2b1e --- /dev/null +++ b/scripts/compile_ocaml_dep.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +if [[ -z ${QMCCHEM_PATH} ]] +then + echo "Error: qmcchemrc not loaded" + exit -1 +fi + +cd ${QMCCHEM_PATH}/ocaml || exit -1 + +LSMD5_FILE=${QMCCHEM_PATH}/ocaml/.ls_md5 +FILES="*.ml *.mli" +MD5=$(ls -ltr --full-time ${FILES} 2>/dev/null | md5sum | cut -d ' ' -f 1) + +REF=0 + +if [[ -f ${LSMD5_FILE} ]] +then + REF=$(cat ${LSMD5_FILE}) +fi + +if [[ ${MD5} != ${REF} ]] +then + echo ${MD5} > ${LSMD5_FILE} + echo Finding dependencies in OCaml files + python ./ninja_ocaml.py + if [[ ! -f qptypes_generator ]] + then + ninja -f generated.ninja qptypes_generator + fi + if [[ ! -f Qptypes.ml ]] + then + ./qptypes_generator + python ./ninja_ocaml.py + fi + +fi + + diff --git a/scripts/compile_src.sh b/scripts/compile_src.sh new file mode 100755 index 0000000..756750d --- /dev/null +++ b/scripts/compile_src.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +if [[ -z ${QMCCHEM_PATH} ]] +then + echo "Error: qmcchemrc not loaded" + exit -1 +fi + +cd ${QMCCHEM_PATH}/src/IRPF90_temp || exit -1 + +exec ninja ${@} diff --git a/scripts/create_properties_python.py b/scripts/create_properties_python.py new file mode 100755 index 0000000..94207f1 --- /dev/null +++ b/scripts/create_properties_python.py @@ -0,0 +1,81 @@ +#!/usr/bin/python + +import string +import os +import sys + +root = os.environ['QMCCHEM_PATH'] + +os.chdir(root+'/src/') +sys.path.insert(0,'./') + +properties = [] +dims = {} + +files = filter(lambda x: x.startswith("PROPERTIES") and \ + x.endswith("irp.f"), os.listdir(os.getcwd())) + +files = map(lambda x: 'PROPERTIES/'+x, filter(lambda x: x.endswith("irp.f"), os.listdir(os.getcwd()+'/PROPERTIES'))) + + +#files = filter(lambda x: x.endswith("irp.f"), os.listdir(os.getcwd())) + +for filename in files: + lines = [] + check_dims = False + file = open(filename,'r') + lines += file.readlines() + file.close() + for i,line in enumerate(lines): + if line.startswith("! PROPERTIES"): + lines = lines[i:] + break + + for line in map(lambda x: x.lower(),lines): + if line.lstrip().startswith('begin_provider'): + check_dims = False + buffer = line + buffer = buffer.split('[')[1] + buffer = buffer.split(']')[0] + buffer = buffer.split(',') + if (len(buffer) == 2): + buffer.append("") + else: + buffer = [ buffer[0], buffer[1], ','.join(buffer[2:]) ] + check_dims = True + buffer = map(string.strip,buffer) + properties.append(buffer) + current_prop = buffer[1] + elif check_dims: + if 'dimensions :' in line: + dims[current_prop] = line.split(':')[1].strip() + + +import numerical_derivatives as deriv +properties += map(lambda x: ["double precision", "d_var_"+x.lower(), "(size_d_var_"+x.lower()+")"], deriv.vectors) +properties += map(lambda x: ["double precision", "d_var_"+x.lower(), "(7)"], deriv.scalars) + + +def sq(item): + return [item[0], item[1]+"_2", item[2]] +properties_with_square = properties + map(sq,properties) + +for p in [ properties, properties_with_square ]: + def c(x,y): + if x[1] > y[1]: return 1 + if x[1] == y[1]: return 0 + if x[1] < y[1]: return -1 + p.sort(c) + + +def touch_all(): + print "TOUCH", + for p in properties: + print "calc_"+p[1], + print "" + +with open(root+'/scripts/properties.py','w') as f: + print >>f,'properties = ',properties + print >>f,'dims = ',dims + + diff --git a/src/MAIN/qmcchem_info.irp.f b/src/MAIN/qmcchem_info.irp.f index d26f1d2..6feb689 100644 --- a/src/MAIN/qmcchem_info.irp.f +++ b/src/MAIN/qmcchem_info.irp.f @@ -13,15 +13,12 @@ program qmcchem_info endif print *, 'Number of determinants : ', det_num print *, 'Number of unique alpha/beta determinants : ', det_alpha_num, det_beta_num -! print *, 'Number of vectors in SVD : ', psi_svd_size print *, 'Closed-shell MOs : ', mo_closed_num print *, 'Number of MOs in determinants : ', num_present_mos -! print *, 'do SVD? : ', do_det_svd -! print *, 'det_coef matrix is sparse : ', det_coef_matrix_is_sparse - print *, 'Det alpha norm:' - print *, det_alpha_norm - print *, 'Det beta norm:' - print *, det_beta_norm +! print *, 'Det alpha norm:' +! print *, det_alpha_norm +! print *, 'Det beta norm:' +! print *, det_beta_norm call step1 call cpu_time (cpu0) call step2(imax)