0
|
1 |
#!/usr/local/bin/perl
|
|
2 |
#======================================================================
|
|
3 |
# R D I 2 G R D
|
|
4 |
# doc: Wed Aug 30 11:51:22 2006
|
|
5 |
# dlm: Thu Jun 18 07:06:34 2009
|
|
6 |
# (c) 2006 A.M. Thurnherr
|
|
7 |
# uE-Info: 18 54 NIL 0 0 72 2 2 4 NIL ofnI
|
|
8 |
#======================================================================
|
|
9 |
|
|
10 |
# make GMT grd files from RDI file
|
|
11 |
|
|
12 |
# HISTORY:
|
|
13 |
# Aug 30, 2006: - created at end of GRAVILUCK cruise
|
|
14 |
# Aug 31, 2006: - BUG: ensembles/bins were numbered from 0
|
|
15 |
# - added -d)imensional coords
|
|
16 |
# Sep 1, 2006: - fiddled with registration
|
|
17 |
# Sep 19, 2007: - adapted to new [RDI_BB_Read.pl]
|
|
18 |
# Jun 18, 2009: - BUG: xysize had been called xyside
|
|
19 |
|
|
20 |
# NOTES:
|
|
21 |
# - regular grids only => no dimensional time axis for data collected
|
|
22 |
# in multi-ensemble burst mode!
|
|
23 |
|
|
24 |
# TODO:
|
|
25 |
# - implement soundspeed corretion
|
|
26 |
# - add temporal pre-averaging
|
|
27 |
|
|
28 |
require "getopts.pl";
|
|
29 |
$0 =~ m{(.*/)[^/]+};
|
|
30 |
require "$1RDI_BB_Read.pl";
|
|
31 |
require "$1RDI_Coords.pl";
|
|
32 |
|
|
33 |
use NetCDF;
|
|
34 |
|
|
35 |
sub dumpVar($$$$$)
|
|
36 |
{
|
|
37 |
my($var,$units,$long_name,$fname,$dimnum) = @_;
|
|
38 |
|
|
39 |
my($ncId) = NetCDF::create("$opt_b$var.grd",NetCDF::CLOBBER);
|
|
40 |
NetCDF::setfill($ncId,NetCDF::NOFILL); # NetCDF library bug
|
|
41 |
|
|
42 |
my($sid) = NetCDF::dimdef($ncId,'side',2);
|
|
43 |
my($aid) = NetCDF::dimdef($ncId,'xysize',($le-$fe+1)*($lastBin-$firstBin+1));
|
|
44 |
|
|
45 |
my($xrid) = NetCDF::vardef($ncId,'x_range',NetCDF::DOUBLE,[$sid]);
|
|
46 |
my($yrid) = NetCDF::vardef($ncId,'y_range',NetCDF::DOUBLE,[$sid]);
|
|
47 |
my($zrid) = NetCDF::vardef($ncId,'z_range',NetCDF::DOUBLE,[$sid]);
|
|
48 |
my($spid) = NetCDF::vardef($ncId,'spacing',NetCDF::DOUBLE,[$sid]);
|
|
49 |
my($dmid) = NetCDF::vardef($ncId,'dimension',NetCDF::LONG,[$sid]);
|
|
50 |
|
|
51 |
my($zvid) = NetCDF::vardef($ncId,'z',NetCDF::FLOAT,[$aid]);
|
|
52 |
|
|
53 |
NetCDF::attput($ncId,NetCDF::GLOBAL,'title',NetCDF::CHAR,$ARGV[0]);
|
|
54 |
NetCDF::attput($ncId,NetCDF::GLOBAL,'source',NetCDF::CHAR,$usage);
|
|
55 |
|
|
56 |
NetCDF::attput($ncId,$xrid,'units',NetCDF::CHAR,
|
|
57 |
$opt_d ? 'day number' : 'ensemble number');
|
|
58 |
NetCDF::attput($ncId,$yrid,'units',NetCDF::CHAR,
|
|
59 |
$opt_d ? 'm' : 'bin number');
|
|
60 |
NetCDF::attput($ncId,$zrid,'units',NetCDF::CHAR,$units);
|
|
61 |
|
|
62 |
NetCDF::attput($ncId,$zvid,'long_name',NetCDF::CHAR,$long_name);
|
|
63 |
NetCDF::attput($ncId,$zvid,'scale_factor',NetCDF::DOUBLE,1);
|
|
64 |
NetCDF::attput($ncId,$zvid,'add_offset',NetCDF::DOUBLE,0);
|
|
65 |
NetCDF::attput($ncId,$zvid,'node_offset',NetCDF::LONG,0);
|
|
66 |
|
|
67 |
NetCDF::endef($ncId);
|
|
68 |
|
|
69 |
if ($opt_d) { # dimensional grid
|
|
70 |
my($ft) = $dta{ENSEMBLE}[$fe]->{DAYNO}; # x_range(side)
|
|
71 |
my($lt) = $dta{ENSEMBLE}[$le]->{DAYNO};
|
|
72 |
NetCDF::varput1($ncId,$xrid,0,$ft);
|
|
73 |
NetCDF::varput1($ncId,$xrid,1,$lt);
|
|
74 |
|
|
75 |
NetCDF::varput1($ncId,$yrid,0, # y_range(side)
|
|
76 |
$dta{DISTANCE_TO_BIN1_CENTER} + $firstBin*$dta{BIN_LENGTH});
|
|
77 |
NetCDF::varput1($ncId,$yrid,1,
|
|
78 |
$dta{DISTANCE_TO_BIN1_CENTER} + $lastBin*$dta{BIN_LENGTH});
|
|
79 |
|
|
80 |
NetCDF::varput1($ncId,$spid,0,($lt-$ft)/($le-$fe)); # spacing(side)
|
|
81 |
NetCDF::varput1($ncId,$spid,1,$dta{BIN_LENGTH});
|
|
82 |
} else { # non-dim grid
|
|
83 |
NetCDF::varput1($ncId,$xrid,0,$fe+1); # x_range(side)
|
|
84 |
NetCDF::varput1($ncId,$xrid,1,$le+1);
|
|
85 |
NetCDF::varput1($ncId,$yrid,0,$firstBin+1); # y_range(side)
|
|
86 |
NetCDF::varput1($ncId,$yrid,1,$lastBin+1);
|
|
87 |
NetCDF::varput1($ncId,$spid,0,1); # spacing(side)
|
|
88 |
NetCDF::varput1($ncId,$spid,1,1);
|
|
89 |
}
|
|
90 |
|
|
91 |
NetCDF::varput1($ncId,$dmid,0,$le-$fe+1); # dimension(side)
|
|
92 |
NetCDF::varput1($ncId,$dmid,1,$lastBin-$firstBin+1);
|
|
93 |
|
|
94 |
my($min) = 9e99; # z(xyside)
|
|
95 |
my($max) = -9e99;
|
|
96 |
my(@data);
|
|
97 |
for (my($b)=$lastBin; $b>=$firstBin; $b--) {
|
|
98 |
for (my($e)=$fe; $e<=$le; $e++) {
|
|
99 |
my($v) = $dta{ENSEMBLE}[$e]->{$fname}[$b][$dimnum];
|
|
100 |
$v = nan unless defined($v);
|
|
101 |
$min = $v if ($v < $min);
|
|
102 |
$max = $v if ($v > $max);
|
|
103 |
push(@data,$v);
|
|
104 |
}
|
|
105 |
}
|
|
106 |
|
|
107 |
my(@start) = (0);
|
|
108 |
my(@count) = (scalar(@data));
|
|
109 |
|
|
110 |
NetCDF::varput($ncId,$zvid,\@start,\@count,\@data);
|
|
111 |
|
|
112 |
NetCDF::varput1($ncId,$zrid,0,$min); # z_range(side)
|
|
113 |
NetCDF::varput1($ncId,$zrid,1,$max);
|
|
114 |
|
|
115 |
NetCDF::close($ncId);
|
|
116 |
}
|
|
117 |
|
|
118 |
#------
|
|
119 |
# Usage
|
|
120 |
#------
|
|
121 |
|
|
122 |
$usage = "$0 @ARGV";
|
|
123 |
die("Usage: $0 [-M)agnetic <declination>] [-r)ange <first_ens,last_ens>] " .
|
|
124 |
"[output -b)ase <name>] [-d)imensional coordinates] " .
|
|
125 |
"<RDI file>\n")
|
|
126 |
unless (&Getopts("b:dM:r:") && @ARGV == 1);
|
|
127 |
|
|
128 |
print(STDERR "WARNING: magnetic declination not set!\n")
|
|
129 |
unless defined($opt_M);
|
|
130 |
|
|
131 |
unless (defined($opt_b)) {
|
|
132 |
$opt_b = "$ARGV[0]_";
|
|
133 |
$opt_b =~ m{(.*)\.\d\d\d};
|
|
134 |
}
|
|
135 |
|
|
136 |
($first_ens,$last_ens) = split(',',$opt_r)
|
|
137 |
if defined($opt_r);
|
|
138 |
|
|
139 |
#----------
|
|
140 |
# Read Data
|
|
141 |
#----------
|
|
142 |
|
|
143 |
print(STDERR "Reading $ARGV[0]...");
|
|
144 |
readData($ARGV[0],\%dta);
|
|
145 |
printf(STDERR "%d complete ensembles\n",scalar(@{$dta{ENSEMBLE}}));
|
|
146 |
|
|
147 |
#--------------------------------------------------
|
|
148 |
# Find Good Ensemble Range & Make Earth Coordinates
|
|
149 |
#--------------------------------------------------
|
|
150 |
|
|
151 |
print(STDERR "Checking/transforming data...");
|
|
152 |
$dta{HEADING_BIAS} = -$opt_M; # magnetic declination
|
|
153 |
|
|
154 |
if ($dta{BEAM_COORDINATES}) { # coords used
|
|
155 |
$beamCoords = 1;
|
|
156 |
} elsif (!$dta{EARTH_COORDINATES}) {
|
|
157 |
die("$ARGV[0]: only beam and earth coordinates implemented so far\n");
|
|
158 |
}
|
|
159 |
|
|
160 |
$lastGoodBin = 0;
|
|
161 |
for ($e=0; $e<=$#{$dta{ENSEMBLE}}; $e++) { # check/transform velocities
|
|
162 |
next if (defined($first_ens) &&
|
|
163 |
$dta{ENSEMBLE}[$e]->{NUMBER} < $first_ens);
|
|
164 |
$P{first_ens} = $dta{ENSEMBLE}[$e]->{NUMBER},$fe = $e
|
|
165 |
unless defined($P{first_ens});
|
|
166 |
last if (defined($last_ens) &&
|
|
167 |
$dta{ENSEMBLE}[$e]->{NUMBER} > $last_ens);
|
|
168 |
$P{last_ens} = $dta{ENSEMBLE}[$e]->{NUMBER};
|
|
169 |
$le = $e;
|
|
170 |
|
|
171 |
die("3-beams used in ensemble #$dta{ENSEMBLE}[$e]->{NUMBER}\n")
|
|
172 |
if ($dta{ENSEMBLE}[$e]->{N_BEAMS_USED} < 4);
|
|
173 |
die("BIT error in ensemble $dta{ENSEMBLE}[$e]->{NUMBER}\n")
|
|
174 |
if defined($dta{ENSEMBLE}[$e]->{BUILT_IN_TEST_ERROR});
|
|
175 |
die("Low gain in ensemble #$dta{ENSEMBLE}[$e]->{NUMBER}\n")
|
|
176 |
if ($dta{ENSEMBLE}[$e]->{LOW_GAIN});
|
|
177 |
|
|
178 |
for (my($b)=0; $b<$dta{N_BINS}; $b++) {
|
|
179 |
next unless (defined($dta{ENSEMBLE}[$e]->{VELOCITY}[$b][0]) &&
|
|
180 |
defined($dta{ENSEMBLE}[$e]->{VELOCITY}[$b][1]) &&
|
|
181 |
defined($dta{ENSEMBLE}[$e]->{VELOCITY}[$b][2]) &&
|
|
182 |
defined($dta{ENSEMBLE}[$e]->{VELOCITY}[$b][3]));
|
|
183 |
@{$dta{ENSEMBLE}[$e]->{VELOCITY}[$b]} = $beamCoords
|
|
184 |
? velInstrumentToEarth(\%dta,$e,
|
|
185 |
velBeamToInstrument(\%dta,@{$dta{ENSEMBLE}[$e]->{VELOCITY}[$b]})
|
|
186 |
)
|
|
187 |
: velApplyHdgBias(\%dta,$e,@{$dta{ENSEMBLE}[$e]->{VELOCITY}[$b]});
|
|
188 |
$dta{ENSEMBLE}[$e]->{GOOD_VEL}[$b] = 1;
|
|
189 |
$good_vels[$b]++;
|
|
190 |
$lastGoodBin = $b if ($b > $lastGoodBin);
|
|
191 |
$firstGoodEns = $e unless defined($firstGoodEns);
|
|
192 |
$lastGoodEns = $e;
|
|
193 |
}
|
|
194 |
}
|
|
195 |
|
|
196 |
unless (defined($opt_r)) {
|
|
197 |
$fe = $firstGoodEns;
|
|
198 |
$le = $lastGoodEns;
|
|
199 |
}
|
|
200 |
|
|
201 |
$firstBin = 0;
|
|
202 |
$lastBin = $lastGoodBin;
|
|
203 |
|
|
204 |
print(STDERR "\n");
|
|
205 |
print(STDERR "Start: $dta{ENSEMBLE}[$fe]->{DATE} $dta{ENSEMBLE}[$fe]->{TIME}\n");
|
|
206 |
print(STDERR "End : $dta{ENSEMBLE}[$le]->{DATE} $dta{ENSEMBLE}[$le]->{TIME}\n");
|
|
207 |
printf(STDERR "Bins : %d-%d\n",$firstBin+1,$lastBin+1);
|
|
208 |
|
|
209 |
#-----------
|
|
210 |
# Write Data
|
|
211 |
#-----------
|
|
212 |
|
|
213 |
print(STDERR "Writing NetCDF files");
|
|
214 |
&dumpVar('u','[m/s]','eastward velocity' ,'VELOCITY',0); print(STDERR '.');
|
|
215 |
&dumpVar('v','[m/s]','northward velocity','VELOCITY',1); print(STDERR '.');
|
|
216 |
&dumpVar('w','[m/s]','vertical velocity' ,'VELOCITY',2); print(STDERR '.');
|
|
217 |
&dumpVar('e','[m/s]','error velocity' ,'VELOCITY',3); print(STDERR '.');
|
|
218 |
|
|
219 |
&dumpVar('ea1','[count]','beam-1 echo amplitude','ECHO_AMPLITUDE',0); print(STDERR '.');
|
|
220 |
&dumpVar('ea2','[count]','beam-2 echo amplitude','ECHO_AMPLITUDE',1); print(STDERR '.');
|
|
221 |
&dumpVar('ea3','[count]','beam-3 echo amplitude','ECHO_AMPLITUDE',2); print(STDERR '.');
|
|
222 |
&dumpVar('ea4','[count]','beam-4 echo amplitude','ECHO_AMPLITUDE',3); print(STDERR '.');
|
|
223 |
|
|
224 |
&dumpVar('corr1','[count]','beam-1 correlation','CORRELATION',0); print(STDERR '.');
|
|
225 |
&dumpVar('corr2','[count]','beam-2 correlation','CORRELATION',1); print(STDERR '.');
|
|
226 |
&dumpVar('corr3','[count]','beam-3 correlation','CORRELATION',2); print(STDERR '.');
|
|
227 |
&dumpVar('corr4','[count]','beam-4 correlation','CORRELATION',3); print(STDERR '.');
|
|
228 |
|
|
229 |
&dumpVar('pcg1','[count]','beam-1 %-good','PERCENT_GOOD',0); print(STDERR '.');
|
|
230 |
&dumpVar('pcg2','[count]','beam-2 %-good','PERCENT_GOOD',1); print(STDERR '.');
|
|
231 |
&dumpVar('pcg3','[count]','beam-3 %-good','PERCENT_GOOD',2); print(STDERR '.');
|
|
232 |
&dumpVar('pcg4','[count]','beam-4 %-good','PERCENT_GOOD',3); print(STDERR '.');
|
|
233 |
print(STDERR "\n");
|
|
234 |
|
|
235 |
exit(0);
|