A step loop can leave early when a modeled state reaches a threshold.

Program

Play the program to change the inflow and see when the threshold is reached.

inflow
threshold_time_steps.f90
Replay: real traced execution (multi-file project)
program threshold_time_steps_demo
    implicit none
    integer :: step
    integer :: max_steps
    real :: level
    real :: inflow
    real :: limit

    max_steps = 5
    level = 0.0
    inflow = 3.0
    limit = 10.0
    do step = 1, max_steps
        level = level + inflow
        if (level >= limit) exit
    end do
    print '(I0, 1X, F0.1)', step, level
end program threshold_time_steps_demo
program threshold_time_steps_demo
    implicit none
    integer :: step
    integer :: max_steps
    real :: level
    real :: inflow
    real :: limit

    max_steps = 5
    level = 0.0
    inflow = 2.0
    limit = 10.0
    do step = 1, max_steps
        level = level + inflow
        if (level >= limit) exit
    end do
    print '(I0, 1X, F0.1)', step, level
end program threshold_time_steps_demo
program threshold_time_steps_demo
    implicit none
    integer :: step
    integer :: max_steps
    real :: level
    real :: inflow
    real :: limit

    max_steps = 5
    level = 0.0
    inflow = 4.0
    limit = 10.0
    do step = 1, max_steps
        level = level + inflow
        if (level >= limit) exit
    end do
    print '(I0, 1X, F0.1)', step, level
end program threshold_time_steps_demo
  1. max_steps ← 5

    9max_steps = 510level = 0.0
    values this step5max_steps
  2. level ← 0.0

    9max_steps = 510level = 0.011inflow = 3.0
    values this step0.0level
  3. inflow ← 3.0

    10level = 0.011inflow = 3.012limit = 10.0
    values this step3.0inflow
  4. limit ← 10.0

    11inflow = 3.012limit = 10.013do step = 1, max_steps
    values this step10.0limit
  5. step ← 1

    12limit = 10.013do step = 1, max_steps14    level = level + inflow
    values this step1step
  6. level ← 3.0

    13do step = 1, max_steps14    level = level + inflow15    if (level >= limit) exit
    values this step0.0 3.0level3.0inflow
  7. if (level >= limit) exit

    14    level = level + inflow15    if (level >= limit) exit16end do
    values this step.false.level >= limit
  8. step ← 2

    12limit = 10.013do step = 1, max_steps14    level = level + inflow
    values this step2step
  9. level ← 6.0

    13do step = 1, max_steps14    level = level + inflow15    if (level >= limit) exit
    values this step3.0 6.0level3.0inflow
  10. if (level >= limit) exit

    14    level = level + inflow15    if (level >= limit) exit16end do
    values this step.false.level >= limit
  11. step ← 3

    12limit = 10.013do step = 1, max_steps14    level = level + inflow
    values this step3step
  12. level ← 9.0

    13do step = 1, max_steps14    level = level + inflow15    if (level >= limit) exit
    values this step6.0 9.0level3.0inflow
  13. if (level >= limit) exit

    14    level = level + inflow15    if (level >= limit) exit16end do
    values this step.false.level >= limit
  14. step ← 4

    12limit = 10.013do step = 1, max_steps14    level = level + inflow
    values this step4step
  15. level ← 12.0

    13do step = 1, max_steps14    level = level + inflow15    if (level >= limit) exit
    values this step9.0 12.0level3.0inflow
  16. exit ← step loop

    14    level = level + inflow15    if (level >= limit) exit16end do
    values this stepstep loopexit.true.level >= limit
  17. print '(I0, 1X, F0.1)', step, level

    16    end do17    print '(I0, 1X, F0.1)', step, level18end program threshold_time_steps_demo
    output4 12.0
    values this step4step12.0level
  1. max_steps ← 5

    9max_steps = 510level = 0.0
    values this step5max_steps
  2. level ← 0.0

    9max_steps = 510level = 0.011inflow = 2.0
    values this step0.0level
  3. inflow ← 2.0

    10level = 0.011inflow = 2.012limit = 10.0
    values this step2.0inflow
  4. limit ← 10.0

    11inflow = 2.012limit = 10.013do step = 1, max_steps
    values this step10.0limit
  5. step ← 1

    12limit = 10.013do step = 1, max_steps14    level = level + inflow
    values this step1step
  6. level ← 2.0

    13do step = 1, max_steps14    level = level + inflow15    if (level >= limit) exit
    values this step0.0 2.0level2.0inflow
  7. if (level >= limit) exit

    14    level = level + inflow15    if (level >= limit) exit16end do
    values this step.false.level >= limit
  8. step ← 2

    12limit = 10.013do step = 1, max_steps14    level = level + inflow
    values this step2step
  9. level ← 4.0

    13do step = 1, max_steps14    level = level + inflow15    if (level >= limit) exit
    values this step2.0 4.0level2.0inflow
  10. if (level >= limit) exit

    14    level = level + inflow15    if (level >= limit) exit16end do
    values this step.false.level >= limit
  11. step ← 3

    12limit = 10.013do step = 1, max_steps14    level = level + inflow
    values this step3step
  12. level ← 6.0

    13do step = 1, max_steps14    level = level + inflow15    if (level >= limit) exit
    values this step4.0 6.0level2.0inflow
  13. if (level >= limit) exit

    14    level = level + inflow15    if (level >= limit) exit16end do
    values this step.false.level >= limit
  14. step ← 4

    12limit = 10.013do step = 1, max_steps14    level = level + inflow
    values this step4step
  15. level ← 8.0

    13do step = 1, max_steps14    level = level + inflow15    if (level >= limit) exit
    values this step6.0 8.0level2.0inflow
  16. if (level >= limit) exit

    14    level = level + inflow15    if (level >= limit) exit16end do
    values this step.false.level >= limit
  17. step ← 5

    12limit = 10.013do step = 1, max_steps14    level = level + inflow
    values this step5step
  18. level ← 10.0

    13do step = 1, max_steps14    level = level + inflow15    if (level >= limit) exit
    values this step8.0 10.0level2.0inflow
  19. exit ← step loop

    14    level = level + inflow15    if (level >= limit) exit16end do
    values this stepstep loopexit.true.level >= limit
  20. print '(I0, 1X, F0.1)', step, level

    16    end do17    print '(I0, 1X, F0.1)', step, level18end program threshold_time_steps_demo
    output5 10.0
    values this step5step10.0level
  1. max_steps ← 5

    9max_steps = 510level = 0.0
    values this step5max_steps
  2. level ← 0.0

    9max_steps = 510level = 0.011inflow = 4.0
    values this step0.0level
  3. inflow ← 4.0

    10level = 0.011inflow = 4.012limit = 10.0
    values this step4.0inflow
  4. limit ← 10.0

    11inflow = 4.012limit = 10.013do step = 1, max_steps
    values this step10.0limit
  5. step ← 1

    12limit = 10.013do step = 1, max_steps14    level = level + inflow
    values this step1step
  6. level ← 4.0

    13do step = 1, max_steps14    level = level + inflow15    if (level >= limit) exit
    values this step0.0 4.0level4.0inflow
  7. if (level >= limit) exit

    14    level = level + inflow15    if (level >= limit) exit16end do
    values this step.false.level >= limit
  8. step ← 2

    12limit = 10.013do step = 1, max_steps14    level = level + inflow
    values this step2step
  9. level ← 8.0

    13do step = 1, max_steps14    level = level + inflow15    if (level >= limit) exit
    values this step4.0 8.0level4.0inflow
  10. if (level >= limit) exit

    14    level = level + inflow15    if (level >= limit) exit16end do
    values this step.false.level >= limit
  11. step ← 3

    12limit = 10.013do step = 1, max_steps14    level = level + inflow
    values this step3step
  12. level ← 12.0

    13do step = 1, max_steps14    level = level + inflow15    if (level >= limit) exit
    values this step8.0 12.0level4.0inflow
  13. exit ← step loop

    14    level = level + inflow15    if (level >= limit) exit16end do
    values this stepstep loopexit.true.level >= limit
  14. print '(I0, 1X, F0.1)', step, level

    16    end do17    print '(I0, 1X, F0.1)', step, level18end program threshold_time_steps_demo
    output3 12.0
    values this step3step12.0level
exit `exit` leaves the nearest loop immediately.
threshold `level >= limit` decides whether enough state has accumulated.
maximum steps `max_steps` bounds the loop even if the threshold is not reached early.