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.

6.6 Procedure intrinseche per gli array 359<br />

in un equivalente sistema triangolare alto:<br />

⎧<br />

⎪⎨<br />

⎪⎩<br />

c1,1x1 + c1,2x2 + ... + c1,nxn = d1<br />

c2,2x2 + ... + c2,nxn = d2<br />

...<br />

cn,nxn = dn<br />

immediatamente invertibile per back-substitution. Affinché il criterio sia applicabile è necessario<br />

che in ciascuna riga l’elemento di modulo massimo sia portato sulla diagonale principale<br />

(pivoting).<br />

MODULE solve_module<br />

PUBLIC :: solve_linear_equations<br />

CONTAINS<br />

SUBROUTINE solve_linear_equations (a,x,b,error)<br />

REAL,DIMENSION(:,:),INTENT (IN) :: A<br />

REAL,DIMENSION(:),INTENT (OUT) :: x<br />

REAL,DIMENSION(:),INTENT (IN) :: b<br />

LOGICAL,INTENT(OUT) :: error<br />

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

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

INTEGER,DIMENSION (1) :: max_loc<br />

INTEGER :: n, k, k_swap<br />

n = SIZE(b)<br />

error = (SIZE(A,DIM=1)/=n).OR.(SIZE(A,dim=2)/=n)<br />

IF (error) THEN<br />

x = 0.0<br />

ELSE<br />

ALLOCATE(m(n,n+1))<br />

ALLOCATE(temp_row(n+1))<br />

m(1:n,1:n) = A<br />

m(1:n,n+1) = b<br />

! Fase di triangolarizzazione<br />

triang_loop: DO k =1,n<br />

! Spostamento dell’elemento di valore assoluto massimo<br />

! sulla diagonale principale<br />

max_loc = MAXLOC(ABS(m(k:n,k)))<br />

k_swap = k-1+max_loc(1)<br />

temp_row(k:n+1) = m(k,k:n+1)<br />

m(k,k:n+1) = m(k_swap,k:n+1)<br />

m(k_swap,k:n+1) = temp_row(k:n+1)<br />

IF (m(k,k)==0) THEN<br />

error = .TRUE.<br />

EXIT triang_loop

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

Saved successfully!

Ooh no, something went wrong!