if (scalar-logical-expression) executable-statement

if (x < 0.0) x = -x ! use magnitude

For the execution of a sequence of statements (block), or alternative sequences depending on alternative conditions, more general forms are available.

if (x2 < x1) then ! swap limits temp = x1 x1 = x2 x2 = temp end if

Statements are indented for better legibility.

! nearest integer (rounded) if (x < 0.0) then ix = x - 0.5 else ix = x + 0.5 end if

if (...) then ... else if (...) then ... else ... end if

If constructs may be nested.

Only one expression is evaluated. It must be scalar and of type integer, character or logical.

select case (ihour) ! hour of the day case(5:10) print *, 'Guten Morgen' case(12:14) print *, 'Mahlzeit' case(18:22) print *, 'Guten Abend' case(23, 0:4) print *, 'Gute Nacht' case default print *, 'Guten Tag' end select

Used for iterations.

do i = 2, 10 x(i) = x(i) + x(i-1) end do

Value of variable i is available after the loop (i=11 in this example).

There is an optional third parameter for increment (stride) other than +1.

Do constructs may be nested.

do j = 10, 0, -1 do i = -5, 5, 3 ! first index runs fastest a(i, j) = ... end do end do

do while (t <= t2) ... t = t + ... end do

Do "forever":

do while (.true.) ... end do

do ... if (...) exit ... if (...) cycle ... end do

go to label

Usually in the form of a conditional go to.

if (month < 1 .or. month > 12) go to 999 ! error handling

**Warning: You must avoid loops that run "forever".**

1. Compute a table of Celsius and corresponding Fahrenheit temperatures for a user specified Celsius range (lower and upper limits, step size; allow for non-integers). Allow also for input of the limits in arbitrary order. If step size is negative, temperatures should run from high to low values, and vice versa.

... read *, t1, t2, tstep ... do ... ... tf = ... print *, tc, 'C', tf, 'F' ... end do

2. A particular Pirani type pressure gauge (0.0005 - 1000 mbar) has the following voltage vs. pressure characteristics:

U/V = lg(p/mbar) + 5.5

Compute a p/mbar vs. U/V table (2.2 - 8.5 V in steps of 0.1 V).

3. Compute the greatest common divisor (gcd) of two integer numbers, "translating" the Modula example (N. Wirth, Programming in Modula-2, 3rd ed. (1985), p. 9).

4. Compute the harmonic oscillator energy level sums of ammonia and cyclopropane up to
100 kcal/mol using the algorithm of Beyer and Swinehart, i.e., try to reproduce column 3
of Table I of the article of Stein and Rabinovitch, J. Chem. Phys. 58 (1973) 2438 - 2445.
Grain size 1 cm^{-1}, 40000 points.