abacus 基本操作

文章目录

  • abacus 基本操作
    • 下载和运行abacus
    • 输入输出
    • 源码解读

下载和运行abacus

设置代理

export HTTP_PROXY=http://sys-proxy-rd-relay.byted.org:8118
export HTTPS_PROXY=http://sys-proxy-rd-relay.byted.org:8118

克隆

git clone https://github.com/deepmodeling/abacus-develop.git

运行方式,在参数文件夹下执行

abacus所在路径/abacus

输入输出

INPUT 文件

INPUT_PARAMETERS
#Parameters (General)
pseudo_dir      ./
ntype           1
nbands          4
#Parameters (Accuracy)
ecutwfc         50
scf_nmax            20
symmetry        1

ntype:在原包内有多少种类型的原子。
nbands:要被计算的能带数量。
ecutwfc:平面波的截断能。
scf_nmax:迭代过程的最大迭代次数。默认 40。
symmetry:取值为 0 或者 1。如果是 1,将用对称分析来决定布拉菲点阵的类型。

STRU

#This is the atom file containing all the information
#about the lattice structure.ATOMIC_SPECIES
Si 1.000 Si.pz-vbc.UPF  #Element, Mass, PseudopotentialLATTICE_CONSTANT
10.2            #Lattice constantLATTICE_VECTORS
0.5 0.5 0.0         #Lattice vector 1
0.5 0.0 0.5         #Lattice vector 2
0.0 0.5 0.5         #Lattice vector 3ATOMIC_POSITIONS
Cartesian       #Cartesian(Unit is LATTICE_CONSTANT)
Si          #Name of element
0.0         #Magnetic for this element.
2           #Number of atoms
0.00 0.00 0.00 0 0 0    #x,y,z, move_x, move_y, move_z
0.25 0.25 0.25 1 1 1

第 5 行,指定标签、质量、赝势文件名。
第 8 行,晶格缩放因子。
第 11~13 行,晶格矢量。
第 16 行,方向,笛卡尔或者直接坐标。

KPT 文件

K_POINTS
0
Gamma
4 4 4 0 0 0

第 2 行表示 k 点总数,0 表示自动。
第 3 行选择 Monkhorst-Pack 方法, Gamma 或者 MP
第 4 行前三个数,沿着倒格矢的分割。后三个数网格的移动。

UPF 文件

<PP_INFO>
Generated using unknown code
Author: Von Barth-Car (<1984)
Info: automatically converted from PWSCF format0        The Pseudo was generated with a Non-Relativistic Calculation0.00000000000E+00    Local Potential cutoff radius
nl pn  l   occ               Rcut            Rcut US             E pseu
3S  0  0  2.00      0.00000000000      0.00000000000      0.00000000000
3P  0  1  2.00      0.00000000000      0.00000000000      0.00000000000
</PP_INFO><PP_HEADER>0                   Version NumberSi                   ElementNC                  Norm - Conserving pseudopotentialF                  Nonlinear Core CorrectionSLA  PZ   NOGX NOGC   PZ   Exchange-Correlation functional4.00000000000      Z valence0.00000000000      Total energy0.0000000  0.0000000 Suggested cutoff for wfc and rho1                  Max angular momentum component431                  Number of points in mesh2    2             Number of Wavefunctions, Number of ProjectorsWavefunctions         nl  l   occ3S  0  2.003P  1  2.00
</PP_HEADER>……
……
……

定义赝势相关的参数。

源码解读

class WF_igk
{public:WF_igk();~WF_igk();//---------------------------------------------------// npwx: max npw// npw// igk: [nks, npw_max]// g2kin: [npwx],kinetic energy for current k point//---------------------------------------------------int npwx;int npw;ModuleBase::IntArray igk;double *g2kin;
#ifdef __CUDAdouble *d_g2kin;
#endifpublic:// Calculate kinetic energyvoid ekin(const int ik);double* get_qvec_cartesian(const int &ik);ModuleBase::Vector3<double> get_1qvec_cartesian(const int ik,const int ig)const;std::complex<double>* get_sk(const int ik, const int it, const int ia)const;// pengfei 2016-11-23std::complex<double>* get_skq(int ik, int it, int ia, ModuleBase::Vector3<double> q);};

这个模块包含了动能相关,g2kin 是动能向量。其中 ekin 是动能计算函数。

//--------------------------------------------------------
// Compute kinetic energy for each k-point
//--------------------------------------------------------
void WF_igk::ekin(const int ik)
{ModuleBase::timer::tick("WF_igk", "ekin");ModuleBase::GlobalFunc::ZEROS(g2kin, this->npwx);for (int ig = 0; ig < GlobalC::kv.ngk[ik]; ig++){//--------------------------------------------------------// EXPLAIN : Put the correct units on the kinetic energy//--------------------------------------------------------this->g2kin[ig] = GlobalC::pw.get_GPlusK_cartesian(ik, this->igk(ik, ig)).norm2() * GlobalC::ucell.tpiba2;}
#ifdef __CUDAcudaMemcpy(this->d_g2kin, this->g2kin, GlobalC::kv.ngk[ik] * sizeof(double), cudaMemcpyHostToDevice);
#endifModuleBase::timer::tick("WF_igk", "ekin");return;
}

动能向量的具体计算函数。

void Electrons::c_bands(const int &istep)

这是电子能带计算的一个核心函数。包含了动能项的计算,计算哈密顿量和特征向量的乘积,通过最小化能量泛函得到特征值和特征向量。h_diag 为预条件矩阵。

        else if (precondition_type==2){for (int ig = 0;ig < GlobalC::wf.npw; ig++){h_diag[ig] = 1 + GlobalC::wf.g2kin[ig] + sqrt( 1 + (GlobalC::wf.g2kin[ig] - 1) * (GlobalC::wf.g2kin[ig] - 1));if(GlobalV::NPOL==2) h_diag[ig+GlobalC::wf.npwx] = h_diag[ig];}}

这是 c_bands 中构造某种预条件子部分,其中利用了构造出来的 g2_kin 动能向量。

void Hamilt::diagH_pw(const int &istep,//0const int &iter,//1const int &ik,//0const double *precondition,//precondition[0] = 2.41424double &avg_iter)//0

对角分解是能带计算的核心步骤,iter 表示迭代次数,ik 表示计算第几个 k 点。precondition 表示预条件数组。

         if(GlobalV::KS_SOLVER=="cg"){if ( iter > 1 || istep > 1 ||  ntry > 0){this->diagH_subspace(ik,GlobalV::NBANDS,GlobalV::NBANDS,GlobalC::wf.evc[ik0],GlobalC::wf.evc[ik0],GlobalC::wf.ekb[ik]);avg_iter += 1.0;}Diago_CG cg(&GlobalC::hm.hpw);bool reorder = true;if(GlobalV::NPOL==1){cg.diag(GlobalC::wf.evc[ik0], GlobalC::wf.ekb[ik], GlobalC::kv.ngk[ik], GlobalC::wf.npwx,GlobalV::NBANDS, precondition, GlobalV::PW_DIAG_THR,GlobalV::PW_DIAG_NMAX, reorder, notconv, avg);}}

这是 CG ks 方程解法器执行的代码。可以看得出来,当 iter 小于等于 1 的时候,开始的那段代码不能执行,等于 2 的时候就执行。这是因为,在平面波方法中,对角化哈密顿量的时候,首先用 diagH_subspace 去对角化,然后再用 cg 方法。
wf.ekb[ik] 存的是第 ik 个 k 点对应的 n_band 个特征值。wf.evc[ik0] 原来存的是哈密顿量和特征向量的内积,后来存的是第 ik0 个 k 点计算得到的 n_band 个特征向量矩阵。

class Hamilt_PW
{public: void diagH_subspace(const int ik,const int nstart,const int nbnd,const ModuleBase::ComplexMatrix &psi,ModuleBase::ComplexMatrix &evc,double *en);void h_1psi(const int npw,const std::complex<double> *psi1d,std::complex<double> *hpsi,std::complex<double> *spsi);void h_psi(const std::complex<double> *psi,std::complex<double> *hpsi,const int m = 1); // qianrui add a default parameter 2021-3-31void s_1psi(const int npw,const std::complex < double> *psi,std::complex < double> *spsi);};

∣ψj⟩=H∣ϕj⟩\left|\psi_{j}\right\rangle=H\left|\phi_{j}\right\rangle∣ψj​⟩=H∣ϕj​⟩ 等量计算的一些关键函数。h_1psi 调用的核心本质是 h_psi,动能项什么的其实也是在 h_psi 中进行了计算。利用 h_1psi 计算得到 hpsi 和 spsi。s_1psi 计算 sphi = S|psi(m)>。

//----------------------------------------------------------------------
// Hamiltonian diagonalization in the subspace spanned
// by nstart states psi (atomic or random wavefunctions).
// Produces on output n_band eigenvectors (n_band <= nstart) in evc.
//----------------------------------------------------------------------
void Hamilt_PW::diagH_subspace(const int ik,//0const int nstart,//8const int n_band,//4const ModuleBase::ComplexMatrix &psi,ModuleBase::ComplexMatrix &evc,double *en)

这个模块的作用是通过对角化得到特征分解。ik 为 k 点指标。n_band 为能带个数,也就是求得的前几个特征值个数。psi 是哈密顿量和(多个)特征向量的内积,即
∣ψj⟩=H∣ϕj⟩\left|\psi_{j}\right\rangle=H\left|\phi_{j}\right\rangle ∣ψj​⟩=H∣ϕj​⟩
en 和 evc 是最小化能量泛函
E[ϕi]=⟨ϕi∣H∣ϕj⟩E\left[\phi_{i}\right]=\left\langle\phi_{i}|H| \phi_{j}\right\rangle E[ϕi​]=⟨ϕi​∣H∣ϕj​⟩
得到的 n_band 个特征值和特征向量。

void Diago_CG::diag
(ModuleBase::ComplexMatrix &phi,double *e,const int &dim,const int &dmx,const int &n_band,const double *precondition,const double &eps,const int &maxter,const bool &reorder,int & notconv,double &avg_iter
)//-------------------------------------------------------------------// "poor man" iterative diagonalization of a std::complex hermitian matrix// through preconditioned conjugate gradient algorithm// Band-by-band algorithm with minimal use of memory// Calls h_1phi and s_1phi to calculate H|phi> and S|phi>// Works for generalized eigenvalue problem (US pseudopotentials) as well//-------------------------------------------------------------------

使用 CG 算法(ccgdiagg)进行对角化。其中 h_1phi 和 s_1phi 是计算 H∣ϕi>H|\phi_i>H∣ϕi​> 和 S∣ϕi>S|\phi_i>S∣ϕi​>的函数。

abacus 基本操作相关推荐

  1. 数据结构(03)— 数据处理基本操作(数据的查找、新增、删除、修改)

    我们先来看一个关于查找的例子.查找,就是从复杂的数据结构中,找到满足某个条件的元素.通常可从以下两个方面来对数据进行查找操作:​ 根据元素的位置或索引来查找: 根据元素的数值特征来查找. 针对上述两种 ...

  2. pytorch方法,Tensor及其基本操作_重点

    由于之前的草稿都没了,现在只有重写-. 我好痛苦 本章只是对pytorch的常规操作进行一个总结,大家看过有脑子里有印象就好,知道有这么个东西,需要的时候可以再去详细的看,另外也还是需要在实战中多运用 ...

  3. Gradle安装使用以及基本操作

    转自:https://www.cnblogs.com/linkstar/p/7899191.html Gradle安装使用以及基本操作 阅读目录 简单介绍 安装 使用idea创建一个web的Gradl ...

  4. c++文件读取空格_程序员术与道:术—C语言对文件进行处理,文件处理的基本操作...

    各种编程语言都实现了文件的基本操作,提供了对应的接口,本篇文章先为你介绍C语言对文件进行处理和文件处理的基本操作.主要从以下几个方面进行介绍: 读取文件 写入文件 重命名文件 读取目录 读取目录下的文 ...

  5. 【Pandas库】(3) DataFrame的创建方法及基本操作

    各位同学好,今天给大家介绍一下Pandas库中DataFrame类型数据的创建方法和基本操作. 文章内容如下: (1)使用字典类创建. 字典类有:①数组.列表.元组构成的字典:②Series构造的字典 ...

  6. 【MySQL】缩略语PK NN UQ BIN UN ZF AI G、基本操作语句

    一.缩略语 PK:primary key 主键 NN:not null 非空 UQ:unique 唯一索引 BIN:binary 二进制数据 UN:unsigned 无符号整数(非负数) ZF:zer ...

  7. MySQL中定义fk语句_MySQL基础篇/第3篇:MySQL基本操作语句.md · qwqoo/MySQL-Review - Gitee.com...

    ### 第3篇:MySQL基本操作语句 - MySQL基础操作 #### 排序检索数据 - 之前的数据没有进行排序,其是按照默认在数据表中的数据返回的 - SELECT语句的ORDER BY 子句进行 ...

  8. OpenCV-Java版学习(3.对视频的基本操作)

    前言 上一节我们学习了使用OpenCV对图像进行一些基础操作,现在我们学习对视频进行一些基础的操作. 对视频的基本操作 从相机中读取视频 我们从电脑自带的摄像头捕捉一段视频并在屏幕上显示出来,代码如下 ...

  9. JDBC编程:2(数据库的基本操作)

    数据库的基本操作 查询数据 在开始前先简单地介绍一下什么是静态SQL和动态SQL: 静态SQL,在编译阶段就可以确定数据库要做什么事情.在某种高级语言中,如果嵌入了SQL语句,而这个SQL语句的主体结 ...

最新文章

  1. Android关于绘图中Shader 的效果(中级)
  2. 高校老师暑假狂补AI课背后:AI人才培养竞赛开跑
  3. keycode值对照表_JavaScript中键盘字母与keyCode值(键值)的对照表
  4. 刺激!一行代码即可导出所有浏览记录
  5. yum java 1.7_centos通过yum安装jdk1.7或1.8
  6. 数据库以及表的基本操作
  7. RocksDB事务实现TransactionDB分析
  8. 部署Django REST Framework服务(Nginx + uWSGI + Django)
  9. 如何用Python做好友管理系统
  10. form表单提交数据编码方式和tomcat接受数据解码方式的思考
  11. Docker DeskTop安装Jenkins教程[Windows]
  12. linux常用快捷键大全
  13. python-pptx---插入表格
  14. word排版案例报告_Word操作技巧:图文混排,就是这么简单
  15. elasticsearch-8.0.0报错总结(ES)-持续更新
  16. iOS开发~WKWebView白屏适配
  17. PythonChallenge闯关详解
  18. 【MySQL附录】A6:MySQL OCP 认证考试最详细最准确报考流程(2020年)
  19. java 对图片解码_java对图片的转码和解码 实用
  20. uniq命令注意事项,检查重复行的时候,只会检查相邻的行。

热门文章

  1. 【快递下单小程序源码】可运营+快递下单微信小程序
  2. py+seleneium(多窗口操作、alert窗口操作、元素、上传的一些方法)
  3. 驰为v10刷linux,V10HD强势回归 3G双系统聚划算首发
  4. 泊松噪声(附Matlab代码)
  5. 研究生平均年薪26.5万!本科生20万!南京大学软件学院19年就这么高!
  6. dns服务器未响应和欠费,dns服务器未响应【操作方向】
  7. 简单计算机基础知识,计算机基础知识讲义
  8. 闲谈隐性成本(太多人的思维盲区)
  9. MySQL及数据库相关
  10. Multisim基础 带锁型按钮开关 添加元件的位置