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
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!