-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsearch.f90
58 lines (45 loc) · 1.45 KB
/
search.f90
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
! Copyright (C) 2003-2018 John Young, Matthew Worsley
!
! This file is part of mfit.
!
! Mfit is free software: you can redistribute it and/or modify it
! under the terms of the GNU General Public License as published by
! the Free Software Foundation, either version 3 of the License, or
! (at your option) any later version.
!
! This program is distributed in the hope that it will be useful, but
! WITHOUT ANY WARRANTY; without even the implied warranty of
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! General Public License for more details.
!
! You should have received a copy of the GNU General Public License
! along with this program. If not, see http://www.gnu.org/licenses/ .
module Search
implicit none
public
contains
!============================================================================
function locate(xx, x)
!return index i such that xx(i) < x < xx(i+1)
!xx must be monotonic
!function arguments
real, dimension(:) :: xx
real :: x
integer :: locate
!local variables
integer n, lower, mid, upper
n = size(xx)
lower = 0
upper = n + 1
do while (upper - lower > 1)
mid = (upper + lower)/2
if ((xx(n) > xx(1)).eqv.(x > xx(mid))) then
lower = mid
else
upper = mid
end if
end do
locate = lower
end function locate
!============================================================================
end module Search