aboutsummaryrefslogtreecommitdiff
path: root/math/curfit/cvrefitr.x
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /math/curfit/cvrefitr.x
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'math/curfit/cvrefitr.x')
-rw-r--r--math/curfit/cvrefitr.x103
1 files changed, 103 insertions, 0 deletions
diff --git a/math/curfit/cvrefitr.x b/math/curfit/cvrefitr.x
new file mode 100644
index 00000000..5de9abe2
--- /dev/null
+++ b/math/curfit/cvrefitr.x
@@ -0,0 +1,103 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <math/curfit.h>
+
+include "curfitdef.h"
+
+# CVREFIT -- Procedure to refit the data assuming that the x and w values have
+# not changed. MATRIX and CHOFAC are assumed to remain unchanged from the
+# previous fit. It is only necessary to accumulate a new VECTOR and
+# calculate the coefficients COEFF by forward and back substitution. On
+# the first call to cvrefit the basis functions for all data points are
+# calculated and stored in BASIS. Subsequent calls to cvrefit reference these
+# functions. Intervening calls to cvfit or cvzero zero the basis functions.
+
+procedure cvrefit (cv, x, y, w, ier)
+
+pointer cv # curve descriptor
+real x[ARB] # x array
+real y[ARB] # y array
+real w[ARB] # weight array
+int ier # error code
+
+int i, k
+pointer bzptr
+pointer vzptr, vindex
+
+
+begin
+ # zero the right side of the matrix equation
+ call aclrr (VECTOR(CV_VECTOR(cv)), CV_NCOEFF(cv))
+ vzptr = CV_VECTOR(cv) - 1
+
+ # if first call to cvrefit then calculate and store the basis
+ # functions
+ if (CV_BASIS(cv) == NULL) {
+
+ # allocate space for the basis functions and array containing
+ # the index of the first non-zero basis function
+ call malloc (CV_BASIS(cv), CV_NPTS(cv)*CV_ORDER(cv), TY_REAL)
+ call malloc (CV_WY(cv), CV_NPTS(cv), TY_REAL)
+
+ # calculate the non-zero basis functions
+ switch (CV_TYPE(cv)) {
+ case LEGENDRE:
+ call rcv_bleg (x, CV_NPTS(cv), CV_ORDER(cv), CV_MAXMIN(cv),
+ CV_RANGE(cv), BASIS(CV_BASIS(cv)))
+ case CHEBYSHEV:
+ call rcv_bcheb (x, CV_NPTS(cv), CV_ORDER(cv), CV_MAXMIN(cv),
+ CV_RANGE(cv), BASIS(CV_BASIS(cv)))
+ case SPLINE3:
+ call malloc (CV_LEFT(cv), CV_NPTS(cv), TY_INT)
+ call rcv_bspline3 (x, CV_NPTS(cv), CV_NPIECES(cv),
+ -CV_XMIN(cv), CV_SPACING(cv), BASIS(CV_BASIS(cv)),
+ LEFT(CV_LEFT(cv)))
+ call aaddki (LEFT(CV_LEFT(cv)), vzptr, LEFT(CV_LEFT(cv)),
+ CV_NPTS(cv))
+ case SPLINE1:
+ call malloc (CV_LEFT(cv), CV_NPTS(cv), TY_INT)
+ call rcv_bspline1 (x, CV_NPTS(cv), CV_NPIECES(cv),
+ -CV_XMIN(cv), CV_SPACING(cv), BASIS(CV_BASIS(cv)),
+ LEFT(CV_LEFT(cv)))
+ call aaddki (LEFT(CV_LEFT(cv)), vzptr, LEFT(CV_LEFT(cv)),
+ CV_NPTS(cv))
+ case USERFNC:
+ call rcv_buser (cv, x, CV_NPTS(cv))
+ }
+ }
+
+
+ # accumulate the new right side of the matrix equation
+ call amulr (w, y, Memr[CV_WY(cv)], CV_NPTS(cv))
+ bzptr = CV_BASIS(cv)
+
+ switch (CV_TYPE(cv)) {
+
+ case SPLINE1, SPLINE3:
+
+ do k = 1, CV_ORDER(cv) {
+ do i = 1, CV_NPTS(cv) {
+ vindex = LEFT(CV_LEFT(cv)+i-1) + k
+ VECTOR(vindex) = VECTOR(vindex) + Memr[CV_WY(cv)+i-1] *
+ BASIS(bzptr+i-1)
+ }
+ bzptr = bzptr + CV_NPTS(cv)
+ }
+
+ case LEGENDRE, CHEBYSHEV, USERFNC:
+
+ do k = 1, CV_ORDER(cv) {
+ vindex = vzptr + k
+ do i = 1, CV_NPTS(cv)
+ VECTOR(vindex) = VECTOR(vindex) + Memr[CV_WY(cv)+i-1] *
+ BASIS(bzptr+i-1)
+ bzptr = bzptr + CV_NPTS(cv)
+ }
+
+ }
+
+ # solve for the new coefficients using forward and back
+ # substitution
+ call rcvchoslv (CHOFAC(CV_CHOFAC(cv)), CV_ORDER(cv), CV_NCOEFF(cv),
+ VECTOR(CV_VECTOR(cv)), COEFF(CV_COEFF(cv)))
+end