EasyFEA 3.3.0__tar.gz → 3.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/Beam/_beam.py +13 -9
- {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/IsotropicHardening.py +1 -1
- {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/KinematicHardening.py +2 -2
- {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/ViscoPlastic.py +1 -1
- {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/Yield.py +4 -4
- easyfea-3.4.0/EasyFEA/Models/InElastic/__init__.py +15 -0
- easyfea-3.3.0/EasyFEA/Models/_behaviour.py → easyfea-3.4.0/EasyFEA/Models/InElastic/_behavior.py +47 -42
- {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/_materialpoint.py +19 -19
- {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/_spectral.py +6 -3
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/__init__.py +1 -8
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/__init__.py +1 -1
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_elastic.py +1 -1
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_hyperelastic.py +1 -1
- easyfea-3.3.0/EasyFEA/Simulations/_behaviour.py → easyfea-3.4.0/EasyFEA/Simulations/_inelastic.py +8 -8
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_thermal.py +1 -1
- {easyfea-3.3.0/easyfea.egg-info → easyfea-3.4.0}/PKG-INFO +2 -2
- {easyfea-3.3.0 → easyfea-3.4.0}/README.md +1 -1
- {easyfea-3.3.0 → easyfea-3.4.0/easyfea.egg-info}/PKG-INFO +2 -2
- {easyfea-3.3.0 → easyfea-3.4.0}/easyfea.egg-info/SOURCES.txt +10 -9
- {easyfea-3.3.0 → easyfea-3.4.0}/pyproject.toml +1 -1
- {easyfea-3.3.0 → easyfea-3.4.0}/AUTHORS.md +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/__init__.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_beam.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_hexa.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_point.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_prism.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_quad.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_seg.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_tetra.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_tri.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Operators/Bilinear.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Operators/Linear.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Operators/NonLinear.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Operators/__init__.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/__init__.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_boundary_conditions.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_field.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_forms.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_gauss.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_group_elem.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_linalg.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_mesh.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_mesher.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_utils.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/__init__.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_circle.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_contour.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_domain.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_geom.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_line.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_points.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_utils.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/Beam/__init__.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/Elastic/__init__.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/Elastic/_laws.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/HyperElastic/__init__.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/HyperElastic/_laws.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/HyperElastic/_state.py +0 -0
- {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/ViscoElastic.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/_kelvin.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/_phasefield.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/_thermal.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/_utils.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/_weakforms.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/Solvers.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_beam.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_dic.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_phasefield.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_simu.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_utils.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_weakforms.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/Folder.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/GLTF.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/Matplotlib.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/MeshIO.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/Paraview.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/PyVista.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/Terminal.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/USD.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/Vizir.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/__init__.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_cache.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_mpi.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_observers.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_params.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_requires.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_tic.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_types.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/__about__.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/__init__.py +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/LICENSE.txt +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/easyfea.egg-info/dependency_links.txt +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/easyfea.egg-info/requires.txt +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/easyfea.egg-info/top_level.txt +0 -0
- {easyfea-3.3.0 → easyfea-3.4.0}/setup.cfg +0 -0
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
# EasyFEA is distributed under the terms of the GNU General Public License v3, see LICENSE.txt and CREDITS.md for more information.
|
|
5
5
|
|
|
6
6
|
from abc import abstractmethod
|
|
7
|
+
from typing import TYPE_CHECKING
|
|
7
8
|
|
|
8
9
|
# utilities
|
|
9
10
|
import numpy as np
|
|
@@ -12,10 +13,13 @@ import numpy as np
|
|
|
12
13
|
from ...Geoms import Line, AsCoords, Normalize
|
|
13
14
|
|
|
14
15
|
# fem
|
|
15
|
-
from ...FEM import
|
|
16
|
+
from ...FEM import FeArray, MatrixType, ElemType
|
|
16
17
|
from ...FEM import Field, BiLinearForm, LinearForm
|
|
17
18
|
from ...FEM.Elems._beam import _Timoshenko, _EulerBernoulli
|
|
18
19
|
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from ...FEM import Mesh, _GroupElem
|
|
22
|
+
|
|
19
23
|
# simulations / models — used by _shear_kappa (Saint-Venant Poisson solve)
|
|
20
24
|
from ... import Models, Simulations
|
|
21
25
|
|
|
@@ -127,7 +131,7 @@ class _Beam(_IModel):
|
|
|
127
131
|
self,
|
|
128
132
|
dim: int,
|
|
129
133
|
line: Line,
|
|
130
|
-
section: Mesh,
|
|
134
|
+
section: "Mesh",
|
|
131
135
|
yAxis: _types.Coords = (0, 1, 0),
|
|
132
136
|
):
|
|
133
137
|
"""Creates a beam.
|
|
@@ -165,12 +169,12 @@ class _Beam(_IModel):
|
|
|
165
169
|
return self.__line
|
|
166
170
|
|
|
167
171
|
@property
|
|
168
|
-
def section(self) -> Mesh:
|
|
172
|
+
def section(self) -> "Mesh":
|
|
169
173
|
"""beam cross-section in (x,y) plane"""
|
|
170
174
|
return self.__section
|
|
171
175
|
|
|
172
176
|
@section.setter
|
|
173
|
-
def section(self, section: Mesh) -> None:
|
|
177
|
+
def section(self, section: "Mesh") -> None:
|
|
174
178
|
assert (
|
|
175
179
|
section.inDim == 2
|
|
176
180
|
), "The cross-beam section must be contained in the (x,y) plane."
|
|
@@ -179,7 +183,7 @@ class _Beam(_IModel):
|
|
|
179
183
|
Iyz = section.groupElem.Integrate_e(lambda x, y, z: x * y).sum()
|
|
180
184
|
assert np.abs(Iyz) <= 1e-9, "The section must have at least 1 symetry axis."
|
|
181
185
|
self.Need_Update()
|
|
182
|
-
self.__section: Mesh = section
|
|
186
|
+
self.__section: "Mesh" = section
|
|
183
187
|
|
|
184
188
|
@property
|
|
185
189
|
def xAxis(self) -> _types.FloatArray:
|
|
@@ -365,7 +369,7 @@ class Isotropic(_Beam):
|
|
|
365
369
|
self,
|
|
366
370
|
dim: int,
|
|
367
371
|
line: Line,
|
|
368
|
-
section: Mesh,
|
|
372
|
+
section: "Mesh",
|
|
369
373
|
E: float,
|
|
370
374
|
v: float,
|
|
371
375
|
yAxis: _types.Coords = (0, 1, 0),
|
|
@@ -531,7 +535,7 @@ class BeamStructure(_IModel):
|
|
|
531
535
|
|
|
532
536
|
def Calc_D_e_pg(
|
|
533
537
|
self,
|
|
534
|
-
groupElem: _GroupElem,
|
|
538
|
+
groupElem: "_GroupElem",
|
|
535
539
|
matrixType: MatrixType = MatrixType.beam,
|
|
536
540
|
) -> FeArray.FeArrayALike:
|
|
537
541
|
"""Returns a matrix characterizing the beams's stiffness behavior."""
|
|
@@ -556,7 +560,7 @@ class BeamStructure(_IModel):
|
|
|
556
560
|
|
|
557
561
|
return D_e_pg
|
|
558
562
|
|
|
559
|
-
def Calc_M_e_pg(self, groupElem: _GroupElem) -> FeArray.FeArrayALike:
|
|
563
|
+
def Calc_M_e_pg(self, groupElem: "_GroupElem") -> FeArray.FeArrayALike:
|
|
560
564
|
"""Returns a matrix characterizing the beams's stiffness behavior."""
|
|
561
565
|
|
|
562
566
|
assert isinstance(groupElem, (_Timoshenko, _EulerBernoulli))
|
|
@@ -579,7 +583,7 @@ class BeamStructure(_IModel):
|
|
|
579
583
|
return M_e_pg
|
|
580
584
|
|
|
581
585
|
def Get_axis_e(
|
|
582
|
-
self, groupElem: _GroupElem
|
|
586
|
+
self, groupElem: "_GroupElem"
|
|
583
587
|
) -> tuple[_types.FloatArray, _types.FloatArray]:
|
|
584
588
|
"""Returns the fiber and cross bar vertical axis on every elements.\n
|
|
585
589
|
return xAxis_e, yAxis_e"""
|
{easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/KinematicHardening.py
RENAMED
|
@@ -17,12 +17,12 @@ That is the Bauschinger effect: yielding in tension lowers the stress at which t
|
|
|
17
17
|
yields in compression. It is why cyclic plasticity needs this and not isotropic hardening alone.
|
|
18
18
|
|
|
19
19
|
The internal variable is a **tensor**, which is why this is a separate piece rather than an
|
|
20
|
-
option on :class:`~EasyFEA.Models.IsotropicHardening.Hardening`.
|
|
20
|
+
option on :class:`~EasyFEA.Models.InElastic.IsotropicHardening.Hardening`.
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
23
|
from typing import Callable, NamedTuple
|
|
24
24
|
|
|
25
|
-
from
|
|
25
|
+
from ...FEM._linalg import FeArray
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
class KinematicHardening(NamedTuple):
|
|
@@ -14,9 +14,9 @@ from typing import Callable, NamedTuple, Optional
|
|
|
14
14
|
|
|
15
15
|
import numpy as np
|
|
16
16
|
|
|
17
|
-
from
|
|
18
|
-
from
|
|
19
|
-
from
|
|
17
|
+
from .. import _kelvin
|
|
18
|
+
from ...FEM._linalg import FeArray, Norm, TensorProd
|
|
19
|
+
from ...Utilities import _types
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
class YieldSurface(NamedTuple):
|
|
@@ -30,7 +30,7 @@ class YieldSurface(NamedTuple):
|
|
|
30
30
|
needs. Written by hand here, as the derivatives of the hyperelastic potentials are.
|
|
31
31
|
- ``P`` — the ``(6, 6)`` quadratic form when :math:`\phi^2 = \Sig : \Prm : \Sig`, else
|
|
32
32
|
``None``. Only that shape lets the local solve collapse to one scalar unknown, so it is
|
|
33
|
-
what :class:`.
|
|
33
|
+
what :class:`.Behavior` dispatches on.
|
|
34
34
|
|
|
35
35
|
To add a surface, write ``phi`` and differentiate it twice. Yield functions are linear in
|
|
36
36
|
the stress invariants, so the chain rule is a line or two.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Copyright (C) 2021-2024 Université Gustave Eiffel.
|
|
2
|
+
# Copyright (C) 2025-2026 Université Gustave Eiffel, INRIA.
|
|
3
|
+
# This file is part of the EasyFEA project.
|
|
4
|
+
# EasyFEA is distributed under the terms of the GNU General Public License v3, see LICENSE.txt and CREDITS.md for more information.
|
|
5
|
+
|
|
6
|
+
"""Module implementing constitutive laws used in simulations."""
|
|
7
|
+
|
|
8
|
+
from ._behavior import Behavior
|
|
9
|
+
from ._materialpoint import MaterialPoint
|
|
10
|
+
from . import IsotropicHardening
|
|
11
|
+
from . import KinematicHardening
|
|
12
|
+
from . import ViscoPlastic
|
|
13
|
+
from . import ViscoElastic
|
|
14
|
+
from . import Yield
|
|
15
|
+
from .Yield import YieldSurface
|
easyfea-3.3.0/EasyFEA/Models/_behaviour.py → easyfea-3.4.0/EasyFEA/Models/InElastic/_behavior.py
RENAMED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
r"""Materials whose stress depends on the strain history.
|
|
7
7
|
|
|
8
|
-
A :class:`
|
|
8
|
+
A :class:`Behavior` is declared by a free energy and, once it can flow, a yield surface:
|
|
9
9
|
|
|
10
10
|
.. math::
|
|
11
11
|
\Sig = \dpartial{\psi}{\Eps} \qquad A = -\dpartial{\psi}{z}
|
|
@@ -13,7 +13,7 @@ A :class:`Behaviour` is declared by a free energy and, once it can flow, a yield
|
|
|
13
13
|
where ``z`` holds the internal variables. Everything the solver needs — the stress, the
|
|
14
14
|
consistent tangent, the evolution of ``z`` — follows from ``psi`` and ``f``.
|
|
15
15
|
|
|
16
|
-
``Models.Elastic`` is closed-form and total; a ``
|
|
16
|
+
``Models.Elastic`` is closed-form and total; a ``Behavior`` is incremental and carries state.
|
|
17
17
|
With no internal variables it degenerates to :math:`\Sig = \Crm : \Eps`, which is the same
|
|
18
18
|
answer ``Models.Elastic`` gives.
|
|
19
19
|
"""
|
|
@@ -23,16 +23,16 @@ from typing import NamedTuple, Optional, Sequence, Union
|
|
|
23
23
|
|
|
24
24
|
import numpy as np
|
|
25
25
|
|
|
26
|
-
from
|
|
27
|
-
from
|
|
26
|
+
from .._utils import _IModel, ModelType
|
|
27
|
+
from ..Elastic._laws import _Elastic
|
|
28
28
|
from .IsotropicHardening import IsotropicHardening, Linear
|
|
29
29
|
from .KinematicHardening import KinematicHardening
|
|
30
30
|
from .ViscoPlastic import RateLaw
|
|
31
31
|
from .ViscoElastic import Maxwell
|
|
32
32
|
from .Yield import YieldSurface
|
|
33
33
|
from . import _spectral
|
|
34
|
-
from
|
|
35
|
-
from
|
|
34
|
+
from ...FEM._linalg import FeArray, TensorProd
|
|
35
|
+
from ...Utilities import _params, _types, Tic
|
|
36
36
|
|
|
37
37
|
# in-plane components [xx, yy, xy] of a 2D field inside the 3D (6,) Kelvin vector, and the
|
|
38
38
|
# out-of-plane index condensed out under plane stress
|
|
@@ -41,7 +41,7 @@ ZZ = 2
|
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
class Slot(str, Enum):
|
|
44
|
-
"""Names of the internal variables a
|
|
44
|
+
"""Names of the internal variables a behavior can carry.
|
|
45
45
|
|
|
46
46
|
A ``str`` enum, so ``simu.Result(Slot.p)`` and ``simu.Result("alpha")`` are the same
|
|
47
47
|
call. A repeated mechanism appends an index: the second Maxwell branch is ``eps_v1``.
|
|
@@ -75,7 +75,7 @@ class StateLayout(NamedTuple):
|
|
|
75
75
|
return StateLayout(slots, start)
|
|
76
76
|
|
|
77
77
|
|
|
78
|
-
class
|
|
78
|
+
class Behavior(_IModel):
|
|
79
79
|
"""Elasticity, and later a yield surface, hardening and a rate law.
|
|
80
80
|
|
|
81
81
|
The elastic model must be 3D: the state lives in 6D Kelvin whatever the problem dimension,
|
|
@@ -109,7 +109,7 @@ class Behaviour(_IModel):
|
|
|
109
109
|
planeStress: bool = False,
|
|
110
110
|
solver: str = "auto",
|
|
111
111
|
):
|
|
112
|
-
"""Creates a
|
|
112
|
+
"""Creates a behavior.
|
|
113
113
|
|
|
114
114
|
Parameters
|
|
115
115
|
----------
|
|
@@ -136,12 +136,12 @@ class Behaviour(_IModel):
|
|
|
136
136
|
"""
|
|
137
137
|
# what each piece must be
|
|
138
138
|
assert isinstance(elastic, _Elastic), "elastic must be an elastic model"
|
|
139
|
-
assert yieldSurface is None or isinstance(
|
|
140
|
-
|
|
141
|
-
)
|
|
142
|
-
assert hardening is None or isinstance(
|
|
143
|
-
|
|
144
|
-
)
|
|
139
|
+
assert yieldSurface is None or isinstance(
|
|
140
|
+
yieldSurface, YieldSurface
|
|
141
|
+
), "yieldSurface must be a YieldSurface"
|
|
142
|
+
assert hardening is None or isinstance(
|
|
143
|
+
hardening, IsotropicHardening
|
|
144
|
+
), "hardening must be an IsotropicHardening"
|
|
145
145
|
kinematics: tuple[KinematicHardening, ...] = (
|
|
146
146
|
()
|
|
147
147
|
if kinematic is None
|
|
@@ -155,9 +155,9 @@ class Behaviour(_IModel):
|
|
|
155
155
|
isinstance(component, KinematicHardening) for component in kinematics
|
|
156
156
|
), "kinematic must be a KinematicHardening, or a sequence of them"
|
|
157
157
|
assert rate is None or isinstance(rate, RateLaw), "rate must be a RateLaw"
|
|
158
|
-
assert all(
|
|
159
|
-
|
|
160
|
-
)
|
|
158
|
+
assert all(
|
|
159
|
+
isinstance(branch, Maxwell) for branch in branches
|
|
160
|
+
), "branches must be Maxwell branches"
|
|
161
161
|
|
|
162
162
|
# nothing evolves until the material yields
|
|
163
163
|
needsSurface = {"hardening": hardening, "kinematic": kinematic, "rate": rate}
|
|
@@ -170,13 +170,13 @@ class Behaviour(_IModel):
|
|
|
170
170
|
# parameter ranges
|
|
171
171
|
assert elastic.dim == 3, "the elastic model must be 3D (the state is 6D Kelvin)"
|
|
172
172
|
assert not (planeStress and dim == 3), "plane stress is a 2D-only assumption"
|
|
173
|
-
assert all(
|
|
174
|
-
|
|
175
|
-
)
|
|
173
|
+
assert all(
|
|
174
|
+
branch.tau > 0 for branch in branches
|
|
175
|
+
), "every branch tau must be > 0"
|
|
176
176
|
assert all(branch.g > 0 for branch in branches), "every branch g must be > 0"
|
|
177
|
-
assert
|
|
178
|
-
|
|
179
|
-
)
|
|
177
|
+
assert (
|
|
178
|
+
sum(branch.g for branch in branches) < 1.0
|
|
179
|
+
), "the branch stiffness fractions must sum to less than 1"
|
|
180
180
|
|
|
181
181
|
self.dim = dim
|
|
182
182
|
self.__elastic = elastic
|
|
@@ -224,7 +224,7 @@ class Behaviour(_IModel):
|
|
|
224
224
|
|
|
225
225
|
@property
|
|
226
226
|
def modelType(self) -> ModelType:
|
|
227
|
-
# a
|
|
227
|
+
# a Behavior solves for displacement, so it reports the displacement problem type
|
|
228
228
|
return ModelType.elastic
|
|
229
229
|
|
|
230
230
|
@property
|
|
@@ -767,14 +767,15 @@ class Behaviour(_IModel):
|
|
|
767
767
|
|
|
768
768
|
Parameters
|
|
769
769
|
----------
|
|
770
|
-
eps_e_pg : FeArray
|
|
771
|
-
Total strain, Kelvin-Mandel, in the model dimension.
|
|
772
|
-
zOld_e_pg : FeArray
|
|
773
|
-
Packed state committed at the last converged step; zeros by default.
|
|
770
|
+
eps_e_pg : FeArray
|
|
771
|
+
Total strain ``(Ne, nPg, nstrain)``, Kelvin-Mandel, in the model dimension.
|
|
772
|
+
zOld_e_pg : FeArray, optional
|
|
773
|
+
Packed state ``(Ne, nPg, n)`` committed at the last converged step; zeros by default.
|
|
774
774
|
dt : float, optional
|
|
775
|
-
Time increment; required by a rate-dependent
|
|
776
|
-
epsOld_e_pg : FeArray
|
|
777
|
-
Total strain at the last converged step, supplied by the
|
|
775
|
+
Time increment; required by a rate-dependent behavior, ignored otherwise.
|
|
776
|
+
epsOld_e_pg : FeArray, optional
|
|
777
|
+
Total strain ``(Ne, nPg, nstrain)`` at the last converged step, supplied by the
|
|
778
|
+
solver and never stored --
|
|
778
779
|
the state stays exactly the history variables. Only local sub-stepping needs it, so
|
|
779
780
|
leaving it out costs that and nothing else. See MFront's `eto`/`deto`, Abaqus'
|
|
780
781
|
STRAN/DSTRAN and NEML's `e_n`.
|
|
@@ -786,17 +787,21 @@ class Behaviour(_IModel):
|
|
|
786
787
|
|
|
787
788
|
Returns
|
|
788
789
|
-------
|
|
789
|
-
sigma : FeArray
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
790
|
+
sigma : FeArray
|
|
791
|
+
Stress ``(Ne, nPg, nstrain)``, Kelvin-Mandel.
|
|
792
|
+
C_alg : FeArray or None
|
|
793
|
+
Consistent tangent ``(Ne, nPg, nstrain, nstrain)``; None if withTangent is False.
|
|
794
|
+
z : FeArray
|
|
795
|
+
Trial state ``(Ne, nPg, n)`` — the caller commits it only once the global step
|
|
796
|
+
converges.
|
|
797
|
+
converged : FeArray
|
|
798
|
+
Boolean ``(Ne, nPg)``.
|
|
794
799
|
"""
|
|
795
|
-
assert
|
|
796
|
-
|
|
797
|
-
)
|
|
800
|
+
assert (
|
|
801
|
+
not fields
|
|
802
|
+
), "external fields are not read yet (thermo-mechanical coupling)"
|
|
798
803
|
assert self.__rate is None or dt > 0.0, (
|
|
799
|
-
"a rate-dependent
|
|
804
|
+
"a rate-dependent behavior needs a positive time increment; "
|
|
800
805
|
"set `simu.dt` or pass `dt=` to Integrate"
|
|
801
806
|
)
|
|
802
807
|
|
|
@@ -823,5 +828,5 @@ class Behaviour(_IModel):
|
|
|
823
828
|
else C6alg_e_pg[..., IDX_2D, :][..., :, IDX_2D]
|
|
824
829
|
)
|
|
825
830
|
|
|
826
|
-
tic.Tac("Matrix", "
|
|
831
|
+
tic.Tac("Matrix", "Behavior integrate", False)
|
|
827
832
|
return sig_e_pg, C_e_pg, z_e_pg, converged_e_pg
|
|
@@ -3,22 +3,22 @@
|
|
|
3
3
|
# This file is part of the EasyFEA project.
|
|
4
4
|
# EasyFEA is distributed under the terms of the GNU General Public License v3, see LICENSE.txt and CREDITS.md for more information.
|
|
5
5
|
|
|
6
|
-
"""Driving a
|
|
6
|
+
"""Driving a behavior at a single material point, with no mesh and no solver."""
|
|
7
7
|
|
|
8
8
|
from typing import Optional
|
|
9
9
|
|
|
10
10
|
import numpy as np
|
|
11
11
|
|
|
12
|
-
from .
|
|
13
|
-
from
|
|
14
|
-
from
|
|
12
|
+
from ._behavior import Behavior
|
|
13
|
+
from ...FEM._linalg import FeArray
|
|
14
|
+
from ...Utilities import _types
|
|
15
15
|
|
|
16
16
|
COMPONENTS = {"xx": 0, "yy": 1, "zz": 2, "yz": 3, "xz": 4, "xy": 5}
|
|
17
17
|
"""Kelvin-Mandel component names. The shear entries carry a sqrt(2)."""
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
class MaterialPoint:
|
|
21
|
-
r"""Runs a :class:`~EasyFEA.Models.
|
|
21
|
+
r"""Runs a :class:`~EasyFEA.Models.Behavior` on one Gauss point.
|
|
22
22
|
|
|
23
23
|
Each component is either **strain-controlled** — you give its history — or
|
|
24
24
|
**stress-controlled**, where the strain is solved for until the stress reaches its target
|
|
@@ -27,15 +27,15 @@ class MaterialPoint:
|
|
|
27
27
|
contraction comes out of the solve rather than being assumed.
|
|
28
28
|
|
|
29
29
|
It runs the law on a ``(1, 1)`` :class:`~EasyFEA.FEM.FeArray`, which is the same code path
|
|
30
|
-
assembly uses — so this is the real
|
|
30
|
+
assembly uses — so this is the real behavior, not a second implementation of it.
|
|
31
31
|
|
|
32
32
|
Examples
|
|
33
33
|
--------
|
|
34
34
|
Uniaxial tension, load then unload::
|
|
35
35
|
|
|
36
|
-
law = Models.
|
|
37
|
-
hardening=Models.IsotropicHardening.Linear(2000.0),
|
|
38
|
-
yieldSurface=Models.Yield.VonMises(250.0))
|
|
36
|
+
law = Models.Behavior(3, Isotropic(3, E=210e3, v=0.3),
|
|
37
|
+
hardening=Models.InElastic.IsotropicHardening.Linear(2000.0),
|
|
38
|
+
yieldSurface=Models.InElastic.Yield.VonMises(250.0))
|
|
39
39
|
path = np.concatenate([np.linspace(0, 5e-3, 40), np.linspace(5e-3, 0, 40)[1:]])
|
|
40
40
|
res = MaterialPoint(law).Run(strain={"xx": path})
|
|
41
41
|
sigma_xx, eps_xx = res["stress"][:, 0], res["strain"][:, 0]
|
|
@@ -44,15 +44,15 @@ class MaterialPoint:
|
|
|
44
44
|
_tol: float = 1e-9
|
|
45
45
|
_maxIter: int = 50
|
|
46
46
|
|
|
47
|
-
def __init__(self,
|
|
48
|
-
assert isinstance(
|
|
49
|
-
assert
|
|
50
|
-
self.
|
|
47
|
+
def __init__(self, behavior: Behavior):
|
|
48
|
+
assert isinstance(behavior, Behavior), "behavior must be a Behavior"
|
|
49
|
+
assert behavior.dim == 3, "a material point runs the 3D behavior"
|
|
50
|
+
self.__behavior = behavior
|
|
51
51
|
|
|
52
52
|
@property
|
|
53
|
-
def
|
|
53
|
+
def behavior(self) -> Behavior:
|
|
54
54
|
"""The material being driven."""
|
|
55
|
-
return self.
|
|
55
|
+
return self.__behavior
|
|
56
56
|
|
|
57
57
|
@staticmethod
|
|
58
58
|
def __fe(vec: _types.FloatArray) -> FeArray.FeArrayALike:
|
|
@@ -73,7 +73,7 @@ class MaterialPoint:
|
|
|
73
73
|
stress : dict[str, FloatArray], optional
|
|
74
74
|
stress targets for the remaining components; those left out are held at zero
|
|
75
75
|
dt : float, optional
|
|
76
|
-
time increment per step, needed by rate-dependent
|
|
76
|
+
time increment per step, needed by rate-dependent behaviors
|
|
77
77
|
|
|
78
78
|
Returns
|
|
79
79
|
-------
|
|
@@ -109,7 +109,7 @@ class MaterialPoint:
|
|
|
109
109
|
# one point, so the fields are read back as plain 6-vectors
|
|
110
110
|
sig = zNew = ok = None
|
|
111
111
|
for _ in range(self._maxIter):
|
|
112
|
-
sig_e_pg, C_e_pg, zNew, ok = self.
|
|
112
|
+
sig_e_pg, C_e_pg, zNew, ok = self.__behavior.Integrate(
|
|
113
113
|
self.__fe(eps), z, dt
|
|
114
114
|
)
|
|
115
115
|
sig = np.asarray(sig_e_pg)[0, 0]
|
|
@@ -123,7 +123,7 @@ class MaterialPoint:
|
|
|
123
123
|
|
|
124
124
|
assert (
|
|
125
125
|
ok is not None and ok.all()
|
|
126
|
-
), f"the
|
|
126
|
+
), f"the behavior did not converge at step {k} - reduce the step size"
|
|
127
127
|
z = zNew
|
|
128
128
|
history.append((eps.copy(), sig.copy(), np.asarray(z)[0, 0].copy()))
|
|
129
129
|
|
|
@@ -132,7 +132,7 @@ class MaterialPoint:
|
|
|
132
132
|
"stress": np.array([h[1] for h in history]),
|
|
133
133
|
"state": np.array([h[2] for h in history]),
|
|
134
134
|
}
|
|
135
|
-
for name, slot in self.
|
|
135
|
+
for name, slot in self.__behavior.layout.slots.items():
|
|
136
136
|
values = out["state"][:, slot]
|
|
137
137
|
# str(), so callers get a plain-string dict whatever the layout keys are
|
|
138
138
|
out[str(name)] = values[:, 0] if values.shape[1] == 1 else values
|
|
@@ -31,8 +31,8 @@ from typing import NamedTuple
|
|
|
31
31
|
|
|
32
32
|
import numpy as np
|
|
33
33
|
|
|
34
|
-
from
|
|
35
|
-
from
|
|
34
|
+
from ...FEM._linalg import FeArray, TensorProd
|
|
35
|
+
from ...Utilities import _types
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
class Return(NamedTuple):
|
|
@@ -174,7 +174,10 @@ def Tangent(eigen: Eigenspace, res: Return, C_e_pg: FeArray) -> FeArray:
|
|
|
174
174
|
dsig_e_pg = _Field(eigen.T, y_e_pg) @ -w_e_pg
|
|
175
175
|
safe_e_pg = np.where(res.phi > 0, res.phi, 1.0)
|
|
176
176
|
n_e_pg = (_Field(eigen.Ti.T, y_e_pg) @ w_e_pg) / safe_e_pg
|
|
177
|
-
|
|
177
|
+
# drdtheta is zero where nothing flowed, and those points keep the elastic stiffness below;
|
|
178
|
+
# guard the division rather than let inf reach the tensor product and come back as nan
|
|
179
|
+
slope_e_pg = np.where(res.active, res.drdtheta, 1.0)
|
|
180
|
+
dtheta_e_pg = -(1.0 - res.theta * res.slope) / slope_e_pg
|
|
178
181
|
|
|
179
182
|
C_alg = elastic_e_pg + TensorProd(dtheta_e_pg * dsig_e_pg, C_e_pg @ n_e_pg)
|
|
180
183
|
# a point that never yielded keeps the elastic stiffness, whatever the algebra says
|
|
@@ -8,14 +8,7 @@
|
|
|
8
8
|
from . import Beam
|
|
9
9
|
from . import Elastic
|
|
10
10
|
from . import HyperElastic
|
|
11
|
-
from . import
|
|
12
|
-
from . import KinematicHardening
|
|
13
|
-
from . import ViscoPlastic
|
|
14
|
-
from . import ViscoElastic
|
|
15
|
-
from . import Yield
|
|
16
|
-
from ._behaviour import Behaviour
|
|
17
|
-
from ._materialpoint import MaterialPoint
|
|
18
|
-
from .Yield import YieldSurface
|
|
11
|
+
from . import InElastic
|
|
19
12
|
from ._phasefield import PhaseField
|
|
20
13
|
from ._thermal import Thermal
|
|
21
14
|
from ._weakforms import WeakForms
|
|
@@ -11,7 +11,7 @@ from ._utils import Save_pickle, Load_pickle
|
|
|
11
11
|
# ------------------------------------------------------------------------------
|
|
12
12
|
# simulations
|
|
13
13
|
# ------------------------------------------------------------------------------
|
|
14
|
-
from .
|
|
14
|
+
from ._inelastic import InElastic
|
|
15
15
|
from ._elastic import Elastic, Mesh_Optim_ZZ1
|
|
16
16
|
from ._hyperelastic import HyperElastic
|
|
17
17
|
from ._phasefield import PhaseField
|
|
@@ -26,7 +26,7 @@ from .Solvers import AlgoType
|
|
|
26
26
|
class Elastic(_Simu):
|
|
27
27
|
r"""Linear (small-strain) elasticity simulation.
|
|
28
28
|
|
|
29
|
-
Solves the static, quasi-static or dynamic equilibrium of a linear-elastic body under body forces, surface tractions and Dirichlet conditions, in 1D/2D/3D. Transient and dynamic analyses use the available time schemes (Newmark, HHT, midpoint, …) and support Rayleigh damping. Material
|
|
29
|
+
Solves the static, quasi-static or dynamic equilibrium of a linear-elastic body under body forces, surface tractions and Dirichlet conditions, in 1D/2D/3D. Transient and dynamic analyses use the available time schemes (Newmark, HHT, midpoint, …) and support Rayleigh damping. Material behavior is supplied by an elastic model (isotropic, anisotropic, …).
|
|
30
30
|
|
|
31
31
|
Strong form:
|
|
32
32
|
|
|
@@ -31,7 +31,7 @@ from ._simu import _Simu, AlgoType
|
|
|
31
31
|
class HyperElastic(_Simu):
|
|
32
32
|
r"""Finite-strain (large-deformation) hyperelastic simulation, total-Lagrangian framework.
|
|
33
33
|
|
|
34
|
-
Solves the nonlinear static or dynamic equilibrium of a hyperelastic body with a Newton-Raphson scheme, with optional Kelvin-Voigt viscosity and a fiber active stress (e.g. for cardiac mechanics). Material
|
|
34
|
+
Solves the nonlinear static or dynamic equilibrium of a hyperelastic body with a Newton-Raphson scheme, with optional Kelvin-Voigt viscosity and a fiber active stress (e.g. for cardiac mechanics). Material behavior is supplied by a hyperelastic model (Saint-Venant-Kirchhoff, Neo-Hookean, Mooney-Rivlin, Holzapfel-Ogden, …).
|
|
35
35
|
|
|
36
36
|
Weak form:
|
|
37
37
|
|
easyfea-3.3.0/EasyFEA/Simulations/_behaviour.py → easyfea-3.4.0/EasyFEA/Simulations/_inelastic.py
RENAMED
|
@@ -15,16 +15,16 @@ if TYPE_CHECKING:
|
|
|
15
15
|
from ..FEM import MatrixType, FeArray, Operators
|
|
16
16
|
|
|
17
17
|
from ..Models import ModelType, Result_strain_or_stress_field_e
|
|
18
|
-
from ..Models.
|
|
18
|
+
from ..Models.InElastic._behavior import Behavior
|
|
19
19
|
|
|
20
20
|
from ._simu import _Simu
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
class
|
|
23
|
+
class InElastic(_Simu):
|
|
24
24
|
r"""Quasi-static mechanics with a history-dependent material.
|
|
25
25
|
|
|
26
26
|
Solves :math:`\diver{\Sig} + \fb = 0` by Newton-Raphson, where the stress comes from
|
|
27
|
-
:meth:`~EasyFEA.Models.
|
|
27
|
+
:meth:`~EasyFEA.Models.Behavior.Integrate` rather than from a fixed :math:`\Crm`. The
|
|
28
28
|
material owns the constitutive integration; this class owns the equilibrium iteration and
|
|
29
29
|
the internal-variable history.
|
|
30
30
|
|
|
@@ -36,7 +36,7 @@ class Behaviour(_Simu):
|
|
|
36
36
|
def __init__(
|
|
37
37
|
self,
|
|
38
38
|
mesh: "Mesh",
|
|
39
|
-
model:
|
|
39
|
+
model: Behavior,
|
|
40
40
|
folder: str = "",
|
|
41
41
|
verbosity: bool = False,
|
|
42
42
|
absTol: float = 1e-6,
|
|
@@ -44,13 +44,13 @@ class Behaviour(_Simu):
|
|
|
44
44
|
incTol: float = 1e-11,
|
|
45
45
|
maxIter: int = 20,
|
|
46
46
|
):
|
|
47
|
-
"""Creates a
|
|
47
|
+
"""Creates a behavior simulation.
|
|
48
48
|
|
|
49
49
|
Parameters
|
|
50
50
|
----------
|
|
51
51
|
mesh : Mesh
|
|
52
52
|
The mesh used.
|
|
53
|
-
model :
|
|
53
|
+
model : Behavior
|
|
54
54
|
The material.
|
|
55
55
|
folder : str, optional
|
|
56
56
|
save folder, by default "".
|
|
@@ -61,7 +61,7 @@ class Behaviour(_Simu):
|
|
|
61
61
|
maxIter : int, optional
|
|
62
62
|
maximum Newton iterations, by default 20.
|
|
63
63
|
"""
|
|
64
|
-
assert isinstance(model,
|
|
64
|
+
assert isinstance(model, Behavior), "model must be a Behavior"
|
|
65
65
|
super().__init__(mesh, model, folder, verbosity)
|
|
66
66
|
|
|
67
67
|
self._Solver_Set_Newton_Raphson_Algorithm(absTol, relTol, incTol, maxIter)
|
|
@@ -81,7 +81,7 @@ class Behaviour(_Simu):
|
|
|
81
81
|
self.__dt = value
|
|
82
82
|
|
|
83
83
|
@property
|
|
84
|
-
def material(self) ->
|
|
84
|
+
def material(self) -> Behavior:
|
|
85
85
|
"""The material."""
|
|
86
86
|
return self.model # type: ignore
|
|
87
87
|
|
|
@@ -26,7 +26,7 @@ from .Solvers import AlgoType
|
|
|
26
26
|
class Thermal(_Simu):
|
|
27
27
|
r"""Heat-transfer (thermal) simulation.
|
|
28
28
|
|
|
29
|
-
Solves the steady-state or transient temperature field driven by conduction, a volumetric source and Neumann/Dirichlet conditions, in 1D/2D/3D. Transient analyses use the parabolic time scheme. Material
|
|
29
|
+
Solves the steady-state or transient temperature field driven by conduction, a volumetric source and Neumann/Dirichlet conditions, in 1D/2D/3D. Transient analyses use the parabolic time scheme. Material behavior (conductivity ``k`` and heat capacity ``ρc``) is supplied by a thermal model.
|
|
30
30
|
|
|
31
31
|
Strong form:
|
|
32
32
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: easyfea
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.4.0
|
|
4
4
|
Summary: User-friendly Python library that simplifies finite element analysis.
|
|
5
5
|
Author-email: Matthieu Noel <matthieu.noel7@gmail.com>
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -737,7 +737,7 @@ Dynamic: license-file
|
|
|
737
737
|
|
|
738
738
|
1. [Linear elastic simulations](https://easyfea.readthedocs.io/en/stable/examples/LinearizedElasticity/index.html): `static`, `dynamic`, `homogenization` and `mesh optimization`.
|
|
739
739
|
2. [Hyperelastic simulations](https://easyfea.readthedocs.io/en/stable/examples/Hyperelasticity/index.html): `static` and `dynamic` in the ``Lagrangian`` framework..
|
|
740
|
-
3. [
|
|
740
|
+
3. [Inelastic simulations](https://easyfea.readthedocs.io/en/stable/examples/Inelasticity/index.html): small-strain `plasticity`, `viscoplasticity` and `viscoelasticity`, assembled from a yield surface, hardening, a back-stress, a rate law and Maxwell branches.
|
|
741
741
|
4. [Cardiac elasto-dynamics](https://easyfea.readthedocs.io/en/stable/examples/CardiacElastoDynamics/index.html): passive + active hyperelastic `mono-ventricular` left-ventricle benchmark.
|
|
742
742
|
5. [Contact simulations](https://easyfea.readthedocs.io/en/stable/examples/Contact/index.html): frictionless ``penalty`` contact against a rigid obstacle
|
|
743
743
|
6. [Euler-Bernoulli and Timoshenko beam simulations](https://easyfea.readthedocs.io/en/stable/examples/Beam/index.html): `static` and `dynamic`.
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
1. [Linear elastic simulations](https://easyfea.readthedocs.io/en/stable/examples/LinearizedElasticity/index.html): `static`, `dynamic`, `homogenization` and `mesh optimization`.
|
|
19
19
|
2. [Hyperelastic simulations](https://easyfea.readthedocs.io/en/stable/examples/Hyperelasticity/index.html): `static` and `dynamic` in the ``Lagrangian`` framework..
|
|
20
|
-
3. [
|
|
20
|
+
3. [Inelastic simulations](https://easyfea.readthedocs.io/en/stable/examples/Inelasticity/index.html): small-strain `plasticity`, `viscoplasticity` and `viscoelasticity`, assembled from a yield surface, hardening, a back-stress, a rate law and Maxwell branches.
|
|
21
21
|
4. [Cardiac elasto-dynamics](https://easyfea.readthedocs.io/en/stable/examples/CardiacElastoDynamics/index.html): passive + active hyperelastic `mono-ventricular` left-ventricle benchmark.
|
|
22
22
|
5. [Contact simulations](https://easyfea.readthedocs.io/en/stable/examples/Contact/index.html): frictionless ``penalty`` contact against a rigid obstacle
|
|
23
23
|
6. [Euler-Bernoulli and Timoshenko beam simulations](https://easyfea.readthedocs.io/en/stable/examples/Beam/index.html): `static` and `dynamic`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: easyfea
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.4.0
|
|
4
4
|
Summary: User-friendly Python library that simplifies finite element analysis.
|
|
5
5
|
Author-email: Matthieu Noel <matthieu.noel7@gmail.com>
|
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
|
@@ -737,7 +737,7 @@ Dynamic: license-file
|
|
|
737
737
|
|
|
738
738
|
1. [Linear elastic simulations](https://easyfea.readthedocs.io/en/stable/examples/LinearizedElasticity/index.html): `static`, `dynamic`, `homogenization` and `mesh optimization`.
|
|
739
739
|
2. [Hyperelastic simulations](https://easyfea.readthedocs.io/en/stable/examples/Hyperelasticity/index.html): `static` and `dynamic` in the ``Lagrangian`` framework..
|
|
740
|
-
3. [
|
|
740
|
+
3. [Inelastic simulations](https://easyfea.readthedocs.io/en/stable/examples/Inelasticity/index.html): small-strain `plasticity`, `viscoplasticity` and `viscoelasticity`, assembled from a yield surface, hardening, a back-stress, a rate law and Maxwell branches.
|
|
741
741
|
4. [Cardiac elasto-dynamics](https://easyfea.readthedocs.io/en/stable/examples/CardiacElastoDynamics/index.html): passive + active hyperelastic `mono-ventricular` left-ventricle benchmark.
|
|
742
742
|
5. [Contact simulations](https://easyfea.readthedocs.io/en/stable/examples/Contact/index.html): frictionless ``penalty`` contact against a rigid obstacle
|
|
743
743
|
6. [Euler-Bernoulli and Timoshenko beam simulations](https://easyfea.readthedocs.io/en/stable/examples/Beam/index.html): `static` and `dynamic`.
|
|
@@ -35,17 +35,9 @@ EasyFEA/Geoms/_geom.py
|
|
|
35
35
|
EasyFEA/Geoms/_line.py
|
|
36
36
|
EasyFEA/Geoms/_points.py
|
|
37
37
|
EasyFEA/Geoms/_utils.py
|
|
38
|
-
EasyFEA/Models/IsotropicHardening.py
|
|
39
|
-
EasyFEA/Models/KinematicHardening.py
|
|
40
|
-
EasyFEA/Models/ViscoElastic.py
|
|
41
|
-
EasyFEA/Models/ViscoPlastic.py
|
|
42
|
-
EasyFEA/Models/Yield.py
|
|
43
38
|
EasyFEA/Models/__init__.py
|
|
44
|
-
EasyFEA/Models/_behaviour.py
|
|
45
39
|
EasyFEA/Models/_kelvin.py
|
|
46
|
-
EasyFEA/Models/_materialpoint.py
|
|
47
40
|
EasyFEA/Models/_phasefield.py
|
|
48
|
-
EasyFEA/Models/_spectral.py
|
|
49
41
|
EasyFEA/Models/_thermal.py
|
|
50
42
|
EasyFEA/Models/_utils.py
|
|
51
43
|
EasyFEA/Models/_weakforms.py
|
|
@@ -56,13 +48,22 @@ EasyFEA/Models/Elastic/_laws.py
|
|
|
56
48
|
EasyFEA/Models/HyperElastic/__init__.py
|
|
57
49
|
EasyFEA/Models/HyperElastic/_laws.py
|
|
58
50
|
EasyFEA/Models/HyperElastic/_state.py
|
|
51
|
+
EasyFEA/Models/InElastic/IsotropicHardening.py
|
|
52
|
+
EasyFEA/Models/InElastic/KinematicHardening.py
|
|
53
|
+
EasyFEA/Models/InElastic/ViscoElastic.py
|
|
54
|
+
EasyFEA/Models/InElastic/ViscoPlastic.py
|
|
55
|
+
EasyFEA/Models/InElastic/Yield.py
|
|
56
|
+
EasyFEA/Models/InElastic/__init__.py
|
|
57
|
+
EasyFEA/Models/InElastic/_behavior.py
|
|
58
|
+
EasyFEA/Models/InElastic/_materialpoint.py
|
|
59
|
+
EasyFEA/Models/InElastic/_spectral.py
|
|
59
60
|
EasyFEA/Simulations/Solvers.py
|
|
60
61
|
EasyFEA/Simulations/__init__.py
|
|
61
62
|
EasyFEA/Simulations/_beam.py
|
|
62
|
-
EasyFEA/Simulations/_behaviour.py
|
|
63
63
|
EasyFEA/Simulations/_dic.py
|
|
64
64
|
EasyFEA/Simulations/_elastic.py
|
|
65
65
|
EasyFEA/Simulations/_hyperelastic.py
|
|
66
|
+
EasyFEA/Simulations/_inelastic.py
|
|
66
67
|
EasyFEA/Simulations/_phasefield.py
|
|
67
68
|
EasyFEA/Simulations/_simu.py
|
|
68
69
|
EasyFEA/Simulations/_thermal.py
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "easyfea"
|
|
7
|
-
version = "3.
|
|
7
|
+
version = "3.4.0"
|
|
8
8
|
description = "User-friendly Python library that simplifies finite element analysis."
|
|
9
9
|
authors = [{ name = "Matthieu Noel", email = "matthieu.noel7@gmail.com" }]
|
|
10
10
|
readme = "README.md"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|