1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <math/surfit.h>
include "surfitdef.h"
# ISREPLACE -- Procedure to restore the surface fit stored by SIFSAVE
# to the surface descriptor for use by the evaluating routines. The
# surface parameters, surface type, xorder (or number of polynomial
# pieces in x), yorder (or number of polynomial pieces in y), xterms,
# number of columns and number of lines, are stored in the first
# six elements of the real array fit, followed by the SF_NYCOEFF(sf) *
# SF_NYCOEFF(sf) surface coefficients. The coefficient of B(i,x) * B(j,y)
# is stored in element number 6 + (i - 1) * SF_NYCOEFF(sf) + j of the
# array fit.
procedure isreplace (sf, fit)
pointer sf # surface descriptor
real fit[ARB] # array containing the surface parameters and
# coefficients
int surface_type, xorder, yorder, ncols, nlines
begin
# allocate space for the surface descriptor
call calloc (sf, LEN_SFSTRUCT, TY_STRUCT)
xorder = nint (SF_SAVEXORDER(fit))
if (xorder < 1)
call error (0, "SFRESTORE: Illegal x order.")
yorder = nint (SF_SAVEYORDER(fit))
if (yorder < 1)
call error (0, "SFRESTORE: Illegal y order.")
ncols = nint (SF_SAVENCOLS(fit))
if (ncols < 1)
call error (0, "SFRESTORE: Illegal x range.")
nlines = nint (SF_SAVENLINES(fit))
if (nlines < 1)
call error (0, "SFRESTORE: Illegal y range.")
# set surface type dependent surface descriptor parameters
surface_type = nint (SF_SAVETYPE(fit))
switch (surface_type) {
case SF_LEGENDRE, SF_CHEBYSHEV:
SF_NXCOEFF(sf) = xorder
SF_XORDER(sf) = xorder
SF_XRANGE(sf) = 2. / real (ncols + 1)
SF_XMAXMIN(sf) = - real (ncols + 1) / 2.
SF_XMIN(sf) = 0.
SF_XMAX(sf) = real (ncols + 1)
SF_NYCOEFF(sf) = yorder
SF_YORDER(sf) = yorder
SF_YRANGE(sf) = 2. / real (nlines + 1)
SF_YMAXMIN(sf) = - real (nlines + 1) / 2.
SF_YMIN(sf) = 0.
SF_YMAX(sf) = real (nlines + 1)
SF_XTERMS(sf) = SF_SAVEXTERMS(fit)
case SF_SPLINE3:
SF_NXCOEFF(sf) = (xorder + SPLINE3_ORDER - 1)
SF_XORDER(sf) = SPLINE3_ORDER
SF_NXPIECES(sf) = xorder - 1
SF_XSPACING(sf) = xorder / real (ncols + 1)
SF_XMIN(sf) = 0.
SF_XMAX(sf) = real (ncols + 1)
SF_NYCOEFF(sf) = (yorder + SPLINE3_ORDER - 1)
SF_YORDER(sf) = SPLINE3_ORDER
SF_NYPIECES(sf) = yorder - 1
SF_YSPACING(sf) = yorder / real (nlines + 1)
SF_YMIN(sf) = 0.
SF_YMAX(sf) = real (nlines + 1)
SF_XTERMS(sf) = YES
case SF_SPLINE1:
SF_NXCOEFF(sf) = (xorder + SPLINE1_ORDER - 1)
SF_XORDER(sf) = SPLINE1_ORDER
SF_NXPIECES(sf) = xorder - 1
SF_XSPACING(sf) = xorder / real (ncols + 1)
SF_XMIN(sf) = 0.
SF_XMAX(sf) = real (ncols + 1)
SF_NYCOEFF(sf) = (yorder + SPLINE1_ORDER - 1)
SF_YORDER(sf) = SPLINE1_ORDER
SF_NYPIECES(sf) = yorder - 1
SF_YSPACING(sf) = yorder / real (nlines + 1)
SF_YMIN(sf) = 0.
SF_YMAX(sf) = real (nlines + 1)
SF_XTERMS(sf) = YES
default:
call error (0, "SFRESTORE: Unknown surface type.")
}
# set remaining curve parameters
SF_TYPE(sf) = surface_type
SF_NLINES(sf) = nlines
SF_NCOLS(sf) = ncols
# allocate space for the coefficient array
SF_XBASIS(sf) = NULL
SF_YBASIS(sf) = NULL
SF_XMATRIX(sf) = NULL
SF_YMATRIX(sf) = NULL
SF_XCOEFF(sf) = NULL
SF_WZ(sf) = NULL
SF_TLEFT(sf) = NULL
call calloc (SF_COEFF(sf), SF_NXCOEFF(sf) * SF_NYCOEFF(sf), MEM_TYPE)
# restore coefficient array
call amovr (fit[SF_SAVECOEFF+1], COEFF(SF_COEFF(sf)), SF_NYCOEFF(sf) *
SF_NXCOEFF(sf))
end
|