Pynite: a 3D structural finite element library for Python
A 3D structural engineering finite element library for Python.
At a glance
- What is it?
- Pynite solves elastic 3D structural problems in Python, from static and P-Delta analysis to nonlinear pushover and shear wall modelling, with a PDF report generator. It is MIT licensed, runs on numpy and scipy, and its accuracy claim rests on a suite of textbook problems with known solutions.
- Who is it for?
- Adopt Pynite if you are a structural engineer who wants a solver you can read and extend in Python rather than a black box, and whose problems fit elastic 3D statics with the listed element types, since the package is MIT licensed, depends on numpy and scipy, and installs with a single pip command.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 25, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What the solver actually covers
Pynite is described as an easy to use elastic 3D structural engineering finite element analysis library for Python, and the capabilities list is the fastest way to understand its scope.
The core is 3D static analysis of elastic structures, with member point loads, linearly varying distributed loads and nodal loads supported, and load classification by load case with load combinations built from those cases. It produces shear, moment and deflection results and diagrams for each member, reports support reactions, and handles internal nodes on frame members automatically so that a physical member can be split without the user managing it. There are tension-only and compression-only elements, spring elements in two-way, tension-only and compression-only forms, and spring supports in two-way and one-way forms.
Beyond frames there are plate elements. Quadrilateral plate elements use the DKMQ formulation, rectangular plate elements use a 12-term polynomial formulation, and there are basic meshing algorithms for common shapes and for openings in rectangular meshes.
The nonlinear and second-order features are specific rather than general. P-Delta analysis is supported for frame type structures, modal analysis is supported for frame type structures, and nonlinear pushover analysis of steel frames is supported. The description of shear walls and mat foundations as advanced tools for modelling and analyzing complex cases is the point where the library goes beyond textbook frames.
The package on PyPI is PyNiteFEA, version 3.2.0 in the manifest, requiring Python 3.11 or newer with numpy 2.4.0 or newer, scipy, prettytable and matplotlib as the runtime dependencies. The licence is MIT, and the author is listed as D. Craig Brinck, PE, SE.
Installing it and what the optional extras add
Installation is a single pip command, and the extra group is the interesting part. The README gives it as pip install PyniteFEA[all], with the all in brackets selecting the optional groups.
The base install gives you the solver with numpy, scipy, prettytable and matplotlib. The extras are grouped by what they enable, and the grouping tells you what the library treats as optional.
The pyvista and trame extras, together with the jupyter extension and vtk, are for the 3D rendering side. The capability list mentions rendering of model geometry, supports, load cases, load combinations and deformed shapes, and that visualisation is built on pyvista with a trame jupyter extension, which means the drawing happens in a browser backed by VTK rather than as a static image.
The reporting extra installs jinja2, which is the template engine behind the PDF reports for models and model results. The derivations extra installs jupyterlab and sympy, which fits the Derivations/ directory in the repository, where the mathematics behind the element formulations is kept.
The vtk extra is a smaller install for people who want the rendering without the jupyter integration, and ipython and ipywidgets appear in the more complete groups for notebook work.
The build backend is setuptools with a requirement of setuptools 77 or newer, and the package discovery is restricted to the Pynite package, so the source tree ships as the importable Pynite directory. The package data includes html and css files and the logo image, which is what the PDF and HTML reporting uses.
Accuracy is checked against textbook problems in CI
The project states its priorities in a way that is unusual for a small engineering package, and accuracy comes first. The claim is that there are no guarantees Pynite is error free, but that accuracy and correctness are a priority, and that when bugs or errors are identified, top priority is given to eliminate them.
How that is enforced is the useful part. The code is frequently reviewed, and its output is tested against a suite of textbook problems with known solutions using continuous integration any time a change to the code base is made. The repository has a Testing/ directory, an Examples/ folder and a Derivations/ folder, and the CI workflow is named build-and-test with a build status badge and a codecov badge on the main branch.
The scope statement is where the trade-off is admitted. There are other finite element alternatives with many more capabilities, but they are often lacking in documentation, written in difficult languages, or require extensive knowledge of finite element theory and element formulations to use. Pynite is not intended to be the most technically advanced solver out there, and the goal is a dependable yet simple general purpose package.
That is a coherent product decision rather than an apology. A package that a practising engineer can read end to end, and whose results are checked against known solutions on every commit, is a different proposition from a solver with a long feature list and a validation file you have to trust. What you give up is breadth.
One detail to watch is the improvement principle, which says improvement most often happens by getting the small and simple things right incrementally, rather than with sweeping overhauls all at once. That predicts a steady release cadence and a slow-moving API, which is good news for anyone building a tool on top of it.
The Examples folder is the documentation that matters
The examples are the most complete teaching material in the repository, and the project says so. There are more than twenty example files with names that map onto the capability list: Simple Beam - Point Load, Simple Beam - Uniform Load, Simple Beam - Factored Envelope, Moment Frame - Lateral Load, Braced Frame - Spring Supported, Braced Frame - Tension Only, P-Delta Analysis, Modal Analysis, Pushover Analysis, Moment Frame - Pushover, Space Frame - Nodal Loads, Space Truss - Nodal Load, Beam on Elastic Foundation, Circular Bin with Conical Hopper, Mat Foundation, Rectangular Plate Bending, Rectangular Wall - Linear Varying Load, and two shear wall examples, one basic and one advanced.
The comments in the examples provide additional guidance on how Pynite works, and most users learn the library from following these simple examples, which is why the project asks contributors to keep them relatively simple and to improve them rather than to add complexity.
That is a deliberate teaching strategy, and it has a practical consequence for an adopter. If your problem resembles one of these files, you can copy the model definition and adjust it, which is a much faster path than reading the solver's source. The gaps are equally informative: there is no example for dynamic time history analysis, no example for composite sections or nonlinear stress-strain behaviour, and no example for buckling, which tells you those are not the areas the author is steering you towards.
The documentation on readthedocs is described as a work in progress, so treat the examples as the primary reference and the hosted docs as a supplement.
Where Pynite is the wrong tool
The first wrong case is regulated code design. Nothing in the project claims code check certification, and the licensing and validation posture of a solver that is not the most technically advanced is not what an authority will accept for a submission. The package is a working engineering tool, not a qualified one.
The second wrong case is a problem outside the stated element set. Elastic 3D statics is the core, and the dynamic capability is modal analysis of frame type structures, which is a frequency and mode shape calculation rather than a time history. If you need seismic response over time, impact, or progressive collapse, this library does not describe those analyses, and the list of what is not there is as important as the list of what is.
The third is nonlinear behaviour of the section itself. Nonlinear pushover analysis of steel frames is supported, but that is a geometric nonlinear analysis of a frame, and the package does not describe fibre section modelling or a general constitutive model. A buckling check of a slender member, which many engineers would want next to a P-Delta result, is not in the capability list either.
The fourth is performance. The solver is pure Python on top of numpy and scipy, which is the right trade for clarity and for a moderate model, and the wrong one for a large mesh. A model with thousands of elements in a loop is a different proposition from the frame and plate models the examples show.
The library's own position on this is the general one: it aims at the simplest thing that is correct, and the README says explicitly that it is not intended to be the most technically advanced solver. That is a reasonable goal for teaching, preliminary design and small production checks, and a poor fit for a large commercial analysis.
Maintenance pace, licensing and the commercial use question
The project moves regularly. Version 3.0.0 added pushover analysis on 2026-06-01, 3.1.1 brought a bug fix for shear walls and improved detection of unstable structures on 2026-09-11, and 3.2.0 improved shear walls on 2026-09-13. The last push was on 2026-10-20, and the default branch is main.
The 3.2.0 notes are worth reading as a signal of how the project matures. Shear wall pier top results and coupling beam right hand side results were added to the pier and coupling beam force results output, and the sign convention for shear wall pier and coupling beam internal force results was adjusted to match the sign convention used for members. Targeted testing was added for that sign convention and for load magnitudes, and a documentation page was written for shear walls.
That is a change with teeth. Adjusting a sign convention without breaking a single consumer is exactly the kind of thing that needs a test suite, and the fact that the change was paired with targeted tests and a docs page is a good sign for the CI discipline the project claims.
On licensing, the package is MIT, which permits commercial use and modification with attribution. The project also asks for sponsorship, and states that Pynite is downloaded hundreds of thousands of times a month and that if your company relies on it in production, or if it has saved you time, you should consider sponsoring its continued development through GitHub Sponsors, since sponsorships directly fund the time spent fixing bugs, reviewing pull requests and building new features.
One detail to be aware of when reading the sponsorship ask. The author also offers private consulting for direct guidance and help coding a project, at a listed email address, and a set of example projects that use Pynite is listed, including Building Code, Standard Solver, Civils.ai and Phaenotyp.
Editorial conclusion
Adopt Pynite if you are a structural engineer who wants a solver you can read and extend in Python rather than a black box, and whose problems fit elastic 3D statics with the listed element types, since the package is MIT licensed, depends on numpy and scipy, and installs with a single pip command. Steer away if you need code checking, dynamic analysis beyond modal, composite sections or nonlinear stress-strain behaviour, or a solver validated by a regulator, because the project's own scope statement says it is not intended to be the most technically advanced solver. Before you rely on its numbers, run its textbook problem suite and check the version you install, since 3.2.0 shipped on 2026-09-13 and the last push was on 2026-10-20.
Frequently asked questions
How do I install Pynite and what do the optional extras give me?
Run pip install PyniteFEA[all]. The base install brings numpy, scipy, prettytable and matplotlib, while the extras add pyvista, trame, vtk and jupyter widgets for 3D rendering, jinja2 for PDF reports, and jupyterlab with sympy for the derivations. Smaller groups are available for vtk alone or for reporting only.
What kinds of analysis can Pynite perform?
3D static analysis of elastic structures, P-Delta analysis of frame type structures, modal analysis of frame type structures and nonlinear pushover analysis of steel frames. It also supports plate elements, tension-only and compression-only elements, springs, load combinations, shear walls and mat foundations.
How does the Pynite project validate its results?
The output is tested against a suite of textbook problems with known solutions using continuous integration any time the code base changes. The repository carries Testing/, Examples/ and Derivations/ directories, and changes such as the 3.2.0 sign convention adjustment were paired with targeted tests.
Is Pynite suitable for code-checked or dynamic analysis work?
The project states it is not intended to be the most technically advanced solver, and the supported capability list covers elastic 3D statics, P-Delta, modal analysis of frames and steel pushover, not code checking, time history dynamics, nonlinear material modelling or general buckling.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/jwock82-pynite)Was this useful?