libGM76.pl
changeset 39 56bdfe65a697
parent 38 15c603bc4f70
--- a/libGM76.pl
+++ b/libGM76.pl
@@ -1,9 +1,9 @@
 #======================================================================
 #                    L I B G M 7 6 . P L 
 #                    doc: Sun Feb 20 14:43:47 2011
-#                    dlm: Sat Feb  2 02:33:11 2019
+#                    dlm: Sat Apr  6 19:33:05 2019
 #                    (c) 2011 A.M. Thurnherr
-#                    uE-Info: 144 43 NIL 0 0 70 2 2 4 NIL ofnI
+#                    uE-Info: 34 48 NIL 0 0 70 2 2 4 NIL ofnI
 #======================================================================
 
 # HISTORY:
@@ -27,7 +27,11 @@
 #				  - added GM_strain
 #				  - BUG: Sw usage message had wrong parameter order
 #				  - renamed Sw => GM_VKE; Su_z => GM_shear
-
+#	Mar 31, 2019: - updated doc for shear and strain spectra
+#	Apr  1, 2019: - added GM_vdiv
+#	Apr  5, 2019: - BUG: GM_VKE was erroneous (argument shifting was wrong)
+#				  - adapted to improved antsFunUsage()
+#	Apr  6, 2019: - fiddled during debugging of fs_finestructure issue
 
 require "$ANTS/libEOS83.pl";
 
@@ -100,7 +104,7 @@
 sub GM_VKE(@)
 {
 	my($omega,$m,$lat,$b,$jstar,$N) =
-		&antsFunUsage(-5,'fff','[frequency[1/s]] <vertical wavenumber[rad/m]> <lat[deg]> <b[m]> <j*> <N[rad/s]>',@_);
+		&antsFunUsage(-5,'fffff','GM_VKE([frequency[1/s]] <vertical wavenumber[rad/m]> <lat[deg]> <b[m]> <j*> <N[rad/s]>)',@_);
 
 	if (defined($N)) {									# Sw(omega,m)
 		local($f) = abs(&f($lat));
@@ -110,8 +114,8 @@
 		my($mstar) = &m($jstar,$N,$omega);
 		return $GM_E0 * $b * 2 * $f**2/$omega**2/B($omega) * $jstar / ($m+$mstar)**2;
 	} else {											# Sw(m), i.e. integrated over all omega; as in Thurnherr et al., GRL 2015
-		$N = $lat;										# shift arguments to account for missing omega
-		$lat = $m;
+		$N = $jstar;  $jstar = $b;						# shift arguments to account for missing omega
+		$b = $lat; $lat = $m;
 		local($f) = abs(&f($lat));
 		$m = $omega;
 		undef($omega);
@@ -121,15 +125,38 @@
 }
 
 #----------------------------------------------------------------------
+# Vertical Divergence (normalized by N)
+#	- implemented to investigate shear-to-vertical divergence ratio
+#	- S[w_z/N] = S[w_z] / N^2 = S[w] * m^2 / N^2
+#	- GM shear-to-vd variance ratio = 3N/2f
+#	- GM strain-to-vd variance ratio = N/2f
+#----------------------------------------------------------------------
+
+sub GM_vdiv(@)
+{
+	my($m,$lat,$b,$jstar,$N) =
+		&antsFunUsage(5,'fffff','GM_vdiv(<vertical wavenumber[rad/m]> <lat[deg]> <b[m]> <j*> <N[rad/s]>)',@_);
+	return GM_VKE($m,$lat,$b,$jstar,$N) * $m**2 / $N**2;
+}
+
+#----------------------------------------------------------------------
 # Shear and Strain m-spectra (i.e. integrated over f)
+#	- shear is buoyancy-frequency normalized
 #	- spectral density
-#	- from Thurnherr et al. (GRL 2015)
+#	- from Thurnherr et al. (GRL 2015), which is from email info
+#	  Eric Kunze, 04/22/2015: First, the standard GHP parameterization that I
+#	  implement uses either the N-normalized shear or strain spectra. The GM
+#	  versions of these are
+#		S[V_z/N](m) = (3*PI/2)*E0*b*jstar*m^2/(m+mstar)^2 and
+#		S[Z_z](m) = (PI/2)*E0*b*jstar*m^2/(m+mstar)^2
+#	  though in practice mstar is not particularly important because the
+#	  variance of both these quantities is dominated by high m.
 #----------------------------------------------------------------------
 
 sub GM_shear(@)
 {
 	my($m,$lat,$b,$jstar,$N) =
-		&antsFunUsage(5,'fffff','<vertical wavenumber[rad/m]> <lat[deg]> <b[m]> <j*> <N[rad/s]>',@_);
+		&antsFunUsage(5,'fffff','GM_shear(<vertical wavenumber[rad/m]> <lat[deg]> <b[m]> <j*> <N[rad/s]>)',@_);
 	local($f) = abs(&f($lat));
 	my($mstar) = &m($jstar,$N);
 	return 3 * $pi/2 * $GM_E0 * $b * $jstar * $m**2 / ($m+$mstar)**2;
@@ -138,7 +165,7 @@
 sub GM_strain(@)
 {
 	my($m,$lat,$b,$jstar,$N) =
-		&antsFunUsage(5,'fffff','<vertical wavenumber[rad/m]> <lat[deg]> <b[m]> <j*> <N[rad/s]>',@_);
+		&antsFunUsage(5,'fffff','GM_strain(<vertical wavenumber[rad/m]> <lat[deg]> <b[m]> <j*> <N[rad/s]>)',@_);
 	local($f) = abs(&f($lat));
 	my($mstar) = &m($jstar,$N);
 	return $pi/2 * $GM_E0 * $b * $jstar * $m**2 / ($m+$mstar)**2;