# \[ANN\] LowLevelFEM.jl – Engineering-oriented FEM in pure Julia

**URL:** <https://discourse.julialang.org/t/ann-lowlevelfem-jl-engineering-oriented-fem-in-pure-julia/133561>\
**Category:** Package Announcements\
**Tags:** fem, finite-element, gmsh, tensoroperations, mechanics\
**Created:** [October 30, 2025, 6:12pm UTC](https://discourse.julialang.org/t/ann-lowlevelfem-jl-engineering-oriented-fem-in-pure-julia/133561 "2025-10-30T18:12:40Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![perebalazs](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/perebalazs/32/49662_2.png) [@perebalazs](https://discourse.julialang.org/u/perebalazs)\
**Post date:** [October 30, 2025, 6:12pm UTC](https://discourse.julialang.org/t/ann-lowlevelfem-jl-engineering-oriented-fem-in-pure-julia/133561/1 "2025-10-30T18:12:40Z")

</div>

> **LowLevelFEM.jl** is a lightweight finite element toolbox written entirely in Julia.  
> It focuses on _engineering-oriented workflows_ — boundary conditions, meshing with Gmsh, mechanical and thermo-mechanical analyses, and direct access to assembly and post-processing routines.  
> Simple enough for teaching, yet flexible enough for research.

* * *

> **A minimal but practical FEM toolbox for engineers and researchers — focusing on Gmsh-based workflows, transparency, and direct control over every step of the solution process.**

# [ANN] LowLevelFEM.jl – A lightweight finite element toolbox in Julia

Hi everyone,

I’m pleased to announce [**LowLevelFEM.jl**](https://github.com/perebalazs/LowLevelFEM.jl), a Julia package for **finite element analysis** in structural and continuum mechanics.  
The package is written entirely in Julia and designed with three main goals in mind: **simplicity, transparency, and performance**.

* * *

## 🔹 What it is

LowLevelFEM.jl provides a minimal yet complete set of FEM building blocks, currently supporting:

- 2D and 3D **solid mechanics** (plane stress, plane strain, axisymmetric, and full 3D)
- **Heat conduction** and **coupled thermo-mechanical** analyses
- Direct **Gmsh integration** for pre- and post-processing
- Explicit access to **assembly routines, element matrices, and field operations**
- Pure Julia implementation — no external C/Fortran backends
- MIT licensed and available from the [General Registry](https://juliahub.com/ui/Packages/General/LowLevelFEM)

The package is ideal both for **teaching FEM concepts** and for **research** , where full control over the discretization and solution process is important.

* * *

## 🔹 Why another FEM code?

While frameworks such as Gridap.jl and Ferrite.jl provide elegant abstractions for weak-form formulations,  
**LowLevelFEM takes a more engineering-oriented approach** — focusing on the practical aspects of modeling rather than on mathematical formalism.

Typical workflows emphasize:

- Defining **boundary conditions** , **loads** , and **material properties**
- Generating meshes and physical groups directly in **Gmsh**
- Computing and visualizing **mechanical and thermal fields**
- Performing **post-processing operations** such as `u ∘ ∇`, `S ⋅ ∇`, or `u × v`
- Preparing models for **large deformation** simulations and coupled thermo-mechanical analyses

This makes LowLevelFEM closer in spirit to classical engineering tools like **Ansys** or **Abaqus** , while remaining fully open-source and scriptable in Julia.  
It provides complete transparency: you can inspect every step — from element integration to system assembly and field evaluation.

* * *

## 🔹 Example

```julia
using LowLevelFEM

gmsh.initialize()
gmsh.open("model.geo")

mat = material("body", E=2e5, ν=0.3)
prob = Problem([mat], type=:PlaneStress)

bc = displacementConstraint("supp", ux=0, uy=0)
force = load("load", fy=-1)

u = solveDisplacement(prob, [force], [bc])
S = solveStress(u)

showDoFResults(u)
showDoFResults(u, :uy)
showStressResults(S)
showStressResults(S, :sx)
openPostProcessor()
gmsh.finalize()

```

👉 The strings `"body"`, `"supp"`, and `"load"` refer to **Gmsh physical group names** in the geometry, ensuring a clear link between the preprocessor model and the FEM setup.

A lower-level, fully manual version:

```julia
K = stiffnessMatrix(prob)
f = loadVector(prob, [force])
applyBoundaryConditions!(K, f, [bc])
u = K \ f

E = mat.E
ν = mat.ν

A = (u ∘ ∇ + ∇ ∘ u) / 2
I = TensorField(prob, "body", [1 0 0; 0 1 0; 0 0 1)
S = E / (1 + ν) * (A + ν / (1 - 2ν) * trace(A) * I)

```

* * *

## 🔹 Documentation & paper

📚 Documentation: [https://perebalazs.github.io/LowLevelFEM.jl/stable/](https://perebalazs.github.io/LowLevelFEM.jl/stable/)  
📦 JuliaHub: [https://juliahub.com/ui/Packages/General/LowLevelFEM](https://juliahub.com/ui/Packages/General/LowLevelFEM)  
📄 A [JOSS paper](https://github.com/perebalazs/LowLevelFEM.jl/tree/main/paper) is under review, describing the design philosophy and educational applications in more detail.

* * *

## 🔹 Acknowledgments

LowLevelFEM builds on Julia’s growing scientific computing ecosystem and complements existing FEM frameworks like Gridap.jl and Ferrite.jl.  
Feedback, issues, and contributions are very welcome — especially examples of educational or research applications!

💬 _If you try it out, please share your feedback or show your models — I’d love to see how you use LowLevelFEM in your work or teaching._

— **Balázs Pere**  
Department of Applied Mechanics, Széchenyi István University (Győr, Hungary)

* * *
