This was my final project in the course 'Sparse Matrix Computations' taught by Charles Van Loan. It is a fluid solver mostly based around techniques proposed in the two papers Stable Fluids [Stam et al.] and Visual Simulation of Smoke [Fedkiw et al.] as well as the book Fluid Simulation for Computer Graphics by Bridson.

It currently has the following features:

- Pressure solve using preconditioned conjugate gradients and a modified incomplete cholesky factor.
- Marker and Cell (MAC)-based discretization
- Uses vorticity confinement to reduce numerical damping.
- Improved Semi-Lagrangian advection step based on cubic spline interpolation.
- Parallelized implementation using C++/OpenMP
- Realtime OpenGL preview
- Output can be rendered using Mitsuba.

This project is made available under the GPL license. It depends on Boost, OpenMP, OpenGL/GLUT and libpng.

Download: Source (12/17/2008)

For many types of functions, sybolic derivatives can exhibit an exponential growth in the amount of code
required to evaluate them — hundreds up to thousands of lines of C code for the second derivative of a
simple-looking expression are not uncommon. Maintaining such derivative implementations across modifications
to the original function can be painful - here it often makes sense to switch to *automatic differentiation* (AD).

AD can evaluate the derivatives of any continuous function without running into the numerical issues traditionally encountered by the use of finite differences. The basic idea is to interpret a program as a big vector-valued function, which can be decomposed into a sequence of elementary function invocations. Once this is done, the chain rule can be repeatedly applied to propagate derivative information through each elementary function call. Since C++ supports polymorphism and operator overloading, all of this is greatly facilitated: the decomposition happens at compile-time and almost no code modifications are required. This C++ library is primarily meant for computing first and second derivative information.

This is an adapted C++ port of Jon Kaldor's Java-based automatic differentiation library, which in turn is inspired by a C version by Eitan Grinspun at Caltech. It is made available here under the LGPL license and depends on UBLAS, which is part of Boost. There is now also an Eigen 3 version.

Download (UBLAS version):
autodiff.h | cholesky.h | example.cpp

Download (Eigen version):
autodiff.h | example.cpp