Le Procedure di Modulo nel Fortran


FORTRANAbbiamo imparato ad usare i moduli nel Fortran, e ne abbiamo apprezzato l’enorme utilità quale deposito di variabili e costanti a cui ogni unità di programma può attingere. Ma i moduli sono ben altro e ci consentono di definire al proprio interno delle vere e proprie procedure che ogni unità di programma che accede al modulo potrà in questo modo utilizzare, facendo uso dell’istruzione USE.

Ricordiamo a tal proposito che un modulo di programma è reso accessibile alle varie unità di programma attraverso l’istruzione USE. Tali procedure vengono, pertanto, chiamate procedure di modulo nel Fortran e vengono compilate come parte del modulo.

 Le procedure che si trovano all’interno di un modulo devono essere posizionate dopo le dichiarazioni dei dati e devono essere precedute dall’istruzione CONTAINS. Questa istruzione indica al compilatore che le istruzioni successive rappresentano delle procedure di modulo.

Di seguito si riporta un programma che fa uso di una procedura di modulo per calcolare il prodotto di una matrice per un vettore.

module OperazioniMatriceVettore
integer, parameter :: N = 3 ! costante globale.
contains

function moltiplicazioneMatriceVettore ( A, b ) result( c )
implicit none
! Definizione delle dimensioni di A e b.
real, dimension( :, : ), intent( in ) :: A
real, dimension( : ), intent( in ) :: b
real, dimension( size( b ) ) :: c
integer N
integer i
N = size( b )
c = 0.0
do i = 1, N
c = c + b( i ) * A( :, i )
end do
end function moltiplicazioneMatriceVettore

end module OperazioniMatriceVettore

program MatriceVettore
use OperazioniMatriceVettore
implicit none
real, dimension( N, N ) :: A
real, dimension( N ) :: b, c
! Riempie A è  b with con numeri random.
call random_number( A )
call random_number( b )
! Calcola il prodotto matrice * vettore, A*b.
c = moltiplicazioneMatriceVettore ( A, b )
print *, ‘Prodotto matrice vettore = ‘, c
end program MatriceVettore

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Leave a Reply

Your email address will not be published. Required fields are marked *