-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
375 additions
and
0 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,275 @@ | ||
@Article{dutzler2021, | ||
author = {Dutzler, Andreas and Buzzi, Christian and Leitner, Martin}, | ||
journal = {Journal of Applied Engineering Design and Simulation}, | ||
title = {Nondimensional translational characteristics of elastomer components}, | ||
year = {2021}, | ||
issn = {2805-5756}, | ||
month = sep, | ||
number = {1}, | ||
volume = {1}, | ||
doi = {10.24191/jaeds.v1i1.20}, | ||
publisher = {UiTM Press, Universiti Teknologi MARA}, | ||
} | ||
|
||
@Article{torggler2023, | ||
author = {Torggler, J. and Dutzler, A. and Oberdorfer, B. and Faethe, T. and Müller, H. and Buzzi, C. and Leitner, M.}, | ||
journal = {Applied Composite Materials}, | ||
title = {Investigating Damage Mechanisms in Cord-Rubber Composite Air Spring Bellows of Rail Vehicles and Representative Specimen Design}, | ||
year = {2023}, | ||
issn = {1573-4897}, | ||
month = aug, | ||
number = {6}, | ||
pages = {1979--1999}, | ||
volume = {30}, | ||
doi = {10.1007/s10443-023-10157-1}, | ||
publisher = {Springer Science and Business Media LLC}, | ||
} | ||
|
||
@Book{bonetwood, | ||
author = {Bonet, Javier and Wood, Richard D.}, | ||
publisher = {Cambridge University Press}, | ||
title = {Nonlinear Continuum Mechanics for Finite Element Analysis}, | ||
year = {2008}, | ||
isbn = {9780511755446}, | ||
month = mar, | ||
doi = {10.1017/cbo9780511755446}, | ||
} | ||
|
||
@Article{scikitfem, | ||
author = {Gustafsson, Tom and McBain, G.}, | ||
journal = {Journal of Open Source Software}, | ||
title = {scikit-fem: A Python package for finite element assembly}, | ||
year = {2020}, | ||
issn = {2475-9066}, | ||
month = aug, | ||
number = {52}, | ||
pages = {2369}, | ||
volume = {5}, | ||
doi = {10.21105/joss.02369}, | ||
publisher = {The Open Journal}, | ||
} | ||
|
||
@Book{bathe, | ||
author = {Bathe, Klaus-Jürgen}, | ||
publisher = {Bathe}, | ||
title = {Finite element procedures}, | ||
year = {2006}, | ||
address = {[Boston, Mass.]}, | ||
isbn = {9780979004902}, | ||
note = {Frühere Ausg. u.d.T.: Bathe, Klaus-Jürgen: Finite element procedures in engineering analysis}, | ||
pagetotal = {1037}, | ||
ppn_gvk = {641562853}, | ||
} | ||
|
||
@Book{zienkiewicz, | ||
author = {Zienkiewicz, O. C.}, | ||
editor = {Robert L. Taylor and Jianzhong Zhu and Olek C Zienkiewicz}, | ||
publisher = {Elsevier Science & Technology}, | ||
title = {Finite Element Method}, | ||
year = {2013}, | ||
address = {Oxford}, | ||
edition = {7th ed.}, | ||
isbn = {9780080951355}, | ||
note = {Description based on publisher supplied metadata and other sources.}, | ||
series = {The Finite Element Method Ser}, | ||
pagetotal = {1753}, | ||
ppn_gvk = {1658035038}, | ||
subtitle = {Its Basis and Fundamentals}, | ||
} | ||
|
||
@Article{pyvista, | ||
author = {Sullivan, C. and Kaszynski, Alexander}, | ||
journal = {Journal of Open Source Software}, | ||
title = {PyVista: 3D plotting and mesh analysis through a streamlined interface for the Visualization Toolkit (VTK)}, | ||
year = {2019}, | ||
issn = {2475-9066}, | ||
month = may, | ||
number = {37}, | ||
pages = {1450}, | ||
volume = {4}, | ||
doi = {10.21105/joss.01450}, | ||
publisher = {The Open Journal}, | ||
} | ||
|
||
@Misc{feplot, | ||
author = {Mohamed ZAARAOUI,}, | ||
title = {ZAARAOUI999/feplot: v0.1.13}, | ||
year = {2023}, | ||
copyright = {Creative Commons Attribution 4.0 International}, | ||
doi = {10.5281/zenodo.10429691}, | ||
publisher = {Zenodo}, | ||
} | ||
|
||
@Misc{matadi, | ||
author = {Dutzler, Andreas}, | ||
title = {matADi: Material Definition with Automatic Differentiation}, | ||
year = {2024}, | ||
copyright = {GNU General Public License v3.0 only}, | ||
doi = {10.5281/zenodo.5519971}, | ||
publisher = {Zenodo}, | ||
} | ||
|
||
@Misc{tensortrax, | ||
author = {Dutzler, Andreas}, | ||
title = {tensortrax: Math on (Hyper-Dual) Tensors with Trailing Axes.}, | ||
year = {2024}, | ||
copyright = {GNU General Public License v3.0 only}, | ||
doi = {10.5281/zenodo.7384105}, | ||
publisher = {Zenodo}, | ||
} | ||
|
||
@Misc{meshio, | ||
author = {Schlömer, Nico}, | ||
title = {meshio: Tools for mesh files}, | ||
year = {2024}, | ||
copyright = {MIT License}, | ||
doi = {10.5281/zenodo.1173115}, | ||
publisher = {Zenodo}, | ||
} | ||
|
||
@Misc{hyperelastic, | ||
author = {Dutzler, Andreas}, | ||
title = {Hyperelastic: Constitutive hyperelastic material formulations for FElupe}, | ||
year = {2024}, | ||
copyright = {GNU General Public License v3.0 only}, | ||
doi = {10.5281/zenodo.8106469}, | ||
publisher = {Zenodo}, | ||
} | ||
|
||
@Misc{fenicsx, | ||
author = {Baratta, Igor A. and Dean, Joseph P. and Dokken, Jørgen S. and Habera, Michal and Hale, Jack S. and Richardson, Chris N. and Rognes, Marie E. and Scroggs, Matthew W. and Sime, Nathan and Wells, Garth N.}, | ||
title = {DOLFINx: The next generation FEniCS problem solving environment}, | ||
year = {2023}, | ||
copyright = {Creative Commons Attribution 4.0 International}, | ||
doi = {10.5281/zenodo.10447666]}, | ||
language = {en}, | ||
publisher = {Zenodo}, | ||
} | ||
|
||
@Unpublished{getfem, | ||
author = {Renard, Yves and Poulios, Konstantinos}, | ||
note = {working paper or preprint}, | ||
title = {{GetFEM: Automated FE modeling of multiphysics problems based on a generic weak form language}}, | ||
month = Apr, | ||
year = {2020}, | ||
hal_id = {hal-02532422}, | ||
hal_version = {v1}, | ||
keywords = {Automated FEM ; coupled PDEs ; symbolic differentiation ; weak form language}, | ||
pdf = {https://hal.science/hal-02532422v1/file/gwfl_paper_prepub.pdf}, | ||
url = {https://hal.science/hal-02532422}, | ||
} | ||
|
||
@Article{sfepy, | ||
author = {Cimrman, Robert and Lukeš, Vladimír and Rohan, Eduard}, | ||
journal = {Advances in Computational Mathematics}, | ||
title = {Multiscale finite element calculations in Python using SfePy}, | ||
year = {2019}, | ||
issn = {1572-9044}, | ||
month = may, | ||
number = {4}, | ||
pages = {1897--1921}, | ||
volume = {45}, | ||
doi = {10.1007/s10444-019-09666-0}, | ||
publisher = {Springer Science and Business Media LLC}, | ||
} | ||
|
||
@Article{numpy, | ||
author = {Harris, Charles R. and Millman, K. Jarrod and van der Walt, Stéfan J. and Gommers, Ralf and Virtanen, Pauli and Cournapeau, David and Wieser, Eric and Taylor, Julian and Berg, Sebastian and Smith, Nathaniel J. and Kern, Robert and Picus, Matti and Hoyer, Stephan and van Kerkwijk, Marten H. and Brett, Matthew and Haldane, Allan and del Río, Jaime Fernández and Wiebe, Mark and Peterson, Pearu and Gérard-Marchant, Pierre and Sheppard, Kevin and Reddy, Tyler and Weckesser, Warren and Abbasi, Hameer and Gohlke, Christoph and Oliphant, Travis E.}, | ||
journal = {Nature}, | ||
title = {Array programming with NumPy}, | ||
year = {2020}, | ||
issn = {1476-4687}, | ||
month = sep, | ||
number = {7825}, | ||
pages = {357--362}, | ||
volume = {585}, | ||
doi = {10.1038/s41586-020-2649-2}, | ||
publisher = {Springer Science and Business Media LLC}, | ||
} | ||
|
||
@software{jax, | ||
author = {James Bradbury and Roy Frostig and Peter Hawkins and Matthew James Johnson and Chris Leary and Dougal Maclaurin and George Necula and Adam Paszke and Jake Vander{P}las and Skye Wanderman-{M}ilne and Qiao Zhang}, | ||
title = {{JAX}: composable transformations of {P}ython+{N}um{P}y programs}, | ||
url = {http://github.com/jax-ml/jax}, | ||
version = {0.3.13}, | ||
year = {2018}, | ||
} | ||
|
||
@InProceedings{pytorch, | ||
author = {Ansel, Jason and Yang, Edward and He, Horace and Gimelshein, Natalia and Jain, Animesh and Voznesensky, Michael and Bao, Bin and Bell, Peter and Berard, David and Burovski, Evgeni and Chauhan, Geeta and Chourdia, Anjali and Constable, Will and Desmaison, Alban and DeVito, Zachary and Ellison, Elias and Feng, Will and Gong, Jiong and Gschwind, Michael and Hirsh, Brian and Huang, Sherlock and Kalambarkar, Kshiteej and Kirsch, Laurent and Lazos, Michael and Lezcano, Mario and Liang, Yanbo and Liang, Jason and Lu, Yinghai and Luk, C. K. and Maher, Bert and Pan, Yunjie and Puhrsch, Christian and Reso, Matthias and Saroufim, Mark and Siraichi, Marcos Yukio and Suk, Helen and Zhang, Shunting and Suo, Michael and Tillet, Phil and Zhao, Xu and Wang, Eikan and Zhou, Keren and Zou, Richard and Wang, Xiaodong and Mathews, Ajit and Wen, William and Chanan, Gregory and Wu, Peng and Chintala, Soumith}, | ||
booktitle = {Proceedings of the 29th ACM International Conference on Architectural Support for Programming Languages and Operating Systems, Volume 2}, | ||
title = {PyTorch 2: Faster Machine Learning Through Dynamic Python Bytecode Transformation and Graph Compilation}, | ||
year = {2024}, | ||
month = apr, | ||
pages = {929--947}, | ||
publisher = {ACM}, | ||
series = {ASPLOS ’24}, | ||
volume = {5}, | ||
collection = {ASPLOS ’24}, | ||
doi = {10.1145/3620665.3640366}, | ||
} | ||
|
||
@Article{jaxfem, | ||
author = {Xue, Tianju and Liao, Shuheng and Gan, Zhengtao and Park, Chanwook and Xie, Xiaoyu and Liu, Wing Kam and Cao, Jian}, | ||
journal = {Computer Physics Communications}, | ||
title = {JAX-FEM: A differentiable GPU-accelerated 3D finite element solver for automatic inverse design and mechanistic data science}, | ||
year = {2023}, | ||
issn = {0010-4655}, | ||
month = oct, | ||
pages = {108802}, | ||
volume = {291}, | ||
doi = {10.1016/j.cpc.2023.108802}, | ||
publisher = {Elsevier BV}, | ||
} | ||
|
||
@InProceedings{buzzi2022, | ||
author = {Buzzi, Christian and Dutzler, Andreas and Faethe, Tobias and Lassacher, Johannes and Leitner, Martin and Weber, Franz-Josef}, | ||
booktitle = {Proceedings of the 12th International Conference on Railway Bogies and Running Gears}, | ||
title = {Development of a tool for estimating the characteristic curves of rubber-metal parts}, | ||
year = {2022}, | ||
address = {Budapest, Hungary}, | ||
editor = {Szabó, András}, | ||
pages = {191--200}, | ||
publisher = {Scientific Society for Mechanical Engineering}, | ||
isbn = {978-963-9058-46-0}, | ||
} | ||
|
||
@Article{mooney, | ||
author = {M. Mooney}, | ||
journal = {Journal of Applied Physics}, | ||
title = {A Theory of Large Elastic Deformation}, | ||
year = {1940}, | ||
month = {sep}, | ||
number = {9}, | ||
pages = {582--592}, | ||
volume = {11}, | ||
doi = {10.1063/1.1712836}, | ||
publisher = {{AIP} Publishing}, | ||
} | ||
|
||
@Article{rivlin, | ||
author = {R. S. Rivlin and D. W. Saunders}, | ||
journal = {Philosophical Transactions of the Royal Society of London. Series A, Mathematical and Physical Sciences}, | ||
title = {Large elastic deformations of isotropic materials {VII}. Experiments on the deformation of rubber}, | ||
year = {1951}, | ||
month = {apr}, | ||
number = {865}, | ||
pages = {251--288}, | ||
volume = {243}, | ||
doi = {10.1098/rsta.1951.0004}, | ||
publisher = {The Royal Society}, | ||
} | ||
|
||
@Article{treloar, | ||
author = {L. R. G. Treloar}, | ||
journal = {Transactions of the Faraday Society}, | ||
title = {The elasticity of a network of long-chain molecules{\textemdash}{II}}, | ||
year = {1943}, | ||
number = {0}, | ||
pages = {241--246}, | ||
volume = {39}, | ||
doi = {10.1039/tf9433900241}, | ||
publisher = {Royal Society of Chemistry ({RSC})}, | ||
} | ||
|
||
@Comment{jabref-meta: databaseType:bibtex;} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
--- | ||
title: 'FElupe: Finite element analysis for continuum mechanics of solid bodies' | ||
tags: | ||
- python | ||
- finite-elements | ||
- hyperelasticity | ||
- computations-mechanics | ||
- scientific-computing | ||
authors: | ||
- name: Andreas Dutzler | ||
orcid: 0000-0002-9383-9686 | ||
affiliation: [ 1, 2 ] | ||
- name: Martin Leitner | ||
orcid: 0000-0002-3530-1183 | ||
affiliation: 1 | ||
affiliations: | ||
- index: 1 | ||
name: Institute of Structural Durability and Railway Technology, Graz University of Technology, Austria | ||
- index: 2 | ||
name: Siemens Mobility Austria GmbH, Austria | ||
date: 18 October 2024 | ||
bibliography: paper.bib | ||
--- | ||
|
||
# Summary | ||
FElupe is a Python package for finite element analysis focusing on the formulation and | ||
numerical solution of nonlinear problems in continuum mechanics of solid bodies. This package is intended for scientific research, but is also suitable for running nonlinear simulations in general. In addition to the transformation of general weak forms into sparse vectors and matrices, FElupe provides an efficient high-level abstraction layer for the simulation of the deformation of solid bodies. The finite element method, as used in FElupe, is generally based on the preliminary works by [@bonetwood], [@bathe] and [@zienkiewicz]. | ||
|
||
## Highlights | ||
- pure Python package built with NumPy and SciPy | ||
- easy-to-learn and productive high-level API | ||
- nonlinear deformation of solid bodies with interactive views | ||
- hyperelastic material models with automatic differentiation | ||
|
||
# Statement of need | ||
There are well-established Python packages available for finite element analysis. These packages are either distributed as binary packages or need to be compiled on installation, like FEniCSx [@fenicsx], GetFEM [@getfem] or SfePy [@sfepy]. JAX-FEM [@jaxfem], which is built on JAX [@jax], is a pure Python package but requires many dependencies in its recommended environment. `scikit-fem` [@scikitfem] is a pure Python package with minimal dependencies but with a more general scope [@scikitfem]. FElupe is both easy-to-install as well as easy-to-use in its target domain of hyperelastic solid bodies. | ||
|
||
The performance of FElupe is good for a non-compiled package but mediocre in comparison to compiled codes. However, it is still well-suited for up to mid-sized problems, i.e. up to $10^5$ degrees of freedom, when basic hyperelastic model formulations are used. A performance benchmark for times spent on stiffness matrix assembly is included in the documentation. Internally, efficient NumPy [@numpy] based math is realized by element-wise operating trailing axes [@scikitfem]. An all-at-once approach per operation is used instead of a cell-by-cell evaluation loop. The constitutive material formulation class is backend agnostic: FElupe provides NumPy-arrays as input arguments and requires NumPy-arrays as return values. This enables backends like JAX [@jax] or PyTorch [@pytorch] to be used. Interactive views of meshes, fields and solid bodies are enabled by PyVista [@pyvista]. The capabilities of FElupe may be enhanced with additional Python packages, e.g. `meshio` [@meshio], `matadi` [@matadi], `tensortrax` [@tensortrax], `hyperelastic` [@hyperelastic] or `feplot` [@feplot]. | ||
|
||
|
||
|
||
# Features | ||
The essential high-level parts of solving problems with FElupe include a field, a solid body, boundary conditions and a job. With the combination of a mesh, a finite element formulation and a quadrature rule, a numeric region is created. A field for a field container is further created on top of this numeric region, see \autoref{fig:field}. | ||
|
||
![Schematic representation of classes needed to create a field container.\label{fig:field}](field.pdf) | ||
|
||
In a solid body, a constitutive material formulation is applied on this field container. Along with constant and ramped boundary conditions a step is created. During job evaluation, the field values are updated in-place after each completed substep as shown in \autoref{fig:job}. | ||
|
||
![Schematic representation of classes needed to evaluate a job.\label{fig:job}](job.pdf) | ||
|
||
For example, consider a quarter model of a solid cube with nearly-incompressible hyperelastic material behavior subjected to a uniaxial elongation applied at a clamped end-face. First, a meshed cube out of hexahedron cells is created. A numeric region, pre-defined for hexahedrons, is created on the mesh. The appropriate finite element and its quadrature scheme are chosen automatically. A vector-valued displacement field is initiated on the region and is further added to a field container. | ||
|
||
A uniaxial load case is applied on the displacement field to create the boundary conditions. This involves setting up symmetry planes as well as the absolute value of the prescribed displacement at the mesh-points on the right-end face of the cube. The right-end face is clamped, i.e. its displacements are fixed, except for the components in longitudinal direction. An isotropic hyperelastic Neo-Hookean material formulation [@treloar], [@bonetwood] is applied on the displacement field of a solid body. A step generates the consecutive substep-movements of a selected boundary condition. The step is further added to a list of steps of a job. After the job evaluation is completed, the maximum principal values of logarithmic strain of the last completed substep are plotted, see \autoref{fig:strain}. | ||
|
||
\newpage | ||
|
||
```python | ||
import felupe as fem | ||
|
||
region = fem.RegionHexahedron(mesh=fem.Cube(n=6)) | ||
field = fem.FieldContainer([fem.Field(region, dim=3)]) | ||
umat = fem.NeoHooke(mu=1) | ||
solid = fem.SolidBodyNearlyIncompressible(umat=umat, field=field, bulk=5000) | ||
boundaries, loadcase = fem.dof.uniaxial(field, clamped=True) | ||
|
||
move = fem.math.linsteps([0, 1], num=5) | ||
step = fem.Step([solid], ramp={boundaries["move"]: move}, boundaries=boundaries) | ||
job = fem.Job(steps=[step]).evaluate() | ||
|
||
solid.plot("Principal Values of Logarithmic Strain").show() | ||
``` | ||
|
||
![Final logarithmic strain distribution of the deformed hyperelastic solid body at a stretch $l/L=2$, where $l$ is the deformed length and $L$ the undeformed length of the solid body in longitudinal direction. The undeformed configuration is shown in transparent grey.\label{fig:strain}](strain.png){height=40mm} | ||
|
||
Any other hyperelastic material model formulation may be used instead of the Neo-Hookean material model given above, most easily by its strain energy density function. The strain energy density function of the Mooney-Rivlin material model formulation [@mooney], [@rivlin], as given in \autoref{eq:mooney-rivlin}, is implemented by a hyperelastic material class in FElupe with the help of `tensortrax` (bundled with FElupe). | ||
|
||
\begin{equation} | ||
\label{eq:mooney-rivlin} | ||
\hat{\psi}(\boldsymbol{C}) = C_{10} \left( \hat{I}_1 - 3 \right) + C_{01} \left( \hat{I}_2 - 3 \right) | ||
\end{equation} | ||
|
||
```python | ||
import tensortrax.math as tm | ||
|
||
def mooney_rivlin(C, C10, C01): | ||
I1 = tm.trace(C) | ||
I2 = (I1**2 - tm.trace(C @ C)) / 2 | ||
I3 = tm.linalg.det(C) | ||
return C10 * (I3**(-1/3) * I1 - 3) + C01 * (I3**(-2/3) * I2 - 3) | ||
|
||
umat = fem.Hyperelastic(mooney_rivlin, C10=0.5, C01=0.1) | ||
solid = fem.SolidBodyNearlyIncompressible(umat=umat, field=field, bulk=5000) | ||
``` | ||
|
||
# Examples | ||
The documentation of FElupe contains interactive tutorials and examples for simulating the deformation of solid bodies. Resulting deformed solid bodies of selected examples are shown in \autoref{fig:examples}. Computational results of FElupe are used in several scientific publications, e.g. [@dutzler2021], [@buzzi2022] and [@torggler2023]. | ||
|
||
![Equivalent stress distribution of a plate with a hole (top left). Shear-loaded hyperelastic block (top middle). Endurable cycles obtained by local stresses (top right). Multiaxially loaded rubber bushing (bottom left). Rotating rubber wheel on a frictionless contact (bottom middle). A hyperelastic solid with frictionless rigid contacts (bottom right).\label{fig:examples}](examples.png) | ||
|
||
# References |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.