antsintegrate.pl
author Andreas Thurnherr <ant@ldeo.columbia.edu>
Mon, 13 Apr 2020 11:06:22 -0400
changeset 40 c1803ae2540f
parent 0 a5233793bf69
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
#!/usr/bin/perl
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     2
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     3
#                    A N T S I N T E G R A T E . P L 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     4
#                    doc: Fri Feb 28 22:54:04 1997
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     5
#                    dlm: Fri Oct 15 23:14:11 2010
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     6
#                    (c) 1997 Andreas Thurnherr
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     7
#                    uE-Info: 27 62 NIL 0 0 72 2 2 4 NIL ofnI
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     8
#======================================================================
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
     9
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    10
# Integrator Library; used by [integrate] and [transport]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    11
#	([transport] is deprecated...)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    12
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    13
# HISTORY:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    14
#	Nov 14, 2000: - divorced from [integrate]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    15
#	Nov 16, 2000: - added $opt_i
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    16
#				  - BUG: $opt_c forgot to output last record
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    17
#				  - BUG: copying of buffer had not worked
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    18
#	Nov 17, 2000: - changed $opt_i to $opt_l
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    19
#	Nov 24, 2000: - aimless changes
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    20
#	Mar 10, 2002: - added $dx output if $dfnr defined
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    21
#	Mar 30, 2002: - cosmetics
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    22
#	May 24, 2002: - added -b)ox to -f
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    23
#	May 25, 2002: - BUG: -c did not output records with missing y values
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    24
#				  - changed to dying on missing x values
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    25
#	Dec 20, 2005: - BUG: -cf produced short 1st record (dfnr not set)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    26
#   Jul  1, 2006: - Version 3.3 [HISTORY]
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    27
#	Oct 15, 2010: - removed warning about integrand set to nan
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    28
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    29
# NOTES:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    30
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    31
#	&integrate() can run in several moments:
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    32
#		0:	integral
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    33
#		1:	integral weighted by (signed) distance from zero
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    34
#		2:	integral weighted by square of distance from zero
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    35
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    36
#	&integrate() returns the single-value sum; without -f @sum is
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    37
#	set as a side-effect
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    38
#  
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    39
#	unless xmin,xmax are given as args, the integral is taken over the
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    40
#	entire data
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    41
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    42
#	records with missing y values have the integrand(s) set to NaN
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    43
#
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    44
#	because this routine was ones an integral part of [integrate] it
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    45
#	uses a number of global variables (ug-lee!):
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    46
#		$xfnr					y = f(x)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    47
#		$opt_c					output sum after each step (cummulative)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    48
#		$opt_f					integrate only given field
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    49
#		  $yfnr   (if $opt_f)	... this one
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    50
#		  $opt_b				use box rule
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    51
#		  $iScale (if $opt_f)	scale integrated values
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    52
#		  $opt_l  (if $opt_f)	output individual summands
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    53
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    54
sub integrate ($@)										# ret integral, set $m
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    55
{
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    56
	my($moment,$zero,$xmin,$xmax) = @_;					# optional args
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    57
	my($lastx,$cur,$curwt,$sum,$cury);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    58
	my($dx,$r,$f,@out,@nan,$warned);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    59
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    60
	for ($f=0; $f<$antsBufNFields; $f++) {				# prep nan output
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    61
		$nan[$f] = nan;
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
	for ($r=0; $r<=$#ants_; $r++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    65
		croak("$0: can't handle non-numeric x values\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    66
			unless (numberp($ants_[$r][$xfnr]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    67
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    68
#	1st, find a valid x value, and a y value on -f (one field only).
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    69
#	On -c, generate output: 0 on open limits, nan (only possible
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    70
#	if -f is set) otherwise
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    71
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    72
		unless (defined($lastx)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    73
			if (defined($opt_f)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    74
				if ($opt_c) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    75
					@out = @{$ants_[$r]};
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    76
					$out[$yfnr] = numberp($ants_[$r][$yfnr]) ? 0 : nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    77
					$out[$dfnr] = nan if (defined($dfnr));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    78
					&antsOut(@out);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    79
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    80
				next unless (numberp($ants_[$r][$yfnr]));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    81
				$lastx = $ants_[$r][$xfnr];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    82
				croak("$0: lower limit ($xmin) < first valid x-value ($lastx)\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    83
					if (defined($xmin) && $lastx > $xmin);  
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    84
				$lasty = $ants_[$r][$yfnr];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    85
				next;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    86
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    87
			$lastx = $ants_[$r][$xfnr];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    88
			if ($opt_c) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    89
				for ($f=0; $f<$antsBufNFields; $f++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    90
					$out[$f] = ($f == $xfnr) ? $ants_[$r][$f] :
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    91
									(numberp($ants_[$r][$f]) ? 0 : nan);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    92
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    93
				&antsOut(@out);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    94
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    95
			next;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    96
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    97
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    98
#	next, update x&y while below lower limit for later interpolation
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
    99
#	NB: only possible on -f!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   100
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   101
		if (defined($xmin) && $ants_[$r][$xfnr] < $xmin) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   102
			if (numberp($ants_[$r][$yfnr])) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   103
				$lastx = $ants_[$r][$xfnr];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   104
				$lasty = $ants_[$r][$yfnr];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   105
            }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   106
			if ($opt_c) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   107
				$ants_[$r][$yfnr] = nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   108
				&antsOut(@{$ants_[$r]});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   109
            }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   110
			next;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   111
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   112
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   113
#	we have an x-value > min; is it valid?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   114
#	NB: xmin is undefined once lower limit is handled
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   115
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   116
		croak("$0: Error: no data within integration limits\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   117
			if (defined($xmin) && defined($xmax) && $ants_[$r][$xfnr] > $xmax);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   118
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   119
#	finally! we have a valid x-value; if it's the first, interpolate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   120
#	y at xmin if that's defined
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   121
#	undefined xmin at end so this code is not executed again
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   122
#	NB: xmin can only be defined on -f!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   123
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   124
		if (defined($xmin)) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   125
			unless (numberp($ants_[$r][$yfnr])) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   126
				if ($opt_c) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   127
					$ants_[$r][$yfnr] = nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   128
					&antsOut(@{$ants_[$r]});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   129
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   130
				next;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   131
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   132
			$lasty += ($xmin-$lastx) / ($ants_[$r][$xfnr]-$lastx)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   133
						* ($ants_[$r][$yfnr]-$lasty);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   134
			$lastx = $xmin; undef($xmin);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   135
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   136
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   137
#	it is also possible (though not on the first time round), that we
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   138
#	have just passed the upper limit (xmax); simulate normal code but
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   139
#	using xmax (and interpolated y value) instead of real data
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   140
#	NB: xmax can only be defined on -f!
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   141
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   142
		if (defined($xmax) && $ants_[$r][$xfnr] >= $xmax) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   143
			unless (numberp($ants_[$r][$yfnr])) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   144
				if ($opt_c) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   145
					$ants_[$r][$yfnr] = nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   146
					&antsOut(@{$ants_[$r]});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   147
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   148
				next;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   149
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   150
			$dx = $xmax - $lastx;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   151
			$cury = $lasty + $dx / ($ants_[$r][$xfnr]-$lastx)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   152
								* ($ants_[$r][$yfnr]-$lasty);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   153
			croak("$0: x-field must be monotonically increasing [xmax=$xmax, lastx=$lastx]\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   154
				if ($dx < 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   155
			$cur  = ($cury+$lasty)/2 * $dx;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   156
			$cur *= (($xmax+$lastx)/2-$zero)**$moment if ($moment);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   157
			$sum += $cur*$iScale;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   158
			if ($opt_c) {								# cummulative
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   159
				@out = @{$ants_[$r]};					# copy everything
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   160
				$out[$yfnr] = $sum;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   161
				$out[$dfnr] = $dx if (defined($dfnr));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   162
				&antsOut(@out);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   163
			} elsif ($opt_l) {							# individual summands
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   164
				@out = @{$ants_[$r]};					# copy everything
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   165
				$out[$yfnr] = $cur*$iScale;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   166
				$out[$dfnr] = $dx if (defined($dfnr));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   167
				&antsOut(@out);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   168
            }
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   169
            $lastx = $ants_[$r][$xfnr];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   170
			last;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   171
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   172
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   173
#	phoar! we are finally handling the normal case  
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   174
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   175
		$dx = $ants_[$r][$xfnr] - $lastx;				# calc dx
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   176
		croak("$0: x-field must be monotonically increasing [curx=$ants_[$r][$xfnr], lastx=$lastx]\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   177
			if ($dx < 0);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   178
	
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   179
		if (defined($opt_f)) {							# integrate single field
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   180
			unless (numberp($ants_[$r][$yfnr])) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   181
				if ($opt_c) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   182
					$ants_[$r][$yfnr] = nan;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   183
					&antsOut(@{$ants_[$r]});
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   184
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   185
				next;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   186
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   187
			$cur = $opt_b ?
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   188
				$ants_[$r][$yfnr] * $dx :				# box rule
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   189
				($ants_[$r][$yfnr]+$lasty)/2 * $dx; 	# interpolate
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   190
			$cur *= (($ants_[$r][$xfnr]+$lastx)/2-$zero)**$moment
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   191
				if ($moment);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   192
			$sum += $cur*$iScale;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   193
			$lasty = $ants_[$r][$yfnr];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   194
			if ($opt_c) {								# cummulative
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   195
				@out = @{$ants_[$r]};					# copy everything
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   196
				$out[$yfnr] = $sum;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   197
			} elsif ($opt_l) {							# individual summands
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   198
				@out = @{$ants_[$r]};					# copy everything
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   199
				$out[$yfnr] = $cur*$iScale;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   200
            }			
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   201
		} else {										# integrate all
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   202
			for ($f=0; $f<$antsBufNFields; $f++) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   203
				next if ($f == $xfnr);					# except x-field
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   204
				if (numberp($ants_[$r][$f]))	{		# val found
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   205
					$sum[$f] += $ants_[$r][$f] * $dx	# box-rule (no interp)
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   206
						unless isnan($sum[$f]);			# had missing vals
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   207
				} else {								# val missing 
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   208
					$sum[$f] = nan; 					# mark for later
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   209
#					unless ($warned) {					# warn user
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   210
#						&antsInfo("Warning: integrand(s) set to nan due to missing vals");
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   211
#						$warned = 1;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   212
#					}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   213
				}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   214
				$out[$f] = $sum[$f] if ($opt_c);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   215
			}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   216
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   217
		if ($opt_c || $opt_l) {
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   218
			$out[$xfnr] = $ants_[$r][$xfnr];
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   219
			$out[$dfnr] = $dx if (defined($dfnr));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   220
			&antsOut(@out);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   221
		}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   222
		$lastx = $ants_[$r][$xfnr];						# last good x
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   223
	}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   224
	croak("$0: empty input!\n")							# never initialized
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   225
	    unless (defined($lastx));
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   226
	croak("$0: upper limit > last valid x-value!\n")
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   227
	    if (defined($xmax) && $xmax>$lastx);
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   228
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   229
	return $sum;
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   230
}
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   231
A.M. Thurnherr <athurnherr@yahoo.com>
parents:
diff changeset
   232
1;