Como vimos no início do capítulo calcularemos a força conforme a equação 6.0.2. O potencial é o conhecido Lennard-Jones 6-12 dado pela equação 6.4.1 e a derivada pela equação 6.4.2. Em geral, como a força e a energia potencial envolve alguns parametros iguais o cálculo é realizado simultaneamente.
O cálculo da energia potencial é realizada da seguinte maneira:
o mesmo deve aser aplicado para o cálculo da força. É de se observar que o somatório envolve o átomo com todos os átomos
, no entando não iremos calcular para todos os átomos
. Iremos truncar o somatório no cálculo do potencial e da força se a distância
, em que
é um raio de corte. A justificativa para essa truncagem baseia-se no fato de que as contribuições acima do raio de corte são muito pequenas, já que o potencial é de curto alcance. Utilizaremos como raio de corte um valor de
[19].
Outro detalhe que devemos nos atentar é que as posições, velocidades e acelerações estão em coordenadas cartesianas e o potencial e a força estão em coordendas polares esféricas ( e
estão em função de
). O fato é que para atribuir os valores para as componentes da aceleração deveremos fazer uma conversão de coordenadas polares esféricas para coordenadas cartesianas. Neste ponto é o único momento em que iremos utilizar a transformação de coordenadas.
!...
! VARIAVEIS QUE DEVEM ESTA NO MODULE
! E ALOCADAS PREVIAMENTE
real(kind=8), parameter :: pi = 3.1415926535897967d0
real(kind=8), parameter :: sigma = 3.868d-10
real(kind=8), parameter :: epsilon = 0.185d0
real(kind=8), allocatable, dimension(:) :: x, y, z
real(kind=8), allocatable, dimension(:) :: fx, fy, fz, f, u
real(kind=8) :: eu_total, rc
integer :: natom
! VARIAVEIS LOCAIS
real(kind=8) :: sigma, epsilon, phi, theta
real(kind=8) :: xx, yy, zz, rij, rs, r6, r7, r12, r13
integer :: i, j
!...
rc = sigma * 2.5d0
eu_total = 0.d0
f(1) = 0.d0; u(1) = 0.d0
!
loopi: do i = 1, natom
loopj: do j = 1, natom
! SOMENTE PARA J DIFERENTE DE I
condji: if ( j /= i ) then
xx = x(i) - x(j)
yy = y(i) - y(j)
zz = z(i) - z(j)
rij = dsqrt(xx*xx + yy*yy + zz*zz)
rs = dsqrt(xx*xx + yy*yy)
! CONDICAO DO RAIO DE CORTE
condrij: if ( rij <= rc ) then
! CALCULO DA ENERGIA POTENCIAL DO ATOMO I
r12 = (sigma/rij)**12
r6 = (sigma/rij)**6
u(i) = u(i) + 4.d0 * epsilon * (r12 - r6)
! CALCULO DA FORCA NO ATOMO I
r13 = (sigma/rij)**13
r7 = (sigma/rij)**7
f(i) = f(i) + 24.d0 * (epsilon/sigma) * (2.d0*r13 - r7)
! CONVERSAO DE COORDENADAS
! ESTA CONVERSAO PODE SER APLICADA PARA QUALQUER CASO ONDE
! AS COORDENADAS ESTIVEREM ESPALHADAS EM TODOS OS QUADRANTES
! DAS COORDENADAS CARTESIANAS. SEM SOMBRA DE DUVIDA QUE E MAIS
! INTELIGENTE/RAPIDO, SE ANTES DE INICIAR A SIMULACAO DESLOCAR
! O SISTEMA PARA O PRIMEIRO QUADRANTE, ASSIM DIMUNUI O NUMERO
! DE CONDICOES ABAIXO.
! ANGULO PHI (COM RELACAO A Z)
if ( zz == 0.0d0 ) then
phi = pi / 2.0d0
else
phi = dacos(zz / rij))
end if
! ANGULO THETA (COM RELACAO A X)
if ((xx >= 0.0d0) .and. (yy > 0.0d0)) then
theta = dasin(yy/rs)
end if
if ((xx < 0.0d0) .and. (yy > 0.0d0)) then
theta = pi - dasin(yy/rs)
end if
if ((xx < 0.0d0) .and. (yy < 0.0d0)) then
theta = pi + dasin(abs(yy)/rs)
end if
if ((xx > 0.0d0) .and. (yy < 0.0d0)) then
theta = (3.0d0*pi/2.0d0) + dacos(abs(yy)/rs)
end if
if ((yy == 0.0d0) .and. (xx > 0.0d0)) then
theta = 0.0d0
end if
if ((yy == 0.0d0) .and. (xx < 0.0d0)) then
theta = pi
end if
! FORCAS CONVERTIDAS PARA COORD CARTESIANAS
fx(i) = fx(i) + f(i) * dsin(phi) * dcos(theta)
fy(i) = fy(i) + f(i) * dsin(phi) * dsin(theta)
fz(i) = fz(i) + f(i) * dcos(phi)
end if condrij
end if condij
end do loopj
eu_total = eu_total + u(i)
end do loopi
!...