Fortran - Moduli

Un modulo è come un pacchetto in cui puoi conservare le tue funzioni e subroutine, nel caso tu stia scrivendo un programma molto grande, o le tue funzioni o subroutine possono essere usate in più di un programma.

I moduli forniscono un modo per suddividere i programmi tra più file.

I moduli sono utilizzati per:

  • Packaging sottoprogrammi, dati e blocchi di interfaccia.

  • Definizione di dati globali che possono essere utilizzati da più di una routine.

  • Dichiarazione di variabili che possono essere rese disponibili all'interno di qualsiasi routine scelta.

  • Importare un modulo interamente, per l'uso, in un altro programma o subroutine.

Sintassi di un modulo

Un modulo è composto da due parti:

  • una parte specifica per la dichiarazione delle istruzioni
  • a contiene una parte per le definizioni di subroutine e funzioni

La forma generale di un modulo è:

module name     
   [statement declarations]  
   [contains [subroutine and function definitions] ] 
end module [name]

Utilizzo di un modulo nel programma

È possibile incorporare un modulo in un programma o in una subroutine mediante l'istruzione use -

use name

Si prega di notare che

  • È possibile aggiungere tutti i moduli necessari, ciascuno in file separati e compilato separatamente.

  • Un modulo può essere utilizzato in vari programmi differenti.

  • Un modulo può essere utilizzato più volte nello stesso programma.

  • Le variabili dichiarate in una parte di specifica del modulo sono globali per il modulo.

  • Le variabili dichiarate in un modulo diventano variabili globali in qualsiasi programma o routine in cui viene utilizzato il modulo.

  • L'istruzione use può apparire nel programma principale o in qualsiasi altra subroutine o modulo che utilizza le routine o le variabili dichiarate in un particolare modulo.

Esempio

Il seguente esempio dimostra il concetto:

module constants  
implicit none 

   real, parameter :: pi = 3.1415926536  
   real, parameter :: e = 2.7182818285 
   
contains      
   subroutine show_consts()          
      print*, "Pi = ", pi          
      print*,  "e = ", e     
   end subroutine show_consts 
   
end module constants 


program module_example     
use constants      
implicit none     

   real :: x, ePowerx, area, radius 
   x = 2.0
   radius = 7.0
   ePowerx = e ** x
   area = pi * radius**2     
   
   call show_consts() 
   
   print*, "e raised to the power of 2.0 = ", ePowerx
   print*, "Area of a circle with radius 7.0 = ", area  
   
end program module_example

Quando compili ed esegui il programma sopra, produce il seguente risultato:

Pi = 3.14159274    
e =  2.71828175    
e raised to the power of 2.0 = 7.38905573    
Area of a circle with radius 7.0 = 153.938049

Accessibilità di variabili e subroutine in un modulo

Per impostazione predefinita, tutte le variabili e le subroutine in un modulo sono rese disponibili al programma che sta utilizzando il codice del modulo, dal use dichiarazione.

Tuttavia, è possibile controllare l'accessibilità del codice del modulo utilizzando il private e publicattributi. Quando dichiari una variabile o una subroutine come privata, non è disponibile all'esterno del modulo.

Esempio

L'esempio seguente illustra il concetto:

Nell'esempio precedente, avevamo due variabili di modulo, e e pi. Rendiamoli privati ​​e osserviamo l'output -

module constants  
implicit none 

   real, parameter,private :: pi = 3.1415926536  
   real, parameter, private :: e = 2.7182818285 
   
contains      
   subroutine show_consts()          
      print*, "Pi = ", pi          
      print*, "e = ", e     
   end subroutine show_consts 
   
end module constants 


program module_example     
use constants      
implicit none     

   real :: x, ePowerx, area, radius 
   x = 2.0
   radius = 7.0
   ePowerx = e ** x
   area = pi * radius**2     
   
   call show_consts() 
   
   print*, "e raised to the power of 2.0 = ", ePowerx
   print*, "Area of a circle with radius 7.0 = ", area  
   
end program module_example

Quando compili ed esegui il programma sopra, viene visualizzato il seguente messaggio di errore:

ePowerx = e ** x
   1
Error: Symbol 'e' at (1) has no IMPLICIT type
main.f95:19.13:

   area = pi * radius**2     
   1
Error: Symbol 'pi' at (1) has no IMPLICIT type

Da e e pi, entrambi sono dichiarati privati, il programma module_example non può più accedere a queste variabili.

Tuttavia, altre subroutine del modulo possono accedervi -

module constants  
implicit none 

   real, parameter,private :: pi = 3.1415926536  
   real, parameter, private :: e = 2.7182818285 
   
contains      
   subroutine show_consts()          
      print*, "Pi = ", pi          
      print*, "e = ", e     
   end subroutine show_consts 
   
   function ePowerx(x)result(ePx) 
   implicit none
      real::x
      real::ePx
      ePx = e ** x
   end function ePowerx
    
   function areaCircle(r)result(a)  
   implicit none
      real::r
      real::a
      a = pi * r**2  
   end function areaCircle
    
end module constants 


program module_example     
use constants      
implicit none     

   call show_consts() 
   
   Print*, "e raised to the power of 2.0 = ", ePowerx(2.0)
   print*, "Area of a circle with radius 7.0 = ", areaCircle(7.0)  
   
end program module_example

Quando compili ed esegui il programma sopra, produce il seguente risultato:

Pi = 3.14159274    
e = 2.71828175    
e raised to the power of 2.0 = 7.38905573    
Area of a circle with radius 7.0 = 153.938049