diff options
-rw-r--r-- | gnu/packages/maths.scm | 92 |
1 files changed, 91 insertions, 1 deletions
diff --git a/gnu/packages/maths.scm b/gnu/packages/maths.scm index 0a9166433e..180737001e 100644 --- a/gnu/packages/maths.scm +++ b/gnu/packages/maths.scm @@ -2,7 +2,7 @@ ;;; Copyright © 2013, 2014, 2015, 2016 Andreas Enge <andreas@enge.fr> ;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org> ;;; Copyright © 2014, 2016, 2017 John Darrington <jmd@gnu.org> -;;; Copyright © 2014, 2015, 2016, 2017, 2018 Eric Bavier <bavier@member.fsf.org> +;;; Copyright © 2014, 2015, 2016, 2017, 2018, 2019 Eric Bavier <bavier@member.fsf.org> ;;; Copyright © 2014 Federico Beffa <beffa@fbengineering.ch> ;;; Copyright © 2014 Mathieu Lirzin <mathieu.lirzin@openmailbox.org> ;;; Copyright © 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus <rekado@elephly.net> @@ -3974,6 +3974,96 @@ as equations, scalars, vectors, and matrices.") theories} (SMT) solver. It provides a C/C++ API, as well as Python bindings.") (license license:expat))) +(define-public elpa + (package + (name "elpa") + (version "2018.11.001") + (source (origin + (method url-fetch) + (uri (string-append "http://elpa.mpcdf.mpg.de/html/Releases/" + version "/elpa-" version ".tar.gz")) + (sha256 + (base32 + "05hv3v5i6xmziaizw350ff72y1c3k662r85fm3xfdrkclj5zw9yc")))) + (build-system gnu-build-system) + (native-inputs + `(("fortran" ,gfortran) + ("perl" ,perl))) ;for configure and deps + (inputs + `(("blas" ,openblas))) + (arguments + `(#:configure-flags + `("--enable-openmp" + "--with-mpi=no" + ;; ELPA unfortunately does not support runtime dispatch, so we can + ;; only enable the "generic" kernels. See the "Cross compilation" + ;; section of INSTALL.md. + "--enable-generic" + "--disable-sse" "--disable-sse-assembly" ;Require SSE3 + "--disable-avx" "--disable-avx2" "--disable-avx512" + ,(string-append "CFLAGS=-O3 " + "-funsafe-loop-optimizations -funsafe-math-optimizations " + "-ftree-vect-loop-version -ftree-vectorize " + ,(let ((system (or (%current-target-system) + (%current-system)))) + (cond + ((or (string-prefix? "x86_64" system) + (string-prefix? "i686" system)) + "-msse2") + (else ""))))) + #:parallel-tests? #f ;tests are multi-threaded, via BLAS + #:phases + (modify-phases %standard-phases + (add-before 'configure 'patch-header-generation + (lambda _ + (substitute* "configure" + (("^ *make.*top_srcdir=\"\\$srcdir\"" &) + (string-append & " CPP=\"$CPP\""))) + #t)) + (add-before 'check 'setup-tests + (lambda _ + ;; Decrease test time and RAM use by computing fewer eigenvalues. + ;; The flags are (MATRIX-SIZE, EIGENVALUES, BLOCK-SIZE), where + ;; the default is (500, 250, 16) for C tests and (5000, 150, 16) + ;; for Fortran. This also causes several tests to pass that + ;; otherwise would otherwise fail with matrix size 5000; possibly + ;; due to floating point tolerances that are too tight. + (setenv "TEST_FLAGS" "1500 50 16") ;from elpa.spec + (setenv "OMP_NUM_THREADS" (number->string (parallel-job-count))) + (substitute* "Makefile" + ;; Test scripts are generated, patch the shebang + (("#!/bin/bash") (string-append "#!" (which "sh")))) + #t))))) + (home-page "http://elpa.mpcdf.mpg.de") + (synopsis "Eigenvalue solvers for symmetric matrices") + (description + "The ELPA library provides efficient and scalable direct eigensolvers for +symmetric matrices.") + (license license:lgpl3))) + +(define-public elpa-openmpi + (package (inherit elpa) + (name "elpa-openmpi") + (inputs + `(("mpi" ,openmpi) + ("scalapack" ,scalapack) + ,@(package-inputs elpa))) + (arguments + (substitute-keyword-arguments (package-arguments elpa) + ((#:configure-flags cf '()) + `(cons "--with-mpi=yes" (delete "--with-mpi=no" ,cf))) + ((#:phases phases '%standard-phases) + `(modify-phases ,phases + (add-before 'check 'mpi-setup + (lambda _ + ;; Tests use 2 mpi tasks by default, use our remaining build + ;; cores as OpenMP threads. + (setenv "OMP_NUM_THREADS" (number->string + (max (quotient (parallel-job-count) 2) + 1))) + (,%openmpi-setup))))))) + (synopsis "Eigenvalue solvers for symmetric matrices (with MPI support)"))) + (define-public elemental (package (name "elemental") |