# Test cases

The following test cases are run automatically whenever the code
changes.

Note that only the documented test cases appear in the list below
(follow the [All tests](/src/test/) link for a complete list).

## Advection

* [Pure rotation of a smooth tracer field](rotation.c)
* [Time-reversed advection in a vortex](advection.c)

## Systems of conservation laws

* [Bouncing Saint-Venant bump](bump2D1.c)
* [1D arterial flow](artery1D.c)
* [Two- and three-dimensional explosions](explosion.c)

## Incompressible Euler/Navier--Stokes

* [Lid-driven cavity at Re=1000](lid.c)
* [Merging of two vertices](stream.c)
* [Merging of two vortices (centered Euler solver)](vortex.c)
* [Taylor--Green vortices](taylor-green.c)
* [Non-hydrostatic lock-exchange](kh-ns.c)

## Shallow-water flows

* [Drying of a lake](dry.c)
* [Simple Saint-Venant Riemann problem](bore1.c)
* [Oscillations in a parabolic container](parabola.c)
* [Undular bores for the Green-Naghdi equations](bore.c)
* [Green-Naghdi soliton](soliton.c)
* [Solitary wave run-up on a plane beach](beach.c)
* [Solitary wave overtopping a seawall](seawall.c)
* [Sinusoidal wave propagation over a bar](bar.c)
* [Runup of a solitary wave on a conical island](conical.c)
* [Stress test for wetting and drying](ponds.c)
* [Shock reflection by a circular cylinder](shock.c)
* [Flow rates for multiple rivers](multiriverinflow.c)
* [Source of a river](source.c)
* [Implicit Saint-Venant solutions for waves](implicit.c)
* [Viscous hydraulic jump](higuera.c)
* [Transcritical flow over a bump with multiple layers](layered.c)
* [Wind-driven lake](wind-driven-stvt.c)
* [Lake flowing into itself](lake-tr.c)

## Multilayer model

* [Dispersion relation](dispersion.c)
* [Solitary wave run-up on a plane beach](beach-ml.c)
* [Solitary wave overtopping a seawall](seawall.c)
* [Runup of a solitary wave on a conical island](conical.c)
* [Stress test for wetting and drying](ponds-ml.c)
* [Sinusoidal wave propagation over a bar](bar-ml.c)
* [Oscillations in a parabolic container](parabola.c)
* [Circular dam break on a sphere](lonlat-ml.c)
* [Wind-driven lake](wind-driven.c)
* [Large-amplitude standing wave](large.c)
* [Transcritical flow over a bump with multiple layers](gaussian.c)
* [Breaking Stokes wave](stokes.c)
* [Galilean invariance](galilean_invariance.c)
* [Typical (1D) tsunami wave](tsunami.c)
* [3D meniscus](meniscus3D.c)
* [Dispersion relation of gravito-capillary waves](dispersion_gravitocap.c)

## Coriolis

* [Stommel gyre](stommel-ml.c)
* [Geostrophic adjustment](geo.c)
* [Non-linear geostrophic adjustment](nonlinear.c)

## Stratified multilayer

* [Internal solitary waves](horn.c)
* [Overflow](overflow.c)
* [Lock-exchange](lock.c)
* [Non-hydrostatic lock-exchange](kh.c)
* [Isopycnal gyres intersecting the bathymetry](bleck.c)

## Volume-Of-Fluid

* [Computation of volume fractions from a levelset function](fractions.c)
* [Computation of volume fractions on a variable-resolution grid](fractions1.c)
* [Fractions in marginal cases](fractions2.c)
* [Computation of a levelset field from a contour](basilisk.c)
* [Time-reversed VOF advection in a vortex](reversed.c)
* [Preventing coalescence of VOF tracers](no-coalescence.c)

## Surface tension

* [Curvature of a circular/spherical interface](curvature.c)
* [Circular droplet in equilibrium](spurious.c)
* [Capillary wave](capwave.c)
* [Gravity wave](gravity.c)
* [Shape oscillation of an inviscid droplet](oscillation.c)
* [Rising bubble](rising.c)
* [Sessile drop](sessile.c)
* [3D Sessile drop](sessile3D.c)
* [Marangoni-induced translation due to a temperature gradient](marangoni.c)

## Compressible two-phase flows

* [Shock tube problem for a single ideal gas (strong shock wave)](shockwave.c)
* [Advection of two fluids at different pressures](discontinuity-advection.c)
* [Zero reflection of a wave propagating across an interface between two fluids
   with impedance matching](reflectionperfect.c)
* [Transmission/reflection of a wave propagating across an interface
  between two fluids](reflectiongaussian3.c)
* [Propagation of an acoustic disturbance in a tube](gaussianaxi.c)
* [Small-amplitude oscillations due to surface tension](bubble.c)
* [Small-amplitude spherically-symmetric oscillations due to surface tension](bubble-spherical.c)
* [Rayleigh collapse of a compressible gas bubble](collapse.c)
* [Double Mach reflection of a Mach 10 shock from a wall](inclined-shock.c)
* [Shape oscillation of an inviscid droplet](oscillation.c)

### Compressible two-phase flows with thermal effects

* [Bubble shrinking due to thermal effects](shrinking.c)

## General orthogonal coordinates

* [Circular dam break on a sphere](lonlat.c)
* [Axisymmetric mass conservation](axiadvection.c)
* [Axisymmetric Poiseuille flow](poiseuille-axi.c)
* [Convergence of axisymmetric viscous terms](axi.c)
* [Refinement of axisymmetric metric](refine-axi.c)
* [Boundary layer on a rotating disk](swirl.c)

## Embedded boundaries

* [Poisson equation on complex domains](neumann.c)
* [Poisson equation on complex domains in 3D](neumann3D.c)
* [Poisson equation on complex axisymmetric domains](neumann-axi.c)
* [Stability of the embedded face velocity interpolation](uf.c)
* [Hydrostatic balance with refined embedded boundaries](hydrostatic2.c)
* [Hydrostatic balance with refined embedded boundaries in 3D](hydrostatic3.c)
* [Compatibility of embedded boundaries, axi and VOF](missing_metric.c)

### Stokes

* [Poiseuille flow in a periodic channel inclined at 45 degrees](poiseuille45.c)
* [Couette flow between rotating cylinders](couette.c)
* [Wannier flow between rotating excentric cylinders](wannier.c)
* [Stokes flow past a periodic array of cylinders](cylinders.c)
* [Stokes flow past a periodic array of spheres](spheres.c)
* [Stokes flow through a complex porous medium](porous.c)
* [Stokes flow through a complex porous medium, randomly refined](porous1.c)

### Navier--Stokes

* [Starting flow around a cylinder](starting.c)

## Electrohydrodynamics

* [Gouy-Chapman Debye layer](debye.c)
* [Electrostatic in planar layers](planar.c)
* [Convergence of axisymmetric EHD stresses](ehd_axi_stress.c)
* [Charge relaxation in an axisymmetric insulated conducting column](cyl_axi.c)
* [Charge relaxation in a planar cross-section](cyl_planar.c)
* [Equilibrium of a droplet suspended in an electric field](taylor.c)

## Viscoelasticity

* [Transient planar Poiseuille flow for 
   an Oldroyd-B or FENE-P fluid](poiseuille-oldroydb.c)
* [Oldroyd-B lid-driven cavity](lid-oldroydb.c)
* [Viscoelastic 2D drop in a Couette Newtonian shear flow](viscodrop.c)
* [Impact of a viscoelastic drop on a solid](fall.c)

## Reaction--Diffusion

* [The SAG equation](sag.c)
* [Soluble gas diffusing from a static bubble](static_bubble.c)
* [Soluble gas diffusing from a rising bubble](axi_rising_bubble.c)

## General Ocean Turbulence Model (GOTM)

* [Turbulent Couette flow](couette-gotm.c)
* [Entrainment](entrainment.c)
* [Ocean Weather Ship Papa](ows_papa.c)

## MPI

* [Reduction operations](mpi-reduce.c)
* [Boundary conditions and restriction](mpi-restriction.c)
* [Z-order indexing](indexing.c)
* [Parallel scalability](mpi-laplacian.c)
* [Parallel refinement](mpi-refine.c)
* [Poisson solver on non-uniform mesh](mpi-circle.c)
* [Boundary conditions for face fluxes](mpi-flux.c)
* [Boundary conditions for face vector fields](mpi-interpu.c)
* [Simple test of Basilisk View](view.c)

## GPU tests

These tests need to be run manually using:

~~~bash
make -k gpu-tests
~~~

* [A range of GPU tests](gpu.c)
* [Layers](layers.c)
* [Reductions on GPUs](gpu-reduce.c)
* [Non-linear geostrophic adjustment](nonlinear.c)
* [Time-reversed advection in a vortex](advection.c)
* [Saint-Venant bump](bump2D-gpu.c)
* [Time-reversed VOF advection in a vortex](reversed.c)

Tests for the multigrid solver on GPUs.

* [Convergence of axisymmetric viscous terms](axi.c)
* [Lid-driven cavity](lid.c)

See also the [GPU Benchmarks](/src/grid/gpu/Benchmarks.md).

## Speed benchmarks

* [Speed of elementary operations on different grids](laplacian.c)
* [Poisson equation](poisson.c)
* [Poisson equation with a circular refined patch](circle.c)

## Basic operations

* [Automatic stencils / boundary conditions](stencils.c)
* [Interpolation on halos](interp.c)
* [Tangential interpolation on face vector fields](interpu.c)
* [Height Functions](hf.c)

## Other

* [Kuramoto--Sivashinsky equation](kuramoto.c)
* [Convergence of the Runge--Kutta solvers](runge-kutta.c)
* [Segment traversal](segment.c)
* [Redistancing of a perturbed distance field](redistance-ellipse.c)
* [Einstein summation](einstein_sum.c)

## Unmaintained

The following tests are not maintained anymore.

* [CVMix KPP interface](unmaintained/cvmix.c)

## [All tests](/src/test/)

# Running and creating test cases (and examples)

First make sure to read the [section on
Makefiles](/Tutorial#using-makefiles) in the [tutorial](/Tutorial).

To run a particular test case yourself, you can then just do

~~~bash
cd src/test
make bump2D1.tst
~~~

which should give something like

    ...
    qcc -g -O2 -Wall -o bump2D1/bump2D1 bump2D1.c -lm
    [bump2D1.tst]

This indicates that the test compiled and ran successfully. 

## Error checking

If the test fails, you will get something like

    ...
    > 2.5 434 0.0678117 0.164104 0.11299303
    > # refined 80 cells, coarsened 108 cells
    make: *** [bump2D1.tst] Error 1

The last line indicates that make failed. The lines before this are
the output of

~~~bash
diff bump2D1/log bump2D1.ref
~~~

That is, to check whether the test case succeeded or not, the default
Makefile of Basilisk just compares (using
[*diff*](http://man7.org/linux/man-pages/man1/diff.1.html)) the *log*
file created by the program to the matching reference log file (with
the *.ref* extension).

To create your own test case (let's call it *mytest*), you only need
to create the source code (i.e. *mytest.c*), run it to create the
*mytest/log* file, check that you are happy with the results and copy
*mytest/log* into *mytest.ref*.

## Graphics

Most tests (but not all) also produce some kind of graph summarising
the results (which allows for example to understand more easily
how/why a particular test failed). Some tests produce these graphs
directly when they run, but most rely on *gnuplot* to generate the
graphs in a post-processing step.

This step is not automatically executed when doing *make
test.tst*. This allows for example to run the test suite on *bare
bones* systems which do not have gnuplot installed.

The makefile system knows about two kinds of graphics: *"inline" plots*
and *"offline" plots*.

### Inline plots

These are generated using gnuplot or python commands embedded directly
in the documentation comments of the source code (*mytest.c*). Using
the standard wiki syntax for scripts these commands appear as

    ~~~gnuplot Caption
    ...
    ~~~

    ~~~pythonplot Caption
    import matplotlib.pyplot as plt
    ...
    plt.savefig('plot.png')
    ~~~

and are replaced by the corresponding figure when the page is displayed
in the wiki.

To generate the figures from the command line, just do

~~~bash
make mytest/plots
~~~

### Offline plots

Alternatively, one can put the gnuplot commands in a separate 
*mytest.plot* file. Note that this method offers few advantages
compared to "inline plots" (the prefered option).

To generate the corresponding plots, one can then do

~~~bash
make bump2D1/plot.png
~~~

which should give something like

    cd bump2D1 && gnuplot -e "batch=1; PNG=\"pngcairo\" ... ../bump2D1.plot ...

Note that, while *plot.png* is the default name for the generated
graph, the gnuplot script can also generate other graphs. Doing

~~~bash
ls bump2D1/*.png
~~~

(or *`eog bump2D1/*.png`*) reveal them all.

Note that if you try to generate plots for a test case which does not
have a corresponding *.plot* gnuplot script, you will get something
like

~~~bash
make events/plot.png
make: *** No rule to make target `events/plot.png'.  Stop.
~~~

## Running the entire test suite

Use something like

~~~bash
cd src/test/
make -k -j8
~~~

where *-k* tells *make* not to stop at the first error and *-j8* uses
parallel processing (assuming you have at least 8 cores on your
system).

## Testing dimensional analysis

[Dimensional analysis](/src/ast/interpreter/dimension.c) can be tested
using reference files with a `.dims.ref` extension. The default
Makefile will then compile the corresponding `.c` file using the
`-dimensions` option to generate a `.dims` file which will be compared
(using `diff`) to the reference file.

A simple way to generate a new reference file for e.g. `test.c` is to do

~~~bash
touch test.dims.ref
make test.s
~~~

The `make test.s` command will fail (since the reference file is empty)
and one can then copy the generated `.dims` file as the new reference
file (after checking that it is correct!) i.e.

~~~bash
cp test.dims test.dims.ref
~~~
