Skip to content

Instantly share code, notes, and snippets.

@cvr
Last active August 2, 2023 05:31
Show Gist options
  • Save cvr/3d72be0c42d27f3fe0c904482d07bb47 to your computer and use it in GitHub Desktop.
Save cvr/3d72be0c42d27f3fe0c904482d07bb47 to your computer and use it in GitHub Desktop.
System-wide installation of OpenFOAM 8 and related tools

Installation of OpenFOAM 8

Useful links

  1. openfoamwiki.net/index.php/Installation/Linux/OpenFOAM-8
  2. openfoamwiki.net/index.php/Installation/Linux/OpenFOAM-8/Ubuntu
  3. openfoam.org/download/source/compiling-openfoam

Packages for Debian systems

Several packages are required by the installation. Most of them should already exist in a standard installation but, for example, rpm does not.

sudo apt install git-core build-essential cmake curl
sudo apt install mpi-default-bin mpi-default-dev openmpi-bin libopenmpi-dev
sudo apt install qt5-default qttools5-dev libqt5x11extras5-dev 
sudo apt install gawk flex bison gnuplot libreadline-dev libncurses-dev \
    libboost-dev libboost-system-dev libboost-thread-dev zlib1g-dev libxt-dev
sudo apt install libcgal-dev libscotch-dev libptscotch-dev

sudo apt install python python-dev python3 python3-dev
sudo apt install paraview libvtk6-dev 
sudo apt install binutils-dev libiberty-dev graphviz
sudo apt install time

## Optional
sudo apt install python3-mshr python3-pygalmesh python-vtk6
sudo apt install libqt5webkit5-dev libqt5opengl5-dev python-qtpy

Preparation

First one must define the OpenFOAM root folder where the installation will be performed. This path will be stored in shell variable OFDIR. Note that the user must have write permissions to that directory.

The following commands will create a root folder for OpenFOAM in /opt/OpenFOAM and will change its ownership to that of the user performing the installation (which may be changed after OpenFOAM is installed).

OFDIR=/opt/OpenFOAM

sudo mkdir -p $OFDIR
sudo chown -R $USER:$(id -gn $USER) $OFDIR

Download the OpenFOAM source code

cd $OFDIR

git clone https://github.com/OpenFOAM/OpenFOAM-8.git OpenFOAM-8
cd OpenFOAM-8
git log --decorate --graph > README_gitlog.md
OFVersionDate=$(git log -1 --format="%at" | xargs -I{} date -d @{} +%Y%m%d)
echo $OFVersionDate > README_gitversion.md
cd -

git clone https://github.com/OpenFOAM/ThirdParty-8.git ThirdParty-8
cd ThirdParty-8
git log --decorate --graph > README_gitlog.md
TPVersionDate=$(git log -1 --format="%at" | xargs -I{} date -d @{} +%Y%m%d)
echo $TPVersionDate > README_gitversion.md
cd -

Change installation path in etc/bashrc. Comment lines with FOAM_INST_DIR= and add FOAM_INST_DIR=/opt/$WM_PROJECT:

cd $OFDIR
sed \
  -e 's/^[[:space:]]*\(export FOAM_INST_DIR=\)/#\t\1/g' \
  -e '0,/^#[[:space:]]*export FOAM_INST_DIR=.*/ s/^#\([[:space:]]*export FOAM_INST_DIR=\)/\1/' \
  -e '0,/^#[[:space:]]*export FOAM_INST_DIR=.*/ s/^#\([[:space:]]*export FOAM_INST_DIR=\)/\1\/opt\/\$WM_PROJECT\n&/' \
  -e '/^if .*WM_PROJECT_DIR/,/^fi/ s/^\(.*\)/#\1/' \
  -e '/^if .*WM_THIRD_PARTY_DIR/,/^fi/ s/^\(.*\)/#\1/' \
  -i.bak $OFDIR/OpenFOAM-8/etc/bashrc

source ${OFDIR}/OpenFOAM-8/etc/bashrc

Check installation paths, namely:

  • FOAM_INST_DIR should point to $OFDIR
  • WM_PROJECT_INST_DIR should point to $OFDIR
  • WM_PROJECT_DIR should point to $OFDIR/OpenFOAM-8
  • WM_THIRD_PARTY_DIR should point to $OFDIR/ThirdParty-8
alias foam
echo $FOAM_INST_DIR
echo $WM_PROJECT_INST_DIR
echo $WM_PROJECT_DIR
echo $WM_THIRD_PARTY_DIR

Edit installation settings in etc/prefs.sh

Start with the example file prefs.sh which is part of OpenFOAM.

cp $WM_PROJECT_DIR/etc/config.sh/example/prefs.sh $WM_PROJECT_DIR/etc/

Optional settings that are recommended

Optional: use system compiler

echo "export WM_COMPILER_DIR=$(dirname $(dirname $(which gcc)))" >> $WM_PROJECT_DIR/etc/prefs.sh

Optional: use system OpenMPI

echo "export WM_MPLIB=SYSTEMOPENMPI" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export OPENMPI_DIR=$(dirname $(dirname $(which mpicc)))" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export OPENMPI_BIN_DIR=$(dirname $(which mpicc))" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export OPENMPI_LIB_DIR=\"\$(\$OPENMPI_BIN_DIR/mpicc --showme:libdirs)\"" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export OPENMPI_INCLUDE_DIR=\"\$(\$OPENMPI_BIN_DIR/mpicc --showme:incdirs)\"" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export OPENMPI_COMPILE_FLAGS=\"\$(\$OPENMPI_BIN_DIR/mpicc --showme:compile)\"" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export OPENMPI_LINK_FLAGS=\"\$(\$OPENMPI_BIN_DIR/mpicc --showme:link)\"" >> $WM_PROJECT_DIR/etc/prefs.sh

Optional: FOAMY HEX MESH

echo "export FOAMY_HEX_MESH=yes" >> $WM_PROJECT_DIR/etc/prefs.sh

Optional: use system-installed paraview (much faster installation):

echo "export PARAVIEW_SYSTEM=1" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export PARAVIEW_DIR=$(dirname $(dirname $(which paraview)))" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export PARAVIEW_BIN_DIR=$(dirname $(which paraview))" >> $WM_PROJECT_DIR/etc/prefs.sh

Optional: set environmental variable for Qt to compile ParaView (one may add these even if the ParaView used is the one from the system)

echo "export QT_SELECT=qt5" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export QT_DIR=$(dirname $(dirname $(which qmake)))" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export QT_BIN_DIR=$(dirname $(which qmake))" >> $WM_PROJECT_DIR/etc/prefs.sh

Optional: use system Python installation

echo "export PYTHON_SYSTEM=1" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export PYTHON_DIR=$(dirname $(dirname $(which python)))" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export PYTHON_BIN_DIR=$(dirname $(which python))" >> $WM_PROJECT_DIR/etc/prefs.sh

Optional: set python includes and libraries for swak4foam

echo "export SWAK_PYTHON2_INCLUDE=\"\$(python-config --cflags)\"" >> $WM_PROJECT_DIR/etc/prefs.sh
echo "export SWAK_PYTHON2_LINK=\"\$(python-config --ldflags)\"" >> $WM_PROJECT_DIR/etc/prefs.sh

Optional settings that are not recommended

Optional: 64-bit integer support to allow for 9E+18 cells instead of 2E+9

echo "export WM_LABEL_SIZE=64" >> $WM_PROJECT_DIR/etc/prefs.sh

Optional: set environment to compile Cuda solvers

export CUDA_ARCH=sm_30
echo "export CUDA_ARCH=sm_30" >> $WM_PROJECT_DIR/etc/prefs.sh

Environmental variables script

unalias of8

cat <<EOF > $OFDIR/of8_envars.sh
#!/bin/bash
#
# openfoamwiki.net/index.php/Installation/Working_with_the_Shell
# openfoamwiki.net/index.php/Installation/Linux/OpenFOAM-8
# openfoamwiki.net/index.php/Installation/Linux/OpenFOAM-8/Ubuntu
#

OFDIR=$(echo $OFDIR)

[ -v BASH_ALIASES[of8] ] && unalias of8

function of8 {
  . \$OFDIR/OpenFOAM-8/etc/bashrc
  export FOAM_USER_SRC=\$WM_PROJECT_USER_DIR/src
}

of8

echo -e "
OpenFOAM environment variables
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OFDIR               = \$OFDIR
WM_PROJECT_INST_DIR = \$WM_PROJECT_INST_DIR
WM_PROJECT_DIR      = \$WM_PROJECT_DIR
WM_THIRD_PARTY_DIR  = \$WM_THIRD_PARTY_DIR
FOAM_TUTORIALS      = \$FOAM_TUTORIALS
FOAM_USER_APPBIN    = \$FOAM_USER_APPBIN 
FOAM_USER_LIBBIN    = \$FOAM_USER_LIBBIN 
FOAM_USER_SRC       = \$FOAM_USER_SRC
FOAM_RUN            = \$FOAM_RUN

OpenFOAM aliases
~~~~~~~~~~~~~~~~
\$(type of8)
\$(alias foam)
\$(alias run)
\$(alias app)
\$(alias sol)
\$(alias tut)
\$(alias util)
"

EOF

Make of8_envars.sh script executable and source it.

chmod +x $OFDIR/of8_envars.sh

. $OFDIR/of8_envars.sh

Start installation

build ThirdParty software

. $OFDIR/of8_envars.sh
cd $WM_THIRD_PARTY_DIR

./Allwmake 2>&1 | tee -a log.Allwmake1

grep --color=auto -i error $WM_THIRD_PARTY_DIR/log.Allwmake1

Optional and recommended: compile metis

. $OFDIR/of8_envars.sh
wmRefresh

cd $WM_THIRD_PARTY_DIR

wget http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/metis-5.1.0.tar.gz
tar -xvf metis-5.1.0.tar.gz

./Allwmake 2>&1 | tee -a log.Allwmake2

Build OpenFOAM

This assumes the computer has 4 cores available, thus the compilation is made using those cores (through the -j4 option). Though the compilation commands work with any number of cores, it is more efficient to request a number not higher than the available cores in the machine.

. $OFDIR/of8_envars.sh
wmRefresh
cd $WM_PROJECT_DIR

./Allwmake -j2 2>&1 | tee -a log.Allwmake1

./Allwmake 2>&1 | tee -a log.Allwmake2

Compilation errors may be checked with

grep --color=auto -i error $WM_PROJECT_DIR/log.Allwmake2

Optional: build libccmio (required for conversion of STAR-CCM+ meshes)

. $OFDIR/of8_envars.sh
wmRefresh

cd $WM_THIRD_PARTY_DIR
#wget https://portal.nersc.gov/svn/visit/trunk/third_party/libccmio-2.6.1.tar.gz -O libccmio-2.6.1.tar.gz
wget http://downloads.sourceforge.net/project/foam-extend/ThirdParty/libccmio-2.6.1.tar.gz -O libccmio-2.6.1.tar.gz
tar -xvf libccmio-2.6.1.tar.gz
./AllwmakeLibccmio 2>&1 | tee -a log.AllwmakeLibccmio1
wmRefresh

cd $WM_PROJECT_DIR
./Allwmake 2>&1 | tee -a log.Allwmake3

Compilation errors may be checked with

grep --color=auto -i error $WM_PROJECT_DIR/log.Allwmake3

ParaView

If not building ParaView (recommended)

The following commands will add the necessary functions to the of8_envars.sh environmental variables script, in order to use OpenFOAM with the system-installed ParaView.

cat <<EOF >> $OFDIR/of8_envars.sh
## ParaView: use system version
alias paraFoam="paraFoam -builtin"

function paraFoamGenCaseFile {
    caseFile="\$(basename \$(pwd)).foam"
    touch \$caseFile
    #paraview \$caseFile
    }

echo -e "
paraFoam using system-installed paraview
~~~~~~~~~
\$(alias paraFoam)
"

EOF

Optional: Build ParaView

Assuming the machine has 4 cores (option -j4).

. $OFDIR/of8_envars.sh
wmRefresh

cd $WM_THIRD_PARTY_DIR
./makeParaView -python -mpi -python-lib /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 2>&1 | tee -a log.makeParaView1

cd $WM_PROJECT_DIR
./Allwmake -j4 2>&1 | tee -a log.Allwmake4

cd $FOAM_UTILITIES/postProcessing/graphics/PVReaders
./Allwclean
./Allwmake 2>&1 | tee -a log.Allwmake1

Compilation errors may be checked with

grep --color=auto -i error $WM_PROJECT_DIR/log.Allwmake4
grep --color=auto -i error $FOAM_UTILITIES/postProcessing/graphics/PVReaders/log.Allwmake1

Install swak4foam with OpenFOAM-8

WARNING: Errors are expected while compiling, e.g., swak4Foam-0.4.0/Libraries/swakStateMachine/PluginFunctions/isStateFunctionPlugin.C due to a missing dependency FaFieldValueExpressionDriver.H. This is easily solved by recompiling swak4foam.

First load the OpenFOAM environmental variables by sourcing of8_envars.sh and assure mercurial software management tool is installed, as this is required to obtain the latest version of swak4foam:

. $OFDIR/of8_envars.sh

sudo apt-get install mercurial

After, download swak4foam into the third-party software path

cd $WM_THIRD_PARTY_DIR/

hg clone http://hg.code.sf.net/p/openfoam-extend/swak4Foam -u develop
cd swak4Foam
hg log --graph --branch . > README_hglog.md
SFVersionDate=$(hg log --limit 1 --branch . --template "{date|hgdate}" | cut -d" " -f 1 | xargs -I{} date -d @{} +%Y%m%d)
echo $SFVersionDate > README_hgversion.md
#rm -rf .hg*
cd -
#mv swak4Foam "swak4Foam-dev-${SFVersionDate}"
#ln -sf "swak4Foam-dev-${SFVersionDate}" swak4Foam

Set python includes and libraries for swak4foam

echo "# swak4Foam configuration" > $WM_THIRD_PARTY_DIR/swak4Foam/swakConfiguration

echo "export SWAK_PYTHON2_INCLUDE=\"$(python-config --cflags)\"" >> $WM_THIRD_PARTY_DIR/swak4Foam/swakConfiguration
echo "export SWAK_PYTHON2_LINK=\"$(python-config --ldflags)\"" >> $WM_THIRD_PARTY_DIR/swak4Foam/swakConfiguration
echo "export SWAK_USER_PLUGINS=\$WM_THIRD_PARTY_DIR/swak4Foam/Examples/UserPlugins/swakTestFunctionPlugins" >> $WM_THIRD_PARTY_DIR/swak4Foam/swakConfiguration

Compile swak4foam and recompile OpenFOAM

cd swak4Foam
./maintainanceScripts/compileRequirements.sh

export PATH=$WM_THIRD_PARTY_DIR/swak4Foam/privateRequirements/bin:$PATH

./Allwmake 2>&1 | tee -a log.Allwmake1
./Allwmake 2>&1 | tee -a log.Allwmake2

cd $WM_PROJECT_DIR
./Allwmake 2>&1 | tee -a log.Allwmake4

Compilation errors may be checked with

grep --color=auto -i error $WM_PROJECT_DIR/log.Allwmake4
grep --color=auto -i error $WM_THIRD_PARTY_DIR/swak4Foam/log.Allwmake2

Add swak4foam functionalities to environmental variables script

cat <<EOF >> $OFDIR/of8_envars.sh
## Swak4Foam
SWAK4FOAM_SRC=\$WM_THIRD_PARTY_DIR/swak4Foam/Libraries
export SWAK4FOAM_SRC
echo -e "
Swak4Foam
~~~~~~~~~
SWAK4FOAM_SRC       = \$SWAK4FOAM_SRC
"

EOF

Install pyFoam with OpenFOAM-8

For details check:

. $OFDIR/of8_envars.sh

cd $WM_THIRD_PARTY_DIR/

#PYFOAM_VERSION=0.6.11
PYFOAM_VERSION=2020.05

hg clone http://hg.code.sf.net/p/openfoam-extend/PyFoam PyFoam
cd PyFoam
hg archive -t tbz2 -r v${PYFOAM_VERSION} ../PyFoam-${PYFOAM_VERSION}.tar.bz2
cd -
rm -rf PyFoam

tar -xvf PyFoam-${PYFOAM_VERSION}.tar.bz2
ln -sf "PyFoam-${PYFOAM_VERSION}" PyFoam

export PYFOAM_DIR=$WM_THIRD_PARTY_DIR/PyFoam

if [ -z $PYTHONPATH ]; then
    export PYTHONPATH=$PYFOAM_DIR/lib/python2.7/site-packages
else
    export PYTHONPATH=$PYFOAM_DIR/lib/python2.7/site-packages:$PYTHONPATH
fi

mkdir -p $PYFOAM_DIR/lib/python2.7/site-packages

cd $PYFOAM_DIR

python setup.py install --prefix=$PYFOAM_DIR

Add PyFoam functionalities to environmental variables script

cat <<EOF >> $OFDIR/of8_envars.sh
## PyFoam
export PYFOAM_DIR=\$WM_THIRD_PARTY_DIR/PyFoam
function PF {
  export PATH=\$PYFOAM_DIR/bin:\$PATH
  export PYTHONPATH=\$PYFOAM_DIR/lib/python2.7/site-packages:\$PYTHONPATH
  export PYTHONPATH=\$PYTHONPATH:\$(dirname \$(find /usr/lib -name "vtkCommonCorePython*.so") | xargs | sed -e 's/  */:/g')
  export PYTHONPATH=\$PYTHONPATH:\$(python -c "import sys; print(':'.join(sys.path))")
  }
PF

echo -e "
pyFoam installation
~~~~~~~~~~~~~~~~~~~
PYFOAM_DIR         = \$PYFOAM_DIR
\$(which pyFoamVersion.py)
"

EOF

Finish PyFoam installation

. $OFDIR/of8_envars.sh

cd $FOAM_INST_DIR

pyFoamVersion.py

Test installation

OpenFOAM has several executables which are not needed for general use of a Linux system. Hence, before starting any OpenFOAM calculation, the installation may be activated by sourcing the of8_envars.sh script,

. /opt/OpenFOAM/of8_envars.sh

which loads the several environmental variables required to run OpenFOAM and its tools.

First certify that the several user areas are created:

mkdir -p $FOAM_RUN
mkdir -p $FOAM_USER_APPBIN
mkdir -p $FOAM_USER_LIBBIN
mkdir -p $FOAM_USER_SRC

Afterwards perform simple checks:

foamInfo simpleFoam
foamInfo

Test with the pitzDaily tutorial

Commands to run the pitzDaily tutorial in your personal user OpenFOAM folder:

. /opt/OpenFOAM/of8_envars.sh

run
cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily ./
cd pitzDaily
blockMesh 
simpleFoam 
paraFoam
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment