Fortran - Modules

Un module est comme un package dans lequel vous pouvez conserver vos fonctions et sous-programmes, au cas où vous écrivez un très gros programme, ou vos fonctions ou sous-programmes peuvent être utilisés dans plusieurs programmes.

Les modules vous permettent de diviser vos programmes entre plusieurs fichiers.

Les modules sont utilisés pour -

  • Emballage des sous-programmes, des données et des blocs d'interface.

  • Définition de données globales pouvant être utilisées par plusieurs sous-programmes.

  • Déclarer des variables qui peuvent être rendues disponibles dans toutes les routines de votre choix.

  • Importer un module entièrement, pour utilisation, dans un autre programme ou sous-programme.

Syntaxe d'un module

Un module se compose de deux parties -

  • une partie de spécification pour la déclaration des déclarations
  • a contient une partie pour les définitions de sous-programmes et de fonctions

La forme générale d'un module est -

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

Utilisation d'un module dans votre programme

Vous pouvez incorporer un module dans un programme ou sous-programme par l'instruction use -

use name

Veuillez noter que

  • Vous pouvez ajouter autant de modules que nécessaire, chacun sera dans des fichiers séparés et compilé séparément.

  • Un module peut être utilisé dans différents programmes.

  • Un module peut être utilisé plusieurs fois dans le même programme.

  • Les variables déclarées dans une partie de spécification de module, sont globales au module.

  • Les variables déclarées dans un module deviennent des variables globales dans tout programme ou routine où le module est utilisé.

  • L'instruction use peut apparaître dans le programme principal, ou dans tout autre sous-programme ou module qui utilise les routines ou les variables déclarées dans un module particulier.

Exemple

L'exemple suivant illustre le concept -

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

Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -

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é des variables et des sous-programmes dans un module

Par défaut, toutes les variables et sous-programmes d'un module sont mis à disposition du programme utilisant le code du module, par le use déclaration.

Cependant, vous pouvez contrôler l'accessibilité du code du module à l'aide du private et publicles attributs. Lorsque vous déclarez une variable ou un sous-programme comme privé, il n'est pas disponible en dehors du module.

Exemple

L'exemple suivant illustre le concept -

Dans l'exemple précédent, nous avions deux variables de module, e et pi. Rendons-les privés et observons la sortie -

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

Lorsque vous compilez et exécutez le programme ci-dessus, il donne le message d'erreur suivant -

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

Depuis e et pi, les deux sont déclarés privés, le programme module_example ne peut plus accéder à ces variables.

Cependant, d'autres sous-programmes de module peuvent y accéder -

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

Lorsque vous compilez et exécutez le programme ci-dessus, il produit le résultat suivant -

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