Subject: [PATCH 1/3] gnu: Add openfoam-package.

From: reza <[email-masked]>
Date: Fri, 29 Sep 2023 09:03:03 +0000

* gnu/packages/simulation.scm (openfoam-package): Add factory function to
generate openfoam packages. Improve build tree clean up.
---
 gnu/packages/simulation.scm | 295 ++++++++++++++++++++++++++++++++++++
 1 file changed, 295 insertions(+)

diff --git a/gnu/packages/simulation.scm b/gnu/packages/simulation.scm
index 1dd6dc63f7..0d52434fac 100644
--- a/gnu/packages/simulation.scm
+++ b/gnu/packages/simulation.scm
@@ -431,6 +431,301 @@ (define-public openfoam-com
     (synopsis "Framework for numerical simulation of fluid flow (from openfoam.com)")
     (home-page "https://www.openfoam.com")))
 
+(define* (openfoam-package source version name home-page synopsis)
+  (let* ((install-path (string-append "share/OpenFOAM-" version))
+         (paraview-version (version-major+minor (package-version paraview)))
+         (pv-plugin-path
+          (string-append install-path
+                         "/platforms/linux64GccDPInt32Opt/lib/paraview-"
+                         paraview-version)))
+    (package
+      (name name)
+      (version version)
+      (source source)
+      (build-system gnu-build-system)
+      (native-search-paths
+       (list (search-path-specification
+	      (variable "WM_PROJECT_DIR")
+	      (files `(,install-path)))
+             ;; add PV_PLUGIN_PATH to LD_LIBRARY_PATH so paraview
+             ;; finds the OpenFOAM PV plugins
+             (search-path-specification
+	      (variable "LD_LIBRARY_PATH")
+	      (files `(,pv-plugin-path)))))
+      (inputs (list boost
+		    cgal
+		    git
+		    gmp
+		    libxt
+		    metis
+		    mpfr
+		    ncurses
+		    openmpi
+		    openssh
+		    paraview
+		    pt-scotch32
+		    readline
+		    scotch
+		    zlib))
+      (native-inputs (list bison
+		           flex
+		           ;; paraview plugin dependencies
+		           cli11
+		           cmake-minimal
+		           cgns
+		           curl
+		           double-conversion
+		           eigen
+		           expat
+		           ffmpeg
+		           fmt
+		           freetype
+		           gdal
+		           gl2ps
+		           glew
+		           gmsh
+		           hdf5
+		           jsoncpp
+		           libjpeg-turbo
+		           libogg
+		           libpng
+		           libharu
+		           libtheora
+		           libtiff
+		           libx11
+		           libxml2
+		           lz4
+		           netcdf
+		           nlohmann-json
+		           proj
+		           protobuf
+		           pugixml
+		           python
+		           python-mpi4py
+		           qtbase-5
+		           qtsvg-5
+		           qttools-5
+		           qtwebengine-5
+		           qtxmlpatterns
+		           utfcpp
+		           vtk
+		           xz))
+      (propagated-inputs (list gnuplot))
+      (outputs '("debug" ;~60MB
+	         "out"))
+      (arguments
+       (list
+        ;; 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"))
+
+        #:modules
+        '((ice-9 ftw)
+          (ice-9 regex)
+          (ice-9 string-fun)
+          (srfi srfi-1)
+          (guix build gnu-build-system)
+          (guix build utils))
+
+        #:phases
+        #~(modify-phases %standard-phases
+	    (add-before 'build 'patch-HOME-path
+	      (lambda _
+	        (setenv "HOME" "/tmp") #t))
+	    (add-before 'build 'patch-scotch
+	      (lambda _
+	        (substitute* "etc/config.sh/scotch"
+	          (("^export SCOTCH_VERSION=scotch_.*$")
+	           (string-append "export SCOTCH_VERSION=scotch_"
+			          #$(package-version pt-scotch32) "\n"))
+	          (("^export SCOTCH_ARCH_PATH=.*$")
+	           (string-append "export SCOTCH_ARCH_PATH=" #$pt-scotch32 "\n")))
+	        #t))
+	    (add-before 'build 'patch-mpi
+	      (lambda _
+	        (let* ((mpi-version #$(package-version openmpi)))
+	          ;; specify openmpi type
+	          (substitute* "etc/bashrc"
+		    (("WM_MPLIB=SYSTEMOPENMPI")
+		     "WM_MPLIB=OPENMPI"))
+	          (substitute* "etc/config.sh/mpi"
+		    (("export FOAM_MPI=openmpi-.*$")
+		     (string-append "export FOAM_MPI=openmpi-"
+				    mpi-version "\n"))
+		    (("export MPI_ARCH_PATH=.*\\$FOAM_MPI.*$")
+		     (string-append "export MPI_ARCH_PATH=" #$openmpi "\n"))))
+	        #t))
+	    (add-before 'build 'patch-paraview
+	      (lambda _
+	        (substitute* "etc/config.sh/paraview"
+	          (("^export ParaView_VERSION=.*$")
+	           (string-append "export ParaView_VERSION="
+			          #$(package-version paraview) "\n"))
+	          (("^export ParaView_DIR=.*$")
+	           (string-append "export ParaView_DIR=" #$paraview "\n"))
+                  (("export ParaView_GL=mesa") "export ParaView_GL=system"))
+	        #t))
+	    (add-before 'build 'add-rpaths
+	      (lambda _
+	        (letrec* ((libraries '("boost"
+				       "cgal"
+				       "gmp"
+				       "metis"
+				       "mpfr"
+				       "scotch"
+				       "pt-scotch32"
+ 				       "openmpi"
+				       "zlib"
+				       "paraview"))
+		          (rpaths
+		           (fold-right (lambda (lib rpaths)
+				         (string-append rpaths
+						        "-rpath="
+						        (assoc-ref %build-inputs lib)
+						        "/lib,")) "" libraries))
+		          (openfoam-lib
+		           (string-append #$output
+				          "/share/OpenFOAM-" #$version
+				          "/platforms/linux64GccDPInt32Opt/lib"))
+		          (ldflags
+		           (string-append "-Wl,"
+				          rpaths
+				          "-rpath="
+				          openfoam-lib
+				          ","
+				          "-rpath="
+				          openfoam-lib
+				          "/dummy,"
+				          "-rpath="
+				          openfoam-lib
+				          "/paraview-"
+				          #$(version-major+minor (package-version
+							          paraview)))))
+	          (substitute* "wmake/rules/linux64Gcc/c++"
+		    (("\\$\\(LIB_HEADER_DIRS\\) -fPIC" all)
+		     (string-append all " " ldflags)))) #t))
+	    (add-before 'build 'add-vtk-include-path
+	      (lambda _
+	        (let* ((vtk-version #$(version-major+minor
+				       (package-version vtk)))
+		       (vtk-inc (string-append #$vtk "/include/vtk-" vtk-version))
+		       (vtk-inc-flag (string-append "-I" vtk-inc)))
+	          (substitute* "wmake/rules/linux64Gcc/c++"
+		    (("\\$\\(LIB_HEADER_DIRS\\)" all)
+		     (string-append all " " vtk-inc-flag " "))))
+	        #t))
+	    (delete 'configure) ;no configure phase
+	    (replace 'build
+	      (lambda _
+	        ;; compile OpenFOAM libraries and applications
+	        (invoke "bash" "-c"
+		        (format #f
+			        "source ./etc/bashrc && ./Allwmake -j~a"
+			        (parallel-job-count)))))
+	    (add-after 'build 'cleanup
+	      ;; Avoid unnecessary, voluminous object and dep files.
+	      (lambda _
+	        (when (file-exists? "platforms/linux64GccDPInt32Opt/src")
+	          (delete-file-recursively
+	           "platforms/linux64GccDPInt32Opt/src"))
+	        (when (file-exists?
+		       "platforms/linux64GccDPInt32OptOPENMPI")
+	          (delete-file-recursively
+	           "platforms/linux64GccDPInt32OptOPENMPI"))
+	        (for-each delete-file
+		          (find-files "." "\\.o$"))
+                ;; Remove spurious files in src tree
+                (invoke "bash" "-c" "source ./etc/bashrc && wclean all")
+                #t))
+	    (replace 'check
+	      (lambda* (#:key tests? #:allow-other-keys)
+	        (when tests?
+	          (when (file-exists? "test")
+		    (with-directory-excursion "test"
+		      (invoke "bash" "-c"
+			      (format #f
+				      "source ../etc/bashrc && ./Allrun -j~a"
+				      (parallel-job-count)))
+                      ;; cleanup
+                      (invoke "bash" "-c"
+			      "source ../etc/bashrc && ./Allclean")))
+	          ;; too many tutorials are failing
+	          ;; (with-directory-excursion "tutorials"
+	          ;; (invoke "bash" "-c" "source ../etc/bashrc && ./Alltest"))
+	          ) #t))
+	    (add-before 'install 'set-paths
+	      (lambda _
+	        (let ((install-path (string-append #$output
+					           "/share/OpenFOAM-" #$version)))
+	          (substitute* "etc/bashrc"
+		    (("^\\[ \"\\$BASH\".*$") "")
+		    (("^export FOAM_INST_DIR=\\$\\(cd.*$")
+		     (string-append "export FOAM_INST_DIR=" install-path "\n"))
+		    (("^export FOAM_INST_DIR=\\$HOME.*$") "")))
+	        #t))
+	    (replace 'install
+	      (lambda* (#:key outputs inputs #:allow-other-keys)
+	        (let ((install-path (string-append #$output
+					           "/share/OpenFOAM-" #$version)))
+	          (mkdir-p install-path) ;create install directory
+	          ;; move contents of build directory to install directory
+	          (copy-recursively "." install-path))))
+	    (add-after 'install 'add-symbolic-link
+	      (lambda _
+	        (let* ((bin (string-append #$output "/bin"))
+		       (lib (string-append #$output "/lib"))
+		       (openfoam (string-append #$output
+					        "/share/OpenFOAM-" #$version))
+		       (build-bin (string-append openfoam
+					         "/platforms/linux64GccDPInt32Opt/bin"))
+		       (build-lib (string-append openfoam
+					         "/platforms/linux64GccDPInt32Opt/lib"))
+		       (foam-bin (string-append openfoam "/bin")))
+	          ;; add symbolic links in standard 'bin' directory
+	          (mkdir-p bin)
+	          (for-each (lambda (file)
+			      (unless (member file
+					      '("." ".."))
+			        (symlink (string-append build-bin "/"
+						        file)
+				         (string-append bin "/" file))))
+			    (scandir build-bin))
+	          (for-each (lambda (file)
+			      (unless (member file
+					      '("." ".."))
+			        (symlink (string-append foam-bin "/"
+						        file)
+				         (string-append bin "/" file))))
+			    (scandir foam-bin))
+	          ;; add symbolic link for standard 'lib' directory
+	          (symlink build-lib lib)) #t)))))
+      ;; 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 $WM_PROJECT_DIR/etc/bashrc
+      ;; $ mkdir -p $FOAM_RUN
+      ;; $ cd $FOAM_RUN
+      ;; $ cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily .
+      ;; $ cd pitzDaily
+      ;; $ chmod -R u+w .
+      ;; $ blockMesh
+      (synopsis synopsis)
+      (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++.  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.  Large problems may be split into smaller, connected
+problems for efficient solution on parallel systems.")
+      (license license:gpl3+)
+      (home-page home-page))))
+
 (define-public open-simulation-interface
   (package
     (name "open-simulation-interface")
-- 
2.41.0