Cyclic-symmetry modal analysis#
Free-vibration modal analysis on a single base sector of an
\(N\)-fold cyclically-symmetric rotor. Driven by
CyclicModel.solve_modal.
Algorithm#
For a rotor of \(N\) identical sectors, the global spectrum decomposes per harmonic index \(k \in \{0, 1, \ldots, N/2\}\) (Thomas 1979; Wildheim 1979). Each harmonic produces a reduced complex-Hermitian sub-problem on the base sector
with the cyclic boundary condition \(\mathbf{u}_\text{high} = e^{\imath\, k\, \alpha}\, \mathbf{R}(\alpha)\, \mathbf{u}_\text{low}\), \(\alpha = 2\pi / N\).
femorph-solver applies the Grimes–Lewis–Simon (1994) real 2n-augmentation to recast each complex-Hermitian sub-problem as a real-symmetric problem of doubled size:
then dispatches to the same shift-invert Lanczos pipeline as the Modal analysis solver. Each eigenvalue appears with multiplicity 2 in the augmented problem; the eigenvectors recombine into a complex pair on the way out.
For \(k = 0\) and (when \(N\) is even) \(k = N/2\) the imaginary block is identically zero and the augmentation collapses to two copies of the same real eigenvalue. For \(0 < k < N/2\) the two halves form a travelling-wave pair — the real / imaginary parts of \(\boldsymbol{\phi}_k\) are 90°-shifted snapshots of a wave travelling around the rotor’s circumference.
Public API#
The high-level entry is
CyclicModel.solve_modal
on a CyclicModel wrapper around a
single-sector Model:
from femorph_solver import CyclicModel
cm = CyclicModel.wrap(model, n_sectors=N) # auto-detects faces
# ... or pass explicit pre-paired indices:
# cm = CyclicModel.wrap(model, low_face=low, high_face=high, n_sectors=N)
results = cm.solve_modal(n_modes=10) # one per harmonic
Or load a CDB deck directly:
cm = CyclicModel.from_cdb("rotor_sector.cdb")
results = cm.solve_modal(n_modes=10)
For low-level use (when you already hold K / M and DOF-indexed
face arrays), call
solve_cyclic
directly.
n_sectors— number of sectors \(N\).harmonic_indices— defaults to all of \(0, 1, \ldots, N/2\).Returns one
CyclicModalResultper harmonic index, each carryingomega_sq,frequency, complexmode_shapeson the base sector, and theharmonic_indexmetadata.
Verification cross-references#
Cyclic-symmetry modal on a rotor sector — 4-sector annular sector full sweep.
Cyclic-symmetry modal sweep — annular disk — 12-sector annular disk, lowest mode per harmonic.
Cyclic-symmetry travelling-wave pair — bladed rotor — 16-blade rotor, travelling-wave pair render.
Cyclic-symmetry mode family across every harmonic — 4×2 viewport grid of the disk mode family classified by harmonic index.
Implementation: femorph_solver.solvers.cyclic.
References#
Thomas, D. L. (1979) “Dynamics of rotationally periodic structures,” Journal of Sound and Vibration 66 (4), 585–597.
Wildheim, S. J. (1979) “Vibrations of rotationally periodic structures,” Ph.D. dissertation, Linköping University.
Grimes, R. G., Lewis, J. G. and Simon, H. D. (1994) “A shifted block Lanczos algorithm for solving sparse symmetric generalized eigenproblems,” SIAM J. Matrix Analysis and Applications 15 (1), 228–272 (real 2n augmentation).
Bathe, K.-J. (2014) Finite Element Procedures, 2nd ed., §10.3.4 (cyclic-symmetry modal).
Crandall, S. H. and Mark, W. D. (1963) Random Vibration in Mechanical Systems, Academic Press, §3.5 (travelling- wave / standing-wave decomposition).
Singh, M. P. and Vakakis, A. F. (1993) “On the dynamics of cyclic-symmetric structures,” Mechanism and Machine Theory 28 (5), 627–637 (mode classification by harmonic index).