.
authorA.M. Thurnherr <ant@ldeo.columbia.edu>
Sun, 19 Feb 2012 22:49:45 -0500
changeset 7 e67ddf9937eb
parent 6 2cc7f3b110af
child 8 88ba92d0e30c
.
LADCPintsh
LADCPproc
LADCPproc.UHcode
--- a/LADCPintsh
+++ b/LADCPintsh
@@ -2,9 +2,9 @@
 #======================================================================
 #                    L A D C P I N T S H 
 #                    doc: Thu Oct 14 21:22:50 2010
-#                    dlm: Wed Jul 27 18:51:49 2011
+#                    dlm: Sun Feb 19 22:49:28 2012
 #                    (c) 2010 A.M. Thurnherr & E. Firing
-#                    uE-Info: 221 0 NIL 0 0 72 2 2 4 NIL ofnI
+#                    uE-Info: 50 93 NIL 0 0 72 2 2 4 NIL ofnI
 #======================================================================
 
 $antsSummary = 'integrate LADCP shear';
@@ -17,7 +17,9 @@
 #	  not been implemented (yet?)
 #	- low-pass-filtered shear code has not yet been implemented
 #	- currently, shear gaps are assumed to have vanishing shear;
-#	  better solutions are possible 
+#	  better solutions are possible
+#	- elapsed time is simply copied from shear elapsed time (i.e.
+#	  it is not interpolated onto the new depth grid)
 
 # WEIRDNESSES IN Eric's CODE:
 #	- in Eric's [avg_sh.m] the calculation of output shear stddev incorrectly assumes that the 4th column
@@ -43,6 +45,9 @@
 #				  - removed shear sigma output
 #				  - replaced ndata by nsamp
 #				  - removed -w (Eric's way of dealing with dc/uc temporal variability)
+#	Feb 19, 2012: - added processing of elapsed time
+#				  - adapted to new shear file layout (nsamp instead of nshear)
+#				  - BUG: uplooker data was not used for downcasts and and only partially for combo data
 
 ($ANTS) = (`which list` =~ m{^(.*)/[^/]*$});
 require "$ANTS/ants.pl";
@@ -61,7 +66,6 @@
 
 &antsCardOpt(\$opt_n,10);	## minimum number of samples for shear
 &antsCardOpt(\$opt_m,10);	# minimum number of samples for BT data
-#&antsCardOpt(\$opt_s,20);	## minimum number of samples for smoothed shear
 
 &antsFileOpt($opt_b);		# BT file
 
@@ -86,33 +90,31 @@
 }
 	
 
-$depthF = fnr('depth');				# layout of [LADCPproc] output
-$dc_nshF = fnr('dc_nshear');
+$depthF = fnr('depth');									# layout of [LADCPproc] output
+$dc_nshF = fnrNoErr('dc_nshear');
+$dc_nshF = fnr('dc_nsamp') unless defined($dc_nshF);
 $dc_uzF  = fnr('dc_u_z');
 $dc_uzsF = fnrNoErr('dc_u_z.sig');
-$dc_uzsF = fnr('dc_u_z_sig')
-	unless defined($dc_uzsF);
+$dc_uzsF = fnr('dc_u_z_sig') unless defined($dc_uzsF);
 $dc_vzF  = fnr('dc_v_z');
 $dc_vzsF = fnrNoErr('dc_v_z.sig');
-$dc_vzsF = fnr('dc_v_z_sig')
-	unless defined($dc_vzsF);
+$dc_vzsF = fnr('dc_v_z_sig') unless defined($dc_vzsF);
 $dc_wzF  = fnr('dc_w_z');
 $dc_wzsF = fnrNoErr('dc_w_z.sig');
-$dc_wzsF = fnr('dc_w_z_sig')
-	unless defined($dc_wzsF);
-$uc_nshF = fnr('uc_nshear');
+$dc_wzsF = fnr('dc_w_z_sig') unless defined($dc_wzsF);
+$dc_elapsedF = fnr('dc_elapsed');
+$uc_nshF = fnrNoErr('uc_nshear');
+$uc_nshF = fnr('uc_nsamp') unless defined($uc_nshF);
 $uc_uzF  = fnr('uc_u_z');
 $uc_uzsF = fnrNoErr('uc_u_z.sig');
-$uc_uzsF = fnr('uc_u_z_sig')
-	unless defined($uc_uzsF);
+$uc_uzsF = fnr('uc_u_z_sig') unless defined($uc_uzsF);
 $uc_vzF  = fnr('uc_v_z');
 $uc_vzsF = fnrNoErr('uc_v_z.sig');
-$uc_vzsF = fnr('uc_v_z_sig')
-	unless defined($uc_vzsF);
+$uc_vzsF = fnr('uc_v_z_sig') unless defined($uc_vzsF);
 $uc_wzF  = fnr('uc_w_z');
 $uc_wzsF = fnrNoErr('uc_w_z.sig');
-$uc_wzsF = fnr('uc_w_z_sig')
-	unless defined($uc_wzsF);
+$uc_wzsF = fnr('uc_w_z_sig') unless defined($uc_wzsF);
+$uc_elapsedF = fnr('uc_elapsed');
 
 my(@gaps); my($curGap) = 0;
 
@@ -147,21 +149,24 @@
 		if ($dc_nsamp > 0) {								# downcast shear
 			my($DLf) = $ants_[0][$dc_nshF] / $dc_nsamp;
 			my($ULf) =      $UL_[$dc_nshF] / $dc_nsamp;
-			if ($DLf>0 && $Ulf>0) {
+			if ($DLf>0 && $ULf>0) {
 				$dc_uz[$r] = $DLf*$ants_[0][$dc_uzF] + $ULf*$UL_[$dc_uzF];
 				$dc_vz[$r] = $DLf*$ants_[0][$dc_vzF] + $ULf*$UL_[$dc_vzF];
 	            $dc_wz[$r] = $DLf*$ants_[0][$dc_wzF] + $ULf*$UL_[$dc_wzF];
+	            $dc_elapsed[$r] = $DLf*$ants_[0][$dc_elapsedF] + $ULf*$UL_[$dc_elapsedF];
 	        } elsif ($DLf > 0) {
 				$dc_uz[$r] = $ants_[0][$dc_uzF];
 				$dc_vz[$r] = $ants_[0][$dc_vzF];
 				$dc_wz[$r] = $ants_[0][$dc_wzF];
+				$dc_elapsed[$r] = $ants_[0][$dc_elapsedF];
 	        } else {
 				$dc_uz[$r] = $UL_[$dc_uzF];
 				$dc_vz[$r] = $UL_[$dc_vzF];
 				$dc_wz[$r] = $UL_[$dc_wzF];
+				$dc_elapsed[$r] = $UL_[$dc_elapsedF];
 	        }
 		} else {
-			$dc_uz[$r] = $dc_vz[$r] = $dc_wz[$r] = nan;
+			$dc_uz[$r] = $dc_vz[$r] = $dc_wz[$r] = $dc_elapsed[$r] = nan;
 	    }
 		if ($uc_nsamp > 0) {								# upcast shear
 			my($DLf) = $ants_[0][$uc_nshF] / $uc_nsamp;
@@ -170,32 +175,37 @@
 				$uc_uz[$r] = $DLf*$ants_[0][$uc_uzF] + $ULf*$UL_[$uc_uzF];
 				$uc_vz[$r] = $DLf*$ants_[0][$uc_vzF] + $ULf*$UL_[$uc_vzF];
 				$uc_wz[$r] = $DLf*$ants_[0][$uc_wzF] + $ULf*$UL_[$uc_wzF];
+				$uc_elapsed[$r] = $DLf*$ants_[0][$uc_elapsedF] + $ULf*$UL_[$uc_elapsedF];
 	        } elsif ($DLf > 0) {
 				$uc_uz[$r] = $ants_[0][$uc_uzF];
 				$uc_vz[$r] = $ants_[0][$uc_vzF];
 				$uc_wz[$r] = $ants_[0][$uc_wzF];
+				$uc_elapsed[$r] = $ants_[0][$uc_elapsedF];
 	        } else {
 				$uc_uz[$r] = $UL_[$uc_uzF];
 				$uc_vz[$r] = $UL_[$uc_vzF];
 				$uc_wz[$r] = $UL_[$uc_wzF];
+				$uc_elapsed[$r] = $UL_[$uc_elapsedF];
 	        }
 		} else {
-			$uc_uz[$r] = $uc_vz[$r] = $uc_wz[$r] = nan;
+			$uc_uz[$r] = $uc_vz[$r] = $uc_wz[$r] = $uc_elapsed[$r] = nan;
 	    }
 	} else {	# downlooker only
 		if ($dc_nsamp > 0) {							# downcast shear
 			$dc_uz[$r] = $ants_[0][$dc_uzF];
 			$dc_vz[$r] = $ants_[0][$dc_vzF];
 			$dc_wz[$r] = $ants_[0][$dc_wzF];
+			$dc_elapsed[$r] = $ants_[0][$dc_elapsedF];
 		} else {
-			$dc_uz[$r] = $dc_vz[$r] = $dc_wz[$r] = nan;
+			$dc_uz[$r] = $dc_vz[$r] = $dc_wz[$r] = $dc_elapsed[$r] = nan;
 	    }
 		if ($uc_nsamp > 0) {							# upcast shear
 			$uc_uz[$r] = $ants_[0][$uc_uzF];
 			$uc_vz[$r] = $ants_[0][$uc_vzF];
 			$uc_wz[$r] = $ants_[0][$uc_wzF];
+			$uc_elapsed[$r] = $ants_[0][$uc_elapsedF];
 		} else {
-			$uc_uz[$r] = $uc_vz[$r] = $uc_wz[$r] = nan;
+			$uc_uz[$r] = $uc_vz[$r] = $uc_wz[$r] = $uc_elapsed[$r] = nan;
 	    }
     }
     
@@ -206,17 +216,20 @@
 			$uz[$r] = $dcf*$dc_uz[$r] + $ucf*$uc_uz[$r];
 			$vz[$r] = $dcf*$dc_vz[$r] + $ucf*$uc_vz[$r];
             $wz[$r] = $dcf*$dc_wz[$r] + $ucf*$uc_wz[$r];
+            $elapsed[$r] = $dcf*$dc_elapsed[$r] + $ucf*$uc_elapsed[$r];
         } elsif ($dcf > 0) {
 			$uz[$r] = $dc_uz[$r];
 			$vz[$r] = $dc_vz[$r];
 			$wz[$r] = $dc_wz[$r];
+			$elapsed[$r] = $dc_elapsed[$r];
         } else {
 			$uz[$r] = $uc_uz[$r];
 			$vz[$r] = $uc_vz[$r];
 			$wz[$r] = $uc_wz[$r];
+			$elapsed[$r] = $uc_elapsed[$r];
         }
 	} else {
-		$uz[$r] = $vz[$r] = $wz[$r] = nan;
+		$uz[$r] = $vz[$r] = $wz[$r] = $elapsed[$r] = nan;
 	}
 
 	if (numberp($uz[$r]) && $curGap>0) {						# end of gap
@@ -490,15 +503,15 @@
 # Output Velocity Profile
 #======================================================================
 
-@antsNewLayout = ('depth','u','v','w','nsamp',
-				  'dc_u','dc_v','dc_w','dc_nsamp',
-				  'uc_u','uc_v','uc_w','uc_nsamp');
+@antsNewLayout = ('depth','elapsed','u','v','w','nsamp',
+				  'dc_elapsed','dc_u','dc_v','dc_w','dc_nsamp',
+				  'uc_elapsed','uc_u','uc_v','uc_w','uc_nsamp');
 
 for (my($r)=0; $r<@depth; $r++) {
 	&antsOut($depth[$r]+$DZ/2,
-			 $u[$r],$v[$r],$w[$r],$nsamp[$r],
-			 $dc_u[$r],$dc_v[$r],$dc_w[$r],$dc_nsamp[$r],
-			 $uc_u[$r],$uc_v[$r],$uc_w[$r],$uc_nsamp[$r]);
+			 $elapsed[$r],$u[$r],$v[$r],$w[$r],$nsamp[$r],
+			 $dc_elapsed[$r],$dc_u[$r],$dc_v[$r],$dc_w[$r],$dc_nsamp[$r],
+			 $uc_elapsed[$r],$uc_u[$r],$uc_v[$r],$uc_w[$r],$uc_nsamp[$r]);
 }
 
 #======================================================================
@@ -506,16 +519,16 @@
 #======================================================================
 
 if (defined($opt_s)) {
-	@antsNewLayout = ('depth','u_z','v_z','w_z','u_z.sig','v_z.sig','w_z.sig','nsamp',
-							  'dc_u_z','dc_v_z','dc_w_z','dc_u_z.sig','dc_v_z.sig','dc_w_z.sig','dc_nsamp',
-							  'uc_u_z','uc_v_z','uc_w_z','uc_u_z.sig','uc_v_z.sig','uc_w_z.sig','uc_nsamp');
+	@antsNewLayout = ('depth','elapsed','u_z','v_z','w_z','u_z.sig','v_z.sig','w_z.sig','nsamp',
+							  'dc_elapsed','dc_u_z','dc_v_z','dc_w_z','dc_u_z.sig','dc_v_z.sig','dc_w_z.sig','dc_nsamp',
+							  'uc_elapsed','uc_u_z','uc_v_z','uc_w_z','uc_u_z.sig','uc_v_z.sig','uc_w_z.sig','uc_nsamp');
 	&antsOut('EOF');
     close(STDOUT);
 	open(STDOUT,">$opt_s") || croak("$opt_s: $!\n");
 	for (my($r)=0; $r<@depth; $r++) {
-		&antsOut($depth[$r],$uz[$r],$vz[$r],$wz[$r],$uzsig[$r],$vzsig[$r],$wzsig[$r],$nsamp[$r],
-			     $dc_uz[$r],$dc_vz[$r],$dc_wz[$r],$dc_uzsig[$r],$dc_vzsig[$r],$dc_wzsig[$r],$dc_nsamp[$r],
-			     $uc_uz[$r],$uc_vz[$r],$uc_wz[$r],$uc_uzsig[$r],$uc_vzsig[$r],$uc_wzsig[$r],$uc_nsamp[$r]);
+		&antsOut($depth[$r],$elapsed[$r],$uz[$r],$vz[$r],$wz[$r],$uzsig[$r],$vzsig[$r],$wzsig[$r],$nsamp[$r],
+			     $dc_elapsed[$r],$dc_uz[$r],$dc_vz[$r],$dc_wz[$r],$dc_uzsig[$r],$dc_vzsig[$r],$dc_wzsig[$r],$dc_nsamp[$r],
+			     $uc_elapsed[$r],$uc_uz[$r],$uc_vz[$r],$uc_wz[$r],$uc_uzsig[$r],$uc_vzsig[$r],$uc_wzsig[$r],$uc_nsamp[$r]);
 	}
 }
 
--- a/LADCPproc
+++ b/LADCPproc
@@ -2,9 +2,9 @@
 #======================================================================
 #                    L A D C P P R O C 
 #                    doc: Thu Sep 16 20:36:10 2010
-#                    dlm: Sun Feb  5 12:28:54 2012
+#                    dlm: Sun Feb 19 22:37:57 2012
 #                    (c) 2010 A.M. Thurnherr & E. Firing
-#                    uE-Info: 61 44 NIL 0 0 72 2 2 4 NIL ofnI
+#                    uE-Info: 65 88 NIL 0 0 72 2 2 4 NIL ofnI
 #======================================================================
 
 $antsSummary = 'process LADCP data to get shear, time series';
@@ -59,6 +59,10 @@
 #				  - added $CTD{first_elapsed}
 #	Jul 27, 2011: - replaced ndata by nsamp
 #	Feb  5, 2012: - added profile max depth consistency check
+#	Feb 19, 2912: - added elapsed time to shear profile output
+#				  - replaced "nshear" output field by "nsamp"
+#				  - BUG: bottom of profiles was incorrect when dc max depth > uc max depth
+#				  - BUG: profile depth consistency check did not work for partial-depth yoyo casts
 
 ($ANTS) 	  = (`which list` =~ m{^(.*)/[^/]*$});
 ($PERL_TOOLS) = (`which mkProfile` =~ m{^(.*)/[^/]*$});
@@ -205,18 +209,23 @@
 print(STDERR "\n\t\t$pSpikes pressure spikes removed")
 	if ($pSpikes>0 && $opt_d);
 
-#------------------------------------
-# calculate w and find deepest record
-#------------------------------------
+#--------------------------------------------------
+# calculate w and find deepest & shallowest records
+#--------------------------------------------------
 $CTD{maxpress} = -9e99;
+$CTD{minpress} =  9e99;
 for (my($r)=1; $r<@{$CTD{press}}-1; $r++) {
 	$CTD{w}[$r] = 0.99*($CTD{press}[$r+1] - $CTD{press}[$r-1]) / (2*$CTD{sampint});
 	if ($CTD{press}[$r] > $CTD{maxpress}) {
 		$CTD{maxpress} = $CTD{press}[$r];
 		$CTD{atbottom} = $r;
     }										
+	if ($CTD{press}[$r] < $CTD{minpress}) {
+		$CTD{minpress} = $CTD{press}[$r];
+		$CTD{attop} = $r;
+    }										
 }
-printf(STDERR "\n\t\tmax pressure [%ddbar] at scan#%d",$CTD{maxpress},$CTD{atbottom})
+printf(STDERR "\n\t\tmin/max pressure [%d/%ddbar] at scans#%d/%d",$CTD{minpress},$CTD{maxpress},$CTD{attop},$CTD{atbottom})
 	if $opt_d;
 
 #----------------------------------------------------------------------
@@ -306,9 +315,9 @@
 
 print(STDERR "\n");
 
-croak(sprintf("$0: LADCP bottom depth (%dm) inconsistent with max CTD pressure (%ddbar)\n",
-		$LADCP{ENSEMBLE}[$LADCP_bottom]->{DEPTH},$CTD{maxpress}))
-	if (abs($LADCP{ENSEMBLE}[$LADCP_bottom]->{DEPTH}-$CTD{maxpress})/$CTD{maxpress} > 0.05);
+croak(sprintf("$0: LADCP profile depth range (%dm) inconsistent with max CTD pressure range (%ddbar)\n",
+		$LADCP{ENSEMBLE}[$LADCP_bottom]->{DEPTH},$CTD{maxpress}-$CTD{minpress}))
+	if (abs($LADCP{ENSEMBLE}[$LADCP_bottom]->{DEPTH}-($CTD{maxpress}-$CTD{minpress}))/($CTD{maxpress}-$CTD{minpress}) > 0.1);
 
 #----------------------------------------------------------------------
 # Step 5: Add CTD to LADCP Data & correct velocities for sound speed
@@ -501,6 +510,7 @@
 @dc_ush_mu = @ush_mu; @dc_ush_sig = @ush_sig;
 @dc_vsh_mu = @vsh_mu; @dc_vsh_sig = @vsh_sig;
 @dc_wsh_mu = @wsh_mu; @dc_wsh_sig = @wsh_sig;
+@dc_esh_mu = @esh_mu;
 
 print(STDERR "\n\tupcast...") if ($opt_d);
 edit_velocity($LADCP_end,$LADCP_bottom);							# upcast
@@ -511,28 +521,31 @@
 @uc_ush_mu = @ush_mu; @uc_ush_sig = @ush_sig;
 @uc_vsh_mu = @vsh_mu; @uc_vsh_sig = @vsh_sig;
 @uc_wsh_mu = @wsh_mu; @uc_wsh_sig = @wsh_sig;
+@uc_esh_mu = @esh_mu;
 
 print(STDERR "\n\tcombined...") if ($opt_d);
-for (my($gi)=0; $gi<@dc_ush_mu; $gi++) {
-	if ($dc_sh_n[$gi]>0 && $uc_sh_n[$gi]>0) {
+my($nsh) = (@dc_ush_mu > @uc_ush_mu) ? scalar(@dc_ush_mu) : scalar(@uc_ush_mu);
+for (my($gi)=0; $gi<$nsh; $gi++) {
+	if (($gi<@dc_ush_mu&&$dc_sh_n[$gi]>0) && ($gi<@uc_ush_mu&&$uc_sh_n[$gi]>0)) {
 		$sh_n[$gi] = $dc_sh_n[$gi] + $uc_sh_n[$gi];
 		$ush_mu[$gi] = ($dc_sh_n[$gi]*$dc_ush_mu[$gi] + $uc_sh_n[$gi]*$uc_ush_mu[$gi]) / $sh_n[$gi];
 		$vsh_mu[$gi] = ($dc_sh_n[$gi]*$dc_vsh_mu[$gi] + $uc_sh_n[$gi]*$uc_vsh_mu[$gi]) / $sh_n[$gi];
 		$wsh_mu[$gi] = ($dc_sh_n[$gi]*$dc_wsh_mu[$gi] + $uc_sh_n[$gi]*$uc_wsh_mu[$gi]) / $sh_n[$gi];
+		$esh_mu[$gi] = ($dc_sh_n[$gi]*$dc_esh_mu[$gi] + $uc_sh_n[$gi]*$uc_esh_mu[$gi]) / $sh_n[$gi];
 		$ush_sig[$gi] = sqrt(($dc_sh_n[$gi]*$dc_ush_sig[$gi]**2 + $uc_sh_n[$gi]*$uc_ush_sig[$gi]**2) / $sh_n[$gi]);
 		$vsh_sig[$gi] = sqrt(($dc_sh_n[$gi]*$dc_vsh_sig[$gi]**2 + $uc_sh_n[$gi]*$uc_vsh_sig[$gi]**2) / $sh_n[$gi]);
 		$wsh_sig[$gi] = sqrt(($dc_sh_n[$gi]*$dc_wsh_sig[$gi]**2 + $uc_sh_n[$gi]*$uc_wsh_sig[$gi]**2) / $sh_n[$gi]);
-	} elsif ($dc_sh_n[$gi] > 0) {
+	} elsif ($gi < @dc_ush_mu && $dc_sh_n[$gi] > 0) {
 		$sh_n[$gi] = $dc_sh_n[$gi];
-		$ush_mu[$gi]  = $dc_ush_mu[$gi];  $vsh_mu[$gi]  = $dc_vsh_mu[$gi];  $wsh_mu[$gi]  = $dc_wsh_mu[$gi];
-		$ush_sig[$gi] = $dc_ush_sig[$gi]; $vsh_sig[$gi] = $dc_vsh_sig[$gi]; $wsh_sig[$gi] = $dc_wsh_sig[$gi];
-	} elsif ($uc_sh_n[$gi] > 0) {
+		$ush_mu[$gi]  = $dc_ush_mu[$gi];  $vsh_mu[$gi]  = $dc_vsh_mu[$gi];  $wsh_mu[$gi]  = $dc_wsh_mu[$gi];  $esh_mu[$gi]  = $dc_esh_mu[$gi];
+		$ush_sig[$gi] = $dc_ush_sig[$gi]; $vsh_sig[$gi] = $dc_vsh_sig[$gi]; $wsh_sig[$gi] = $dc_wsh_sig[$gi]; 
+	} elsif ($gi < @uc_ush_mu && $uc_sh_n[$gi] > 0) {
 		$sh_n[$gi] = $uc_sh_n[$gi];
-		$ush_mu[$gi]  = $uc_ush_mu[$gi];  $vsh_mu[$gi]  = $uc_vsh_mu[$gi];  $wsh_mu[$gi]  = $uc_wsh_mu[$gi];
-		$ush_sig[$gi] = $uc_ush_sig[$gi]; $vsh_sig[$gi] = $uc_vsh_sig[$gi]; $wsh_sig[$gi] = $uc_wsh_sig[$gi];
+		$ush_mu[$gi]  = $uc_ush_mu[$gi];  $vsh_mu[$gi]  = $uc_vsh_mu[$gi];  $wsh_mu[$gi]  = $uc_wsh_mu[$gi];  $esh_mu[$gi]  = $uc_esh_mu[$gi];
+		$ush_sig[$gi] = $uc_ush_sig[$gi]; $vsh_sig[$gi] = $uc_vsh_sig[$gi]; $wsh_sig[$gi] = $uc_wsh_sig[$gi]; 
 	} else {
 		$sh_n[$gi] = 0;
-		$ush_mu[$gi]  = $vsh_mu[$gi]  = $wsh_mu[$gi]  = nan;
+		$ush_mu[$gi]  = $vsh_mu[$gi]  = $wsh_mu[$gi]  = $esh_mu[$gi]  = nan;
 		$ush_sig[$gi] = $vsh_sig[$gi] = $wsh_sig[$gi] = nan;
 	}
 }
@@ -557,9 +570,9 @@
 
 	print(STDERR "Writing shear profiles...");
 	
-	@antsNewLayout = ('depth','dc_nshear','dc_u_z','dc_u_z.sig','dc_v_z','dc_v_z.sig','dc_w_z','dc_w_z.sig',
-							  'uc_nshear','uc_u_z','uc_u_z.sig','uc_v_z','uc_v_z.sig','uc_w_z','uc_w_z.sig',
-							  'nshear','u_z','u_z.sig','v_z','v_z.sig','w_z','w_z.sig','Sv','Sv.n');
+	@antsNewLayout = ('depth','dc_elapsed','dc_nsamp','dc_u_z','dc_u_z.sig','dc_v_z','dc_v_z.sig','dc_w_z','dc_w_z.sig',
+							  'uc_elapsed','uc_nsamp','uc_u_z','uc_u_z.sig','uc_v_z','uc_v_z.sig','uc_w_z','uc_w_z.sig',
+							  'elapsed','nsamp','u_z','u_z.sig','v_z','v_z.sig','w_z','w_z.sig','Sv','Sv.n');
 							  
 	&antsOut('EOF');
     close(STDOUT);
@@ -567,17 +580,19 @@
 
 	$antsCurParams = $fullParams;
 
-	for (my($gi)=0; $gi<@ush_mu; $gi++) {
+	for (my($gi)=0; $gi<$nsh; $gi++) {
 		&antsOut(depthOfGI($gi),										# depth in center of bin
-				 numberp($dc_sh_n[$gi])?$dc_sh_n[$gi]:0,				# downcast
+				 $dc_esh_mu[$gi],										# downcast
+				 numberp($dc_sh_n[$gi])?$dc_sh_n[$gi]:0,
 				 $dc_ush_mu[$gi],$dc_ush_sig[$gi],
 				 $dc_vsh_mu[$gi],$dc_vsh_sig[$gi],
 				 $dc_wsh_mu[$gi],$dc_wsh_sig[$gi],
-				 numberp($uc_sh_n[$gi])?$uc_sh_n[$gi]:0,				# upcast
+				 $uc_esh_mu[$gi],										# upcast
+				 numberp($uc_sh_n[$gi])?$uc_sh_n[$gi]:0,
 				 $uc_ush_mu[$gi],$uc_ush_sig[$gi],
 				 $uc_vsh_mu[$gi],$uc_vsh_sig[$gi],
 				 $uc_wsh_mu[$gi],$uc_wsh_sig[$gi],
-				 $sh_n[$gi],											# combined
+				 $esh_mu[$gi],$sh_n[$gi],								# combined
 				 $ush_mu[$gi],$ush_sig[$gi],
 				 $vsh_mu[$gi],$vsh_sig[$gi],
 				 $wsh_mu[$gi],$wsh_sig[$gi],
--- a/LADCPproc.UHcode
+++ b/LADCPproc.UHcode
@@ -1,9 +1,9 @@
 #======================================================================
 #                    L A D C P P R O C . U H C O D E 
 #                    doc: Fri Sep 17 20:27:53 2010
-#                    dlm: Tue Jul 12 21:59:07 2011
+#                    dlm: Sun Feb 19 21:05:16 2012
 #                    (c) 2010 A.M. Thurnherr & E. Firing
-#                    uE-Info: 392 0 NIL 0 0 72 2 2 4 NIL ofnI
+#                    uE-Info: 413 0 NIL 0 0 72 2 2 4 NIL ofnI
 #======================================================================
 
 # PERLified functions from Eric's [merge.c]; with mods
@@ -34,6 +34,7 @@
 #	Dec 10, 2010: - modified assertion to allow processing of UL data
 #	Jul 10, 2011: - added outTDseries() call
 #	Jul 12, 2011: - replaced -p by $PPI_editing_enabled flag
+#	Feb 19, 2012: - added elapsed time to binned shear output
 
 #======================================================================
 # VELOCITY EDITING
@@ -273,10 +274,16 @@
 
 #======================================================================
 # CALCULATE VELOCITY SHEAR
-#	- output in @ush_mu,@vsh_mu,@wsh_mu,@ush_sig,@vsh_sig,@wsh_sig
+#	- final output in @ush_mu,@vsh_mu,@wsh_mu,@ush_sig,@vsh_sig,@wsh_sig
+#		NEW (ant): elapsed time output in @esh_mu
 # 	- @sh_i0, @sh_i1, @dsh, @ush, @vsh, @wsh are defined "local" in calc_shear
 #======================================================================
 
+#----------------------------------------------------------------------
+# uv_to_shear(ens)
+#	- sets @sh_i0, @sh_i1, @dsh, @ush, @vsh, @wsh for a given ensemble
+#----------------------------------------------------------------------
+
 sub uv_to_shear($)
 {
 	my($ens) = @_;
@@ -391,11 +398,11 @@
 
 	outTDseries($De==1) if ($edit_shear);								# output depth-time time series
 
-	@ush_mu  = @vsh_mu  = @wsh_mu  = ();
+	@ush_mu  = @vsh_mu  = @wsh_mu  = @esh_mu  = ();
 	@ush_sig = @vsh_sig = @wsh_sig = ();
 
 	for (my($gi)=0; $gi<@ush_vals; $gi++) {								# calc grid means & stddev
-		my($sum_ush,$sum_vsh,$sum_wsh);
+		my($sum_ush,$sum_vsh,$sum_wsh,$sum_esh);
 
 		$sh_n[$gi] = @{$ush_vals[$gi]};
 		
@@ -403,10 +410,12 @@
 			$sum_ush += $ush_vals[$gi][$vi];
 			$sum_vsh += $vsh_vals[$gi][$vi];
 			$sum_wsh += $wsh_vals[$gi][$vi];
+			$sum_esh += $LADCP{ENSEMBLE}[$ens_vals[$gi][$vi]]->{ELAPSED_TIME}+$CTD{first_elapsed}-$opt_l;
 		}
 		$ush_mu[$gi] = $sh_n[$gi] ? $sum_ush/$sh_n[$gi] : nan;
 		$vsh_mu[$gi] = $sh_n[$gi] ? $sum_vsh/$sh_n[$gi] : nan;
 		$wsh_mu[$gi] = $sh_n[$gi] ? $sum_wsh/$sh_n[$gi] : nan;
+		$esh_mu[$gi] = $sh_n[$gi] ? $sum_esh/$sh_n[$gi] : nan;
 	}
 
 	for (my($gi)=0; $gi<@ush_vals; $gi++) {								# calc & grid stddevs