RDI_Utils.pl
changeset 12 0f89b1523648
parent 11 9c3b147b4372
child 14 8c79b38a7086
--- a/RDI_Utils.pl
+++ b/RDI_Utils.pl
@@ -1,9 +1,9 @@
 #======================================================================
 #                    R D I _ U T I L S . P L 
 #                    doc: Wed Feb 12 10:21:32 2003
-#                    dlm: Fri Apr 12 09:22:10 2013
+#                    dlm: Thu Jun 20 15:26:47 2013
 #                    (c) 2003 A.M. Thurnherr
-#                    uE-Info: 44 68 NIL 0 0 72 2 2 4 NIL ofnI
+#                    uE-Info: 125 0 NIL 0 0 72 2 2 4 NIL ofnI
 #======================================================================
 
 # miscellaneous RDI-specific utilities
@@ -42,6 +42,9 @@
 #	Mar 27, 2013: - BUG: 3-beam solutions were not used in ref_lr_w
 #				  - disabled apparently unused code
 #	Apr 12, 2013: - added $min_pctg as optional parameter to mk_prof
+#	May 14, 2013: - added incident-velocity, w12 & w34 to mkProfile
+#	Jun  5, 2013: - BUG: incident-flow warning was printed repeatedly
+#	Jun 20, 2013: - BUG: warning had used &antsInfo()
 
 use strict;
 
@@ -218,10 +221,15 @@
 #	mk_prof($dta,$check,$filter,$lr_b0,$lr_b1,$min_corr,$max_e,$max_gap);
 #======================================================================
 
-sub ref_lr_w($$$$$$$)								# calc ref-level vert vels
+# calculate reference-layer vertical and incident velocities
+
+{ my($warned);	# static scope
+
+sub ref_lr_w($$$$$$$)
 {
 	my($dta,$ens,$rl_b0,$rl_b1,$min_corr,$max_e,$min_pctg) = @_;
-	my($i,@n,@bn,@v,@vel,@bv,@w);
+	my($i,@n,@bn,@v,@vi,@vel,@veli,@bv,@w);
+	my($w,$e,$nvi,$vi12,$vi43,@vbp,@velbp,@nbp,$w12,$w34,@w12,@w34);
 
 	for ($i=$rl_b0; $i<=$rl_b1; $i++) {
 		undef($dta->{ENSEMBLE}[$ens]->{VELOCITY}[$i][0])
@@ -241,26 +249,44 @@
 				if ($dta->{ENSEMBLE}[$ens]->{PERCENT_GOOD}[$i][2] < $min_pctg);
 			undef($dta->{ENSEMBLE}[$ens]->{VELOCITY}[$i][3])
 	            if ($dta->{ENSEMBLE}[$ens]->{PERCENT_GOOD}[$i][3] < $min_pctg);
-			@v = velInstrumentToEarth($dta,$ens,
-					velBeamToInstrument($dta,
-						@{$dta->{ENSEMBLE}[$ens]->{VELOCITY}[$i]}));
+	        @vi = velBeamToInstrument($dta,@{$dta->{ENSEMBLE}[$ens]->{VELOCITY}[$i]});
+			@v = velInstrumentToEarth($dta,$ens,@vi);
+			@vbp = velBeamToBPEarth($dta,$ens,@{$dta->{ENSEMBLE}[$ens]->{VELOCITY}[$i]});
 		} else {
 			next if ($dta->{ENSEMBLE}[$ens]->{PERCENT_GOOD}[$i][0] > 0 ||
 					 $dta->{ENSEMBLE}[$ens]->{PERCENT_GOOD}[$i][1] > 0 ||
 					 $dta->{ENSEMBLE}[$ens]->{PERCENT_GOOD}[$i][2] > 0 ||
 					 $dta->{ENSEMBLE}[$ens]->{PERCENT_GOOD}[$i][3] < $min_pctg);
 			@v = @{$dta->{ENSEMBLE}[$ens]->{VELOCITY}[$i]};
-			# NB: no need to apply heading bias, as long as we only use w!
+			unless ($warned) {
+				print(STDERR "WARNING: incident-flow & beam-pair velocities not yet implemented for earth coordinates");
+				$warned = 1;
+			}
 		}
 ###		next if (!defined($v[3]) || abs($v[3]) > $max_e);		# disallow 3-beam solutions
 		next if (defined($v[3]) && abs($v[3]) > $max_e);		# allow 3-beam solutions
 
-		if (defined($v[2])) {							# valid w
-			$vel[2] += $v[2]; $n[2]++;
-			$vel[3] += $v[3], $n[3]++ if defined($v[3]);
-			push(@w,$v[2]); 							# for stderr test
+		if (defined($v[2])) {									# valid velocity
+			$vel[2] += $v[2]; $n[2]++;							# vertical velocity
+			$vel[3] += $v[3], $n[3]++ if defined($v[3]);		# error velocity
+			push(@w,$v[2]); 									# save for stderr calculation
+		}
+
+		if (defined($vbp[1])) {									# beam-pair vertical velocities
+			$velbp[0] += $vbp[1]; $nbp[0]++;
+			push(@w12,$vbp[1]);
+		}
+		if (defined($vbp[3])) {
+			$velbp[1] += $vbp[3]; $nbp[1]++;
+			push(@w34,$vbp[1]);
 		}
 		
+		if (defined($vi[0])) { 									# incident velocity
+			$veli[0] += $vi[0];
+			$veli[1] += $vi[1];
+			$nvi++;
+		}
+
 #	The following code calculates beam-averaged ref-lr velocities.
 #	I do not recall what this was implemented for. Disabled Mar 27, 2013.
 #
@@ -274,22 +300,63 @@
 #			$bv[3] += $dta->{ENSEMBLE}[$ens]->{VELOCITY}[$i][3], $bn[3]++
 #	            if defined($dta->{ENSEMBLE}[$ens]->{VELOCITY}[$i][3]);
 #	    }
+	} # loop over ref-lr bins
+
+	$w = ($n[2] > 0) ? $vel[2]/$n[2] : undef;					# calc means
+	$e = ($n[3] > 0) ? $vel[3]/$n[3] : undef;
+	if ($nvi > 0) {						
+		$vi12 = $veli[0] / $nvi;
+		$vi43 = $veli[1] / $nvi;
+	} else {
+		$vi12 = $vi43 = undef;
+	}
+	$w12 = ($nbp[0] > 0) ? $velbp[0]/$nbp[0] : undef;
+	$w34 = ($nbp[1] > 0) ? $velbp[1]/$nbp[1] : undef;
+
+	if (@w12) {													# w uncertainty
+		my($sumsq) = 0;
+		for ($i=0; $i<=$#w12; $i++) {
+			$sumsq += ($w12-$w12[$i])**2;
+		}
+		$dta->{ENSEMBLE}[$ens]->{W12} = $w12;
+		$dta->{ENSEMBLE}[$ens]->{W12_ERR} = sqrt($sumsq)/($nbp[0]-1)
+			if ($nbp[0]>=2);
 	}
 
-	my($w) = $n[2] ? $vel[2]/$n[2] : undef;				# w uncertainty
-	my($sumsq) = 0;
+	if (@w34) {													# w uncertainty
+		my($sumsq) = 0;
+		for ($i=0; $i<=$#w34; $i++) {
+			$sumsq += ($w34-$w34[$i])**2;
+		}
+		$dta->{ENSEMBLE}[$ens]->{W34} = $w34;
+		$dta->{ENSEMBLE}[$ens]->{W34_ERR} = sqrt($sumsq)/($nbp[1]-1)
+			if ($nbp[1]>=2);
+	}
+
+	my($sumsq) = 0;												# w uncertainty
 	for ($i=0; $i<=$#w; $i++) {
 		$sumsq += ($w-$w[$i])**2;
 	}
 	my($stderr) = $n[2]>=2 ? sqrt($sumsq)/($n[2]-1) : undef;
+
 #	The following stderr test introduces a huge gap near the bottom of
 #	the profiles. Without it, they seem more reasonable.
 #	next if ($stderr > 0.05);
 
-	if (defined($w)) {									# valid w
+	if (defined($w)) {											# valid velocity
 		$dta->{ENSEMBLE}[$ens]->{W} = $w;
 		$dta->{ENSEMBLE}[$ens]->{W_ERR} = $stderr;
 	}
+	$dta->{ENSEMBLE}[$ens]->{ERR_VEL} = $e if (defined($e));
+	
+	$dta->{ENSEMBLE}[$ens]->{W12} = $w12 if (defined($w12));
+	$dta->{ENSEMBLE}[$ens]->{W34} = $w34 if (defined($w34));
+
+	if (defined($vi12)) {
+		$dta->{ENSEMBLE}[$ens]->{INCIDENT_VEL_T12} = $vi12;
+		$dta->{ENSEMBLE}[$ens]->{INCIDENT_VEL_T43} = $vi43;
+	}
+
 #	The following code calculates beam-averaged ref-lr velocities.
 #	I do not recall what this was implemented for. Disabled Mar 27, 2013.
 #
@@ -299,8 +366,11 @@
 #		$dta->{ENSEMBLE}[$ens]->{V3} = $bn[2]>=2 ? $bv[2]/$bn[2] : undef;
 #	    $dta->{ENSEMBLE}[$ens]->{V4} = $bn[3]>=2 ? $bv[3]/$bn[3] : undef;
 #	}
+
 }
 
+} # static scope
+
 
 sub mk_prof(...)											# make profile
 {