RDI_Coords.pl
changeset 41 d7ab920c1de6
parent 39 3bddaa514ef5
child 43 b63fa355644c
--- a/RDI_Coords.pl
+++ b/RDI_Coords.pl
@@ -1,9 +1,9 @@
 #======================================================================
 #                    R D I _ C O O R D S . P L 
 #                    doc: Sun Jan 19 17:57:53 2003
-#                    dlm: Thu Oct 12 21:01:19 2017
+#                    dlm: Mon Nov 27 07:13:25 2017
 #                    (c) 2003 A.M. Thurnherr
-#                    uE-Info: 260 20 NIL 0 0 72 10 2 4 NIL ofnI
+#                    uE-Info: 58 62 NIL 0 0 72 10 2 4 NIL ofnI
 #======================================================================
 
 # RDI Workhorse Coordinate Transformations
@@ -54,6 +54,8 @@
 #	Jul  7, 2016: - added velEarthToBPw() with algorithm debugged and verified
 #					by Paul Wanis from TRDI
 #	Oct 12, 2017: - documentation
+#	Nov 26, 2017: - BUG: velBeamtoBPEarth() did not respect missing values
+#	Nov 27, 2017: - BUG: numbersp() from [antslib.pl] was used
 
 use strict;
 use POSIX;
@@ -367,27 +369,47 @@
 		#	- v12 is horizontal velocity from beam1 to beam2, i.e. westward for upward-looking ADCP
 		#	  with beam 3 pointing north (heading = 0)
 
-		my($v12_ic) = ($b1-$b2)/$TwoSinBAngle;									# instrument coords
-		my($v34_ic) = ($b4-$b3)/$TwoSinBAngle;									# consistent with RDI Coords
-		my($w12_ic) = ($b1+$b2)/$TwoCosBAngle;
-		my($w34_ic) = ($b3+$b4)/$TwoCosBAngle;
-		my($w_ic) = ($w12_ic+$w34_ic) / 2;
+		my($v12_ic,$w12_ic,$v34_ic,$w34_ic,$w_ic);
+	    
+		if (numberp($b1) && numberp($b2)) {
+			$v12_ic = ($b1-$b2)/$TwoSinBAngle;									# instrument coords...
+			$w12_ic = ($b1+$b2)/$TwoCosBAngle; 									# consistent with RDI convention
+		}
+		if (numberp($b3) && numberp($b4)) {
+			$v34_ic = ($b4-$b3)/$TwoSinBAngle;
+			$w34_ic = ($b3+$b4)/$TwoCosBAngle;
+		}
 	    
 		if ($ADCP->{ENSEMBLE}[$ens]->{XDUCER_FACING_DOWN}) {					# beampair Earth coords
-			$v12 = $v12_ic*$cr 		+ $v34_ic*0			+ $w_ic*$sr;			# Lohrman et al. (1990) A1
-			$v34 = $v12_ic*$sp*$sr	+ $v34_ic*$cp		- $w_ic*$sp*$cr;		#	- defined for z upward => DL
-			$w12 =-$v12_ic*$cp*$sr	+ $v34_ic*$sp		+ $w12_ic*$cp*$cr;
-			$w34 =-$v12_ic*$cp*$sr	+ $v34_ic*$sp		+ $w34_ic*$cp*$cr;
-		} else {																# RDI Coord trans manual
-			$v12 =-$v12_ic*$cr 		+ $v34_ic*0			- $w_ic*$sr;			# 	- as above with 1st & 3rd cols negated
-			$v34 =-$v12_ic*$sp*$sr	+ $v34_ic*$cp		+ $w_ic*$sp*$cr;
-			$w12 = $v12_ic*$cp*$sr	+ $v34_ic*$sp		- $w12_ic*$cp*$cr;
-			$w34 = $v12_ic*$cp*$sr	+ $v34_ic*$sp		- $w34_ic*$cp*$cr;
+			if (numberp($w12_ic) && numberp($w34_ic)) {
+				$w_ic = ($w12_ic+$w34_ic) / 2;
+				$v12 = $v12_ic*$cr		+ $v34_ic*0 		+ $w_ic*$sr;		# Lohrman et al. (1990) A1
+				$v34 = $v12_ic*$sp*$sr	+ $v34_ic*$cp		- $w_ic*$sp*$cr;	#	- defined for z upward => DL
+				$w12 =-$v12_ic*$cp*$sr	+ $v34_ic*$sp		+ $w12_ic*$cp*$cr;
+	            $w34 =-$v12_ic*$cp*$sr  + $v34_ic*$sp       + $w34_ic*$cp*$cr;
+	        } elsif (numberp($w12_ic)) {
+				$v12 = $v12_ic*$cr		+ $w12_ic*$sr;	    
+				$w12 =-$v12_ic*$cp*$sr	+ $w12_ic*$cp*$cr;
+	        } elsif (numberp($w34_ic)) {
+				$v34 = $v34_ic*$cp		- $w34_ic*$sp*$cr;    
+				$w34 = $v34_ic*$sp		+ $w34_ic*$cp*$cr;
+	        }
+		} else {																
+			if (numberp($w12_ic) && numberp($w34_ic)) {
+				$w_ic = ($w12_ic+$w34_ic) / 2;
+				$v12 =-$v12_ic*$cr		+ $v34_ic*0 		- $w_ic*$sr;		#	- as above with 1st & 3rd cols negated
+				$v34 =-$v12_ic*$sp*$sr	+ $v34_ic*$cp		+ $w_ic*$sp*$cr;
+				$w12 = $v12_ic*$cp*$sr	+ $v34_ic*$sp		- $w12_ic*$cp*$cr;
+	            $w34 = $v12_ic*$cp*$sr  + $v34_ic*$sp       - $w34_ic*$cp*$cr;
+	        } elsif (numberp($w12_ic)) {
+				$v12 =-$v12_ic*$cr		- $w12_ic*$sr;		
+				$w12 = $v12_ic*$cp*$sr	- $w12_ic*$cp*$cr;
+	        } elsif (numberp($w34_ic)) {
+				$v34 = $v34_ic*$cp		+ $w34_ic*$sp*$cr;
+				$w34 = $v34_ic*$sp		- $w34_ic*$cp*$cr;
+	        }
 		}
 
-		$v12=$w12=undef unless (defined($b1) && defined($b2));
-		$v34=$w34=undef unless (defined($b3) && defined($b4));
-
 		return ($v12,$w12,$v34,$w34);
 	}
 }