diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /math/gsurfit/gs_fevalr.x | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'math/gsurfit/gs_fevalr.x')
-rw-r--r-- | math/gsurfit/gs_fevalr.x | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/math/gsurfit/gs_fevalr.x b/math/gsurfit/gs_fevalr.x new file mode 100644 index 00000000..7988f66a --- /dev/null +++ b/math/gsurfit/gs_fevalr.x @@ -0,0 +1,271 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include <math/gsurfit.h> + +# GS_EVPOLY -- Procedure to evluate the polynomials + +procedure rgs_evpoly (coeff, x, y, zfit, npts, xterms, xorder, yorder, k1x, + k2x, k1y, k2y) + +real coeff[ARB] # 1D array of coefficients +real x[npts] # x values of points to be evaluated +real y[npts] +real zfit[npts] # the fitted points +int npts # number of points to be evaluated +int xterms # cross terms ? +int xorder,yorder # order of the polynomials in x and y +real k1x, k2x # normalizing constants +real k1y, k2y + +int i, k, cptr, maxorder, xincr +pointer sp, xb, yb, xbptr, ybptr, accum + +begin + # fit a constant + if (xorder == 1 && yorder == 1) { + call amovkr (coeff[1], zfit, npts) + return + } + + # fit first order in x and y + if (xorder == 2 && yorder == 1) { + call altmr (x, zfit, npts, coeff[2], coeff[1]) + return + } + if (yorder == 2 && xorder == 1) { + call altmr (x, zfit, npts, coeff[2], coeff[1]) + return + } + if (xorder == 2 && yorder == 2 && xterms == NO) { + do i = 1, npts + zfit[i] = coeff[1] + x[i] * coeff[2] + y[i] * coeff[3] + return + } + + # allocate temporary space for the basis functions + call smark (sp) + call salloc (xb, xorder * npts, TY_REAL) + call salloc (yb, yorder * npts, TY_REAL) + call salloc (accum, npts, TY_REAL) + + # calculate basis functions + call rgs_bpol (x, npts, xorder, k1x, k2x, Memr[xb]) + call rgs_bpol (y, npts, yorder, k1y, k2y, Memr[yb]) + + # accumulate the output vector + cptr = 0 + call aclrr (zfit, npts) + if (xterms != GS_XNONE) { + maxorder = max (xorder + 1, yorder + 1) + xincr = xorder + ybptr = yb + do i = 1, yorder { + call aclrr (Memr[accum], npts) + xbptr = xb + do k = 1, xincr { + call awsur (Memr[accum], Memr[xbptr], Memr[accum], npts, + 1.0, coeff[cptr+k]) + xbptr = xbptr + npts + } + call gs_asumvpr (Memr[accum], Memr[ybptr], zfit, zfit, npts) + cptr = cptr + xincr + ybptr = ybptr + npts + switch (xterms) { + case GS_XHALF: + if ((i + xorder + 1) > maxorder) + xincr = xincr - 1 + default: + ; + } + } + } else { + xbptr = xb + do k = 1, xorder { + call awsur (zfit, Memr[xbptr], zfit, npts, 1.0, coeff[k]) + xbptr = xbptr + npts + } + ybptr = yb + npts + do k = 1, yorder - 1 { + call awsur (zfit, Memr[ybptr], zfit, npts, 1.0, coeff[xorder+k]) + ybptr = ybptr + npts + } + } + + + call sfree (sp) +end + +# GS_EVCHEB -- Procedure to evaluate a Chebyshev polynomial assuming that +# the coefficients have been calculated. + +procedure rgs_evcheb (coeff, x, y, zfit, npts, xterms, xorder, yorder, k1x, + k2x, k1y, k2y) + +real coeff[ARB] # 1D array of coefficients +real x[npts] # x values of points to be evaluated +real y[npts] +real zfit[npts] # the fitted points +int npts # number of points to be evaluated +int xterms # cross terms ? +int xorder,yorder # order of the polynomials in x and y +real k1x, k2x # normalizing constants +real k1y, k2y + +int i, k, cptr, maxorder, xincr +pointer sp, xb, yb, xbptr, ybptr, accum + +begin + # fit a constant + if (xorder == 1 && yorder == 1) { + call amovkr (coeff[1], zfit, npts) + return + } + + # allocate temporary space for the basis functions + call smark (sp) + call salloc (xb, xorder * npts, TY_REAL) + call salloc (yb, yorder * npts, TY_REAL) + call salloc (accum, npts, TY_REAL) + + # calculate basis functions + call rgs_bcheb (x, npts, xorder, k1x, k2x, Memr[xb]) + call rgs_bcheb (y, npts, yorder, k1y, k2y, Memr[yb]) + + # accumulate thr output vector + cptr = 0 + call aclrr (zfit, npts) + if (xterms != GS_XNONE) { + maxorder = max (xorder + 1, yorder + 1) + xincr = xorder + ybptr = yb + do i = 1, yorder { + call aclrr (Memr[accum], npts) + xbptr = xb + do k = 1, xincr { + call awsur (Memr[accum], Memr[xbptr], Memr[accum], npts, + 1.0, coeff[cptr+k]) + xbptr = xbptr + npts + } + call gs_asumvpr (Memr[accum], Memr[ybptr], zfit, zfit, npts) + cptr = cptr + xincr + ybptr = ybptr + npts + switch (xterms) { + case GS_XHALF: + if ((i + xorder + 1) > maxorder) + xincr = xincr - 1 + default: + ; + } + } + } else { + xbptr = xb + do k = 1, xorder { + call awsur (zfit, Memr[xbptr], zfit, npts, 1.0, coeff[k]) + xbptr = xbptr + npts + } + ybptr = yb + npts + do k = 1, yorder - 1 { + call awsur (zfit, Memr[ybptr], zfit, npts, 1.0, coeff[xorder+k]) + ybptr = ybptr + npts + } + } + + # free temporary space + call sfree (sp) +end + + +# GS_EVLEG -- Procedure to evaluate a Chebyshev polynomial assuming that +# the coefficients have been calculated. + +procedure rgs_evleg (coeff, x, y, zfit, npts, xterms, xorder, yorder, k1x, k2x, + k1y, k2y) + +real coeff[ARB] # 1D array of coefficients +real x[npts] # x values of points to be evaluated +real y[npts] +real zfit[npts] # the fitted points +int npts # number of points to be evaluated +int xterms # cross terms ? +int xorder,yorder # order of the polynomials in x and y +real k1x, k2x # normalizing constants +real k1y, k2y + +int i, k, cptr, maxorder, xincr +pointer sp, xb, yb, accum, xbptr, ybptr + +begin + # fit a constant + if (xorder == 1 && yorder == 1) { + call amovkr (coeff[1], zfit, npts) + return + } + + # allocate temporary space for the basis functions + call smark (sp) + call salloc (xb, xorder * npts, TY_REAL) + call salloc (yb, yorder * npts, TY_REAL) + call salloc (accum, npts, TY_REAL) + + # calculate basis functions + call rgs_bleg (x, npts, xorder, k1x, k2x, Memr[xb]) + call rgs_bleg (y, npts, yorder, k1y, k2y, Memr[yb]) + + cptr = 0 + call aclrr (zfit, npts) + if (xterms != GS_XNONE) { + maxorder = max (xorder + 1, yorder + 1) + xincr = xorder + ybptr = yb + do i = 1, yorder { + xbptr = xb + call aclrr (Memr[accum], npts) + do k = 1, xincr { + call awsur (Memr[accum], Memr[xbptr], Memr[accum], npts, + 1.0, coeff[cptr+k]) + xbptr = xbptr + npts + } + call gs_asumvpr (Memr[accum], Memr[ybptr], zfit, zfit, npts) + cptr = cptr + xincr + ybptr = ybptr + npts + switch (xterms) { + case GS_XHALF: + if ((i + xorder + 1) > maxorder) + xincr = xincr - 1 + default: + ; + } + } + } else { + xbptr = xb + do k = 1, xorder { + call awsur (zfit, Memr[xbptr], zfit, npts, 1.0, coeff[k]) + xbptr = xbptr + npts + } + ybptr = yb + npts + do k = 1, yorder - 1 { + call awsur (zfit, Memr[ybptr], zfit, npts, 1.0, coeff[xorder+k]) + ybptr = ybptr + npts + } + } + + # free temporary space + call sfree (sp) +end + +# GS_ASUMVP -- Procedure to add the product of two vectors to another vector + +procedure gs_asumvpr (a, b, c, d, npts) + +real a[ARB] # first input vector +real b[ARB] # second input vector +real c[ARB] # third vector +real d[ARB] # output vector +int npts # number of points + +int i + +begin + do i = 1, npts + d[i] = c[i] + a[i] * b[i] +end |