pyextal.superspace.tas2¶
1T-TaS2 in its nearly commensurate phase: the worked example.
Reference¶
A. Spijkerman, J. L. de Boer, A. Meetsma, G. A. Wiegers and S. van Smaalen, “X-ray crystal-structure refinement of the nearly commensurate phase of 1T-TaS2 in (3+2)-dimensional superspace”, Phys. Rev. B 56, 13757 (1997). doi:10.1103/PhysRevB.56.13757
structure() returns that published model by default – superspace group
P-3(alpha,beta,1/3), 21 harmonics on Ta and 12 on S, transcribed from Tables
III, IV and V. model='standin' gives a small invented triple-q wave instead,
which is faster and useful for demonstrations that do not need the real
amplitudes.
The two settings¶
The paper works in a tripled cell, a0 x a0 x 3c0, in which the
modulation wave vectors are purely in-plane and the three layers are generated
by superspace centring translations that carry an internal phase shift. All
published parameters refer to that cell, so it is the authoritative setting
here (setting='tripled').
The same reflections can be indexed in the basic cell a0 x a0 x c0,
where the wave vectors pick up commensurate components of +/- 1/3 along c0*
(paper, section II). published_q(), tripled_to_basic() and
basic_to_tripled() do that, and it is verified: the two settings put every
reflection at the same place to 2e-16, and give the same structure factors to
8e-16 for the unmodulated structure.
The modulated structure is only available in the tripled setting. In the
basic cell q has a c-component, so an atom’s own z enters its internal
coordinate – xbar_basic = xbar_tripled + q_z * z – and the published
modulation functions are written against the tripled convention, where it does
not. Carrying them across needs an atom-dependent phase that neither a constant
internal shift nor a per-atom shift by q_z z reproduces (both were tried;
they leave 2-4% residuals against the tripled model). Rather than ship a
structure that is quietly a few per cent wrong, published_atoms() refuses
setting='basic'. The tripled setting is the paper’s own and is what every
check in this module validates.
What was checked¶
The amplitudes in Tables IV and V are quoted “in angstrom” referred to the
a0 x a0 x 3c0 cell, which is ambiguous enough to be worth verifying rather
than assuming. Recomputing the paper’s own published figures from the
transcribed tables gives:
quantity |
recomputed |
paper |
|---|---|---|
Ta max |
0.3080 A |
0.308 A |
Ta-Ta(100) shortest (Figs. 3-5) |
3.0865 A |
3.086 A |
Ta-Ta(100) longest (Figs. 3-5) |
3.8079 A |
3.806 A |
S |
+0.116 A |
+0.106 A |
S |
-0.114 A |
-0.124 A |
The three Ta numbers agree to four significant figures, which fixes the
convention: Ax, Ay, Az are displacements in Angstrom along a, b and
c of the tripled cell, so fractional amplitudes are Ax/a0, Ay/b0,
Az/(3 c0).
The S extremes sit about 0.01 A off, in opposite directions. That is not a transcription error – flipping the sign of any one harmonic group makes the agreement worse, and every relation in the paper’s Table I closes on the transcribed values. Figure 10 plots a particular symmetry copy of S, at (2/3, 1/3, 0.086), read off contours spaced 0.0177 A apart, so half a contour interval of disagreement on a quantity a tenth the size of the Ta modulation is where this is left. The Ta modulation, which dominates every satellite intensity, is confirmed exactly.
One transcription correction¶
Table V’s B^y for the harmonic (-1, 1) is entered here as -0.0107,
not +0.0107. Two independent arguments require the minus. Table I’s own relation
B^y_{-m1-m2,m1} = -B^x_{-m2,m1+m2} gives -0.0107; and with the positive sign
the sulfur modulation violates its three-fold site symmetry by 0.043 A, a third
of its own amplitude, which shows up as a [001] diffraction pattern that is
visibly not three-fold. The PDF renders a minus sign as the digit 2, and this
one is lost on extraction. test_superspace.py checks every dependent
amplitude in both tables against Table I, which is what caught it.
One inconsistency in the source¶
Table III gives S at (1/3, 1/3, 0.0862), Fig. 1 gives the basic structure’s
S at +/-(1/3, 2/3, z), and section V C refers to S at (2/3, 1/3, 0.086).
These are not the same site. The standard CdI2-type positions +/-(1/3, 2/3,
z) are used here, since they are the only ones giving Ta its octahedral sulfur
coordination. That the refinement reports every cosine amplitude of Ta as zero
is an independent confirmation that Ta sits on the inversion centre, as this
choice requires.
Attributes¶
Functions¶
|
The refined modulation wave vectors. |
|
The exactly commensurate CDW wave vectors of the C phase. |
|
CDW wave vectors near, but not at, the commensurate value. |
Which tripled-setting reflections the centring translations allow. |
|
Convert reflection indices from the tripled setting to the basic one. |
|
Convert reflection indices from the basic setting to the tripled one. |
|
|
The 1T-TaS2 superspace lattice. |
|
The refined structure as a P1 list of modulated atoms. |
|
The three atoms of the basic cell, unmodulated, listed in P1. |
|
A simple triple-q longitudinal displacement field, for the stand-in. |
|
The 1T-TaS2 structure, published by default. |
|
A model of the commensurate phase, in the basic cell. |
Module Contents¶
- pyextal.superspace.tas2.CELL_BASIC = (3.3649, 3.3649, 5.8971, 90.0, 90.0, 120.0)¶
- pyextal.superspace.tas2.CELL = (3.3649, 3.3649, 5.8971, 90.0, 90.0, 120.0)¶
- pyextal.superspace.tas2.CELL_TRIPLED¶
- pyextal.superspace.tas2.SIGMA = (0.2448, 0.0681)¶
- pyextal.superspace.tas2.TA_HARMONICS¶
- pyextal.superspace.tas2.S_HARMONICS¶
- pyextal.superspace.tas2.CZ_NC = 0.3333333333333333¶
- pyextal.superspace.tas2.CZ_C = 0.07692307692307693¶
- pyextal.superspace.tas2.SIGMA_C¶
- pyextal.superspace.tas2.published_q(setting='tripled', sigma=SIGMA)¶
The refined modulation wave vectors.
In the tripled setting these are
q1 = (s1, s2, 0)andq2 = (-s2, s1+s2, 0), exactly as the paper states them against{a0*, b0*, c*}withc* = c0*/3.Re-indexing against
c0*shifts them by the commensurate amounts that fold thec*component of each reflection into the wave vectors, givingq1 -> q1 + c0*/3andq2 -> q2 - c0*/3. This is what the paper means by the wave vectors acquiring components of+/- 1/3along c0*.- Parameters:
setting (str) –
'tripled'or'basic'.sigma (tuple) –
(sigma1, sigma2).
- Returns:
(2, 3) wave vectors in reciprocal lattice units of the chosen cell.
- Return type:
np.ndarray
- Raises:
ValueError – If setting is not recognised.
- pyextal.superspace.tas2.commensurate_q(c_component=True, n=3, cz=None)¶
The exactly commensurate CDW wave vectors of the C phase.
qc = (3 a0* + b0*)/13, i.e.(0.2308, 0.0769)atphi = 13.9degrees (paper, section I), with the three-layer stacking term. Being rational these describe a genuine 3D supercell rather than an incommensurate structure, andSuperspaceLattice.supercell_matrix()recovers it.- Parameters:
c_component (bool) – Include the
1/3 c0*stacking term of the nearly commensurate phase. False gives the in-plane idealisation, whose supercell is 13-fold not 39. Ignored when cz is given.n (int) – How many of the three arms to return, 1 to 3.
cz (float, optional) – The
c0*component outright. UseCZ_C(1/13) for the commensurate phase, whose supercell is sqrt13 a x sqrt13 a x 13c (paper, section I). The 1/3 that c_component selects is the NC stacking and gives 3c instead – the two phases differ in this component and only in this component.
- Returns:
(n, 3) wave vectors, in basic-cell reciprocal units.
- Return type:
np.ndarray
- pyextal.superspace.tas2.nearly_commensurate_q(delta=0.006, c_component=True, n=3)¶
CDW wave vectors near, but not at, the commensurate value.
Used by the stand-in model. For the real NC phase use
published_q(), whose values are the refined ones.- Parameters:
delta (float) – Departure from 3/13 along a*, in reciprocal lattice units.
c_component (bool) – Include the
1/3 c0*term.n (int) – How many arms to return, 1 to 3.
- Returns:
(n, 3) wave vectors, in basic-cell reciprocal units.
- Return type:
np.ndarray
- pyextal.superspace.tas2.reflection_condition(H)¶
Which tripled-setting reflections the centring translations allow.
The centring
(E | 0,0,1/3 ; 2/3,1/3)requiresexp(2 pi i (l/3 + (2 m1 + m2)/3)) = 1, that isl + 2 m1 + m2 = 0 (mod 3)
Main reflections therefore have
la multiple of 3, and first-order satellites sit in the planesl0 = n +/- 1/3– the arrangement the paper describes in section II. Reflections that fail the condition are systematically absent; their structure factors come out zero anyway, since the three centred copies cancel exactly, so this is a filter for efficiency and for labelling, not a correction.- Parameters:
H (array-like) – (n, 5) superspace indices in the tripled setting.
- Returns:
(n,) booleans, True where the reflection is allowed.
- Return type:
np.ndarray
- pyextal.superspace.tas2.tripled_to_basic(H)¶
Convert reflection indices from the tripled setting to the basic one.
Equating the
c0*component of the two settings gives it: the tripled setting putsl/3there and the basic onel0 + (m1 - m2)/3, since its wave vectors carry+1/3and-1/3alongc0*. Sol0 = (l - m1 + m2) / 3
which is an integer exactly when
reflection_condition()holds –l - m1 + m2andl + 2 m1 + m2differ by3 m1and so agree modulo 3, which is why the condition can be written either way but the value cannot.- Parameters:
H (array-like) – (n, 5) indices in the tripled setting.
- Returns:
(n, 5) indices in the basic setting.
- Return type:
np.ndarray
- Raises:
ValueError – If any reflection violates the centring condition, and so has no basic-cell index.
- pyextal.superspace.tas2.basic_to_tripled(H)¶
Convert reflection indices from the basic setting to the tripled one.
- Parameters:
H (array-like) – (n, 5) indices in the basic setting.
- Returns:
(n, 5) indices in the tripled setting.
- Return type:
np.ndarray
- pyextal.superspace.tas2.lattice(setting='tripled', model='published', d=2, commensurate=False, c_component=False, delta=0.006, **kw)¶
The 1T-TaS2 superspace lattice.
- Parameters:
setting (str) –
'tripled'or'basic'; used by the published model.model (str) –
'published'or'standin'.d (int) – Modulation dimensions for the stand-in, 1 to 3. The published model is (3+2)D.
commensurate (bool) – Use exactly rational q-vectors. For the published model this is the commensurate approximation – the refined modulation functions evaluated on
(3 a0* + b0*)/13instead of the incommensurate wave vectors – which is the only form with a finite 3D supercell, and so the only one a conventional Bloch-wave calculation can reach.c_component (bool) – Stand-in only – include the
1/3 c0*term.delta (float) – Stand-in only – departure from 3/13.
**kw – Passed to
SuperspaceLattice, e.g.check_rank=False.
- Returns:
The lattice.
- Return type:
- Raises:
ValueError – If model is not recognised.
- pyextal.superspace.tas2.published_atoms(setting='tripled')¶
The refined structure as a P1 list of modulated atoms.
In the tripled setting the three layers are generated by the superspace centring translations, each carrying its internal phase shift – that shift is what makes the layers different, and it is not derivable from the real-space translation because the wave vectors have no component along c. The second sulfur is the inversion partner of the first, so its sine amplitudes are unchanged and its cosine amplitudes change sign.
- Parameters:
setting (str) – Must be
'tripled'; see the module docstring for why'basic'is refused.- Returns:
The structure, nine atoms.
- Return type:
list[ModulatedAtom]
- Raises:
ValueError – If setting is not recognised.
NotImplementedError – If setting is
'basic'.
- pyextal.superspace.tas2.basic_atoms(B_ta=None, B_s=None)¶
The three atoms of the basic cell, unmodulated, listed in P1.
- Parameters:
B_ta (float, optional) – Isotropic B for Ta; the refined value when None.
B_s (float, optional) – Isotropic B for S; the refined value when None.
- Returns:
Ta at the origin and the two sulfurs.
- Return type:
list[ModulatedAtom]
- pyextal.superspace.tas2.ta_displacive(lat, amplitude=0.02, harmonics=1)¶
A simple triple-q longitudinal displacement field, for the stand-in.
Each CDW arm contributes a wave displacing atoms along its own wave vector. In a (3+2) description the third arm is not independent, so it enters as a harmonic index rather than as a third dimension.
- Parameters:
lat (SuperspaceLattice) – Supplies the q-vectors and the metric.
amplitude (float) – First-harmonic magnitude in fractional coordinates.
harmonics (int) – Harmonics per arm; higher ones get
1/n^2.
- Returns:
The field, in fractional coordinates.
- Return type:
- pyextal.superspace.tas2.structure(model='published', setting='tripled', d=2, commensurate=False, c_component=False, amplitude=0.02, harmonics=1, delta=0.006, modulate_sulfur=True, **kw)¶
The 1T-TaS2 structure, published by default.
- Parameters:
model (str) –
'published'for the refined 21 + 12 harmonic model, or'standin'for the small invented triple-q wave.setting (str) – Published model only –
'tripled'or'basic'.d (int) – Stand-in only – modulation dimensions, 1 to 3.
commensurate (bool) – Exactly rational q, giving a 3D supercell and hence a dynamical calculation. With
model='published'this is the commensurate approximation to the refined structure.c_component (bool) – Stand-in only – include the
1/3 c0*term.amplitude (float) – Stand-in only – first-harmonic amplitude.
harmonics (int) – Stand-in only – harmonics per arm.
delta (float) – Stand-in only – departure from 3/13.
modulate_sulfur (bool) – Stand-in only – give S a weaker copy of the same field.
**kw – Passed to
SuperspaceLattice.
- Returns:
(lattice, atoms)ready forstructure_factor().- Return type:
tuple
- Raises:
ValueError – If model is not recognised.
- pyextal.superspace.tas2.commensurate_structure(cz=0.0, amplitude_scale=1.0)¶
A model of the commensurate phase, in the basic cell.
The wave vectors use the paper’s basis,
q1 = (s1, s2, cz)andq2 = (-s2, s1+s2, cz), not the three-fold images. That distinction is not cosmetic: the harmonic labels(n1, n2)in Tables IV and V are relative to that basis, so reading them against the three-fold triplet silently rewrites the modulation function. It shows up as a diffraction pattern that is not three-fold, and as a site-symmetry residual of 0.57 A against 4.7e-4 A for the correct basis.`cz` defaults to zero, and a nonzero value is not three-fold symmetric. The commensurate phase really does have a sqrt13 a x sqrt13 a x 13c supercell, so its wave vector carries
q_z = 1/13– but that cannot be represented in this basis. With arms{q1, q2, q2 - q1}the c components areg1, g2, g2 - g1, which are equal only when both are zero;epsilon_for()duly reports the three-fold as “not a symmetry” for every basis choice withcz = 1/13. Representing the stacking needs the c component in the l index of a 13-fold cell with centring translations, exactly as the paper puts the thirds in a tripled cell – and the C-phase stacking sequence that would fix those translations is not in the paper. cz is left as a parameter for exploring that, with the warning that the result is not the C phase.This is a model, not a refinement. The paper refines the nearly commensurate phase; there is no published C-phase modulation here to use. What this builds is the refined NC modulation functions evaluated at the commensurate wave vector. It is the right object for comparing methods – an exact supercell calculation against the superspace engine against the kinematic approximation, all on one structure – but do not read its satellite intensities as a measurement of the C phase.
- Parameters:
cz (float) –
c0*component of q. Zero, the default, is the in-plane commensurate CDW and is three-fold symmetric. See above before setting it.amplitude_scale (float) – Multiplies every modulation amplitude, for exploring how a comparison depends on modulation strength.
- Returns:
(lattice, atoms)with three atoms in the basic cell.- Return type:
tuple