gnu: Add OpenMPI
[jackhill/guix/guix.git] / gnu / packages / maths.scm
index 7535412..2018e17 100644 (file)
@@ -1,5 +1,8 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
+;;; Copyright © 2013, 2014 Andreas Enge <andreas@enge.fr>
+;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
+;;; Copyright © 2014 John Darrington <jmd@gnu.org>
+;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
                 #:renamer (symbol-prefix-proc 'license:))
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix utils)
+  #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
+  #:use-module (gnu packages algebra)
+  #:use-module (gnu packages bison)
+  #:use-module (gnu packages cmake)
   #:use-module (gnu packages compression)
-  #:use-module ((gnu packages gettext)
-                #:renamer (symbol-prefix-proc 'gnu:))
+  #:use-module (gnu packages curl)
+  #:use-module (gnu packages elf)
+  #:use-module (gnu packages flex)
+  #:use-module (gnu packages fltk)
+  #:use-module (gnu packages fontutils)
+  #:use-module (gnu packages gettext)
+  #:use-module (gnu packages gcc)
+  #:use-module (gnu packages gd)
+  #:use-module (gnu packages ghostscript)
+  #:use-module (gnu packages gtk)
+  #:use-module (gnu packages less)
+  #:use-module (gnu packages xorg)
+  #:use-module (gnu packages gl)
+  #:use-module (gnu packages multiprecision)
+  #:use-module (gnu packages pcre)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages python)
   #:use-module (gnu packages readline)
+  #:use-module (gnu packages tcsh)
+  #:use-module (gnu packages texinfo)
+  #:use-module (gnu packages texlive)
   #:use-module (gnu packages xml))
 
 (define-public units
   (package
    (name "units")
-   (version "2.01")
+   (version "2.11")
    (source (origin
             (method url-fetch)
             (uri (string-append "mirror://gnu/units/units-" version
                                 ".tar.gz"))
             (sha256 (base32
-                     "1wl8kaxgk4l5jgc1f71mx1rwa6ib84krjmzyzn2f987z1g3i52qk"))))
+                     "1gjs3wc212aaiq4r76hx9nl1h3fa39n0ljwl9420d6ixl3rdmdjk"))))
    (build-system gnu-build-system)
    (synopsis "Conversion between thousands of scales")
    (description
-    "GNU Units converts quantities expressed in various systems of
-measurement to their equivalents in other systems of measurement.  Like
-many similar programs, it can handle multiplicative scale changes.  It can
-also handle nonlinear conversions such as Fahrenheit to Celsius or wire
-gauge, and it can convert from and to sums of units, such as converting
-between meters and feet plus inches.
-
-Beyond simple unit conversions, GNU Units can be used as a general-purpose
-scientific calculator that keeps track of units in its calculations.  You
-can form arbitrary complex mathematical expressions of dimensions including
-sums, products, quotients, powers, and even roots of dimensions.  Thus you
-can ensure accuracy and dimensional consistency when working with long
-expressions that involve many different units that may combine in complex
-ways.
-
-The units are defined in an external data file.  You can use the extensive
-data file that comes with this program, or you can provide your own data
-file to suit your needs.  You can also use your own data file to supplement
-the standard data file.")
+    "GNU Units converts numeric quantities between units of measure.  It
+can handle scale changes through adaptive usage of standard scale prefixes
+(micro-, kilo-, etc.).  It can also handle nonlinear conversions such as
+Fahrenheit to Celsius.  Its interpreter is powerful enough to be used
+effectively as a scientific calculator.")
    (license license:gpl3+)
    (home-page "http://www.gnu.org/software/units/")))
 
 (define-public gsl
   (package
     (name "gsl")
-    (version "1.15")
+    (version "1.16")
     (source
      (origin
       (method url-fetch)
@@ -77,10 +88,11 @@ the standard data file.")
                           version ".tar.gz"))
       (sha256
        (base32
-        "18qf6jzz1r3mzb5qynywv4xx3z9g61hgkbpkdrhbgqh2g7jhgfc5"))))
+        "0lrgipi0z6559jqh82yx8n4xgnxkhzj46v96dl77hahdp58jzg3k"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:phases
+     `(#:parallel-tests? #f
+       #:phases
         (alist-replace
          'configure
          (lambda* (#:key target system outputs #:allow-other-keys #:rest args)
@@ -95,20 +107,44 @@ the standard data file.")
     (home-page "http://www.gnu.org/software/gsl/")
     (synopsis "Numerical library for C and C++")
     (description
-     "The GNU Scientific Library (GSL) is a numerical library for C
-and C++ programmers.  It is free software under the GNU General
-Public License.
+     "The GNU Scientific Library is a library for numerical analysis in C
+and C++.  It includes a wide range of mathematical routines, with over 1000
+functions in total.  Subject areas covered by the library include:
+differential equations, linear algebra, Fast Fourier Transforms and random
+numbers.")
+    (license license:gpl3+)))
 
-The library provides a wide range of mathematical routines such
-as random number generators, special functions and least-squares
-fitting.  There are over 1000 functions in total with an
-extensive test suite.")
+(define-public glpk
+  (package
+    (name "glpk")
+    (version "4.54")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "mirror://gnu/glpk/glpk-"
+                          version ".tar.gz"))
+      (sha256
+       (base32
+        "18gr2anv8gyps6j9f22k7li6w07glvww666sdqblvlq2hh3whwmb"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("gmp" ,gmp)))
+    (arguments
+     `(#:configure-flags '("--with-gmp")))
+    (home-page "http://www.gnu.org/software/glpk/")
+    (synopsis "GNU Linear Programming Kit, supporting the MathProg language")
+    (description
+     "GLPK is a C library for solving large-scale linear programming (LP),
+mixed integer programming (MIP), and other related problems.  It supports the
+GNU MathProg modeling language, a subset of the AMPL language, and features a
+translator for the language.  In addition to the C library, a stand-alone
+LP/MIP solver is included in the package.")
     (license license:gpl3+)))
 
 (define-public pspp
   (package
     (name "pspp")
-    (version "0.8.0a")
+    (version "0.8.2")
     (source
      (origin
       (method url-fetch)
@@ -116,31 +152,397 @@ extensive test suite.")
                           version ".tar.gz"))
       (sha256
        (base32
-        "1pgkb3z8b4wk4gymnafclhkrqq7n05wq83mra3v53jdl6bnllmyq"))))
+        "1w7h3dglgx0jlq1wb605b8pgfsk2vr1q2q2rj7bsajh9ihbcsixr"))))
     (build-system gnu-build-system)
     (inputs
-     `(("gettext" ,gnu:gettext)
+     `(("cairo" ,cairo)
+       ("fontconfig" ,fontconfig)
+       ("gettext" ,gnu-gettext)
        ("gsl" ,gsl)
        ("libxml2" ,libxml2)
+       ("pango" ,pango)
        ("readline" ,readline)
+       ("gtk" ,gtk+-2)
+       ("gtksourceview" ,gtksourceview)
        ("zlib" ,zlib)))
     (native-inputs
      `(("perl" ,perl)
        ("pkg-config" ,pkg-config)))
-    (arguments
-     `(#:configure-flags
-       `("--without-cairo" ; FIXME: tests currently fail for lack of font
-         "--without-gui"))) ; FIXME: package missing dependencies
     (home-page "http://www.gnu.org/software/pspp/")
     (synopsis "Statistical analysis")
     (description
-     "PSPP is a program for statistical analysis of sampled data.  It is a
-free replacement for the proprietary program SPSS, and appears very similar
-to it.
+     "GNU PSPP is a statistical analysis program.  It can perform
+descriptive statistics, T-tests, linear regression and non-parametric tests. 
+It features both a graphical interface as well as command-line input. PSPP is
+designed to interoperate with Gnumeric, LibreOffice and OpenOffice.  Data can
+be imported from spreadsheets, text files and database sources and it can be
+output in text, PostScript, PDF or HTML.")
+    (license license:gpl3+)))
+
+(define-public lapack
+  (package
+    (name "lapack")
+    (version "3.5.0")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "http://www.netlib.org/lapack/lapack-"
+                          version ".tgz"))
+      (sha256
+       (base32
+        "0lk3f97i9imqascnlf6wr5mjpyxqcdj73pgj97dj2mgvyg9z1n4s"))))
+    (build-system cmake-build-system)
+    (home-page "http://www.netlib.org/lapack/")
+    (native-inputs `(("patchelf" ,patchelf))) ;for augment-rpath
+    (inputs `(("fortran" ,gfortran-4.8)
+              ("python" ,python-2)))
+    (arguments
+     `(#:configure-flags '("-DBUILD_SHARED_LIBS:BOOL=YES")
+       #:phases (alist-cons-before
+                 'check 'patch-python
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   (let ((python (assoc-ref inputs "python")))
+                     (substitute* "lapack_testing.py"
+                       (("/usr/bin/env python") python))))
+                  %standard-phases)))
+    (synopsis "Library for numerical linear algebra")
+    (description
+     "LAPACK is a Fortran 90 library for solving the most commonly occurring
+problems in numerical linear algebra.")
+    (license (license:bsd-style "file://LICENSE"
+                                "See LICENSE in the distribution."))))
+
+(define-public gnuplot
+  (package
+    (name "gnuplot")
+    (version "4.6.3")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "mirror://sourceforge/gnuplot/gnuplot/"
+                                version "/gnuplot-" version ".tar.gz"))
+      (sha256
+       (base32
+        "1xd7gqdhlk7k1p9yyqf9vkk811nadc7m4si0q3nb6cpv4pxglpyz"))))
+    (build-system gnu-build-system)
+    (inputs `(("readline" ,readline)
+              ("cairo" ,cairo)
+              ("pango" ,pango)
+              ("gd" ,gd)))
+    (native-inputs `(("texlive" ,texlive)
+                     ("pkg-config" ,pkg-config)))
+    (home-page "http://www.gnuplot.info")
+    (synopsis "Command-line driven graphing utility")
+    (description "Gnuplot is a portable command-line driven graphing
+utility. It was originally created to allow scientists and students to
+visualize mathematical functions and data interactively, but has grown to
+support many non-interactive uses such as web scripting. It is also used as a
+plotting engine by third-party applications like Octave.")
+    ;;  X11 Style with the additional restriction that derived works may only be
+    ;;  distributed as patches to the original.
+    (license (license:fsf-free
+             "http://gnuplot.cvs.sourceforge.net/gnuplot/gnuplot/Copyright"))))
+
+(define-public hdf5
+  (package
+    (name "hdf5")
+    (version "1.8.12")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "http://www.hdfgroup.org/ftp/HDF5/current/src/hdf5-"
+                          version ".tar.bz2"))
+      (sha256
+       (base32 "0f9n0v3p3lwc7564791a39c6cn1d3dbrn7d1j3ikqsi27a8hy23d"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases
+        (alist-cons-before
+         'configure 'patch-configure
+         (lambda _
+           (substitute* "configure"
+             (("/bin/mv") "mv")))
+         %standard-phases)))
+    (outputs '("out" "bin" "lib" "include"))
+    (home-page "http://www.hdfgroup.org")
+    (synopsis "Management suite for  extremely large and complex data")
+    (description "HDF5 is a suite that makes possible the management of
+extremely large and complex data collections.")
+    (license (license:x11-style
+              "http://www.hdfgroup.org/ftp/HDF5/current/src/unpacked/COPYING"))))
+
 
-PSPP can perform descriptive statistics, T-tests, anova, linear and logistic
-regression, cluster analysis, factor analysis, non-parametric tests and
-more.  Its backend is designed to perform its analyses as fast as possible,
-regardless of the size of the input data.  You can use PSPP with its
-graphical interface or the more traditional syntax commands.")
+;; For a fully featured Octave, users  are strongly recommended also to install
+;; the following packages: texinfo, less, ghostscript, gnuplot.
+(define-public octave
+  (package
+    (name "octave")
+    (version "3.8.0")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "mirror://gnu/octave/octave-"
+                         version ".tar.gz"))
+      (sha256
+       (base32
+       "0ks9pr154syw0vb3jn6xsnrkkrbvf9y7i7gaxa28rz6ngxbxvq9l"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("lapack" ,lapack)
+       ("readline" ,readline)
+       ("glpk" ,glpk)
+       ("curl" ,curl)
+       ("pcre" ,pcre)
+       ("fltk" ,fltk)
+       ("fontconfig" ,fontconfig)
+       ("freetype" ,freetype)
+       ("hdf5-lib" ,hdf5 "lib")
+       ("hdf5-include" ,hdf5 "include")
+       ("libxft" ,libxft)
+       ("mesa" ,mesa)
+       ("zlib" ,zlib)))
+    (native-inputs
+     `(("gfortran" ,gfortran-4.8)
+       ("pkg-config" ,pkg-config)
+       ("perl" ,perl)
+       ;; The following inputs are not actually used in the build process.  However, the
+       ;; ./configure gratuitously tests for their existence and assumes that programs not
+       ;; present at build time are also not, and can never be, available at run time!
+       ;; If these inputs are therefore not present, support for them will be built out.
+       ;; However, Octave will still run without them, albeit without the features they
+       ;; provide.
+       ("less" ,less)
+       ("texinfo" ,texinfo)
+       ("ghostscript" ,ghostscript)
+       ("gnuplot" ,gnuplot)))
+    (arguments
+     `(#:configure-flags (list (string-append "--with-shell="
+                           (assoc-ref %build-inputs "bash")
+                           "/bin/sh"))))
+    (home-page "http://www.gnu.org/software/octave/")
+    (synopsis "High-level language for numerical computation")
+    (description "GNU Octave is a high-level interpreted language that is specialized
+for numerical computations.  It can be used for both linear and non-linear
+applications and it provides great support for visualizing results.  Work may
+be performed both at the interactive command-line as well as via script
+files.")
     (license license:gpl3+)))
+
+(define-public gmsh
+  (package
+    (name "gmsh")
+    (version "2.8.4")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "http://www.geuz.org/gmsh/src/gmsh-"
+                          version "-source.tgz"))
+      (sha256
+       (base32 "0jv2yvk28w86rx5mvjkb0w12ff2jxih7axnpvznpd295lg5jg7hr"))
+      (modules '((guix build utils)))
+      (snippet
+       ;; Remove non-free METIS code
+       '(delete-file-recursively "contrib/Metis"))))
+    (build-system cmake-build-system)
+    (native-inputs `(("patchelf" ,patchelf))) ;for augment-rpath
+    (propagated-inputs
+     `(("fltk" ,fltk)
+       ("gfortran" ,gfortran-4.8)
+       ("gmp" ,gmp)
+       ("hdf5-lib" ,hdf5 "lib")
+       ("hdf5-include" ,hdf5 "include")
+       ("lapack" ,lapack)
+       ("mesa" ,mesa)
+       ("libx11" ,libx11)
+       ("libxext" ,libxext)))
+    (arguments
+     `(#:configure-flags `("-DENABLE_METIS:BOOL=OFF"
+                           "-DENABLE_BUILD_SHARED:BOOL=ON"
+                           "-DENABLE_BUILD_DYNAMIC:BOOL=ON")))
+    (home-page "http://www.geuz.org/gmsh/")
+    (synopsis "3D finite element grid generator")
+    (description "Gmsh is a 3D finite element grid generator with a built-in
+CAD engine and post-processor.  Its design goal is to provide a fast, light
+and user-friendly meshing tool with parametric input and advanced
+visualization capabilities.  Gmsh is built around four modules: geometry,
+mesh, solver and post-processing.  The specification of any input to these
+modules is done either interactively using the graphical user interface or in
+ASCII text files using Gmsh's own scripting language.")
+    (license license:gpl2+)))
+
+(define-public petsc
+  (package
+    (name "petsc")
+    (version "3.4.4")
+    (source
+     (origin
+      (method url-fetch)
+      ;; The *-lite-* tarball does not contain the *large* documentation
+      (uri (string-append "http://ftp.mcs.anl.gov/pub/petsc/release-snapshots/"
+                          "petsc-lite-" version ".tar.gz"))
+      (sha256
+       (base32 "0v5dg6dhdjpi5ianvd4mm6hsvxzv1bsxwnh9f9myag0a0d9xk9iv"))
+      (patches
+       (list (search-patch "petsc-fix-threadcomm.patch")))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("python" ,python-2)
+       ("perl" ,perl)))
+    (inputs
+     `(("gfortran" ,gfortran-4.8)
+       ("lapack" ,lapack)
+       ("superlu" ,superlu)
+       ;; leaving out hdf5 and fftw, as petsc expects them to be built with mpi
+       ;; leaving out opengl, as configuration seems to only be for mac
+       ))
+    (arguments
+     `(#:test-target "test"
+       #:parallel-build? #f
+       #:configure-flags
+       `("--with-mpi=0"
+         "--with-openmp=1"
+         "--with-superlu=1"
+         ,(string-append "--with-superlu-include="
+                         (assoc-ref %build-inputs "superlu") "/include")
+         ,(string-append "--with-superlu-lib="
+                         (assoc-ref %build-inputs "superlu") "/lib/libsuperlu.a"))
+       #:phases
+       (alist-replace
+        'configure
+        ;; PETSc's configure script is actually a python script, so we can't
+        ;; run it with bash.
+        (lambda* (#:key outputs (configure-flags '())
+                  #:allow-other-keys)
+          (let* ((prefix (assoc-ref outputs "out"))
+                 (flags `(,(string-append "--prefix=" prefix)
+                          ,@configure-flags)))
+            (format #t "build directory: ~s~%" (getcwd))
+            (format #t "configure flags: ~s~%" flags)
+            (zero? (apply system* "./configure" flags))))
+        (alist-cons-after
+         'install 'clean-local-references
+         ;; Try to keep installed files from leaking build directory names.
+         (lambda* (#:key inputs outputs #:allow-other-keys)
+           (let ((out     (assoc-ref outputs "out"))
+                 (fortran (assoc-ref inputs  "gfortran")))
+             (substitute* (map (lambda (file)
+                                 (string-append out "/" file))
+                               '("conf/petscvariables"
+                                 "conf/PETScConfig.cmake"
+                                 "include/petscconf.h"
+                                 "include/petscmachineinfo.h"))
+               (((getcwd)) out))
+             ;; Make compiler references point to the store
+             (substitute* (string-append out "/conf/petscvariables")
+               (("= g(cc|\\+\\+|fortran)" _ suffix)
+                (string-append "= " fortran "/bin/g" suffix)))
+             ;; PETSc installs some build logs, which aren't necessary.
+             (for-each (lambda (file)
+                         (delete-file (string-append out "/" file)))
+                       '("conf/configure.log"
+                         "conf/make.log"
+                         "conf/test.log"
+                         "conf/RDict.db"
+                         ;; Once installed, should uninstall with Guix
+                         "conf/uninstall.py"))))
+         %standard-phases))))
+    (home-page "http://www.mcs.anl.gov/petsc")
+    (synopsis "Library to solve ODEs and algebraic equations")
+    (description "PETSc, pronounced PET-see (the S is silent), is a suite of
+data structures and routines for the scalable (parallel) solution of
+scientific applications modeled by partial differential equations.")
+    (license (license:bsd-style
+              "http://www.mcs.anl.gov/petsc/documentation/copyright.html"))))
+
+(define-public petsc-complex
+  (package (inherit petsc)
+    (name "petsc-complex")
+    (arguments
+     (substitute-keyword-arguments (package-arguments petsc)
+       ((#:configure-flags cf)
+        `(cons "--with-scalar-type=complex" ,cf))))
+    (description
+     (string-append (package-description petsc)
+                    "  Complex scalar type version."))))
+
+(define-public superlu
+  (package
+    (name "superlu")
+    (version "4.3")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (string-append "http://crd-legacy.lbl.gov/~xiaoye/SuperLU/"
+                           "superlu_" version ".tar.gz"))
+       (sha256
+        (base32 "10b785s9s4x0m9q7ihap09275pq4km3k2hk76jiwdfdr5qr2168n"))))
+    (build-system gnu-build-system)
+    (native-inputs
+     `(("tcsh" ,tcsh)))
+    (inputs
+     `(("lapack" ,lapack)
+       ("gfortran" ,gfortran-4.8)))
+    (arguments
+     `(#:parallel-build? #f
+       #:tests? #f                      ;tests are run as part of `make all`
+       #:phases
+       (alist-replace
+        'configure
+        (lambda* (#:key inputs outputs #:allow-other-keys)
+          (call-with-output-file "make.inc"
+            (lambda (port)
+              (format port "
+PLAT        =
+SuperLUroot = ~a
+SUPERLULIB  = ~a/lib/libsuperlu.a
+TMGLIB      = libtmglib.a
+BLASDEF     = -DUSE_VENDOR_BLAS
+BLASLIB     = -L~a/lib -lblas
+LIBS        = $(SUPERLULIB) $(BLASLIB)
+ARCH        = ar
+ARCHFLAGS   = cr
+RANLIB      = ranlib
+CC          = gcc
+PIC         = -fPIC
+CFLAGS      = -O3 -DPRNTlevel=0 $(PIC)
+NOOPTS      = -O0 $(PIC)
+FORTRAN     = gfortran
+FFLAGS      = -O2 $(PIC)
+LOADER      = $(CC)
+CDEFS       = -DAdd_"
+                      (getcwd)
+                      (assoc-ref outputs "out")
+                      (assoc-ref inputs "lapack")))))
+        (alist-cons-before
+         'build 'create-install-directories
+         (lambda* (#:key outputs #:allow-other-keys)
+           (for-each
+            (lambda (dir)
+              (mkdir-p (string-append (assoc-ref outputs "out")
+                                      "/" dir)))
+            '("lib" "include")))
+         (alist-replace
+          'install
+          (lambda* (#:key outputs #:allow-other-keys)
+            ;; Library is placed in lib during the build phase.  Copy over
+            ;; headers to include.
+            (let* ((out    (assoc-ref outputs "out"))
+                   (incdir (string-append out "/include")))
+              (for-each (lambda (file)
+                          (let ((base (basename file)))
+                            (format #t "installing `~a' to `~a'~%"
+                                    base incdir)
+                            (copy-file file
+                                       (string-append incdir "/" base))))
+                        (find-files "SRC" ".*\\.h$"))))
+          %standard-phases)))))
+    (home-page "http://crd-legacy.lbl.gov/~xiaoye/SuperLU/")
+    (synopsis "Supernodal direct solver for sparse linear systems")
+    (description
+     "SuperLU is a general purpose library for the direct solution of large,
+sparse, nonsymmetric systems of linear equations on high performance machines.
+The library is written in C and is callable from either C or Fortran.  The
+library routines perform an LU decomposition with partial pivoting and
+triangular system solves through forward and back substitution.  The library
+also provides threshold-based ILU factorization preconditioners.")
+    (license license:bsd-3)))