.interp.ADCP
author A.M. Thurnherr <athurnherr@yahoo.com>
Sat, 24 Jul 2021 09:38:16 -0400
changeset 46 70e566505a12
parent 39 56bdfe65a697
permissions -rw-r--r--
V7.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     1
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#                    . I N T E R P . A D C P 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    doc: Fri Apr 16 16:07:48 2010
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    dlm: Tue Aug  9 23:07:35 2011
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    (c) 2010 A.M. Thurnherr
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    uE-Info: 81 0 NIL 0 0 72 2 2 4 NIL ofnI
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
# interpolation scheme mimicking RDI ADCP response as described in
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
# Broadband primer, p.17
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
# 	Apr 16, 2010: - created
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#	Aug  9, 2011: - added -u
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
# NOTES:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#	- interface is described in [.interp.linear]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
$IS_opts = 'b:u';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
$IS_optsUsage = '[pass -u)nfiltered] -b)in/pulse <length>';
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
sub IS_usage()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
	&antsUsageError()
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
		unless defined($opt_b);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
sub IS_init($$$$) {}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
# &IS_interpolate(br,idr,xf,xv,xi,f)	interpolate field f
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
#		br							data buffer reference
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
#		idr							init-data reference
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#		xf							x field
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
#		xv							x value
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
#		xi							index of last record with x-value <= x
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#		f							field number to interpolate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#		<ret val>					interpolated value
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
# NB:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#	- handle f == xf
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#	- return NaN if any of the y values required is NaN
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
sub IS_interpolate($$$$$$)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
	my($bR,$idR,$xf,$xv,$xi,$f) = @_;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
	return $xv if ($xf == $f);							# return target x
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
	my($tow) = $xi;										# top of triangular sampling window
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
	while ($tow>=0 && (!numberp($bR->[$tow][$xf]) || $bR->[$tow][$xf] > $xv-$opt_b)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
		$tow--;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
	if ($tow < 0) {										# incomplete window
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
		return nan unless ($opt_u);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
		$tow = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
		$tow++;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    62
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    63
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    64
	my($bow) = $xi+1;									# bottom of triangular sampling window
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
	while ($bow<=$#{$bR} && (!numberp($bR->[$bow][$xf]) || $bR->[$bow][$xf] < $xv+$opt_b)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
		$bow++;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
	if ($bow > $#{$bR}) {								# incomplete window
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
		return nan unless ($opt_u);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
		$bow = $#{$bR};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
	} else {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
		$bow--;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
	my($sweight) = 0;									# calculate weighted average
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
	my($sum) = 0;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
	for (my($i)=$tow; $i<=$bow; $i++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
		next unless (numberp($bR->[$i][$xf]) && numberp($bR->[$i][$f]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
		my($weight) = 1 - abs($bR->[$i][$xf]-$xv)/$opt_b;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
		$sum += $weight * $bR->[$i][$f];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
		$sweight += $weight;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
	return ($sweight>0) ? $sum/$sweight : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
#----------------------------------------------------------------------
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
1;