A three-way branch known as the arithmetic-if, can be tricky to remove sometimes. Consider the code below:
do 6 i = 1,3
if (dif - c(i)) 7,7,6
6 continue
i = 4
7 ffm = b(i)*exp(a(i)*dif)
The arithmetic-if works by branching based on evaluating the expression: the result is either less-than zero, zero, or greater-than zero. Here if the value of dif-c(i) is ≤0 then the program branches to label 7, otherwise if >0 it branches to label 6, which is the next iteration of the loop. Basically the loop exits when dif is less than or equal to c(i), and the value of i is used in the calculation of ffm. If the condition is never met, then the loop ends, and the value of i is set to 4, and ffm is calculated.
The first thing to do when re-engineering this, is to update the do-loop to F90+ standards, and reconfigure how the if statement works, essentially transforming it to a regular logical if, that uses goto to branch to label 7 if the difference is ≤ 0.
do i = 1,3
if (dif - c(i) .le. 0) then
go to 7
end if
end do
i = 4
7 ffm = b(i)*exp(a(i)*dif)
The problem here is removing the goto and still being able to skip the statement i=4. The trick is to incorporate i=4 into the loop. For example:
do i = 1,4
if (i == 4) then
exit
else if (dif <= c(i)) then
exit
end if
end do
ffm = b(i)*exp(a(i)*dif)
The loop runs through 4 times, when the index i becomes 4, the loop exits, and ffm is calculated. Otherwise for i is 1…3, the loop only exits if dif is less than or equal to c(i). This is only one approach, there are others of course.