CFD

From CUSF Wiki
Revision as of 20:28, 3 January 2022 by NikLebedenko (talk | contribs) (further crash course work)
Jump to navigation Jump to search

This page is currently a work in progress by Nik Lebedenko - if you want to ask questions / see a mistake / request more details to be added to this page, feel free to email me or message me on slack.

Computational Fluid Dynamics (CFD) is the process of solving fluid mechanics equations with the use of computers. Think F=ma, but like... more. (I will elaborate further)

Crash course on the Finite Volume Method (FVM)

This section is incomplete

There are many resources for learning how CFD works properly (hopefully linked below, TODO), but you're not here for that. This section is designed for people who are doing a CFD simulation for just a one-time thing, and they can treat it like a black box that gives them answers (that is how I started). So, here are the bare minimum requirements for understanding roughly what is going on in any CFD solver. Nonetheless, I will assume you know:

  • Some basic high-school physics about gases (e.g. what is pressure, how does it change with temperature)
  • What a partial derivative is,
  • What simultaneous equations are,
  • How to write simultaneous equations as matrices, and
  • What a vector is.

Every CFD solver works by splitting up the region of interest (a process called "meshing" the "domain") into a bunch of small boxes (called the "cells" in the "mesh"), and solving a set of equations in each of those cells, taking into account how the fluid properties (velocity, temperature, pressure) are related between neighbouring cells. Most commonly:

  • The continuity equation: also known as, "mass is not created or destroyed".
  • The momentum equation: also known as, "F=ma", but for fluids.
  • The energy equation: also known as, "energy is not created or destroyed".

To clarify this, consider the example below of a simple two-dimensional pipe, image left. Now, let us "mesh" the "domain" into four "cells" (split the pipe into 4 boxes), image right. The reason we split a domain into cells is because a flow variable (e.g. velocity) could vary continuously along the length of the pipe, meaning you'd need an infinite amount of memory to store it. But we don't have infinite memory, so instead we store the flow variables at each cell centroid (here marked with circles), and approximate the variables as varying linearly between each cell centroid.

Then, let us set the velocity at the start of the pipe to be 5 m/s to the right (called a "boundary condition"). The continuity equation tells us that mass isn't created or destroyed. And if we assume the flow through the pipe is "steady" (i.e. it does not change with time, so all time derivatives are 0), we should get the result that the flow velocity at each of

Fluid-structure interaction (FSI)

IMPORTANT: Although I hope that these instructions will be easily understood by anyone, this is not a beginner's project! If you want a proper introduction to CFD, this is not it. (I am in the process of creating a beginner's guide which will be available soon™)

This technique allows complex interactions between flexible structures and fluid flows. This has been used to predict fin flutter at hypersonic speeds for Griffin 1.

Simulations of this kind are achievable with the combination of the following free open-source software packages:

  • OpenFOAM (website, install on Ubuntu) - a C/C++ library for the solution of fluid mechanics problems formulated with the Finite Volume Method (FVM),
    • Important: there are two main versions of OpenFOAM, provided at OpenFOAM.com and OpenFOAM.org. I have only used the .com version, but everything here should also be possible with the .org version.
  • FEniCS (website, install on Ubuntu) - a Python interface to the DOLFIN C++ library for the solution of solid mechanics problems formulated with the Finite Element Method (FEM), and
  • preCICE (website, install on Ubuntu) - a very powerful library which allows the coupling of arbitrary solvers using human-readable syntax.
    • Note: in order to use OpenFOAM and FEniCS with preCICE, it is also necessary to download their respective adapters. See this page for OpenFOAM and this page for FEniCS from the preCICE website for further information.

Step-by-step instructions

IMPORTANT: Although I include the links to the official websites for Ubuntu installation instructions, I recommend you follow my instructions for installation (unless you are a masochist), since the official instructions contain some mistakes and omissions.

Install Ubuntu

If you are running a Windows machine (Windows 10 or above), I recommend installing Windows Subsystem for Linux (WSL - use WSL1, discussion of WSL2 below) instead of setting up a dual-boot partition.

  • Note: there is a choice between WSL1 and WSL2, with the main difference being that WSL2 has significantly improved read-write speeds compared with WSL1 while staying within the Linux file system, but WSL2 has significantly worse read-write speeds when moving between the Linux and Windows file systems. In practical terms, this means that the Linux-based software (OpenFOAM, FEniCS) will read and write faster, at the expense of Windows-based ParaView installations loading results much slower when post-processing. Since OpenFOAM spends significantly more time solving equations than reading and writing files, and gigabytes of data need to be loaded across file systems for post-processing in Windows, I recommend sticking with WSL1. If you prefer WSL2, you can install ParaView on Ubuntu, installing XMing to view the GUI (see this page and this page for further information)

Install OpenFOAM on Ubuntu

The Ubuntu installation instructions as of 31/12/2021 are summarised below (adapted from this website):

curl -s https://dl.openfoam.com/add-debian-repo.sh | sudo bash
sudo apt-get install openfoam2012-default

Ensure that your ~/.bashrc file has the following line appended (with XXXX replaced with your version number):

source /usr/lib/openfoam/openfoamXXXX/etc/bashrc

Restart your Ubuntu. Now check the installation completed correctly by running a tutorial case:

cd ~
mkdir -p OpenFOAM-sims/tutorials
cp -r $FOAM_TUTORIALS/incompressible OpenFOAM-sims/tutorials
cd OpenFOAM-sims/tutorials/incompressible/icoFoam/cavity/cavity/
blockMesh > log.blockMesh
icoFoam > log.icoFoam

Note: I use OpenFOAMv2012, but later versions should also work.

Install FEniCS on Ubuntu

The Ubuntu installation instructions as of 31/12/2021 are summarised below (adapted from this website):

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:fenics-packages/fenics
sudo apt-get update
sudo apt-get install fenics

Install preCICE on Ubuntu

The Ubuntu installation instructions as of 31/12/2021 are summarised below (adapted from this website):

sudo apt update
sudo apt install build-essential cmake libeigen3-dev libxml2-dev libboost-all-dev petsc-dev python3-dev python3-numpy
cd ~
mkdir FSI
cd FSI

Now either install the Ubuntu package directly with the instructions below (which did not work for me)...

wget https://github.com/precice/precice/releases/download/v2.3.0/libprecice2_2.3.0_focal.deb
sudo apt install ./libprecice2_2.3.0_focal.deb

... or install from source:

tar -xzf v2.3.0.tar.gz
cd precice-2.3.0
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=~/FSI/precice-2.3.0 -DPRECICE_MPICommunication=ON .. ### IMPORTANT! INCLUDE THE TWO DOTS!
make -j 4

Test that the cmake command worked as expected:

cd ~/FSI/precice-2.3.0/build
ctest --output-on-failure

If no errors were shown, install the software and test it worked:

make install
make test_install

Note: I used preCICE v2.3.0, but later versions should also work.

Install the OpenFOAM-preCICE adapter

The Ubuntu installation instructions as of 31/12/2021 are summarised below (adapted from this website):

cd ~/FSI
wget https://github.com/precice/openfoam-adapter/releases/download/v1.0.0/openfoam-adapter_v1.0.0_OpenFOAMv1812-v2012.tar.gz
tar -xzf openfoam-adapter_v1.0.0_OpenFOAMv1812-v2012.tar.gz
cd openfoam-adapter_v1.0.0_OpenFOAMv1812-v2012/
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH ### This line may-or-may-not be needed. YMMV.
./Allwmake

Note: this is for OpenFOAMv2012. Please see the preCICE website for information on adapters for later versions.

Install the FEniCS-preCICE adapter

The Ubuntu installation instructions as of 31/12/2021 are summarised below (adapted from this website). This requires Python3, which should already be installed if you followed my previous instructions:

(optional, should not need this line) python3 -m pip install scipy
python3 -m pip install --user fenicsprecice

Test the installation ran correctly

... by running this tutorial case:

cd ~/FSI
git clone --branch=master --depth 1 https://github.com/precice/tutorials.git
cd ~/FSI/tutorials/perpendicular-flap/fluid-openfoam
./run.sh

The command line output should have paused after this output. If it did not pause, something went wrong.

---[precice]  I am participant "Fluid"
---[precice]  Setting up master communication to coupling partner/s

Now open another Ubuntu terminal, and run these commands:

cd ~/FSI/tutorials/perpendicular-flap/solid-fenics
./run.sh

Both terminals should now have log outputs flying. After around 1 minute of computation, both terminals should finish at (roughly) the same time. You can view the results with the following commands, assuming you have installed ParaView on Windows and added the folder containing its .exe file to the Windows PATH environment variable:

cd ~/FSI/tutorials/perpendicular-flap/fluid-openfoam
paraview.exe fluid-openfoam.foam

Congratulations! You should now have a functional FSI installation.

Note that as of 31/12/2021, the unmodified FEniCS-preCICE adapter only works in 2D, so you will have to edit the adapter (or download my edited version, TODO add link here) in order to add 3D FSI functionality. Or just wait a few months until I get around to submitting a pull request for my version.

TODO:

  • ParaView install instructions
  • Resources for learning CFD and FEM
  • A complete line-by-line breakdown of simpleFoam
  • rhoCentralFoam resources
  • rhoCentralFoam rotating reference frame
  • Tips and Tricks from experience
  • How to do 3D hypersonic fin flutter