/usr/share/gnudatalanguage/lib/spl_init_old.pro is in libgnudatalanguage0 0.9.7-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | ;+
; NAME:
; SPL_INIT
;
; DESCRIPTION:
; Given arrays X and Y of length N containing a tabulated function, i.e.
; Yi = f(Xi), with X1 > X2 > ... > Xn, and given values YP1 and YPN for the
; first derivative of the interpolating function at points 1 and N,
; respectively, this routine returns and array Y2 of length N which contains
; the second derivatives of the interpolating function at the tabulated
; points Xi. If YP1 and/or YPN are equal to 1.E30 or larger, the routine
; is signalled to set the corresponding boundary condition for a natural
; spline, with zero second derivative on that boundary.
;
; This routine is a replacement for the IDL intrinsic function
; to be used with GDL while this latter does not have it as an
; intrinsic.
;
; Note that the keyword DOUBLE of the IDL intrinsic function is ignored.
; Tests in single precision have shown that the routine is exactly
; similar to the IDL function.
; SPL_INTERP is also recoded similarly.
;
; SOURCE:
; Numerical Recipes, 1986. (page 88)
;
; CALLING SEQUENCE:
; y2 = SPL_INIT( x, y, YP0=yp1, YPN_1=ypn)
;
; INPUTS:
; x - independent variable vector
; y - dependent variable vector
; yp1 - first derivative at x(0)
; ypn - first derivative at x(n-1)
;
; OUTPUTS:
; y2 - second derivatives at all x, of length n
;
; HISTORY:
; -- converted to IDL, D. Neill, October, 1991
; -- arranged as a substitution for SPL_INIT (for use in GDL)
; Ph. Prugniel, 2008/02/29
; -- correction a bug for SIG by AC on 2009/08/27
; -- renamed a SPL_INIT_OLD since a C++ version implemented in
; GDL, A. Coulais, 2009/08/27
;
; -----------------------------------------------------------------------------
; NOTE:
; Name this function: spl_init to use it as a replacement of the IDL intrinsic
; when using GDL
; But, to make a comparison of numerical results with the IDL intrinsic
; function, as it is made in the attached program: test_splf, change its
; name in "psplinf", so that IDL can execute either its intrinsic or
; the substitute.
; Anyway, this comparison has been made with success and if you just
; want to use this function in GDL ... ignore this remark
; -----------------------------------------------------------------------------
;function PSPLINF, x, y, YP0=yp1, YPN_1=ypn, DOUBLE=double
function SPL_INIT_OLD, x, y, YP0=yp1, YPN_1=ypn, DOUBLE=double, debug=debug
print, 'GDL syntax, a C++ version is now available'
n = N_ELEMENTS(x)
; we should use the same type as for the input y !
y2 = DBLARR(n)
u = DBLARR(n)
;
; The lower boundary condition is set either to be "natural"
;
if (N_ELEMENTS(yp1) EQ 0) then begin
y2[0] = 0.
u[0] = 0.
;;
;; or else to have a specified first derivative
;;
endif else begin
y2[0] = -0.5
u[0] = ( 3. / ( x[1]-x[0] ) ) * ( ( y[1]-y[0] ) / ( x[1]-x[0] ) - yp1 )
endelse
; I suppose we can also take advantage here of the TRISOL function
; from IDL... we can remove the for loops
;
; This is the decomposition loop of the tridiagonal algorithm. Y2 and
; U are used for temporary storage of the decomposed factors.
;
; AC 09/08/25 : bug which may appear with unsorted X data ...
psig_old = DOUBLE((x - SHIFT(x, -1))) / (SHIFT(x, +1) - SHIFT(x, -1))
psig=psig_old
for ii=1, n-2 do psig[ii]=(x[ii]-x[ii-1])/((x[ii+1]-x[ii-1]))
if KEYWORD_SET(debug) then begin
print, psig_old
print, psig
endif
pu = (DOUBLE(SHIFT(y,-1) - y) / (SHIFT(x,-1) - x) - $
(y - SHIFT(y,1)) / (x - SHIFT(x,1))) / (SHIFT(x,-1)- SHIFT(x,1))
for i=1,n-2 do begin
p = psig[i] * y2[i-1] + 2.0D
y2[i] = ( psig[i]-1.0D ) / p
u[i]=( 6.0D * pu[i] - psig[i]*u[i-1] ) / p
;;if KEYWORD_SET(debug) then print, i, psig[i], pu[i], p
endfor
;
; The upper boundary condition is set either to be "natural"
;
if n_elements(ypn) eq 0 then begin
qn=0.
un=0.
;
; or else to have a specified first deriviative
;
endif else begin
qn=0.5
dx=x[n-1]-x[n-2]
un=(3./dx)*(ypn-(y[n-1]-y[n-2])/dx)
endelse
;
y2[n-1] = ( un - qn * u[n-2] ) / ( qn * y2[n-2] + 1. )
;
; This is the backsubstitution loop of the tridiagonal algorithm
;
if KEYWORD_SET(debug) then begin
print, "psig:",psig
print, "pu:",pu
for ii=0, n-1 do print, ii, y2[ii] , u[ii]
endif
for k=n-2,0,-1 do begin
y2[k] = y2[k] * y2[k+1] + u[k]
endfor
;
return, y2
end ; spl_init.pro
|