Memvisualisasikan Frontier Orbital dengan Psi4 dan Python

Jan 15 2023
Frontier Orbital berarti Highest Occupied Molecular Orbital (HOMO) dan Lowest Occupied Orbital (LUMO). Sebagian besar Kimiawan Organik hanya tertarik pada orbital ini karena ini adalah titik interaksi di mana elektron dengan energi tinggi dapat melompat ke orbital berikutnya.

Frontier Orbital berarti Highest Occupied Molecular Orbital (HOMO) dan Lowest Occupied Orbital (LUMO). Sebagian besar Kimiawan Organik hanya tertarik pada orbital ini karena ini adalah titik interaksi di mana elektron dengan energi tinggi dapat melompat ke orbital berikutnya. Mereka adalah interaksi molekul yang dominan yang kemungkinan besar akan terjadi satu sama lain. Contoh diagram HOMO/LUMO ditunjukkan pada Gambar 1 .

Gambar 1: Contoh Orbital Molekul HOMO/LUMO

Namun, kita tahu elektron adalah gelombang dan ada awan elektron yang dihasilkan di orbital ini. Memvisualisasikan awan ini memberi kita beberapa gagasan tentang bagaimana elektron berperilaku dan bentuk yang mudah diingat yang mungkin dapat kita simpulkan dari beberapa hal. Untuk melakukan ini mari kita kembali ke z-matrix metanol psi4 kita, dan seperti yang ditemukan di posting blog sebelumnya . Mari kita langsung ke kode:

import psi4

psi4.set_memory('1000mb')
psi4.core.set_num_threads(1)

zmatrix = '''\
    H11
    O11  H11  0.9600
    C11  O11  1.4000  H11  108.0000
    H12  C11  1.1000  O11  112.0000  H11  -60.0000
    H13  C11  1.1000  O11  112.0000  H11   60.0000
    H14  C11  1.1000  O11  111.8699  H11 -180.0000
'''

universe = psi4.geometry(zmatrix)
universe.update_geometry()
universe.print_out()

energy, wave_function = psi4.optimize(
  'hf/6-31g*',
   return_wfn =True,
  molecule=universe
)

Jadi kita menginginkan dua hal, jumlah elektron alfa dan jumlah orbital molekul karena kita perlu menentukan orbital mana yang merupakan pasangan HOMO/LUMO. Kami menggunakan 2 karena kami mematuhi Prinsip Pengecualian Pauli.

number_of_occupied = 2
number_of_virutal = 2

alpha_electrons = wave_function.nalpha()
molecule = wave_function.nmo()

min_orb = max(1, alpha_electrons + 1 - number_of_occupied)
max_orb = min(molecule, alpha_electrons + number_of_virutal)
orbitals = [k for k in range(min_orb, max_orb + 1)]

cubeprop_tasks = []
  cubeprop_tasks.append('DENSITY')
  cubeprop_tasks.append('ORBITALS')

  psi4.set_options(
    {
      'scf_type': 'df',
      'g_convergence': 'gau_tight',
      'freeze_core': 'true',
      'CUBEPROP_TASKS': cubeprop_tasks,
      'CUBEPROP_FILEPATH': './',
      'CUBEPROP_ORBITALS': orbitals,
    }
  )

  psi4.cubeprop(wave_function)

Da.cube
Psi_a_9_2-A.cube

pip install moly
pip install opt_einsum

import moly

fig = moly.Figure()
fig.add_cube(
    'Psi_a_9_2-A.cube',
    iso=0.03,
    colorscale="rdbu",
    opacity=0.1
)

fig.show()