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.17 Overloading 293<br />

DO k = n,1,-1<br />

X(k,:)%elem = X(k,:)%elem / W(k,k)<br />

DO i=1,k-1<br />

X(i,:)%elem = X(i,:)%elem - W(i,k) * X(k,:)%elem<br />

END DO<br />

END DO<br />

END FUNCTION matrix_div<br />

FUNCTION matrix_vector_div(Y,Z) RESULT(X)<br />

! "Divide" un array 1D per un array 2D di tipo "matrix"<br />

TYPE(matrix), INTENT(IN), DIMENSION(:) :: Y<br />

TYPE(matrix), INTENT(IN), DIMENSION(:,:) :: Z<br />

TYPE(matrix), DIMENSION(SIZE(Y,1)) :: X<br />

REAL, DIMENSION(SIZE(Z,1),SIZE(Z,2)) :: W<br />

INTEGER :: i, j, k, n<br />

! effettua una copia di riserva degli argomenti<br />

W(:,:) = Z(:,:)%elem<br />

X(:)%elem = Y(:)%elem<br />

! eliminazione di Gauss sulla matrice argomento (W|X)<br />

n = SIZE(Z,2)<br />

DO k = 1,n-1<br />

DO i=k+1,n<br />

W(i,k) = W(i,k)/W(k,k)<br />

X(i)%elem = X(i)%elem - W(i,k) * X(k)%elem<br />

END DO<br />

DO j=k+1,n<br />

DO i=k+1,n<br />

W(i,j) = W(i,j) - W(i,k) * W(k,j)<br />

END DO<br />

END DO<br />

END DO<br />

! "back substitution" su X<br />

DO k = n,1,-1<br />

X(k)%elem = X(k)%elem / W(k,k)<br />

DO i=1,k-1<br />

X(i)%elem = X(i)%elem - W(i,k) * X(k)%elem<br />

END DO<br />

END DO<br />

END FUNCTION matrix_vector_div<br />

END MODULE operatori<br />

<strong>Il</strong> programma che segue mostra un semplice utilizzo di questo modulo e delle operazioni da esso

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

Saved successfully!

Ooh no, something went wrong!