#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
return (a - mn) / (mx - mn);
}
static void swe(bool console) {
const unsigned Lx = 1600, nx = Lx + 1;
const unsigned Ly = 1600, ny = Ly + 1;
const float dx = Lx / (nx - 1);
const float dy = Ly / (ny - 1);
array um = ZERO, vm = ZERO;
unsigned io = (unsigned)
floor(Lx / 6.0f), jo = (unsigned)
floor(Ly / 6.0f),
k = 15;
0.01f *
exp((-((x - io) * (x - io) + (y - jo) * (y - jo))) / (k * k));
float m_eta = max<float>(etam);
float dt = 0.5;
float h_diff_kernel[] = {9.81f * (dt / dx), 0, -9.81f * (dt / dx)};
float h_lap_kernel[] = {0, 1, 0, 1, -4, 1, 0, 1, 0};
array h_diff_kernel_arr(3, h_diff_kernel);
array h_lap_kernel_arr(3, 3, h_lap_kernel);
if (!console) {
win =
new Window(1536, 768,
"Shallow Water Equations");
}
unsigned iter = 0;
unsigned random_interval = 30;
if (iter > 2000) {
etam = 0.01f *
exp((-((x - io) * (x - io) + (y - jo) * (y - jo))) /
(k * k));
m_eta = max<float>(etam);
eta = etam;
iter = 0;
}
if (iter % 100 == 0 || iter % 130 == 0 || iter % random_interval == 0) {
unsigned io = (unsigned)
floor(rand() % Lx),
jo = (
unsigned)
floor(rand() % Ly);
random_interval = rand() % 200 + 1;
eta += 0.01f *
exp((-((x - io) * (x - io) + (y - jo) * (y - jo))) /
(k * k));
}
array etap = 2 * eta - etam + (2 * dt * dt) / (dx * dy) * e;
etam = eta;
eta = etap;
m_eta = max<float>(etam);
if (!console) {
(*win)(0, 1).setAxesLimits(0, hist_out.
elements(), 0,
max<float>(hist_out));
(*win)(0, 0).image(normalize(eta, m_eta));
(*win)(0, 1).hist(hist_out, 0, 1,
"Normalized Pressure Distribution");
"Pressure at left boundary");
(*win)(1, 1).plot(
"Gradients versus Magnitude at left boundary");
win->show();
} else
iter++;
}
}
int main(int argc, char* argv[]) {
int device = argc > 1 ? atoi(argv[1]) : 0;
bool console = argc > 2 ? argv[2][0] == '-' : false;
try {
printf("Simulation of shallow water equations\n");
swe(console);
fprintf(stderr,
"%s\n", e.
what());
throw;
}
return 0;
}