Source code for multipie.wyckoff.wyckoff_g
"""
WyckoffG manages point/space-group Wyckoff positions (conventional, reduced coordinate).
"""
from gcoreutils.nsarray import NSArray
from multipie.tag.tag_group import TagGroup
from multipie.tag.tag_wyckoff import TagWyckoff
from multipie.tag.tag_list import TagList
from multipie.data.data_wyckoff_pg import _data_wyckoff_pg
from multipie.data.data_wyckoff_sg import _data_wyckoff_sg
# ==================================================
[docs]
class WyckoffG(dict): # dict of (wyckoff tag, wyckoff), {TagWyckoff: NSArray}.
"""
point/space-group Wyckoff positions.
Attributes:
tag (TagGroup): group tag.
v (sp.Matrix): vector variable
"""
#
# __default (dict): default position for point group, {TagWyckoff: NSArray}.
# __sym (dict): {wyckoff letter: site symmetry}
#
# ==================================================
def __init__(self, g_tag):
"""
initialize the class.
Args:
g_tag (TagGroup or str): tag of group.
"""
g_tag = TagGroup(str(g_tag))
self.tag = g_tag
"""group tag."""
self.v = NSArray.vector3d()
"""(x,y,z) vector."""
self.__sym = {}
if self.tag.is_point_group():
self.__default = {}
for w, pos, d, sym in _data_wyckoff_pg[str(g_tag)]:
v = dict(zip(["x", "y", "z"], self.v))
self[TagWyckoff(w)] = NSArray(pos).subs(v)
v = dict(zip(["x", "y", "z"], NSArray(d)))
self.__default[TagWyckoff(w)] = NSArray(pos).subs(v)
self.__sym[TagWyckoff(w)] = sym
else:
self.__default = None
for w, pos, sym in _data_wyckoff_sg[str(g_tag)]:
v = dict(zip(["x", "y", "z"], self.v))
self[TagWyckoff(w)] = NSArray(pos).subs(v)
self.__sym[TagWyckoff(w)] = sym
# ==================================================
def __str__(self):
return str(self.tag)
# ==================================================
def __repr__(self):
return repr(self.tag)
# ==================================================
def latex(self):
return self.tag.latex()
# ==================================================
[docs]
def position(self, wp, v=None, default=False):
"""
wyckoff position (reduced coordinate).
Args:
wp (TagWyckoff or str): Wyckoff position tag.
v (str or NSArray, optional): vector variable.
default (bool, optional): use default value ? (point group only).
Returns:
NSArray: wyckoff positions.
"""
if not self.tag.is_point_group() and default is True:
raise NotImplementedError("default value is unsupported for space group.")
if type(wp) == str:
wp = TagWyckoff(wp)
if default:
return self.__default[wp]
if v is None:
return self[wp]
else:
v = dict(zip(["x", "y", "z"], NSArray(v)))
return self[wp].subs(v)
# ==================================================
def __getitem__(self, wp):
if type(wp) == str:
return self.get(TagWyckoff(wp))
else:
return self.get(wp)
# ==================================================
def key_list(self):
return TagList(self.keys())
# ==================================================
[docs]
def site_symmetry(self, wp):
"""
site symmetry.
Args:
wp (TagWyckoff or str): Wyckoff position tag.
Returns:
str: site symmetry.
"""
if type(wp) == str:
wp = TagWyckoff(wp)
return self.__sym[wp]