1 #====================================================================== |
1 #====================================================================== |
2 # L I B G M . P L |
2 # L I B G M . P L |
3 # doc: Sun Feb 20 14:43:47 2011 |
3 # doc: Sun Feb 20 14:43:47 2011 |
4 # dlm: Mon Oct 6 09:48:22 2014 |
4 # dlm: Tue Nov 18 12:42:30 2014 |
5 # (c) 2011 A.M. Thurnherr |
5 # (c) 2011 A.M. Thurnherr |
6 # uE-Info: 21 10 NIL 0 0 70 2 2 4 NIL ofnI |
6 # uE-Info: 22 53 NIL 0 0 70 2 2 4 NIL ofnI |
7 #====================================================================== |
7 #====================================================================== |
8 |
8 |
9 # HISTORY: |
9 # HISTORY: |
10 # Feb 20, 2011: - created |
10 # Feb 20, 2011: - created |
11 # Feb 28, 2011: - cosmetics |
11 # Feb 28, 2011: - cosmetics |
17 # Mar 29, 2012: - re-wrote using definition of B(omega) from Munk (1981) |
17 # Mar 29, 2012: - re-wrote using definition of B(omega) from Munk (1981) |
18 # Aug 23, 2012: - cosmetics? |
18 # Aug 23, 2012: - cosmetics? |
19 # Sep 7, 2012: - made N0, E0, b, jstar global |
19 # Sep 7, 2012: - made N0, E0, b, jstar global |
20 # Dec 28, 2012: - added allowance for small roundoff error to Sw() |
20 # Dec 28, 2012: - added allowance for small roundoff error to Sw() |
21 # Oct 6, 2014: - made omega optional in Sw() |
21 # Oct 6, 2014: - made omega optional in Sw() |
|
22 # Nov 18, 2014: - made b & jstar mandatory for Sw() |
22 |
23 |
23 require "$ANTS/libEOS83.pl"; |
24 require "$ANTS/libEOS83.pl"; |
24 |
25 |
25 my($pi) = 3.14159265358979; |
26 my($pi) = 3.14159265358979; |
26 |
27 |
89 } |
90 } |
90 |
91 |
91 |
92 |
92 sub Sw(@) |
93 sub Sw(@) |
93 { |
94 { |
94 my($omega,$m,$lat,$N) = &antsFunUsage(-3,'fff','[frequency[1/s]] <vertical wavenumber[rad/m]> <lat[deg]> <N[rad/s]>',@_); |
95 my($omega,$m,$lat,$b,$jstar,$N) = |
95 my($GM_b) = 1300; #m # pycnocline lengthscale |
96 &antsFunUsage(-5,'fff','[frequency[1/s]] <vertical wavenumber[rad/m]> <lat[deg]> <N[rad/s]> <b[m]> <j*>',@_); |
96 |
97 |
97 if (defined($N)) { # Sw(omega,m) |
98 if (defined($N)) { # Sw(omega,m) |
98 local($f) = abs(&f($lat)); |
99 local($f) = abs(&f($lat)); |
99 $omega += $PRACTICALLY_ZERO if ($omega < $f); |
100 $omega += $PRACTICALLY_ZERO if ($omega < $f); |
100 $omega -= $PRACTICALLY_ZERO if ($omega > $N); |
101 $omega -= $PRACTICALLY_ZERO if ($omega > $N); |
101 return nan if ($omega < $f || $omega > $N); |
102 return nan if ($omega < $f || $omega > $N); |
102 my($mstar) = &m($GM_jstar,$N,$omega); |
103 my($mstar) = &m($jstar,$N,$omega); |
103 return $GM_E0 * $GM_b * 2 * $f**2/$omega**2/B($omega) * $GM_jstar / ($m+$mstar)**2; |
104 return $GM_E0 * $b * 2 * $f**2/$omega**2/B($omega) * $jstar / ($m+$mstar)**2; |
104 } else { # Sw(m) |
105 } else { # Sw(m) |
105 $N = $lat; # shift arguments to account for missing omega |
106 $N = $lat; # shift arguments to account for missing omega |
106 $lat = $m; |
107 $lat = $m; |
107 local($f) = abs(&f($lat)); |
108 local($f) = abs(&f($lat)); |
108 $m = $omega; |
109 $m = $omega; |
109 undef($omega); |
110 undef($omega); |
110 my($mstar) = &m($GM_jstar,$N); |
111 my($mstar) = &m($jstar,$N); |
111 return $pi * $GM_E0 * $GM_b * $N * $f * $GM_jstar / ($m+$mstar)**2; |
112 return $pi * $GM_E0 * $b * $N * $f * $jstar / ($m+$mstar)**2; |
112 } |
113 } |
113 } |
114 } |
114 |
115 |
115 #---------------------------------------------------------------------- |
116 #---------------------------------------------------------------------- |
116 # GM76, as per Gregg and Kunze (JGR 1991) |
117 # GM76, as per Gregg and Kunze (JGR 1991) |