summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu/packages/maths.scm92
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")