author | Andreas Thurnherr <ant@ldeo.columbia.edu> |
Mon, 13 Apr 2020 11:06:22 -0400 | |
changeset 40 | c1803ae2540f |
parent 39 | 56bdfe65a697 |
permissions | -rw-r--r-- |
0 | 1 |
#====================================================================== |
38 | 2 |
# L I B G M 7 6 . P L |
0 | 3 |
# doc: Sun Feb 20 14:43:47 2011 |
39 | 4 |
# dlm: Sat Apr 6 19:33:05 2019 |
0 | 5 |
# (c) 2011 A.M. Thurnherr |
39 | 6 |
# uE-Info: 34 48 NIL 0 0 70 2 2 4 NIL ofnI |
0 | 7 |
#====================================================================== |
8 |
||
9 |
# HISTORY: |
|
10 |
# Feb 20, 2011: - created |
|
11 |
# Feb 28, 2011: - cosmetics |
|
12 |
# Mar 28, 2012: - BUG: N had been ignored (but only affects vertical |
|
13 |
# wavelengths > 1000m in any was significantly |
|
14 |
# - changed from Munk eqn 9.23b to 9.23a, which also |
|
15 |
# affects only long wavelengths |
|
16 |
# - return nan for omega outside internal-wave band |
|
17 |
# Mar 29, 2012: - re-wrote using definition of B(omega) from Munk (1981) |
|
3 | 18 |
# Aug 23, 2012: - cosmetics? |
19 |
# Sep 7, 2012: - made N0, E0, b, jstar global |
|
4
ff72b00b4342
after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
3
diff
changeset
|
20 |
# Dec 28, 2012: - added allowance for small roundoff error to Sw() |
7
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
21 |
# Oct 6, 2014: - made omega optional in Sw() |
10 | 22 |
# Nov 18, 2014: - made b & jstar mandatory for Sw() |
38 | 23 |
# Feb 2, 2019: - renamed from libGM.pl to libGM76.pl |
24 |
# - replaced beta with m |
|
25 |
# - replaced old code based on Gregg + Kunze formalism with |
|
26 |
# expressions from Thurnherr et al. (GRL 2015) |
|
27 |
# - added GM_strain |
|
28 |
# - BUG: Sw usage message had wrong parameter order |
|
29 |
# - renamed Sw => GM_VKE; Su_z => GM_shear |
|
39 | 30 |
# Mar 31, 2019: - updated doc for shear and strain spectra |
31 |
# Apr 1, 2019: - added GM_vdiv |
|
32 |
# Apr 5, 2019: - BUG: GM_VKE was erroneous (argument shifting was wrong) |
|
33 |
# - adapted to improved antsFunUsage() |
|
34 |
# Apr 6, 2019: - fiddled during debugging of fs_finestructure issue |
|
0 | 35 |
|
36 |
require "$ANTS/libEOS83.pl"; |
|
37 |
||
38 |
my($pi) = 3.14159265358979; |
|
39 |
||
40 |
#====================================================================== |
|
3 | 41 |
# Global Constants |
42 |
#====================================================================== |
|
43 |
||
44 |
$GM_N0 = 5.24e-3; # rad/s # reference stratification (from Gregg + Kunze, 1991) |
|
45 |
$GM_E0 = 6.3e-5; # dimensionless # spectral level (Munk 1981) |
|
46 |
$GM_b = 1300; # m # pycnocline e-folding scale |
|
47 |
$GM_jstar = 3; # dimless # peak mode number |
|
48 |
||
49 |
#====================================================================== |
|
0 | 50 |
# Vertical velocity spectral density |
51 |
# |
|
52 |
# Units: K.E. per frequency per wavenumber [m^2/s^2*1/s*1/m = m^3/s] |
|
38 | 53 |
# Version: GM76 |
0 | 54 |
# |
55 |
# E. Kunze (email, Feb 2011): The GM vertical velocity w spectrum is described by |
|
56 |
# |
|
57 |
# S[w](omega, k_z) = PI*E_0*b*{f*sqrt(omega^2-f^2)/omega}*{j*/(k_z + k_z*)^2} |
|
58 |
# |
|
59 |
# where E_0 = 6.3 x 10^-5 is the dimensionless spectral level, b = 1300 m is |
|
60 |
# the pycnocline lengthscale, j* = 3 the peak mode number and k_z* the |
|
61 |
# corresponding vertical wavenumber. The flat log-log spectrum implies w is |
|
62 |
# dominated by near-N frequencies (where we know very little though Yves |
|
63 |
# Desaubies wrote some papers back in the late 70's/early 80's about the |
|
64 |
# near-N peak) and low modes. The rms w = 0.6 cm/s, right near your noise |
|
65 |
# level. Interestingly, the only N dependence is in m and m*. As far |
|
66 |
# as I know, little is known about its intermittency compared to horizontal |
|
67 |
# velocity. Since w WKB-scales inversely with N, the largest signals should |
|
68 |
# be in the abyss where you therefore likely have the best chance of |
|
69 |
# measuring it. |
|
7
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
70 |
# |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
71 |
# E. Kunze (email, Sep 19, 2013): |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
72 |
# |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
73 |
# S[w](omega, m) = PI*E0*b*[f*sqrt(omega^2-f^2)/omega]*[jstar/(m+mstar)^2] with |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
74 |
# |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
75 |
# S[w](m) = PI*E0*b*N*f*[jstar/(m+mstar)^2] |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
76 |
# |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
77 |
# where the nondimensional spectral energy level E0 = 6.3e-5, stratification |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
78 |
# lengthscale b = 1500 m, jstar = 3, mstar = jstar*PI*N/b/N0, and N0 = |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
79 |
# 5.3e-3 rad/s. |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
80 |
# |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
81 |
# NOTES: |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
82 |
# - b=1500m is a likely typo, as Gregg & Kunze (1991) have b=1300m |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
83 |
# - k_z == m |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
84 |
# |
0 | 85 |
#====================================================================== |
86 |
||
87 |
sub m($$) # vertical wavenumber as a function of mode number & stratification params |
|
88 |
{ |
|
89 |
my($j,$N,$omega) = @_; |
|
90 |
||
4
ff72b00b4342
after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
3
diff
changeset
|
91 |
return defined($omega) && ($omega <= $GM_N0) |
3 | 92 |
? $pi / $GM_b * sqrt(($N**2 - $omega**2) / ($GM_N0**2 - $omega**2)) * $j |
7
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
93 |
: $pi * $j * $N / ($GM_b * $GM_N0); # valid, except in vicinity of buoyancy turning frequency (Munk 1981, p.285) |
0 | 94 |
} |
95 |
||
96 |
sub B($) # structure function (omega dependence) |
|
97 |
{ # NB: f must be defined |
|
98 |
my($omega) = @_; |
|
99 |
croak("coriolis parameter not defined\n") |
|
100 |
unless defined($f); |
|
101 |
return 2 / $pi * $f / $omega / sqrt($omega**2 - $f**2); |
|
102 |
} |
|
103 |
||
38 | 104 |
sub GM_VKE(@) |
0 | 105 |
{ |
10 | 106 |
my($omega,$m,$lat,$b,$jstar,$N) = |
39 | 107 |
&antsFunUsage(-5,'fffff','GM_VKE([frequency[1/s]] <vertical wavenumber[rad/m]> <lat[deg]> <b[m]> <j*> <N[rad/s]>)',@_); |
3 | 108 |
|
7
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
109 |
if (defined($N)) { # Sw(omega,m) |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
110 |
local($f) = abs(&f($lat)); |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
111 |
$omega += $PRACTICALLY_ZERO if ($omega < $f); |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
112 |
$omega -= $PRACTICALLY_ZERO if ($omega > $N); |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
113 |
return nan if ($omega < $f || $omega > $N); |
10 | 114 |
my($mstar) = &m($jstar,$N,$omega); |
115 |
return $GM_E0 * $b * 2 * $f**2/$omega**2/B($omega) * $jstar / ($m+$mstar)**2; |
|
38 | 116 |
} else { # Sw(m), i.e. integrated over all omega; as in Thurnherr et al., GRL 2015 |
39 | 117 |
$N = $jstar; $jstar = $b; # shift arguments to account for missing omega |
118 |
$b = $lat; $lat = $m; |
|
7
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
119 |
local($f) = abs(&f($lat)); |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
120 |
$m = $omega; |
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
121 |
undef($omega); |
10 | 122 |
my($mstar) = &m($jstar,$N); |
123 |
return $pi * $GM_E0 * $b * $N * $f * $jstar / ($m+$mstar)**2; |
|
7
f7b4692ad805
just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
4
diff
changeset
|
124 |
} |
3 | 125 |
} |
126 |
||
127 |
#---------------------------------------------------------------------- |
|
39 | 128 |
# Vertical Divergence (normalized by N) |
129 |
# - implemented to investigate shear-to-vertical divergence ratio |
|
130 |
# - S[w_z/N] = S[w_z] / N^2 = S[w] * m^2 / N^2 |
|
131 |
# - GM shear-to-vd variance ratio = 3N/2f |
|
132 |
# - GM strain-to-vd variance ratio = N/2f |
|
133 |
#---------------------------------------------------------------------- |
|
134 |
||
135 |
sub GM_vdiv(@) |
|
136 |
{ |
|
137 |
my($m,$lat,$b,$jstar,$N) = |
|
138 |
&antsFunUsage(5,'fffff','GM_vdiv(<vertical wavenumber[rad/m]> <lat[deg]> <b[m]> <j*> <N[rad/s]>)',@_); |
|
139 |
return GM_VKE($m,$lat,$b,$jstar,$N) * $m**2 / $N**2; |
|
140 |
} |
|
141 |
||
142 |
#---------------------------------------------------------------------- |
|
38 | 143 |
# Shear and Strain m-spectra (i.e. integrated over f) |
39 | 144 |
# - shear is buoyancy-frequency normalized |
38 | 145 |
# - spectral density |
39 | 146 |
# - from Thurnherr et al. (GRL 2015), which is from email info |
147 |
# Eric Kunze, 04/22/2015: First, the standard GHP parameterization that I |
|
148 |
# implement uses either the N-normalized shear or strain spectra. The GM |
|
149 |
# versions of these are |
|
150 |
# S[V_z/N](m) = (3*PI/2)*E0*b*jstar*m^2/(m+mstar)^2 and |
|
151 |
# S[Z_z](m) = (PI/2)*E0*b*jstar*m^2/(m+mstar)^2 |
|
152 |
# though in practice mstar is not particularly important because the |
|
153 |
# variance of both these quantities is dominated by high m. |
|
3 | 154 |
#---------------------------------------------------------------------- |
0 | 155 |
|
38 | 156 |
sub GM_shear(@) |
3 | 157 |
{ |
38 | 158 |
my($m,$lat,$b,$jstar,$N) = |
39 | 159 |
&antsFunUsage(5,'fffff','GM_shear(<vertical wavenumber[rad/m]> <lat[deg]> <b[m]> <j*> <N[rad/s]>)',@_); |
38 | 160 |
local($f) = abs(&f($lat)); |
161 |
my($mstar) = &m($jstar,$N); |
|
162 |
return 3 * $pi/2 * $GM_E0 * $b * $jstar * $m**2 / ($m+$mstar)**2; |
|
163 |
} |
|
0 | 164 |
|
38 | 165 |
sub GM_strain(@) |
166 |
{ |
|
167 |
my($m,$lat,$b,$jstar,$N) = |
|
39 | 168 |
&antsFunUsage(5,'fffff','GM_strain(<vertical wavenumber[rad/m]> <lat[deg]> <b[m]> <j*> <N[rad/s]>)',@_); |
38 | 169 |
local($f) = abs(&f($lat)); |
170 |
my($mstar) = &m($jstar,$N); |
|
171 |
return $pi/2 * $GM_E0 * $b * $jstar * $m**2 / ($m+$mstar)**2; |
|
3 | 172 |
} |
173 |
||
38 | 174 |
##---------------------------------------------------------------------- |
175 |
## GM76, as per Gregg and Kunze (JGR 1991) |
|
176 |
## - beta is vertical wavenumber |
|
177 |
##---------------------------------------------------------------------- |
|
178 |
# |
|
179 |
#sub Su($$) |
|
180 |
#{ |
|
181 |
# my($beta,$N) = @_; |
|
182 |
# |
|
183 |
# my($beta_star) = &m($GM_jstar,$N); # A3 |
|
184 |
# return 3*$GM_E0*$GM_b**3*$GM_N0**2 / (2*$GM_jstar*$pi) / (1+$beta/$beta_star)**2; # A2 |
|
185 |
#} |
|
186 |
# |
|
187 |
#sub Su_z($$) |
|
188 |
#{ |
|
189 |
# my($beta,$N) = &antsFunUsage(2,'ff','<vertical wavenumber[rad/m]> <N[rad/s]>',@_); |
|
190 |
# return $beta**2 * &Su($beta,$N); |
|
191 |
#} |
|
0 | 192 |
|
193 |
1; |