1 SUBROUTINE splnyr(x,y,n,yp,wk)
5 REAL(rprec) :: x(n),y(n),yp(n),wk(n,5)
7 REAL(rprec) :: t,v,btmp
8 REAL(rprec) :: a2,b2,c2,an2,bn2,cn2
11 t=(x(2)-x(1))/(x(3)-x(2))
12 v=(x(n)-x(n-2))/(x(n-1)-x(n-2))
15 yp(j)=1./(x(j+1)-x(j))
19 wk(2,2)=(2.+t+1./t)*yp(2)
21 wk(2,4)=(y(2)-y(1))*yp(1)**2+(y(3)-y(2))*(2.+3.*t)*yp(2)**2
22 wk(n-1,1)=(v+1./v-2.)*yp(n-2)
23 wk(n-1,2)=(v-1.)*yp(n-2)
24 wk(n-1,4)=(1./v**2+2.*v-3.)*yp(n-2)**2*(y(n-1)-y(n-2))+
25 $ (y(n)-y(n-1))*yp(n-2)**2/v**2
29 wk(j,2)=2.*(yp(j-1)+yp(j))
31 wk(j,4)=3.*((y(j)-y(j-1))*yp(j-1)**2+(y(j+1)-y(j))*yp(j)**2)
38 wk(j,5)=wk(j-1,3)/btmp
39 btmp=wk(j,2)-wk(j,1)*wk(j,5)
40 yp(j)=(wk(j,4)-wk(j,1)*yp(j-1))/btmp
43 yp(j)=yp(j)-yp(j+1)*wk(j+1,5)
47 b2=3.*(y(3)-y(2))-(x(3)-x(2))*(2.*yp(2)+yp(3))
48 c2=-2.*(y(3)-y(2))+(x(3)-x(2))*(yp(2)+yp(3))
49 yp(1)=(a2+t*(-2.*b2+t*3.*c2))/(x(3)-x(2))
51 an2=yp(n-2)*(x(n-1)-x(n-2))
52 bn2=3.*(y(n-1)-y(n-2))-(x(n-1)-x(n-2))*(2.*yp(n-2)+yp(n-1))
53 cn2=-2.*(y(n-1)-y(n-2))+(x(n-1)-x(n-2))*(yp(n-2)+yp(n-1))
54 yp(n)=(an2+v*(2.*bn2+v*3.*cn2))/(x(n-1)-x(n-2))
57 SUBROUTINE bcspline(x,y,f,nx,ny,nxp,c)
61 REAL(rprec) :: f(nxp,ny),x(nx),y(ny),c(4,nxp,ny)
65 REAL(rprec) :: g(kx),gp(kx),wk(5*kx)
68 IF (nx .lt. 4 .or. nx .gt. kx)
then
69 WRITE (6,
'(a)').or.
'bcspline: nx < 4 nx > kx = 515'
72 IF (ny .lt. 4 .or. ny .gt. kx)
then
73 WRITE (6,
'(a)').or.
'bcspline: ny < 4 ny > kx = 515'
77 WRITE (6,
'(a)')
'bcspline: nx > nxp (storage error)'
81 IF (x(nx)-x(1) .lt. 0.)
then
82 WRITE (6,
'(a)')
'bcspline: x not monotonically increasing'
85 IF (y(ny)-y(1) .lt. 0.)
then
86 WRITE (6,
'(a)')
'bcspline: y not monotonically increasing'
100 CALL splnyr(x,g,nx,gp,wk)
110 CALL splnyr(y,g,ny,gp,wk)
120 CALL splnyr(y,g,ny,gp,wk)
126 END SUBROUTINE bcspline
127 SUBROUTINE bcsplint(x,y,c,nx,ny,nxp,xl,yl,pds,icalc,ier)
130 INTEGER :: nx,ny,nxp,icalc,ier
131 REAL(rprec) :: x(nx),y(ny),c(4,nxp,ny),xl,yl,pds(6)
134 REAL(rprec) :: hx, hy, sux(2), suy(2),
135 $ su(2), svx(2), sv(2), sxy(2),
136 $ u, v, spln0, spln1, spln2, s0, sh, sp0, sph, h, d
138 spln0(s0,sh,sp0,sph,h,d) = s0+d*(h*sp0+d*(3.*(sh-s0)-
139 $ (sph+2.*sp0)*h+d*(2.*(s0-sh)+(sph+sp0)*h)))
140 spln1(s0,sh,sp0,sph,h,d) = sp0+d*(6.*(sh-s0)/h-2.0*
141 $ (sph+2.*sp0)+3.*d*(2.*(s0-sh)/h+(sph+sp0)))
142 spln2(s0,sh,sp0,sph,h,d) = 6.*(sh-s0)/h**2-2.0*
143 $ (sph+2.*sp0)/h+d*(2.*(s0-sh)/h**2+(sph+sp0)/h)*6.0
150 CALL tableintrp (x, nx, xl, i)
152 IF (abs(xl-x(1)) .le. abs(x(2)-x(1)))
then
155 WRITE (6,
'(a,i2)')
'bcsplint: x < x(1), ier = ',ier
159 WRITE (6,
'(a,i2)')
'bscplint: x < x(1), ier = ',ier
164 IF (abs(xl-x(nx)) .le. abs(x(nx-1)-x(nx)))
then
167 WRITE (6,
'(a,i2)')
'bcsplint: x > x(nx), ier = ',ier
170 WRITE (6,
'(a,i2)')
'bcsplint: x > x(nx), ier = ',ier
176 CALL tableintrp (y, ny, yl, j)
178 IF (abs(yl-y(1)) .le. abs(y(2)-y(1)))
then
181 WRITE (6,
'(a,i2)')
'bcsplint: y < y(1), ier = ',ier
185 WRITE (6,
'(a,i2)')
'bcsplint: y < y(1), ier = ',ier
190 IF (abs(yl-y(ny)) .le. abs(y(ny-1)-y(ny)))
then
193 WRITE (6,
'(a,i2)')
'bcsplint: y > y(ny), ier = ',ier
196 WRITE (6,
'(a,i2)')
'bcsplint: y > y(ny), ier = ',ier
207 sv(1)= spln0(c(1,i,j),c(1,i,j+1),c(3,i,j),c(3,i,j+1),hy,v)
208 svx(1)=spln0(c(2,i,j),c(2,i,j+1),c(4,i,j),c(4,i,j+1),hy,v)
209 sv(2)= spln0(c(1,i+1,j),c(1,i+1,j+1),c(3,i+1,j),c(3,i+1,j+1),hy,v)
210 svx(2)=spln0(c(2,i+1,j),c(2,i+1,j+1),c(4,i+1,j),c(4,i+1,j+1),hy,v)
211 pds(1)=spln0(sv(1),sv(2),svx(1),svx(2),hx,u)
212 IF (icalc .le. 1)
return
214 su(1)= spln0(c(1,i,j),c(1,i+1,j),c(2,i,j),c(2,i+1,j),hx,u)
215 suy(1)=spln0(c(3,i,j),c(3,i+1,j),c(4,i,j),c(4,i+1,j),hx,u)
216 su(2)= spln0(c(1,i,j+1),c(1,i+1,j+1),c(2,i,j+1),c(2,i+1,j+1),hx,u)
217 suy(2)=spln0(c(3,i,j+1),c(3,i+1,j+1),c(4,i,j+1),c(4,i+1,j+1),hx,u)
218 pds(2)=spln1(sv(1),sv(2),svx(1),svx(2),hx,u)
219 IF (icalc .eq. 2)
return
220 pds(3)=spln1(su(1),su(2),suy(1),suy(2),hy,v)
221 IF (icalc .eq. 3)
return
223 sux(1)=spln1(c(1,i,j),c(1,i+1,j),c(2,i,j),c(2,i+1,j),hx,u)
224 sxy(1)=spln1(c(3,i,j),c(3,i+1,j),c(4,i,j),c(4,i+1,j),hx,u)
225 sux(2)=spln1(c(1,i,j+1),c(1,i+1,j+1),c(2,i,j+1),c(2,i+1,j+1),hx,u)
226 sxy(2)=spln1(c(3,i,j+1),c(3,i+1,j+1),c(4,i,j+1),c(4,i+1,j+1),hx,u)
227 pds(4) = spln1(sux(1),sux(2),sxy(1),sxy(2),hy,v)
228 IF (icalc .eq. 4)
RETURN
229 pds(5) = spln2(sv(1),sv(2),svx(1),svx(2),hx,u)
230 IF (icalc .eq. 5)
RETURN
231 pds(6) = spln2(su(1),su(2),suy(1),suy(2),hy,v)
233 END SUBROUTINE bcsplint
236 SUBROUTINE tableintrp (xx, n, x, jlo)
253 INTEGER :: n,jlo,jhi,jmid,inc
254 REAL(rprec) :: x,xx(n)
256 IF (x .lt. xx(1))
THEN
258 ELSE IF (x .le. xx(2))
THEN
260 ELSE IF (x .le. xx(n))
THEN
264 IF (jlo .eq. 0 .or. jlo .eq. n)
THEN
274 IF (x .gt. xx(jlo))
THEN
278 ELSE IF (x .gt. xx(jhi))
THEN
288 ELSE IF (x .le. xx(jlo))
THEN
298 10
IF (jhi-jlo .eq. 1)
RETURN
300 IF (x .gt. xx(jmid))
THEN
311 END SUBROUTINE tableintrp