Testing Scientific Code
Conservation Check
Test an Invariant
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.
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
added ← 12
10added = 1211removed = 8values this step12addedremoved ← 8
10added = 1211removed = 812stored = 4values this step8removedstored ← 4
11removed = 812stored = 413imbalance = added - removed - storedvalues this step4storedimbalance ← 0
12stored = 413imbalance = added - removed - stored14balanced = imbalance == 0values this step0imbalance12added8removed4storedbalanced ← .true.
13imbalance = added - removed - stored14balanced = imbalance == 015if (balanced) thenvalues this step.true.balanced0imbalancestatus ← ok
15if (balanced) then16 status = 'ok'17elsevalues this stepokstatusprint '(A, 1X, I0)', trim(status), imbalance
19 end if20 print '(A, 1X, I0)', trim(status), imbalance21end program conservation_check_demooutputok 0values this stepokstatus0imbalance
added ← 12
10added = 1211removed = 8values this step12addedremoved ← 8
10added = 1211removed = 812stored = 3values this step8removedstored ← 3
11removed = 812stored = 313imbalance = added - removed - storedvalues this step3storedimbalance ← 1
12stored = 313imbalance = added - removed - stored14balanced = imbalance == 0values this step1imbalance12added8removed3storedbalanced ← .false.
13imbalance = added - removed - stored14balanced = imbalance == 015if (balanced) thenvalues this step.false.balanced1imbalancestatus ← check
17else18 status = 'check'19end ifvalues this stepcheckstatusprint '(A, 1X, I0)', trim(status), imbalance
19 end if20 print '(A, 1X, I0)', trim(status), imbalance21end program conservation_check_demooutputcheck 1values this stepcheckstatus1imbalance
added ← 12
10added = 1211removed = 8values this step12addedremoved ← 8
10added = 1211removed = 812stored = 5values this step8removedstored ← 5
11removed = 812stored = 513imbalance = added - removed - storedvalues this step5storedimbalance ← -1
12stored = 513imbalance = added - removed - stored14balanced = imbalance == 0values this step-1imbalance12added8removed5storedbalanced ← .false.
13imbalance = added - removed - stored14balanced = imbalance == 015if (balanced) thenvalues this step.false.balanced-1imbalancestatus ← check
17else18 status = 'check'19end ifvalues this stepcheckstatusprint '(A, 1X, I0)', trim(status), imbalance
19 end if20 print '(A, 1X, I0)', trim(status), imbalance21end program conservation_check_demooutputcheck -1values 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.