FEAPACK

A finite element analysis package for solids using Python.

Repository (GitHub) · License (GPL-3.0)

Copyright © 2024, Carlos Souto.
All rights reserved.

Installation and how-to guide

FEAPACK works with Python 3.12 (or later) on Windows x64. Installation via pip:

pip install feapack

Access the quick start guide with various examples here.

FEAPACK is easy to use

1. Generate a finite element mesh (manually or via third-party software)

2. Create and run a job script

import feapack.model
import feapack.solver

# main guard required for multiprocessing
if __name__ == '__main__':

    # create model database (MDB)
    mdb = feapack.model.MDB.fromFile('mesh.inp')

    # create node sets
    mdb.nodeSet(name='nodes at y = -55', indices=(node.index for node in mdb.mesh.nodes if node.y == -55.0))
    mdb.nodeSet(name='nodes at y = 100', indices=(node.index for node in mdb.mesh.nodes if node.y == 100.0))

    # create element set
    mdb.elementSet(name='all elements', indices=range(mdb.mesh.elementCount))

    # create surface set
    mdb.surfaceSet(name='loaded surface', surfaceNodes='nodes at y = 100')

    # create material and section
    mdb.material(name='steel', young=210000.0, poisson=0.3)
    mdb.section(name='steel section', region='all elements', material='steel', type=feapack.model.SectionTypes.General)

    # create load and boundary condition
    mdb.pressure(name='pressure', region='loaded surface', magnitude=5.0)
    mdb.boundaryCondition(name='boundary', region='nodes at y = -55', u=0.0, v=0.0, w=0.0)

    # solve
    feapack.solver.solve(mdb, analysis='static', processes=4)

# run script with 'python job.py'
# launch viewer with 'python -m feapack.viewer' and open 'job.out'

3. View results using the viewer application

4. Print the viewport or generate an animation

Implement your own algorithms

Fatigue crack propagation (see example here)

Available finite element types

from enum import Enum, unique

@unique
class ElementTypes(Enum):
    """Available finite element types."""

    Line2 = 102
    """One-dimensional first-order interpolation element with 2 nodes."""

    Line3 = 103
    """One-dimensional second-order interpolation element with 3 nodes."""

    Plane3 = 203
    """Two-dimensional first-order interpolation element with 3 nodes."""

    Plane4 = 204
    """Two-dimensional first-order interpolation element with 4 nodes."""

    Plane6 = 206
    """Two-dimensional second-order interpolation element with 6 nodes."""

    Plane8 = 208
    """Two-dimensional second-order interpolation element with 8 nodes."""

    Volume4 = 304
    """Three-dimensional first-order interpolation element with 4 nodes."""

    Volume6 = 306
    """Three-dimensional first-order interpolation element with 6 nodes."""

    Volume8 = 308
    """Three-dimensional first-order interpolation element with 8 nodes."""

    Volume10 = 310
    """Three-dimensional second-order interpolation element with 10 nodes."""

    Volume15 = 315
    """Three-dimensional second-order interpolation element with 15 nodes."""

    Volume20 = 320
    """Three-dimensional second-order interpolation element with 20 nodes."""