~ruther/guix-local

b9100e2f11a6735d37bb256ffecb947f9b7ce31f — Eric Bavier 12 years ago 3da5dca
gnu: Add petsc

* gnu/packages/maths.scm (petsc): New variable.
  (petsc-complex): New variable.
* gnu/packages/patches/petsc-fix-threadcomm.patch: New patch.
* gnu-system.am (dist_patch_DATA): Add it.
3 files changed, 105 insertions(+), 0 deletions(-)

M gnu-system.am
M gnu/packages/maths.scm
A gnu/packages/patches/petsc-fix-threadcomm.patch
M gnu-system.am => gnu-system.am +1 -0
@@ 323,6 323,7 @@ dist_patch_DATA =						\
  gnu/packages/patches/patchelf-page-size.patch			\
  gnu/packages/patches/patchutils-xfail-gendiff-tests.patch	\
  gnu/packages/patches/perl-no-sys-dirs.patch			\
  gnu/packages/patches/petsc-fix-threadcomm.patch		\
  gnu/packages/patches/plotutils-libpng-jmpbuf.patch		\
  gnu/packages/patches/procps-make-3.82.patch			\
  gnu/packages/patches/python-fix-tests.patch			\

M gnu/packages/maths.scm => gnu/packages/maths.scm +89 -0
@@ 366,3 366,92 @@ 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)
       ;; 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")
       #: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."))))

A gnu/packages/patches/petsc-fix-threadcomm.patch => gnu/packages/patches/petsc-fix-threadcomm.patch +15 -0
@@ 0,0 1,15 @@
Fix "error: unknown type name 'cpu_set_t'".  Patch submitted upstream
http://lists.mcs.anl.gov/pipermail/petsc-dev/2014-May/015345.html

--- a/src/sys/threadcomm/impls/openmp/tcopenmp.c	2014-03-13 21:47:22.000000000 -0500
+++ b/src/sys/threadcomm/impls/openmp/tcopenmp.c	2014-04-02 14:44:57.185170151 -0500
@@ -1,6 +1,9 @@
 #define PETSC_DESIRE_FEATURE_TEST_MACROS
 #include <../src/sys/threadcomm/impls/openmp/tcopenmpimpl.h>
 #include <omp.h>
+#if defined(PETSC_HAVE_SCHED_CPU_SET_T)
+#include <sched.h>
+#endif
 
 PetscErrorCode PetscThreadCommGetRank_OpenMP(PetscInt *trank)
 {