使用pyscf可视化电子密度?

问题描述

我发现以下代码示例使用密度泛函理论来计算电子密度 rho

#!/usr/bin/env python
#
# Author: Qiming Sun <osirpt.sun@gmail.com>
#

import numpy
from pyscf import lib
from pyscf.dft import numint,gen_grid

"""
Gaussian cube file format
"""


def density(mol,outfile,dm,nx=80,ny=80,nz=80):
coord = mol.atom_coords()
Box = numpy.max(coord,axis=0) - numpy.min(coord,axis=0) + 4
Boxorig = numpy.min(coord,axis=0) - 2
xs = numpy.arange(nx) * (Box[0] / nx)
ys = numpy.arange(ny) * (Box[1] / ny)
zs = numpy.arange(nz) * (Box[2] / nz)
coords = lib.cartesian_prod([xs,ys,zs])
coords = numpy.asarray(coords,order="C") - (-Boxorig)

nao = mol.nao_nr()
ngrids = nx * ny * nz
blksize = min(200,ngrids)
rho = numpy.empty(ngrids)
for ip0,ip1 in gen_grid.prange(0,ngrids,blksize):
    ao = numint.eval_ao(mol,coords[ip0:ip1])
    rho[ip0:ip1] = numint.eval_rho(mol,ao,dm)
rho = rho.reshape(nx,ny,nz)

with open(outfile,"w") as f:
    f.write("Density in real space\n")
    f.write("Comment line\n")
    f.write("]" % mol.natm)
    f.write(" .8f .8f .8f\n" % tuple(Boxorig.tolist()))
    f.write("] .8f .8f .8f\n" % (nx,xs[1],0))
    f.write("] .8f .8f .8f\n" % (ny,ys[1],0))
    f.write("] .8f .8f .8f\n" % (nz,zs[1]))
    for ia in range(mol.natm):
        chg = mol.atom_charge(ia)
        f.write("%5d %f" % (chg,chg))
        f.write(" .8f .8f .8f\n" % tuple(coord[ia]))
    fmt = " .8e" * nz + "\n"
    for ix in range(nx):
        for iy in range(ny):
            f.write(fmt % tuple(rho[ix,iy].tolist()))

if name == "ma​​in": 从 pyscf 导入 gto,scf 从 pyscf.tools 导入 cubegen

mol = gto.M(atom="H 0 0 0; H 0 0 1")
mf = scf.RHF(mol)
mf.scf()
cubegen.density(mol,"h2.cube",mf.make_rdm1())

但是我想知道这个输出的性质。所以如果我要可视化这个电子密度,我将如何绘制它?有人熟悉这个包吗?它似乎是一个包含三列 \rho 的数组,每列长度为 80。但是一个点对应什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)