α-RuCl3 — Zigzag antiferromagnet, k = (0, ½, 1)#
α-RuCl3 orders below \(T_N \approx 7\) K in a zigzag antiferromagnetic pattern with Ru3+ moments in the ab-plane [2]. Space group \(R\bar{3}\) (No. 148), propagation vector k = (0, ½, 1) (hexagonal setting). The k-maximal MSG is already BNS 2.7 (\(P_S\bar{1}\), type IV) — no symmetry breaking beyond the maximal is required to allow in-plane moments.
Setup#
import numpy as np
from msgjson import maximal_msgs, orbit_moments, magnetic_structure_factors
SG = 148
K = [0, 0.5, 1.0]
RU_SITE = [0, 0, 1/3] # Ru^3+ Wyckoff 6c
Magnetic space group#
top = maximal_msgs(SG, k=K, sites=[RU_SITE], centering="R")
for r in top:
s = r.sites[0]
print(f"BNS {r.bns_number} type={r.msg_type} n_ops={r.n_ops}"
f" n_free={s.n_free} origin={r.origin_shift}")
BNS 2.7 type=4 n_ops=4 n_free=3 origin=(0.0, 0.0, 0.0)
BNS 2.7 type=4 n_ops=4 n_free=3 origin=(0.0, 0.0, 0.5)
Two domain states arising from the two inequivalent positions of the
anti-translation τ = (0, 0, ½). Both give the same \(|F_M|^2\).
n_free = 3 — any moment direction is symmetry-allowed.
Moment orbit#
r = top[0]
m_amp = 0.5 # μ_B, Ru³⁺ ordered moment
m_ref = m_amp * np.array([1.0, 0.0, 0.0]) # in-plane, along a*
site_moms = orbit_moments(r, site_idx=0, m_ref=m_ref, k=K, centering="R")
for pos, mom in site_moms:
print(f" {np.round(pos, 4)}: m = {np.round(mom, 3)} μ_B")
[0. 0. 0.3333]: m = [0.5 0. 0. ] μ_B
[0. 0. 0.6667]: m = [0.5 0. 0. ] μ_B
[0. 0. 0.8333]: m = [-0.5 0. 0. ] μ_B
[0. 0. 0.1667]: m = [-0.5 0. 0. ] μ_B
Four-site zigzag +,+,−,− along c. Net moment zero (antiferromagnet).
Structure factors#
Satellites appear at Q = τ + k where τ satisfies the R-centering condition −h + k + l ≡ 0 (mod 3):
a, c_lat = 5.98, 17.0
lattice = np.array([[a, 0, 0 ],
[-a/2, a*np.sqrt(3)/2, 0 ],
[0, 0, c_lat]])
B = 2 * np.pi * np.linalg.inv(lattice).T
hkl_list = [(0,0,0), (0,1,-1), (0,0,3), (0,0,6)]
F2 = magnetic_structure_factors(
site_moms, hkl_list, K, lattice=lattice, ion="Ru1+"
)
print(f" {'τ':12s} {'Q = τ+k':18s} {'|F_M|²':>8s} {'sin²α':>6s} {'|F_M⊥|²':>9s}")
for hkl_i, f2 in zip(hkl_list, F2):
Q_frac = tuple(h + ki for h, ki in zip(hkl_i, K))
Q_cart = B @ np.array(Q_frac)
Q_mag = np.linalg.norm(Q_cart)
s2 = 1 - np.dot(Q_cart / Q_mag, m_ref / np.linalg.norm(m_ref))**2
qstr = "({:.0f},{:.1f},{:.0f})".format(*Q_frac)
print(f" {str(hkl_i):12s} {qstr:18s} {f2:8.3f} {s2:6.3f} {f2*s2:9.3f}")
τ Q = τ+k |F_M|² sin²α |F_M⊥|²
(0, 0, 0) (0,0.5,1) 0.844 0.846 0.714
(0, 1, -1) (0,1.5,0) 0.000 0.800 0.000
(0, 0, 3) (0,0.5,4) 0.000 0.965 0.000
(0, 0, 6) (0,0.5,7) 0.147 0.987 0.145
Two independent extinctions reduce the observable peak count: (0, 1.5, 0) cancels because Qz = 0 makes all four orbit phases equal; (0, 0.5, 4) cancels from the +,+,−,− phase combination at Qz = 4. The satellite at (0, ½, 1) from τ = (0, 0, 0) is the primary experimental target.