Sınır Yörüngelerini Psi4 ve Python ile Görselleştirme

Jan 15 2023
Sınır Orbitalleri, En Yüksek Dolu Moleküler Orbital (HOMO) ve En Düşük Dolu Orbital (LUMO) anlamına gelir. Çoğu Organik Kimyager çoğunlukla sadece bu orbitallerle ilgilenir çünkü bunlar, yüksek enerjili bir elektronun bir sonraki yörüngeye atlayabileceği etkileşim noktalarıdır.

Sınır Orbitalleri, En Yüksek Dolu Moleküler Orbital (HOMO) ve En Düşük Dolu Orbital (LUMO) anlamına gelir. Çoğu Organik Kimyager çoğunlukla sadece bu orbitallerle ilgilenir çünkü bunlar, yüksek enerjili bir elektronun bir sonraki yörüngeye atlayabileceği etkileşim noktalarıdır. Bunlar, büyük olasılıkla birbirleriyle olan moleküllerin baskın etkileşimleridir. HOMO/LUMO diyagramının bir örneği Şekil 1'de gösterilmektedir .

Şekil 1: HOMO/LUMO Moleküler Orbital Örneği

Ancak elektronun bir dalga olduğunu ve bu orbitallerde üretilen bir elektron bulutu olduğunu biliyoruz. Bu bulutları görselleştirmek bize elektronun nasıl davrandığına dair bir fikir veriyor ve belki de bazı şeyleri çıkarsayabileceğimiz akılda kalıcı bir şekil veriyor. Bunu yapmak için önceki blog yazımızda bulunan psi4 metanol z matrisimize geri dönelim . Hemen koda geçelim:

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
)

Yani iki şey istiyoruz, alfa elektronlarının sayısı ve moleküler orbitallerin sayısı çünkü hangi orbitallerin HOMO/LUMO çifti olduğunu belirlememiz gerekiyor. Pauli Hariç Tutma İlkesine bağlı olduğumuz için 2 kullanıyoruz.

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()