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