LADCPproc
changeset 7 e67ddf9937eb
parent 6 2cc7f3b110af
child 8 88ba92d0e30c
--- 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],