25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

3.13 Costrutto e istruzione WHERE 165<br />

3.13 Costrutto e istruzione WHERE<br />

Come si è potuto apprendere nelle pagine precedenti, il <strong>Fortran</strong> <strong>90</strong>/<strong>95</strong> consente di utilizzare,<br />

nelle istruzioni di assegnazione, singoli elementi di un array, una sua sezione o l’intero array.<br />

Ad esempio, per estrarre il logaritmo degli elementi dell’array bidimensionale matrice di m×n<br />

elementi, si può utilizzare la semplice istruzione:<br />

log_matrice = LOG(matrice)<br />

ben più compatta del doppio ciclo DO innestato:<br />

DO i=1,m<br />

DO j=1,n<br />

log_matrice(i,j) = LOG(matrice(i,j))<br />

END DO<br />

END DO<br />

Tuttavia, supponendo di voler estrarre il logaritmo soltanto di alcuni elementi dell’arraymatrice,<br />

ad esempio (come appare oltremodo chiaro) dei soli elementi positivi, un modo per svolgere questo<br />

compito è quello di applicare l’operatore logaritmo ad un elemento per volta, combinando<br />

i cicli DO con il costrutto IF, al modo seguente:<br />

DO i=1,m<br />

DO j=1,n<br />

IF(matrice(i,j)>0.) THEN<br />

log_matrice(i,j) = LOG(matrice(i,j))<br />

ELSE<br />

log_matrice(i,j) = -HUGE(a)<br />

END IF<br />

END DO<br />

END DO<br />

dove, evidentemente, lo scopo della funzione intrinseca HUGE è quello di produrre un numero<br />

reale di valore assoluto molto alto (per l’esattezza, il valore più grande rappresentabile in<br />

macchina) al fine di simulare numericamente il concetto di ”infinito”. Lo stesso risultato può,<br />

tuttavia, essere ottenuto in maniera più efficace con una forma speciale di istruzione di assegnazione:<br />

la cosiddetta assegnazione con schema o maschera (masked array assignment). Si tratta<br />

di un’istruzione la cui operazione è controllata da un array logico della stessa forma dell’array<br />

specificato nell’assegnazione. L’operazione di assegnazione è svolta soltanto per gli elementi<br />

dell’array che corrispondono ai valori dello schema di assegnazione.<br />

Nel <strong>Fortran</strong> <strong>90</strong>/<strong>95</strong> questo tipo di assegnazione è implementato mediante il costrutto WHERE,<br />

la cui forma generale è la seguente:<br />

[nome:] WHERE (espressione_schema)<br />

istruzioni_di_assegnazione_di_array ! primo blocco<br />

ELSEWHERE [nome]<br />

istruzioni_di_assegnazione_di_array ! secondo blocco<br />

END WHERE [nome]

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!