V3FIT
spline_it.f
1  SUBROUTINE spline_it(ndata, xdata, ydata, npts, x, y, i_full)
2  USE stel_kinds
3  IMPLICIT NONE
4 !-----------------------------------------------
5 ! D u m m y A r g u m e n t s
6 !-----------------------------------------------
7  INTEGER, INTENT(IN) :: ndata, npts, i_full
8  REAL(rprec), DIMENSION(ndata), INTENT(IN):: xdata, ydata
9  REAL(rprec), DIMENSION(npts), INTENT(IN) :: x
10  REAL(rprec), DIMENSION(npts), INTENT(OUT):: y
11  REAL(rprec), DIMENSION(:), ALLOCATABLE :: xfull, yfull,
12  1 dyfull, wk, dy
13 !-----------------------------------------------
14  INTEGER:: iwk, ierr
15  LOGICAL:: lspline
16 !-----------------------------------------------
17 
18  ALLOCATE(xfull(ndata+i_full), yfull(ndata+i_full),
19  1 dyfull(ndata+i_full), wk(2*(ndata+i_full)),
20  2 dy(npts), stat=ierr)
21  IF (ierr .ne. 0) stop 'Allocation error in SPLINE_IT'
22 
23  IF (i_full .eq. 1) THEN !! I_FULL= 1, data on HALF mesh
24  xfull(1) = -1
25  xfull(ndata+1) = 1
26  xfull(2:ndata) = 0.5_dp*(xdata(1:ndata-1)+xdata(2:ndata))
27  yfull(1) = ydata(1) + (xdata(1) + 1)*
28  1 (ydata(2)-ydata(1))/(xdata(2)-xdata(1))
29  yfull(2:ndata) = 0.5_dp*(ydata(1:ndata-1)+ydata(2:ndata))
30  yfull(ndata+1) = ydata(ndata) + (1 - xdata(ndata))*
31  1 (ydata(ndata-1)-ydata(ndata))/(xdata(ndata-1)-xdata(ndata))
32  ELSE !! I_FULL =0, data on FULL mesh;
33  xfull(1:ndata) = xdata(1:ndata)
34  yfull(1:ndata) = ydata(1:ndata)
35  END IF
36 
37  lspline = .false.
38  wk = 0
39  ierr = 0
40  iwk = 2*(ndata+i_full)
41  dyfull = 0
42 
43  CALL pchez(ndata+i_full, xfull, yfull, dyfull, lspline,
44  1 wk, iwk, ierr)
45  IF(ierr.lt.0) stop 'LEGENDRE: error in SPLINE_IT'
46 
47  CALL pchev(ndata+i_full, xfull, yfull, dyfull,
48  1 npts, x, y, dy, ierr)
49  IF(ierr.lt.0) stop 'LEGENDRE: error in EVAL_SPLINE'
50 
51  DEALLOCATE(xfull, yfull, dyfull, wk, dy)
52 
53  END SUBROUTINE spline_it