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.13 Effetti collaterali nelle funzioni 275<br />

PURE FUNCTION lunghezza(x,y)<br />

IMPLICIT NONE<br />

REAL, INTENT(IN) :: x, y<br />

REAL :: lunghezza<br />

lunghezza = SQRT(x**2+y**2)<br />

END FUNCTION lunghezza<br />

Analogamente, le pure subroutine si definiscono aggiungendo il prefisso PURE all’istruzione di<br />

dichiarazione di subroutine. I loro vincoli sono esattamente uguali a quelli delle pure function<br />

tranne per il fatto che esse possono modificare i valori degli argomenti dichiarati con l’attributo<br />

INTENT(OUT) o INTENT(INOUT).<br />

Si noti che le funzioni PURE sono le uniche funzioni, a parte quelle intrinseche, che possono<br />

essere invocate all’interno di un costrutto FORALL. Così, ad esempio, il seguente costrutto:<br />

FORALL(i=1:n,j=1:m)<br />

x(i,j) = my_func(y(i,j))<br />

END FORALL<br />

è valido soltanto se la funzione my_func viene definita con l’attributo PURE, come ad esempio:<br />

PURE FUNCTION my_func(var1) RESULT(var2)<br />

REAL(KIND(1.D0)), INTENT(IN) :: var1<br />

REAL(KIND(1.D0)) :: var2<br />

...<br />

END FUNCTION my_func<br />

In tutti gli altri casi l’istruzione di chiamata di funzione produce un errore di compilazione.<br />

Una particolare classe di procedure PURE, sono le elemental procedure, le quali si definiscono<br />

sostituendo al prefisso PURE il prefisso ELEMENTAL nell’istruzione di dichiarazione di procedura.<br />

Le elemental function non sono altro che pure function aventi come parametri formali soltanto<br />

variabili scalari (quindi non sono ammessi come parametri formali né puntatori né procedure)<br />

e che forniscono un risultato scalare. Si noti che il prefisso RECURSIVE è incompatibile con il<br />

prefisso ELEMENTAL.<br />

Le elemental subroutine sono definite allo stesso modo. L’unica differenza rispetto alle corrispondenti<br />

function è il fatto che è permesso modificare i valori dei parametri formali specificati<br />

con gli attributi INTENT(OUT) o INTENT(INOUT).<br />

<strong>Il</strong> vantaggio sostanziale offerto dalle procedure ELEMENTAL rispetto alle PURE consiste in una<br />

più efficace parallelizzazione delle operazioni. A parte le differenze testé citate, le elemental<br />

procedure si comportano esattamente come le comuni procedure, come dimostrato dal seguente<br />

esempio in cui si confrontano i valori della funzione esponenziale e x ottenuti con la funzione<br />

intrinseca EXP e con i primi venti termini dello sviluppo in serie di Taylor.<br />

PROGRAM prova_user_exp<br />

!<br />

IMPLICIT NONE

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

Saved successfully!

Ooh no, something went wrong!