1 | subroutine interp_line(x1,y1,len1,x2,y2,len2) |
---|
2 | implicit none |
---|
3 | !----------------------------------------------------------------------- |
---|
4 | ! |
---|
5 | ! Purpose: Do a series of linear interpolations |
---|
6 | ! Data sets are organized as vectors (see below) |
---|
7 | ! If x2(:), and abscissa at which interpolation is requiered, lies |
---|
8 | ! outside of the interval covered by x1(:), instead of doing an |
---|
9 | ! extrapolation, y2() is set to the value y1() corresponding to |
---|
10 | ! the nearby x1(:) point |
---|
11 | ! |
---|
12 | c----------------------------------------------------------------------- |
---|
13 | ! arguments |
---|
14 | ! --------- |
---|
15 | ! inputs: |
---|
16 | real x1(len1) ! ordered list of abscissas |
---|
17 | real y1(len1) ! values at x1(:) |
---|
18 | integer len1 ! length of x1(:) and y1(:) |
---|
19 | real x2(len2) !ordered list of abscissas at which interpolation is done |
---|
20 | integer len2 ! length of x2(:) and y2(:) |
---|
21 | ! outputs: |
---|
22 | real y2(len2) ! interpolated values |
---|
23 | !----------------------------------------------------------------------- |
---|
24 | |
---|
25 | ! local variables: |
---|
26 | integer i,j |
---|
27 | |
---|
28 | |
---|
29 | do i=1,len2 |
---|
30 | ! check if x2(i) lies outside of the interval covered by x1() |
---|
31 | if(((x2(i).le.x1(1)).and.(x2(i).le.x1(len1))).or. |
---|
32 | & ((x2(i).ge.x1(1)).and.(x2(i).ge.x1(len1)))) then |
---|
33 | ! set y2(i) to y1(1) or y1(len1) |
---|
34 | if (abs(x2(i)-x1(1)).lt.abs(x2(i)-x1(len1))) then |
---|
35 | ! x2(i) lies closest to x1(1) |
---|
36 | y2(i)=y1(1) |
---|
37 | else |
---|
38 | ! x2(i) lies closest to x1(len1) |
---|
39 | y2(i)=y1(len1) |
---|
40 | endif |
---|
41 | |
---|
42 | else |
---|
43 | ! find the nearest neigbours and do a linear interpolation |
---|
44 | do j=1,len1-1 |
---|
45 | if(((x2(i).ge.x1(j)).and.(x2(i).le.x1(j+1))).or. |
---|
46 | & ((x2(i).le.x1(j)).and.(x2(i).ge.x1(j+1)))) then |
---|
47 | y2(i)=((x2(i)-x1(j))/(x1(j+1)-x1(j)))*y1(j+1)+ |
---|
48 | & ((x2(i)-x1(j+1))/(x1(j)-x1(j+1)))*y1(j) |
---|
49 | endif |
---|
50 | enddo |
---|
51 | endif |
---|
52 | |
---|
53 | enddo |
---|
54 | |
---|
55 | end |
---|