RDI_Coords.pl
changeset 32 7155adf61d77
parent 31 b6ca27a1d19c
child 34 3b4bcd55e1ea
--- 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: Sun Jan 31 12:42:43 2016
+#                    dlm: Mon Feb 29 18:03:31 2016
 #                    (c) 2003 A.M. Thurnherr
-#                    uE-Info: 185 0 NIL 0 0 72 0 2 4 NIL ofnI
+#                    uE-Info: 44 85 NIL 0 0 72 0 2 4 NIL ofnI
 #======================================================================
 
 # RDI Workhorse Coordinate Transformations
@@ -41,6 +41,8 @@
 #				  - removed unused code from &velBeamToBPInstrument
 #	Jan  5, 2016: - added &velEarthToInstrument(@), &velInstrumentToBeam(@)
 #	Jan  9, 2016: - added &velEarthToBeam(), &velBeamToEarth()
+#	Feb 29, 2016: - debugged & verified velEarthToInstrument(), velInstrumentToBeam()
+#				  - added velBeamToEarth()
 
 use strict;
 use POSIX;
@@ -157,9 +159,17 @@
 	}
 } # STATIC SCOPE
 
+
+sub velBeamToEarth(@)
+{
+	my($dtaR,$e,@v) = @_;
+	return velInstrumentToEarth($dtaR,$e,velBeamToInstrument($dtaR,@v));
+}
+
 #----------------------------------------------------------------------
 # velEarthToInstrument() transforms earth to instrument coordinates
 #	- based on manually inverted rotation matrix M (Sec 5.6 in coord-trans manual)
+#	- code was verified for both down- and uplookers
 #	- missing heading data (IMP) causes undef beam velocities
 #----------------------------------------------------------------------
 
@@ -170,26 +180,22 @@
 	{
 		my($dta,$ens,$u,$v,$w,$ev) = @_;
 
-		unless (@E2I) {
+		unless (@E2I &&
+				$pitch == $dta->{ENSEMBLE}[$ens]->{PITCH} &&
+				$roll  == $dta->{ENSEMBLE}[$ens]->{ROLL}) {
 			$hdg = $dta->{ENSEMBLE}[$ens]->{HEADING} - $dta->{HEADING_BIAS} 
 				if defined($dta->{ENSEMBLE}[$ens]->{HEADING});
 			$pitch = $dta->{ENSEMBLE}[$ens]->{PITCH};
 			$roll  = $dta->{ENSEMBLE}[$ens]->{ROLL};
 			my($rad_gimbal_pitch) = atan(tan(rad($pitch)) * cos(rad($roll)));
+			my($useRoll) = ($dta->{ENSEMBLE}[$ens]->{XDUCER_FACING_UP}) ? $roll+180 : $roll;
 			my($sh,$ch) = (sin(rad($hdg)),cos(rad($hdg)))
 				if defined($hdg);				
 			my($sp,$cp) = (sin($rad_gimbal_pitch),cos($rad_gimbal_pitch));
-			my($sr,$cr) = (sin(rad($roll)),	cos(rad($roll)));
-			@E2I = $dta->{ENSEMBLE}[$ens]->{XDUCER_FACING_UP}
-				 ? (
-					[$ch*-$cr+$sh*$sp*-$sr,	 $ch*$sp*-$sr-$sh*-$cr,	$cp*-$sr],
-				    [$sh*$cp,				 $ch*$cp,				$sp		],
-				    [$ch*-$sr-$sh*$sp*-$cr,	-$sh*-$sr-$ch*$sp*-$cr,	$cp*-$cr]
-				 ) : (
-					[$ch*$cr+$sh*$sp*$sr,	 $ch*$sp*$sr-$sh*$cr,	$cp*$sr	],
-				    [$sh*$cp,				 $ch*$cp,				$sp		],
-				    [$ch*$sr-$sh*$sp*$cr,	-$sh*$sr-$ch*$sp*$cr,	$cp*$cr	]
-				 );
+			my($sr,$cr) = (sin(rad($useRoll)),	  cos(rad($useRoll)));
+			@E2I = ([$ch*$cr+$sh*$sp*$sr,	 $ch*$sp*$sr-$sh*$cr,	-$cp*$sr],		# M^-1 = R^-1 * P^-1 * R^-1
+				    [$sh*$cp,				 $ch*$cp,				$sp	],
+				    [$ch*$sr-$sh*$sp*$cr,	-$sh*$sr-$ch*$sp*$cr,	$cp*$cr]);
 		}
 
 		return defined($dta->{ENSEMBLE}[$ens]->{HEADING})