vibe-sketcherDocumentation

vibesketcher.chem.rolled_tubes

Nanotubes rolled from any two-dimensional periodic structure.

The rolling construction generalizes the carbon chiral vector (Saito, Dresselhaus and Dresselhaus, Physical Properties of Carbon Nanotubes, 1998, ch. 3) to any layer with in-plane lattice vectors a1, a2, as CRYSTAL does for inorganic tubes (Noel, D’Arco, Demichelis, Zicovich-Wilson and Dovesi, J. Comput. Chem. 31, 855, 2010):

  • the rolling vector is R = n a1 + m a2 and becomes the circumference;

  • the tube period is the shortest lattice vector T = t1 a1 + t2 a2 with T . R = 0. It exists only when the lattice metric makes (a1 . R) / (a2 . R) rational; otherwise the tube has no translational period and is refused;

  • the rolled cell holds abs(n t2 - m t1) layer cells per period;

  • a point at in-plane fraction s along R and height h above the layer’s middle plane goes to angle 2 pi s and radius norm(R) / (2 pi) + h. Atoms outside that middle surface are stretched along the circumference and those inside are compressed, as for any rolled multi-plane layer, so this is an unrelaxed starting geometry.

The cell is one-dimensional: z is the tube axis, x and y hold the tube plus a stated vacuum gap and are not periodic.

Functions

roll_layer(recipe, layer)

The 1D tube cell rolled from layer, or a refusal with the reason.

Classes

RolledNanotubeRecipe(*[, kind, periods, ...])

Roll a 2D periodic structure of the document along n a1 + m a2.

class vibesketcher.chem.rolled_tubes.RolledNanotubeRecipe(*, kind='rolled_nanotube', identifier, source, n, m, periods=1, vacuum=10.0, inward_normal=False, indices='lattice')[source]

Bases: BaseModel

Roll a 2D periodic structure of the document along n a1 + m a2.

Parameters:
  • kind (Literal['rolled_nanotube'])

  • identifier (Annotated[str, _PydanticGeneralMetadata(pattern='^[A-Za-z][A-Za-z0-9_-]{0,63}$')])

  • source (Annotated[str, _PydanticGeneralMetadata(pattern='^[A-Za-z][A-Za-z0-9_-]{0,63}$')])

  • n (Annotated[int, Ge(ge=-100), Le(le=100)])

  • m (Annotated[int, Ge(ge=-100), Le(le=100)])

  • periods (Annotated[int, Ge(ge=1), Le(le=1000)])

  • vacuum (Annotated[float, Ge(ge=3), Le(le=200), AllowInfNan(allow_inf_nan=False)])

  • inward_normal (bool)

  • indices (Literal['lattice', 'nanotube'])

model_config = {'extra': 'forbid'}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

kind: Literal['rolled_nanotube']
identifier: str
source: str
n: int
m: int
periods: int
vacuum: float
inward_normal: bool

Roll so the layer’s +normal side faces the axis instead of outwards.

indices: Literal['lattice', 'nanotube']

n, m count the layer’s own a1, a2 (as CRYSTAL’s NANOTUBE input does). nanotube: the carbon-nanotube convention for a hexagonal layer, with a1 and a2 60 degrees apart, so (n,n) is armchair and (n,0) zigzag whichever hexagonal setting the layer uses.

Type:

lattice

vibesketcher.chem.rolled_tubes.roll_layer(recipe, layer)[source]

The 1D tube cell rolled from layer, or a refusal with the reason.

Parameters:
Return type:

PeriodicStructure