Menggambar Vibrasi sebuah Molekul Air
Halo!
Kali ini saya ingin berbagi tulisan tentang pembuatan grafik lewat
paket kode pyplot dalam bahasa Python. Kode yang saya tulis
ini berfungsi untuk menyajikan mode vibrasi molekul secara visual
dalam dua dimensi. Data vektor tiap atom dari molekul didapatkan dari
hasil perhitungan ab initio via
Gaussian 09. Batasan metode ini adalah molekul dan mode vibrasi harus
terdefinisi pada sumbu x dan y saja. Di sini saya
menggunakan paket Python mathplotlib.pyplot dan numpy. Data yang saya
gunakan adalah data penghitungan struktur molekul air (H2O)
menggunakan perangkat Gaussian 09.
"""
program to plot vibration modes
planar, triatomic system
exp/physchem/54E3
Alwan Darusslam
2018/4/18
"""
import numpy as np
import matplotlib.pyplot as plt
# molecule: H2O
# stdo: standard orientation #
stdo = np.array([[0.,0.,0.,0.106840],
[0.,0.,0.785221,-0.427359],
[0.,0.,-0.785221,-0.427359]])
# vibration modes (A11, A12, B11)
A11 = np.array([[0.,0.,0.,0.07],
[0.,0.,-0.38,-0.59],
[0.,0.,0.38,-0.59]])
A12 = np.array([[0.,0.,0.,0.04],
[0.,0.,0.61,-0.35],
[0.,0.,-0.61,-0.35]])
B11 = np.array([[0.,0.,0.,0.],
[0.,0.,-0.58,0.40],
[0.,0.,-0.58,-0.40]])
# molecular model and coordinates
def molecule(m):
X, Y, U, V = zip(*m)
#C: atom centre
C = plt.Circle((U[0],V[0]), 0.3,
color='black', alpha=0.75,
hatch='//', fill=False)
M1 = plt.Circle((U[1],V[1]), 0.2,
color='r', alpha=0.75,
hatch='//', fill=False)
M2 = plt.Circle((U[2],V[2]), 0.2,
color='r', alpha=0.75,
hatch='//', fill=False)
bond_y = [U[1], U[0], U[2]]
bond_z = [V[1], V[0], V[2]]
return C, M1, M2, bond_y, bond_z
def drawing(m, op):
fig = plt.figure()
ax = fig.add_subplot(111, aspect='equal')
ax.set_xlim(-2,2)
ax.set_ylim(-1.5,1.5)
ax.set_xlabel('y-axis', size='20')
ax.set_ylabel('z-axis', size='20')
C, M1, M2, bond_y, bond_z = molecule(op)
X1, Y1, U1, V1 = zip(*op)
X2, Y2, U2, V2 = zip(*m)
n = np.array([[U1[0],V1[0],U2[0],V2[0]],
[U1[1],V1[1],U2[1],V2[1]],
[U1[2],V1[2],U2[2],V2[2]]])
mol = ax.quiver(X1, Y1, U1, V1,
angles='xy', scale_units='xy', scale=1,
label='position vector', color='red',alpha=0.5)
X3, Y3, U3, V3 = zip(*n)
vib = ax.quiver(X3, Y3, U3, V3,
angles='xy', scale_units='xy', scale=1,
label='vibration modes', color='blue')
plt.plot(bond_y, bond_z,'black',alpha=1.0,label='covalent bond')
ax.add_patch(C)
ax.add_patch(M1)
ax.add_patch(M2)
plt.grid(alpha=0.5)
plt.legend(loc='upper right')
plt.title('standard coordinate')
M1 = drawing(A11, stdo) # First
M2 = drawing(A12, stdo) # Second
M3 = drawing(B11, stdo) # Third
plt.show()
Dengan menginput masukan data berupa koordinat standard
Silakan akses kode menggunakan Google Colaboratory di sini (pemutakhiran: 12/06/2020).
stdo dan mode vibrasi A11, A12, dan B11; grafik yang dihasilkan sebagai berikut:
Mode A1(1)
Mode A1(2)
Mode B1
Silakan akses kode menggunakan Google Colaboratory di sini (pemutakhiran: 12/06/2020).
Penulisan kode ini sangatlah banyak kekurangannya. Apabila ada kesempatan, saya ingin mengembangkan algoritma ini menjadi lebih umum terkhusus untuk molekul anorganik. Tentunya kritik dan saran akan sangat membantu. Semoga bisa bermanfaat.


Post a Comment: