计算化学公社

 找回密码 Forget password
 注册 Register
Views: 3309|回复 Reply: 8
打印 Print 上一主题 Last thread 下一主题 Next thread

[Quantum ESPRESSO] 求助分波态密度计算输出文件E缺失

[复制链接 Copy URL]

10

帖子

0

威望

95

eV
积分
105

Level 2 能力者

请教各位老师,我最近在计算pdos时遇到一个奇怪的问题,正常进行过scf,projwfc计算后得到了一系列pwscf.pdos_atm#2(xx)_wfc#1(s)文件,做图时提示could not convert string to float: '0.198-100',经查找发现pwscf.pdos_atm#1(Pb)_wfc#1(d)中存在一些缺失E的string,导致数据被判断为string,截取部分如下:(在其它分波文件中还有很多类似的情况)
   9.383  0.798E-84  0.213E-85  0.965E-85  0.965E-85  0.581E-84  0.238E-86
   9.393  0.224E-83  0.335E-85  0.215E-84  0.215E-84  0.178E-83  0.255E-86
   9.403  0.226E-83  0.431E-85  0.217E-84  0.217E-84  0.178E-83  0.497E-86
   9.413  0.156E-83  0.247E-85  0.131E-84  0.131E-84  0.127E-83  0.287E-86
   9.423  0.167E-85  0.953E-86  0.239E-86  0.239E-86  0.198-100  0.241E-86
   9.433  0.195E-84  0.434E-86  0.329E-85  0.329E-85  0.112E-84  0.131E-85
   9.443  0.264E-84  0.316E-85  0.535E-85  0.535E-85  0.112E-84  0.135E-85
   9.453  0.264E-84  0.316E-85  0.535E-85  0.535E-85  0.112E-84  0.135E-85
   9.463  0.950E-85  0.338E-85  0.247E-85  0.247E-85  0.113E-85  0.575E-87
   9.473  0.469E-84  0.509E-85  0.692E-85  0.692E-85  0.275E-84  0.463E-86

之前很长时间做这样的计算没遇到过这个问题,qe版本为7.0,请教各位大佬是否遇到过相似的问题,望赐教!

4289

帖子

4

威望

9538

eV
积分
13907

Level 6 (一方通行)

MOKIT开发者

2#
发表于 Post on 2022-2-5 14:19:58 | 只看该作者 Only view this author
如果你确定你的计算无误,那就是程序输出格式没考虑周全的问题,你手动把它改成0.000E+00即可
自动做多参考态计算的程序MOKIT

10

帖子

0

威望

95

eV
积分
105

Level 2 能力者

3#
 楼主 Author| 发表于 Post on 2022-2-5 14:27:43 | 只看该作者 Only view this author
zjxitcc 发表于 2022-2-5 14:19
如果你确定你的计算无误,那就是程序输出格式没考虑周全的问题,你手动把它改成0.000E+00即可

您好!感谢解答,我尝试这样修改过,但这样的问题还有很多,在多个输出文件里都存在。请教老师有没有办法调节输出数据的小数点显示位数,或者在输入文件做某种定义使负多少次方以下的数为零?

3809

帖子

3

威望

1万

eV
积分
20339

Level 6 (一方通行)

围观吃瓜群众

4#
发表于 Post on 2022-2-5 20:50:05 | 只看该作者 Only view this author
本帖最后由 卡开发发 于 2022-2-5 21:28 编辑
Clifford 发表于 2022-2-5 14:27
您好!感谢解答,我尝试这样修改过,但这样的问题还有很多,在多个输出文件里都存在。请教老师有没有办法 ...

这个缺陷是Fortran的'E'输出格式对指数通常只能输出2位,有两种途径可以处理这个问题。
一种途径是,可以写个python程序,例如:
  1. import re
  2. import sys

  3. """
  4. 使用方法: pdos.py [name].pdos_atm[atm]_wfc[orb]
  5. """

  6. #读取文件
  7. f=open(sys.argv[1],'r+')
  8. inp=f.read()
  9. f.close()
  10. """
  11. 将inp中的0.XXX-XXX更换为0,000E+00。可以这么做的原因如下:
  12. 第一列为F8.3格式,负号不可能出现在两个数字间。
  13. 第二列之后的浮点数,负号不应该出现在两个数字间,只可能:
  14. (1)要么是在一个空格和数字之间,要么是在E和数字之间。
  15. 对+E100的情况可能需要另外讨论。
  16. """
  17. out=re.sub('0.\d{3}-\d{3}','0.000E+00',inp)
  18. #写入文件
  19. f=open(sys.argv[1],'w+')
  20. f.write(out)
  21. f.close()
复制代码
然后对异常数字进行替换。当然上述也不是唯一的做法,比如利用python的try-except结构对异常数据进行处理。
另一种方式则是通过修改pp.x自身输出规则来实现,在PP/src/partialdos.f90下,将pdos累加为ldos这一段,
  1.         !
  2.         ! ldos = PDOS summed over m (m=-l:+l)
  3.         !
  4.         ldos  (:,:,:) = 0.d0
  5.         DO ik=1,nkseff
  6.            DO ie= 0, ne
  7.               DO is=1, nspin
  8.                  DO m=1,2 * nlmchi(nwfc)%l + 1
  9.                     ldos  (ie, is, ik) = ldos  (ie, is, ik) + pdos(ie,nwfc+m-1,is,ik)
  10.                  ENDDO
  11.               ENDDO
  12.            ENDDO
  13.         ENDDO
复制代码

这里过后可以简单写个pdos和ldos的循环,将pdos和ldos<1e-100的全部替换为0.0d0即可。在这之后去做处理的原因是我们不希望LDOS在累加的时候收到PDOS截断的影响。



日常打哑谜&&探寻更多可能。
原理问题不公开讨论,非商业性质讨论欢迎私聊。不做培*,不接代*,不接*发谢谢。

10

帖子

0

威望

95

eV
积分
105

Level 2 能力者

5#
 楼主 Author| 发表于 Post on 2022-2-5 23:24:38 | 只看该作者 Only view this author
卡开发发 发表于 2022-2-5 20:50
这个缺陷是Fortran的'E'输出格式对指数通常只能输出2位,有两种途径可以处理这个问题。
一种途径是,可 ...

感谢卡开发发大佬指教,太厉害了!我用您的方法替换了相应字符串,就能顺利作出了pdos图。
但新的问题出现了,所有pdos曲线的态密度值基本为零,多番尝试后发现这和scf中degauss太小(1.0d-9)有关,增大degauss(1.0d-2),或者最好采用Tetrahedron method就根本不会有指数项低于-100这个问题。

3809

帖子

3

威望

1万

eV
积分
20339

Level 6 (一方通行)

围观吃瓜群众

6#
发表于 Post on 2022-2-5 23:59:28 | 只看该作者 Only view this author
Clifford 发表于 2022-2-5 23:24
感谢卡开发发大佬指教,太厉害了!我用您的方法替换了相应字符串,就能顺利作出了pdos图。
但 ...

这个问题说不好,搞不好是什么特定的数值误差所引起的。要是实在不需要展宽稳妥还是直接用四面体积分方法来搞。
日常打哑谜&&探寻更多可能。
原理问题不公开讨论,非商业性质讨论欢迎私聊。不做培*,不接代*,不接*发谢谢。

10

帖子

0

威望

95

eV
积分
105

Level 2 能力者

7#
 楼主 Author| 发表于 Post on 2022-2-6 01:01:25 | 只看该作者 Only view this author
卡开发发 发表于 2022-2-5 23:59
这个问题说不好,搞不好是什么特定的数值误差所引起的。要是实在不需要展宽稳妥还是直接用四面体积分方法 ...

嗯嗯,是的,学习了

6万

帖子

99

威望

6万

eV
积分
125127

管理员

公社社长

8#
发表于 Post on 2022-2-6 02:41:06 | 只看该作者 Only view this author
Fortran里可以明确指定指数部分输出多少位而且保留E符号
比如5E100用E16.5来输出,就会导致输出是0.50000+101,即E没了。如果用E16.5E3,则输出为0.50000E+101。因此只需要改一行源代码即可解决
北京科音自然科学研究中心http://www.keinsci.com)致力于计算化学的发展和传播,长期开办极高质量的各种计算化学类培训:初级量子化学培训班中级量子化学培训班高级量子化学培训班量子化学波函数分析与Multiwfn程序培训班分子动力学与GROMACS培训班CP2K第一性原理计算培训班,内容介绍以及往届资料购买请点击相应链接查看。这些培训是计算化学从零快速入门以及进一步全面系统性提升研究水平的高速路!培训各种常见问题见《北京科音办的培训班FAQ》
欢迎加入北京科音微信公众号获取北京科音培训的最新消息,并避免错过网上有价值的计算化学文章!
欢迎加入人气极高、专业性特别强的理论与计算化学综合交流群思想家公社QQ群(群号见此链接),合计达一万多人。北京科音培训班的学员在群中可申请VIP头衔,提问将得到群主Sobereva的最优先解答。
思想家公社的门口Blog:http://sobereva.com(发布大量原创计算化学相关博文)
Multiwfn主页:http://sobereva.com/multiwfn(十分强大、极为流行的量子化学波函数分析程序)
Google Scholar:https://scholar.google.com/citations?user=tiKE0qkAAAAJ
ResearchGate:https://www.researchgate.net/profile/Tian_Lu

10

帖子

0

威望

95

eV
积分
105

Level 2 能力者

9#
 楼主 Author| 发表于 Post on 2022-2-6 08:38:46 | 只看该作者 Only view this author
sobereva 发表于 2022-2-6 02:41
Fortran里可以明确指定指数部分输出多少位而且保留E符号
比如5E100用E16.5来输出,就会导致输出是0.50000+ ...

好办法,谢谢sob老师指点!

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2026-2-19 21:30 , Processed in 0.189748 second(s), 20 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list