Source code for masci_tools.io.kkr_read_shapefun_info
###############################################################################
# Copyright (c), 2018 Forschungszentrum Jülich GmbH, IAS-1/PGI-1, Germany. #
# All rights reserved. #
# This file is part of the Masci-tools package. #
# (Material science tools) #
# #
# The code is hosted on GitHub at https://github.com/judftteam/masci-tools #
# For further information on the license, see the LICENSE.txt file #
# #
###############################################################################
"""
Reading of shpefun files of KKR
"""
__version__ = 0.1
[docs]def read_shapefun(path='.'):
"""
Read vertices of shapefunctions with
Zoom into shapefun of a single atom
:author: Philipp Ruessmann
:param path: path where voronoi output is found (optional, defaults to './')
:returns pos: positions of the centers of the shapefunctions
:returns out: dictionary of the vertices of the shapefunctions
"""
from masci_tools.io.common_functions import search_string
from numpy import array
path += '/'
# first read vertices file
with open(path + 'vertices.dat', encoding='utf-8') as f:
out = {}
face, face_old = -1, -1
for line in f:
if '# serial:' in line[:9]:
# skip line with serial number
pass
else:
if 'representative' in line:
atm = int(line.split()[-1])
i_newat = 1
elif 'Face' in line:
i_newat = 0
face = int(line.split()[-1])
i_newface = 1
tmp = []
else:
i_newface = 0
tmp2 = line.split()
if tmp2 != []:
tmp2 = [float(i) for i in tmp2]
tmp.append(tmp2)
atm_old, face_old = atm, face
if face_old != face:
out[atm, face] = tmp
# then read positions from inputcard
with open(path + 'inputcard', encoding='utf-8') as file:
inp = file.readlines()
# convert to uppercase
for index, line in enumerate(inp):
inp[index] = line.upper()
# search number of atoms in inputcard
iline = search_string('NAEZ', inp)
if iline < 0:
iline = search_string('NATYP', inp)
if iline == -1:
raise ValueError('Error reading NAEZ or NATYP from inputcard.')
naez = int(inp.pop(iline).split('=')[1].split()[0])
# read rbasis positions
iline = search_string('RBASIS', inp)
if iline >= 0:
pos = []
for iatom in range(naez):
pos.append(inp.pop(iline + 1))
# finally convert to float arrays
pos = array([[float(j) for j in i.split()[:3]] for i in pos])
else:
raise ValueError('Error reading RBASIS from inputcard.')
return pos, out