** Next:** Scalarization of the
**Up:** The FORALL Statement
** Previous:** Interpretation of Element

FORALL (j=1:m, k=1:n) x(k,j) = y(j,k) FORALL (k=1:n) x(k,1:m) = y(1:m,k) These statements both copy columns 1 through of array into rows 1 through of array . This is equivalent to the standard Fortran 90 statement

x(1:n,1:m) = TRANSPOSE(y(1:m,1:n))
FORALL (i=1:n, j=1:n) x(i,j) = 1.0 / REAL(i+j-1)
This `FORALL` sets array element to the value
for values of and between 1 and .
In Fortran 90, the same operation can be performed by the statement

x(1:n,1:n) = 1.0/REAL( SPREAD((/(i,i=1,n)/),DIM=2,NCOPIES=n) &
+ SPREAD((/(j,j=1,n)/),DIM=1,NCOPIES=n) - 1 )
Note that the `FORALL` statement does not imply the creation of
temporary arrays and is much more readable.

FORALL (i=1:n, j=1:n, y(i,j).NE.0.0) x(i,j) = 1.0 / y(i,j) This statement takes the reciprocal of each nonzero element of array and assigns it to the corresponding element of array . Elements of that are zero do not have their reciprocal taken, and no assignments are made to the corresponding elements of . This is equivalent to the standard Fortran 90 statement

WHERE (y(1:n,1:n) .NE. 0.0) x(1:n,1:n) = 1 / y(1:n,1:n) TYPE monarch INTEGER, POINTER :: p END TYPE monarch TYPE(monarch) :: a(n) INTEGER, TARGET :: b(n)

! Set up a butterfly pattern
FORALL (j=1:n) a(j)This `FORALL` statement sets the elements of array to point
to a permutation of the elements of . When and ,
then elements 1 through 8 of point to elements 3, 4, 1, 2, 7, 8,
5, and 6 of , respectively. This requires a `DO` loop or
other control flow in Fortran 90.

FORALL ( i=1:n ) x(indx(i)) = x(i)
This `FORALL` statement is equivalent to the Fortran 90 array
assignment

x(indx(1:n)) = x(1:n)
If contains a permutation of the integers from 1 to ,
then the final contents of will be a permutation of the original
values.
If contains repeated values, neither the behavior of the `FORALL` nor the array assignment are defined by their respective standards.

FORALL (i=2:4) x(i) = x(i-1) + x(i) + x(i+1) If this statement is executed with

then after execution the new values of array will be

This has the same effect as the Fortran 90 statement

x(2:4) = x(1:3) + x(2:4) + x(3:5)
Note that it does *not* have the same effect as the Fortran 90
loop

DO i = 2, 4
x(i) = x(i-1) + x(i) + x(i+1)
END DO
FORALL (i=1:n) a(i,i) = x(i)
This `FORALL` statement sets the elements of the main diagonal of
matrix to the elements of vector . This cannot be done by
an array assignment in Fortran 90 unless `EQUIVALENCE` or `WHERE` is also used.

FORALL (i=1:4) a(i,ix(i)) = x(i)
This `FORALL` statement sets one element in each row of
matrix to an element of vector . The particular elements
in are chosen by the integer vector . If

and array represents the matrix
before execution of the `FORALL`, then will represent
after its execution. This operation cannot be accomplished with a
single array assignment in Fortran 90.

FORALL (k=1:9) x(k) = SUM(x(1:10:k))
This `FORALL` statement computes nine sums of subarrays of `x`. (`SUM` is allowed in a `FORALL` because Fortran 90
intrinsic functions are pure; see Section .) If before
the `FORALL`

This computation cannot be done by Fortran 90 array expressions alone.

Thu Jul 21 17:05:43 CDT 1994