Exemple de comment utiliser seulement certaines variables d'un module en Fortran 90 (voir aussi la discussion sur stackoverflow sur le sujet)
En utilisant: Only
Module fortran (module_test.f90):
module variables
real, parameter :: pi = 3.1415927
real, parameter :: golden_ratio = 1.61803
real :: radius
end module variables
Programme principal (test_module.f90):
program code_test
use variables, ONLY : pi
implicit none
write(6,*) 'pi', pi
!write(6,*) 'golden_ratio', golden_ratio
end program code_test
En spécifiant ONLY: pi cela signifie que toutes les autres variables du module sont ignorées par le programme principal.
Compiler le code
gfortran module_test.f90 test_module.f90 -o test_module
lancer le code
test_module
donne ici
pi 3.14159274
par contre si on ajoute
write(6,*) 'pi', pi
write(6,*) 'golden_ratio', golden_ratio
on a alors le message d'erreur durant la compilation:
write(6,*) 'golden_ratio', golden_ratio
1
Error: Symbol 'golden_ratio' at (1) has no IMPLICIT type
En utilisant Dynamic arrays
Une autre approche que j'utilise parfois avec un module comprenant des tableaux de grandes dimensions.
Dans cet exemple on veut uniquement les tableaux A et C
Module:
module variables
implicit none
!----------------------------------------------------------------------------------------!
! Dynamic Allocation of Arrays
integer, dimension(:), allocatable :: A
integer, dimension(:), allocatable :: B
integer, dimension(:), allocatable :: C
!----------------------------------------------------------------------------------------!
CONTAINS
subroutine get_array(my_list, dim)
implicit none
integer, intent(in) :: dim
character*1, dimension(dim), intent(in) :: my_list
!----------------------------------------------------------------------------------------!
! Matrix A
if ( ANY( my_list=='A' ) ) then
allocate( A(6) )
A = 7
end if
!----------------------------------------------------------------------------------------!
! Matrix B
if ( ANY( my_list=='B' ) ) then
allocate( B(3) )
B(1) = 3
B(2) = 8
B(3) = 1
end if
!----------------------------------------------------------------------------------------!
! Matrix C
if ( ANY( my_list=='C' ) ) then
allocate( C(1) )
C = 2
end if
!----------------------------------------------------------------------------------------!
end subroutine get_array
!----------------------------------------------------------------------------------------!
end module variables
Le programme principal
program code_test
use variables
implicit none
integer, parameter :: dim = 2
character*1, dimension(dim) :: my_list
data my_list /'A','C'/
call get_array(my_list, dim)
if( ANY( my_list=='A' ) ) write(6,*) 'A', A
if( ANY( my_list=='B' ) ) write(6,*) 'B', B
if( ANY( my_list=='C' ) ) write(6,*) 'C', C
if( ANY( my_list=='A' ) ) deallocate(A)
if( ANY( my_list=='B' ) ) deallocate(B)
if( ANY( my_list=='C' ) ) deallocate(C)
end program code_test
donne
A 7 7 7 7 7 7
C 2
Références
Liens | Site |
---|---|
Modules | stanford.edu |
How do you USE Fortran 90 module data | stackoverflow |
Fortran:How to check if array contains value? | stackoverflow |
Compile Programs with Modules | cs.mtu.edu |