1 #====================================================================== |
1 #====================================================================== |
2 # L I B L A D C P . P L |
2 # L I B L A D C P . P L |
3 # doc: Wed Jun 1 20:38:19 2011 |
3 # doc: Wed Jun 1 20:38:19 2011 |
4 # dlm: Wed Apr 25 17:41:36 2018 |
4 # dlm: Sat Apr 6 19:42:07 2019 |
5 # (c) 2011 A.M. Thurnherr |
5 # (c) 2011 A.M. Thurnherr |
6 # uE-Info: 46 27 NIL 0 0 70 2 2 4 NIL ofnI |
6 # uE-Info: 211 34 NIL 0 0 70 2 2 4 NIL ofnI |
7 #====================================================================== |
7 #====================================================================== |
8 |
8 |
9 # HISTORY: |
9 # HISTORY: |
10 # Jun 1, 2011: - created |
10 # Jun 1, 2011: - created |
11 # Jul 29, 2011: - improved |
11 # Jul 29, 2011: - improved |
22 # Oct 25, 2012: - renamed T_SM() to T_ASM() |
22 # Oct 25, 2012: - renamed T_SM() to T_ASM() |
23 # Jun 26. 2013: - added T_w_z() |
23 # Jun 26. 2013: - added T_w_z() |
24 # - added parameter checks to processing-specific corrections |
24 # - added parameter checks to processing-specific corrections |
25 # May 18, 2015: - added pulse length to T_w() and T_w_z() |
25 # May 18, 2015: - added pulse length to T_w() and T_w_z() |
26 # Apr 25, 2018: - added eps_VKE() parameterization |
26 # Apr 25, 2018: - added eps_VKE() parameterization |
|
27 # Apr 5, 2018: - adapted to improved antsFunUsage() |
|
28 # - BUG eps_VKE() had erroneous string |
27 |
29 |
28 require "$ANTS/libvec.pl"; |
30 require "$ANTS/libvec.pl"; |
29 require "$ANTS/libfuns.pl"; |
31 require "$ANTS/libfuns.pl"; |
30 |
32 |
31 #------------------------------------------------------------------------------ |
33 #------------------------------------------------------------------------------ |
41 #------------------------------------------------------------------------------ |
43 #------------------------------------------------------------------------------ |
42 |
44 |
43 sub eps_VKE(@) |
45 sub eps_VKE(@) |
44 { |
46 { |
45 my($p0,$c) = |
47 my($p0,$c) = |
46 &antsFunUsage(-1,'.','<p0[m^2/s^2/(rad/m)]> [c[0.021 [1/sqrt(s)]]]',@_); |
48 &antsFunUsage(-1,'.','eps_VKE(<p0[m^2/s^2/(rad/m)]> [c[0.021 [1/sqrt(s)]]])',@_); |
47 $c = 0.021 unless defined($c); |
49 $c = 0.021 unless defined($c); |
48 return numberp($p0) ? ($p0 / $c) ** 2 : nan; |
50 return numberp($p0) ? ($p0 / $c) ** 2 : nan; |
49 } |
51 } |
50 |
52 |
51 #------------------------------------------------------------------------------ |
53 #------------------------------------------------------------------------------ |
67 #------------------------------------------------------------------------------ |
69 #------------------------------------------------------------------------------ |
68 |
70 |
69 sub T_ravg(@) |
71 sub T_ravg(@) |
70 { |
72 { |
71 my($k,$blen,$plen) = |
73 my($k,$blen,$plen) = |
72 &antsFunUsage(-2,'ff','<vertical wavenumber[rad/s]> <bin-length[m]> [pulse-length[m]]',@_); |
74 &antsFunUsage(-2,'ff','T_ravg(<vertical wavenumber[rad/s]> <bin-length[m]> [pulse-length[m]])',@_); |
73 $plen = $blen unless defined($plen); |
75 $plen = $blen unless defined($plen); |
74 return 1 / sinc($k*$blen/2/$PI)**2 / sinc($k*$plen/2/$PI)**2; |
76 return 1 / sinc($k*$blen/2/$PI)**2 / sinc($k*$plen/2/$PI)**2; |
75 } |
77 } |
76 |
78 |
77 #------------------------------------------------------------- |
79 #------------------------------------------------------------- |
80 #------------------------------------------------------------- |
82 #------------------------------------------------------------- |
81 |
83 |
82 sub T_fdiff($$) |
84 sub T_fdiff($$) |
83 { |
85 { |
84 my($k,$dz) = |
86 my($k,$dz) = |
85 &antsFunUsage(2,'ff','<vertical wavenumber[rad/s]> <differencing interval[m]>',@_); |
87 &antsFunUsage(2,'ff','T_fdiff(<vertical wavenumber[rad/s]> <differencing interval[m]>)',@_); |
86 return 1 / sinc($k*$dz/2/$PI)**2; |
88 return 1 / sinc($k*$dz/2/$PI)**2; |
87 } |
89 } |
88 |
90 |
89 #------------------------------------------------------------ |
91 #------------------------------------------------------------ |
90 # T_interp(k,blen,dz) |
92 # T_interp(k,blen,dz) |
93 #------------------------------------------------------------ |
95 #------------------------------------------------------------ |
94 |
96 |
95 sub T_interp($$$) |
97 sub T_interp($$$) |
96 { |
98 { |
97 my($k,$blen,$dz) = |
99 my($k,$blen,$dz) = |
98 &antsFunUsage(3,'fff','<vertical wavenumber[rad/s]> <bin length[m]> <grid resolution[m]>',@_); |
100 &antsFunUsage(3,'fff','T_interp(<vertical wavenumber[rad/s]> <bin length[m]> <grid resolution[m]>)',@_); |
99 return 1 / sinc($k*$blen/2/$PI)**4 / sinc($k*$dz/2/$PI)**2; |
101 return 1 / sinc($k*$blen/2/$PI)**4 / sinc($k*$dz/2/$PI)**2; |
100 } |
102 } |
101 |
103 |
102 #------------------------------------------------------------------------- |
104 #------------------------------------------------------------------------- |
103 # T_binavg(k,dz) |
105 # T_binavg(k,dz) |
106 #------------------------------------------------------------------------- |
108 #------------------------------------------------------------------------- |
107 |
109 |
108 sub T_binavg($$) |
110 sub T_binavg($$) |
109 { |
111 { |
110 my($k,$dz) = |
112 my($k,$dz) = |
111 &antsFunUsage(2,'ff','<vertical wavenumber[rad/s]> <grid resolution[m]>',@_); |
113 &antsFunUsage(2,'ff','T_binavg(<vertical wavenumber[rad/s]> <grid resolution[m]>)',@_); |
112 return 1 / sinc($k*$dz/2/$PI)**2; |
114 return 1 / sinc($k*$dz/2/$PI)**2; |
113 } |
115 } |
114 |
116 |
115 #-------------------------------------------------------------------------------- |
117 #-------------------------------------------------------------------------------- |
116 # T_tilt(k,d') |
118 # T_tilt(k,d') |
145 #---------------------------------------------------------------------- |
147 #---------------------------------------------------------------------- |
146 |
148 |
147 sub T_UH($$$$) |
149 sub T_UH($$$$) |
148 { |
150 { |
149 my($k,$blen,$dz,$range_max) = |
151 my($k,$blen,$dz,$range_max) = |
150 &antsFunUsage(4,'ffff','<vertical wavenumber[rad/s]> <ADCP bin size[m]> <shear grid resolution[m]> <range max[m]>',@_); |
152 &antsFunUsage(-3,'fff','T_UH(<vertical wavenumber[rad/s]> <ADCP bin size[m]> <shear grid resolution[m]> <range max[m]>)',@_); |
151 croak("T_UH($k,$blen,$dz,$range_max): bad parameters\n") |
153 croak("T_UH($k,$blen,$dz,$range_max): bad parameters\n") |
152 unless ($k>=0 && $blen>0 && $dz>0 && $range_max>=0); |
154 unless ($k>=0 && $blen>0 && $dz>0 && $range_max>=0); |
153 return T_ravg($k,$blen) * T_fdiff($k,$blen) * T_interp($k,$blen,$dz) * T_tilt($k,dprime($range_max)); |
155 return T_ravg($k,$blen) * T_fdiff($k,$blen) * T_interp($k,$blen,$dz) * T_tilt($k,dprime($range_max)); |
154 } |
156 } |
155 |
157 |
160 #---------------------------------------------------------------------- |
162 #---------------------------------------------------------------------- |
161 |
163 |
162 sub T_ASM($$$$) |
164 sub T_ASM($$$$) |
163 { |
165 { |
164 my($k,$blen,$dz,$range_max) = |
166 my($k,$blen,$dz,$range_max) = |
165 &antsFunUsage(4,'ffff','<vertical wavenumber[rad/s]> <ADCP bin size[m]> <shear grid resolution[m]> <range max[m]>',@_); |
167 &antsFunUsage(-3,'fff','T_ASM(<vertical wavenumber[rad/s]> <ADCP bin size[m]> <shear grid resolution[m]> <range max[m]>)',@_); |
166 croak("T_ASM($k,$blen,$dz,$range_max): bad parameters\n") |
168 croak("T_ASM($k,$blen,$dz,$range_max): bad parameters\n") |
167 unless ($k>=0 && $blen>0 && $dz>0 && $range_max>=0); |
169 unless ($k>=0 && $blen>0 && $dz>0 && $range_max>=0); |
168 return T_ravg($k,$blen) * T_fdiff($k,$blen) * T_binavg($k,$dz) * T_tilt($k,dprime($range_max)); |
170 return T_ravg($k,$blen) * T_fdiff($k,$blen) * T_binavg($k,$dz) * T_tilt($k,dprime($range_max)); |
169 } |
171 } |
170 |
172 |
178 #------------------------------------------------------------ |
180 #------------------------------------------------------------ |
179 |
181 |
180 sub T_VI($$$$$) |
182 sub T_VI($$$$$) |
181 { |
183 { |
182 my($k,$blen,$sel,$dz,$range_max) = |
184 my($k,$blen,$sel,$dz,$range_max) = |
183 &antsFunUsage(5,'ff.ff','<vertical wavenumber[rad/s]> <ADCP bin size[m]> <superensemble size[m]|nan> <shear grid resolution[m]> <range max[m]>',@_); |
185 &antsFunUsage(-4,'ff.f','T_VI(<vertical wavenumber[rad/s]> <ADCP bin size[m]> <superensemble size[m]|nan> <shear grid resolution[m]> <range max[m]>)',@_); |
184 return T_VI_alt($k,$blen,$sel,$dz,dprime($range_max)); |
186 return T_VI_alt($k,$blen,$sel,$dz,dprime($range_max)); |
185 } |
187 } |
186 |
188 |
187 sub T_VI_alt($$$$$) |
189 sub T_VI_alt($$$$$) |
188 { |
190 { |
189 my($k,$blen,$sel,$dz,$dprime) = |
191 my($k,$blen,$sel,$dz,$dprime) = |
190 &antsFunUsage(5,'ff.ff','<vertical wavenumber[rad/s]> <ADCP bin size[m]> <superensemble size[m]|nan> <shear grid resolution[m]> <tilt d-prime[m]>',@_); |
192 &antsFunUsage(-4,'ff.ff','T_VI_alt(<vertical wavenumber[rad/s]> <ADCP bin size[m]> <superensemble size[m]|nan> <shear grid resolution[m]> <tilt d-prime[m]>)',@_); |
191 croak("T_VI_alt($k,$blen,$sel,$dz,$range_max): bad parameters\n") |
193 croak("T_VI_alt($k,$blen,$sel,$dz,$range_max): bad parameters\n") |
192 unless ($k>=0 && $blen>0 && $sel ne '' && $dz>0 && $range_max>=0); |
194 unless ($k>=0 && $blen>0 && $sel ne '' && $dz>0 && $range_max>=0); |
193 croak("$0: tilt-dprime outside range [0..$blen]\n") |
195 croak("$0: tilt-dprime outside range [0..$blen]\n") |
194 unless ($dprime>=0 && $dprime<=$blen); |
196 unless ($dprime>=0 && $dprime<=$blen); |
195 return ($sel>0) ? T_ravg($k,$blen) * T_binavg($k,$sel) * T_binavg($k,$dz) * T_tilt($k,$dprime) |
197 return ($sel>0) ? T_ravg($k,$blen) * T_binavg($k,$sel) * T_binavg($k,$dz) * T_tilt($k,$dprime) |
204 |
206 |
205 { my(@fc); |
207 { my(@fc); |
206 sub T_w(@) |
208 sub T_w(@) |
207 { |
209 { |
208 my($k,$blen,$plen,$dz,$range_max) = |
210 my($k,$blen,$plen,$dz,$range_max) = |
209 &antsFunUsage(5,'fffff', |
211 &antsFunUsage(-4,'ffff', |
210 '[vertical wavenumber[rad/s]] <ADCP bin length[m]> <pulse length[m]> <output grid resolution[m]> <range max[m]>', |
212 'T_w([vertical wavenumber[rad/s]] <ADCP bin length[m]> <pulse length[m]> <output grid resolution[m]> <range max[m]>)', |
211 \@fc,'k',undef,undef,undef,undef,@_); |
213 \@fc,'k',undef,undef,undef,@_); |
212 croak("T_w($k,$blen,$plen,$dz,$range_max): bad parameters\n") |
214 croak("T_w($k,$blen,$plen,$dz,$range_max): bad parameters\n") |
213 unless ($k>=0 && $blen>0 && $plen>0 && $dz>0 && $range_max>=0); |
215 unless ($k>=0 && $blen>0 && $plen>0 && $dz>0 && $range_max>=0); |
214 return T_ravg($k,$blen,$plen) * T_binavg($k,$dz) * T_tilt($k,dprime($range_max)); |
216 return T_ravg($k,$blen,$plen) * T_binavg($k,$dz) * T_tilt($k,dprime($range_max)); |
215 } |
217 } |
216 } |
218 } |
225 |
227 |
226 { my(@fc); |
228 { my(@fc); |
227 sub T_w_z(@) |
229 sub T_w_z(@) |
228 { |
230 { |
229 my($k,$blen,$plen,$dz,$range_max) = |
231 my($k,$blen,$plen,$dz,$range_max) = |
230 &antsFunUsage(5,'fffff', |
232 &antsFunUsage(-4,'ffff', |
231 '[vertical wavenumber[rad/s]] <ADCP bin size[m]> <pulse length[m]> <output grid resolution[m]> <range max[m]>', |
233 'T_w_z([vertical wavenumber[rad/s]] <ADCP bin size[m]> <pulse length[m]> <output grid resolution[m]> <range max[m]>)', |
232 \@fc,'k',undef,undef,undef,undef,@_); |
234 \@fc,'k',undef,undef,undef,@_); |
233 croak("T_w_z($k,$blen,$plen,$dz,$range_max): bad parameters\n") |
235 croak("T_w_z($k,$blen,$plen,$dz,$range_max): bad parameters\n") |
234 unless ($k>=0 && $blen>0 && $plen>0 && $dz>0 && $range_max>=0); |
236 unless ($k>=0 && $blen>0 && $plen>0 && $dz>0 && $range_max>=0); |
235 return T_ravg($k,$blen,$plen) * T_binavg($k,$dz) * T_tilt($k,dprime($range_max)) * T_fdiff($k,$dz); |
237 return T_ravg($k,$blen,$plen) * T_binavg($k,$dz) * T_tilt($k,dprime($range_max)) * T_fdiff($k,$dz); |
236 } |
238 } |
237 } |
239 } |