(Fortran) 在复杂的 3D 域上进行积分/求和

计算科学 正则 正交 网格生成 计算物理学 对称
2021-12-25 00:52:51

我有一些功能F(kx,ky,kz)我希望在多边形域上进行数值积分 - 物理上,我正在对 FCC 晶格(截断八面体)的第一个布里渊区(BZ)进行积分。

我的目标是告诉 Fortrank给定这种形状,空间和要整合的点。

我可以为这个区域写平面方程和不等式,也许将它们放入一个逻辑结构中,然后在整个 BZ 上积分,但这对我来说似乎效率低下。看来我应该能够使用任何可用的对称性来挑选 BZ 的一个独特位,然后使用这些对称性来反映/旋转/等我的答案。

有人告诉我已经存在可以执行此类操作的例程,但我不确定我搜索的内容是否合适(VASP 等)。

如果存在的话,有人会好心推荐一个合适的包吗?如果没有,是否有我应该研究的多维集成方法?如果是这样,是否有一种有效的方法来限制我的集成域?

另一种方法是简单地求和F(k)在区域内的统一网格上-然后以我想要的形状预先计算具有 1 和 0 的 rank-3 数组,调用、计算和求和是否会更有效F(k)仅适用于非零元素?只是想了解哪个方向最有效和最准确。

2个回答

在我看来,您可以将您的域细分为一组相对较小的四面体。然后,进行积分是微不足道的,因为四面体上有许多好的(和预先列出的)求积规则可以产生相当高的精度——这就是有限元方法中一直在做的事情,所以有一个那里有很多信息。然后,布里渊区域上的积分就是您将区域分解成的四面体上的积分之和。

如果要集成的功能,F(kx,ky,kz),恰好是高度振荡或不是很平滑,那么解决方案是将您的每个四面体分成四个较小的四面体,如果有必要重复该过程,并整合每个现在较小的单元格。

许多平面波编码使用非常简单的 k 点加权方案:

  1. 在 k 空间中生成均匀网格,K
  2. 为不可约楔中的每个 k 点分配一个权重w(k)=#{qK:k and q are symmetric}
  3. 将积分写为BZF(k)dk=kKw(k)F(k)

这既快又脏,但通常不是主要错误(至少对于 PWDFT 而言)。

您可以在 Quantum Espresso 的sumkg中找到一个这样的积分示例,该示例用于对给定化学势(以找到费米能量)的电子数求和我相信找到不可约楔并生成k点权重的代码,w(k),就在这里Quantum Espresso 也可以使用四面体;sumkg 的等效积分称为sumkt在 k 空间中生成四面体和均匀网格的例程在这里