# -*- coding: utf-8 -*-
"""
Created on 2020-11-25
__author__ = Vincent Michaud-Rioux
"""
import attr
from typing import List
from nanotools.base import Base
from nanotools.utils import to_quantity, Quantity, ureg
[docs]
@attr.s
class Region(Base):
"""
Region class, defines a constant function in a specified region
Attributes:
fractional_x_range: used to specify the geometry of the parallelepipedic region, eg. [0.3,0.6]
val: a voltage value (for gates) or a dielectric constant
"""
x_range = attr.ib(default=None)
fractional_x_range: List[float] = attr.ib(factory=lambda: [-1.0, -1.0])
y_range = attr.ib(default=None)
fractional_y_range: List[float] = attr.ib(factory=lambda: [-1.0, -1.0])
z_range = attr.ib(default=None)
fractional_z_range: List[float] = attr.ib(factory=lambda: [-1.0, -1.0])
val: Quantity = attr.ib(
default=0.0 * ureg.eV,
converter=lambda x: to_quantity(x, "eV"),
validator=attr.validators.instance_of(Quantity),
)
def __attrs_post_init__(self):
for key in self.__dict__.keys():
atr = getattr(self, key)
if (
key[-6:] == "_range"
and (not hasattr(atr, "__iter__"))
and atr is not None
):
setattr(self, key, [atr, atr])
[docs]
@attr.s
class Extpot(Base):
"""
External potential class
Attributes:
axis (int):
Direction (lattice vector) of external potential modulation. ``axis`` is passed to the Fortran code, and hence it ranges from 1 to 3.
amplitude (float):
External potential amplitude.
shape (string):
External potential shape. Valid shapes are
* sawtooth
* zero (default)
"""
axis: int = attr.ib(
default=1,
converter=int,
validator=attr.validators.instance_of(int),
)
amplitude: Quantity = attr.ib(
default=0.0 * ureg.eV,
converter=lambda x: to_quantity(x, "eV"),
validator=attr.validators.instance_of(Quantity),
)
shape: str = attr.ib(
default="zero",
converter=str,
validator=attr.validators.instance_of(str),
)
gates: List[Region] = attr.ib(
factory=list,
converter=lambda d: [Region(**d[i]) for i in range(len(d))],
validator=attr.validators.deep_iterable(
member_validator=attr.validators.instance_of(Region),
iterable_validator=attr.validators.instance_of(list),
),
)
dielectrics: List[Region] = attr.ib(
factory=list,
converter=lambda d: [Region(**d[i]) for i in range(len(d))],
validator=attr.validators.deep_iterable(
member_validator=attr.validators.instance_of(Region),
iterable_validator=attr.validators.instance_of(list),
),
)
[docs]
def set_units(self, units):
super().set_units(units=units)
if self.gates is not None:
for g in self.gates:
g.set_units(units)
# no need to set dielectric units