34 lines
1.1 KiB
Fortran
34 lines
1.1 KiB
Fortran
program example
|
|
implicit none
|
|
real :: d
|
|
|
|
d = haversine(36.12,-86.67,33.94,-118.40) ! BNA to LAX
|
|
print '(A,F9.4,A)', 'distance: ',d,' km' ! distance: 2887.2600 km
|
|
|
|
contains
|
|
|
|
function to_radian(degree) result(rad)
|
|
! degrees to radians
|
|
real,intent(in) :: degree
|
|
real, parameter :: deg_to_rad = atan(1.0)/45 ! exploit intrinsic atan to generate pi/180 runtime constant
|
|
real :: rad
|
|
|
|
rad = degree*deg_to_rad
|
|
end function to_radian
|
|
|
|
function haversine(deglat1,deglon1,deglat2,deglon2) result (dist)
|
|
! great circle distance -- adapted from Matlab
|
|
real,intent(in) :: deglat1,deglon1,deglat2,deglon2
|
|
real :: a,c,dist,dlat,dlon,lat1,lat2
|
|
real,parameter :: radius = 6372.8
|
|
|
|
dlat = to_radian(deglat2-deglat1)
|
|
dlon = to_radian(deglon2-deglon1)
|
|
lat1 = to_radian(deglat1)
|
|
lat2 = to_radian(deglat2)
|
|
a = (sin(dlat/2))**2 + cos(lat1)*cos(lat2)*(sin(dlon/2))**2
|
|
c = 2*asin(sqrt(a))
|
|
dist = radius*c
|
|
end function haversine
|
|
|
|
end program example
|