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.

7.8 Puntatori come parametri formali di procedure 381<br />

<strong>Il</strong> seguente programma mostra un ulteriore esempio di passaggio di argomenti con attributo<br />

POINTER, anche questa volta ad una procedura interna. Lo stesso programma fornisce, nel<br />

contempo, un nuovo esempio di uso efficiente di puntatori nelle operazioni di swap, molto<br />

frequenti negli algoritmi iterativi. <strong>Il</strong> programma calcola la radice quadrata degli elementi di un<br />

vettore y di 1000 elementi utilizzando la nota formula iterativa:<br />

xn+1 = xn + y/xn<br />

2<br />

ed utilizza efficacemente i puntatori allo scopo di evitare onerose operazioni di copia. La convergenza<br />

del metodo viene testata esaminando la differenza fra due approssimazioni consecutive<br />

con riferimento al massimo discostamento fra i due passi.<br />

PROGRAM prova_func_punt<br />

IMPLICIT NONE<br />

REAL, PARAMETER :: eps=0.001<br />

INTEGER :: i, j<br />

INTEGER, PARAMETER :: dim=1000<br />

REAL, DIMENSION(dim) :: y=(/(i, i=1,dim)/)<br />

REAL, DIMENSION(dim), target :: guess=1., xold=1., xnew<br />

REAL, DIMENSION(:), POINTER :: ptnew, ptold, swap<br />

LOGICAL :: conv=.FALSE.<br />

ptnew => xnew<br />

ptold => xold<br />

ptold => guess<br />

j = 0<br />

DO WHILE(.NOT.conv)<br />

j = j+1<br />

ptnew = calc(ptold,y)<br />

swap => ptold<br />

ptold => ptnew<br />

ptnew => swap<br />

conv = MAXVAL(ABS(ptnew-ptold))

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

Saved successfully!

Ooh no, something went wrong!