3.10 Compartilhamento de Variáveis - Module

Como vimos nos capítulos e seções anteriores as variáveis são declaradas de forma local, isto é, somente o programa principal ou a sub-rotina tem acesso às suas próprias variáveis. Isto significa que o programa principal acessa somente as variáveis que estão declaradas no início do cabeçalho, assim como as sub-rotinas acessam somente as variáveis declaradas no início do cabeçalho.

Com a declaração do module podemos colocar as variáveis de modo que todas as sub-rotinas e o programa principal tenham acesso. Particularmente, gostaria de chamar essas variáveis de variáveis globais onde serão disponibilizadas para qualquer sub-rotina que necessitar utilizar dessas variáveis.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! COMPARTILHAMENTO GLOBAL DE VARIAVEIS "MODULE"
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
module glob_var
implicit none
!
real(kind=8), allocatable, dimension(:) :: atom,x,y,z,mass 
real(kind=8) :: xcm, ycm, zcm, mtotal
integer :: n_par
!
end module glob_var
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! PROGRAMA QUE EXEMPLIFICA A UTILIZACAO DO MODULE
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
program progmod
use glob_var   
implicit none  
!
integer :: err_inp, err_out, err_atom, err_x, err_y, err_z, err_mass, i
character(20) :: filename1,filename2
!
write(*,*)'Digite o nome do arquivo que contem as coordenadas'
read(*,'(a20)') filename1
!
write(*,*)'Digite o nome do arquivo de saida (coordenadas do centro de massa)'
read(*,'(a20)') filename2
!
open(unit=20, file=filename1, status='old', action='read',  iostat=err_inp)
open(unit=21, file=filename2, status='replace', action='write', iostat=err_out)
!
read(20,*) n_par
allocate(atom(n_par),stat=err_atom)
allocate(x(n_par),stat=err_x)
allocate(y(n_par),stat=err_y)
allocate(z(n_par),stat=err_z)
allocate(mass(n_par),stat=err_mass)
!
do i=1, n_par
        read(20,*) atom(i),x(i),y(i),z(i)
end do
!
call massa
!
call cm
!
write(21,500) xcm, ycm, zcm
500 format(f15.6,f15.6,f15.6)
!
deallocate(x)
deallocate(y)
deallocate(z)
deallocate(mass)
deallocate(atom)
!
stop
end program progmod
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! SUBROTINA QUE CALCULA O CENTRO DE MASSA
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
subroutine cm
use glob_var 
implicit none
!
integer :: i,j
!
xcm = 0.0d0
ycm = 0.0d0
zcm = 0.0d0
mtotal = 0.0d0
!
do i=1, n_par
        xcm = xcm + (x(i) * mass(i))
        ycm = ycm + (y(i) * mass(i))
        zcm = zcm + (z(i) * mass(i))
        mtotal = mtotal + mass(i)   
end do
!
xcm = xcm / mtotal
ycm = ycm / mtotal
zcm = zcm / mtotal
!
return
end subroutine
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! SUBROTINA QUE ATRIBUI O VALOR DA MASSA A UM ELEMENTO
! QUIMICO
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
subroutine massa
use glob_var 
implicit none
!
real(kind=8), dimension(111) :: el
integer :: i,j
!
el(1)  =   1.00794000d0; el(2)  =   4.002602d0; el(3)  =   6.9410000d0; el(4)  = 
  9.0121820d0; el(5)  =  10.8110000d0
el(6)  =  12.01070000d0; el(7)  =  14.006700d0; el(8)  =  15.9994000d0; el(9)  = 
 18.9984032d0; el(10) =  20.1797000d0
el(11) =  22.98976928d0; el(12) =  24.305000d0; el(13) =  26.9815386d0; el(14) = 
 39.0855000d0; el(15) =  30.9737620d0
el(16) =  32.06500000d0; el(17) =  35.453000d0; el(18) =  39.9480000d0; el(19) = 
 39.0983000d0; el(20) =  40.0780000d0
el(21) =  44.95591200d0; el(22) =  48.867000d0; el(23) =  50.9415000d0; el(24) = 
 51.9961000d0; el(25) =  54.9380450d0
el(26) =  55.84500000d0; el(27) =  58.933195d0; el(28) =  58.6934000d0; el(29) = 
 63.5460000d0; el(30) =  65.4090000d0
el(31) =  69.72300000d0; el(32) =  72.640000d0; el(33) =  74.9216000d0; el(34) = 
 78.9600000d0; el(35) =  79.9040000d0
el(36) =  83.79800000d0; el(37) =  85.467800d0; el(38) =  87.6200000d0; el(39) = 
 88.9058500d0; el(40) =  91.2240000d0
el(41) =  92.90638000d0; el(42) =  95.940000d0; el(43) =  98.0000000d0; el(44) = 
101.0700000d0; el(45) = 102.9055000d0
el(46) = 106.42000000d0; el(47) = 107.868200d0; el(48) = 112.4110000d0; el(49) = 
114.8180000d0; el(50) = 118.7100000d0
el(51) = 121.76000000d0; el(52) = 127.600000d0; el(53) = 126.9044700d0; el(54) = 
131.2930000d0; el(55) = 132.9054519d0
el(56) = 137.32700000d0; el(57) = 138.905470d0; el(58) = 140.1160000d0; el(59) = 
140.9076500d0; el(60) = 144.2420000d0
el(61) = 145.00000000d0; el(62) = 150.360000d0; el(63) = 151.9640000d0; el(64) = 
157.2500000d0; el(65) = 158.9253500d0
el(66) = 162.50000000d0; el(67) = 164.930320d0; el(68) = 167.2590000d0; el(69) = 
168.9342100d0; el(70) = 173.0400000d0
el(71) = 174.96700000d0; el(72) = 178.490000d0; el(73) = 180.9478800d0; el(74) = 
183.8400000d0; el(75) = 186.2070000d0
el(76) = 190.23000000d0; el(77) = 192.217000d0; el(78) = 195.0840000d0; el(79) = 
196.9665690d0; el(80) = 200.5900000d0
el(81) = 204.38330000d0; el(82) = 207.200000d0; el(83) = 208.9804000d0; el(84) = 
209.0000000d0; el(85) = 210.0000000d0
el(86) = 222.00000000d0; el(87) = 223.000000d0; el(88) = 226.0000000d0; el(89) = 
227.0000000d0; el(90) = 232.0380600d0
el(91) = 231.03588000d0; el(92) = 238.028910d0; el(93) = 237.0000000d0; el(94) = 
244.0000000d0; el(95) = 243.0000000d0
el(96) = 247.00000000d0; el(97) = 247.000000d0; el(98) = 251.0000000d0; el(99) = 
252.0000000d0; el(100)= 257.0000000d0
el(101)= 258.00000000d0; el(102)= 259.000000d0; el(103)= 262.0000000d0; el(104)= 
261.0000000d0; el(105)= 262.0000000d0
el(106)= 266.00000000d0; el(107)= 264.000000d0; el(108)= 277.0000000d0; el(109)= 
268.0000000d0; el(110)= 281.0000000d0
el(111)= 272.00000000d0
!
do i=1,n_par
        do j=1, 111
                if ( atom(i) == j ) then
                        mass(i) = el(j) 
                end if
        end do
end do
!
return
end subroutine
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!