25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

134 Array<br />

Come ulteriore esempio, si consideri, ora, un array tridimensionale e se ne trovi il valore<br />

massimo fra tutti quelli minori di 1000 e se ne valuti il valore medio fra tutti gli elementi<br />

maggiori di 3000.<br />

Un meccanismo basato su operazioni programmate elemento×elemento richiederebbe tre<br />

cicli DO innestati e due istruzioni IF, mentre lavorando con gli array in forma globale basta,<br />

allo scopo, il seguente frammento:<br />

REAL, DIMENSION(10,10,10) :: a<br />

...<br />

amax = MAXVAL(a,MASK=(a3000))/COUNT(MASK=(a>3000))<br />

In questo frammento di programma si è fatto uso delle seguenti funzioni intrinseche per array:<br />

MAXVAL restituisce il valore dell’elemento massimo dell’array.<br />

SUM restituisce la somma dei valori degli elementi dell’array.<br />

COUNT restituisce il numero degli elementi .TRUE. di un array logico.<br />

Queste e tutte le altre funzioni intrinseche relative agli array verranno trattate in dettaglio nel<br />

capitolo 6. Per il momento si noti l’uso dell’argomento opzionale MASK; si tratta semplicemente<br />

di una espressione logica di tipo array per la quale soltanto quegli elementi di a che corrispondono<br />

agli elementi di MASK aventi valore .TRUE. prendono parte alla chiamata di funzione MAXVAL<br />

o SUM. Così, in questo esempio, amax rappresenta il valore massimo di a fra tutti quelli minori<br />

di 1000 mentre amed rappresenta la media aritmetica dei valori di a che risultano maggiori di<br />

3000.<br />

A parte l’aspetto stilistico, è sempre bene fare uso di operazioni con array in forma globale<br />

ogni volta se ne abbia la possibilità in quanto esse vengono sempre gestite dal compilatore in<br />

modo tale da ottimizzare l’accesso ai componenti. Quanto detto non si applica soltanto in<br />

presenza di operazioni algebriche ma in relazione a tutte quante le operazioni di gestione degli<br />

array, incluse le operazioni di I/O. Pertanto, anche nelle operazioni di ingresso/uscita specificare<br />

il nome dell’intero array piuttosto che riferirsi a ciascun componente a mezzo di uno o più cicli<br />

DO espliciti o impliciti è sempre la soluzione più rapida ed efficiente.<br />

3.5 Array di ampiezza nulla<br />

Se il limite inferiore di una dimensione di un array è maggiore del corrispondente limite superiore,<br />

allora l’array avrà ampiezza nulla. Gli array di ampiezza nulla seguono le comuni regole<br />

dei normali array per cui, ad esempio, possono essere usati come operandi in istruzioni che<br />

coinvolgono array solo a patto di essere compatibili con gli altri operandi.<br />

Gli array di ampiezza nulla tornano molto utili nelle operazioni cosiddette ”al contorno”.<br />

Un esempio di questo particolare array è fornito dal seguente frammento di programma:<br />

DO i=1, n<br />

x(i) = b(i)/a(i,i)<br />

b(i+1:n) = b(i+1:n)-a(i+1:n,i)*x(i) ! ampiezza nulla per i=n<br />

END DO

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

Saved successfully!

Ooh no, something went wrong!