2013-08-15 1 views
5

Мы все знаем, что цикл DO более мощный, чем оператор FORALL в Фортране. То есть вы всегда можете заменить FORALL на DO, но не наоборот.Эквивалентность IF и WHERE

Как насчет инструкции и блока WHERE?

Могу ли я всегда подставлять IF на WHERE? Всегда ли можно кодировать условные обозначения и бифуркации с помощью WHERE, избегая при этом IF?

+3

Первоначальная цель FORALL должна была позволить маскированные задания массива должно быть сделано параллельно - он пришел из варианта под названием High Performance Fortran и был принят в Fortran 95. К сожалению, семантика FORALL не способствовала распараллеливанию, поэтому Fortran 2008 добавила DO CONCURRENT, которая не только более знакома с программистами Fortran, но также имеет лучшую семантику для распараллеливания. Вы можете посмотреть на MERGE, который может с помощью некоторых умных масок быть достаточно мощным. –

+0

Находясь на том, что сказал @SteveLionel, обратите внимание, что '' MERGE' * * может использоваться внутри блока 'WHERE', в то время как оператор' IF' * не может *. –

+1

Также имейте в виду, что 'FORALL' является чисто оператором присваивания или блоком, тогда как' DO' является более общей конструкцией управления потоком. – milancurcic

ответ

9

WHERE операторы зарезервированы для массивов заданий и ничего другого, например:

INTEGER, DIMENSION(100,100) :: a, b 
... define a ... 
WHERE(a < 0) 
    b = 1 
ELSEWHERE 
    b = 0 
ENDWHERE 

Если вы пытались добавить в чем-то, скажем, WRITE заявление, внутри WHERE блока, вы увидите что-то вроде следующих составителя ошибки (составитель зависимых):

Error: Unexpected WRITE statement in WHERE block at (1) 

РЕДАКТИРОВАТЬ

Обратите внимание, что вложенные WHERE блоки являются законными:

WHERE(a < 0) 
    WHERE(ABS(a) > 2) 
     b = 2 
    ELSEWHERE 
     b = 1 
    ENDWHERE 
ELSEWHERE 
    b = 0 
ENDWHERE 
+0

ОК, поэтому ответ на вопрос выше - это просто «НЕТ». –

+3

Правильно, это простой ответ. Простой 10-строчный фрагмент кода также мог бы рассказать вам тот же ответ, а не спрашивать нас: / –