Introdução à dinâmica molecular clássica

só um divisor

Visual Python

Em se tratando de dinâmica molecular temos a disposição diversos softwares destinados à visualização da dinâmica do sistema, mas no momento onde estamos dando os primeiros passos em direção ao entendimento do que é a dinâmica molecular esses softwares podem não ser os mais adequados no entanto, o módulo visual do Python nos permitirá ver o resultado de nossos algoritmos de forma relativamente simples.

O visual Python o Vpython, como é conhecido, é uma biblioteca mantida principalmente por Bruce Sherwood um Físico preocupado com criar um ambiente de programação 3D simples que permita poder dar aulas de Física I, II, III e IV utilizando programas animados (ver Matter & Interactions). O resultado desse esforço resultou em um software livre, simples e extremadamente útil para o estudo de Física, se comparado com outras opções (a pior de todas opengl).

Para usar o Vpython você tem que ter um computador com suporte a aceleração gráfica, computadores novos em geral tem algum suporte. Se você tem instalado um debian o derivado você pode ...

Quando se faz animação o primeiro a se perguntar é o tamanho do universo, na verdade isto não é necessário no Vpython, ele se ajusta, mas você pode especificar esses parâmetros ....

No Vpython temos definidos vários elementos que podem ser utilizados ...

Exemplos

Massa-mola

      #/usr/bin/env python
      #-*- coding: utf-8 -*-

      import numpy as np
      import visual as vis
      import matplotlib as mpl
      import matplotlib.pyplot as plt

      xi = 1.5
      xo = 1.0
      vi = 0.0
      dt = 0.01
      to = 0.0
      tf = 10.0
      k  = 10.0
      m  = 1.0

      w2   = k / m
      t    = to

      #vis.scene.background = vis.color.white
      #vis.scene.x=0
      ##vis.scene.width=2
      #vis.scene.range = 2

      massa = vis.sphere(pos=(xi,0,0), radius = 0.3, color=vis.color.white)
      mola = vis.helix(pos=(0,0,0), axis=(1,0,0), radius=0.2, length=xi, coils=3, thickness=0.05, color=vis.color.blue)

      while (t < 1000.0):
        vis.rate(100)
        t    = t + dt
        v    = vi - w2 * (xi - xo) * dt
        x    = xi + v * dt
        massa.pos = (x, 0, 0)
        mola.length=x
        xi = x
        vi = v
      

Sistema de 2 Massa-mola acopladas

      #/usr/bin/env python
      #-*- coding: utf-8 -*-

      import numpy as np
      import visual as vis
      import matplotlib as mpl
      import matplotlib.pyplot as plt

      ti  = 0.0
      tf  = 100.0
      dt  = 0.01
      x0o = 1.0
      x0i = 0.9
      v0i = 0.0
      m0  = 1.0
      ko  = 10.0
      x1o = 2.0
      x1i = 1.8
      m1  = 1.0
      k1  = 10.0
      v1i = 0.0

      N = int((tf - ti) / dt)

      x = np.zeros( (2,N+1), dtype=np.float)
      v = np.zeros_like(x)
      a = np.zeros_like(x)
      eCin = np.zeros( (N+1), dtype=np.float)
      ePot = np.zeros_like(eCin)
      eTot = np.zeros_like(eCin)
      xcm  = np.zeros_like(eCin)
      vcm  = np.zeros_like(eCin)
      t    = np.zeros_like(eCin)

      w = np.zeros(2, dtype=np.float)

      w[0] = ko / m0
      w[1] = k1 / m1

      x01o = (x1o - x0o)

      t[0]   = ti
      x[:,0] = [x0i, x1i]
      v[:,0] = [v0i, v1i]


      for i in range(0, N, 1):
        t[i+1]    = float(i+1) * dt

        acoplamento = w[1] * ( (x[1,i] - x[0,i]) - x01o )
        a[0,i]      = -w[0] * (x[0,i] - x0o) + acoplamento
        a[1,i]      = -acoplamento
        
        v[:,i+1]    = v[:,i] + a[:,i] * dt
        x[:,i+1]    = x[:,i] + v[:,i+1] * dt
        
      #plt.plot(t, x[0,:], '-')
      #plt.plot(t, x[1,:], '-')
      #plt.show()

      vis.scene.background = vis.color.white
      vis.scene.x=0
      vis.scene.height = 400
      vis.scene.width = 1200
      vis.scene.range = 1.8
      vis.scene.center = (1.5,0,0)

      massa1 = vis.sphere(pos=(x0i,0,0), radius = 0.3, color=vis.color.white)
      m0la1 = vis.helix(pos=(0,0,0), axis=(1,0,0), radius=0.2, length=x0i, coils=3, thickness=0.05, color=vis.color.blue)

      massa2 = vis.sphere(pos=(x1i,0,0), radius = 0.3, color=vis.color.white)
      m0la2 = vis.helix(pos=(x1i,0,0), axis=(1,0,0), radius=0.2, length=(x1i - x0i), coils=3, thickness=0.05, color=vis.color.blue)

      for i in range(0, N, 1):
        vis.rate(60)
        massa1.pos = (x[0,i], 0, 0)
        massa2.pos = (x[1,i], 0, 0)
        m0la1.length = float(x[0,i])
        m0la2.pos    = (float(x[0,i]), 0, 0)
        m0la2.length = float((x[1,i] - x[0,i]))