program main implicit none integer, parameter :: dp = 8 real(dp), dimension(1:3) :: x integer, parameter :: nstep = 20000000 real(dp) :: t = 0.0_dp real(dp) :: h = 1.0e-10_dp integer, parameter :: nb_loops = 21 integer, parameter :: n = 3 integer :: k integer :: time_begin integer :: time_end integer :: count_rate real(dp) :: time real(dp) :: min_time = 100.0 do k = 1, nb_loops x = [ 8.5_dp, 3.1_dp, 1.2_dp ] call system_clock(time_begin, count_rate) call rk4sys(n, t, x, h, nstep) call system_clock(time_end, count_rate) time = real(time_end - time_begin, dp) / real(count_rate, dp) min_time = min(time, min_time) write (*,*) time, x(1) end do write (*,*) "Minimal Runtime:", min_time contains subroutine xpsys(x,f) real(dp), dimension(1:3), intent(in) :: x real(dp), dimension(1:3), intent(out) :: f f(1) = 10.0_dp * ( x(2) - x(1) ) f(2) = 28.0_dp * x(1) - x(2) - x(1) * x(3) f(3) = x(1) * x(2) - (8.0_dp / 3.0_dp) * x(3) end subroutine xpsys subroutine rk4sys(n, t, x, h, nstep) integer, intent(in) :: n real(dp), intent(in) :: t real(dp), dimension(1:n), intent(inout) :: x real(dp), intent(in) :: h integer, intent(in) :: nstep ! Local variables real(dp) :: h2 real(dp), dimension(1:n) :: y, f1, f2, f3, f4 integer :: i, k h2 = 0.5_dp * h do k = 1, nstep call xpsys(x, f1) y = x + h2 * f1 call xpsys(y, f2) y = x + h2 * f2 call xpsys(y, f3) y = x + h * f3 call xpsys(y, f4) x = x + h * (f1 + 2.0_dp * (f2 + f3) + f4) / 6.0_dp end do end subroutine rk4sys end program main