/
locate.f
executable file
·60 lines (58 loc) · 1.31 KB
/
locate.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
SUBROUTINE dlocate(xx,x,indx)
IMPLICIT NONE
DOUBLE PRECISION, DIMENSION(:), INTENT(IN) :: xx
DOUBLE PRECISION, INTENT(IN) :: x
INTEGER, INTENT(OUT) :: indx
INTEGER :: n,jl,jm,ju
LOGICAL :: ascnd
! write(6,*) 'xx: ',xx,x,size(xx)
n=size(xx)
ascnd = (xx(n) >= xx(1))
jl=0
ju=n+1
do
if (ju-jl <= 1) exit
jm=(ju+jl)/2
if (ascnd .eqv. (x >= xx(jm))) then
jl=jm
else
ju=jm
end if
end do
if (x == xx(1)) then
indx=1
else if (x == xx(n)) then
indx=n-1
else
indx=jl
end if
END SUBROUTINE dlocate
SUBROUTINE locate(xx,x,indx)
IMPLICIT NONE
REAL, DIMENSION(:), INTENT(IN) :: xx
REAL, INTENT(IN) :: x
INTEGER, INTENT(OUT) :: indx
INTEGER :: n,jl,jm,ju
LOGICAL :: ascnd
! write(6,*) 'xx: ',xx,x,size(xx)
n=size(xx)
ascnd = (xx(n) >= xx(1))
jl=0
ju=n+1
do
if (ju-jl <= 1) exit
jm=(ju+jl)/2
if (ascnd .eqv. (x >= xx(jm))) then
jl=jm
else
ju=jm
end if
end do
if (x == xx(1)) then
indx=1
else if (x == xx(n)) then
indx=n-1
else
indx=jl
end if
END SUBROUTINE locate