libLADCP.pl
changeset 39 56bdfe65a697
parent 36 04e8cb4f8073
child 47 dde46143288c
equal deleted inserted replaced
38:15c603bc4f70 39:56bdfe65a697
     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')
   123 #--------------------------------------------------------------------------------
   125 #--------------------------------------------------------------------------------
   124 
   126 
   125 sub T_tilt($$)
   127 sub T_tilt($$)
   126 {
   128 {
   127     my($k,$dprime) =
   129     my($k,$dprime) =
   128         &antsFunUsage(2,'ff','<vertical wavenumber[rad/s]> <d-prime[m]>',@_);
   130         &antsFunUsage(2,'ff','T_tilt(<vertical wavenumber[rad/s]> <d-prime[m]>)',@_);
   129     return $dprime ? 1 / sinc($k*$dprime/2/$PI)**2 : 1;
   131     return $dprime ? 1 / sinc($k*$dprime/2/$PI)**2 : 1;
   130 }
   132 }
   131 
   133 
   132 sub dprime($)
   134 sub dprime($)
   133 {
   135 {
   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 }