XL Fortran for AIX 8.1

Language Reference

WHERE

Purpose

The WHERE statement masks the evaluation of expressions and assignments of values in array assignment statements. It does this according to the value of a logical array expression. The WHERE statement can be the initial statement of the WHERE construct.

Format



                               (1)
>>-+-------------------------+-------WHERE--(--mask_expr--)--+----------------------------+-><
   '-where_construct_name--:-'                               '-where_assignment_statement-'
 
 


Notes:


  1. Fortran 95 (where_construct_name).


mask_expr
is a logical array expression

+---------------------------------Fortran 95---------------------------------+

where_construct_name
is a name that identifies the WHERE construct

+-----------------------------End of Fortran 95------------------------------+

Rules

If a where_assignment_statement is present, the WHERE statement is not the first statement of a WHERE construct. If a where_assignment_statement is absent, the WHERE statement is the first statement of the WHERE construct, and is referred to as a WHERE construct statement. An END WHERE statement must follow. See WHERE Construct for more information.

If the WHERE statement is not the first statement of a WHERE construct, you can use it as the terminal statement of a DO or DO WHILE construct.

+---------------------------------Fortran 95---------------------------------+

You can nest WHERE statements within a WHERE construct. A where_assignment_statement that is a defined assignment must be an elemental defined assignment.

+-----------------------------End of Fortran 95------------------------------+

In each where_assignment_statement, the mask_expr and the variable being defined must be arrays of the same shape. Each mask_expr in a WHERE construct must have the same shape.

+---------------------------------Fortran 95---------------------------------+

A WHERE statement that is part of a where_body_construct must not be a branch target statement.

+-----------------------------End of Fortran 95------------------------------+

The execution of a function reference in the mask_expr of a WHERE statement can affect entities in the where_assignment_statement.

See Interpreting Masked Array Assignments for information on interpreting mask expressions.

+---------------------------------Fortran 95---------------------------------+

If a where_construct_name appears on a WHERE construct statement, it must also appear on the corresponding END WHERE statement. A construct name is optional on any masked ELSEWHERE and ELSEWHERE statements in the WHERE construct.

A where_construct_name can only appear on a WHERE construct statement.

+-----------------------------End of Fortran 95------------------------------+

Examples

REAL, DIMENSION(10) :: A,B,C
 
!   In the following WHERE statement, the LOG of an element of A
!   is assigned to the corresponding element of B only if that
!   element of A is a positive value.
 
WHERE (A>0.0) B = LOG(A)
       
  ·
  ·
  ·
END

+---------------------------------Fortran 95---------------------------------+

The following example shows an elemental defined assignment in a WHERE statement:

INTERFACE ASSIGNMENT(=)
  ELEMENTAL SUBROUTINE MY_ASSIGNMENT(X, Y)
    LOGICAL, INTENT(OUT) :: X
    REAL, INTENT(IN) :: Y
  END SUBROUTINE MY_ASSIGNMENT
END INTERFACE
 
INTEGER A(10)
REAL C(10)
LOGICAL L_ARR(10)
 
C = (/ -10., 15.2, 25.5, -37.8, 274.8, 1.1, -37.8, -36.2, 140.1, 127.4 /)
A = (/ 1, 2, 7, 8, 3, 4, 9, 10, 5, 6 /)
L_ARR = .FALSE.
 
WHERE (A < 5) L_ARR = C
 
! DATA IN ARRAY L_ARR AT THIS POINT:
!
! L_ARR = F, T, F, F, T, T, F, F, F, F
 
END
 
ELEMENTAL SUBROUTINE MY_ASSIGNMENT(X, Y)
  LOGICAL, INTENT(OUT) :: X
  REAL, INTENT(IN) :: Y
 
  IF (Y < 0.0) THEN
    X = .FALSE.
  ELSE
    X = .TRUE.
  ENDIF
END SUBROUTINE MY_ASSIGNMENT

+-----------------------------End of Fortran 95------------------------------+

Related Information


[ Top of Page | Previous Page | Next Page | Table of Contents | Index ]