# HG changeset patch # User Andreas Thurnherr # Date 1618048337 14400 # Node ID 78607e2e8addfb12d57511ae5bd7f269c525f7d5 # Parent 5a59411306ba2abffb9b20eac4cd2d3c5feb1aa5 Nortek files diff --git a/ADCP_tools_lib.pl b/ADCP_tools_lib.pl --- a/ADCP_tools_lib.pl +++ b/ADCP_tools_lib.pl @@ -1,9 +1,9 @@ #====================================================================== # A D C P _ T O O L S _ L I B . P L # doc: Tue Jan 5 10:45:47 2016 -# dlm: Mon Apr 20 15:47:30 2020 +# dlm: Tue Mar 23 09:15:16 2021 # (c) 2016 A.M. Thurnherr -# uE-Info: 19 25 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 18 0 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # HISTORY: @@ -15,8 +15,9 @@ # Dec 7, 2017: - updated to V2.1 for improvements to listHdr # Feb 6, 2018: - updated to V2.2 for changes to PD0_IO # Apr 20, 2020: - updated to V2.3 after adaptating to work with IMPed moored ADCP data +# Mar 23, 2021: - updated to V2.4 after starting adaption to Nortek produced PD0 files -$ADCP_tools_version = 2.3; +$ADCP_tools_version = 2.4; die(sprintf("$0: obsolete ADCP_tools V%.1f; V%.1f required\n", $ADCP_tools_version,$ADCP_tools_minVersion)) diff --git a/RDI_Coords.pl b/RDI_Coords.pl --- 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: Mon Jun 29 10:59:01 2020 +# dlm: Wed Mar 17 23:20:13 2021 # (c) 2003 A.M. Thurnherr -# uE-Info: 61 83 NIL 0 0 72 10 2 4 NIL ofnI +# uE-Info: 66 9 NIL 0 0 72 10 2 4 NIL ofnI #====================================================================== # RDI Workhorse Coordinate Transformations @@ -59,6 +59,15 @@ # Mar 28, 2018: - added &loadInstrumentTransformation() # Jun 5, 2020: - added sscorr_w & sscorr_w_mooring # Jun 29, 2020: - added comments for sscorr_w, which conflicts with LADCP_w_ocean +# Mar 17, 2021: - adapted velBeamToInstrument() to Nortek (checked w only) +# - adapted velInstrumentToEarth() to Nortek, assuming Nortek pitch is gimbal pitch +# HISTORY END + +# NORTEK TODO: +# - check u, v sign convention for Nortek +# - verify that gimbal pitch for Nortek gives better results +# for A20 test profile 900, the differences in w have a stddev of 1.3e-5 m/s +# - update gimbal pitch for Nortek in other routines use strict; use POSIX; @@ -135,7 +144,7 @@ defined($v3) + defined($v4) >= $RDI_Coords::minValidVels); - unless (@B2I) { + unless (@B2I) { # nominal transformation matrix my($a) = 1 / (2 * sin(rad($ADCP->{BEAM_ANGLE}))); my($b) = 1 / (4 * cos(rad($ADCP->{BEAM_ANGLE}))); my($c) = $ADCP->{CONVEX_BEAM_PATTERN} ? 1 : -1; @@ -146,7 +155,14 @@ [$d, $d, -$d, -$d ]); } - if (!defined($v1)) { # 3-beam solutions + if ($ADCP->{PRODUCER} =~ '^Nortek') { # Nortek ADCPs use different coord system + $v1 *= -1 if defined($v1); + $v2 *= -1 if defined($v2); + $v3 *= -1 if defined($v3); + $v4 *= -1 if defined($v4); + } + + if (!defined($v1)) { # 3-beam solutions $RDI_Coords::threeBeamFlag = 1; $RDI_Coords::threeBeam_1++; $v1 = -($v2*$B2I[3][1]+$v3*$B2I[3][2]+$v4*$B2I[3][3])/$B2I[3][0]; @@ -211,7 +227,13 @@ if defined($ADCP->{ENSEMBLE}[$ens]->{HEADING}); $pitch = $ADCP->{ENSEMBLE}[$ens]->{PITCH}; $roll = $ADCP->{ENSEMBLE}[$ens]->{ROLL}; - my($rad_gimbal_pitch) = atan(tan(rad($pitch)) * cos(rad($roll))); + my($rad_gimbal_pitch); + if ($ADCP->{PRODUCER} =~ '^Nortek') { + $rad_gimbal_pitch = rad($pitch); # I am assuming that this is correct + } else { + $rad_gimbal_pitch = atan(tan(rad($pitch)) * cos(rad($roll))); + } + my($rad_calc_pitch) = ($RDI_Coords::beamTransformation eq 'RDI') ? $rad_gimbal_pitch : asin(sin($rad_gimbal_pitch)*cos(rad($roll)) / sqrt(1-sin(rad($roll))**2*sin($rad_gimbal_pitch)**2)); diff --git a/RDI_PD0_IO.pl b/RDI_PD0_IO.pl --- a/RDI_PD0_IO.pl +++ b/RDI_PD0_IO.pl @@ -1,9 +1,9 @@ #====================================================================== # R D I _ P D 0 _ I O . P L # doc: Sat Jan 18 14:54:43 2003 -# dlm: Sat Mar 6 14:13:23 2021 +# dlm: Wed Mar 17 22:54:27 2021 # (c) 2003 A.M. Thurnherr -# uE-Info: 643 43 NIL 0 0 72 2 2 4 NIL ofnI +# uE-Info: 129 35 NIL 0 0 72 2 2 4 NIL ofnI #====================================================================== # Read RDI PD0 binary data files (*.[0-9][0-9][0-9]) @@ -125,6 +125,8 @@ # O(N^2) process # Apr 14, 2020: - BUG: WBPens did not work for ens# > 65535 (high byte) # Mar 3, 2021: - adapted to Nortek PD0 files +# Mar 13, 2021: - finished adaptation to Nortek files +# Mar 17, 2021: - updated HISTORY # END OF HISTORY # FIRMWARE VERSIONS: @@ -983,59 +985,65 @@ my($ndata) = $nbins * 4; my($vel_di) = WBRdtaIndex(0x0100); - die("no velocity data in ensemble #$ensNo\n") - unless defined($vel_di); - - sysseek(WBRF,$start_ens+$WBRofs[$vel_di],0) || die("$WBRcfn: $!"); - sysread(WBRF,$buf,2+$ndata*2) == 2+$ndata*2 || die("$WBRcfn: $!"); - ($id,@dta) = unpack("vv$ndata",$buf); - - for ($i=0,$bin=0; $bin<$nbins; $bin++) { - for ($beam=0; $beam<4; $beam++,$i++) { - ${$E}[$ens]->{VELOCITY}[$bin][$beam] = - unpack('s',pack('S',$dta[$i])) / 1000 - if ($dta[$i] != 0x8000); - } - } + if (defined($vel_di)) { + sysseek(WBRF,$start_ens+$WBRofs[$vel_di],0) || die("$WBRcfn: $!"); + sysread(WBRF,$buf,2+$ndata*2) == 2+$ndata*2 || die("$WBRcfn: $!"); + ($id,@dta) = unpack("vv$ndata",$buf); + + for ($i=0,$bin=0; $bin<$nbins; $bin++) { + for ($beam=0; $beam<4; $beam++,$i++) { + ${$E}[$ens]->{VELOCITY}[$bin][$beam] = + unpack('s',pack('S',$dta[$i])) / 1000 + if ($dta[$i] != 0x8000); + } + } + } else { +# die("no velocity data in ensemble #$ensNo\n"); + print(STDERR "WARNING: no velocity data in ensemble #$ensNo\n"); + } #-------------------- # Correlation Data #-------------------- my($corr_di) = WBRdtaIndex(0x0200); - die("no correlation data in ensemble #$ensNo\n") - unless defined($corr_di); - - sysseek(WBRF,$start_ens+$WBRofs[$corr_di],0) || die("$WBRcfn: $!"); - sysread(WBRF,$buf,2+$ndata) == 2+$ndata || die("$WBRcfn: $!"); - ($id,@dta) = unpack("vC$ndata",$buf); - - for ($i=0,$bin=0; $bin<$nbins; $bin++) { - for ($beam=0; $beam<4; $beam++,$i++) { - ${$E}[$ens]->{CORRELATION}[$bin][$beam] = $dta[$i] - if ($dta[$i]); - } - } + if (defined($corr_di)) { + sysseek(WBRF,$start_ens+$WBRofs[$corr_di],0) || die("$WBRcfn: $!"); + sysread(WBRF,$buf,2+$ndata) == 2+$ndata || die("$WBRcfn: $!"); + ($id,@dta) = unpack("vC$ndata",$buf); + + for ($i=0,$bin=0; $bin<$nbins; $bin++) { + for ($beam=0; $beam<4; $beam++,$i++) { + ${$E}[$ens]->{CORRELATION}[$bin][$beam] = $dta[$i] + if ($dta[$i]); + } + } + } else { +# die("no correlation data in ensemble #$ensNo\n") + print(STDERR "WARNING: no correlation data in ensemble #$ensNo\n") + } #-------------------- # Echo Intensity Data #-------------------- my($echo_di) = WBRdtaIndex(0x0300); - die("no echo intensity data in ensemble #$ensNo\n") - unless defined($echo_di); - - sysseek(WBRF,$start_ens+$WBRofs[$echo_di],0) || die("$WBRcfn: $!"); - sysread(WBRF,$buf,2+$ndata) == 2+$ndata || die("$WBRcfn: $!"); - ($id,@dta) = unpack("vC$ndata",$buf); - - $id == 0x0300 || - die(sprintf($FmtErr,$WBRcfn,"Echo Intensity",$id,$ensNo)); - - for ($i=0,$bin=0; $bin<$nbins; $bin++) { - for ($beam=0; $beam<4; $beam++,$i++) { - ${$E}[$ens]->{ECHO_AMPLITUDE}[$bin][$beam] = $dta[$i]; - } + if (defined($echo_di)) { + sysseek(WBRF,$start_ens+$WBRofs[$echo_di],0) || die("$WBRcfn: $!"); + sysread(WBRF,$buf,2+$ndata) == 2+$ndata || die("$WBRcfn: $!"); + ($id,@dta) = unpack("vC$ndata",$buf); + + $id == 0x0300 || + die(sprintf($FmtErr,$WBRcfn,"Echo Intensity",$id,$ensNo)); + + for ($i=0,$bin=0; $bin<$nbins; $bin++) { + for ($beam=0; $beam<4; $beam++,$i++) { + ${$E}[$ens]->{ECHO_AMPLITUDE}[$bin][$beam] = $dta[$i]; + } + } + } else { +# die("no echo intensity data in ensemble #$ensNo\n"); + print(STDERR "WARNING: no echo intensity data in ensemble #$ensNo\n"); } #-------------------- @@ -1145,10 +1153,12 @@ my($trgid) = @_; our($ndt,$buf,$id,$start_ens,@WBRofs); +# printf(STDERR "WBRdtaIndex(%04X)\n",$trgid); for (my($di)=2; $di<$ndt; $di++) { sysseek(WBRF,$start_ens+$WBRofs[$di],0) || die("$WBRcfn: $!"); sysread(WBRF,$buf,2) == 2 || die("$WBRcfn: $!"); $id = unpack('v',$buf); +# printf(STDERR "\tid = %04X\n",$id); return $di if ($id == $trgid); } return undef; diff --git a/listHdr b/listHdr --- a/listHdr +++ b/listHdr @@ -2,9 +2,9 @@ #====================================================================== # L I S T H D R # doc: Sat Jan 18 18:41:49 2003 -# dlm: Sat Mar 6 14:19:53 2021 +# dlm: Wed Mar 17 22:53:25 2021 # (c) 2003 A.M. Thurnherr -# uE-Info: 208 75 NIL 0 0 72 10 2 4 NIL ofnI +# uE-Info: 50 35 NIL 0 0 72 10 2 4 NIL ofnI #====================================================================== # Print useful info from the RDI BB header @@ -46,6 +46,8 @@ # Jun 13, 2019: - removed BT_PRESENT flag support # Jun 26, 2019: - added comment to the effect that BT setup cannot be listed # with this utility any more +# Mar 6, 2021: - adapted to Nortek Signature data files +# Mar 17, 2021: - updated HISTORY use Getopt::Std; diff --git a/mkProfile b/mkProfile --- a/mkProfile +++ b/mkProfile @@ -2,9 +2,9 @@ #====================================================================== # M K P R O F I L E # doc: Sun Jan 19 18:55:26 2003 -# dlm: Thu Apr 18 16:28:13 2019 +# dlm: Sat Apr 10 05:51:48 2021 # (c) 2003 A.M. Thurnherr -# uE-Info: 98 54 NIL 0 0 72 0 2 4 NIL ofnI +# uE-Info: 99 35 NIL 0 0 72 0 2 4 NIL ofnI #====================================================================== # Make an LADCP Profile by Integrating W (similar to Firing's scan*). @@ -96,6 +96,8 @@ # Apr 2, 2018: - BUG: velBeamToInstrument() used old usage # Apr 24, 2018: - BUG: bin1 was used even with zero blanking # Apr 18, 2019: - added coord-transformation %PARAMs +# Apr 10, 2021: - adapted to V2.4 +# HISTORY END # NOTES: # - the battery values are based on transmission voltages (different @@ -226,7 +228,7 @@ print(STDERR "WARNING: $0 WIDE BANDWIDTH!\n"); } -unless ($dta{TRANSMIT_POWER_HIGH}) { +unless ($dta{TRANSMIT_POWER_MAX}) { print(STDERR "WARNING: $0 LOW TRANSMIT POWER!\n"); }