Skip to content
python
from importlib.metadata import version
print(version('pywfn'))
from datetime import datetime
print(datetime.now())
1.0.17
2026-07-02 00:04:40.652826

键的性质

所有的键性质计算器都包含在pywfn.bondprop子包下,其中的每一个模块封装了一种类型键性质计算器

其包含的模块有

  • order 计算各种键级

emm,目前也就只包含计算键级 (lll¬ω¬)

每个模块下都有一个Calculator类,实例化时传入要计算的分子即可

键级

Mayer键级

计算所有原子的mayer键级,最经典的键级之一

计算公式

BOI,J=μI,νJ(PS)μν(PS)νμ

示例代码

计算苯环的mayer键级,打印大于0.05的结果

python
from pywfn.base import Mole
from pywfn.bondprop import order

mole=Mole.from_file('./mols/C6H6.out')
caler=order.Calculator(mole)
omat=caler.mayer()
natm=mole.atoms.len() # 原子的数量
for i in range(0,natm-1):
    for j in range(i+1,natm):
        val=omat[i,j]
        if val<0.05:continue
        print(f"{i+1:>2}-{j+1:>2}:{val:>10.4f}")
 1- 2:    1.4533
 1- 4:    0.0980
 1- 6:    1.4533
 1- 7:    0.9305
 2- 3:    1.4533
 2- 5:    0.0980
 2- 8:    0.9305
 3- 4:    1.4533
 3- 6:    0.0980
 3- 9:    0.9305
 4- 5:    1.4533
 4-10:    0.9305
 5- 6:    1.4533
 5-11:    0.9305
 6-12:    0.9305

可以看到,相邻C-C之间的键级为1.4533,C-H之间的键级为0.9305,对位的C之间也有微弱的键级0.0980

Wiberg键级

示例代码

计算苯环的wiberg键级,打印大于0.05的结果

python
from pywfn.base import Mole
from pywfn.bondprop import order

mole=Mole.from_file('./mols/C6H6.out')
caler=order.Calculator(mole)
omat=caler.wiberg()
natm=mole.atoms.len() # 原子的数量
for i in range(0,natm-1):
    for j in range(i+1,natm):
        val=omat[i,j]
        if val<0.05:continue
        print(f"{i+1:>2}-{j+1:>2}:{val:>10.4f}")
 1- 2:    1.5025
 1- 3:    0.0601
 1- 4:    0.1169
 1- 5:    0.0601
 1- 6:    1.5025
 1- 7:    0.9047
 2- 3:    1.5052
 2- 4:    0.0601
 2- 5:    0.1173
 2- 6:    0.0588
 2- 8:    0.9040
 3- 4:    1.5025
 3- 5:    0.0588
 3- 6:    0.1173
 3- 9:    0.9040
 4- 5:    1.5025
 4- 6:    0.0601
 4-10:    0.9047
 5- 6:    1.5052
 5-11:    0.9040
 6-12:    0.9040

wiberg键级比mayer键级大一些

轨道键级

用于判断某个分子轨道中的键是成键还是反键

示例代码

苯环的反键轨道

python
from pywfn.base import Mole
from pywfn.bondprop import order

mole=Mole.from_file('./mols/C6H6.out')
caler=order.Calculator(mole)
omat=caler.order_obt("mayer",20)
natm=mole.atoms.len() # 原子的数量
for i in range(0,natm-1):
    for j in range(i+1,natm):
        val=omat[i,j]
        if abs(val)<0.05:continue
        print(f"{i+1:>2}-{j+1:>2}:{val:>10.4f}")
 2- 3:    0.4214
 2- 5:    0.0726
 2- 6:   -0.2488
 3- 5:   -0.2488
 3- 6:    0.0726
 5- 6:    0.4214

计算2-6之间、3-5之间是反键轨道,与图像相符

方向键级

根据pocv算法,将指定的键的两个原子的原子轨道投影到指定的方向上,得到的投影系数矩阵带入Mayer键级计算公式得到方向键级

示例代码

python
from pywfn.base import Mole
from pywfn.bondprop import order
import numpy as np

mole=Mole.from_file('./mols/C6H6.out')
caler=order.Calculator(mole)
bond=(1,2)
dir_=np.array([0.,0.,1.])
dirs={
    0:[0.,0.,1.],
    1:[0.,0.,1.],
}
omat=caler.pocv(dirs,False,False) # 我们对四个原子的轨道投影到随机的方向
np.sqrt(omat[0,1])
np.float64(0.6836355015203792)

π键级(pocv)

使用pocv方法计算得到的π键级:将每个原子的p分子轨道投影到其法向量方向上,根据得到的投影系数矩阵带入Mayer键级计算得到π键级

示例代码

python
from pywfn.base import Mole
from pywfn.bondprop import order

mole=Mole.from_file('./mols/C6H6.out')
caler=order.Calculator(mole)
dirs,omat=caler.pi_pocv()
natm=mole.atoms.len() # 原子的数量
for i in range(0,natm-1):
    for j in range(i+1,natm):
        val=omat[i,j]
        if abs(val)<0.05:continue
        print(f"{i+1:>2}-{j+1:>2}:{val:>10.4f}")
print(dirs) # 原子的投影方向
 1- 2:    0.6606
 1- 3:    0.0593
 1- 4:    0.3128
 1- 5:    0.0593
 1- 6:    0.6606
 2- 3:    0.6606
 2- 4:    0.0593
 2- 5:    0.3128
 2- 6:    0.0593
 3- 4:    0.6606
 3- 5:    0.0593
 3- 6:    0.3128
 4- 5:    0.6606
 4- 6:    0.0593
 5- 6:    0.6606
{5: [-0.0, -0.0, 1.0], 2: [0.0, 0.0, 1.0], 1: [0.0, 0.0, 1.0], 0: [-0.0, -0.0, 1.0], 3: [0.0, 0.0, 1.0], 4: [0.0, 0.0, 1.0]}

π键级(mocv)

使用mocv方法计算得到的π键级

示例代码

python
from pywfn.base import Mole
from pywfn.bondprop import order

mole=Mole.from_file('./mols/C6H6.out')
caler=order.Calculator(mole)
stms,atos,omat=caler.pi_mocv()
natm=mole.atoms.len() # 原子的数量
for i in range(0,natm-1):
    for j in range(i+1,natm):
        val=omat[i,j]
        if abs(val)<0.05:continue
        print(f"{i+1:>2}-{j+1:>2}:{val:>10.4f}")
for atm,stm in stms.items():
    print(atm,stm)
print(atos) # 保留原子轨道索引
 1- 2:    0.6705
 1- 3:    0.0530
 1- 4:    0.3174
 1- 5:    0.0530
 1- 6:    0.6705
 2- 3:    0.6705
 2- 4:    0.0530
 2- 5:    0.3175
 2- 6:    0.0529
 3- 4:    0.6705
 3- 5:    0.0529
 3- 6:    0.3175
 4- 5:    0.6705
 4- 6:    0.0530
 5- 6:    0.6705
3 T  ex: (  0.0000  0.0000  1.0000)  |  ey: ( -1.0000  0.0000  0.0000)  |  ez: (  0.0000  1.0000 -0.0000)
2 T  ex: (  0.0000  0.0000  1.0000)  |  ey: ( -0.5000 -0.8660  0.0000)  |  ez: ( -0.8660  0.5000  0.0000)
1 T  ex: (  0.0000  0.0000  1.0000)  |  ey: (  0.5000 -0.8660  0.0000)  |  ez: ( -0.8660 -0.5000  0.0000)
4 T  ex: (  0.0000  0.0000  1.0000)  |  ey: ( -0.5000  0.8660  0.0000)  |  ez: (  0.8660  0.5000 -0.0000)
5 T  ex: ( -0.0000 -0.0000  1.0000)  |  ey: (  0.5000  0.8660  0.0000)  |  ez: (  0.8660 -0.5000  0.0000)
0 T  ex: ( -0.0000 -0.0000  1.0000)  |  ey: (  1.0000  0.0000  0.0000)  |  ez: (  0.0000 -1.0000  0.0000)
[2, 6, 12, 13, 17, 21, 27, 28, 32, 36, 42, 43, 47, 51, 57, 58, 62, 66, 72, 73, 77, 81, 87, 88]

分解键级

使用mocv方法,根据每种键类型所需的原子轨道,将两个原子之间的键级进行拆分

得到四个键级,分别为:σ键级、π键级、δ键级

示例代码

python
from pywfn.base import Mole
from pywfn.bondprop import order

mole=Mole.from_file('./mols/C6H6.out')
caler=order.Calculator(mole)
caler.decom([0,1])
[0.011991834183650428, 0.011991834183650428, 0.011991834183650428]

啊哦,(⊙o⊙)? 现在算的貌似还不对呢