Implementing open boundary conditions shouldn't be too bad, although it is somewhat different from what is currently there.
the basic idea can be found in this paper:
http://jcohen.name/papers/Shah_Extended_2004.pdf
section 3.2
as far as I know, this isn't well described in the graphics literature. Non-graphics people do stuff like this all the time, but they usually use something more sophisticated.
The basic idea is to enforce du / dn = 0 at all boundaries. This can be handled in the ghost cells by setting the ghost cell value based on the derivative of the interior cell value during the apply_3d_boundary_conditions function, e.g.:
u[0] - u[-1] = u[1] - u[0]
=> u[-1] = u[1] - 2 * u[0]
you then need to enforce this boundary condition during the multigrid iterations.
there are two approaches to this. The easy approach is to pretend that the boundaries are simply wall boundaries, and then reset the ghost cells based on the du/dn=0 condition at the end. This will result in some divergence along the border cells, but basically works.
The 'correct' approach is to modify the relaxation step slightly.
The scheme is slightly obfuscated, but what is currently done is described here:
http://code.google.com/p/opencurrent/wiki/EnforcingBoundaryConditionsInMultigrid
Basically, you can come up with a different set of weights in the relax step based on dU/dn = 0, and modify relaxation for the border cells appropriately.
Let me know if this makes sense, or if you need more clarification.