Source code for multipie.virtual_cluster.virtual_cluster_pg
"""
VirtualClusterPG manages point-group virtual cluster (real).
"""
from gcoreutils.nsarray import NSArray
from multipie.tag.tag_group import TagGroup
from multipie.tag.tag_multipole import TagMultipole
from multipie.tag.tag_list import TagList
from multipie.data.data_virtual_cluster_real import (
_data_virtual_cluster_basis_real,
_data_virtual_cluster_site_real,
)
# ==================================================
[docs]
class VirtualClusterPG(dict): # dict of (multipole tag, vc basis), {TagMultipole: NSArray} (orthonormalized version).
"""
point/space-group virtual cluster.
Attributes:
tag (TagGroup): group tag.
site (NSArray): site positions (reduced coordinate).
"""
# ==================================================
def __init__(self, pg_tag):
"""
initialize the class.
Args:
pg_tag (TagGroup or str): point-group tag.
"""
pg_tag = TagGroup(pg_tag)
self.tag = pg_tag
"""point-group tag."""
assert self.tag.is_point_group(), "it is valid only for point group."
vc = _data_virtual_cluster_basis_real
vc_site = _data_virtual_cluster_site_real
self._basis = {}
self._site = {}
for wp, dic in vc[str(pg_tag)].items():
self._basis[wp] = {}
for m, b in dic.items():
self._basis[wp][TagMultipole(m)] = NSArray(b)
for wp, vec in vc_site[str(pg_tag)].items():
self._site[wp] = NSArray(vec)
wp0 = list(self._basis.keys())[0] # assume general point is the first.
d = {}
for m, b in self._basis[wp0].items():
d[m] = b
self.update(d)
self.site = self._site[wp0]
"""site positions (cartesian coordinate)."""
# ==================================================
def __str__(self):
return str(self.tag)
# ==================================================
def __repr__(self):
return repr(self.tag)
# ==================================================
def latex(self):
return self.tag.latex()
# ==================================================
def __getitem__(self, tag):
if type(tag) == str:
return self.get(TagMultipole(tag))
else:
return self.get(tag)
# ==================================================
[docs]
def get(self, wyckoff, tag):
if type(tag) == str:
return self._basis[wyckoff][TagMultipole(tag)]
else:
return self._basis[wyckoff][tag]
# ==================================================
def key_list(self, wyckoff=None):
if wyckoff is None:
return TagList(self.keys())
else:
return TagList(self._basis[wyckoff].keys())