Last edited 8may08 by schaber2@uiuc.edu

Find this document at http://cheer.math.edu/reulab/web/schaber2
# CFD CUDA: Accessing the power of a GPU for use in 3-D simulations

## Abstract

My project focuses on learning how to program the NVIDIA GPU so that it's parallel computation capabilities
might be used to help render graphics in the virtual environments.
Using the fluidsGL program provided in the SDK, I will first separate the
relevant computational code from the graphics handling, by storing the data produced
and then using it to run an animation with a solely graphical program.
After this I will set up a pipe between the computational code and animation code to allow interactivity.
Then replace the pipe with a socket so that the GPU can be used as a member of a Syzygy fleet.

## History

While GPU's are engineered mainly to handle, as their name suggests, graphical computations, they are becoming an attractive alternative to general purpose CPU's for some computationally intensive problems. The calculations required for graphics processing lend themselves to parallelism. As such, current GPU's offer the ability to perform massively parallel computations orders of magnitude faster than CPU's. With the future of discrete GPU's uncertain, companies such as NVIDIA are promoting the use of their GPU's for scientific and engineering applications. To this end NVIDIA has developed CUDA, an extension to the C programming language to aid in programming on their GPU's. The ability to harness the parallel computation capabilities of the GPU would allow for several computation-intensive simulations to be run in the CAVE or the CUBE.

## Mathematics

The fluidsGL program attempts to solve a two dimensional
Navier-Stokes equation using the method proposed by Jos Stam^{1} in his
1999 paper. The algorithm makes certain assumptions that result in a solution
that is not completely accurate, but computationally efficient and visually appealing. In the most general sense the Navier-Stokes equation is merely a
statement that momentum is conserved. More specifically, that changes in
momentum in infinitesimal volumes of fluid are simply the sum of dissipative
viscous forces, changes in pressure, gravity, and other forces acting inside
the fluid.

To solve this differential equation exactly would be very difficult so we solve
for (or at least approximate) the solution to each individual term iteratively,
with the notion that these separate terms will superimpose to give a nice
approximation of the actual solution. For each term we update the velocity
field, which is simulated as a grid of discrete points over our domain. It is
here that the GPU has a distinct advantage over a CPU. Each point velocity
needs to be updated individually with the same equation, meaning the
computation is very parallel^{2}.
1. The first term we handle is the addition of an outside
force f. This is by far the easiest as we can just the Euler integration method
i.e. v=f*dt where dt is our (pre-determined and constant) time step.

2. The second step uses the updated velocity field to
account for advection. To this end we assume that the velocity at any point is
equal to the velocity the particle at that point had a time step ago.

3. Again using the updated velocity field we now solve
for the effect of diffusion. Since the fluidsGL program is a torus the
boundary is periodic meaning this step can be solved using a FFT which makes the complicated differentiation a simple multiplication.

4. Finally we take the inverse Fast Fourier Transform to
project our velocity field back onto our 2-D plan.

## Operating Instructions

**Static Viewer**

To make and play a simple pre-generated animation compile
and run *fluidsStaticCalc.cu* passing in the desired name of the to be
created output file that will contain every tenth frame viewed. Then run *fluidsGraphics* on any machine with a command line argument of a valid output
file.

** Dynamic Viewer **

First run *fluidsServer* *port* where port
is the port number to listen on, on AH 130-15. Once the server indicates it is
initialized and listening on the given port run *fluidsClient* *IP address port* on the remote machine.
### Bibliography

1. "Stable Fluids." by Jos Stam link

2. "CUDA/GL Fluid Simulation" by Nolan Goodnight link