Skip to main content

Auto-differentiable and hardware-accelerated force density method

Project description

JAX FDM

build DOI PyPI - Latest Release PyPI - Python Version arXiv CMAME

A differentiable, hardware-accelerated framework for the structural design of lightweight structures.

Crafted with care in the AI Lab at Princeton University ❤️🇺🇸

Lightweight span long distances with slender cross-sections due to their mechanically efficient shapes. However, simulating these structures and turning them into feasible designs that satisfy technical constraints remains challenging due to geometrically nonlinear mechanical behaviors and high-dimensional search spaces.

JAX FDM enables the solution of inverse problems for lightweight structures modeled as pin-jointed bar systems using the force density method (FDM) and gradient-based optimization. It streamlines the integration of mechanical simulations into deep learning models for machine learning research.

Key features

  • Legendary form-finding solver. JAX FDM computes static equilibrium states for pin-jointed bar systems with the force density method (FDM), the time-tested solver for geometrically nonlinear systems backed up by over 50 years of peer-reviewed research 📚.
  • Derivatives, JIT compilation, and parallelization. JAX FDM is written in JAX, a library for high-performance numerical computing and machine learning research, and it thus inherits many of JAX's perks: calculate derivatives, parallelize, and just-in-time (JIT) compile entire structural simulations written in Python code, and run them on a CPU, a GPU, or a TPU 🤯.
  • Autotune those force densities, loads, and supports. A lightweight structure should fulfill additional technical requirements to become a feasible system for real-world construction. This requires finding the parameters that lead to a specific constrained equilibrium state satisfying these conditions. Formulate such an inverse problem with JAX FDM, and let one of its gradient-based optimizers solve it by automatically tweaking the system's force densities, applied loads, and support positions 🕺🏻.
  • A rich bank of goals, constraints, and loss functions. No two structures are alike. JAX FDM allows you to model a custom design task with its (growing!) collection of goals, constraints, and loss functions via a simple, object-oriented API. The available goals and constraints in the framework are granular and applicable to an entire structure; to a subset of its nodes (i.e., vertices), edges, and combinations thereof 💡.
  • Structural simulations as another layer in a neural network. As an auto-differentiable library, JAX FDM can be seamlessly added as a layer in a differentiable function approximator like a neural network that can be then trained end-to-end. Let the neural network learn the underlying physics of static equilibrium directly from the simulation, instead of resorting to laborious techniques like data augmentation 🤖.

JAX FDM is a research project under development. Expect sharp edges and possibly some API breaking changes as we continue to support a broader set of features.

Installation

First, create a new Anaconda environment and then activate it:

conda create -n jaxenv
conda activate jaxenv

Next, install COMPAS and COMPAS VIEW2 via conda:

conda install -c conda-forge compas==1.17.10 compas_view2==0.7.0

Finally, install JAX FDM with a one-liner via pip:

pip install jax-fdm

JAX FDM supports Python 3.10 and 3.11 and builds on JAX, NumPy, SciPy, Equinox, and the COMPAS framework. See pyproject.toml for the complete dependency list. For visualization, it uses COMPAS_VIEW2 0.7.0.

Optional extras

JAX FDM declares optional dependency groups you can install from a source checkout with pip:

pip install -e ".[viz]"    # 3D viewer (compas_view2) and matplotlib
pip install -e ".[ipopt]"  # the IPOPT interior-point optimizer (cyipopt)
pip install -e ".[dev]"     # development tools (ruff, pytest, build, bump-my-version)

Note that compas_view2 is distributed through conda-forge, so the viz extra may still require a conda install as shown above. The ipopt extra needs a system Ipopt library available on your machine.

Are you a Windows user?

JAX now provides official native CPU wheels for Windows, so JAX FDM should work directly. On Windows you may also need to install the Microsoft Visual Studio 2019 Redistributable.

For GPU acceleration on Windows, native support is unavailable. You can instead run JAX through the Windows Subsystem for Linux (WSL2), but keep in mind that it has no graphical output and that support for this configuration is experimental. Please refer to JAX's installation instructions for details.

Quick example

Suppose you are interested in generating a form in static equilibrium for a 10-meter span arch subjected to vertical point loads of 0.3 kN. The arch has to be a compression-only structure. You model the arch as a jax_fdm network (download the arch json file here). Then, you apply a force density of -1 to all of its edges, and compute the required shape with the force density method.

from jax_fdm.datastructures import FDNetwork
from jax_fdm.equilibrium import fdm


network = FDNetwork.from_json("data/json/arch.json")
network.edges_forcedensities(q=-1.0)
network.nodes_supports(keys=[node for node in network.nodes() if network.is_leaf(node)])
network.nodes_loads([0.0, 0.0, -0.3])

f_network = fdm(network)

You now wish to find a new form for this arch that minimizes the total Michell's load path, while keeping the length of the arch segments between 0.75 and 1 meters. You solve this constrained form-finding problem with the SLSQP gradient-based optimizer.

from jax_fdm.equilibrium import constrained_fdm
from jax_fdm.optimization import SLSQP
from jax_fdm.constraints import EdgeLengthConstraint
from jax_fdm.goals import NetworkLoadPathGoal
from jax_fdm.losses import PredictionError
from jax_fdm.losses import Loss


loss = Loss(PredictionError(goals=[NetworkLoadPathGoal()]))
constraints = [EdgeLengthConstraint(edge, 0.75, 1.0) for edge in network.edges()]
optimizer = SLSQP()

c_network = constrained_fdm(network, optimizer, loss, constraints=constraints)

You finally visualize the unconstrained arch f_network (gray) and the constrained one, c_network (in teal) with the Viewer.

from jax_fdm.visualization import Viewer


viewer = Viewer(width=1600, height=900)
viewer.add(c_network)
viewer.add(f_network, as_wireframe=True)
viewer.show()

The constrained form is shallower than the unconstrained one as a result of the optimization process. The length of the arch segments also varies within the prescribed bounds to minimize the load path: segments are the longest where the arch's internal forces are lower (1.0 meter, at the apex); and conversely, the segments are shorter where the arch's internal forces are higher (0.75 m, at the base).

Documentation

Documentation is a work in progress. In the meantime, check out the scripts in the examples/ folder.

More examples

Notebooks

These notebooks run directly from your browser without having to install anything locally!

Scripts

These python scripts require a local installation of JAX FDM.

  • Pointy dome: Control the tilt and the coarse width of a brick dome.
  • Triple-branching saddle: Design the distribution of thrusts at the supports of a monkey saddle network while constraining the edge lengths.
  • Saddle bridge: Create a crease in the middle of the bridge while constraining to transversal edges of the network to a target plane.

Citation

If you found this library to be useful in academic or industry work, please consider 1) starring the project on Github, and 2) citing it:

@article{pastrana_dfdm_2026,
         title = {Differentiable force density method for the design of lightweight structures},
         author = {Pastrana, Rafael and Oktay, Deniz and Bletzinger, Kai-Uwe and Adams, Ryan P. and Adriaenssens, Sigrid},
         date = {2026},
         journaltitle = {Computer Methods in Applied Mechanics and Engineering},
         volume = {458},
         pages = {118783},
         issn = {00457825},
         doi = {10.1016/j.cma.2026.118783}}
@inproceedings{pastrana_jaxfdm_2023,
               title = {{{JAX FDM}}: {{A}} differentiable solver for inverse form-Finding},
               booktitle = {Differentiable {{Almost Everything Workshop}} of the 40th {{International Conference}} on {{Machine Learning}}},
               author = {Pastrana, Rafael and Oktay, Deniz and Adams, Ryan P. and Adriaenssens, Sigrid},
               year = {2023},
               address = {Hawaii, USA},
               url = {https://openreview.net/forum?id=Uu9OPgh24d}}
@software{pastrana_jaxfdm_software_2023,
          title={{JAX~FDM}: {A}uto-differentiable and hardware-accelerated force density method},
          author={Rafael Pastrana and Deniz Oktay and Ryan P. Adams and Sigrid Adriaenssens},
          year={2023},
          doi={10.5281/zenodo.7258292},
          url={https://github.com/arpastrana/jax\_fdm}}

Acknowledgements

This work has been supported by the U.S. National Science Foundation under grant OAC-2118201 and the Institute for Data Driven Dynamical Design.

See also

COMPAS CEM: Inverse design of 3D trusses with the combinatorial equilibrium modeling (CEM) framework.

JAX CEM: The combinatorial equilibrium modeling (CEM) framework in JAX.

JAX: Composable transformations of Python+NumPy programs.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jax_fdm-0.11.0.tar.gz (101.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jax_fdm-0.11.0-py3-none-any.whl (113.2 kB view details)

Uploaded Python 3

File details

Details for the file jax_fdm-0.11.0.tar.gz.

File metadata

  • Download URL: jax_fdm-0.11.0.tar.gz
  • Upload date:
  • Size: 101.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for jax_fdm-0.11.0.tar.gz
Algorithm Hash digest
SHA256 60f54955749ceb3c1571cef2c6b941a9cdbb0c81f71a026ef083792bd01f93c6
MD5 38605b7d137e2a93594d6eb560524c93
BLAKE2b-256 5f4cecb2b2f307e235962b3fd6e39bdbd32e25cb217af5cb0dcc5dd0a203aa83

See more details on using hashes here.

File details

Details for the file jax_fdm-0.11.0-py3-none-any.whl.

File metadata

  • Download URL: jax_fdm-0.11.0-py3-none-any.whl
  • Upload date:
  • Size: 113.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for jax_fdm-0.11.0-py3-none-any.whl
Algorithm Hash digest
SHA256 641e330a1051926bdd52c236c5f8191157c566cce7488d1adde946d242fe3688
MD5 6c8fa87f1fb6a7e5d70b766e40473761
BLAKE2b-256 fdf2bfd4c74527104dbee29fe95b4989284c649a8c0f5e91435dc12e5011d16a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page