Utiliser seulement certaines variables d'un module en Fortran 90

Published: 04 avril 2017

DMCA.com Protection Status

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