|
|
本帖最后由 卡开发发 于 2022-2-5 21:28 编辑
这个缺陷是Fortran的'E'输出格式对指数通常只能输出2位,有两种途径可以处理这个问题。
一种途径是,可以写个python程序,例如:- import re
- import sys
- """
- 使用方法: pdos.py [name].pdos_atm[atm]_wfc[orb]
- """
- #读取文件
- f=open(sys.argv[1],'r+')
- inp=f.read()
- f.close()
- """
- 将inp中的0.XXX-XXX更换为0,000E+00。可以这么做的原因如下:
- 第一列为F8.3格式,负号不可能出现在两个数字间。
- 第二列之后的浮点数,负号不应该出现在两个数字间,只可能:
- (1)要么是在一个空格和数字之间,要么是在E和数字之间。
- 对+E100的情况可能需要另外讨论。
- """
- out=re.sub('0.\d{3}-\d{3}','0.000E+00',inp)
- #写入文件
- f=open(sys.argv[1],'w+')
- f.write(out)
- f.close()
复制代码 然后对异常数字进行替换。当然上述也不是唯一的做法,比如利用python的try-except结构对异常数据进行处理。
另一种方式则是通过修改pp.x自身输出规则来实现,在PP/src/partialdos.f90下,将pdos累加为ldos这一段,- !
- ! ldos = PDOS summed over m (m=-l:+l)
- !
- ldos (:,:,:) = 0.d0
- DO ik=1,nkseff
- DO ie= 0, ne
- DO is=1, nspin
- DO m=1,2 * nlmchi(nwfc)%l + 1
- ldos (ie, is, ik) = ldos (ie, is, ik) + pdos(ie,nwfc+m-1,is,ik)
- ENDDO
- ENDDO
- ENDDO
- ENDDO
复制代码
这里过后可以简单写个pdos和ldos的循环,将pdos和ldos<1e-100的全部替换为0.0d0即可。在这之后去做处理的原因是我们不希望LDOS在累加的时候收到PDOS截断的影响。
|
|