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.

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!