From 4702d0cb0c8e5a0f20806521903f0b7dd37056ff Mon Sep 17 00:00:00 2001 From: Sylvain Tricot Date: Tue, 31 Mar 2020 18:28:08 +0200 Subject: [PATCH] Simplify code building and package creation. --- .gitignore | 4 + Makefile | 83 ----- src/MANIFEST.in | 3 +- src/Makefile | 60 ---- src/SConstruct | 104 +++--- src/install.sh | 307 ------------------ src/msspec/iodata.py | 2 + src/msspec/phagen/fortran/Makefile | 35 -- src/msspec/phagen/fortran/SConstruct | 15 +- src/msspec/phagen/fortran/phagen_scf_2.1_dp.f | 19 +- src/msspec/spec/fortran/Makefile | 98 ------ src/msspec/spec/fortran/SConstruct | 89 +++-- src/msspec/spec/fortran/memalloc/dim_mod.f | 3 + src/msspec/version.py | 18 +- src/requirements.txt | 3 +- src/setup.py | 57 +--- src/setup_requirements.txt | 5 + 17 files changed, 132 insertions(+), 773 deletions(-) delete mode 100644 Makefile delete mode 100644 src/Makefile delete mode 100755 src/install.sh delete mode 100644 src/msspec/phagen/fortran/Makefile delete mode 100644 src/msspec/spec/fortran/Makefile create mode 100644 src/setup_requirements.txt diff --git a/.gitignore b/.gitignore index 5f14ae8..81c4a60 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,11 @@ __pycache__ *.mod *.bak *.target +*.sconsign.dblite htmlcov package/ src/msspec/results.txt *venv/ +**/*build/ +**/*dist/ +**/*.egg-info/ diff --git a/Makefile b/Makefile deleted file mode 100644 index fdfc501..0000000 --- a/Makefile +++ /dev/null @@ -1,83 +0,0 @@ -MAKESELF:=makeself -VERSION:=$(shell git describe|sed 's/-\([[:digit:]]\+\)-.*/\.post\1/') -SETUPFILE:=MsSpec-$(VERSION).setup - - -VERBOSE:=0 -ifeq ($(VERBOSE),0) - SUPPRESS_OUPUT:=1>/dev/null 2>/dev/null - MAKEFLAGS += --no-print-directory -else - SUPPRESS_OUPUT:= -endif - - -.PHONY: clean version selfex venv doc - - -selfex: results - @echo "Creating the self-extractible setup program... " -# copy the src folder and purge it - @cp -r src src_ - @+$(MAKE) -C ./src_ purge -# update the version - @echo "$(VERSION)" > ./src_/VERSION -# distribute the README.md file - @cp README.md ./src_/ -# create the package folder - @mkdir -p package -# create the *.lsm file - @echo "Begin4" > msspec.lsm - @echo "Title: Python MsSpec" >> msspec.lsm - @echo "Version: $(VERSION)" >> msspec.lsm - @echo "Entered-date: `date +%Y-%m-%d`" >> msspec.lsm - @echo "Description: A multiple scattering package for spectroscopies using electrons to probe materials" >> msspec.lsm - @echo "Keywords: " >> msspec.lsm - @echo "Author: sylvain.tricot@univ-rennes1.fr (Sylvain Tricot), didier.sebilleau@univ-rennes1.fr (Didier Sébilleau)" >> msspec.lsm - @echo "Maintained-by: sylvain.tricot@univ-rennes1.fr (Sylvain Tricot)" >> msspec.lsm - @echo "Primary-site: https://msspec.cnrs.fr" >> msspec.lsm - @echo "Alternate-site:" >> msspec.lsm - @echo "Original-site:" >> msspec.lsm - @echo "Platforms:" >> msspec.lsm - @echo "Copying-policy: Gnu Library General Public License (GLPL) 2.0" >> msspec.lsm - @echo "End" >> msspec.lsm -# create the self-extractible archive - @$(MAKESELF) --license "./license.txt" --lsm ./msspec.lsm ./src_ package/$(SETUPFILE) "Python MsSpec" ./install.sh $(SUPPRESS_OUPUT) -# remove *.lsm file and src_ - @rm ./msspec.lsm - @rm -rf ./src_ - - -version: - @python ./CI/update_version.py - - -clean: - @echo "Cleaning all..." - @find ./src -type f -name '*.pyc' -exec rm -f {} + - @find ./src -type d -name '__pycache__' -exec rm -rf {} + - @rm -rf src/dist - @rm -rf src/*.egg* - @+$(MAKE) -C src/ clean $(SUPPRESS_OUPUT) - @+$(MAKE) -C doc/ clean $(SUPPRESS_OUPUT) - @rm -rf package - -purge: clean - @echo "Removing also shared objects..." - @find ./src -type f -name '*.so' -exec rm -f {} + - -results: - @+$(MAKE) -C src results - - -venv: - @virtualenv --python=python3 --system-site-packages ci_venv $(SUPPRESS_OUPUT) - @. "./ci_venv/bin/activate" && pip install --upgrade pip && pip install --upgrade -r requirements.txt $(SUPPRESS_OUPUT) - -doc: - @echo "Building pdf and html documentation..." - @mkdir -p package/ - @+$(MAKE) -C doc/ latexpdf $(SUPPRESS_OUPUT) - @rm -rf package/*.pdf - @cp "doc/build/latex/MsSpec-python.pdf" "./package/MsSpec-${VERSION}.pdf" - @+$(MAKE) -C doc/ html $(SUPPRESS_OUPUT) diff --git a/src/MANIFEST.in b/src/MANIFEST.in index 1633dfa..168181e 100644 --- a/src/MANIFEST.in +++ b/src/MANIFEST.in @@ -1,4 +1,3 @@ -recursive-include msspec *.f -recursive-include msspec *.inc +recursive-include msspec *.so recursive-include . SConstruct include requirements.txt diff --git a/src/Makefile b/src/Makefile deleted file mode 100644 index a7cc556..0000000 --- a/src/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -VERSION:=$(shell python -c "import msspec; print(msspec.__version__)") - -VERBOSE:=0 -ifeq ($(VERBOSE),0) - SUPPRESS_OUPUT:=1>/dev/null 2>/dev/null - MAKEFLAGS += --no-print-directory --silent -else - SUPPRESS_OUPUT:= -endif - - -install: sdist - @echo "Installing the newly created Python package..." - @pip install dist/msspec-*.tar.gz $(SUPPRESS_OUPUT) - -sdist: install_deps - @echo "Creating Python source distribution..." -# Create the source distrib - @python setup.py sdist $(SUPPRESS_OUPUT) - -install_deps: pybinding - @echo "Installing Python dependencies..." -# Install dependencies with pip - @pip install --upgrade -r requirements.txt $(SUPPRESS_OUPUT) - -pybinding: - @echo "Building Python binding for phagen and spec..." - @+$(MAKE) -C msspec/spec/fortran pybinding $(SUPPRESS_OUPUT) - @+$(MAKE) -C msspec/phagen/fortran pybinding $(SUPPRESS_OUPUT) - -results: msspec/results.txt - -msspec/results.txt: pybinding - @echo "Generating results for unittests" - @coverage run --source=./ --omit=msspec/es/*,msspec/msspecgui/* msspec/create_tests_results.py 1>/dev/null -# create the html coverage report - @coverage html -d ../doc/source/htmlcov - @rm .coverage - -tests: pybinding - @echo "Runing unittests" - @python -m msspec.tests 1>/dev/null - -clean: - @echo "Cleaning all..." - @find ./ -type f -name '*.pyc' -exec rm -f {} + - @find ./ -type d -name '__pycache__' -exec rm -rf {} + - @+$(MAKE) -C msspec/spec/fortran clean $(SUPPRESS_OUPUT) - @+$(MAKE) -C msspec/phagen/fortran clean $(SUPPRESS_OUPUT) -# remove previous sdist - @rm -rf dist - @rm -rf *.egg* - -purge: clean - @echo "Removing also shared objects..." - @find ./ -type f -name '*.so' -exec rm -f {} + - -help: - @echo "help message" - diff --git a/src/SConstruct b/src/SConstruct index cc630d9..a95c803 100644 --- a/src/SConstruct +++ b/src/SConstruct @@ -1,6 +1,47 @@ from sysconfig import get_config_var import os +############################################################################### +suffix = get_config_var('EXT_SUFFIX') + +def filtered_glob(env, pattern, omit=[], + ondisk=True, source=False, strings=False): + return list(filter( + lambda f: os.path.basename(f.path) not in omit, + env.Glob(pattern))) + +# Create a builder for f2py +def f2py_generator(source, target, env, for_signature): + main = source[0] + objects = " ".join(o.get_path() for o in source[1:] if str(o).endswith('.o')) + modulename = str(target[0]).replace(suffix, '').replace('/', '.') + compiler = env['FORTRAN'] + cmd = f"f2py3 --fcompiler={compiler} " + cmd += f" $F2PY_OPTS -m {modulename} -c {objects} {main}" + #cmd += " 1>/dev/null 2>/dev/null" + return cmd + +def f2py_emitter(target, source, env): + """ used to add the correct cpython .so suffix to the modulename """ + target[0] = str(target[0]).replace('.', '/') + suffix + return target, source + +def install_module(env, module): + destdir = os.path.dirname(module[0].srcnode().abspath) + env.Install(destdir, module) + env.Alias('install', destdir) + return None + +f2py_bld = Builder(generator=f2py_generator, emitter=f2py_emitter) + +# define the default build environment +std = Environment(tools=['default', 'fortran'], F2PY_OPTS=[], LIBS=[]) +std.AddMethod(filtered_glob, "FilteredGlob") +std.AddMethod(install_module, "InstallModule") +std['BUILDERS']['F2py'] = f2py_bld + +############################################################################### + # Define the command line options AddOption('--dbg', dest='dbg', @@ -18,39 +59,19 @@ AddOption('--compiler', choices=['gfortran', 'ifort'], help='The Fortran compiler to use') -def CheckPKGConfig(context, version): - context.Message( 'Checking for pkg-config... ' ) - ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0] - context.Result( ret ) - return ret - -def CheckPKG(context, name): - context.Message( 'Checking for %s... ' % name ) - ret = context.TryAction('pkg-config --exists \'%s\'' % name)[0] - context.Result( ret ) - return ret - -def filtered_glob(env, pattern, omit=[], - ondisk=True, source=False, strings=False): - return list(filter( - lambda f: os.path.basename(f.path) not in omit, - env.Glob(pattern))) -# define the default build environment -std = Environment(tools=['default', 'fortran'], F2PY_OPTS=[], FORTRANCOMSTR = "building $TARGET ...", LIBS=[]) -std.AddMethod(filtered_glob, "FilteredGlob"); - # define environments gfortran_env = std.Clone(tools=['gfortran']) -gfortran_env.Replace(FORTRANFLAGS=['-fPIC', '-O2', '-ffast-math', '-fno-automatic']) +gfortran_env.Replace(FORTRANFLAGS=['-fPIC', '-O2', '-ffast-math']) ifort_env = std.Clone(tools=['ifort']) # parse options if GetOption('compiler') == 'gfortran': - env = gfortran_env + env = gfortran_env + env.Append(F2PY_OPTS='--opt=-O2') elif GetOption('compiler') == 'ifort': env = ifort_env @@ -65,37 +86,6 @@ if GetOption('verbose'): env.Replace(FORTRANCOMSTR = "") -conf = Configure(env, custom_tests = { 'CheckPKG' : CheckPKG}) -suffix = get_config_var('EXT_SUFFIX') - -# Create a builder for f2py -def create_f2py_cmd(source, target, env, for_signature): - objects = source[1:] - cmd = "f2py3 " - cmd += " ".join([o.get_path() for o in objects if str(o).endswith('o')]) - cmd += f" $F2PY_OPTS -m {str(target[0]).replace(suffix,'').replace('/', '.')} -c {source[0]}" - return cmd - -def modify_targets(target, source, env): - target[0] = str(target[0]) + suffix - #print(target[0]) - return target, source - -bld = Builder(generator=create_f2py_cmd, emitter = modify_targets) -env['BUILDERS']['F2PY'] = bld - - - -# exports -try: - Import('local_build') -except: - local_build = False - -Export('env', 'conf') - -print('local_build = ', local_build) - -if not local_build: - SConscript(['msspec/spec/fortran/SConstruct', - 'msspec/phagen/fortran/SConstruct']) +Export('env') +SConscript('msspec/spec/fortran/SConstruct', variant_dir='build/build_spec') +SConscript('msspec/phagen/fortran/SConstruct', variant_dir='build/build_phagen') diff --git a/src/install.sh b/src/install.sh deleted file mode 100755 index 4f54d34..0000000 --- a/src/install.sh +++ /dev/null @@ -1,307 +0,0 @@ -#!/bin/bash -# vim: set ts=4 sw=4 sts noet mouse=a fdm=indent: - -BYPASS="n" -DEBUG="n" -BUILDONLY="n" - -SCRIPT_NAME=$(basename "$0") -VERSION=$(cat ./msspec/version.py|cut -d\" -f2) -DATE=$(date +%Y%m%d_%H%M%S) -LOGFILE="${HOME}/msspec_install_${DATE}.log" -GETOUTFILE=$(mktemp) - -USE_MKL=0 -LINKER_FLAGS="" -COMP=gfortran -COMP_OPTS="-O2 -ffast-math -fno-automatic" -DEBUG_MODE=0 - - -trap "abort_install" INT -trap "error_exit" HUP QUIT ILL ABRT - -init_install () { - printf "Installation started on %s\n" "$(date)" > "${LOGFILE}" - printf "0" > "${GETOUTFILE}" - - if [ "$BYPASS" = "n" ]; then - printf "" - printf "This program will install the msspec python package on your system.\n" - printf "It is highly recommended to run this installation process within a\n" - printf "Python virtual environment. If you want to create and/or activate one,\n" - printf "you can answer \"n\" now and restart the setup program later.\n" - - read_yes_no "Do you wish to continue" "y" - case "${ANSWER}" in - y) ;; - n) abort_install ;; - esac - fi - -} - -abort_install () { - log_message "Installation aborted by the user" - error_exit -} - -log_message () { - printf "$1\n" >> ${LOGFILE} -} - -log_message2 () { - # echo to screen and to file - printf "$1\n" - log_message "$1\n" -} - -cleanup () { - rm -rf "${GETOUTFILE}" -} - -error_exit () { - # An error occured - printf "\n" - printf " /!\ An error occured during the installation process.\n" - printf " Please see the %s file in your HOME folder\n" "$(basename "${LOGFILE}")" - printf " for more informations.\n" - printf " Below is an excerpt of the last 10 lines:\n" - printf "\n" - echo ">>> ..." - tail "${LOGFILE}" | while read line - do - echo ">>> $line" - done - - # uninstall if needed - pip uninstall -y msspec - - cleanup && exit 1 -} - -read_yes_no () { - DEFAULT="$2" - PROMPT="$1 (y/n) [${DEFAULT}]? " - - ANSWER="" - INPUT="" - - VALID=1 - while test $VALID -ne 0; do - printf "%s" "${PROMPT}" - if [ x"$BYPASS" = xn ]; then - read -r "INPUT" - else - printf "\n" - fi - ANSWER="${INPUT:-${DEFAULT}}" - case "${ANSWER}" in - y|n) VALID=0 ;; - *) printf "Invalid choice, please answer \"y\" or \"n\".\n"; VALID=1 ;; - esac - done - log_message "QUESTION: $PROMPT" - log_message "ANSWER : $ANSWER" -} - -wrap () { - log_message "================================================================================" - log_message "$2" - log_message "================================================================================" - log_message "$1" - if [ "$DEBUG" = y ]; then - printf "%s...\n" "$2" - (eval "$1" || echo $? >"${GETOUTFILE}") | tee -a "${LOGFILE}" - rc=$(cat $GETOUTFILE) - if [ $rc != 0 ]; then - error_exit - fi - else - eval "($1) 2>>${LOGFILE} 1>>${LOGFILE}" || echo $? >${GETOUTFILE} & - patience "$2" - fi -} - -success_message () { - log_message "========================================================" - log_message "MsSpec was successfully installed." - log_message "========================================================" -} - -patience () { - MSG="$1" - PID=$! - i=0 - printf "%s" "$MSG... " - while ps -p $PID > /dev/null - do - sleep 0.1 - case $i in - 0) printf "\b\b- " ;; - 1) printf "\b\b\\ " ;; - 2) printf "\b\b| " ;; - 3) printf "\b\b/ "; i=-1 ;; - esac - i=$(( i+1 )) - done - if test "$(cat "${GETOUTFILE}")" -ne 0; then - printf "\b\b Aborted!" - error_exit - fi - printf "\b\b Done.\n" -} - -show_help () { - echo "Usage: $SCRIPT_NAME [OPTIONS]" - echo "List of possible options:" - echo " -y Accept all default choices." - echo " -d Debug mode." - echo " -h Show this message." - exit 0 -} - - -check_dependencies () { - # we need make - log_message "Checking if make is installed..." - command -V make || return 1 - log_message "Ok\n" - - # we need gfortran - gcc_ver_min=6 - log_message "Checking if gfortran >= $gcc_ver_min is installed..." - command -V gfortran || return 1 - gcc_ver=$(gcc -dumpversion|cut -d. -f1) - echo "You have gfortran version $gcc_ver installed" - test "$gcc_ver" -ge "$gcc_ver_min" || return 1 - log_message "Ok\n" - - # we need libcairo and dev files - log_message "Checking if libcairo is installed..." - pkg-config --exists cairo || return 1 - log_message "Ok\n" - - # we need Python 3 - py_ver_major_min=3 - py_ver_minor_min=0 - log_message "Checking if Python >= ${py_ver_major_min}.${py_ver_minor_min}..." - command -V python || return 1 - py_ver=$(python --version | cut -d" " -f2) - echo "You have Python version $py_ver installed" - py_ver_major=$(echo $py_ver|cut -d. -f1) - py_ver_minor=$(echo $py_ver|cut -d. -f2) - test "$py_ver_major" -ge "$py_ver_major_min" || return 1 - test "$py_ver_minor" -ge "$py_ver_minor_min" || return 1 - log_message "Ok\n" - - # we need wxPython. - log_message "Checking if wxPython is installed..." - python -c "import wx" - if test "$?" -ne 0; then - log_message "You need wxPython to run MsSpec.\n" - log_message "Please look at informations at https://wxpython.org/pages/downloads/.\n" - return 1 - else - log_message "Ok\n" - fi - - # we need pip - log_message "Checking if pip is installed..." - command -V pip || return 1 - log_message "Ok\n" - - # we need virtualenv - #log_message "Checking if virtualenv is installed..." - #command -V virtualenv || return 1 - #log_message "Ok\n" - -} - -local_install () { - # Initialize the install process - init_install - - # check dependencies - wrap "check_dependencies" "Checking dependencies" - - # Do we have Lapack. - log_message "Checking if lapack is installed..." - pkg-config --exists lapack - if test "$?" -ne 0; then - HAS_LAPACK="n" - log_message "No, will use included routines\n" - else - HAS_LAPACK="y" - log_message "Ok\n" - fi - - if [ x"${HAS_LAPACK}" = xy ]; then - read_yes_no "You have Lapack. Do you wish to link with installed lapack" "y" - if [ x"${ANSWER}" = xy ]; then - USE_MKL=1 - LINKER_FLAGS=`pkg-config --libs lapack` - fi - fi - - # ask for expert options - read_yes_no "Do you wish to edit compilation options" "n" - if [ x"${ANSWER}" = xy ]; then - read -ep "FORTRAN COMPILER...................> " -i "${COMP}" COMP - read -ep "COMPILER OPTIONS...................> " -i "${COMP_OPTS}" COMP_OPTS - read -ep "USE EXTERNAL LAPACK (0:no, 1:yes)..> " -i "${USE_MKL}" USE_MKL - read -ep "LINKER FLAGS.......................> " -i "${LINKER_FLAGS}" LINKER_FLAGS - read -ep "INCLUDE DEBUG SYMBOLS (0:no, 1:yes)> " -i "${DEBUG_MODE}" DEBUG_MODE - fi - - ALL_OPTS="VERBOSE=1 USE_MKL=${USE_MKL} LINKER_FLAGS=\"${LINKER_FLAGS}\" COMP=\"${COMP}\" COMP_OPTS=\"${COMP_OPTS}\" DEBUG=\"${DEBUG_MODE}\"" - - # build the Fortran code - wrap "make pybinding ${ALL_OPTS}" "Building Phagen and Spec Python dynamic library" - - if [ x"${BUILDONLY}" = xy ]; then - exit - fi - - # install Python dependencies - wrap "make install_deps ${ALL_OPTS}" "Installing Python dependencies" - - # build the source distribution - wrap "make sdist ${ALL_OPTS}" "Building msspec python package" - - # install the package - wrap "make install ${ALL_OPTS}" "Installing the msspec package" - - # Run unit tests ? - read_yes_no "Do you wish to run unit tests" "y" - if [ x"${ANSWER}" = xy ]; then - wrap "make tests ${ALL_OPTS}" "Runing test suite" - fi - - # installation was a succes so ask if we keep the log file - read_yes_no "Do you wish to keep the log file (${LOGFILE})" "n" - if [ x"${ANSWER}" = xn ]; then - rm -f "${LOGFILE}" - fi - - # self-explanatory - success_message -} - -while getopts "p:byd" option -do - case $option in - y) export BYPASS="y" - ;; - d) export DEBUG="y" - ;; - b) export BUILDONLY="y" - ;; - h) show_help - ;; - *) show_help - ;; - esac -done - -local_install diff --git a/src/msspec/iodata.py b/src/msspec/iodata.py index f135c7a..41dbaed 100644 --- a/src/msspec/iodata.py +++ b/src/msspec/iodata.py @@ -60,6 +60,8 @@ import wx.grid from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas from matplotlib.backends.backend_wxagg import NavigationToolbar2WxAgg +#from matplotlib.backends.backend_wxcairo import FigureCanvasWxCairo as FigureCanvas +#from matplotlib.backends.backend_wxcairo import NavigationToolbar2WxCairo from matplotlib.figure import Figure from terminaltables import AsciiTable diff --git a/src/msspec/phagen/fortran/Makefile b/src/msspec/phagen/fortran/Makefile deleted file mode 100644 index 47cca29..0000000 --- a/src/msspec/phagen/fortran/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -COMP=gfortran -F2PY:=f2py3 - -COMP_OPTS:= -O2 -ffast-math -F2PY_OPTS:= - -DEBUG:=0 - -objects_src := phagen_scf_2.1_dp.f -objects := $(patsubst %.f,%.o, $(objects_src)) - -ifeq ($(DEBUG),1) - COMP_OPTS:=$(COMP_OPTS) -g -Wall -Wextra -Warray-temporaries -Wconversion -fbacktrace -ffree-line-length-0 -fcheck=all -ffpe-trap=zero,overflow,underflow -finit-real=nan - F2PY_OPTS:=$(F2PY_OPTS) --debug-capi --debug -endif - - -.PHONY: clean - -pybinding: libphagen.target - -libphagen.target: $(objects) main.f - @echo "building Python binding..." - @$(F2PY) -I. $(objects) $(F2PY_OPTS)-c -m libphagen main.f - @touch $@ - -$(objects): $(objects_src) - @echo "compiling subroutines and functions for phagen..." - @$(COMP) $(COMP_OPTS) -fPIC -c $^ - -clean: - @echo "cleaning..." - @rm -rf *.o *.mod - @rm -rf $(objects) - @rm -f libphagen.target diff --git a/src/msspec/phagen/fortran/SConstruct b/src/msspec/phagen/fortran/SConstruct index 5e90901..c83bfdd 100644 --- a/src/msspec/phagen/fortran/SConstruct +++ b/src/msspec/phagen/fortran/SConstruct @@ -1,17 +1,10 @@ -try: - Import('env') -except: - local_build = True - Export('local_build') - SConscript(['../../../SConstruct']) -finally: - Import('env') - +Import('env') +import os objects_src= ['phagen_scf_2.1_dp.f'] objects = env.Object(objects_src) -module = env.F2PY('libphagen', ['main.f'] + objects) -Requires(module, objects) +module = env.F2py('libphagen', ['main.f'] + objects, F2PYCOMSTR=">>") +env.InstallModule(module) env.Alias('phagen', module) diff --git a/src/msspec/phagen/fortran/phagen_scf_2.1_dp.f b/src/msspec/phagen/fortran/phagen_scf_2.1_dp.f index 4123315..355768b 100644 --- a/src/msspec/phagen/fortran/phagen_scf_2.1_dp.f +++ b/src/msspec/phagen/fortran/phagen_scf_2.1_dp.f @@ -8140,7 +8140,13 @@ c.....this subroutine calculates the radial matrix elements c.....necessary for eels cross-section c.....using a linear-log mesh c - common/mtxele/ nstart,nlast +CST ==> Replaced the line below +CST common/mtxele/ nstart,nlast + common/mtxele/ nstart,nlast,dmx(2),dmx1(2),qmx(3),qmx1(3), + $ dxdir,dxexc,nfis,nfis1,nfis2 + real*8 nfis,nfis2,nfis1 + complex*16 dmx,dmx1,qmx,qmx1,dxdir,dxexc +CST <== c common/mtxelex/ dmxx(2),dmxx1(2),dmxxa(2),dmxxa1(2), & qmxx(3),qmxx1(3),qmxxa(3),qmxxa1(3), @@ -17000,7 +17006,13 @@ c.....(i=1,2) for lfin=l0i-1 (i=1) and lfin=l0i+1 (i=2) both for c.....the regular (dmxx) and irregular solution (dmxx1) using a c.....linear-log mesh c - common/mtxele/ nstart,nlast +CST ==> Replaced the line below +CST common/mtxele/ nstart,nlast + common/mtxele/ nstart,nlast,dmx(2),dmx1(2),qmx(3),qmx1(3), + $ dxdir,dxexc,nfis,nfis1,nfis2 + real*8 nfis,nfis2,nfis1 + complex*16 dmx,dmx1,qmx,qmx1,dxdir,dxexc +CST <== c common/mtxelex/ dmxx(2),dmxx1(2),dmxxa(2),dmxxa1(2), & qmxx(3),qmxx1(3),qmxxa(3),qmxxa1(3), @@ -20199,7 +20211,8 @@ C MARK 12 RELEASE. NAG COPYRIGHT 1986. C MARK 15 REVISED. IER-915 (APR 1991). C .. Scalar Arguments .. INTEGER INFO - CHARACTER*13 SRNAME + CHARACTER(*) SRNAME +CST CHARACTER*13 SRNAME C .. C C Purpose diff --git a/src/msspec/spec/fortran/Makefile b/src/msspec/spec/fortran/Makefile deleted file mode 100644 index 0c97c1a..0000000 --- a/src/msspec/spec/fortran/Makefile +++ /dev/null @@ -1,98 +0,0 @@ -COMP:=gfortran -F2PY:=f2py3 - -COMP_OPTS:= -O2 -ffast-math -fno-automatic -LINKER_FLAGS:= -F2PY_OPTS:= - -DEBUG:=0 -USE_MKL:=0 - - - -includes := -I./memalloc/ -I./cluster_gen/ -I./common_sub -I./renormalization -includes += -I./phd_se_noso_nosp_nosym -includes += -I./eig/common -I./eig/mi -I./eig/pw - -memalloc_src:=memalloc/dim_mod.f memalloc/modules.f memalloc/allocation.f -cluster_gen_src:=$(wildcard cluster_gen/*.f) -common_sub_src:=$(wildcard common_sub/*.f) -renormalization_src:=$(wildcard renormalization/*.f) - -phd_se_noso_nosp_nosym_src:=$(filter-out phd_se_noso_nosp_nosym/main.f, $(wildcard phd_se_noso_nosp_nosym/*.f)) -phd_mi_noso_nosp_nosym_src:=$(filter-out phd_mi_noso_nosp_nosym/main.f, $(wildcard phd_mi_noso_nosp_nosym/*.f)) - -eig_common_src:=$(wildcard eig/common/*.f) -eig_mi_src:=$(filter-out eig/mi/main.f, $(wildcard eig/mi/*.f)) -eig_pw_src:=$(filter-out eig/pw/main.f, $(wildcard eig/pw/*.f)) - -ifeq ($(USE_MKL), 1) - eig_common_src:=$(filter-out $(wildcard eig/common/lapack*.f), $(eig_common_src)) - phd_mi_noso_nosp_nosym_src:=$(filter-out $(wildcard phd_mi_noso_nosp_nosym/lapack*.f), $(phd_mi_noso_nosp_nosym_src)) - LINKER_FLAGS:=$(shell pkg-config --libs lapack) -# MKL:=-L$(MKLROOT) -lmkl_core -lmkl_intel_lp64 -lmkl_sequential -endif - -objects_src := $(memalloc_src) $(cluster_gen_src) $(common_sub_src) -objects_src += $(renormalization_src) $(phd_se_noso_nosp_nosym_src) -objects_src += $(eig_common_src) $(eig_mi_src) $(eig_pw_src) -objects_src += $(phd_mi_noso_nosp_nosym_src) - -memalloc_obj:=$(patsubst %.f,%.o, $(memalloc_src)) -cluster_gen_obj:=$(patsubst %.f,%.o, $(cluster_gen_src)) -common_sub_obj:=$(patsubst %.f,%.o, $(common_sub_src)) -renormalization_obj:=$(patsubst %.f,%.o, $(renormalization_src)) -phd_se_noso_nosp_nosym_obj:=$(patsubst %.f,%.o, $(phd_se_noso_nosp_nosym_src)) -phd_mi_noso_nosp_nosym_obj:=$(patsubst %.f,%.o, $(phd_mi_noso_nosp_nosym_src)) -eig_common_obj:=$(patsubst %.f,%.o, $(eig_common_src)) -eig_mi_obj:=$(patsubst %.f,%.o, $(eig_mi_src)) -eig_pw_obj:=$(patsubst %.f,%.o, $(eig_pw_src)) -objects:=$(patsubst %.f,%.o, $(objects_src)) - -libs_targets := phd_se_noso_nosp_nosym.target phd_mi_noso_nosp_nosym.target eig_mi.target eig_pw.target - -EXE=prog - -ifeq ($(DEBUG),1) - COMP_OPTS:=$(COMP_OPTS) -g -Wall -Wextra -Warray-temporaries -Wconversion -fbacktrace -ffree-line-length-0 -fcheck=all -ffpe-trap=zero,overflow,underflow -finit-real=nan - F2PY_OPTS:=$(F2PY_OPTS) --debug-capi --debug -endif - -export COMP -export COMP_OPTS - - -.PHONY: clean - - -pybinding: $(libs_targets) - -phd_se_noso_nosp_nosym.target: $(memalloc_obj) $(cluster_gen_obj) $(common_sub_obj) $(renormalization_obj) $(phd_se_noso_nosp_nosym_obj) - @echo "building Python binding..." - @$(F2PY) $(includes) $^ $(F2PY_OPTS) -c -m $(patsubst %.target, %, $@) phd_se_noso_nosp_nosym/main.f - @touch $@ - -phd_mi_noso_nosp_nosym.target: $(memalloc_obj) $(cluster_gen_obj) $(common_sub_obj) $(renormalization_obj) $(phd_mi_noso_nosp_nosym_obj) - @echo "building Python binding..." - @$(F2PY) $(includes) $^ $(F2PY_OPTS) -c -m $(patsubst %.target, %, $@) phd_mi_noso_nosp_nosym/main.f $(LINKER_FLAGS) - @touch $@ - -eig_mi.target: $(memalloc_obj) $(cluster_gen_obj) $(common_sub_obj) $(renormalization_obj) $(eig_common_obj) $(eig_mi_obj) - @echo "building Python binding..." - @$(F2PY) $(includes) $^ $(F2PY_OPTS) -c -m $(patsubst %.target, %, $@) eig/mi/main.f $(LINKER_FLAGS) - @touch $@ - -eig_pw.target: $(memalloc_obj) $(cluster_gen_obj) $(common_sub_obj) $(renormalization_obj) $(eig_common_obj) $(eig_pw_obj) - @echo "building Python binding..." - @$(F2PY) $(includes) $^ $(F2PY_OPTS) -c -m $(patsubst %.target, %, $@) eig/pw/main.f $(LINKER_FLAGS) - @touch $@ - -%.o: %.f - @echo "compiling $@..." - @$(COMP) $(COMP_OPTS) -I./memalloc/ -fPIC -o $@ -c $^ - -clean: - @echo "cleaning..." - @rm -rf *.o *.mod - @rm -rf $(objects) - @rm -rf $(libs_targets) diff --git a/src/msspec/spec/fortran/SConstruct b/src/msspec/spec/fortran/SConstruct index 29e09e1..3fd43b2 100644 --- a/src/msspec/spec/fortran/SConstruct +++ b/src/msspec/spec/fortran/SConstruct @@ -1,22 +1,11 @@ -# imports -try: - Import('env', 'conf') -except: - local_build = True - Export('local_build') - SConscript(['../../../SConstruct']) -finally: - Import('env', 'conf') +Import('env') +import os -# Configuration: -env2 = env.Clone() -if conf.CheckPKG('lapack'): - env2.ParseConfig("pkg-config lapack --libs") -conf.Finish() - -dir = Dir('.').get_abspath() -env2.Append(FORTRANFLAGS=['-I' + dir,'-J' + dir]) -env2.Append(F2PY_OPTS=['-I' + dir]) +# Configure the environment +env_spec = env.Clone() +cwd = Dir('.').get_abspath() +env_spec.Append(FORTRANFLAGS=['-I' + cwd,'-J' + cwd]) +env_spec.Append(F2PY_OPTS=['-I' + cwd]) # define sources dim_mod = ['memalloc/dim_mod.f'] @@ -24,53 +13,53 @@ memalloc = ['memalloc/modules.f', 'memalloc/allocation.f'] cluster_gen = Glob('cluster_gen/*.f') common_sub = Glob('common_sub/*.f') renormalization = Glob('renormalization/*.f') -phd_se_noso_nosp_nosym = env2.FilteredGlob('phd_se_noso_nosp_nosym/*.f', omit=['main.f']) -phd_mi_noso_nosp_nosym = env2.FilteredGlob('phd_mi_noso_nosp_nosym/*.f', omit=['main.f']) +phd_se_noso_nosp_nosym = env_spec.FilteredGlob('phd_se_noso_nosp_nosym/*.f', omit=['main.f']) +phd_mi_noso_nosp_nosym = env_spec.FilteredGlob('phd_mi_noso_nosp_nosym/*.f', omit=['main.f']) eig_common = Glob('eig/common/*.f') -eig_mi = env2.FilteredGlob('eig/mi/*.f', omit=['main.f']) -eig_pw = env2.FilteredGlob('eig/pw/*.f', omit=['main.f']) +eig_mi = env_spec.FilteredGlob('eig/mi/*.f', omit=['main.f']) +eig_pw = env_spec.FilteredGlob('eig/pw/*.f', omit=['main.f']) - -if 'lapack' in env2['LIBS']: - env2.Append(F2PY_OPTS = "-llapack") +conf = Configure(env_spec, log_file='./config.log') +if conf.CheckLib('lapack'): + env_spec.Append(F2PY_OPTS = "-llapack") eig_mi = [f for f in eig_mi if str(f).find('lapack') == -1] phd_mi_noso_nosp_nosym = [f for f in phd_mi_noso_nosp_nosym if str(f).find('lapack') == -1] - -sources = dim_mod + memalloc + cluster_gen + common_sub + renormalization + phd_se_noso_nosp_nosym -sources += phd_mi_noso_nosp_nosym + eig_common + eig_pw + eig_mi +env_spec = conf.Finish() +env_spec.Append(FORTRANFLAGS='-fno-automatic') # define objects -dim_mod_obj = env2.Object(dim_mod) -memalloc_obj = env2.Object(memalloc) -cluster_gen_obj = env2.Object(cluster_gen) -common_sub_obj = env2.Object(common_sub) -renormalization_obj = env2.Object(renormalization) -phd_se_noso_nosp_nosym_obj = env2.Object(phd_se_noso_nosp_nosym) -phd_mi_noso_nosp_nosym_obj = env2.Object(phd_mi_noso_nosp_nosym) -eig_common_obj = env2.Object(eig_common) -eig_pw_obj = env2.Object(eig_pw) -eig_mi_obj = env2.Object(eig_mi) +dim_mod_obj = env_spec.Object(dim_mod) +memalloc_obj = env_spec.Object(memalloc) +cluster_gen_obj = env_spec.Object(cluster_gen) +common_sub_obj = env_spec.Object(common_sub) +renormalization_obj = env_spec.Object(renormalization) +phd_se_noso_nosp_nosym_obj = env_spec.Object(phd_se_noso_nosp_nosym) +phd_mi_noso_nosp_nosym_obj = env_spec.Object(phd_mi_noso_nosp_nosym) +eig_common_obj = env_spec.Object(eig_common) +eig_pw_obj = env_spec.Object(eig_pw) +eig_mi_obj = env_spec.Object(eig_mi) Requires(memalloc_obj, dim_mod_obj) # define Python extensions common_deps = dim_mod_obj + memalloc_obj + cluster_gen_obj + common_sub_obj + deps = common_deps + renormalization_obj + phd_se_noso_nosp_nosym_obj -phd_se_mod = env2.F2PY('_phd_se_noso_nosp_nosym', ['phd_se_noso_nosp_nosym/main.f'] + deps) -Requires(phd_se_mod, deps) -env2.Alias('phd_se', phd_se_mod) +phd_se_mod = env_spec.F2py('_phd_se_noso_nosp_nosym', ['phd_se_noso_nosp_nosym/main.f'] + deps) +env_spec.InstallModule(phd_se_mod) deps = common_deps + renormalization_obj + phd_mi_noso_nosp_nosym_obj -phd_mi_mod = env2.F2PY('_phd_mi_noso_nosp_nosym', ['phd_mi_noso_nosp_nosym/main.f'] + deps) -Requires(phd_mi_mod, deps) -env2.Alias('phd_mi', phd_mi_mod) +phd_mi_mod = env_spec.F2py('_phd_mi_noso_nosp_nosym', ['phd_mi_noso_nosp_nosym/main.f'] + deps) +env_spec.InstallModule(phd_mi_mod) deps = common_deps + renormalization_obj + eig_common_obj + eig_mi_obj -eig_mi_mod = env2.F2PY('_eig_mi', ['eig/mi/main.f'] + deps) -Requires(eig_mi_mod, deps) -env2.Alias('eig_mi', eig_mi_mod) +eig_mi_mod = env_spec.F2py('_eig_mi', ['eig/mi/main.f'] + deps) +env_spec.InstallModule(eig_mi_mod) deps = common_deps + renormalization_obj + eig_common_obj + eig_pw_obj -eig_pw_mod = env2.F2PY('_eig_pw', ['eig/pw/main.f'] + deps) -Requires(eig_pw_mod, deps) -env2.Alias('eig_pw', eig_pw_mod) +eig_pw_mod = env_spec.F2py('_eig_pw', ['eig/pw/main.f'] + deps) +env_spec.InstallModule(eig_pw_mod) + +# Alias +env_spec.Alias('spec', [phd_se_mod, phd_mi_mod, eig_pw_mod, eig_mi_mod]) + diff --git a/src/msspec/spec/fortran/memalloc/dim_mod.f b/src/msspec/spec/fortran/memalloc/dim_mod.f index b09db08..475e2bd 100644 --- a/src/msspec/spec/fortran/memalloc/dim_mod.f +++ b/src/msspec/spec/fortran/memalloc/dim_mod.f @@ -1,3 +1,6 @@ + + + MODULE DIM_MOD IMPLICIT NONE INTEGER NATP_M, NATCLU_M, NAT_EQ_M, N_CL_L_M diff --git a/src/msspec/version.py b/src/msspec/version.py index b00c003..0ef25a6 100644 --- a/src/msspec/version.py +++ b/src/msspec/version.py @@ -7,8 +7,7 @@ import os # find the version number # 1- Try to read it from the git info -# 2- If it fails, try to read it from the VERSION file -# 3- If it fails, try to read it from the distribution file +# 2- If it fails, try to read it from the distribution file try: v = get_version(root='../../', relative_to=__file__, version_scheme="post-release") @@ -17,14 +16,9 @@ try: __version__ = v.base_version else: __version__ = v.public -except (LookupError, ImportError): +except Exception as err: try: - f = os.path.join(os.path.dirname(__file__), "../VERSION") - with open(f, "r") as fd: - __version__ = fd.read().strip('\n ') - except: - try: - __version__ = get_distribution(__name__.strip('.version')).version - except DistributionNotFound: - print("Unable to get the version number!") - + __version__ = get_distribution(__name__.strip('.version')).version + except Exception as err: + print("Unable to get the version number!") + __version__ = "9.9.9" diff --git a/src/requirements.txt b/src/requirements.txt index 86a721d..0cccd8d 100644 --- a/src/requirements.txt +++ b/src/requirements.txt @@ -1,11 +1,10 @@ numpy +matplotlib==2.1.1 ase h5py lxml pint terminaltables pycairo -coverage -sphinx setuptools_scm wxPython diff --git a/src/setup.py b/src/setup.py index de7ccaf..075d91c 100644 --- a/src/setup.py +++ b/src/setup.py @@ -13,72 +13,23 @@ import subprocess import traceback import os import sys +import glob sys.path.insert(0, "msspec") - from version import __version__ +with open('setup_requirements.txt', 'r') as fd: + SETUP_REQUIREMENTS = fd.read().strip().split('\n') -SETUP_REQUIRES = ['scons', 'setuptools_scm'] with open('requirements.txt', 'r') as fd: REQUIREMENTS = fd.read().strip().split('\n') -subprocess.call(["pip", "install"] + SETUP_REQUIRES) - - -class BuildExtCmd(_build_ext): - def run(self): - src_dir = "." - subprocess.call(['scons']) - for ext in self.extensions: - fullname = self.get_ext_fullname(ext.name) - filename = self.get_ext_filename(fullname) - print("building ", filename) - - src_filename = filename - dest_filename = os.path.join(self.build_lib, filename) - - os.makedirs(os.path.dirname(dest_filename), exist_ok=True) - copy_file(src_filename, dest_filename, verbose=self.verbose, - dry_run=self.dry_run) - - -class BuildCmd(_build): - def run(self): - print("build_lib ", self.build_lib) - self.run_command("build_ext") - _build.run(self) - -class InstallCmd(_install): - def run(self): - self.run_command("build") - _install.run(self) - -class CleanCmd(_clean): - def run(self): - subprocess.call(['scons', '-c']) - _clean.run(self) - - - if __name__ == "__main__": - module_phagen = Extension('msspec.phagen.fortran.libphagen',['msspec/phagen/fortran/main.f']) - module_spec_phd_mi = Extension('msspec.spec.fortran._phd_mi_noso_nosp_nosym',['msspec/spec/fortran/phd_mi_noso_nosp_nosym/main.f']) - module_spec_phd_se = Extension('msspec.spec.fortran._phd_se_noso_nosp_nosym',['msspec/spec/fortran/phd_se_noso_nosp_nosym/main.f']) - module_eig_mi = Extension('msspec.spec.fortran._eig_mi',['msspec/spec/fortran/eig/mi/main.f']) - module_eig_pw = Extension('msspec.spec.fortran._eig_pw',['msspec/spec/fortran/eig/pw/main.f']) - setup(name='msspec', version=__version__, include_package_data=True, - ext_modules=[module_phagen, module_spec_phd_mi, module_spec_phd_se, module_eig_mi, module_eig_pw], - cmdclass={'build' : BuildCmd, - 'build_ext': BuildExtCmd, - 'clean' : CleanCmd, - 'install' : InstallCmd, - }, packages=find_packages(include='msspec.*'), - setup_requires=SETUP_REQUIRES, + setup_requires=SETUP_REQUIREMENTS, install_requires=REQUIREMENTS, author='Didier Sébilleau, Sylvain Tricot', diff --git a/src/setup_requirements.txt b/src/setup_requirements.txt new file mode 100644 index 0000000..4a71718 --- /dev/null +++ b/src/setup_requirements.txt @@ -0,0 +1,5 @@ +scons +setuptools_scm +numpy +sphinx +coverage