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.
Files changed (95) hide show
  1. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/Beam/_beam.py +13 -9
  2. {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/IsotropicHardening.py +1 -1
  3. {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/KinematicHardening.py +2 -2
  4. {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/ViscoPlastic.py +1 -1
  5. {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/Yield.py +4 -4
  6. easyfea-3.4.0/EasyFEA/Models/InElastic/__init__.py +15 -0
  7. easyfea-3.3.0/EasyFEA/Models/_behaviour.py → easyfea-3.4.0/EasyFEA/Models/InElastic/_behavior.py +47 -42
  8. {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/_materialpoint.py +19 -19
  9. {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/_spectral.py +6 -3
  10. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/__init__.py +1 -8
  11. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/__init__.py +1 -1
  12. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_elastic.py +1 -1
  13. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_hyperelastic.py +1 -1
  14. easyfea-3.3.0/EasyFEA/Simulations/_behaviour.py → easyfea-3.4.0/EasyFEA/Simulations/_inelastic.py +8 -8
  15. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_thermal.py +1 -1
  16. {easyfea-3.3.0/easyfea.egg-info → easyfea-3.4.0}/PKG-INFO +2 -2
  17. {easyfea-3.3.0 → easyfea-3.4.0}/README.md +1 -1
  18. {easyfea-3.3.0 → easyfea-3.4.0/easyfea.egg-info}/PKG-INFO +2 -2
  19. {easyfea-3.3.0 → easyfea-3.4.0}/easyfea.egg-info/SOURCES.txt +10 -9
  20. {easyfea-3.3.0 → easyfea-3.4.0}/pyproject.toml +1 -1
  21. {easyfea-3.3.0 → easyfea-3.4.0}/AUTHORS.md +0 -0
  22. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/__init__.py +0 -0
  23. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_beam.py +0 -0
  24. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_hexa.py +0 -0
  25. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_point.py +0 -0
  26. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_prism.py +0 -0
  27. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_quad.py +0 -0
  28. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_seg.py +0 -0
  29. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_tetra.py +0 -0
  30. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Elems/_tri.py +0 -0
  31. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Operators/Bilinear.py +0 -0
  32. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Operators/Linear.py +0 -0
  33. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Operators/NonLinear.py +0 -0
  34. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/Operators/__init__.py +0 -0
  35. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/__init__.py +0 -0
  36. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_boundary_conditions.py +0 -0
  37. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_field.py +0 -0
  38. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_forms.py +0 -0
  39. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_gauss.py +0 -0
  40. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_group_elem.py +0 -0
  41. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_linalg.py +0 -0
  42. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_mesh.py +0 -0
  43. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_mesher.py +0 -0
  44. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/FEM/_utils.py +0 -0
  45. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/__init__.py +0 -0
  46. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_circle.py +0 -0
  47. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_contour.py +0 -0
  48. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_domain.py +0 -0
  49. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_geom.py +0 -0
  50. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_line.py +0 -0
  51. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_points.py +0 -0
  52. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Geoms/_utils.py +0 -0
  53. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/Beam/__init__.py +0 -0
  54. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/Elastic/__init__.py +0 -0
  55. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/Elastic/_laws.py +0 -0
  56. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/HyperElastic/__init__.py +0 -0
  57. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/HyperElastic/_laws.py +0 -0
  58. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/HyperElastic/_state.py +0 -0
  59. {easyfea-3.3.0/EasyFEA/Models → easyfea-3.4.0/EasyFEA/Models/InElastic}/ViscoElastic.py +0 -0
  60. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/_kelvin.py +0 -0
  61. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/_phasefield.py +0 -0
  62. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/_thermal.py +0 -0
  63. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/_utils.py +0 -0
  64. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Models/_weakforms.py +0 -0
  65. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/Solvers.py +0 -0
  66. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_beam.py +0 -0
  67. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_dic.py +0 -0
  68. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_phasefield.py +0 -0
  69. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_simu.py +0 -0
  70. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_utils.py +0 -0
  71. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Simulations/_weakforms.py +0 -0
  72. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/Folder.py +0 -0
  73. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/GLTF.py +0 -0
  74. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/Matplotlib.py +0 -0
  75. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/MeshIO.py +0 -0
  76. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/Paraview.py +0 -0
  77. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/PyVista.py +0 -0
  78. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/Terminal.py +0 -0
  79. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/USD.py +0 -0
  80. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/Vizir.py +0 -0
  81. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/__init__.py +0 -0
  82. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_cache.py +0 -0
  83. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_mpi.py +0 -0
  84. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_observers.py +0 -0
  85. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_params.py +0 -0
  86. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_requires.py +0 -0
  87. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_tic.py +0 -0
  88. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/Utilities/_types.py +0 -0
  89. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/__about__.py +0 -0
  90. {easyfea-3.3.0 → easyfea-3.4.0}/EasyFEA/__init__.py +0 -0
  91. {easyfea-3.3.0 → easyfea-3.4.0}/LICENSE.txt +0 -0
  92. {easyfea-3.3.0 → easyfea-3.4.0}/easyfea.egg-info/dependency_links.txt +0 -0
  93. {easyfea-3.3.0 → easyfea-3.4.0}/easyfea.egg-info/requires.txt +0 -0
  94. {easyfea-3.3.0 → easyfea-3.4.0}/easyfea.egg-info/top_level.txt +0 -0
  95. {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 Mesh, _GroupElem, FeArray, MatrixType, ElemType
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"""
@@ -20,7 +20,7 @@ from typing import Callable, NamedTuple
20
20
 
21
21
  import numpy as np
22
22
 
23
- from ..FEM._linalg import FeArray
23
+ from ...FEM._linalg import FeArray
24
24
 
25
25
 
26
26
  class IsotropicHardening(NamedTuple):
@@ -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 ..FEM._linalg import FeArray
25
+ from ...FEM._linalg import FeArray
26
26
 
27
27
 
28
28
  class KinematicHardening(NamedTuple):
@@ -20,7 +20,7 @@ from typing import Callable, NamedTuple
20
20
 
21
21
  import numpy as np
22
22
 
23
- from ..FEM._linalg import FeArray
23
+ from ...FEM._linalg import FeArray
24
24
 
25
25
  _TINY = 1e-300
26
26
  """Floor on the rate, so the inverse and its slope stay finite at zero flow."""
@@ -14,9 +14,9 @@ from typing import Callable, NamedTuple, Optional
14
14
 
15
15
  import numpy as np
16
16
 
17
- from . import _kelvin
18
- from ..FEM._linalg import FeArray, Norm, TensorProd
19
- from ..Utilities import _types
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:`.Behaviour` dispatches on.
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
@@ -5,7 +5,7 @@
5
5
 
6
6
  r"""Materials whose stress depends on the strain history.
7
7
 
8
- A :class:`Behaviour` is declared by a free energy and, once it can flow, a yield surface:
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 ``Behaviour`` is incremental and carries state.
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 ._utils import _IModel, ModelType
27
- from .Elastic._laws import _Elastic
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 ..FEM._linalg import FeArray, TensorProd
35
- from ..Utilities import _params, _types, Tic
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 behaviour can carry.
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 Behaviour(_IModel):
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 behaviour.
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(yieldSurface, YieldSurface), (
140
- "yieldSurface must be a YieldSurface"
141
- )
142
- assert hardening is None or isinstance(hardening, IsotropicHardening), (
143
- "hardening must be an IsotropicHardening"
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(isinstance(branch, Maxwell) for branch in branches), (
159
- "branches must be Maxwell branches"
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(branch.tau > 0 for branch in branches), (
174
- "every branch tau must be > 0"
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 sum(branch.g for branch in branches) < 1.0, (
178
- "the branch stiffness fractions must sum to less than 1"
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 Behaviour solves for displacement, so it reports the displacement problem type
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 (Ne, nPg, nstrain)
771
- Total strain, Kelvin-Mandel, in the model dimension.
772
- zOld_e_pg : FeArray (Ne, nPg, n), optional
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 behaviour, ignored otherwise.
776
- epsOld_e_pg : FeArray (Ne, nPg, nstrain), optional
777
- Total strain at the last converged step, supplied by the solver and never stored --
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 (Ne, nPg, nstrain)
790
- C_alg : FeArray (Ne, nPg, nstrain, nstrain) or None
791
- z : FeArray (Ne, nPg, n)
792
- Trial state — the caller commits it only once the global step converges.
793
- converged : FeArray (Ne, nPg) of bool
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 not fields, (
796
- "external fields are not read yet (thermo-mechanical coupling)"
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 behaviour needs a positive time increment; "
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", "Behaviour integrate", False)
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 behaviour at a single material point, with no mesh and no solver."""
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 ._behaviour import Behaviour
13
- from ..FEM._linalg import FeArray
14
- from ..Utilities import _types
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.Behaviour` on one Gauss point.
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 behaviour, not a second implementation of it.
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.Behaviour(3, Isotropic(3, E=210e3, v=0.3),
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, behaviour: Behaviour):
48
- assert isinstance(behaviour, Behaviour), "behaviour must be a Behaviour"
49
- assert behaviour.dim == 3, "a material point runs the 3D behaviour"
50
- self.__behaviour = behaviour
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 behaviour(self) -> Behaviour:
53
+ def behavior(self) -> Behavior:
54
54
  """The material being driven."""
55
- return self.__behaviour
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 behaviours
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.__behaviour.Integrate(
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 behaviour did not converge at step {k} - reduce the step size"
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.__behaviour.layout.slots.items():
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 ..FEM._linalg import FeArray, TensorProd
35
- from ..Utilities import _types
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
- dtheta_e_pg = -(1.0 - res.theta * res.slope) / res.drdtheta
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 IsotropicHardening
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 ._behaviour import Behaviour
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 behaviour is supplied by an elastic model (isotropic, anisotropic, …).
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 behaviour is supplied by a hyperelastic model (Saint-Venant-Kirchhoff, Neo-Hookean, Mooney-Rivlin, Holzapfel-Ogden, …).
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
 
@@ -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._behaviour import Behaviour as _Behaviour
18
+ from ..Models.InElastic._behavior import Behavior
19
19
 
20
20
  from ._simu import _Simu
21
21
 
22
22
 
23
- class Behaviour(_Simu):
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.Behaviour.Integrate` rather than from a fixed :math:`\Crm`. The
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: _Behaviour,
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 behaviour simulation.
47
+ """Creates a behavior simulation.
48
48
 
49
49
  Parameters
50
50
  ----------
51
51
  mesh : Mesh
52
52
  The mesh used.
53
- model : Behaviour
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, _Behaviour), "model must be a Behaviour"
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) -> _Behaviour:
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 behaviour (conductivity ``k`` and heat capacity ``ρc``) is supplied by a thermal model.
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.0
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. [Materials with history](https://easyfea.readthedocs.io/en/stable/examples/Behaviour/index.html): small-strain `plasticity`, `viscoplasticity` and `viscoelasticity`, assembled from a yield surface, hardening, a back-stress, a rate law and Maxwell branches.
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. [Materials with history](https://easyfea.readthedocs.io/en/stable/examples/Behaviour/index.html): small-strain `plasticity`, `viscoplasticity` and `viscoelasticity`, assembled from a yield surface, hardening, a back-stress, a rate law and Maxwell branches.
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.0
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. [Materials with history](https://easyfea.readthedocs.io/en/stable/examples/Behaviour/index.html): small-strain `plasticity`, `viscoplasticity` and `viscoelasticity`, assembled from a yield surface, hardening, a back-stress, a rate law and Maxwell branches.
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.3.0"
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