MORFE.jl implements the Direct Parametrisation of Invariant Manifolds (DPIM) algorithm — a spectral submanifold reduction technique that computes invariant manifolds of large finite-element models in a single pass, collapsing million-DOF nonlinear oscillators into ROMs of usually two to four variables that run in seconds while preserving the true backbone, internal resonances and bifurcations.
Alpha: the API may still change between versions. The cohomological solver, eigenproblem pipeline and FEM backend interface are fully functional today.
Install Julia 1.10 or later, then add MORFE from the Julia registry:
using Pkg
Pkg.add("MORFE")
using MORFETo use the latest development version instead, install directly from GitHub:
Pkg.add(url = "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/MORFEproject/MORFE.jl.git")A complete reduction, using nothing but this package — two coupled Duffing oscillators reduced to a fifth-order normal form on the first mode pair:
using MORFE
# M ü + C u̇ + K u + u³ = 0
K = [2.0 -1.0; -1.0 2.0]
M = [1.0 0.0; 0.0 1.0]
C = 0.001 * M
cubic = MultilinearMap((res, x1, x2, x3) -> (@. res += -1.0 * x1 * x2 * x3), (3, 0);
fully_asymmetric = false) # symmetric in its three arguments
model = NthOrderModel((K, C, M), (cubic,)) # linear terms as (B₀, B₁, B₂)
spec = spectrum(model) # generalised eigenproblem
sd = SpectralData(model, spec; master = master_by_sorting(2))
W, R = parametrise(model, sd, 5; # 5th-order expansion
resonance = ResonanceConfig(style = :complex_normal_form, tol = 0.05))
R.poly.coefficients # reduced dynamics ż = R(z)
W.poly.coefficients # parametrisation u = W(z)The same three calls drive a million-DOF finite-element model; only the construction of model
changes. The tutorials walk through external
forcing, internal resonances, parametric models and FEM backends.
MORFE owns the DPIM solver and the abstract FEMMultilinearMap interface, so any FEM library can
supply the physics. The Ferrite.jl backends — the St. Venant-Kirchhoff "mesh → ROM" interface
(StructuralSVK), the parametric-structural engine (ParametricStructural) and the incompressible
fluid backend (FluidNavierStokes) — live in the optional companion package
MORFEFerrite.jl, installed directly from GitHub:
Pkg.add(url = "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/MORFEproject/MORFEFerrite.jl.git")The clamped-beam notebook is the shortest path from a mesh to a ROM.
| Page | Contents |
|---|---|
| Tutorials | Full-order model building, multiindex sets, SVK mesh → ROM, Kármán vortex street, parametric models, MEMS micromirror |
| Code documentation | API reference and docstrings for every module |
| Features | How DPIM works, and why it differs from classical reduction |
| Publications | Method papers and citation info |
| Team | Developers, contributors and institutions |
Every runnable example lives in MORFEExamples,
which carries one shared Julia environment and one Jupyter kernel for all of them: julia setup.jl
there is the only setup step. Three of its examples need nothing but MORFE
(multiindex sets,
full-order models,
symbolic models);
the two that solve a finite-element model also use MORFEFerrite.
Contributions are welcome — see the contribution guide for setup, quality checks, and pull-request guidance. For questions, feature proposals, or research collaborations, please open an issue.
- Cabré, X., Fontich, E. & de la Llave, R. (2003). The parameterization method for invariant manifolds I: Manifolds associated to non-resonant subspaces. Indiana University Mathematics Journal 52(2), 283–328.
- Opreni, A. et al. (2023). High-order direct parametrisation of invariant manifolds for model order reduction of finite element structures. Nonlinear Dynamics.
MIT License — see LICENSE for details.