libLADCP.pl
author Andreas Thurnherr <ant@ldeo.columbia.edu>
Mon, 13 Apr 2020 11:06:22 -0400
changeset 40 c1803ae2540f
parent 39 56bdfe65a697
child 47 dde46143288c
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#                    L I B L A D C P . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Wed Jun  1 20:38:19 2011
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
     4
#                    dlm: Sat Apr  6 19:42:07 2019
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 2011 A.M. Thurnherr
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
     6
#                    uE-Info: 211 34 NIL 0 0 70 2 2 4 NIL ofnI
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
#	Jun  1, 2011: - created
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
#	Jul 29, 2011: - improved
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
#	Aug 10, 2011: - made correct
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
#	Aug 11, 2011: - added "convenient combinations"
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#	Aug 18, 2011: - made buoyancy frequency non-constant in S()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#	Jan  4, 2012: - improved T_VI to allow correcting even without superensembles
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#	Jan  5, 2012: - removed S(), which is just pwrdens/N^2 (rather than
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#				    pwrdens/N^2/(2pi) as I erroneously thought)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
#	Jan 18, 2012: - added T_VI_alt() to allow assessment of tilt correction extrema
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    19
#	Aug 22, 2012: - added documentation
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    20
#				  - added T_w()
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    21
#	Sep 24, 2012: - made "k" argument default in T_w()
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
    22
#	Oct 25, 2012: - renamed T_SM() to T_ASM()
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
    23
#	Jun 26. 2013: - added T_w_z()
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
    24
#				  - added parameter checks to processing-specific corrections
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    25
#	May 18, 2015: - added pulse length to T_w() and T_w_z()
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    26
#	Apr 25, 2018: - added eps_VKE() parameterization
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
    27
#	Apr  5, 2018: - adapted to improved antsFunUsage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
    28
#				  - BUG eps_VKE() had erroneous string
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
require "$ANTS/libvec.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
require "$ANTS/libfuns.pl";
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    33
#------------------------------------------------------------------------------
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    34
# VKE parameterization for epsilon
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    35
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    36
# NOTES:
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    37
#	- see Thurnherr et al. (GRL 2015)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    38
#	- calculate eps from p0
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    39
#	- optional second argument allows free choice of parameterization constant
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    40
#	- default value is from paper, which is slightly lower than the current value
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    41
#	  used in [LADCP_VKE], which applies the parameterization only to spectra
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    42
#	  passing a few tests
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    43
#------------------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    44
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    45
sub eps_VKE(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    46
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    47
    my($p0,$c) =
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
    48
        &antsFunUsage(-1,'.','eps_VKE(<p0[m^2/s^2/(rad/m)]> [c[0.021 [1/sqrt(s)]]])',@_);
36
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    49
	$c = 0.021 unless defined($c);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    50
    return numberp($p0) ? ($p0 / $c) ** 2 : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    51
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    52
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 20
diff changeset
    53
#------------------------------------------------------------------------------
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    54
# Spectral corrections for LADCP data
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    55
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    56
# NOTES:
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    57
#	- see Polzin et al. (JAOT 2002), Thurnherr (JAOT 2012)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    58
#	- to correct, multiply power densities (or power, I think) with corrections
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    59
#	- apply to down-/up-cast data only
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    60
#------------------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
#----------------------------------------------------------------------
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    62
# 1. Corrections for individual data acquisition and processing steps
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    65
#------------------------------------------------------------------------------
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    66
# T_ravg(k,blen[,plen])
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    67
#	- correct for range averaging due to finite pulse and finite receive window
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    68
# 	- when called with 2 arguments, bin-length == pulse-length assumed
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    69
#------------------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    71
sub T_ravg(@)
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
{
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    73
    my($k,$blen,$plen) =
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
    74
        &antsFunUsage(-2,'ff','T_ravg(<vertical wavenumber[rad/s]> <bin-length[m]> [pulse-length[m]])',@_);
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    75
	$plen = $blen unless defined($plen);        
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
    76
    return 1 / sinc($k*$blen/2/$PI)**2 / sinc($k*$plen/2/$PI)**2;
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    79
#-------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    80
# T_fdiff(k,dz)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    81
#	- correct for first differencing on a grid with dz spacing
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    82
#-------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
sub T_fdiff($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
{
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    86
    my($k,$dz) =
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
    87
        &antsFunUsage(2,'ff','T_fdiff(<vertical wavenumber[rad/s]> <differencing interval[m]>)',@_);
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    88
    return 1 / sinc($k*$dz/2/$PI)**2;
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    91
#------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    92
# T_interp(k,blen,dz)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    93
#	- correct for CODAS gridding-with-interpolation algorithm
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    94
#	- ONLY USED IN UH SOFTWARE
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    95
#------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
sub T_interp($$$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
{
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
    99
    my($k,$blen,$dz) =
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   100
        &antsFunUsage(3,'fff','T_interp(<vertical wavenumber[rad/s]> <bin length[m]> <grid resolution[m]>)',@_);
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   101
    return 1 / sinc($k*$blen/2/$PI)**4 / sinc($k*$dz/2/$PI)**2;
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   104
#-------------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   105
# T_binavg(k,dz)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   106
#	- correct for simple bin averaging
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   107
#	- Polzin et al. suggest to use blen instead of dz; this must be a typo
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   108
#-------------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
sub T_binavg($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
{
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   112
    my($k,$dz) =
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   113
        &antsFunUsage(2,'ff','T_binavg(<vertical wavenumber[rad/s]> <grid resolution[m]>)',@_);
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   114
    return 1 / sinc($k*$dz/2/$PI)**2;
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   117
#--------------------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   118
# T_tilt(k,d')
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   119
#	- d' is a length scale that depends on tilt stats and range max
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   120
#	- on d' == 0, T_tilt() == 1, i.e. the correction is disabled
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   121
#	- d' = dprime(range_max)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   122
#			- is from a quadratic fit to three data points given by Polzin et al.
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   123
#			- see Thurnherr (J. Tech. 2012) for notes
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   124
#			- on range_max == 0, d' == 0, i.e. the correction is disabled
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   125
#--------------------------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
sub T_tilt($$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
{
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   129
    my($k,$dprime) =
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   130
        &antsFunUsage(2,'ff','T_tilt(<vertical wavenumber[rad/s]> <d-prime[m]>)',@_);
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   131
    return $dprime ? 1 / sinc($k*$dprime/2/$PI)**2 : 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   132
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   133
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   134
sub dprime($)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   135
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   136
	return $_[0] ? -1.2 + 0.0857 * $_[0] - 0.000136 * $_[0]**2 : 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   137
} 
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   138
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   139
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   140
# 2. Processing-Specific Corrections
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   141
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   142
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   143
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   144
# T_UH(k,blen,dz,range_max)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   145
#	- UH implementation of the shear method (WOCE standard)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   146
#	- range_max == 0 disables tilt correction
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   147
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   148
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   149
sub T_UH($$$$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   150
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   151
	my($k,$blen,$dz,$range_max) =
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   152
        &antsFunUsage(-3,'fff','T_UH(<vertical wavenumber[rad/s]> <ADCP bin size[m]> <shear grid resolution[m]> <range max[m]>)',@_);
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   153
	croak("T_UH($k,$blen,$dz,$range_max): bad parameters\n")
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   154
		unless ($k>=0 && $blen>0 && $dz>0 && $range_max>=0);				
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   155
    return T_ravg($k,$blen) * T_fdiff($k,$blen) * T_interp($k,$blen,$dz) * T_tilt($k,dprime($range_max));
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   156
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   157
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   158
#----------------------------------------------------------------------
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   159
# T_ASM(k,blen,dz,range_max)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   160
#	- re-implemented shear method with simple depth binning
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   161
#	- range_max == 0 disables tilt correction
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   162
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   163
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   164
sub T_ASM($$$$)
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
{
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   166
	my($k,$blen,$dz,$range_max) =
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   167
        &antsFunUsage(-3,'fff','T_ASM(<vertical wavenumber[rad/s]> <ADCP bin size[m]> <shear grid resolution[m]> <range max[m]>)',@_);
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   168
	croak("T_ASM($k,$blen,$dz,$range_max): bad parameters\n")
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   169
		unless ($k>=0 && $blen>0 && $dz>0 && $range_max>=0);				
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   170
    return T_ravg($k,$blen) * T_fdiff($k,$blen) * T_binavg($k,$dz) * T_tilt($k,dprime($range_max));
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   171
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   173
#------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   174
# T_VI(k,blen,preavg_dz,grid_dz,range_max)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   175
# T_VI_alt(k,blen,preavg_dz,grid_dz,dprime)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   176
#	- velocity inversion method of Visbeck (J. Tech., 2002)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   177
#	- only valid if pre-averaging into superensembles is used
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   178
#	- range_max == 0 disables tilt correction
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   179
#	- sel == nan disables pre-averaging correction
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   180
#------------------------------------------------------------
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   181
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   182
sub T_VI($$$$$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
{
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   184
	my($k,$blen,$sel,$dz,$range_max) =
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   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]>)',@_);
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   186
	return T_VI_alt($k,$blen,$sel,$dz,dprime($range_max));        
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   189
sub T_VI_alt($$$$$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   190
{
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   191
	my($k,$blen,$sel,$dz,$dprime) =
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   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]>)',@_);
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   193
	croak("T_VI_alt($k,$blen,$sel,$dz,$range_max): bad parameters\n")
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   194
		unless ($k>=0 && $blen>0 && $sel ne '' && $dz>0 && $range_max>=0);				
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
	croak("$0: tilt-dprime outside range [0..$blen]\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
		unless ($dprime>=0 && $dprime<=$blen);
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   197
    return ($sel>0) ? T_ravg($k,$blen) * T_binavg($k,$sel) * T_binavg($k,$dz) * T_tilt($k,$dprime)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   198
    				: T_ravg($k,$blen) * T_binavg($k,$dz) * T_tilt($k,$dprime);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   199
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   200
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   201
#----------------------------------------------------------------------
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   202
# T_w(k,blen,plen,dz,range_max)
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   203
#	- vertical-velocity method of Thurnherr (IEEE 2011)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   204
#	- range_max == 0 disables tilt correction
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   205
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   206
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   207
{ my(@fc);
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   208
	sub T_w(@)
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   209
	{
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   210
		my($k,$blen,$plen,$dz,$range_max) =
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   211
			&antsFunUsage(-4,'ffff',
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   212
				'T_w([vertical wavenumber[rad/s]] <ADCP bin length[m]> <pulse length[m]> <output grid resolution[m]> <range max[m]>)',
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   213
				\@fc,'k',undef,undef,undef,@_);
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   214
		croak("T_w($k,$blen,$plen,$dz,$range_max): bad parameters\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   215
			unless ($k>=0 && $blen>0 && $plen>0 && $dz>0 && $range_max>=0);				
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   216
		return T_ravg($k,$blen,$plen) * T_binavg($k,$dz) * T_tilt($k,dprime($range_max));
3
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 0
diff changeset
   217
	}
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   220
#----------------------------------------------------------------------
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   221
# T_w_z(k,blen,plen,dz,range_max)
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   222
#	- vertical-velocity method of Thurnherr (IEEE 2011)
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   223
#	- first differencing of gridded shear to calculate dw/dz
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   224
#	- NB: grid-scale differentiation assumed
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   225
#	- range_max == 0 disables tilt correction
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   226
#----------------------------------------------------------------------
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   227
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   228
{ my(@fc);
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   229
	sub T_w_z(@)
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   230
	{
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   231
		my($k,$blen,$plen,$dz,$range_max) =
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   232
			&antsFunUsage(-4,'ffff',
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   233
				'T_w_z([vertical wavenumber[rad/s]] <ADCP bin size[m]> <pulse length[m]> <output grid resolution[m]> <range max[m]>)',
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 36
diff changeset
   234
				\@fc,'k',undef,undef,undef,@_);
20
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   235
		croak("T_w_z($k,$blen,$plen,$dz,$range_max): bad parameters\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   236
			unless ($k>=0 && $blen>0 && $plen>0 && $dz>0 && $range_max>=0);				
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 4
diff changeset
   237
		return T_ravg($k,$blen,$plen) * T_binavg($k,$dz) * T_tilt($k,dprime($range_max)) * T_fdiff($k,$dz);
4
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   238
	}
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   239
}
ff72b00b4342 after adding $pi and some other stuff
A.M. Thurnherr <athurnherr@yahoo.com>
parents: 3
diff changeset
   240
0
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   241
1;