光學(xué)性質(zhì)計(jì)算后的介電函數(shù)實(shí)部與虛部的提取[python]

寫了一下介電函數(shù)的實(shí)部虛部的提取腳本,也可用于提取其他文件中兩個(gè)關(guān)鍵詞(行)中的數(shù)據(jù),測(cè)試了OUTCAR中的讀取,主函數(shù)如下:


主函數(shù)

#!/usr/bin/python
# coding=utf-8
'''
Created on 11:35, May. 11, 2020

Recently updated on 15:37, May. 12, 2020

@author: Yilin Zhang

These files are need:
    *vasprun.xml* or *OUTCAR* (both after optics caculation)
'''


import os
import numpy as np


def inOutflilePath():
    '''Specify input and output path'''
    # how to use: inPath, outPath = inOutflilePath()

    flag = input('use the Default Path(.)?[1/0]')
    if flag:
        inPath = '.'
        outPath = '.'
    if not flag:
        inPath = str(input('the Path of input file'))
        outPath = str(input('the Path of output file'))
    print('inPath:' + inPath)
    print('outPath:' + outPath)
    # how to use: inPath, outPath = inOutflilePath()
    return inPath, outPath


def contextIn2markLine(lines, markStart, markEnd, show=False):
    '''get the context of lines between markStart and markEnd line'''
    # how to use: context = contextIn2markLine(lines, markStart='Direct', markEnd='', show=False)
    context = []
    indexStart = len(lines)
    # print(indexStart)
    indexEnd = -1
    for line in lines:
        indexEnd += 1
        if markStart in line:
            indexStart = indexEnd
        if len(markEnd.strip().split()) == 0:
            if len(line.strip().split()) == 0:
                if (indexEnd - indexStart) > 0:
                    break
        else:
            if markEnd in line:
                if (indexEnd - indexStart) > 0:
                    break

    print('indexStart:' + str(indexStart), 'indexEnd:' + str(indexEnd) + '\n')

    for i in range(indexStart + 1, indexEnd):
        context.append(lines[i].strip().split())
    if show:
        print('context between ' + markStart + ' and ' + markEnd + ':')
        print(len(context))
        for i in range(len(context)):
            print(context[i])

    return context


def float2line(line,):
    # print(line)
    string = ''
    for i in range(len(line)):
        string += '%25.20f' % float(line[i])
    string += '\n'
    return string


def getDielectricMatrix():
    print('Need files:')
    print('*vasprun.xml* or *OUCTAR*(after optics caculation)')

    inPath, outPath = inOutflilePath()

    infilename = 'OUTCAR'  # vasprun.xml
    infile = open(inPath + os.sep + infilename, 'r')
    lines = infile.readlines()
    infile.close()

    with open(outPath + os.sep + 'REAL.in', 'w') as f:
        context = contextIn2markLine(
            lines, markStart='REAL DIELECTRIC FUNCTION', markEnd='', show=False)

        context = context[2:]
        context = np.array(context).astype(np.float)

        print('REAL line:' + str(len(context)) + '\n')

        for i in range(len(context)):
            line = float2line(context[i])
            f.write(line)

    with open(outPath + os.sep + 'IMAG.in', 'w') as f:
        context = contextIn2markLine(
            lines, markStart='IMAGINARY DIELECTRIC FUNCTION', markEnd='', show=False)

        context = context[2:]
        context = np.array(context).astype(np.float)
        print('IMAG line:' + str(len(context)) + '\n')

        for i in range(len(context)):
            line = float2line(context[i])
            f.write(line)


if __name__ == "__main__":
    getDielectricMatrix()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容