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.

3.6 Sezioni di array 137<br />

REAL, DIMENSION(7) :: a=(/-1.,3.14,0.5,9.,-4.1,12.,2.72/)<br />

INTEGER, DIMENSION(4) :: ind=(/1,3,1,5/)<br />

con queste istruzioni, il vettore a(ind) sarà l’array (/-1.,0.5,-1.,-4.1/). Si presti attenzione<br />

al fatto che una sezione di array con elementi ripetuti non può essere utilizzata sul lato<br />

sinistro di una istruzione di assegnazione poiché specificherebbe che valori diversi dovrebbero<br />

essere assegnati contemporaneamente allo stesso elemento di array. A chiarimento di quanto<br />

detto si consideri il seguente frammento di programma:<br />

REAL, DIMENSION(3) :: a=(/10,20,30/)<br />

INTEGER, DIMENSION(3) :: ind=(/1,2,1/)<br />

REAL, DIMENSION(2) :: b<br />

b(ind) = a ! Operazione errata<br />

In questo caso l’istruzione di assegnazione tenterebbe di assegnare all’elemento b(1) contemporaneamente<br />

i valori 10 e 30, e ciò è impossibile.<br />

Si vuole mostrare, in conclusione di paragrafo, quanto le operazioni su array in forma globale<br />

unitae ad un efficace utilizzo delle sezioni possa condurre a codici eccezionalmente compatti ed<br />

efficienti. <strong>Il</strong> programma che segue ne è la dimostrazione. Esso risolve l’equazione di Laplace<br />

alle differenze finite in un dominio quadrato di 10 ×10 nodi a spaziatura costante con il metodo<br />

di Jacobi. In altre parole l’equazione:<br />

∂2T ∂x2 + ∂2T = 0<br />

∂y2 che regge, ad esempio, il campo termico conduttivo all’interno di una piastra a conducibilità<br />

uniforme, viene discretizzata in ogni nodo (i, j) come:<br />

Ti−1,j + Ti+1,j + Ti,j−1 + Ti,j+1 − 4Ti,j<br />

∆x 2<br />

A partire, dunque, da un campo di tentativo è possibile, in maniera iterativa, aggiornare la<br />

soluzione in ogni nodo come:<br />

Ti,j =<br />

old old old old<br />

Ti−1,j + Ti+1,j + Ti,j−1 + Ti,j+1 4<br />

fino a che non risulti verificata la condizione di convergenza qui espressa come massima differenza<br />

fra i due passi. Le condizioni al contorno assunte sono di campo costante sui lati superiore,<br />

inferiore e destro, variabile linearmente sul lato sinistro del dominio computazionale.<br />

PROGRAM laplace<br />

! *** Sezione dichiarativa ***<br />

IMPLICIT NONE<br />

REAL,DIMENSION(10,10) :: Told, T<br />

REAL :: diff<br />

INTEGER :: i, j, niter<br />

= 0

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

Saved successfully!

Ooh no, something went wrong!