Source code for qens.models.translation

"""
Translational diffusion HWHM models.


"""
from __future__ import annotations

import numpy as np

from ..constants import HBAR_MEV_PS

__all__ = ["fickian_hwhm", "ce_hwhm", "ss_hwhm"]


[docs] def fickian_hwhm(q: np.ndarray, d: float) -> np.ndarray: """Fickian (continuum) diffusion: Γ = ℏ D Q². Parameters ---------- q : array Momentum transfer in Å⁻¹. d : float Self-diffusion coefficient in Ų/ps. Returns ------- Γ in meV. """ return HBAR_MEV_PS * d * np.asarray(q, dtype=float) ** 2
[docs] def ce_hwhm(q: np.ndarray, d: float, ell: float) -> np.ndarray: """Chudley-Elliott jump-diffusion HWHM in meV. Parameters ---------- q : array d : float Self-diffusion coefficient in Ų/ps. ell : float Mean jump length in Å. Returns ------- Γ in meV. """ d_arr = np.asarray(d, dtype=float) ell_arr = np.abs(np.asarray(ell, dtype=float)) if np.any(d_arr <= 0): raise ValueError("d must be > 0") if np.any(ell_arr <= 0): raise ValueError("ell must be > 0") tau = ell_arr ** 2 / (6 * d_arr) return (HBAR_MEV_PS / tau) * (1 - np.sinc(np.asarray(q) * ell_arr / np.pi))
[docs] def ss_hwhm(q: np.ndarray, d: float, tau_s: float) -> np.ndarray: """Singwi-Sjölander HWHM: Γ = ℏ D Q² / (1 + D Q² τ_s). Parameters ---------- q : array d : float Self-diffusion coefficient in Ų/ps. tau_s : float Residence time in ps. Returns ------- Γ in meV. """ q = np.asarray(q, dtype=float) if d <= 0 or tau_s <= 0: raise ValueError("d and tau_s must be > 0") return HBAR_MEV_PS * d * q ** 2 / (1 + d * q ** 2 * tau_s)