Source code for sknano.structures._swnt

# -*- coding: utf-8 -*-
"""
==============================================================================
SWNT structure class (:mod:`sknano.structures._swnt`)
==============================================================================

.. currentmodule:: sknano.structures._swnt

"""
from __future__ import absolute_import, division, print_function, \
    unicode_literals
__docformat__ = 'restructuredtext en'

from ._base import StructureBase
from ._compute_funcs import compute_tube_mass, compute_linear_mass_density
from ._extras import attr_strfmt, attr_symbols, attr_units
from ._mixins import NanotubeMixin

__all__ = ['SWNT', 'Nanotube']


[docs]class SWNT(NanotubeMixin, StructureBase): """SWNT structure class. Parameters ---------- n, m : int Chiral indices defining the nanotube chiral vector :math:`\\mathbf{C}_h = n\\mathbf{a}_1 + m\\mathbf{a}_2 = (n, m)`. nz : int, optional Number of repeat unit cells along the :math:`z` dimension element1, element2 : {str, int}, optional Element symbol or atomic number of basis :class:`~sknano.core.atoms.Atom` 1 and 2 bond : float, optional Distance between nearest neighbor atoms (i.e., bond length). Must be in units of **\u212b**. Default value is the carbon-carbon bond length in graphite, approximately :math:`\\mathrm{a}_{\\mathrm{CC}} = 1.42` \u212b Lz : float, optional Length of the nanotube in **nanometers**. Overrides the :math:`n_z` cell values. .. versionadded:: 0.2.5 tube_length : float, optional Length of nanotube in units of **nanometers**. Overrides `nz` value. .. deprecated:: 0.2.5 Use `Lz` instead fix_Lz : bool, optional Generate the nanotube with length as close to the specified :math:`L_z` as possible. If `True`, then non integer :math:`n_z` cells are permitted. Examples -------- >>> from sknano.structures import SWNT Create a SWNT with :math:`\\mathbf{C}_{h} = (10, 10)` chirality. >>> swnt = SWNT(n=10, m=10, verbose=True) >>> print(unicode(swnt)) SWNT(n=10, m=10, element1='C', element2='C', bond=1.42, nz=1) n: 10 m: 10 t₁: 1 t₂: -1 d: 10 dR: 30 N: 20 R: (1, 0) θc: 30.00° Ch: 42.60 Å T: 2.46 Å dt: 13.56 Å rt: 6.78 Å electronic_type: metallic Change the chirality to :math:`\\mathbf{C}_{h} = (20, 10)`. >>> swnt.n = 20 >>> print(unicode(swnt)) SWNT(n=20, m=10, element1='C', element2='C', bond=1.42, nz=1) n: 20 m: 10 t₁: 4 t₂: -5 d: 10 dR: 10 N: 140 R: (1, -1) θc: 19.11° Ch: 65.07 Å T: 11.27 Å dt: 20.71 Å rt: 10.36 Å electronic_type: semiconducting, type 2 Change the chirality to :math:`\\mathbf{C}_{h} = (20, 0)`. >>> swnt.m = 0 >>> print(unicode(swnt)) SWNT(n=20, m=0, element1='C', element2='C', bond=1.42, nz=1) n: 20 m: 0 t₁: 1 t₂: -2 d: 20 dR: 20 N: 40 R: (1, -1) θc: 0.00° Ch: 49.19 Å T: 4.26 Å dt: 15.66 Å rt: 7.83 Å electronic_type: semiconducting, type 1 """ # add each attribute in the order I want them to appear in # verbose output mode _structure_attrs = ['n', 'm', 't1', 't2', 'd', 'dR', 'N', 'R', 'chiral_angle', 'Ch', 'T', 'dt', 'rt', 'electronic_type'] def __init__(self, n=10, m=0, nz=1, tube_length=None, Lz=None, fix_Lz=False, **kwargs): super(SWNT, self).__init__(**kwargs) if tube_length is not None and Lz is None: Lz = tube_length self.L0 = Lz # store initial value of Lz self.n = n self.m = m self.fix_Lz = fix_Lz if Lz is not None: self.nz = 10 * float(Lz) / self.T elif nz is not None: self.nz = nz else: self.nz = 1 def __str__(self): """Return nice string representation of `SWNT`.""" if self.verbose: strrep = repr(self) + '\n' for attr in self._structure_attrs: var = attr if attr in attr_symbols: var = attr_symbols[attr] if attr in attr_strfmt: if attr in attr_units: strrep += \ "{}: {}{}\n".format( var, attr_strfmt[attr].format( getattr(self, attr)), attr_units[attr]) else: strrep += "{}: {}\n".format( var, attr_strfmt[attr].format(getattr(self, attr))) else: if attr in attr_units: strrep += "{}: {}{}\n".format( var, getattr(self, attr), attr_units[attr]) else: strrep += "{}: {}\n".format( var, getattr(self, attr)) return strrep def __repr__(self): """Return canonical string representation of `SWNT`.""" strrep = "SWNT(n={!r}, m={!r}, element1={!r}, element2={!r}, bond={!r}" if self.fix_Lz: strrep += ", Lz={!r}, fix_Lz={!r})" return strrep.format(self.n, self.m, self.element1, self.element2, self.bond, self.Lz, self.fix_Lz) else: strrep += ", nz={!r})" return strrep.format(self.n, self.m, self.element1, self.element2, self.bond, self.nz) @property def Natoms_per_tube(self): """Number of atoms in nanotube :math:`N_{\\mathrm{atoms/tube}}`.""" return self.Natoms @property def linear_mass_density(self): """Linear mass density of nanotube in g/nm.""" return compute_linear_mass_density(self.n, self.m, bond=self.bond, element1=self.element1, element2=self.element2) @property def Ntubes(self): """Number of nanotubes.""" return 1 @property def tube_length(self): """Alias for :attr:`SWNT.Lz`""" return self.Lz @property def tube_mass(self): """SWNT mass in **grams**.""" return compute_tube_mass(self.n, self.m, self.nz, element1=self.element1, element2=self.element2)
[docs] def todict(self): """Return :class:`~python:dict` of `SWNT` attributes.""" return dict(n=self.n, m=self.m, nz=self.nz, Lz=self.Lz, fix_Lz=self.fix_Lz, element1=self.element1, element2=self.element2, bond=self.bond)
Nanotube = SWNT