ETS  \$Id: Doxyfile 2162 2020-02-26 14:16:09Z g2dpc $
 All Classes Files Functions Variables Pages
l3interp.f90
Go to the documentation of this file.
1 SUBROUTINE l3interp(y_in,x_in,nr_in,y_out,x_out,nr_out)
2 
3  USE itm_types
4 
5  IMPLICIT NONE
6 
7  INTEGER(ITM_I4) :: nr_in,nr_out
8  REAL(R8), DIMENSION(nr_in), INTENT(IN) :: y_in,x_in
9  REAL(R8), DIMENSION(nr_out), INTENT(IN) :: x_out
10  REAL(R8), DIMENSION(nr_out), INTENT(OUT) :: y_out
11 
12  REAL(R8) :: x,aintm,aint0,aint1,aint2,xm,x0,x1,x2
13  INTEGER(ITM_I4) :: j,jm,j0,j1,j2
14  INTEGER :: jstart,jfirst,jlast,jstep
15 
16  IF (x_in(nr_in) > x_in(1)) THEN
17  jstart=3
18  jfirst=1
19  jlast=nr_out
20  jstep=1
21  ELSE
22  jstart=nr_out-2
23  jfirst=nr_out
24  jlast=1
25  jstep=-1
26  END IF
27 
28  j1=jstart
29  DO j=jfirst,jlast,jstep
30  x=x_out(j)
31  DO WHILE (x >= x_in(j1) .AND. j1 < nr_in-1 .AND. j1 > 2)
32  j1=j1+jstep
33  END DO
34 
35  j2=j1+jstep
36  j0=j1-jstep
37  jm=j1-2*jstep
38 
39 !... extrapolate inside or outside
40 
41  x2=x_in(j2)
42  x1=x_in(j1)
43  x0=x_in(j0)
44  xm=x_in(jm)
45 
46  aintm=(x-x0)*(x-x1)*(x-x2)/((xm-x0)*(xm-x1)*(xm-x2))
47  aint0=(x-xm)*(x-x1)*(x-x2)/((x0-xm)*(x0-x1)*(x0-x2))
48  aint1=(x-xm)*(x-x0)*(x-x2)/((x1-xm)*(x1-x0)*(x1-x2))
49  aint2=(x-xm)*(x-x0)*(x-x1)/((x2-xm)*(x2-x0)*(x2-x1))
50 
51  y_out(j)=aintm*y_in(jm)+aint0*y_in(j0) &
52  +aint1*y_in(j1)+aint2*y_in(j2)
53 
54  END DO
55 
56 END SUBROUTINE l3interp
57 
58 
59 SUBROUTINE l3deriv(y_in,x_in,nr_in,dydx_out,x_out,nr_out)
60 
61  USE itm_types
62 
63  IMPLICIT NONE
64 
65  INTEGER(ITM_I4) :: nr_in,nr_out
66  REAL(R8), DIMENSION(nr_in), INTENT(IN) :: y_in,x_in
67  REAL(R8), DIMENSION(nr_out), INTENT(IN) :: x_out
68  REAL(R8), DIMENSION(nr_out), INTENT(OUT) :: dydx_out
69 
70  REAL(R8) :: x,aintm,aint0,aint1,aint2,xm,x0,x1,x2
71  INTEGER(ITM_I4) :: j,jm,j0,j1,j2
72  INTEGER(ITM_I4) :: jstart,jfirst,jlast,jstep
73 
74  IF (x_in(nr_in) > x_in(1)) THEN
75  jstart=3
76  jfirst=1
77  jlast=nr_out
78  jstep=1
79  ELSE
80  jstart=nr_out-2
81  jfirst=nr_out
82  jlast=1
83  jstep=-1
84  END IF
85 
86  j1=jstart
87  DO j=jfirst,jlast,jstep
88  x=x_out(j)
89  DO WHILE (x >= x_in(j1) .AND. j1 < nr_in-1 .AND. j1 > 2)
90  j1=j1+jstep
91  END DO
92 
93  j2=j1+jstep
94  j0=j1-jstep
95  jm=j1-2*jstep
96 
97 !... extrapolate inside or outside
98 
99  x2=x_in(j2)
100  x1=x_in(j1)
101  x0=x_in(j0)
102  xm=x_in(jm)
103 
104  aintm=((x-x1)*(x-x2)+(x-x0)*(x-x2)+(x-x0)*(x-x1)) &
105  /((xm-x0)*(xm-x1)*(xm-x2))
106  aint0=((x-x1)*(x-x2)+(x-xm)*(x-x2)+(x-xm)*(x-x1)) &
107  /((x0-xm)*(x0-x1)*(x0-x2))
108  aint1=((x-x0)*(x-x2)+(x-xm)*(x-x2)+(x-xm)*(x-x0)) &
109  /((x1-xm)*(x1-x0)*(x1-x2))
110  aint2=((x-x0)*(x-x1)+(x-xm)*(x-x1)+(x-xm)*(x-x0)) &
111  /((x2-xm)*(x2-x0)*(x2-x1))
112 
113  dydx_out(j)=aintm*y_in(jm)+aint0*y_in(j0) &
114  +aint1*y_in(j1)+aint2*y_in(j2)
115 
116  END DO
117 
118 END SUBROUTINE l3deriv
119 
120 
121 SUBROUTINE lderiv(y,x,dydx,nx)
122 
123  USE itm_types
124 
125  IMPLICIT NONE
126 
127  INTEGER(ITM_I4) :: nx
128  REAL(R8) :: dxp,dxm,dx0
129  REAL(R8), DIMENSION(nx), INTENT(IN) :: x,y
130  REAL(R8), DIMENSION(nx), INTENT(OUT) :: dydx
131 
132  INTEGER(ITM_I4) :: i,ip,im
133 
134  DO i=2,nx-1
135  ip=min(i+1,nx)
136  im=max(i-1,1)
137  dxp=x(ip)-x(i)
138  dxm=x(i)-x(im)
139  dx0=x(ip)-x(im)
140  dydx(i)=(dxm*dxm*(y(ip)-y(i))+dxp*dxp*(y(i)-y(im)))/(dxm*dxp*dx0)
141  END DO
142  dydx(1)=2.*dydx(2) - dydx(3)
143  dydx(nx)=2.*dydx(nx-1) - dydx(nx-2)
144 
145 END SUBROUTINE lderiv
146 
subroutine l3deriv(y_in, x_in, nr_in, dydx_out, x_out, nr_out)
Definition: l3interp.f90:59
subroutine l3interp(y_in, x_in, nr_in, y_out, x_out, nr_out)
Definition: l3interp.f90:1
subroutine lderiv(y, x, dydx, nx)
Definition: l3interp.f90:121