Norma

Norma is a Julia prototype for testing algorithms and ideas for coupling and multiphysics, primarily in solid mechanics and heat conduction. It is a prototyping framework built for extensibility and experimentation, supporting implicit and explicit time integration, large deformations, contact, and domain decomposition by Schwarz methods.

Contact simulation of two bars

Impact of two bars using different time integrators and mesh types: the left bar uses hexahedral elements with an implicit integrator; the right bar uses tetrahedral elements with an explicit integrator. Each subdomain advances with its own time step.

Torsion simulation

Dynamic torsion of a solid cylinder undergoing large deformations.

Vibrating sphere simulation

Large-deformation vibration of a soft rubber ball, playing in real time.

Quick start

# self-activating CLI wrapper
bin/norma input.yaml

# multi-threaded
bin/norma input.yaml --threads 8

# or directly with Julia
julia --project=. src/Norma.jl input.yaml

Interactive:

using Pkg; Pkg.activate(".")
using Norma
Norma.run("input.yaml")

See Installation to set up the environment and Running Norma for the full set of ways to launch a simulation.

Documentation

Features

Capabilities currently implemented:

Material models (infinitesimal- and finite-strain kinematics)

  • Linear elastic
  • Saint-Venant–Kirchhoff
  • Neohookean
  • Seth-Hill (generalized hyperelastic with tunable exponents)
  • J2 plasticity (finite deformation, multiplicative split, radial return, linear isotropic hardening)

Time integration

  • Quasi-static (with adaptive stepping)
  • Newmark (implicit dynamic)
  • Central difference (explicit dynamic)

Solvers

  • Newton's method (Hessian minimizer) with optional backtracking line search
  • Matrix-free steepest descent
  • Explicit (lumped-mass) solver

Element library

  • 1D: BAR2
  • 2D: TRI3, TRI6, QUAD4
  • 3D: TETRA4, TETRA10, HEX8
  • Gauss, Dunavant, and Keast quadrature rules

Multidomain coupling — Schwarz alternating method

  • Overlapping and non-overlapping (Dirichlet–Neumann) Schwarz
  • Robin–Robin and impedance-matching (absorbing) Schwarz, including the adjoint-paired non-overlapping impedance coupling (see docs/notes/schwarz-coupling)
  • Multi-time-step (subcycled) coupling with time interpolation of the partner state
  • Frictionless and tied contact via Schwarz
  • Fixed and adaptive (Aitken) relaxation with interface prediction

Boundary conditions

  • Dirichlet (time-dependent displacement/velocity/acceleration)
  • Neumann traction and follower pressure
  • Robin (mixed displacement–traction)
  • Inclined-surface (roller) support

Adaptive mesh swapping

  • Triggered by time, stress-recovery error, overlap displacement error, or the elastic-to-plastic transition

Nodal recovery and field transfer

  • L2-projection recovery (lumped and consistent) of stress, von Mises stress, deformation gradient, and internal variables
  • Mesh-to-mesh field transfer for multidomain and remeshing workflows

Input/output

  • YAML input configuration
  • Exodus II output (nodal, element, and global variables)
  • CSV output of nodal and side-set quantities
  • Overlap-corrected (Arlequin-blended) energy output for multidomain runs

Reduced-order models — Operator Inference and RBF kernel ROMs are available and documented with the norma-opinf companion package; they are outside the scope of this guide.

License

Norma is licensed under the BSD 3-Clause License. See LICENSE.md in the repository for details.