RDI_Coords.pl
changeset 54 21cf468fa8e0
parent 43 b63fa355644c
child 58 78607e2e8add
equal deleted inserted replaced
53:51c5988a7f1f 54:21cf468fa8e0
     1 #======================================================================
     1 #======================================================================
     2 #                    R D I _ C O O R D S . P L 
     2 #                    R D I _ C O O R D S . P L 
     3 #                    doc: Sun Jan 19 17:57:53 2003
     3 #                    doc: Sun Jan 19 17:57:53 2003
     4 #                    dlm: Wed Mar 28 12:30:12 2018
     4 #                    dlm: Mon Jun 29 10:59:01 2020
     5 #                    (c) 2003 A.M. Thurnherr
     5 #                    (c) 2003 A.M. Thurnherr
     6 #                    uE-Info: 109 22 NIL 0 0 72 10 2 4 NIL ofnI
     6 #                    uE-Info: 61 83 NIL 0 0 72 10 2 4 NIL ofnI
     7 #======================================================================
     7 #======================================================================
     8 
     8 
     9 # RDI Workhorse Coordinate Transformations
     9 # RDI Workhorse Coordinate Transformations
    10 
    10 
    11 # HISTORY:
    11 # HISTORY:
    55 #					by Paul Wanis from TRDI
    55 #					by Paul Wanis from TRDI
    56 #	Oct 12, 2017: - documentation
    56 #	Oct 12, 2017: - documentation
    57 #	Nov 26, 2017: - BUG: velBeamtoBPEarth() did not respect missing values
    57 #	Nov 26, 2017: - BUG: velBeamtoBPEarth() did not respect missing values
    58 #	Nov 27, 2017: - BUG: numbersp() from [antslib.pl] was used
    58 #	Nov 27, 2017: - BUG: numbersp() from [antslib.pl] was used
    59 #	Mar 28, 2018: - added &loadInstrumentTransformation()
    59 #	Mar 28, 2018: - added &loadInstrumentTransformation()
       
    60 #	Jun  5, 2020: - added sscorr_w & sscorr_w_mooring
       
    61 #   Jun 29, 2020: - added comments for sscorr_w, which conflicts with LADCP_w_ocean
    60 
    62 
    61 use strict;
    63 use strict;
    62 use POSIX;
    64 use POSIX;
    63 
    65 
    64 my($PI) = 3.14159265358979;
    66 my($PI) = 3.14159265358979;
   671 		die("BPEarthVels(): unknown bin mapping '$RDI_Coords::binMapping '\n");
   673 		die("BPEarthVels(): unknown bin mapping '$RDI_Coords::binMapping '\n");
   672 	}
   674 	}
   673 }
   675 }
   674 
   676 
   675 #----------------------------------------------------------------------
   677 #----------------------------------------------------------------------
       
   678 # Sound Speed Correction for Vertical Velocity
       
   679 #	- Usage: sscorr_w(<observed w>,<beam_angle>,<ADCP sVel setup>,salin,temp,press,<vertical temp. gradient>
       
   680 #----------------------------------------------------------------------
       
   681 
       
   682 sub sscorr_w($$$$$$$$)
       
   683 {
       
   684 	my($w,$beamAngle,$ssADCP,$salin,$temp,$press,$dz,$dtdz) = @_;
       
   685 	
       
   686 	return 'nan' unless numberp($w);
       
   687 	my($tanSqBeamAngle) = tan(rad($beamAngle))**2;
       
   688 	    
       
   689 	my($ssXD) 	= sVel($salin,$temp,$press);
       
   690 	my($ssBin) 	= sVel($salin,$temp+$dz*$dtdz,$press-$dz);
       
   691 	my($Kn) = sqrt(1 + (1 - $ssBin/$ssXD)**2 * $tanSqBeamAngle);
       
   692 	return $w * $ssBin/$ssADCP / $Kn;
       
   693 }
       
   694 
       
   695 #----------------------------------------------------------------------
       
   696 # Sound Speed Correction for Vertical Velocity
       
   697 #	- Usage: sscorr_w_mooring(\$ADCP,<ens-idx>,<bin-idx>,<press>,<salin>,<vertical temp. gradient>)
       
   698 #	- Notes:
       
   699 #		- RDI Coord. Trans. manual sec. 4.1
       
   700 #			- manual error: the ^2 applies to the []
       
   701 #		- difference between pressure and depth over instrument range ignored
       
   702 #	- Assumptions:
       
   703 #		- libEOS83.pl loaded
       
   704 #		- $ADCP{ENSEMBLE}[$ens-idx]->VELOCITY}[2] contains measured w
       
   705 #		- sound speed variation dominated by temperature
       
   706 #		- vertical temperature gradient is constant in time (violated
       
   707 #		  at least on superinertial time scales)
       
   708 #----------------------------------------------------------------------
       
   709 
       
   710 sub sscorr_w_mooring($$$$$)
       
   711 {												
       
   712 	my($ADCP,$ei,$bi,$press,$salin,$dtdz) = @_;
       
   713 
       
   714 	my($w) = $ADCP->{ENSEMBLE}[$ei]->{VELOCITY}[2];
       
   715 	return 'nan' unless numberp($w);
       
   716 
       
   717 	my($tanSqBeamAngle) = tan(rad($ADCP->{BEAM_ANGLE}))**2;
       
   718 	    
       
   719 	$Global::P{ITS} = 90;
       
   720 	my($ssXD) 	= sVel($salin,$ADCP->{ENSEMBLE}[$ei]->{TEMPERATURE},$press);
       
   721 	my($ssADCP)	= $ADCP->{ENSEMBLE}[$ei]->{SPEED_OF_SOUND};
       
   722 
       
   723 	my($dz)		= $ADCP->{ENSEMBLE}[$ei]->{BLANKING_DISTANCE} + $bi * $ADCP->{ENSEMBLE}[$ei]->{BIN_LENGTH};
       
   724 	$dz *= -1 if ($ADCP->{ENSEMBLE}[$ei]->{XDUCER_FACING_DOWN});			# z increases upward
       
   725 
       
   726 	my($ssBin) 	= sVel($salin,
       
   727 					   $ADCP->{ENSEMBLE}[$ei]->{TEMPERATURE} + $dz*$dtdz,
       
   728 					   $press-$dz);											# ignore press/depth difference across range
       
   729 
       
   730 	my($Kn) = sqrt(1 + (1 - $ssBin/$ssXD)**2 * $tanSqBeamAngle);		 	# RDI manual
       
   731 	return $w * $ssBin/$ssADCP / $Kn;
       
   732 }
       
   733 
   676 
   734 
   677 1;
   735 1;