;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Paul Garlick ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (gnu packages simulation) #:use-module (gnu packages) #:use-module (gnu packages base) #:use-module (gnu packages bash) #:use-module (gnu packages bison) #:use-module (gnu packages boost) #:use-module (gnu packages compression) #:use-module (gnu packages flex) #:use-module (gnu packages gettext) #:use-module (gnu packages gcc) #:use-module (gnu packages gl) #:use-module (gnu packages graphics) #:use-module (gnu packages gtk) #:use-module (gnu packages linux) #:use-module (gnu packages m4) #:use-module (gnu packages maths) #:use-module (gnu packages mpi) #:use-module (gnu packages multiprecision) #:use-module (gnu packages ncurses) #:use-module (gnu packages readline) #:use-module (gnu packages tls) #:use-module (gnu packages version-control) #:use-module (gnu packages xml) #:use-module (gnu packages xorg) #:use-module (guix download) #:use-module (guix build utils) #:use-module (guix build-system gnu) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix utils) #:use-module (ice-9 ftw) #:use-module (ice-9 regex) #:use-module (srfi srfi-1)) (define-public openfoam (package (name "openfoam") (version "4.1") (source (origin (method url-fetch) (uri (string-append "http://dl.openfoam.org/source/" (string-replace-substring version "." "-"))) (file-name (string-append name "-" version ".tar.gz")) (sha256 (base32 "1hgh2kw7fqv4bfachhbjhw16v8j35jbv6s576fmz4ka2q4ks4wg3")) (patches (search-patches "openfoam-cleanup.patch")) (modules '((guix build utils))))) (build-system gnu-build-system) (native-inputs `(("bison" ,bison))) (propagated-inputs `(("boost" ,boost) ("cgal" ,cgal) ("flex" ,flex) ("git" ,git) ("gmp" ,gmp) ("gzip" ,gzip) ("gnuplot" ,gnuplot) ("libxt" ,libxt) ("metis" ,metis) ("mpfr" ,mpfr) ("ncurses" ,ncurses) ("openmpi" ,openmpi) ("readline" ,readline) ("scotch" ,pt-scotch) ("zlib" ,zlib))) (arguments `(;; executable files and shared libraries are located in the 'platforms' ;; subdirectory #:strip-directories (list (string-append "OpenFOAM-" ,version "/platforms/linux64GccDPInt32Opt/bin") (string-append "OpenFOAM-" ,version "/platforms/linux64GccDPInt32Opt/lib")) ;; '#:elf-directories' is not recognised here so skip validation phase #:validate-runpath? #f #:phases (modify-phases %standard-phases (add-after 'unpack 'rename-build-directory (lambda _ (use-modules (ice-9 ftw)) (use-modules (ice-9 regex)) (chdir "..") ;; use 'OpenFOAM-version' convention to match path name ;; expectations in the build phase (let ((unpack-dir (string-append (getcwd) "/" (list-ref (scandir (getcwd) (lambda (name) (string-match "^OpenFOAM" name))) 0))) (build-dir (string-append (getcwd) "/OpenFOAM-" ,version))) ;; re-name build directory (rename-file unpack-dir build-dir) ;; move to build directory (chdir (basename build-dir))))) (add-after 'patch-source-shebangs 'set-environment-variables (lambda _ (let ((libraries '("boost" "cgal" "gmp" "metis" "mpfr" "scotch"))) ;; set variables to define store paths (for-each (lambda (library) (setenv (string-append (string-upcase library) "_ROOT") (assoc-ref %build-inputs library))) libraries)) ;; set variables to define package versions (setenv "SCOTCHVERSION" ,(package-version scotch)) (setenv "METISVERSION" ,(package-version metis)))) (delete 'configure) ; no configure phase (delete 'patch-generated-file-shebangs) ; no generated files (replace 'build (lambda _ ;; compile OpenFOAM libraries and applications (zero? (system (format #f "source ./etc/bashrc && ./Allwmake -j~a" (parallel-job-count)))))) (add-after 'build 'update-configuration-files (lambda _ ;; record store paths and package versions in configuration files (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" "$CGAL_ROOT" "etc/config.sh/CGAL"))) (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" "$BOOST_ROOT" "etc/config.sh/CGAL"))) (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" "$METIS_ROOT" "etc/config.sh/metis"))) (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" "$METISVERSION" "etc/config.sh/metis"))) (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" "$SCOTCH_ROOT" "etc/config.sh/scotch"))) (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" "$SCOTCHVERSION" "etc/config.sh/scotch"))) (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" "$GMP_ROOT" "etc/config.sh/settings"))) (zero? (system (format #f "sed -i 's|~a|'~:*~s'|' ~a" "$MPFR_ROOT" "etc/config.sh/settings"))))) (delete 'check) ; no tests to run (replace 'install (lambda _ ;; use 'OpenFOAM-version' convention (let ((install-dir (string-append %output "/OpenFOAM-" ,version))) ;; create install directory (mkdir-p install-dir) ;; move contents of build directory to install directory (copy-recursively "." install-dir))))))) ;; Note: tutorial files are installed read-only in /gnu/store. ;; To allow write permissions on files copied from the store a ;; 'chmod' step is needed before running the applications. For ;; example, from a user's login: ;; $ source $GUIX_PROFILE/OpenFOAM-4.1/etc/bashrc ;; $ mkdir -p $FOAM_RUN ;; $ cd $FOAM_RUN ;; $ cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzdaily . ;; $ cd pitzdaily ;; $ chmod -R u+w . ;; $ blockMesh (native-search-paths ;; define the FOAM_INST_DIR variable (list (search-path-specification (variable "FOAM_INST_DIR") (files '("."))))) (synopsis "Framework for numerical simulation of fluid flow") (description "OpenFOAM provides a set of solvers and methods for tackling problems in the field of Computational Fluid Dynamics (CFD). It is written in C++. Complex governing equations such as the Navier-Stokes equations can be solved in integral form. Physical processes such as phase change, droplet transport and chemical reaction can be modelled. Numerical methods are included to deal with sharp gradients, such as those encountered in flows with shock waves and flows with gas/liquid interfaces. OpenFOAM implements the Finite Volume Method for discretizing the spacial dimensions. Computational grids defining geometries in two- and three-dimensional domains may be generated by the included blockMesh and snappyHexMesh routines or imported from external grid-generation packages. Grids may be unstructured in layout and may contain any combination of polyhedral cells. Large problems may be split into smaller, connected problems for efficient solution on parallel systems") (license license:gpl3+) (home-page "https://openfoam.org")))