User Tools

Site Tools


exercises:2016_uzh_cmest:band_structure_calculation

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
exercises:2016_uzh_cmest:band_structure_calculation [2016/11/06 15:06]
tmueller
exercises:2016_uzh_cmest:band_structure_calculation [2017/04/21 08:54] (current)
oschuett
Line 127: Line 127:
   * Why do you get 8 orbital energies? Try to change the input to get more unoccupied orbitals.   * Why do you get 8 orbital energies? Try to change the input to get more unoccupied orbitals.
  
-To convert the band structure file to a file which can be loaded directly into MATLAB for example, you can use the script ''​/​users/​tiziano/​bin/​cp2k_bs2csv.py''​ which when passed a band structure file ''​graphene.bs''​ as an argument will write files ''​graphene.bs-setN.csv''​ for each set containing the K-Point coordinates and the energies in one line.+To convert the band structure file to a file which can be loaded directly into MATLAB for example, you can use the script ''​cp2k_bs2csv.py'' ​from below, ​which when passed a band structure file ''​graphene.bs''​ as an argument will write files ''​graphene.bs-setN.csv''​ for each set containing the K-Point coordinates and the energies in one line. 
 + 
 +<file python cp2k_bs2csv.py>​ 
 +#​!/​usr/​bin/​env python 
 +"""​ 
 +Convert the CP2K band structure output to CSV files 
 +"""​ 
 + 
 +import re 
 +import argparse 
 + 
 +SET_MATCH = re.compile(r'''​ 
 +[ ]* 
 +  SET: [ ]* (?​P<​setnr>​\d+) [ ]* 
 +  TOTAL [ ] POINTS: [ ]* (?​P<​totalpoints>​\d+) [ ]* 
 +  \n 
 +(?​P<​content>​ 
 +  [\s\S]*?​(?​=\n.*?​[ ] SET|$) ​ # match everything until next '​SET'​ or EOL 
 +
 +''',​ re.VERBOSE) 
 + 
 +SPOINTS_MATCH = re.compile(r'''​ 
 +[ ]* 
 +  POINT [ ]+ (?​P<​pointnr>​\d+) [ ]+ (?​P<​a>​\S+) [ ]+ (?​P<​b>​\S+) [ ]+ (?​P<​c>​\S+) 
 +''',​ re.VERBOSE) 
 + 
 +POINTS_MATCH = re.compile(r'''​ 
 +[ ]* 
 +  Nr\. [ ]+ (?​P<​nr>​\d+) [ ]+ 
 +  Spin [ ]+ (?​P<​spin>​\d+) [ ]+ 
 +  K-Point [ ]+ (?​P<​a>​\S+) [ ]+ (?​P<​b>​\S+) [ ]+ (?​P<​c>​\S+) [ ]* 
 +  \n 
 +[ ]* (?​P<​npoints>​\d+) [ ]* \n 
 +(?​P<​values>​ 
 +  [\s\S]*?​(?​=\n.*?​[ ] Nr|$)  # match everything until next '​Nr.'​ or EOL 
 +
 +''',​ re.VERBOSE) 
 + 
 +if __name__ == '​__main__':​ 
 +    parser = argparse.ArgumentParser(description=__doc__) 
 +    parser.add_argument('​bsfilename',​ metavar='​bandstructure-file',​ type=str, 
 +                        help="​the band structure file generated by CP2K"​) 
 + 
 +    args = parser.parse_args() 
 + 
 +    with open(args.bsfilename,​ '​r'​) as fhandle: 
 +        for kpoint_set in SET_MATCH.finditer(fhandle.read()):​ 
 +            filename = "​{}.set-{}.csv"​.format(args.bsfilename,​ 
 +                                              kpoint_set.group('​setnr'​)) 
 +            set_content = kpoint_set.group('​content'​) 
 + 
 +            with open(filename,​ '​w'​) as csvout: 
 +                print(("​writing point set {}" 
 +                       "​ (total number of k-points: {totalpoints})"​ 
 +                       ​.format(filename,​ **kpoint_set.groupdict()))) 
 + 
 +                print(" ​ with the following special points:"​) 
 +                for point in SPOINTS_MATCH.finditer(set_content):​ 
 +                    print(" ​ {pointnr}: {a}/​{b}/​{c}"​.format( 
 +                        **point.groupdict())) 
 + 
 +                for point in POINTS_MATCH.finditer(set_content):​ 
 +                    results = point.groupdict() 
 +                    results['​values'​] = " "​.join(results['​values'​].split()) 
 +                    csvout.write("​{a} {b} {c} {values}\n"​.format(**results)) 
 + 
 +</​file>​ 
exercises/2016_uzh_cmest/band_structure_calculation.txt · Last modified: 2017/04/21 08:54 by oschuett