after adding $pi and some other stuff
authorA.M. Thurnherr <athurnherr@yahoo.com>
Thu, 05 Sep 2013 21:55:15 +0000
changeset 4 ff72b00b4342
parent 3 55a8c407d38e
child 5 7d6e11d484ec
after adding $pi and some other stuff
INDEX
antsfilters.pl
antsusage.pl
antsutils.pl
libEOS83.pl
libGM.pl
libLADCP.pl
libstats.pl
--- a/INDEX
+++ b/INDEX
@@ -1,9 +1,9 @@
 ======================================================================
                     I N D E X 
                     doc: Wed Jun 18 09:46:58 1997
-                    dlm: Tue Oct 16 09:12:43 2012
+                    dlm: Mon Aug  5 12:16:56 2013
                     (c) 1997 Andreas Thurnherr
-                    uE-Info: 122 0 NIL 0 0 72 2 2 4 NIL ofnI
+                    uE-Info: 135 78 NIL 0 0 72 2 2 4 NIL ofnI
 ======================================================================
 
 NOTES:
@@ -114,6 +114,7 @@
 [crossings]!!!		get records when specific field val is crossed
 [data]!				get info about data
 [ded]				data editor
+[deglitch]!!!		remove very obvious data glitches
 [distfromtrack]!!!	calculate minimum perpendicular distance to piece-wise linear track
 [Echo]				ants versions of echo(1)
 [fileavg]!!!		avg, stddev files record-by-record
@@ -131,6 +132,7 @@
 [list]				list data and metadata
 [listNC]			list netcdf(1) data and metadata
 [merge]				merge files by matching numeric values
+[msplit]			split data file with monotonic key field at list of values
 [NCode]				encode ANTS to netcdf
 [resample]			resample data
 	[.interp.linear]		linear interpolation
@@ -141,8 +143,8 @@
 [reverse]			reverse order of records in file
 [scantext]			extract numbers from free-format text files
 [Sort]				sort data
-[Split]				split data file according to field value
-[splitCNV]			split ASCII SeaBird CNV file
+[Split]				split data file according to field value or # of records
+[splitCNV]			split ASCII SeaBird CNV file at list of elapsed times
 [splitNC]			extract multiple ANTS files from single netCDF
 [stackplots]		plot multiple files with offsets
 [subsample]			nearest-neighbors; does not need monotonic x field
--- a/antsfilters.pl
+++ b/antsfilters.pl
@@ -1,9 +1,9 @@
 #======================================================================
 #                    A N T S F I L T E R S . P L 
 #                    doc: Sun Mar 14 15:17:29 1999
-#                    dlm: Wed Jan  5 23:34:57 2011
+#                    dlm: Wed Feb 13 11:11:16 2013
 #                    (c) 1999 A.M. Thurnherr
-#                    uE-Info: 15 48 NIL 0 0 72 2 2 4 NIL ofnI
+#                    uE-Info: 38 97 NIL 0 0 72 2 2 4 NIL ofnI
 #======================================================================
 
 # HISTORY:
@@ -35,9 +35,8 @@
 		croak("$0: can't handle $ants_[$r][$xfnr] (x field)\n")
 			unless (numberp($ants_[$r][$xfnr]));
 		$cdx = $ants_[$r][$xfnr] - $ants_[$r-1][$xfnr];
-		croak("$0: input badly non-uniformly spaced " .
-			"(rec# $r is $ants_[$r][$xfnr]; previous is $ants_[$r-1][$xfnr];" .
-			" target difference is $dx)\n")
+		croak(sprintf("$0: input badly non-uniformly spaced: @ rec#%d dx=%g, %.1fx target dx=%g\n",
+						$r,$cdx,$cdx/$dx,$dx))
 			if (($dx > 0) && ($cdx > $fac*$dx || $cdx < $dx/$fac)) ||
 			   (($dx < 0) && ($cdx < $fac*$dx || $cdx > $dx/$fac));
 		$sdx += $cdx;
--- a/antsusage.pl
+++ b/antsusage.pl
@@ -2,9 +2,9 @@
 #======================================================================
 #                    A N T S U S A G E . P L 
 #                    doc: Fri Jun 19 13:43:05 1998
-#                    dlm: Mon Oct 29 12:08:54 2012
+#                    dlm: Tue Apr  2 22:26:55 2013
 #                    (c) 1998 A.M. Thurnherr
-#                    uE-Info: 153 62 NIL 0 0 70 2 2 4 NIL ofnI
+#                    uE-Info: 157 44 NIL 0 0 70 2 2 4 NIL ofnI
 #======================================================================
 
 # HISTORY:
@@ -151,6 +151,10 @@
 #						 existed)
 #	Feb 13, 2012: - antsNewFieldOpt simplified by using 2nd arg to fnrNoErr
 #	Oct 29, 2012: - diabled "no file" messages on special args
+#	Mar 29, 2013: - added support for $ANTSLIBS
+#	Apr  2, 2013: - BUG: pref{}suff special args did sometimes produce unexpanded as well
+#						 as expanded output (unexpanded should be produced only if the
+#						 expansion is empty)
 
 # NOTES:
 #	- ksh expands {}-arguments with commas in them!!! Use + instead
@@ -223,7 +227,6 @@
 		croak("$0: -N not supported (implementation restriction)\n")
 			if defined($opt_N);
 	}
-		
 
 	if ($eoo) {											# reset args
 		for ($i=0; $i<=$#ARGV; $i++) {
@@ -268,11 +271,13 @@
 		if (defined($opt_L)) {							# load libraries
 			foreach $lib (split(',',$opt_L)) {
 				if (-r "lib$lib.pl") {
-#					&antsInfo("loading ./lib$lib.pl");
 					require "lib$lib.pl";
+				} elsif (-r "$ANTS/lib$lib.pl") {
+					require "$ANTS/lib$lib.pl";
+				} elsif (-r "$ANTSLIBS/lib$lib.pl") {
+					require "$ANTSLIBS/lib$lib.pl";
 				} else {
-#					&antsInfo("loading $ANTS/lib$lib.pl"),
-					require "$ANTS/lib$lib.pl";
+					croak("$0: cannot load {.,$ANTS,$ANTSLIBS}/lib$lib.pl\n");
 				}
 			}
 		}
@@ -338,12 +343,13 @@
 	                }
 				} else {
 					my($f) = "$pref$range$suff";
+#					print(STDERR "f = $pref . $range . $suff\n");
 					if (-f $f) { push(@exp,$f); }
 #					else { &antsInfo("$ARGV[$ai]: no file <$f>"); }
 	            }
-				@exp = ($ARGV[$ai])						# make sure it *was* special arg
-					unless (@exp);
 	        }
+			@exp = ($ARGV[$ai])							# make sure it *was* special arg
+				unless (@exp);
 		} else {										# regular argument
 			next;
 		}
--- a/antsutils.pl
+++ b/antsutils.pl
@@ -2,9 +2,9 @@
 #======================================================================
 #                    A N T S U T I L S . P L 
 #                    doc: Fri Jun 19 23:25:50 1998
-#                    dlm: Wed Oct 24 09:56:52 2012
+#                    dlm: Thu Sep  5 21:53:55 2013
 #                    (c) 1998 A.M. Thurnherr
-#                    uE-Info: 259 43 NIL 0 0 70 10 2 4 NIL ofnI
+#                    uE-Info: 99 38 NIL 0 0 70 10 2 4 NIL ofnI
 #======================================================================
 
 # Miscellaneous auxillary functions
@@ -95,6 +95,8 @@
 #	May 16, 2012: - adapted to V5.0
 #	May 31, 2012: - changed ismember() semantics for use in psSamp
 #	Jun 12, 2012: - added &compactList()
+#	Dec 17, 2012: - added default to antsLoadModel()
+#	Sep  5, 2013: - FINALLY: added $pi
 
 # fnr notes:
 #	- matches field names starting with the string given, i.e. "sig" is
@@ -123,6 +125,8 @@
 # Number-related funs
 #----------------------------------------------------------------------
 
+$pi = 3.14159265358979;		# from $PI in [libvec.pl]
+
 $PRACTICALLY_ZERO = 1e-9;
 $SMALL_AMOUNT	  = 1e-6;
 
@@ -417,27 +421,27 @@
 # model-loading funs
 #----------------------------------------------------------------------
 
-sub antsLoadModel($$)
+sub antsLoadModel(...)
 {
-	my($opt,$pref) = @_;
+	my($opt,$pref,$default) = @_;
 	my($name);
 	
 	for ($a=0;											# find model name
 		 $a<=$#ARGV && !($ARGV[$a] =~ m/^-\S*$opt$/);
 		 $a++) { }
-	if ($a < $#ARGV) {									# found
-		$name = $ARGV[$a+1];							# load it
-		if (-r "$pref.$name") {							# local
-			&antsInfo("loading local $pref.$name...");
-			require "$pref.$name";
-			return $name;
-		} else {
-			my($path) = ($0 =~ m{^(.*)/[^/]*$});
-			require "$path/$pref.$name";
-			return $name;
-		}
-	}
-	return undef;
+	$name = ($a < $#ARGV) ? $ARGV[$a+1] : $default;		# use default if not found
+
+	return undef unless defined($name);
+
+	if (-r "$pref.$name") { 							# load in local directory
+		&antsInfo("loading local $pref.$name...");
+		require "$pref.$name";
+		return $name;
+	} else {											# load from ANTSlib 
+		my($path) = ($0 =~ m{^(.*)/[^/]*$});
+		require "$path/$pref.$name";
+		return $name;
+    }
 }
 
 sub antsLoadModelWithArgs($$)
--- a/libEOS83.pl
+++ b/libEOS83.pl
@@ -1,9 +1,9 @@
 #======================================================================
 #          L I B E O S 8 3 . P L 
 #          doc: Mon Mar  8 08:22:05 1999
-#          dlm: Thu Oct  6 11:44:00 2011
+#          dlm: Tue Feb  5 16:42:28 2013
 #          (c) 1999 A.M. Thurnherr
-#          uE-Info: 1 0 NIL 0 0 72 2 2 4 NIL ofnI
+#          uE-Info: 20 59 NIL 0 0 72 2 2 4 NIL ofnI
 #======================================================================
 
 # Perl Implementation of UNESCO Eqn of State 1983
@@ -17,7 +17,7 @@
 #	- no temperature scale assumed; set PARAM ITS=90|68
 #	- T90*1.00024=T68
 #	- check values calculated with T68
-#	- no conductivity unit assumed; set PARAM cond.unit=S/p|mS/cm
+#	- no conductivity unit assumed; set PARAM cond.unit=S/m|mS/cm
 
 # HISTORY:
 #	Mar 08, 1999: - translated by hand from krc
--- a/libGM.pl
+++ b/libGM.pl
@@ -1,9 +1,9 @@
 #======================================================================
 #                    L I B G M . P L 
 #                    doc: Sun Feb 20 14:43:47 2011
-#                    dlm: Fri Sep 14 12:35:40 2012
+#                    dlm: Sat Apr 20 20:05:51 2013
 #                    (c) 2011 A.M. Thurnherr
-#                    uE-Info: 61 0 NIL 0 0 72 2 2 4 NIL ofnI
+#                    uE-Info: 62 0 NIL 0 0 72 2 2 4 NIL ofnI
 #======================================================================
 
 # HISTORY:
@@ -17,6 +17,7 @@
 #	Mar 29, 2012: - re-wrote using definition of B(omega) from Munk (1981)
 #	Aug 23, 2012: - cosmetics?
 #	Sep  7, 2012: - made N0, E0, b, jstar global
+#	Dec 28, 2012: - added allowance for small roundoff error to Sw()
 
 require "$ANTS/libEOS83.pl";
 
@@ -58,7 +59,7 @@
 {
 	my($j,$N,$omega) = @_;
 
-	return defined($omega)
+	return defined($omega) && ($omega <= $GM_N0)
 		   ? $pi / $GM_b * sqrt(($N**2 - $omega**2) / ($GM_N0**2 - $omega**2)) * $j
 		   : $pi * $j * $N / ($GM_b * $GM_N0);			# valid, except in vicinity of buoyancy turning frequency (p. 285)
 }
@@ -77,6 +78,8 @@
 	my($omega,$m,$lat,$N) = &antsFunUsage(4,'fff','<frequency[1/s]> <vertical wavenumber[rad/m]> <lat[deg]> <N[rad/s]>',@_);
 
 	local($f) = abs(&f($lat));
+	$omega += $PRACTICALLY_ZERO if ($omega < $f);
+	$omega -= $PRACTICALLY_ZERO if ($omega > $N);
 	return nan if ($omega < $f || $omega > $N);
 
 	my($GM_b) = 1300; #m								# pycnocline lengthscale
--- a/libLADCP.pl
+++ b/libLADCP.pl
@@ -1,9 +1,9 @@
 #======================================================================
 #                    L I B L A D C P . P L 
 #                    doc: Wed Jun  1 20:38:19 2011
-#                    dlm: Thu Oct 25 21:24:59 2012
+#                    dlm: Wed Jun 26 11:47:45 2013
 #                    (c) 2011 A.M. Thurnherr
-#                    uE-Info: 22 41 NIL 0 0 70 2 2 4 NIL ofnI
+#                    uE-Info: 211 0 NIL 0 0 70 2 2 4 NIL ofnI
 #======================================================================
 
 # HISTORY:
@@ -19,7 +19,9 @@
 #	Aug 22, 2012: - added documentation
 #				  - added T_w()
 #	Sep 24, 2012: - made "k" argument default in T_w()
-#	Oct 25, 2012: - renamed T_SM to T_ASM
+#	Oct 25, 2012: - renamed T_SM() to T_ASM()
+#	Jun 26. 2013: - added T_w_z()
+#				  - added parameter checks to processing-specific corrections
 
 require "$ANTS/libvec.pl";
 require "$ANTS/libfuns.pl";
@@ -124,6 +126,8 @@
 {
 	my($k,$blen,$dz,$range_max) =
         &antsFunUsage(4,'ffff','<vertical wavenumber[rad/s]> <ADCP bin size[m]> <shear grid resolution[m]> <range max[m]>',@_);
+	croak("T_UH($k,$blen,$dz,$range_max): bad parameters\n")
+		unless ($k>=0 && $blen>0 && $dz>0 && $range_max>=0);				
     return T_ravg($k,$blen) * T_fdiff($k,$blen) * T_interp($k,$blen,$dz) * T_tilt($k,dprime($range_max));
 }
 
@@ -137,6 +141,8 @@
 {
 	my($k,$blen,$dz,$range_max) =
         &antsFunUsage(4,'ffff','<vertical wavenumber[rad/s]> <ADCP bin size[m]> <shear grid resolution[m]> <range max[m]>',@_);
+	croak("T_ASM($k,$blen,$dz,$range_max): bad parameters\n")
+		unless ($k>=0 && $blen>0 && $dz>0 && $range_max>=0);				
     return T_ravg($k,$blen) * T_fdiff($k,$blen) * T_binavg($k,$dz) * T_tilt($k,dprime($range_max));
 }
 
@@ -146,6 +152,7 @@
 #	- velocity inversion method of Visbeck (J. Tech., 2002)
 #	- only valid if pre-averaging into superensembles is used
 #	- range_max == 0 disables tilt correction
+#	- sel == nan disables pre-averaging correction
 #------------------------------------------------------------
 
 sub T_VI($$$$$)
@@ -159,6 +166,8 @@
 {
 	my($k,$blen,$sel,$dz,$dprime) =
         &antsFunUsage(5,'ff.ff','<vertical wavenumber[rad/s]> <ADCP bin size[m]> <superensemble size[m]|nan> <shear grid resolution[m]> <tilt d-prime[m]>',@_);
+	croak("T_VI_alt($k,$blen,$sel,$dz,$range_max): bad parameters\n")
+		unless ($k>=0 && $blen>0 && $sel ne '' && $dz>0 && $range_max>=0);				
 	croak("$0: tilt-dprime outside range [0..$blen]\n")
 		unless ($dprime>=0 && $dprime<=$blen);
     return ($sel>0) ? T_ravg($k,$blen) * T_binavg($k,$sel) * T_binavg($k,$dz) * T_tilt($k,$dprime)
@@ -178,8 +187,31 @@
 			&antsFunUsage(4,'ffff',
 				'[vertical wavenumber[rad/s]] <ADCP bin size[m]> <output grid resolution[m]> <range max[m]>',
 				\@fc,'k',undef,undef,undef,@_);
+		croak("T_w($k,$blen,$dz,$range_max): bad parameters\n")
+			unless ($k>=0 && $blen>0 && $dz>0 && $range_max>=0);				
 		return T_ravg($k,$blen) * T_binavg($k,$dz) * T_tilt($k,dprime($range_max));
 	}
 }
 
+#----------------------------------------------------------------------
+# T_w_z(k,blen,dz,range_max)
+#	- vertical-velocity method of Thurnherr (IEEE 2011)
+#	- first differencing of gridded shear to calculate dw/dz
+#	- NB: grid-scale differentiation assumed
+#	- range_max == 0 disables tilt correction
+#----------------------------------------------------------------------
+
+{ my(@fc);
+	sub T_w_z(@)
+	{
+		my($k,$blen,$dz,$range_max) =
+			&antsFunUsage(4,'ffff',
+				'[vertical wavenumber[rad/s]] <ADCP bin size[m]> <output grid resolution[m]> <range max[m]>',
+				\@fc,'k',undef,undef,undef,@_);
+		croak("T_w_z($k,$blen,$dz,$range_max): bad parameters\n")
+			unless ($k>=0 && $blen>0 && $dz>0 && $range_max>=0);				
+		return T_ravg($k,$blen) * T_binavg($k,$dz) * T_tilt($k,dprime($range_max)) * T_fdiff($k,$dz);
+	}
+}
+
 1;
--- a/libstats.pl
+++ b/libstats.pl
@@ -1,9 +1,9 @@
 #======================================================================
 #                    L I B S T A T S . P L 
 #                    doc: Wed Mar 24 13:59:27 1999
-#                    dlm: Mon Oct 15 10:34:21 2012
+#                    dlm: Mon Jun 10 21:10:04 2013
 #                    (c) 1999 A.M. Thurnherr
-#                    uE-Info: 90 30 NIL 0 0 72 2 2 4 NIL ofnI
+#                    uE-Info: 106 0 NIL 0 0 72 2 2 4 NIL ofnI
 #======================================================================
 
 # HISTORY:
@@ -102,6 +102,7 @@
 sub sum(@)
 {
 	my($N) = my($sum) = 0;
+	@_ = split(/\s+/,$_[0])	if (@_ == 1 && !numberp($_[0]));
 	for (my($i)=0; $i<=$#_; $i++) { $N++,$sum+=$_[$i] if (numberp($_[$i])); }
 	return ($N>0)?$sum:nan;
 }