29
30
31
32
33
34
35
36
37
38
39
40#include "implicit_f.inc"
41
42
43
44 INTEGER ,INTENT(IN) :: NPT0
45 INTEGER ,INTENT(IN) :: NSUB
46 my_real ,
DIMENSION(NPT0) ,
INTENT(IN) :: xf,yf
47 my_real ,
DIMENSION((NPT0-1)*NSUB+1) ,
INTENT(OUT) :: xx,yy
48
49
50
51 INTEGER :: I,J,K,NPTS,NSEG
53 my_real ,
DIMENSION(:,:) ,
ALLOCATABLE :: spline_knots
54 my_real ,
DIMENSION(:) ,
ALLOCATABLE :: ctrl_ptx,ctrl_pty
55 my_real ,
DIMENSION(4) :: ptx,pty,knots
57
58
59
60 npts = npt0 + 2
61 nseg = npt0 - 1
62
63 ALLOCATE (ctrl_ptx(npts))
64 ALLOCATE (ctrl_pty(npts))
65 ALLOCATE (spline_knots(nseg,4))
66
67
68 ctrl_ptx(2:npts-1) = xf(1:npt0)
69 ctrl_pty(2:npts-1) = yf(1:npt0)
70
71 ctrl_ptx(1) = (half*ctrl_ptx(2) - four*ctrl_ptx(3) + ctrl_ptx(4)) * half
72 ctrl_pty(1) = (half*ctrl_pty(2) - four*ctrl_pty(3) + ctrl_pty(4)) * half
73
74 ctrl_ptx(npts) = (ctrl_ptx(npts-3) - four*ctrl_ptx(npts-2) + five*ctrl_ptx(npts-1)) * half
75 ctrl_pty(npts) = (ctrl_pty(npts-3) - four*ctrl_pty(npts-2) + five*ctrl_pty(npts-1)) * half
76
77 k = 0
78 DO i = 1,nseg
79 ptx(1) = ctrl_ptx(i)
80 ptx(2) = ctrl_ptx(i+1)
81 ptx(3) = ctrl_ptx(i+2)
82 ptx(4) = ctrl_ptx(i+3)
83 pty(1) = ctrl_pty(i)
84 pty(2) = ctrl_pty(i+1)
85 pty(3) = ctrl_pty(i+2)
86 pty(4) = ctrl_pty(i+3)
87
88 knots(1) = zero
89 dx = ptx(2) - ptx(1)
90 dy = pty(2) - pty(1)
91 knots(2) = spline_knots(i,1) + exp(
alpha*log(sqrt(dx**2 + dy**2)))
92 dx = ptx(3) - ptx(2)
93 dy = pty(3) - pty(2)
94 knots(3) = knots(2) + exp(
alpha*log(sqrt(dx**2 + dy**2)))
95 dx = ptx(4) - ptx(3)
96 dy = pty(4) - pty(3)
97 knots(4) = knots(3) + exp(
alpha*log(sqrt(dx**2 + dy**2)))
98 spline_knots(i,1:4) = knots(1:4)
99
100 DO j = 1,nsub
101 tt = (j-one) / nsub
102 k = k + 1
104 xx(k) = nx
105 yy(k) = ny
106 ENDDO
107
108 ENDDO
109
110 tt = one
111 k = k + 1
112 xx(k) = xf(npt0)
113 yy(k) = yf(npt0)
114
115
116
117
118
119 DEALLOCATE (spline_knots)
120 DEALLOCATE (ctrl_pty)
121 DEALLOCATE (ctrl_ptx)
122
123 RETURN
subroutine spline_interpol_2d(ptx, pty, knots, t, nx, ny)