A geometry-based, stress-constrained optimization framework for a stack of elastic rings in an axisymmetric setting.
This repository contains the full research implementation used in:
Structural optimization of a stack of elastic rings under gravity
Computer Methods in Applied Mechanics and Engineering, 2025
DOI: https://doi.org/10.1016/j.cma.2025.118698
This framework combines:
- Parametric ring geometry defined by (κ, λ, ζ)
- Implicit geometry representation via regularized Heaviside projection
- Axisymmetric finite element formulation
- Adjoint-based stress sensitivities
- Multi-constraint MMA optimization
- Optional geometric regularization for robustness and manufacturability
The repository is intentionally structured to separate:
- Geometry modeling
- FEM validation and gradient verification
- Optimization experiments
This separation ensures mathematical transparency, modularity, and reproducibility.
Pure geometry module:
- Ring parametrization
- Implicit field construction
- Reproduction of geometry-only figures from the paper
- No FEM coupling
Validation-focused notebooks:
- Forward FEM solve (displacements + stress)
- Stress P-norm and adjoint gradient verification
- Full chain rule validation (geometry → FEM → stress)
All gradients are analytically derived and verified using finite differences.
This folder establishes mathematical correctness of the formulation.
Optimization experiments demonstrating:
- Pure geometry-driven optimization
- Stress-only optimization (ill-posed behavior)
- Increased instability with higher design freedom
- Sensitivity to initial conditions
- Robustness restoration via geometric regularization
Small meshes are used for fast reproducibility
(≈ 8 seconds for ~300 iterations, machine-dependent).
Core research implementation:
- Geometry parameterization (
implicits_t.py) - Axisymmetric finite element assembly (
discretization.py,elements.py) - Global FEM model and stress evaluation (
FEM_Model.py) - Boundary conditions (
boundary_conditions.py) - Adjoint sensitivities and objective/constraint evaluation (
valueAndGrad_ObjectiveConstraint.py) - MMA optimizer (
optimizer.py,mma.py) - Data storage (
storage.py) - Visualization utilities (
graphs_fields.py,graphs_curves.py) - ParaView rendering utilities (
render_paraview.py)
This directory contains the reusable computational framework.
This project relies on a Conda environment to ensure full reproducibility of the numerical experiments.
From the root of the repository:
conda env create -f conda/environment.yaml
conda activate <environment_name>This repository is designed as a research framework rather than a turn-key application.
A typical workflow consists of:
- Generate an axisymmetric mesh.
- Define boundary conditions and gravity loading.
- Initialize geometry parameters (κ, λ, ζ).
- Assemble and solve the FEM equilibrium problem.
- Evaluate stress measures and adjoint sensitivities.
- Run gradient-based optimization using MMA/GCMMA.
- Post-process and export results.
Executable research demonstrations are provided as Jupyter notebooks in:
2_fem_model/— validation of forward solver and gradients3_Optimization/— optimization experiments and robustness studies
For first-time users:
2_fem_model/demo2_stress_and_adjoint_gradient.ipynb2_fem_model/demo3_geometry_fem_chain_rule.ipynb3_Optimization/demo03_stressAndGeometryConstrained.ipynb
This sequence first verifies gradient correctness and then runs the robust optimization configuration used in the publication.
- Luis Mollericon Titirico (corresponding author)
- Sylvain Lefebvre
- Ole Sigmund
- Jonàs Martínez
- Université de Lorraine, CNRS, INRIA, LORIA (France)
- Technical University of Denmark (DTU)
If you use this repository in academic work, please cite the associated journal article:
@article{Mollericon2025Rings,
title = {Structural optimization of a stack of elastic rings under gravity},
author = {Mollericon Titirico, Luis and Lefebvre, Sylvain and Sigmund, Ole and Martínez, Jonàs},
journal = {Computer Methods in Applied Mechanics and Engineering},
year = {2025},
doi = {10.1016/j.cma.2025.118698}
}This project is licensed under the GNU General Public License v3.0 (GPL-3.0).
The repository includes the MMA/GCMMA implementation from GCMMA-MMA-Python, which is distributed under the GPL license. Accordingly, the entire repository is distributed under GPL-3.0.
See the LICENSE file for full terms.