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.

5.3 Procedure Interne 223<br />

più rapida può essere calcolarlo ”al volo”. Se, tuttavia, questo valore è utilizzato molte volte<br />

mentre risiede nella cache memory del computer, può essere più conveniente precomputarlo.<br />

Quando alcuni degli argomenti di una procedura sono costanti la procedura stessa può essere<br />

”clonata” nel senso che è possibile costruire una nuova routine da quella originale semplicemente<br />

eliminando i parametri formali superflui e sostituendo nel corpo della procedura il valore della<br />

costante ad ogni ricorrenza del parametro. Naturalmente questa function cloning può essere<br />

efficacemente sfruttata per semplificare alcune operazioni algebriche pervenendo così a funzioni<br />

o subroutine più snelle e dalla più rapida esecuzione. Un esempio di ”clonazione” di subroutine<br />

è riportato di seguito e mostra come sia possibile sfruttare efficacemente questa operazione per<br />

semplificare alcune espressioni ad esempio secondo il meccanismo di strength reduction:<br />

! codice originale<br />

CALL mysub(a,2)<br />

...<br />

SUBROUTINE mysub(x,p)<br />

IMPLICIT NONE<br />

REAL,DIMENSION(:) :: x<br />

INTEGER :: p<br />

x = x**p + REAL(p-2)<br />

...<br />

END SUBROUTINE mysub<br />

! codice ottimizzato<br />

CALL mysub2(a)<br />

...<br />

SUBROUTINE mysub2(x)<br />

IMPLICIT NONE<br />

REAL,DIMENSION(:) :: x<br />

x = x*x<br />

...<br />

END SUBROUTINE mysub<br />

In questo caso nel caso l’elevamento al quadrato è stato sostituito da una comune moltiplicazione<br />

del fattore per sé stesso. L’efficacia di questa soluzione risiede nel fatto che l’operazione di<br />

prodotto viene normalmente eseguita dieci volte più velocemente dell’elevamento a potenza.<br />

5.3 Procedure Interne<br />

Un’unità di programma può contenere una o più procedure interne le quali, tuttavia, non possono<br />

contenere ulteriori procedure interne (in altre parole non è possibile una loro nidificazione).<br />

Le procedure interne vengono elencate al termine dell’unità di programma ospite, e sono precedute<br />

dall’istruzione CONTAINS. Di seguito si riporta un esempio di procedura interna ospitata<br />

in un programma principale:

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

Saved successfully!

Ooh no, something went wrong!