Skip to content

SCPH: support rotational zero modes at Gamma for 1D/0D systems (rigid-body generalization) #331

Description

@ttadano

Background

The SCPH/QHA code now identifies acoustic modes at the Gamma point from the eigenvectors, by projection onto the mass-weighted rigid-translation subspace (Dynamical::detect_acoustic_modes_at_gamma, ScphQhaCommon::classify_acoustic_modes_from_cmat). This assumes exactly three zero modes at Gamma, which is correct for 3D and 2D periodic systems.

For lower-dimensional systems the count is different:

  • 1D (chain/wire along the periodic axis): 3 translations + 1 rotation about the periodic axis = 4 zero modes.
  • 0D (molecules/clusters): 3 translations + 3 rotations = 6 zero modes (5 for linear molecules, where the rotation about the molecular axis is trivial).

Current behavior

Neither the previous nor the current implementation handles these cases:

  • The previous magnitude-threshold assignment in zerofill_elements_acoustic_at_gamma exited with "Could not assign acoustic modes at Gamma" as soon as more than three near-zero modes were found.
  • The current eigenvector-based detection correctly picks the 3 translations, but a rotational zero mode is then classified as an optical mode: its (numerically noisy) V3/V4 couplings are kept, and in Scph::compute_qmat_and_dmat the occupation-factor floor for collapsed non-acoustic modes (omega_floor_gamma = smallest harmonic optical frequency) degenerates to eps8 because the rotational mode itself is the smallest "optical" frequency. The resulting near-divergent occupation factor destabilizes the SCPH iteration.

Proposed design

  1. Explicit declaration, not auto-detection. Add an input variable (e.g. SYSTEM_DIM = 3/1/0, default 3) declaring the periodicity. Detecting vacuum padding or inferring from KMESH is fragile; an explicit setting also documents intent in the input file. 2D needs no special treatment (in-plane periodicity breaks all rotations; the ZA mode at Gamma is the rigid out-of-plane translation).

  2. Generalize the detector to the rigid-body subspace. In addition to the three mass-weighted translations, build rotation generators sqrt(m_j) * (e_alpha x (r_j - r_cm)) — only the periodic-axis rotation for 1D, all three for 0D — orthonormalized against the translations with a rank tolerance. The rank reduction automatically yields 5 instead of 6 zero modes for linear molecules. Downstream code is already flag-driven, so the changes are localized:

    • zerofill_elements_acoustic_at_gamma: count check == 3 -> == N;
    • setup_structural_opt_buffers and the relaxation code: ns - 3 -> ns - N (needs an audit of the structural-optimization loops);
    • classify_acoustic_modes_from_cmat: works unchanged (overlap against the flagged harmonic subspace);
    • omega_floor_gamma: automatically excludes rotations once they are flagged.
  3. Physical prerequisite. Zeroing V3/V4 elements of rotational modes is only legitimate when the force constants satisfy the Born-Huang rotational sum rules (ALM's ICONST options). The projection provides a free diagnostic: a mode with high rotational projection but a harmonic frequency well away from zero indicates broken rotational invariance, and the code should warn or stop rather than proceed. Excluding rigid rotations from the thermal average (Q = 0, like translations) mirrors the standard treatment of the six rigid degrees of freedom in molecular VSCF; rovibrational coupling remains beyond SCPH's scope.

  4. Phased implementation.

    • Phase (a), cheap safety: after detecting the translations, compute the rotational projections of any remaining near-zero Gamma modes and stop with a clear message ("N zero modes detected at Gamma; 1D/0D systems with rotational zero modes are not yet supported") instead of the current obscure misbehavior.
    • Phase (b), full support: implement SYSTEM_DIM together with a regression fixture (a diatomic molecule or a carbyne-like chain).

Related

tools/GenDisplacement.py (_identify_gamma_acoustic) has the same blind spot: the displacement-uniformity score identifies only translations, so for a cluster the random-displacement mode would thermally excite rigid rotations via the omega_min floor. The projection method generalizes to rotations; the uniformity test does not — porting the projection approach to the Python side would let both codes share one definition of the rigid-body subspace.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions