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.

292 Unità di Programma<br />

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

! Esegue il prodotto elemento x elemento di due array 1D di tipo "matrix"<br />

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

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

REAL :: X<br />

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

END FUNCTION vector_mul<br />

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

! Esegue il prodotto righe x colonne fra un array 2D<br />

! ed un array 1D di tipo "matrix"<br />

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

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

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

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

END FUNCTION matrix_vector_mul<br />

!<br />

! Operatore "divisione": X = Y / Z = INV(Z) * Y<br />

!<br />

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

! Esegue il "rapporto" fra due 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),SIZE(Y,2)) :: 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

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

Saved successfully!

Ooh no, something went wrong!