Ecrire un programme de dynamique moléculaire super simple en python

Calcul de la dynamique moléculaire de 3 atomes

Écrivons un code de dynamique moléculaire (MD) qui ne traite que de trois atomes. Faites-le étape par étape comme un MD.

1. Placez l'atome sur la toile

Notez le placement initial et la vitesse des trois atomes dans un fichier.

initial.d


15 10 0 0
20 10 0 0
20 15 0 0

Chaque ligne de initial.d se compose de quatre éléments: la coordonnée x de l'atome, la coordonnée y, la composante x de la vitesse et la composante y, et doit être séparée par un espace.

Un exemple de programme qui ouvre le canevas pour qu'un objet puisse être dessiné, lit les informations de disposition (et de vitesse) de l'atome à partir du fichier (initial.d) et arrange l'atome à la position initiale est illustré ci-dessous. J'ai aussi un bouton factice pour plus tard (ici je ne fais rien lorsque le bouton est enfoncé). Ici, puisque initial.d a 3 lignes, le nombre d'atomes est de 3, mais le nombre d'atomes peut être augmenté en augmentant le nombre de lignes. Dans le programme, la taille du tableau est augmentée chaque fois que chaque ligne est lue. L'unité de coordonnées est Å et l'unité de vitesse est Å / s.

crudemd2.png

Un exemple de programme s'affiche.

crudemd0.py


import tkinter as tk

def dummy(event):
    print('button is pressed')

def drawatom(x,y):
    scl=10
    rad=5
    x1=x0+x*scl
    y1=y0+l-y*scl
    canvas.create_oval(x1-rad,y1-rad,x1+rad,y1+rad, fill='blue')

# creation of main window and canvas
win = tk.Tk()
win.title("Crude MD")
win.geometry("520x540")
x0=10
y0=10
l=500
canvas = tk.Canvas(win,width=l+x0*2,height=l+y0*2)
canvas.place(x=0, y=20)
canvas.create_rectangle(x0,y0,l+x0,l+y0)

# declaration of arrays
rx = []
ry = []
vx = []
vy = []
fx = []
fy = []

# button sample (dummy)
button_dummy = tk.Button(win,text="dummy",width=15)
button_dummy.bind("<Button-1>",dummy)
button_dummy.place(x=0,y=0)

# read initial position and velocity
f = open('initial.d', 'r')
i = 0
for line in f:
    xy = line.split(' ')
    rx = rx + [float(xy[0])]
    ry = ry + [float(xy[1])]
    vx = vx + [float(xy[2])]
    vy = vy + [float(xy[3])]
    print(rx)
    drawatom(rx[i],ry[i])
    i = i + 1

win.mainloop()

2. Obtenez l'événement de bouton et déplacez l'atome

Ajout de fonctions basées sur le programme ci-dessus. Il détecte l'événement où le bouton est enfoncé et déplace l'atome en diagonale vers le haut en continu.

crudemd1.py


import tkinter as tk

def dummy(event):
    global imd  # to substitute value into variable
    if (imd == 0 ):
        imd = 1
    else:
        imd = 0

def drawatom(x,y):
    x1=x0+x*scl
    y1=y0+l-y*scl
    return canvas.create_oval(x1-rad,y1-rad,x1+rad,y1+rad, fill='blue')

def moveatom(obj,x,y):
    x1=x0+x*scl
    y1=y0+l-y*scl
    canvas.coords(obj,x1-rad,y1-rad,x1+rad,y1+rad)

# creation of main window and canvas
win = tk.Tk()
win.title("Crude MD")
win.geometry("520x540")
x0=10 # Origin
y0=10 # Origin
l=500 # Size of canvas
scl=10 # Scaling (magnification) factor
rad=5 # Radius of sphere

canvas = tk.Canvas(win,width=l+x0*2,height=l+y0*2)
canvas.place(x=0, y=20)
canvas.create_rectangle(x0,y0,l+x0,l+y0)

imd = 0 # MD on/off

# declaration of arrays
rx = []
ry = []
vx = []
vy = []
fx = []
fy = []
obj = []

# button sample (dummy)
button_dummy = tk.Button(win,text="dummy",width=15)
button_dummy.bind("<Button-1>",dummy)
button_dummy.place(x=0,y=0)

# Entry box (MD step)
entry_step = tk.Entry(width=10)
entry_step.place(x=150,y=5)

# read initial position and velocity
f = open('initial.d', 'r')
n = 0
for line in f:
    xy = line.split(' ')
    rx = rx + [float(xy[0])]
    ry = ry + [float(xy[1])]
    vx = vx + [float(xy[2])]
    vy = vy + [float(xy[3])]
    print(rx)
    obj = obj + [drawatom(rx[n],ry[n])] # obj[] holds pointer to object
    n = n + 1 # number of total atoms
print("number of atoms = ",n)

step = 0
stepend = 1000

while step < stepend:
    if imd == 1:
        for i in range(n):
            rx[i] = rx[i] + 0.01
            ry[i] = ry[i] + 0.01
            moveatom(obj[i],rx[i],ry[i])
        step = step + 1
        entry_step.delete(0,tk.END)
        entry_step.insert(tk.END,step)
    win.update()

win.mainloop()

3. Allumez et éteignez MD lorsque vous appuyez sur la touche

Modifié davantage ce qui précède. Le MD est allumé / éteint lorsque la touche est enfoncée. L'interaction entre les atomes est calculée par le potentiel Morse et les atomes sont déplacés par la méthode Verlet.

crudemd2.py


import tkinter as tk
import math

def dummy(event):
    global imd  # to substitute value into variable
    if (imd == 0 ):
        imd = 1
    else:
        imd = 0

def drawatom(x,y):
    x1=x0+x*scl
    y1=y0+l-y*scl
    return canvas.create_oval(x1-rad,y1-rad,x1+rad,y1+rad, fill='blue')

def moveatom(obj,x,y):
    x1=x0+x*scl
    y1=y0+l-y*scl
    canvas.coords(obj,x1-rad,y1-rad,x1+rad,y1+rad)

def v(rang):
    ep = 0.2703
    al = 1.1646
    ro = 3.253
    ev = 1.6021892e-19
    return ep*(math.exp(-2.0*al*(rang-ro))-2.0*math.exp(-al*(rang-ro))) *ev

def vp(rang):
    ep = 0.2703
    al = 1.1646
    ro = 3.253
    ev = 1.6021892e-19
    return -2.0*al*ep*(math.exp(-2.0*al*(rang-ro))-math.exp(-al*(rang-ro))) *ev*1.0e10



# creation of main window and canvas
win = tk.Tk()
win.title("Crude MD")
win.geometry("520x540")
x0=10 # Origin
y0=10 # Origin
l=500 # Size of canvas
scl=10 # Scaling (magnification) factor
rad=5 # Radius of sphere

canvas = tk.Canvas(win,width=l+x0*2,height=l+y0*2)
canvas.place(x=0, y=20)
canvas.create_rectangle(x0,y0,l+x0,l+y0)

imd = 0 # MD on/off

# declaration of arrays
rx = [] # ang
ry = []
vx = [] # ang/s
vy = []
fx = [] # N
fy = []
epot = []
obj = []
dt = 1.0e-16 # s
wm = 1.67e-37 # 1e-10 kg

# button sample (dummy)
button_dummy = tk.Button(win,text="MD on/off",width=15)
button_dummy.bind("<Button-1>",dummy)
button_dummy.place(x=0,y=0)

# Entry box (MD step)
entry_step = tk.Entry(width=10)
entry_step.place(x=150,y=5)

# read initial position and velocity
f = open('initial.d', 'r')
n = 0
for line in f:
    xy = line.split(' ')
    rx = rx + [float(xy[0])]
    ry = ry + [float(xy[1])]
    vx = vx + [float(xy[2])]
    vy = vy + [float(xy[3])]
    fx = fx + [0]
    fy = fy + [0]
    epot = epot + [0]
    obj = obj + [drawatom(rx[n],ry[n])] # obj[] holds pointer to object
    n = n + 1 # number of total atoms
print("number of atoms = ",n)

step = 0
stepend = 100000

while step < stepend:
    if imd == 1:
        # Verlet(1)
        for i in range(n):
            rx[i] = rx[i] + dt * vx[i] + (dt*dt/2.0) * fx[i] / wm
            ry[i] = ry[i] + dt * vy[i] + (dt*dt/2.0) * fy[i] / wm
            vx[i] = vx[i] + dt/2.0 * fx[i] / wm
            vy[i] = vy[i] + dt/2.0 * fy[i] / wm
        # Force and energy
        for i in range(n):
            fx[i] = 0
            fy[i] = 0
            epot[i] = 0
        for i in range(n):
            for j in range(n):
                if (i != j):
                    rr = math.sqrt((rx[i]-rx[j])**2 + (ry[i]-ry[j])**2)
                    drx = rx[i] - rx[j]
                    dry = ry[i] - ry[j]
                    fx[i] = fx[i]-vp(rr)/rr*drx
                    fy[i] = fy[i]-vp(rr)/rr*dry
                    epot[i] = epot[i]+v(rr)/2.0
        # Verlet(2)
        for i in range(n):
            vx[i] = vx[i] + dt/2.0 * fx[i] / wm
            vy[i] = vy[i] + dt/2.0 * fy[i] / wm
            moveatom(obj[i],rx[i],ry[i])
        step = step + 1
        entry_step.delete(0,tk.END)
        entry_step.insert(tk.END,step)
    win.update()

win.mainloop()

Recommended Posts

Ecrire un programme de dynamique moléculaire super simple en python
Ecrire un programme de chiffrement Caesar en Python
Ecrire une méthode de cupidité simple en Python
Ecrire un plugin Vim simple en Python 3
Notes de programme simples Pub / Sub en Python
Ecrire une dichotomie en Python
Ecrire des algorithmes A * (A-star) en Python
Ecrire un graphique à secteurs en Python
Ecrire le plugin vim en Python
Écrire une recherche de priorité en profondeur en Python
Implémentation d'un algorithme simple en Python 2
Ecrire un serveur TCP super simple
Exécutez un algorithme simple en Python
Lors de l'écriture d'un programme en Python
Un client HTTP simple implémenté en Python
J'ai fait un programme de gestion de la paie en Python!
Ecrire le test dans la docstring python
Essayez de dessiner une animation simple en Python
Créer une application GUI simple en Python
Ecrire une courte définition de propriété en Python
Configurer un serveur HTTPS simple avec Python 3
Un programme qui supprime les instructions en double en Python
Créer un modèle d'investissement dynamique simple en Python
Écrivons un programme Python et exécutons-le
Configurer un serveur SMTP simple en Python
J'ai créé un programme cryptographique César en Python.
GRPC simple en Python
Ecrire Python dans MySQL
[Débutant] Que se passe-t-il si j'écris un programme qui s'exécute sur php en Python?
Recevez des données de dictionnaire à partir de programmes Python avec AppleScript
Je veux écrire en Python! (2) Écrivons un test
Créez un Slackbot simple avec un bouton interactif en python
Essayez d'incorporer Python dans un programme C ++ avec pybind11
Ecrire un histogramme à l'échelle logarithmique sur l'axe des x en python
Code python de la méthode k-means super simple
Prendre une capture d'écran en Python
Ecrire des filtres Pandec en Python
Créer une fonction en Python
Créer un dictionnaire en Python
Écrire une distribution bêta en Python
Ecrire python dans Rstudio (réticulé)
Structure super minuscule en Python
Créer un bookmarklet en Python
Analyse de régression simple avec Python
Dessinez un cœur en Python
Client IRC simple avec python
Programme Python du "Livre qui enseigne facilement la programmation difficile"
J'ai fait un jeu de frappe simple avec tkinter de Python
Un programme polyvalent qui formate les chaînes de commande Linux avec python
Il est difficile d'écrire un algorithme très simple en php
Ecrire un programme python pour trouver la distance d'édition [python] [distance Levenshtein]
[Python] Chapitre 01-03 À propos de Python (Ecrire et exécuter un programme à l'aide de PyCharm)
Un moyen simple d'éviter plusieurs boucles for en Python
J'ai essayé "un programme qui supprime les déclarations en double en Python"
Écrivons un programme de simulation simple pour le "problème de Monty Hall"
Probablement dans un serpent Nishiki (Titre original: Peut-être en Python)
Ecrire un test piloté par table en C