2013-08-15 6 views
5

Sappiamo tutti che il ciclo DO è più potente dell'istruzione FORALL in Fortran. Cioè, è sempre possibile sostituire uno FORALL con un DO, ma non viceversa.Equivalenza di IF e DOVE

E l'istruzione WHERE e il blocco?

Posso sempre sostituire lo IF con un WHERE? È sempre possibile codificare condizionali e biforcazioni con un WHERE, evitando così il IF?

+3

L'intento originale di FORALL è stato quello di consentire le assegnazioni di matrice mascherati per essere condotti in parallelo - che proveniva da una variante denominata High Performance Fortran ed è stato adottato in Fortran 95. Sfortunatamente, la semantica di FORALL non favoriva la parallelizzazione, quindi Fortran 2008 ha aggiunto DO CONCURRENT che non è solo più familiare ai programmatori di Fortran, ma ha anche una semantica migliore per la parallelizzazione. Potresti voler guardare MERGE, che può, con alcune maschere intelligenti, essere piuttosto potente. –

+0

Proseguendo su ciò che ha detto @SteveLionel, si noti che 'MERGE' * può * essere utilizzato all'interno del blocco' WHERE' mentre un'istruzione 'IF' * non può *. –

+1

Ricorda inoltre che 'FORALL' è puramente un'istruzione o un blocco di assegnazione, mentre' DO' è un costrutto di controllo del flusso più generale. – milancurcic

risposta

9

WHERE dichiarazioni sono riservati per gli array assegnazioni e nient'altro, per esempio:

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

Se provato ad aggiungere in qualcosa, dire una dichiarazione WRITE, all'interno del blocco WHERE, si dovrebbe vedere qualcosa di simile l'errore seguente compilazione (compilatore dipendente):

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

EDIT

Nota che nidificato WHERE blocchi sono legali:

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

OK, quindi la risposta alla domanda di cui sopra è un semplice "NO". –

+3

Corretto, è una semplice non risposta. Un semplice codice di 10 righe potrebbe anche dirti la stessa risposta, piuttosto che chiederci: / –