Scientific code often has conservation rules. A simple invariant can flag whether a balance still holds.

Program

Play the program to vary the stored amount and watch the balance check change.

stored
conservation_check.f90
Replay: real traced execution (multi-file project)
program conservation_check_demo
    implicit none
    integer :: added
    integer :: removed
    integer :: stored
    integer :: imbalance
    logical :: balanced
    character(len=5) :: status

    added = 12
    removed = 8
    stored = 4
    imbalance = added - removed - stored
    balanced = imbalance == 0
    if (balanced) then
        status = 'ok'
    else
        status = 'check'
    end if
    print '(A, 1X, I0)', trim(status), imbalance
end program conservation_check_demo
program conservation_check_demo
    implicit none
    integer :: added
    integer :: removed
    integer :: stored
    integer :: imbalance
    logical :: balanced
    character(len=5) :: status

    added = 12
    removed = 8
    stored = 3
    imbalance = added - removed - stored
    balanced = imbalance == 0
    if (balanced) then
        status = 'ok'
    else
        status = 'check'
    end if
    print '(A, 1X, I0)', trim(status), imbalance
end program conservation_check_demo
program conservation_check_demo
    implicit none
    integer :: added
    integer :: removed
    integer :: stored
    integer :: imbalance
    logical :: balanced
    character(len=5) :: status

    added = 12
    removed = 8
    stored = 5
    imbalance = added - removed - stored
    balanced = imbalance == 0
    if (balanced) then
        status = 'ok'
    else
        status = 'check'
    end if
    print '(A, 1X, I0)', trim(status), imbalance
end program conservation_check_demo
  1. added ← 12

    10added = 1211removed = 8
    values this step12added
  2. removed ← 8

    10added = 1211removed = 812stored = 4
    values this step8removed
  3. stored ← 4

    11removed = 812stored = 413imbalance = added - removed - stored
    values this step4stored
  4. imbalance ← 0

    12stored = 413imbalance = added - removed - stored14balanced = imbalance == 0
    values this step0imbalance12added8removed4stored
  5. balanced ← .true.

    13imbalance = added - removed - stored14balanced = imbalance == 015if (balanced) then
    values this step.true.balanced0imbalance
  6. status ← ok

    15if (balanced) then16    status = 'ok'17else
    values this stepokstatus
  7. print '(A, 1X, I0)', trim(status), imbalance

    19    end if20    print '(A, 1X, I0)', trim(status), imbalance21end program conservation_check_demo
    outputok 0
    values this stepokstatus0imbalance
  1. added ← 12

    10added = 1211removed = 8
    values this step12added
  2. removed ← 8

    10added = 1211removed = 812stored = 3
    values this step8removed
  3. stored ← 3

    11removed = 812stored = 313imbalance = added - removed - stored
    values this step3stored
  4. imbalance ← 1

    12stored = 313imbalance = added - removed - stored14balanced = imbalance == 0
    values this step1imbalance12added8removed3stored
  5. balanced ← .false.

    13imbalance = added - removed - stored14balanced = imbalance == 015if (balanced) then
    values this step.false.balanced1imbalance
  6. status ← check

    17else18    status = 'check'19end if
    values this stepcheckstatus
  7. print '(A, 1X, I0)', trim(status), imbalance

    19    end if20    print '(A, 1X, I0)', trim(status), imbalance21end program conservation_check_demo
    outputcheck 1
    values this stepcheckstatus1imbalance
  1. added ← 12

    10added = 1211removed = 8
    values this step12added
  2. removed ← 8

    10added = 1211removed = 812stored = 5
    values this step8removed
  3. stored ← 5

    11removed = 812stored = 513imbalance = added - removed - stored
    values this step5stored
  4. imbalance ← -1

    12stored = 513imbalance = added - removed - stored14balanced = imbalance == 0
    values this step-1imbalance12added8removed5stored
  5. balanced ← .false.

    13imbalance = added - removed - stored14balanced = imbalance == 015if (balanced) then
    values this step.false.balanced-1imbalance
  6. status ← check

    17else18    status = 'check'19end if
    values this stepcheckstatus
  7. print '(A, 1X, I0)', trim(status), imbalance

    19    end if20    print '(A, 1X, I0)', trim(status), imbalance21end program conservation_check_demo
    outputcheck -1
    values this stepcheckstatus-1imbalance
invariant `added - removed - stored` should remain zero for this balance model.
logical check `imbalance == 0` records the invariant as a logical value.
diagnostic output A compact status plus imbalance explains the test result.