aboutsummaryrefslogtreecommitdiff
path: root/pkg/utilities/nttools/trebin/tugetput.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/utilities/nttools/trebin/tugetput.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'pkg/utilities/nttools/trebin/tugetput.x')
-rw-r--r--pkg/utilities/nttools/trebin/tugetput.x142
1 files changed, 142 insertions, 0 deletions
diff --git a/pkg/utilities/nttools/trebin/tugetput.x b/pkg/utilities/nttools/trebin/tugetput.x
new file mode 100644
index 00000000..e1359929
--- /dev/null
+++ b/pkg/utilities/nttools/trebin/tugetput.x
@@ -0,0 +1,142 @@
+include <tbset.h>
+
+# tu_getput -- do the interpolation
+# This routine reads the independent and dependent variable values,
+# does the interpolation, and writes the results to the output table.
+#
+# Phil Hodge, 24-April-2000 subroutine created
+
+procedure tu_getput (itp, otp, iv_icp, iv_ocp,
+ icp, ocp, ncols,
+ xout, outrows, iv_step,
+ i_func, extrapolate, ext_value, padvalue, array, verbose)
+
+pointer itp, otp # i: descr of input & output tables
+pointer iv_icp # i: column descr for input indep var column
+pointer iv_ocp # i: column descr for output indep var column
+pointer icp[ncols] # i: column descriptors for input table
+pointer ocp[ncols] # i: column descriptors for output table
+int ncols # i: number of columns to copy
+double xout[ARB] # i: output indep var values
+int outrows # i: size of xout
+double iv_step # i: increment in independent variable
+int i_func # i: interpolation function code
+bool extrapolate # i: true means don't use ext_value
+double ext_value # i: value to assign to extrapolated points
+double padvalue # i: value at end of input indep. var. to ignore
+bool array # i: true if indep var column contains arrays
+bool verbose # i: print info?
+#--
+pointer sp
+pointer xin # scratch for input indep var values
+pointer yin # scratch for input data values
+pointer y2 # scratch for second derivatives (spline only)
+pointer xa # scratch for non-indef indep var values
+pointer ya # scratch for non-indef dep var values
+pointer yout # array of interpolated values
+double dbuf # one interpolated value
+int inrows # number of rows in input table
+int xnelem # number of elements in xin, INDEF & padvalue trimmed
+int nelem # allocated number of elements in array
+int nvals # number of array elements actually gotten
+int n # size of xa, ya, y2 (counting only non-INDEF values)
+int row, col # loop indices
+int i
+int tbpsta(), tbcigi(), tbagtd()
+errchk tugcol, tbagtd, tbaptd, tbegtd, tbeptd, tbrcsc
+
+begin
+ call smark (sp)
+
+ inrows = tbpsta (itp, TBL_NROWS)
+
+ if (array)
+ nelem = tbcigi (iv_icp, TBL_COL_LENDATA)
+ else
+ nelem = inrows
+ call salloc (xin, nelem, TY_DOUBLE)
+ call salloc (yin, nelem, TY_DOUBLE)
+ call salloc (y2, nelem, TY_DOUBLE)
+ call salloc (xa, nelem, TY_DOUBLE)
+ call salloc (ya, nelem, TY_DOUBLE)
+
+ if (array) {
+
+ call salloc (yout, outrows, TY_DOUBLE)
+
+ # for each row in the input table ...
+ do row = 1, inrows {
+
+ # Get input independent variable array from current row.
+ call tugcol (itp, iv_icp, row, Memd[xin], xnelem,
+ padvalue, array)
+
+ # Put output indep var values into current row.
+ call tbaptd (otp, iv_ocp, row, xout, 1, outrows)
+
+ # for each column to be interpolated ...
+ do col = 1, ncols {
+ nelem = tbcigi (icp[col], TBL_COL_LENDATA)
+ if (nelem == 1) {
+ # just copy scalar column
+ call tbrcsc (itp, otp, icp[col], ocp[col], row, row, 1)
+ } else {
+ nvals = tbagtd (itp, icp[col], row, Memd[yin], 1, nelem)
+ call tuifit (i_func, Memd[xin], Memd[yin], xnelem,
+ Memd[xa], Memd[ya], Memd[y2], n)
+ if (n > 0) {
+ do i = 1, outrows {
+ # interpolate
+ call tuival (i_func,
+ Memd[xa], Memd[ya], Memd[y2], n,
+ extrapolate, ext_value, xout,
+ i, outrows, iv_step, Memd[yout+i-1])
+ }
+ # put the result
+ call tbaptd (otp, ocp[col], row,
+ Memd[yout], 1, outrows)
+ } else if (verbose && row == 1) {
+ call printf ("not enough data for interpolation\n")
+ call flush (STDOUT)
+ }
+ }
+ }
+ }
+
+ } else {
+
+ # Get input independent variable column.
+ row = 1
+ call tugcol (itp, iv_icp, row, Memd[xin], xnelem, padvalue, array)
+
+ # Put output independent variable values into output table column.
+ do row = 1, outrows
+ call tbeptd (otp, iv_ocp, row, xout[row])
+
+ # for each column to be interpolated ...
+ do col = 1, ncols {
+
+ do row = 1, inrows
+ call tbegtd (itp, icp[col], row, Memd[yin+row-1])
+
+ # xnelem will be less than or equal to inrows.
+ call tuifit (i_func, Memd[xin], Memd[yin], xnelem,
+ Memd[xa], Memd[ya], Memd[y2], n)
+
+ if (n > 0) {
+ do row = 1, outrows {
+ # interpolate, and put the result
+ call tuival (i_func, Memd[xa], Memd[ya], Memd[y2], n,
+ extrapolate, ext_value,
+ xout, row, outrows, iv_step, dbuf)
+ call tbeptd (otp, ocp[col], row, dbuf)
+ }
+ } else if (verbose) {
+ call printf ("not enough data for interpolation\n")
+ call flush (STDOUT)
+ }
+ }
+ }
+
+ call sfree (sp)
+end