计算物理投影对角化性能优化——numpy + numba

一般来说,对角化哈密顿量总是依赖布里渊区的一系列q,然后将对角化得到的能带和波函数存下来,这个算法的通用写法是:

@jit(nopython=True)
def solve_Heff(nk, V):
    L, nk = V.shape
    Ek = np.zeros((nk, nk))
    Sk = np.zeros((nk, nk))
    for i in range(nk):
        Heff = np.diag(Mterm2(V, nk, i)) - Mterm3(V, nk, i)
        E, Psi = LA.eigh(Heff)
        n = np.power(np.absolute(Psi), 2)
        Sk_tmp = -n * np.log(n + 1e-5)
        Ek[:,i] = E
        Sk[:,i] = np.sum(Sk_tmp, axis = 0)
    return Ek, Sk

哈密顿量一般情况下总是按照一定规则生成,这里用常规的二重循环生成哈密顿量矩阵。

@jit(nopython=True)
def  Mterm2(V, nk, q):
    M2 = np.zeros(nk, dtype=np.complex64)
    Ap = np.power(np.absolute(V),2).sum(axis=1).copy()  # 预处理一个常数项
    for i in range(nk):
        M2[i] += np.sum(Ap*np.power(np.absolute(V[:,(i - q + nk) % nk]), 2))
    return M2 / nk

@jit(nopython=True)
def Mterm3(V, nk, q):
    M3 = np.zeros((nk, nk), dtype=np.complex64)
    for i in range(nk):
        for j in range(nk):
            M3[i, j] += np.sum(np.conj(V[:, (i - q + nk) % nk]) * V[:, i] * V[:,(j - q + nk) % nk] * np.conj(V[:,j]))
    return M3 / nk

这段程序用numpy+numba部分向量化优化达到性能最大,任务管理器观察发现,此程序将CPU跑满。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值