/**
# Internal Waves
In a stratified fluid internal waves can exist (also reffered to as
gravity waves). An interesting feature of these waves is the so-called
dispersion relation between the angle of wave propagation ($\theta$),
stratification strength ($N^2$) and the freqency of the wave
($\omega$), according to,
$$ \omega = N^2 \cos(\theta).$$
## Numerical set-up
The Navier-Stokes equantions under Boussinesq approximation are solved
on a $256 \times 256$ miltigrid. In the centre of the domain an
oscillating force exites the internal waves with a freqency
corresponding to $\theta = 45^o$.
*/
#include "grid/multigrid.h"
#include "navier-stokes/centered.h"
#include "tracer.h"
scalar b[];
scalar * tracers = {b};
face vector av[];
double sqN = 1., omega;
b[top] = neumann (sqN);
b[bottom] = neumann (-sqN);
int main() {
omega = sqrt(1./2.);
L0 = 30;
X0 = Y0 = -L0/2;
a = av;
TOLERANCE = 1e-4;
DT = 0.2/omega;
N = 256;
run();
}
/**
The initial stratification is set.
*/
event init (t = 0) {
foreach()
b[] = sqN*y;
boundary ({b});
}
/**
## Acceleration
We apply gravity and the localized oscillarory force.
*/
event acceleration (i++) {
coord del = {0, 1};
foreach_face()
av.x[] = del.x*((b[] + b[-1])/2. +
0.1*(sin(omega*t)*((sq(x) + sq(y)) < 1)));
}
/**
## Output
We output a .mp4 file showing the evolution of the magnitude of the
gradient of the buoyancy field (|$\nabla b$|).
*/
event output (t += 0.5; t <= 75) {
scalar grb[];
foreach() {
grb[] = 0;
foreach_dimension()
grb[] += sq((b[1] - b[-1])/(2*Delta));
grb[] = sqrt(grb[]);
}
output_ppm (grb, file = "grb.mp4", min = 0.8, max = 1.2);
}
/**
## Results
The dispersion relation appears to be statisfied.
![Visualization of the internal waves](internalwacesMG/grb.mp4)
The next step is to perform this simulation using adaptive grids, [See
here](internalwacesAMR.c).
*/