Source code for nanotools.pspot

# -*- coding: utf-8 -*-
"""
Created on 2020-05-11

@author: Vincent Michaud-Rioux
"""

from nanotools.aobasis import VnlBasis
from nanotools.base import Base
from nanotools.orb import RadFunc
from nanotools.utils import load_dcal
import attr
import numpy as np


[docs] @attr.s class Pspot(Base): """ pspot class. Attributes: symbol : string element symbol path : string pseudopotential path Z: integer pseudoion charge vlc : radFunc local pseudopotential rpc : radFunc partial core charge vnl : kbOrb-array KB-orbitals vso : kbOrb-array SO-orbitals """ path: str = attr.ib(validator=attr.validators.instance_of(str)) symbol: str = attr.ib( default=None, converter=attr.converters.optional(str), validator=attr.validators.optional(attr.validators.instance_of(str)), ) Z: float = attr.ib( default=None, converter=attr.converters.optional(float), validator=attr.validators.optional(attr.validators.instance_of(float)), ) vlc = attr.ib(default=None) rpc = attr.ib(default=None) vnl = attr.ib(default=None) vso = attr.ib(default=None) def __attrs_post_init__(self): self._set_vlc() self._set_rpc() self._set_vnl() # self._init_vso() # temporarily do not real vso, just fill field with vnl values # self.vso = copy.deepcopy(self.vnl) # self.vso.orb = self.vso.orb[0:1] # self.vso.numorb = 1 # self.vso = VnlBasis({"symbol":self.symbol, "path":self.path}, 'VnlSO') if self.symbol is None or self.Z is None: data, fmt = load_dcal(self.path) for snam, inam in zip(["Z", "symbol"], ["N", "symbol"]): try: if fmt == "mat": tmp = data["atom"][0][0][inam][0][0] else: tmp = data["atom"][inam][0:] if inam == "symbol": tmp = "".join(map(chr, tmp.flatten())) if isinstance(tmp, np.ndarray): assert len(tmp) == 1 tmp = tmp.astype(float).item() if isinstance(tmp, str): tmp = str(tmp) setattr(self, snam, tmp) except ValueError: raise Exception( "Couldn't find parameter 'atom.%s' in file %s." % (inam, self.path) ) def _set_vlc(self): if isinstance(self.vlc, dict) and "path" in self.vlc.keys(): self.vlc = RadFunc(**self.vlc) else: self.vlc = RadFunc(path=self.path, varname="Vlocal") def _set_rpc(self): if isinstance(self.rpc, dict) and "path" in self.rpc.keys(): self.rpc = RadFunc(**self.rpc) else: self.rpc = RadFunc(path=self.path, varname="Rpc") def _set_vnl(self): if isinstance(self.vnl, dict) and set(["path", "varname", "symbol"]).issubset( set(self.vnl.keys()) ): self.vnl = VnlBasis(**self.vnl) else: self.vnl = VnlBasis(path=self.path, varname="Vnl", symbol=self.symbol) def _init_vso(self): if isinstance(self.vso, dict) and set(["path", "varname", "symbol"]).issubset( set(self.vso.keys()) ): self.vso = VnlBasis(**self.vso) else: self.vso = VnlBasis(path=self.path, varname="VnlSO", symbol=self.symbol) def _rm_vso(self): self.vso = None def to_vacuum(self): self.path = "" self.symbol += "_Va" self.Z = 0 self.vlc.zero_out() self.rpc.zero_out() self.vnl.to_vacuum() self._rm_vso()