libGM.pl
author A.M. Thurnherr <athurnherr@yahoo.com>
Tue, 27 Nov 2018 15:40:03 -0500
changeset 37 b24d11f7dfc4
parent 15 ebd8a4ddd7f2
permissions -rw-r--r--
V7.1 corrected
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#                    L I B G M . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Sun Feb 20 14:43:47 2011
10
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 7
diff changeset
     4
#                    dlm: Tue Nov 18 12:42:30 2014
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 2011 A.M. Thurnherr
10
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 7
diff changeset
     6
#                    uE-Info: 22 53 NIL 0 0 70 2 2 4 NIL ofnI
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
#	Feb 20, 2011: - created
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
#	Feb 28, 2011: - cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#	Mar 28, 2012: - BUG: N had been ignored (but only affects vertical
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#						 wavelengths > 1000m in any was significantly
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#				  - changed from Munk eqn 9.23b to 9.23a, which also
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#					affects only long wavelengths
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#				  - return nan for omega outside internal-wave band
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#	Mar 29, 2012: - re-wrote using definition of B(omega) from Munk (1981)
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    18
#	Aug 23, 2012: - cosmetics?
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    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
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 7
diff changeset
    22
#	Nov 18, 2014: - made b & jstar mandatory for Sw()
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
require "$ANTS/libEOS83.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
my($pi) = 3.14159265358979;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
#======================================================================
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    29
# Global Constants
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    30
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    31
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    32
$GM_N0 = 5.24e-3;   # rad/s			# reference stratification (from Gregg + Kunze, 1991)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    33
$GM_E0 = 6.3e-5;	# dimensionless # spectral level (Munk 1981)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    34
$GM_b  = 1300;		# m				# pycnocline e-folding scale
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    35
$GM_jstar = 3;		# dimless		# peak mode number
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    37
#======================================================================
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
# Vertical velocity spectral density
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
# Units: K.E. per frequency per wavenumber [m^2/s^2*1/s*1/m = m^3/s]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
# Version: GM79?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
# E. Kunze (email, Feb 2011): The GM vertical velocity w spectrum is described by
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
# S[w](omega, k_z) = PI*E_0*b*{f*sqrt(omega^2-f^2)/omega}*{j*/(k_z + k_z*)^2}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
# where E_0 = 6.3 x 10^-5 is the dimensionless spectral level, b = 1300 m is
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
# the pycnocline lengthscale, j* = 3 the peak mode number and k_z* the
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
# corresponding vertical wavenumber.  The flat log-log spectrum implies w is
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
# dominated by near-N frequencies (where we know very little though Yves
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
# Desaubies wrote some papers back in the late 70's/early 80's about the
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
# near-N peak) and low modes.  The rms w = 0.6 cm/s, right near your noise
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
# level.  Interestingly, the only N dependence is in m and m*.  As far
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
# as I know, little is known about its intermittency compared to horizontal
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
# velocity.  Since w WKB-scales inversely with N, the largest signals should
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
# be in the abyss where you therefore likely have the best chance of
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
# measuring it.
7
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    58
#
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    59
# E. Kunze (email, Sep 19, 2013):
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    60
#
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    61
# 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
    62
#
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    63
# 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
    64
#
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    65
# 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
    66
# 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
    67
# 5.3e-3 rad/s.
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    68
#
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    69
# NOTES:
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    70
#	- 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
    71
#	- k_z == m
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    72
#    
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
sub m($$)	# vertical wavenumber as a function of mode number & stratification params
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
	my($j,$N,$omega) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
    79
	return defined($omega) && ($omega <= $GM_N0)
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    80
		   ? $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
    81
		   : $pi * $j * $N / ($GM_b * $GM_N0);		# valid, except in vicinity of buoyancy turning frequency (Munk 1981, p.285)
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
sub B($)											# structure function (omega dependence)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
{													# NB: f must be defined
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
	my($omega) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
	croak("coriolis parameter not defined\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
		unless defined($f);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
	return 2 / $pi * $f / $omega / sqrt($omega**2 - $f**2);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
7
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    93
sub Sw(@)
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
{
10
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 7
diff changeset
    95
	my($omega,$m,$lat,$b,$jstar,$N) =
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 7
diff changeset
    96
		&antsFunUsage(-5,'fff','[frequency[1/s]] <vertical wavenumber[rad/m]> <lat[deg]> <N[rad/s]> <b[m]> <j*>',@_);
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    97
7
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    98
	if (defined($N)) {									# Sw(omega,m)
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    99
		local($f) = abs(&f($lat));
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   100
		$omega += $PRACTICALLY_ZERO if ($omega < $f);
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   101
		$omega -= $PRACTICALLY_ZERO if ($omega > $N);
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   102
		return nan if ($omega < $f || $omega > $N);
10
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 7
diff changeset
   103
		my($mstar) = &m($jstar,$N,$omega);
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 7
diff changeset
   104
		return $GM_E0 * $b * 2 * $f**2/$omega**2/B($omega) * $jstar / ($m+$mstar)**2;
7
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   105
	} else {											# Sw(m)
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   106
		$N = $lat;										# shift arguments to account for missing omega
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   107
		$lat = $m;
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   108
		local($f) = abs(&f($lat));
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   109
		$m = $omega;
f7b4692ad805 just before adding simplified layout/param definition
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   110
		undef($omega);
10
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 7
diff changeset
   111
		my($mstar) = &m($jstar,$N);
3dfa16523886 whoosher version
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 7
diff changeset
   112
		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
   113
	}
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   114
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   115
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   116
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   117
# GM76, as per Gregg and Kunze (JGR 1991)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   118
#	- beta is vertical wavenumber (m above)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   119
#----------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   121
sub Su($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   122
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   123
	my($beta,$N) = @_;
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   125
	my($beta_star) = &m($GM_jstar,$N);				# A3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   126
	return 3*$GM_E0*$GM_b**3*$GM_N0**2 / (2*$GM_jstar*$pi) / (1+$beta/$beta_star)**2;	# A2
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   127
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   128
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   129
sub Su_z($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   130
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   131
	my($beta,$N) = &antsFunUsage(2,'ff','<vertical wavenumber[rad/m]> <N[rad/s]>',@_);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   132
	return $beta**2 * &Su($beta,$N);
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
1;