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.

326 Array Processing<br />

CONTAINS<br />

SUBROUTINE sub(a,res)<br />

IMPLICIT NONE<br />

! Parametri formali<br />

REAL, INTENT(OUT) :: res<br />

REAL, DIMENSION(:,:), INTENT(IN) :: a ! assumed shape array<br />

! Variabili locali<br />

REAL, DIMENSION (SIZE(a,1),SIZE(a,2)) :: work ! automatic array<br />

...<br />

res = a(...)<br />

...<br />

END SUBROUTINE sub<br />

END PROGRAM array<br />

Un ulteriore esempio di uso combinato delle diverse tipologie di array è fornito dal seguente<br />

programma che valuta il determinante di una matrice quadrata A. Detta matrice viene definita<br />

come allocabile nel programma principale, viene quindi allocata in base alla dimensione n il cui<br />

valore è di input. Una volta che la lettura della matrice abbia avuto termine, il main invoca<br />

la funzione ricorsiva det che valuta il determinante secondo la regola di Laplace applicata alla<br />

prima riga ossia come la somma dei prodotti degli elementi della suddetta riga per i rispettivi<br />

complementi algebrici:<br />

n<br />

detA =<br />

j=1<br />

(−1) (1+j) a1j det A1j<br />

dove, si ricorda, A1j è la sotto-matrice ottenuta da A cancellando la prima riga e la j_ma<br />

colonna. <strong>Il</strong> determinante detA1j è detto minore complementare dell’elemento a1j, il prodotto<br />

(−1) (1+j) detA1j è detto complemento algebrico di a1j.<br />

Si noti come la matrice venga passata alla funzione come array correntemente allocato e<br />

venga, invece, letta come un comune array di forma presunta. La stessa function, poi, crea ad<br />

ogni invocazione ricorsiva un array automatico (di dimensioni sempre diverse) che rappresenta<br />

una estratta di A il cui determinante è il minore relativo al generico elemento di A.<br />

PROGRAM determinante<br />

! Scopo: calcolare il determinante di una matrice quadrata.<br />

! Gli elementi della matrice vengono letti dal file matrix.dat<br />

IMPLICIT NONE<br />

INTEGER :: n ! dimensione della matrice<br />

REAL,DIMENSION(:,:),ALLOCATABLE :: A<br />

INTEGER :: stato<br />

!<br />

INTERFACE<br />

RECURSIVE FUNCTION det(n,A) RESULT(detA)<br />

IMPLICIT NONE<br />

REAL :: detA

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

Saved successfully!

Ooh no, something went wrong!