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; |