# constants
gamma <- 7 / 5
kappa <- 1 - 1 / gamma
g <- 9.8
a <- 6.371e6
day_in_sec <- 86400
om <- 2 * pi / day_in_sec
# list for systems with switches
# d, e, u1, u2
# d: delta
# e: epsilon
# u1: underlined
# u2: double underlined
full <- c(1, 1, 1, 1)
unified <- c(1, 0, 1, 1)
pseudo <- c(1, 0, 0, 1)
anelastic <- c(1, 0, 0, 0)
qhydro <- c(0, 1, 1, 1)
systems <- data.frame(full, unified, pseudo, anelastic, qhydro)
# parameters
H <- 10.0e3 # scale height m
D <- 100.0e3 # top of the atmosphere m
cs2 <- gamma * g * H # speed of sound squared
N2 <- g * kappa / H # Brunt-Väisälä frequency squared
lat <- 40
f <- 2 * om * sin(lat / 180 * pi)
f2 <- f ** 2
beta <- 2 * om * cos(lat / 180 * pi) / a
nx <- 61
nmode <- 7
l <- 10 ** seq(2, 8, length.out = nx)
k <- 2 * pi / l
l <- l * 1.0e-3
n <- c(1, 5, 10, 20, 40, 80, 160)
m <- pi * n / D
omega <- matrix(NA, nmode, nx)
mu <- function(dk) {
(0.5 - dk * kappa) / H
}
acoustic <- function(k, m) {
sqrt(cs2 * (k^2 + m^2 + mu(1.0)^2) + (N2 + f2))
}
gravity <- function(k, m, d, e, u1, u2) {
mu2 <- mu(u2)^2
k2 <- k^2
mmn <- m^2 + mu2 + u1 * N2 / cs2
sqrt((f2 * mmn + k2 * N2) / (d * k2 + mmn + e * d * u2 * f2 / cs2))
}
barotropic <- function(k, u1) {
-beta * k / (k^2 + u1 * f2 / cs2)
}
baroclinic <- function(k, m, u1, u2) {
-beta * k / (k^2 + f2 * (u1 / cs2 + H / (kappa * g) * (m^2 + mu(u2)^2)))
}
plot_dispersion <- function(system, d, e, u1, u2) {
uu <- u1 * u2
fc <- d * e * uu
# empty plot
plot(NULL, NULL, log = "xy",
xlim = c(tail(l, 1), l[1]),
ylim = c(5e-5, 1),
xlab = expression(L[x] ~ "km"),
ylab = expression(abs(omega) ~ "s"^-1),
main = system)
# Lamb wave
if (uu == 1) {
omega[1, ] = sqrt(f^2 + k^2 * cs2)
lines(l, omega[1, ], col = "black", lwd = 2, lty = 2)
}
# Sound waves
if (fc == 1) {
for (j in 1:nmode) {
omega[j, ] <- acoustic(k, m[j])
lines(l, omega[j, ], col = "black", lwd = 2, lty = 1)
}
}
# Gravity waves
for (j in 1:nmode) {
omega[j, ] <- gravity(k, m[j], d, e, u1, u2)
lines(l, omega[j, ], col = "black", lwd = 2, lty = 1)
}
}
par(mfrow = c(3, 2), mar = c(4, 4, 3, 2))
panels <- c("(a)", "(b)", "(c)", "(d)", "(e)")
snames <- c("Fully-Compressible", "Unified",
"Pseudo-Compressible", "Anelastic", "Quasi-Hydrostatic")
names(snames) <- names(systems)
i <- 1
for (sys in names(systems)) {
deu1u2 <- systems[[sys]]
d <- deu1u2[1]
e <- deu1u2[2]
u1 <- deu1u2[3]
u2 <- deu1u2[4]
full_title <- paste(panels[i], snames[sys])
plot_dispersion(full_title, d, e, u1, u2)
i <- i + 1
}