MCPcopy Index your code
hub / github.com/ZibraMax/FEM

github.com/ZibraMax/FEM @v.1.0.34.1

Chat with this repo
repository ↗ · DeepWiki ↗ · release v.1.0.34.1 ↗ · + Follow
390 symbols 2,052 edges 137 files 295 documented · 76%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Build status Docs PyPI version Codacy Badge License: MIT made-with-python GitHub release

A Python FEM implementation.

N dimensional FEM implementation for M variables per node problems.

Installation

Use the package manager pip to install AFEM.

pip install AFEM

From source:

git clone https://github.com/ZibraMax/FEM
cd FEM
python -m venv .venv
python -m pip install build
python -m build
python -m pip install -e .[docs] # Basic instalation with docs

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

Full Docs

Tutorial

Using pre implemented equations

Avaliable equations:

  • 1D 1 Variable ordinary diferential equation
  • 1D 1 Variable 1D Heat with convective border
  • 1D 2 Variable Euler Bernoulli Beams
  • 1D 3 Variable Non-linear Euler Bernoulli Beams
  • 2D 1 Variable Torsion
  • 2D 1 Variable Poisson equation
  • 2D 1 Variable second order PDE
  • 2D 1 Variable 2D Heat with convective borders
  • 2D 2 Variable Plane Strees
  • 2D 2 Variable Plane Strees Orthotropic
  • 2D 2 Variable Plane Strain
  • 3D 3 variables per node isotropic elasticity

Numerical Validation:

  • [x] 1D 1 Variable ordinary diferential equation
  • [ ] 1D 1 Variable 1D Heat with convective border
  • [ ] 1D 2 Variable Euler Bernoulli Beams
  • [ ] 1D 3 Variable Non-linear Euler Bernoulli Beams
  • [x] 2D 1 Variable Torsion
  • [ ] 2D 1 Variable 2D Heat with convective borders
  • [x] 2D 2 Variable Plane Strees
  • [x] 2D 2 Variable Plane Strain

Steps:

  • Create geometry
  • Create Border Conditions (Point and regions supported)
  • Solve!
  • For example: Example 2, Example 5, Example 11-14

Example without geometry file (Test 2):

import matplotlib.pyplot as plt #Import libraries
from FEM.Torsion2D import Torsion2D #import AFEM Torsion class
from FEM.Geometry import Delaunay #Import Meshing tools

#Define some variables with geometric properties
a = 0.3
b = 0.3
tw = 0.05
tf = 0.05

#Define material constants
E = 200000
v = 0.27
G = E / (2 * (1 + v))
phi = 1 #Rotation angle

#Define domain coordinates
vertices = [
        [0, 0],
        [a, 0],
        [a, tf],
        [a / 2 + tw / 2, tf],
        [a / 2 + tw / 2, tf + b],
        [a, tf + b],
        [a, 2 * tf + b],
        [0, 2 * tf + b],
        [0, tf + b],
        [a / 2 - tw / 2, tf + b],
        [a / 2 - tw / 2, tf],
        [0, tf],
]

#Define triangulation parameters with `_strdelaunay` method.
params = Delaunay._strdelaunay(constrained=True, delaunay=True,
                                                                        a='0.00003', o=2)
#**Create** geometry using triangulation parameters. Geometry can be imported from .msh files.
geometry = Delaunay(vertices, params)

#Save geometry to .json file
geometry.exportJSON('I_test.json')

#Create torsional 2D analysis.
O = Torsion2D(geometry, G, phi)
#Solve the equation in domain.
#Post process and show results
O.solve()
plt.show()

Example with geometry file (Example 2):

import matplotlib.pyplot as plt #Import libraries
from FEM.Torsion2D import Torsion2D #import AFEM
from FEM.Geometry import Geometry #Import Geometry tools

#Define material constants.
E = 200000
v = 0.27
G = E / (2 * (1 + v))
phi = 1 #Rotation angle

#Load geometry with file.
geometry = Geometry.importJSON('I_test.json')

#Create torsional 2D analysis.
O = Torsion2D(geometry, G, phi)
#Solve the equation in domain.
#Post process and show results
O.solve()
plt.show()


Creating equation classes

Note: Don't forget the docstring!

Steps

  1. Create a Python flie and import the libraries:

    python from .Core import * from tqdm import tqdm import numpy as np import matplotlib.pyplot as plt

    • Core: Solver
    • Numpy: Numpy data
    • Matplotlib: Matplotlib graphs
    • Tqdm: Progressbars
  2. Create a Python class with Core inheritance python class PlaneStress(Core): def __init__(self,geometry,*args,**kargs): #Do stuff Core.__init__(self,geometry) It is important to manage the number of variables per node in the input geometry.

  3. Define the matrix calculation methods and post porcessing methods.

    python def elementMatrices(self): def postProcess(self):

  4. The elementMatrices method uses gauss integration points, so you must use the following structure:

    ```python

    for e in tqdm(self.elements,unit='Element'): _x,_p = e.T(e.Z.T) #Gauss points in global coordinates and Shape functions evaluated in gauss points jac,dpz = e.J(e.Z.T) #Jacobian evaluated in gauss points and shape functions derivatives in natural coordinates detjac = np.linalg.det(jac) _j = np.linalg.inv(jac) #Jacobian inverse dpx = _j @ dpz #Shape function derivatives in global coordinates for k in range(len(e.Z)): #Iterate over gauss points on domain #Calculate matrices with any finite element model #Assign matrices to element ```

A good example is the PlaneStress class in the Elasticity2D.py file.

Roadmap

  1. 2D elastic plate theory
  2. Transient analysis (Core modification)
  3. Non-Lineal for 2D equation (All cases)
  4. Testing and numerical validation (WIP)

Examples

References

J. N. Reddy. Introduction to the Finite Element Method, Third Edition (McGraw-Hill Education: New York, Chicago, San Francisco, Athens, London, Madrid, Mexico City, Milan, New Delhi, Singapore, Sydney, Toronto, 2006). https://www.accessengineeringlibrary.com/content/book/9780072466850

Jonathan Richard Shewchuk, (1996) Triangle: Engineering a 2D Quality Mesh Generator and Delaunay Triangulator

Ramirez, F. (2020). ICYA 4414 Modelación con Elementos Finitos [Class handout]. Universidad de Los Andes.

License

MIT

Core symbols most depended-on inside this repo

show
called by 108
src/FEM/Geometry/Geometry.py
cbFromRegion
called by 99
src/FEM/Geometry/Geometry.py
solve
called by 64
src/FEM/Core.py
exportJSON
called by 44
src/FEM/Core.py
T
called by 35
src/FEM/Elements/Element.py
setCbe
called by 28
src/FEM/Geometry/Geometry.py
importJSON
called by 26
src/FEM/Geometry/Geometry.py
_strdelaunay
called by 25
src/FEM/Geometry/Geometry.py

Shape

Method 251
Class 71
Function 68

Languages

Python100%

Modules by API surface

src/FEM/Geometry/Geometry.py48 symbols
src/FEM/Elasticity2D.py35 symbols
src/FEM/Geometry/Geometree.py22 symbols
src/FEM/Elasticity3D.py18 symbols
src/FEM/Core.py15 symbols
src/FEM/Utils/polygonal.py12 symbols
src/FEM/Solvers/NoLineal.py12 symbols
src/FEM/Elements/Element.py11 symbols
src/FEM/Geometry/Region.py10 symbols
src/FEM/Solvers/Lineal.py9 symbols
src/FEM/FEMLogger.py9 symbols
src/FEM/EulerBernoulliBeam.py8 symbols

For agents

$ claude mcp add FEM \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page