Norma is a Julia prototype for testing algorithms and ideas for coupling and multiphysics, primarily in solid mechanics and heat conduction.
Impact simulation of two bars using different time integrators and
mesh types: the left bar uses hexahedral elements with an implicit
time integrator; the right bar uses tetrahedral elements with an
explicit time integrator. Each subdomain advances independently with
its own time step. (~100,000 elements)

Dynamic torsion of a solid cylinder undergoing large deformations. (~160,000 elements)
Large-deformation vibration of a soft rubber ball. The animation
plays in real time (100 frames per second) to match simulation
time. (~300,000 elements)
julia --project=@/path/to/Norma.jl /path/to/Norma.jl/src/Norma.jl input.yamlOr run it interactively:
using Pkg; Pkg.activate("/path/to/Norma.jl")
using Norma
Norma.run("input.yaml")- A prototyping framework for multiphysics and coupling algorithms
- Focused on solid mechanics and heat conduction
- Designed for high extensibility and experimentation
- Supports implicit and explicit time integrators
- Prototyping of coupling and multiphysics algorithms.
- Applications in solid mechanics and heat conduction.
- Designed for extensibility and experimentation.
cd /path/to
git clone [email protected]:sandialabs/Norma.jl.git
cd Norma.jl
juliaWithin the Julia package manager (enter by pressing ] in the Julia REPL):
pkg> activate .
pkg> registry update
pkg> update
pkg> instantiatePress Backspace or Delete to exit the package manager.
To run the main program, assuming Julia is in your executable path:
julia --project=@/path/to/Norma.jl /path/to/Norma.jl/src/Norma.jl input.yamlTo run Norma interactively from a Julia session:
cd /path/to/Norma.jl
julia
using Pkg
Pkg.activate(".")
using NormaThen, navigate to your desired example folder and run the simulation. For example:
cd("examples/contact/implicit-dynamic/2-bars")
Norma.run("bars.yaml")Note: If you make changes to the Norma code, you need to reload the Norma module (using Norma) for those changes to take effect.
To run Norma.jl using multiple threads, set the JULIA_NUM_THREADS environment variable before launching Julia. For example, to use 4 threads:
JULIA_NUM_THREADS=4 julia --project=@/path/to/Norma.jl /path/to/Norma.jl/src/Norma.jl input.yamlOr for interactive usage:
JULIA_NUM_THREADS=4 juliaInside Julia:
using Pkg
Pkg.activate("/path/to/Norma.jl")
using Norma
Norma.run("input.yaml")To run the test suite using the Julia REPL:
using Pkg
Pkg.test()Or from the command line:
cd /path/to/Norma.jl/test
julia --project=@/path/to/Norma.jl ./runtests.jlBy default, all tests are run.
You can control which tests are run using command-line arguments.
julia --project=@/path/to/Norma.jl ./runtests.jl --quickUse this when you want to verify functionality quickly without running the full suite.
julia --project=@/path/to/Norma.jl ./runtests.jl 1 3 5julia --project=@/path/to/Norma.jl ./runtests.jl --listTo run tests whose filenames contain a given string (case-insensitive):
julia --project=@/path/to/Norma.jl ./runtests.jl --filter cubeYou can combine filters with specific indices or --quick:
julia --project=@/path/to/Norma.jl ./runtests.jl --quick --filter dynamic
julia --project=@/path/to/Norma.jl ./runtests.jl 2 4 --filter staticTo run the examples/contact/implicit-dynamic/2-bars example:
cd /path/to/Norma.jl/examples/contact/implicit-dynamic/2-bars
julia
]
activate .
using Norma
Norma.run("bars.yaml")To identify performance bottlenecks in Norma.jl, you can use Julia's built-in Profile module and visualize results with ProfileCanvas.jl:
using Profile
include("/path/to/Norma.jl/src/Norma.jl")
cd("/path/to/Norma.jl/examples/contact/implicit-dynamic/2-bars")
@profile Norma.run("bars.yaml")using Pkg; Pkg.add("ProfileCanvas")
using ProfileCanvas
ProfileCanvas.canvas()julia --project=@/path/to/Norma.jl -e 'using Profile; using Norma; cd("examples/contact/implicit-dynamic/2-bars"); @profile Norma.run("bars.yaml")' -E 'using ProfileCanvas; ProfileCanvas.canvas()'To enable debug-level logging in Norma.jl, use the JULIA_DEBUG environment variable:
JULIA_DEBUG=Norma julia --project=@/path/to/Norma.jl /path/to/Norma.jl/src/Norma.jl input.yamlTo add debug messages in code:
@debug "Starting simulation with input file: input.yaml"To disable debug printing:
unset JULIA_DEBUGOr suppress it at launch:
JULIA_DEBUG= julia --project=@/path/to/Norma.jl /path/to/Norma.jl/src/Norma.jl input.yamlcd ~/.julia/registries
git clone https://github.com/JuliaRegistries/General.git
export JULIA_SSL_CA_ROOTS_PATH=/etc/ssl/certs/ca-bundle.crtThen retry installation.
Norma.jl is licensed under the BSD 3-Clause License. See LICENSE.md for details.