Small scientific programs often combine starting state, inputs, outputs, and losses into one balance result.

Program

Play the program to choose the loss term and see the balance status update.

loss
reservoir_balance.f90
Replay: real traced execution (multi-file project)
program reservoir_balance_demo
    implicit none
    integer :: start_level
    integer :: inflow
    integer :: outflow
    integer :: loss
    integer :: final_level
    character(len=6) :: status

    start_level = 20
    inflow = 8
    outflow = 5
    loss = 1
    final_level = start_level + inflow - outflow - loss
    if (final_level >= 20) then
        status = 'stable'
    else
        status = 'low'
    end if
    print '(A, 1X, I0)', trim(status), final_level
end program reservoir_balance_demo
program reservoir_balance_demo
    implicit none
    integer :: start_level
    integer :: inflow
    integer :: outflow
    integer :: loss
    integer :: final_level
    character(len=6) :: status

    start_level = 20
    inflow = 8
    outflow = 5
    loss = 0
    final_level = start_level + inflow - outflow - loss
    if (final_level >= 20) then
        status = 'stable'
    else
        status = 'low'
    end if
    print '(A, 1X, I0)', trim(status), final_level
end program reservoir_balance_demo
program reservoir_balance_demo
    implicit none
    integer :: start_level
    integer :: inflow
    integer :: outflow
    integer :: loss
    integer :: final_level
    character(len=6) :: status

    start_level = 20
    inflow = 8
    outflow = 5
    loss = 4
    final_level = start_level + inflow - outflow - loss
    if (final_level >= 20) then
        status = 'stable'
    else
        status = 'low'
    end if
    print '(A, 1X, I0)', trim(status), final_level
end program reservoir_balance_demo
  1. start_level ← 20

    10start_level = 2011inflow = 8
    values this step20start_level
  2. inflow ← 8

    10start_level = 2011inflow = 812outflow = 5
    values this step8inflow
  3. outflow ← 5

    11inflow = 812outflow = 513loss = 1
    values this step5outflow
  4. loss ← 1

    12outflow = 513loss = 114final_level = start_level + inflow - outflow - loss
    values this step1loss
  5. final_level ← 22

    13loss = 114final_level = start_level + inflow - outflow - loss15if (final_level >= 20) then
    values this step22final_level20start_level8inflow5outflow1loss
  6. balanced ← .true.

    14final_level = start_level + inflow - outflow - loss15if (final_level >= 20) then16    status = 'stable'
    values this step.true.balanced22final_level
  7. status ← stable

    15if (final_level >= 20) then16    status = 'stable'17else
    values this stepstablestatus
  8. print '(A, 1X, I0)', trim(status), final_level

    19    end if20    print '(A, 1X, I0)', trim(status), final_level21end program reservoir_balance_demo
    outputstable 22
    values this stepstablestatus22final_level
  1. start_level ← 20

    10start_level = 2011inflow = 8
    values this step20start_level
  2. inflow ← 8

    10start_level = 2011inflow = 812outflow = 5
    values this step8inflow
  3. outflow ← 5

    11inflow = 812outflow = 513loss = 0
    values this step5outflow
  4. loss ← 0

    12outflow = 513loss = 014final_level = start_level + inflow - outflow - loss
    values this step0loss
  5. final_level ← 23

    13loss = 014final_level = start_level + inflow - outflow - loss15if (final_level >= 20) then
    values this step23final_level20start_level8inflow5outflow0loss
  6. balanced ← .true.

    14final_level = start_level + inflow - outflow - loss15if (final_level >= 20) then16    status = 'stable'
    values this step.true.balanced23final_level
  7. status ← stable

    15if (final_level >= 20) then16    status = 'stable'17else
    values this stepstablestatus
  8. print '(A, 1X, I0)', trim(status), final_level

    19    end if20    print '(A, 1X, I0)', trim(status), final_level21end program reservoir_balance_demo
    outputstable 23
    values this stepstablestatus23final_level
  1. start_level ← 20

    10start_level = 2011inflow = 8
    values this step20start_level
  2. inflow ← 8

    10start_level = 2011inflow = 812outflow = 5
    values this step8inflow
  3. outflow ← 5

    11inflow = 812outflow = 513loss = 4
    values this step5outflow
  4. loss ← 4

    12outflow = 513loss = 414final_level = start_level + inflow - outflow - loss
    values this step4loss
  5. final_level ← 19

    13loss = 414final_level = start_level + inflow - outflow - loss15if (final_level >= 20) then
    values this step19final_level20start_level8inflow5outflow4loss
  6. balanced ← .false.

    14final_level = start_level + inflow - outflow - loss15if (final_level >= 20) then16    status = 'stable'
    values this step.false.balanced19final_level
  7. status ← low

    17else18    status = 'low'19end if
    values this steplowstatus
  8. print '(A, 1X, I0)', trim(status), final_level

    19    end if20    print '(A, 1X, I0)', trim(status), final_level21end program reservoir_balance_demo
    outputlow 19
    values this steplowstatus19final_level
balance equation `start_level + inflow - outflow - loss` combines the model terms.
status branch The final level drives a compact status label.
small program The example combines initialization, calculation, branch, and report.