endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Introductory OpenFOAM Course University of Genoa, DICCA Dipartimento di Ingegneria Civile, Chimica e Ambientale From 17 th to 21 th February, 2014 Your Lecturer Joel GUERRERO
[email protected] Todays lecture 1. Running in parallel 2. Running in a cluster using a job scheduler 3. Running with a GPU 4. Hands-on session This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Todays lecture 1. Running in parallel 2. Running in a cluster using a job scheduler 3. Running with a GPU 4. Hands-on session
This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel The method of parallel computing used by OpenFOAM is known as domain decomposition, in which the geometry and associated fields are broken into pieces and distributed among different processors. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Shared memory architectures Workstations and portable computers Distributed memory architectures Cluster and super computers Running in parallel Some facts about running OpenFOAM in parallel: Applications generally do not require parallel-specific coding. The parallel programming implementation is hidden from the user. Most of the applications and utilities run in parallel. If you write a new solver, it will be in parallel (most of the times). I have been able to run in parallel up to 4096 processors. I have been able to run OpenFOAM using single GPU and multiple GPUs. Do not ask me about scalability, that is problem/hardware specific. If you want to learn more about MPI and GPU programming, do not look in my direction. Did I forget to mention that OpenFOAM is free. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel To run OpenFOAM in parallel you will need to: Decompose the domain. To do so we use the decomposePar utility. You also will need a dictionary named decomposeParDict which is located in the system directory of the case. Distribute the jobs among the processors or computing nodes. To do so, OpenFOAM uses the public domain OpenMPI implementation of the standard message passing interface (MPI). By using MPI, each processor runs a copy of the solver on a separate part of the decomposed domain. Finally, the solution is reconstructed to obtain the final result. This is done by using the reconstrucPar utility. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel Domain Decomposition
The mesh and fields are decomposed using the decomposePar utility. The main goal is to break up the domain with minimal effort but in such a way to guarantee a fairly economic solution. The geometry and fields are broken up according to a set of parameters specified in a dictionary named decomposeParDict that must be located in the system directory of the case. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel Domain Decomposition
In the decomposeParDict file the user must set the number of domains in which the case should be decomposed. Usually it corresponds to the number of cores available for the calculation. numberOfSubdomains NP; where NP is the number of cores/processors. The user has a choice of seven methods of decomposition, specified by the method keyword in the decomposeParDict dictionary. On completion, a set of subdirectories will have been created, one for each processor. The directories are named processorN where N = 0, 1, 2, 3, and so on. Each directory contains the decomposed fields. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel Domain Decomposition Methods
simple: simple geometric decomposition in which the domain is split into pieces by direction. hierarchical: Hierarchical geometric decomposition which is the same as simple except the user specifies the order in which the directional split is done. manual: Manual decomposition, where the user directly specifies the allocation of each cell to a particular processor. multiLevel: similar to hierarchical, but all methods can be used in a nested form. structured: 2d decomposition of a structured mesh (special case) This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel Domain Decomposition Methods
scotch: requires no geometric input from the user and attempts to minimize the number of processor boundaries. Similar to metis but with a more flexible open-source license.
metis: requires no geometric input from the user and attempts to minimize the number of processor boundaries. You will need to install metis as it is not distributed with OpenFOAM. Also, you will need to compile the metisDecomp library. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Please be aware that there are license restrictions using metis. Running in parallel We will now run a case in parallel. From now on follow me. Go to the $ptofc/parallel_tut/rayleigh_taylor directory. In the terminal type: cd $ptofc/parallel_tut/rayleigh_taylor/c1 blockMesh checkMesh cp 0/alpha1.org 0/alpha1 funkySetFields -time 0 (If you do not have this tool, copy the file alpha1.init to alpha1. The file is located in the directory 0) decomposePar mpirun -np 8 interFoam -parallel
Here I am using 8 processors. In your case, use the maximum number of processor available in your laptop, for this you will need to modify the decomposeParDict dictionary located in the system folder. Specifically, you will need to modify the entry numberOfSubdomains, and set its value to the number of processors you want to use. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. By following the instructions, you should get something like this Mesh VOF Fraction Running in parallel We will now run a case in parallel. From now on follow me.
After the simulation is finish, type in the terminal: paraFoam -builtin To directly post-process the decomposed case.
Alternatively, you can reconstruct the case and post-process it: reconstructPar paraFoam To post-process the reconstructed case, it will reconstruct all time-steps saved.
Both of the methods are valid, but the first one does not require to reconstruct the case. More about post-processing in parallel in the next slides. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel We will now run a case in parallel. From now on follow me.
Notice the syntax used to run OpenFOAM in parallel: mpirun -np 8 solver_name -parallel where mpirun is a shell script to use the mpi library, -np is the number of processors you want to use, solver_name is the OpenFOAM solver you want to use, and -parallel is a flag you shall always use if you want to run in parallel. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel Almost all OpenFOAM utilities can be run in parallel. The syntax is as follows: mpirun -np 2 utility -parallel (notice that I am using 2 processors)
This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel When post-processing cases that have been run in parallel the user has three options: Reconstruction of the mesh and field data to recreate the complete domain and fields. reconstructPar paraFoam
This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel Post-processing each decomposed domain individually paraFoam -case processor0 To load all processor directories, the user will need to manually create the file processorN.OpenFOAM (where N is the processor number) in each processor folder and then load each file into paraFoam.
This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel Reading the decomposed case without reconstructing it. For this you will need to: paraFoam -builtin This will use a paraFoam plugin that will let you read a decomposed case or read a reconstructed case. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel Let us post-process each decomposed domain individually. From now on follow me. Go to the $ptofc/parallel_tut/yf17 directory. In the terminal type: cd $ptofc/parallel_tut/yf17 In this directory you will find two directories, namely hierarchical and scotch. Let us decompose both geometries and visualize the partitioning. Let us start with the scotch partitioning method. In the terminal type: cd $ptofc/parallel_tut/yf17/scotch decomposePar
By the way, we do not need to run this case. We just need to decompose it to visualize the partitions. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel Let us post-process each decomposed domain individually. From now on follow me. cd $ptofc/parallel_tut/yf17/scotch decomposePar touch processor0.OpenFOAM touch processor1.OpenFOAM touch processor2.OpenFOAM touch processor3.OpenFOAM cp processor0.OpenFOAM processor0 cp processor1.OpenFOAM processor1 cp processor2.OpenFOAM processor2 cp processor3.OpenFOAM processor3 paraFoam This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. By following the instructions, you should get something like this Mesh partitioning Scotch Method Running in parallel In paraFoam open each *.OpenFOAM file within the processor* directory. By doing like this, we are opening the mesh partition for each processor. Now, choose a different color for each set you just opened, and visualize the partition for each processor. Now do the same with the directory hierarchical, and compare both partitioning methods. If you partitioned the mesh with many processors, creating the files *.OpenFOAM manually can be extremely time consuming, for doing this in an automatic way you can create a small shell script. Also, changing the color for each set in paraFoam can be extremely time consuming, for automate this you can write a python script. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. By following the instructions, you should get something like this Mesh partitioning Hierarchical Method Running in parallel This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. By following the instructions, you should get something like this Mesh partitioning Scotch Method Mesh partitioning Hierarchical Method Running in parallel By the way, if you do not want to post-process each decomposed domain individually, you can use the option cellDist. This option applies for all decomposition methods. In the terminal type:
cd $ptofc/parallel_tut/yf17/scotch_celldist decomposePar -cellDist
The option cellDist will write the cell distribution as a volScalarField for post-processing. The new field will be saved in the file cellDist located in the time directory 0. Then launch paraFoam and post process the case as you usually do. You will need to play with transparency and volume rendering to see the cell distribution among the processors. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in parallel Decomposing big meshes One final word, the utility decomposePar does not run in parallel. So, it is not possible to distribute the mesh among different computing nodes to do the partitioning in parallel. If you need to partition big meshes, you will need a computing node with enough memory to handle the mesh. I have been able to decompose meshes with up to 300.000.000 elements, but I used a computing node with 512 gigs of memory. For example, in a computing node with 16 gigs of memory, it is not possible to decompose a mesh with 30.000.000; you will need to use a computing node with at least 32 gigs of memory.
Same applies for the utility reconstructPar.
This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Todays lecture 1. Running in parallel 2. Running in a cluster using a job scheduler 3. Running with a GPU 4. Hands-on session This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in a cluster using a job scheduler Running OpenFOAM in a cluster is similar to running in a normal workstation with shared memory. The only difference is that you will need to launch your job using a job scheduler. Common job schedulers are: Terascale Open-Source Resource and Queue Manager (TORQUE). Simple Linux Utility for Resource Management (SLURM). Portable Batch System (PBS). Sun Grid Engine (SGE). Maui Cluster Scheduler. BlueGene LoadLeveler (LL). Ask your system administrator the job scheduler installed in your system. Hereafter I will assume that you will run using PBS. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. To launch a job in a cluster with PBS, you will need to write a small shell script where you tell to the job scheduler the resources you want to use and what you want to do. #!/bin/bash # # Simple PBS batch script that reserves 8 nodes and runs a # MPI program on 64 processors (8 processor on each node) # The walltime is 24 hours ! # #PBS -N openfoam_simulation //name of the job #PBS -l nodes=16,walltime=24:00:00 //max execution time #PBS -m abe -M [email protected] //send an email as soon as the job //is launch or terminated
cd PATH_TO_DIRECTORY //go to this directory
#decomposePar //decompose the case, this line //is commented
The green lines are not PBS comments, they are comments inserted in this slide. PBS comments use the number character (#). Running in a cluster using a job scheduler This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in a cluster using a job scheduler To launch your job you need to use the qsub command (part of the PBS job scheduler). The command will send your job to queue. qsub script_name
Remember, running in a cluster is no different from running in your workstation or portable computer. The only difference is that you need to schedule your jobs. Depending on the system current demand of resources, the resources you request and your job priority, sometimes you can be in queue for hours, even days, so be patient and wait for your turn. Remember to always double check your scripts. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in a cluster using a job scheduler Finally, remember to plan how you will use the resources available.
For example, if each computing node has 8 gigs of memory available and 8 cores. You will need to distribute the work load in order not to exceed the maximum resources available per computing node. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running in a cluster using a job scheduler So if you are running a simulation that requires 32 gigs of memory, the following options are valid: Use 4 computing nodes and ask for 32 cores. Each node will use 8 gigs of memory and 8 cores. Use 8 computing nodes and ask for 32 cores. Each node will use 4 gigs of memory and 4 cores. Use 8 computing nodes and ask for 64 cores. Each node will use 4 gigs of memory and 8 cores. But the following options are not valid: Use 2 computing nodes. Each node will need 16 gigs of memory. Use 16 computing nodes and ask for 256 cores. The maximum number of cores for this job is 128. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. NOTE: In this example each computing node has 8 gigs of memory available and 8 cores. Todays lecture 1. Running in parallel 2. Running in a cluster using a job scheduler 3. Running with a GPU 4. Hands-on session This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running with a GPU The official release of OpenFOAM (version 2.2.0), does not support GPU computing. To use your GPU with OpenFOAM, you will need to install an external library. I currently use the cufflink library. There are a few more options available, but I do like this one and is open source. To test OpenFOAM GPU capabilities with cufflink, you will need to install the latest extend version (OpenFOAM-1.6-ext).
This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running with a GPU You can download cufflink from the following link (as for 15/May/2013) : http://code.google.com/p/cufflink-library/ Additionally, you will need to install the following libraries: Cusp: which is a library for sparse linear algebra and graph computations on CUDA. http://code.google.com/p/cusp-library/ Thrust: which is a parallel algorithms library which resembles the C++ Standard Template Library (STL).http://code.google.com/p/thrust/ Latest NVIDIA CUDA library. https://developer.nvidia.com/cuda-downloads This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running with a GPU Cufflink Features Currently only supports the OpenFOAM-extend fork of the OpenFOAM code. Single GPU support. Multi-GPU support via OpenFOAM coarse grained parallelism achieved through domain decomposition (experimental). A conjugate gradient solver based on Cusp for symmetric matrices (e.g. pressure), with a choice of Diagonal Preconditioner, Sparse Approximate Inverse Preconditioner, Algebraic Multigrid (AMG) based on Smoothed Aggregation Preconditioner. A bi-conjugate gradient stabilized solver based on CUSP for asymmetric matrices (e.g. velocity, epsilon, k), with a choice of Diagonal Preconditioner, Sparse Approximate Inverse Preconditioner. Single Precision (sm_10), Double precision (sm_13), and Fermi Architecture (sm_20) supported. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running with a GPU Running cufflink in OpenFOAM-extend project Once the cufflink library has been compiled and in order to use the library in OpenFOAM one needs to include the line libs ("libCufflink.so"); in the controlDict dictionary. In addition, a solver must be chosen in the fvSolution dictionary: p { solver cufflink_CG; preconditioner none; tolerance 1e-10; //relTol 1e-08; maxIter 10000; storage 1; //COO=0 CSR=1 DIA=2 ELL=3 HYB=4 all other numbers use default CSR gpusPerMachine 2; //for multi gpu version on a machine with 2 gpus per machine node AinvType ; dropTolerance ; linStrategy ; } This particular setup uses an un-preconditioned conjugate gradient solver on a single GPU; compressed sparse row (CSR) matrix storage; 1e-8 absolute tolerance and 0 relative tolerance; with a maximum number of inner iterations of 10000. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Running with a GPU The official release of OpenFOAM (version 2.2.0), does not support GPU computing. To use your GPU with OpenFOAM, you will need to install an external library. There is another open source library named paralution. I am currently testing this one. Paralution can be installed in OpenFOAM 2.2.0. For more information about paralution visit the following link: www.paralution.com. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Mesh generation using open source tools Additional tutorials In the directory $ptofc/parallel_tut you will find many tutorials, try to go through each one to understand how to setup a parallel case in OpenFOAM.
This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Thank you for your attention Todays lecture 1. Running in parallel 2. Running in a cluster using a job scheduler 3. Running with a GPU 4. Hands-on session This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks. Hands-on session In the courses directory ($ptofc) you will find many tutorials (which are different from those that come with the OpenFOAM installation), let us try to go through each one to understand and get functional using OpenFOAM. If you have a case of your own, let me know and I will try to do my best to help you to setup your case. But remember, the physics is yours. This offering is not approved or endorsed by OpenCFD Limited, the producer of the OpenFOAM software and owner of the OPENFOAM and OpenCFD trade marks.