# OpenFOAM OpenFOAM is a free, open source CFD software package. ## Introduction [OpenFOAM][a] is a free, open source CFD software package developed by [OpenCFD Ltd][b] at [ESI Group][c] and distributed by the [OpenFOAM Foundation][d]. It has a large user base across most areas of engineering and science from both commercial and academic organizations. ### Installed Version Currently, several versions are available compiled by GCC/ICC compilers in single/double precision with several versions of OpenMPI. The naming convention of the installed versions is: `openfoam/<VERSION>-<COMPILER>-<openmpiVERSION>-<PRECISION>` * `VERSION` - version of openfoam * `COMPILER` - version of used compiler * `openmpiVERSION` - version of used openmpi/impi * `PRECISION` - DP/SP – double/single precision Example of the available OpenFOAM modules syntax is `openfoam/2.2.1-icc-openmpi1.6.5-DP` This means OpenFOAM version 2.2.1 compiled by the ICC compiler with openmpi1.6.5 in double precision. ### Available OpenFOAM Modules To check the available modules, use: ```console $ ml av ``` In /opt/modules/modulefiles/engineering, you can see the installed engineering softwares: ```console ------------------------------------ /opt/modules/modulefiles/engineering ------------------------------------------------------------- ansys/14.5.x matlab/R2013a-COM openfoam/2.2.1-icc-impi4.1.1.036-DP comsol/43b-COM matlab/R2013a-EDU openfoam/2.2.1-icc-openmpi1.6.5-DP comsol/43b-EDU openfoam/2.2.1-gcc481-openmpi1.6.5-DP paraview/4.0.1-gcc481-bullxmpi1.2.4.1-osmesa10.0 lsdyna/7.x.x openfoam/2.2.1-gcc481-openmpi1.6.5-SP ``` For information on how to use modules, look [here][1]. ## Getting Started To create OpenFOAM environment on Anselm, use the commands: ```console $ ml openfoam/2.2.1-icc-openmpi1.6.5-DP $ source $FOAM_BASHRC ``` !!! note Load the correct module with your requirements “compiler - GCC/ICC, precision - DP/SP”. Create a project directory within the $HOME/OpenFOAM directory named `<USER>-<OFversion>` and create a directory named `run` within it: ```console $ mkdir -p $FOAM_RUN ``` The project directory is now available by typing: ```console $ cd /home/<USER>/OpenFOAM/<USER>-<OFversion>/run ``` `<OFversion>` - for example `2.2.1` or ```console $ cd $FOAM_RUN ``` Copy the tutorial examples directory in the OpenFOAM distribution to the run directory: ```console $ cp -r $FOAM_TUTORIALS $FOAM_RUN ``` Now you can run the first case, for example incompressible laminar flow in a cavity. ## Running Serial Applications Create a test.sh Bash script: ```bash #!/bin/bash ml openfoam/2.2.1-icc-openmpi1.6.5-DP source $FOAM_BASHRC # source to run functions . $WM_PROJECT_DIR/bin/tools/RunFunctions cd $FOAM_RUN/tutorials/incompressible/icoFoam/cavity runApplication blockMesh runApplication icoFoam ``` Job submission (example for Anselm): ```console $ qsub -A OPEN-0-0 -q qprod -l select=1:ncpus=16,walltime=03:00:00 test.sh ``` For information about job submission, look [here][2]. ## Running Applications in Parallel Run the second case, for example external incompressible turbulent flow - case - motorBike. First we must run the serial application bockMesh and decomposePar for preparation of parallel computation. !!! note Create a test.sh Bash scrip: ```bash #!/bin/bash ml openfoam/2.2.1-icc-openmpi1.6.5-DP source $FOAM_BASHRC # source to run functions . $WM_PROJECT_DIR/bin/tools/RunFunctions cd $FOAM_RUN/tutorials/incompressible/simpleFoam/motorBike runApplication blockMesh runApplication decomposePar ``` Job submission ```console $ qsub -A OPEN-0-0 -q qprod -l select=1:ncpus=16,walltime=03:00:00 test.sh ``` This job creates a simple block mesh and domain decomposition. Check your decomposition and submit parallel computation: !!! note Create a testParallel.pbs PBS script: ```bash #!/bin/bash #PBS -N motorBike #PBS -l select=2:ncpus=16 #PBS -l walltime=01:00:00 #PBS -q qprod #PBS -A OPEN-0-0 ml openfoam/2.2.1-icc-openmpi1.6.5-DP source $FOAM_BASHRC cd $FOAM_RUN/tutorials/incompressible/simpleFoam/motorBike nproc = 32 mpirun -hostfile ${PBS_NODEFILE} -np $nproc snappyHexMesh -overwrite -parallel | tee snappyHexMesh.log mpirun -hostfile ${PBS_NODEFILE} -np $nproc potentialFoam -noFunctionObject-writep -parallel | tee potentialFoam.log mpirun -hostfile ${PBS_NODEFILE} -np $nproc simpleFoam -parallel | tee simpleFoam.log ``` `nproc` – the number of subdomains Job submission ```console $ qsub testParallel.pbs ``` ## Compile Your Own Solver Initialize the OpenFOAM environment before compiling your solver: ```console $ ml openfoam/2.2.1-icc-openmpi1.6.5-DP $ source $FOAM_BASHRC $ cd $FOAM_RUN/ ``` Create the applications/solvers directory in the user directory: ```console $ mkdir -p applications/solvers $ cd applications/solvers ``` Copy icoFoam solver’s source files: ```console $ cp -r $FOAM_SOLVERS/incompressible/icoFoam/ My_icoFoam $ cd My_icoFoam ``` Rename icoFoam.C to My_icoFOAM.C: ```console $ mv icoFoam.C My_icoFoam.C ``` Edit the _files_ file in the _Make_ directory: ```bash icoFoam.C EXE = $(FOAM_APPBIN)/icoFoam ``` and change to: ```bash My_icoFoam.C EXE = $(FOAM_USER_APPBIN)/My_icoFoam ``` In the My_icoFoam directory, use the compilation command: ```console $ wmake ``` [1]: ../../environment-and-modules.md [2]: ../../general/job-submission-and-execution.md [a]: http://www.openfoam.com/ [b]: http://www.openfoam.com/about [c]: http://www.esi-group.com/ [d]: http://www.openfoam.org/