where applies an array assignment only where a logical mask is true.

Program

Play the program to change the threshold and watch only matching elements double.

limit
where_mask.f90
Replay: real traced execution (multi-file project)
program where_mask_demo
    implicit none
    integer :: values(4)
    integer :: limit

    values = [3, 5, 7, 10]
    limit = 6
    where (values >= limit)
        values = values * 2
    end where
    print '(I0, A, I0, A, I0, A, I0)', values(1), " ", values(2), " ", values(3), " ", values(4)
end program where_mask_demo
program where_mask_demo
    implicit none
    integer :: values(4)
    integer :: limit

    values = [3, 5, 7, 10]
    limit = 4
    where (values >= limit)
        values = values * 2
    end where
    print '(I0, A, I0, A, I0, A, I0)', values(1), " ", values(2), " ", values(3), " ", values(4)
end program where_mask_demo
program where_mask_demo
    implicit none
    integer :: values(4)
    integer :: limit

    values = [3, 5, 7, 10]
    limit = 9
    where (values >= limit)
        values = values * 2
    end where
    print '(I0, A, I0, A, I0, A, I0)', values(1), " ", values(2), " ", values(3), " ", values(4)
end program where_mask_demo
  1. values ← [3, 5, 7, 10]

    6values = [3, 5, 7, 10]7limit = 6
    values this step[3, 5, 7, 10]values
  2. limit ← 6

    6values = [3, 5, 7, 10]7limit = 68where (values >= limit)
    values this step6limit
  3. values ← [3, 5, 14, 20]

    8where (values >= limit)9    values = values * 210end where
    values this step[3, 5, 7, 10] [3, 5, 14, 20]values6limit
  4. print '(I0, A, I0, A, I0, A, I0)', values(1), " ", values(2), " ", val…

    10    end where11    print '(I0, A, I0, A, I0, A, I0)', values(1), " ", values(2), " ", values(3), " ", values(4)12end program where_mask_demo
    output3 5 14 20
    values this step[3, 5, 14, 20]values
  1. values ← [3, 5, 7, 10]

    6values = [3, 5, 7, 10]7limit = 4
    values this step[3, 5, 7, 10]values
  2. limit ← 4

    6values = [3, 5, 7, 10]7limit = 48where (values >= limit)
    values this step4limit
  3. values ← [3, 10, 14, 20]

    8where (values >= limit)9    values = values * 210end where
    values this step[3, 5, 7, 10] [3, 10, 14, 20]values4limit
  4. print '(I0, A, I0, A, I0, A, I0)', values(1), " ", values(2), " ", val…

    10    end where11    print '(I0, A, I0, A, I0, A, I0)', values(1), " ", values(2), " ", values(3), " ", values(4)12end program where_mask_demo
    output3 10 14 20
    values this step[3, 10, 14, 20]values
  1. values ← [3, 5, 7, 10]

    6values = [3, 5, 7, 10]7limit = 9
    values this step[3, 5, 7, 10]values
  2. limit ← 9

    6values = [3, 5, 7, 10]7limit = 98where (values >= limit)
    values this step9limit
  3. values ← [3, 5, 7, 20]

    8where (values >= limit)9    values = values * 210end where
    values this step[3, 5, 7, 10] [3, 5, 7, 20]values9limit
  4. print '(I0, A, I0, A, I0, A, I0)', values(1), " ", values(2), " ", val…

    10    end where11    print '(I0, A, I0, A, I0, A, I0)', values(1), " ", values(2), " ", values(3), " ", values(4)12end program where_mask_demo
    output3 5 7 20
    values this step[3, 5, 7, 20]values
where `where (mask)` guards an array assignment element by element.
mask `values >= limit` builds a logical array from a comparison.
unchanged elements Elements where the mask is false keep their previous value.