STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
engine.stability_hifi.eigen.passive Namespace Reference

Functions

Tuple[np.ndarray, np.ndarray] solve_passive_modes (MeridionalMesh mesh, np.ndarray c_sound, int m, *, int n_modes, float sigma)

Detailed Description

Passive (flame-off, rigid-wall) modal solve — the shift-invert Krylov kernel of
Section IV.E, specialized to the *linear* case that appears with no flame and no
boundary impedance.

With ``C = 0`` (rigid walls only) and ``F = 0`` (no active flame), the discrete NLEVP
(Eq. 11) collapses to

    (K + m^2 Km) p = -lambda^2 M2 p .

Writing ``mu = -lambda^2``, this is an ordinary real-symmetric *generalized* eigenvalue
problem ``A p = mu M2 p`` with ``A = K + m^2 Km``. Both ``A`` and ``M2`` are symmetric
positive semi-definite (a lossless rigid-wall cavity cannot amplify or dissipate), so
``mu >= 0`` and every eigenvalue is purely oscillatory: ``lambda = +/- i*sqrt(mu)``,
``omega = sqrt(mu)``, ``f = omega / (2 pi)``. This is exactly the passive-mode seeding
step of Algorithm 2 (paper Section IV.F, step 5) and case V1 of the verification ladder.

We solve it with shift-invert Lanczos (``scipy.sparse.linalg.eigsh``, which is symmetric
Arnoldi/Lanczos — the real-symmetric specialization of the Krylov-Schur kernel described
in Section IV.E): factor ``(A - sigma*M2)`` once and iterate on its action, which makes
the eigenvalues nearest the shift ``sigma`` the *extremal* (best-converging) ones of the
transformed operator, exactly the mechanism Section IV.E describes for the general
(non-symmetric, shift-invert Krylov-Schur) case.

Function Documentation

◆ solve_passive_modes()

Tuple[np.ndarray, np.ndarray] engine.stability_hifi.eigen.passive.solve_passive_modes ( MeridionalMesh mesh,
np.ndarray c_sound,
int m,
* ,
int n_modes,
float sigma )
Lowest ``n_modes`` passive acoustic frequencies and mode shapes at wavenumber ``m``.

``sigma`` is the shift [rad/s]^2 (i.e. an ``omega^2`` guess) placed near the band of
interest — shift placement is not guesswork (Section IV.E): pass ``(2*pi*f_guess)**2``
for whatever frequency band you expect from the analytic estimate.

Axis regularity (Section III.E) is imposed here, not in ``assemble_passive``: for
``m == 0`` nothing is done (natural condition, automatic from the ``r``-weighted weak
form); for ``m >= 1`` the r=0 axis nodes are eliminated (essential p=0 Dirichlet
condition) before the solve and their (zero) values are scattered back afterward.

Returns ``(freqs_hz, mode_shapes)`` with ``mode_shapes`` shape ``(n_nodes, n_modes)``,
sorted by ascending frequency.

Definition at line 37 of file passive.py.

References min.