2013-08-15 8 views
5

Wir alle wissen, dass die DO Schleife leistungsfähiger ist als die FORALL Anweisung in Fortran. Das heißt, Sie können eine FORALL immer durch eine DO ersetzen, aber nicht umgekehrt.Äquivalenz von IF und WHERE

Was ist mit der WHERE Anweisung und Block?

Kann ich die IF immer durch eine WHERE ersetzen? Ist es immer möglich, die Bedingungen und Verzweigungen mit einer WHERE zu codieren, so dass die IF vermieden wird?

+3

Die ursprüngliche Absicht von FORALL- den maskierten Array-Zuweisungen zu ermöglichen, wurde parallel durchgeführt werden - es kam aus einer Variante High Performance Fortran genannt und wurde angenommen in Fortran 95. Leider war die Semantik von FORALL nicht förderlich für die Parallelisierung, daher hat Fortran 2008 DO CONCURRENT hinzugefügt, das nicht nur den Fortran-Programmierern vertrauter ist, sondern auch eine bessere Semantik für die Parallelisierung bietet. Vielleicht möchten Sie sich MERGE anschauen, was mit einigen cleveren Masken sehr mächtig sein kann. –

+0

Gehen Sie weiter, was @SteveLionel gesagt hat, beachten Sie, dass 'MERGE' * innerhalb des' WHERE'-Blocks verwendet werden kann, während eine 'IF'-Anweisung * nicht * kann. –

+1

Denken Sie auch daran, dass 'FORALL' eine reine Zuweisungsanweisung oder ein Block ist, während' DO' ein allgemeineres Ablaufsteuerungskonstrukt ist. – milancurcic

Antwort

9

WHERE Aussagen für Arrays Zuweisungen und sonst nichts reserviert, zum Beispiel:

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

Wenn Sie in etwas Zugabe versucht, sagen wir ein WRITE Anweisung, innerhalb des WHERE Block, Sie so etwas wie die folgende Zusammenstellung Fehler sehen würde (Compiler-abhängig):

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

EDIT

Beachten Sie, dass WHERE Blöcke sind legal verschachtelt:

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

OK, also ist die Antwort auf die Frage oben ein einfaches "NEIN". –

+3

Richtig, es ist eine einfache Antwort. Ein einfacher 10-zeiliger Code könnte Ihnen auch die gleiche Antwort geben, anstatt uns zu fragen: / –