Fortran - Módulos

Um módulo é como um pacote onde você pode manter suas funções e sub-rotinas, caso esteja escrevendo um programa muito grande, ou suas funções ou sub-rotinas possam ser usadas em mais de um programa.

Módulos fornecem uma maneira de dividir seus programas entre vários arquivos.

Módulos são usados ​​para -

  • Empacotando subprogramas, dados e blocos de interface.

  • Definindo dados globais que podem ser usados ​​por mais de uma rotina.

  • Declarando variáveis ​​que podem ser disponibilizadas em qualquer rotina que você escolher.

  • Importar um módulo inteiramente, para uso, em outro programa ou sub-rotina.

Sintaxe de um Módulo

Um módulo consiste em duas partes -

  • uma parte de especificação para declaração de declarações
  • a contém parte para definições de sub-rotina e função

A forma geral de um módulo é -

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

Usando um módulo em seu programa

Você pode incorporar um módulo em um programa ou sub-rotina pela instrução use -

use name

Observe que

  • Você pode adicionar quantos módulos forem necessários, cada um estará em arquivos separados e compilados separadamente.

  • Um módulo pode ser usado em vários programas diferentes.

  • Um módulo pode ser usado várias vezes no mesmo programa.

  • As variáveis ​​declaradas em uma parte da especificação do módulo são globais para o módulo.

  • As variáveis ​​declaradas em um módulo tornam-se variáveis ​​globais em qualquer programa ou rotina onde o módulo é usado.

  • A instrução de uso pode aparecer no programa principal, ou em qualquer outra sub-rotina ou módulo que utilize as rotinas ou variáveis ​​declaradas em um determinado módulo.

Exemplo

O exemplo a seguir demonstra o conceito -

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 você compila e executa o programa acima, ele produz o seguinte resultado -

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

Acessibilidade de variáveis ​​e sub-rotinas em um módulo

Por padrão, todas as variáveis ​​e sub-rotinas em um módulo são disponibilizadas para o programa que está usando o código do módulo, pelo use declaração.

No entanto, você pode controlar a acessibilidade do código do módulo usando o private e publicatributos. Quando você declara alguma variável ou sub-rotina como privada, ela não fica disponível fora do módulo.

Exemplo

O exemplo a seguir ilustra o conceito -

No exemplo anterior, tínhamos duas variáveis ​​de módulo, e e pi. Vamos torná-los privados e observar a saída -

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 você compila e executa o programa acima, ele exibe a seguinte mensagem de erro -

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

Desde a e e pi, ambos são declarados privados, o programa module_example não pode mais acessar essas variáveis.

No entanto, outras sub-rotinas do módulo podem acessá-los -

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 você compila e executa o programa acima, ele produz o seguinte resultado -

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