This document describes the changes made to the project.
- Added
jaxdependency in.readthedocs.yaml.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v3.5.0...v3.5.1
- Added
AlgoType.hht_newmark, the HHT-Newmark time-integration scheme of Doyen, Ern & Piperno (SIAM J. Sci. Comput. 33(1), 2011). Unlike the existing generalized-alpha-styleAlgoType.hht, which blends mass, damping and stiffness all by(1-alpha), this keeps the mass term at the full step and only shifts the stiffness (internal force) and external load — the discretization the paper proves second-order and unconditionally stable foralphain[0, 1/3].betaandgammaare derived fromalpharather than left free, since the stability/accuracy proof only covers that specific pair. - Added
Models.HyperElastic.AutoDiff(issue #53): a hyperelastic law declared from its potentialW(C)alone, differentiated byjax(pip install easyfea[jax]) instead of a hand-writtenCompute_dWde/Compute_d2Wde. Checked against every shipped law's own closed-form derivatives; seeexamples/Hyperelasticity/AutoDiffPotential.py. - Examples: the cardiac elastodynamics examples (
BiVentricular.py,MonoVentricular.py) now share their material setup throughGet_materialinexamples/CardiacElastoDynamics/utils.py.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v3.4.1...v3.5.0
- Fixed the Python 3.9 import:
FEM/_mesher.pyusedtyping.ParamSpec, which needs 3.10, soimport EasyFEAfailed on 3.9 in 3.3.0 and 3.4.0.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v3.4.0...v3.4.1
- Renamed the 3.3.0 materials-with-history API (breaking, no aliases kept):
Simulations.Behaviouris nowSimulations.InElastic,Models.Behaviouris nowModels.InElastic.Behavior, andYield,IsotropicHardening,KinematicHardening,ViscoPlastic,ViscoElasticandMaterialPointall moved underModels.InElastic. The examples moved fromexamples/Behaviour/toexamples/Inelasticity/. - Fixed a division by zero in the spectral return at Gauss points where nothing flowed; it was masked out of the result but emitted
RuntimeWarnings on every 3.3.0 solve. - Examples: assertions now check only analytic, mesh-independent quantities;
ThickCylinderruns one mesh and one pressure ramp instead of a refinement study; removedSpringBack, which had no closed form to check against. - Docs:
autodoc_default_optionsset"imported-members": False, which Sphinx reads asTruesincebool_option()maps any value to true, so every module documented the names it imported. Removed, together with the fifteen:exclude-members:lists that existed to undo it.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v3.3.0...v3.4.0
- Materials with history (issue #48)
- Added a small-strain, quasi-static framework for materials whose stress depends on the history of strain — plasticity, viscoplasticity and viscoelasticity — with
Simulations.BehaviourandModels.Behaviour. With no internal variables it reproducesSimulations.Elasticto machine precision. - A behaviour is assembled from independent pieces rather than chosen from a list: an elastic law, plus any of a yield surface (
Models.Yield: von Mises, Hill, Drucker-Prager), isotropic hardening (Models.IsotropicHardening: linear, Voce, Swift), a back-stress (Models.KinematicHardening: Prager, Armstrong-Frederick, Chaboche), a rate law (Models.ViscoPlastic: Norton, Perzyna) and Maxwell branches (Models.ViscoElastic). Hardening lives in the free energy rather than inside the yield function, so N surfaces and M hardening laws are N + M objects instead of N × M. - Two local solvers, chosen automatically;
solver="newton"forces the general one. The implicit solve advances every internal variable by backward Euler and solves one system per Gauss point over the state increments anddGamma, with the consistent tangent read off the converged local Jacobian. The spectral return applies when the yield surface is quadratic (phi^2 = sig:P:sig) with homogeneousCand no kinematic hardening or viscous branches: diagonalisingC^1/2 P C^1/2once per material reduces the local problem to one scalar unknown, for any linear elasticity rather than isotropic only. Where both apply they agree to machine precision on stress, state and tangent, which is a test. Models.MaterialPointdrives a behaviour at a single Gauss point with no mesh and no solver, holding the un-driven components stress- or strain-controlled — the same code path assembly uses.Behaviour.Integratetakes the total strain and, optionally, the strain the increment started from (epsOld), supplied by the solver and never stored, so the state stays exactly the history variables. This matches MFront'seto/deto, Abaqus'STRAN/DSTRANand NEML'se_n, and leaves room for local sub-stepping._Elastic.Get_sqrt_C_Snow handles aCof any shape, including material properties given per Gauss point, and computes the square root by a batchedeighrather thannp.unique+sqrtm— faster even when only two distinct matrices exist. It also fixes a cache keyed onsqrt_Calone, which crashed after settingS, and a first call that returned the live cache where later calls returned a copy.- Added ten examples in
examples/Behaviour/, each checked against a closed form rather than against itself: uniaxial hardening curves, the Bauschinger effect, Chaboche superposition, Prony relaxation and Norton creep, Hill's thick cylinder, elastoplastic beam bending and the shape factor 3/2, a 3D tensile specimen, springback, and a relaxing perforated plate.
- Added a small-strain, quasi-static framework for materials whose stress depends on the history of strain — plasticity, viscoplasticity and viscoelasticity — with
FeArrayrefactor (issue #52)- A field's tensor rank is now
ndim - 2, always, and is never re-read from a shape coincidence: a(Ne, nPg)FeArray is a scalar field even whenNe,nPgand the tensor width collide. This fixes four separate places that each guessed a field from its shape, including reductions that read the result shape rather than the axis. - All override logic moved into
__array_ufunc__and__array_function__, as NumPy recommends, instead of also overriding operator special methods.out=/where=are stripped to stop the recursion they caused, and FeArray is stripped from arguments before delegating sonp.einsum'soptimize=path cannot re-enter the protocol. FeArray.broadcastis the single entry point for lifting a constant to a field;Reshape_variabledelegates to it.asfearraynow refusesndim < 2rather than silently returning a plain array, andzeros/onesaccept a shape tuple.
- A field's tensor rank is now
- Mesher and Geoms
Mesher: public 1D meshing, a geometry view on failure, a testable partitioner, and transfinite counts decided per curve and sized by the geometry that produced it.Geoms: points are exposed as read-only views so a geometry cannot desync, and point-in-geometry questions are answered directly instead of re-derived.- Surface reconstruction now works for a mesh holding several groups of elements.
- Tags and mesh I/O
- Tags are stored as node sets, each in its own gmsh entity. Previously
gmsh:geometricalwas left unset, so every element landed in entity 0 and every tag read back byMesher.Mesh_Import_meshcovered the whole mesh. Tags are sorted on the numbers they contain, soV2comes beforeV10. - Every tag now survives a round trip through meshio:
EasyFEA_to_Gmshwritesgmsh:physical, reading picks that array rather than letting a zeroedgmsh:geometricaloverwrite it, a name that is notP{i}/L{i}/S{i}/V{i}no longer raises, and an unnamed reference 0 no longer invents a tag on a mesh that had none.
- Tags are stored as node sets, each in its own gmsh entity. Previously
- MPI
Save_Iterwrites one file per rank, sliced to the local dofs.- Added reduction helpers,
Calc_Energyand_globalElements; partition arrays are sorted and results are stored with the nodes they cover.
HyperElastic:active_stressaccepts a per-element or per-Gauss-point field, and speed/acceleration field accessors were added._Eigen_values_vectors_projectors: usesnp.dividefor the guarded division.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v3.2.2...v3.3.0
- Generalized
TimeQuadratureStressTensorto non-midpoint schemes via acoefKargument. - Updated
simu.Resultfor phasefield and hyperelastic simulations.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v3.2.1...v3.2.2
- Cached the global sparse-matrix assembly so repeated assemblies (every Newton iteration and time step) reuse a precomputed reduction map instead of rebuilding the CSR from scratch — element-agnostic, with results unchanged to floating-point round-off (~1e-16 relative).
Simulations/_simu.py:__Assemble_csrcaches, per(dof_n, isMatrix, Ndof, contributing groups), a map from each element entry to its slot in the global CSR data (__Get_csr_map, via@cache_computed_values). The scatter then becomes a singlenp.bincountinto scipy's own canonical pattern — about 13x faster than the previouscsr_matrix((data, (rows, cols)))re-sort, cutting theMonoVentricularmatrix-assembly time by ~40%. The map is stored asint32and is rebuilt only when the groups /Ndof/dof_nchange or the mesh is reset.Simulations/_hyperelastic.py: the dynamic mass matrixthickness · ∫ρ N·N, constant across a solve, is now cached (__Mass_e, via@cache_computed_values) instead of rebuilt every Newton iteration; a heterogeneous (array)ρfalls back to a direct recompute.examples/CardiacElastoDynamics/MonoVentricular.py: the constant Robin surface-penalty tangents (top/epi) are built once and reused (_Get_Robin_surface_penalty, via@cache_computed_values), leaving only the state-dependent residual contractions in the assembly loop.- The geometry-derived caches (CSR reduction maps and mass matrices) are cleared together on mesh change /
_Gather, so they never go stale or accumulate across a remesh.
- The complete non-linear residual — internal, inertia and damping forces — is now assembled into
F_einsideConstruct_local_matrix_system, andNonLinear.KelvinVoigtDampingreturns its viscous residual alongside the configuration tangent and damping matrix. For a non-linear problem the solver no longer re-adds the time-scheme history terms (−C·v_t,−M·a_t); a custom simulation must therefore return the complete residual−R(u)in theF_eslot. See the updated "create a custom simulation" and pipeline how-tos. NonLinear.TimeQuadratureStressTensor: updated the adaptive-quadrature convergence criterion.PyVista.Plot: added ascalar_bar_kwargsargument to customise the scalar bar.- Updated the "create a geometry" how-to for the
copy=Trueargument.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v3.2.0...v3.2.1
- Energy-conserving stresses for
HyperElasticdynamics- The internal force can now be sampled by an energy-conserving stress, so a free (no external load, no damping)
AlgoType.midpointrun keeps the total energyKE + Wconstant where the defaultpointwisestress drifts.HyperElastic.StressTypeandSolver_Set_Stressselectpointwise(default),gonzalez, orquadrature; both non-default stresses requireAlgoType.midpoint. Operators/NonLinear.py: newGonzalezStressTensor— the energy-momentum discrete-gradient stressŜ = S̄ + α Δe, which conservesKE + Wexactly, for any law, from a single stress evaluation.Operators/NonLinear.py: newTimeQuadratureStressTensor— the PK2 stress averaged along the step's strain path∫₀¹ ∂W/∂e(eⁿ + s Δe) ds, integrated by a Clenshaw-Curtis rule (__clenshaw_curtis); a discrete gradient up to the quadrature error, which converges spectrally innPoints(1, 2, 3recover the midpoint, trapezoid and Simpson rules). Intermediate nodes are_StrainPathState, a strain-only state no displacement produces.Operators/NonLinear.py: new__AdaptiveTimeQuadratureStressTensor— passingquadTolinstead of a fixednPointsrefines the rule element by element until each element's own integrated energy defect∫ (S:Δe − ΔW)² dΩ ≤ quadTol² ∫ ΔW² dΩis met, spending points only where the step is nonlinear; the per-step point count is saved to the results asquadNPoints.Operators/NonLinear.py: newActiveStressTensor— the fiber active stressτ (T̂ ⊗ T̂)is assembled by its own operator and no longer folded intoCompute_dWde, which stays exactly∂W/∂e(the invariant the energy-based schemes rely on).- Added the
examples/Hyperelasticity/Hyperelas5.pyexample comparing the stress schemes on a free-vibrating cantilever (energy drift, cost, and adaptive point count).
- The internal force can now be sampled by an energy-conserving stress, so a free (no external load, no damping)
- Updated the Newton-Raphson convergence options.
PyVista._setCameraPosition: addedboundsarguments.- Updated
examples/CardiacElastoDynamics/MonoVentricular.pyand minor_group_elem.pycleanups.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v3.1.0...v3.2.0
- Contact (issue #47)
- Added a frictionless penalty-contact framework for unilateral contact against a rigid obstacle, solved as a non-linear problem with Newton-Raphson.
Operators/NonLinear.py: newPenaltyContactoperator returning the contact tangent/residual(K_e, F_e)from a precomputed signed normal gapgap_e_pgand outward unit normalnormal_e_pgsampled at the contact-surface Gauss points.FEM/_group_elem.py: added_GroupElem._Get_gap_and_normal, which projects the deformed contact-surface Gauss points onto a rigid obstacle to produce the gap and normal consumed byPenaltyContact.- Added examples in
examples/Contact/. - Removed the obsolete
examples/LinearizedElasticity/Contact1.pyexample.
- Cardiac elastodynamics (issue #42)
- Added the
BiVentricularexample (examples/CardiacElastoDynamics/BiVentricular.py) - Exposed the viscoelastic (Kelvin-Voigt) arguments in the
CardiacElastoDynamicsconstructor and updated its sharedutils.py.
- Added the
- Created a new LinearizedElasticity example according to discussion #49.
FeArray: added areshapeoverride that preserves the(Ne, nPg)element/Gauss-point leading axes when possible and otherwise degrades to a plain ndarray, and exposedravelas a reduction.Utilities/_tic.py: timing now usesMPI.Wtimewhen MPI is available andtime.perf_counterotherwise, instead oftime.time().NonLinear.FollowingPressure: updated the einsum contractions.PyVista.Plot_BoundaryConditions: added aopacityargument._mesher._Organise_Surfaces: reworked the surface-organisation logic.- Minor
_group_elem.pyandNormalizecleanups.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v3.0.0...v3.1.0
Breaking changes:
- Split the
Displaymodule into two focused modules, with no backward-compatibility shim (issue #46). Updatefrom EasyFEA import Displaytofrom EasyFEA import Matplotlib, Terminaland rename the calls accordingly.Matplotlib(renamed fromDisplay): all matplotlib plotting —Plot,Plot_Mesh,Plot_BoundaryConditions,Plot_Tags,Plot_Energy,Plot_Iter_Summary, theMovie_*functions,Save_fig,Init_Axes, the matplotlib re-exports, and therequires_matplotlibguard (e.g.Display.PlotbecomesMatplotlib.Plot).Terminal(new): console helpersMyPrint,MyPrintError,Section, andClear(e.g.Display.ClearbecomesTerminal.Clear).
Performance:
- Sped up FEM operator assembly, cutting the cardiac MonoVentricular matrix-assembly time by ~41% with results equivalent to within 1e-13; all changes are element-agnostic.
Operators/NonLinear.pyandOperators/Bilinear.py: fused the einsum contractions (collapsing the Gauss-point sum and dropping the large intermediates); the geometric tangent now exploits the block structureSig = I_dim (x) sig(textbookKsigma = g (x) I_dim), removing the dense 9x9Sigbuild and the wide contraction.Models/HyperElastic/_laws.py(HolzapfelOgden): common-subexpression elimination of the isotropic/anisotropic terms, dropped the identically-zerodWdI{4,6,8} * d2I{4,6,8}dCcontributions, and fibers are normalized once in the constructor.Models/HyperElastic/_state.py: the state no longer re-normalizes directions (now pre-normalized by the material), and__Build_Deis built loop-free.- Added the
Normalize(array, axis=-1)free function toEasyFEA.FEM.
Examples:
- Migrated every example (
Beam,CardiacElastoDynamics,DIC,Hyperelasticity,LinearizedElasticity,MachineLearning,Meshes,PhaseField,Thermal,WeakForms,HelloWorld) to the newMatplotlib/TerminalAPI (issue #46).
Documentation:
- Updated the README, the beginner's guide, and the how-to / API pages for the
Matplotlib/Terminalsplit. - Refreshed the "Create a custom simulation" guide for the multi-element-group
Construct_local_matrix_systemAPI (now returning{groupElem: (K_e, C_e, M_e, F_e)}overmesh.Get_list_groupElem(), with theGet_*integration helpers accessed ongroupElem), added an "Extend an existing simulation" section based on theMonoVentricularexample, and cross-linked the FEMOperatorscatalogue.
Other:
- Updated the
zorderandalphaarguments in the matplotlib plotting functions.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v2.0.0...v3.0.0
Meshes can now contain several element groups of the same (main) dimension, so mixed-element meshes are supported end-to-end — for example a contour meshed with Mesh_2D([], ElemType.QUAD4) in https://easyfea.readthedocs.io/en/stable/examples/Meshes/Mesh2_2D.html that gmsh fills with QUAD4 + TRI3 (issue #44).
Breaking changes:
mesh.groupElem,mesh.elemType, andmesh.connectnow raiseAmbiguousGroupErrorwhen more than one group shares the main dimension (they cannot return a single value for a mixed mesh). Iteratemesh.Get_list_groupElem(mesh.dim)instead.- Removed
mesh.Get_rows_e,mesh.Get_columns_e, andmesh.nPe; use the corresponding members on eachgroupElem(the assembly path already loops per group). - Renamed
Display.Plot_ResulttoDisplay.Plot.
Multi-element-type support (issue #44):
- Reworked the writers to loop over
mesh.Get_list_groupElem(dim), concatenating per-element results inmesh.Neorder:Display.Plot, the PyVista export (MeshIO),Mesher.Save_Simu, and theParaviewVTU/PVTU export (both serial and MPI). - Made the mesh utilities multi-group aware:
Elements_Nodes,Evaluate_dofsValues_at_coordinates,Get_meshSize,Get_Quality, and the MPI_Gather(coordinates are now gathered across every group). The generic result pathsimu._Get_valuesand the per-element stress/strain computations now assemble per group viagroupElem.Locates_sol_e. - Updated the core
Meshfunctions and meshing helpers to operate on the list of element groups and removed the internalmesh.__groupElemshortcut.
Display:
- Refactored the
Displayfunctions; renamedDisplay.Plot_ResulttoDisplay.Plotand reworkedPlot_Meshtogether with the handling of theresult,plotMesh, andplotDimarguments.
MPI:
- Improved MPI behavior in the simulations and in
Solvers.py(issues #26 and #44).
Other:
NonLinear.FollowingPressure: updated the argument order.- Removed
optimize="optimal"inEasyFEA/FEM/_linalg.py. - Added the
Homog5example to the documentation gallery, added a mesh-creation assertion in_beam.py, and fixed documentation warnings.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v1.11.0...v2.0.0
- Created the
EasyFEA.FEM.Operatorsmodule, gathering the element-level operators that integrate a form over the Gauss points (issue #43).Bilinear:UV,GradUGradV,GradU_A_GradV,LinearizedElasticity,MassAlongNormal, and the beam operatorsBeamBending,BeamShear,BeamStiffness,BeamMass.Linear:V.NonLinear:SecondPiolaKirchhoffStressTensor,KelvinVoigtDamping,FollowingPressure.- Refactored the simulations to assemble their element matrices through these operators.
- Introduced finite-strain viscosity and active stress in hyperelasticity (issue #42).
- Kelvin-Voigt viscosity
material.eta(large-strainΣ_visco = η·Ė), delivered throughNonLinear.KelvinVoigtDamping, which returns both the damping matrix and the configuration tangent so the gap is closed without touching the time-scheme coefficient mechanism. - Fiber active stress
material.active_stressalong a direction registered withmaterial.Set_active_stress_vec.
- Kelvin-Voigt viscosity
- Added the
CardiacElastoDynamicsexample (MonoVentricular.py): a passive + active hyperelastic left-ventricle simulation reproducing Benchmark i: monoventricular mechanics of the cardiac elastodynamics benchmark (Comput. Methods Appl. Mech. Engrg.), with analytic andcardiac_benchmark_toolkit(vtu) fiber/sheet sources (issue #42). - Refactored
Construct_local_matrix_systemand madeHyperElasticStateoperate on agroupElem; the velocity is now passed explicitly toKelvinVoigtDampinginstead of being stored on the state (issue #44). - Added
FeArrayreduction methods and anintegratehelper, and fixed aFeArray.broadcastambiguity on per-element tensors viatensor_ndim. - Fixed a shared mutable-default-dictionary bug in the
Save_Iterfunctions that leaked iteration keys across calls and across simulations in the same process. - Fixed bugs in
phaseField._Calc_Sigma_e_pg, in theLinearizedElasticityexamples, ingroupElem._Get_Mapping/Get_pointsInElem(local connectivity), and in theMesherMPI partitioning (snapshot connectivity beforegmsh.partition). - Fixed an
mpi4pydeadlock on plainpythonand apetsc4pydouble-initialization warning. - Updated
Mesher.Mesh_Import_meshto reconstruct physical groups from gmsh entities and to accept ameshOrderargument; renamedwedgetopentainMeshIO.DICT_ELEMTYPE_TO_ENSIGHT. - Documentation: added an
Operatorssection to the FEM API and a "from element operators to the global system" section to the solve-pipeline guide; improved the introduction docstrings of every simulation; referencedCardiacElastoDynamicsin the docs and READMEs.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v1.10.1...v1.11.0
- Fixed flaky
test_Evaluate_dofsValues_at_coordinates_2Dand_3D: replaced the unseeded random-node sample with a vectorizedassert_allcloseover all nodes (tolerance now reflects Newton inverse-mapping precision). - Loosened machine-precision tolerances in
TOLS_TIPandTOLS_DISTRIB(beam tests) from1e-12to1e-11to absorb harmless float noise. - Updated documentation and example READMEs to reference Timoshenko beams alongside Euler-Bernoulli, with a pointer to
Beam2as the worked Timoshenko example.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v1.10.0...v1.10.1
- Created
euler_implicitandeuler_explicithyperbolic algorithms. - Continued work on Timoshenko beams (issue #39).
- Replaced Jouravski's formula with Cowper's (1966) shear correction factor in
_Get_shear_correction_factor. - Prevented shear locking for Timoshenko elements.
- Updated shear correction factor docstrings.
- Updated links to fem object.
- Replaced Jouravski's formula with Cowper's (1966) shear correction factor in
- Fixed bug in
hyperelastic._Calc_Wfunction. - Created
simu.__Get_Ndoffunction and refactoredsimu._Get_*_nfunctions to use it. - Simplified
simu._Solver_Apply_Dirichletfunction. - Removed
_ScipyLinearDirectfunction. - Updated the default element type in
Mesh_Beamsfunction. - Improved
Matrix System Solversdocumentation indocs/api/simulations.md.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v1.9.2...v1.10.0
- Created the
CiarletGeymonathyperelastic law. - Fixed bug for
hhtalgorithm insimu._Solver_Evaluate_u_v_a_for_time_schemefunction. - Created
simu.__Bc_check_inputsfunction. - Updated the argument position in
simu.Solver_Set_Hyperbolic_Algorithm. - Improved
FeArrayfunctions. - Updated the
_Write_solution_filefunction inVizir.py.
Full Changelog: https://github.com/matnoel/EasyFEA/compare/v1.9.1...v1.9.2
- Improved how invalid characters are handled by
EasyFEA/Utilities/Display.pyfunction - Removed pyvista version restriction and close pyvista/pyvista#8628.
- Removed hard-coded elemType in
EasyFEA/Utilities/MeshIO.py
- Worked on issue #38 and improved static and dynamic Euler-Bernoulli beam simulations.
- Introduced new tests and examples.
- Examples now compute Ty, Mz and N when needed.
- Set scipy as the default solver for beam simulations.
- Create beam.add_lineLoad override.
- Started working on timoshenko beams in #39.
- Refactored
GroupElemFactorywithGROUP_CLASS_MAP - Removed bug in
Display.Movie_Simuintroduced in #21 updates. - Updated
simu.Resultbehavior for not implemented results. - Updated parabolic and hyperbolic time schemes when the simulation is using Lagrange multipliers.
- Improved display function behavior with inDim calculation.
- Updated
simu.Calc_Reactionand return just dofs values in seq mode. - Removed
MPI_COMMinsolvers._PETScfunction. - Improved
simu.__Bc_Integration_Dimfunction. - Fixed bug in
MeshIO._Set_Tagsfunction. - Updated PyVista.Plot_Tags function
- Created a mesh.Merge function,
- Updated tol to
1e-12intests/Models/phasefield_test.py - Updated optionTex in
EasyFEA/Utilities/Display.py - Updated pyvista to version (<=0.47.3) until the following issue is fixed: pyvista/pyvista#8628
- Improved solver behavior when simulations are using Lagrange boundary conditions.
- Simplified homogenization examples.
- Set petsc4py options by default in EasyFEA/Simulations/_simu, even if petsc4py is not available.
- #26 Improved mpi behavior:
- Removed coordGlob array in mesh and groupElem.
- Add ghost cells and ghost points in EasyFEA/Utilities/Paraview.py
- Fixed a bug in Meshio._GroupElem_to_PyVista function.
- Updated phase field examples.
- Created Save and Load functions for mesh object.
- Created Folder_test.py
- Migrated CI/CD and ReadTheDocs to
uvfor dependency management. - Improved performance of
_phasefield.__Spectral_Decompositionin 2D and 3D. - Fixed rounding errors in
_phasefield.__Spectral_Decompositionin 3D. - Updated
mesher.Save_Simufunction. - Improved
mesher._Mesh_Get_Meshprofiling (#26).
- Improved
simu._Solver_Set_PETSc4Py_Optionsfunction (#26). - Updated the meshSize in Hyperelasticity examples.
- Improved Sphinx documentation.
- Renamed
isHollowtoisFilledacross all geometry classes (Domain,Circle,Points,Contour), with an inverted default value (False). Specifically,isHollow=TruebecomesisFilled=False, andisHollow=FalsebecomesisFilled=True. - Improved the CONTRIBUTING guide.
- Fixed a bug in
simu.folderandsimu.Load_Simu.
- Resolved issue #26: Implemented full MPI support for distributed-memory parallel simulations using
petsc4py.- Created
EasyFEA/Utilities/_mpi.pywith MPI utility functions (Concatenate_array,Sync_dofsValues). - Added
rank0_onlydecorator and applied it to public functions inDisplay,PyVista, andParaviewmodules. - Implemented
simu._Gatherandmesh.Gatherfunctions to assemble distributed results on rank 0. - Added
Folder.Rank_Dirfunction for rank-specific output directories. - Refactored the
Paraviewmodule to handle MPI results with per-rank.vtufiles. - Improved PETSc solver options and pipeline; set GAMG as the default preconditioner.
- Fixed memory leaks in the PETSc solver using
PETSc.garbage_cleanup(). - Updated the Newton–Raphson algorithm for MPI context.
- Fixed bugs in
simu.Save_Iter,simu.foldersetter,_mpi.Concatenate_array, andsolver.__Get_unique_dofs.
- Created
- Improved Sphinx documentation by adding a comprehensive how-to section.
- Merged PR #36 with updates: Improved
examples/README.rst. - Resolved issue #37: Added examples in docstrings.
- Created
MeshIO.Mergefunction to combine multiple meshes. - Added
simu.Get_dofsfunction. - Exported
AlgoTypeinEasyFEA/__init__.py. - Improved
FeArrayimplementation. - Improved
simu._Solver_Apply_Dirichletandsimu.__Solver_Get_Dirichlet_A_xfunctions. - Updated
simu.Results_Set_Iteration_Summarybehavior. - Improved
EasyFEA/Models/_phasefield.pyand related phase-field examples. - Improved
mesher._Mesh_Generate. - Refactored
EasyFEA/Utilities/_tic.pyto prevent memory issues. - Removed the
numbaoptional dependency. - Fixed a bug in
PyVista.Plot_Elements.
- Removed
additionalPointsfromexamples/LinearizedElasticity/Homog4.py. - Added Git LFS tracking for
*.pngfiles. - Resolved issue #8: Added DIC examples.
- Updated Sphinx Gallery and model viewer.
- Fixed a bug in the
mesh.Get_Node_Valuesfunction when the mesh contains orphan nodes. - Improved and closed issue #35: Export EasyFEA results to USD format.
- Added Git LFS tracking for
*.mshfiles. - Fixed periodic boundary conditions in
Homog4.pyand introducedHomog5.py.
- Updated the
_requiresmodule. - Resolved issue #34 to enable export of EasyFEA results to GLB format.
- Resolved issue #35 to enable export of EasyFEA results to USD format.
- Implemented an interactive gallery using the GLB format and the model-viewer component.
- Updated the
Mesh.Nodes_*methods. - Removed the
groupElem.assembly_eproperty. - Added a
SwapOrientationoption for the crack plugin. - Clarified the
groupElem._Get_sysCoord_emethod. - Created the
PyVista.Plot_Arrowsfunction. - Updated surface normals for 3D elements:
- Ensured consistent coordinate usage across element groups.
- Utilized all coordinates in the
MeshIO.Surface_reconstructionfunction. - Guaranteed outward-facing normals for all mesh faces in
groupElem._Get_sysCoord_e.
- Updated Sphinx documentation:
- Updated
docs/html_theme_options. - Reset Geoms instance numbering and ensured
BUILDING_GALLERYis set toFalseduring gallery construction. - Updated LaTeX options in the documentation.
- Removed
\begin{alignat}from.. math::environments.
- Updated
- Updated optional dependencies:
- Marked
meshioas an optional dependency. - Marked
imageioas an optional dependency. - Added
ioto optional dependencies. - Added
vizto optional dependencies. - Updated optional dependencies in
.github/workflows/tests.yaml. - Marked
matplotlibandpyvistaas optional dependencies.
- Marked
- Updated EasyFEA api and sphinx documentation.
- Fixed bug in
mesh_test.py. - Updated
imageio[ffmpeg]toimageio-ffmpegin README. - Added
tolparameter ingroupElem._Get_coord_Nearmethod. - Removed
jupyterandzipoutputs from docs examples. - Fixed issue #31: Created
Folder.Results()function and removedFolder.RESULTS_DIR. - Updated links and warnings in docstrings.
- Switched from
reStructuredTexttoMarkdownin Sphinx documentation. - Added mathematical formulations for simulations.
- Updated sphinx documentation.
- Updated
ElasOrthotropicimplementation. - Defined
ElasOrthotropic.Walpole_Decompositionmethod. - Updated how
Walpole_Decompositionfunctions are checked during unitests. - Create
mesh.Calc_regulation_projector. - Updated mpi4py and numba as optional dependencies.
- Updated the
Result_in_Strain_or_Stress_fieldfunction and its calls to replacefield_ewithfield_e_pg. - Added
Field.Evaluate_eandField.Evaluate_nmethods to evaluate functions on elements or nodes. - Added the
von_mises_stressfunction inexamples/WeakForms/LinearElasticity1.py. - Fixed a bug in the
Display.Plot_Resultfunction whennodeValues=False. - Clarified the
Mesher._Mesh_Get_Meshfunction and moved the_gmsh_interface.pymodule to_gmsh.py. - Began work on issue #26: Solve simulations using petsc4py and MPI.
- Added the
Gauss._Gauss_factory_nPgfunction and refactored Gauss point construction. - Updated the
Paraview.__Make_pvdfunction to use relative paths for accessing VTU files. - Improved the
MeshIOmodule. - Renamed
mesh.coordGlobtomesh.coord. - Created
examples/LinearizedElasticity/Homog4.py. - Implemented the
ElasOrthotropicmodel. - Fixed issue #27: Corrected bug in
PhaseFieldSimu._Calc_Psi_Extmethod. - Updated iteration printing in Display, Paraview, and PyVista functions.
- Addressed issue #29: Clarified the
Simu.add_pressureLoad()function. - Updated the
simu.add_neumannfunction. - Resolved issue #28: Added topology optimization example.
- Enhanced the Sphinx documentation.
- Updated homogenization examples.
- Improved documentation.
- Removed pandas dependency.
- Enhanced
Tic.Plot_Historyfunctions. - Updated the
mesh.Evaluate_dofsValues_at_coordinatesfunction. - Refactored mesh functions in
_gmsh_interface.py. - Updated functions in
EasyFEA/fem/_forms.pyused byEasyFEA/simulations/_weak_forms.py.
- Updated the thermal simulation description.
- Refactored the use of time schemes for nonlinear problems.
- Clarified the names and descriptions of the simulation solver functions.
- Updated the
DisplayandPyVistafunctions. - Updated the construction of
dict_tagsin the_Meshio_to_EasyFEAfunction. - Improved the
hyperelasticsimulation to handlehyperbolicproblems. - Organized and enhanced the documentation scripts.
- Improved
hyperelasticmodels for2Dsimulations under the plane strain assumption.
- Updated the solver parameter in the
phasefieldmodel. - Added an assertion in
_Simu.Get_K_C_M_Fto detect multiple problem types. - Updated
PositiveParametertoPositiveScalarParameterin some models #23. - Renamed
_pyVistaMeshto_pvMeshinEasyFEA/utilities/PyVista.py. - Updated
PyVista._setCameraPositionwith its docstrings and modified how the function is called. - Added the
I6andI8invariants inEasyFEA/models/_hyperelastic.py. - Added
VectorParameterand_CheckIsVectorinEasyFEA/utilities/_params.py. - Updated the behavior of
TensorProdandProject_Kelvinfunctions forFeArray. - Updated vector checks in
EasyFEA/models/_hyperelastic.py. - Created the
HolzapfelOgdenhyperelastic law inEasyFEA/models/_hyperelastic_laws.py. - Updated FEM solvers:
- Updated the
Newton_Raphsonalgorithm. - Removed the
simu.solverIsIncrementaloption. - Updated
newmark,midpoint, andhhtacceleration formulations to displacement formulations. - Updated
Set_Rayleigh_Damping_Coefsto ensure the matrix is updated inEasyFEA/simulations/_elastic.py. - Revised the use of the
Newton_Raphsonalgorithm in nonlinear simulations. - Updated the
Newton_Raphsonalgorithm to print the residual L2 norm (with applied boundary conditions).
- Updated the
- Updated the
TensorProdfunction inEasyFEA/fem/_linalg.py. - Updated hyperelastic chain rules to ensure cross-term derivatives used in
d2Wutilize tensor products. - Refactored the
HyperElasticstatic class into aHyperElasticStateclass for improved performance and code readability. - Applied the
cache_computed_valuesdecorator to replace outdated caching methods inEasyFEA/fem/_group_elems.pyandEasyFEA/models/_hyperelastic.py. - Fixed a bug in the first derivatives of anisotropic invariants
I4,I6, andI8. - Fixed a bug in the penalization solver.
- Added the bulk modulus term to the
MooneyRivlinhyperelastic law. - Added the bulk modulus term to the
Saint-Venant-Kirchhoffhyperelastic law.
- Fixed issue #23: Descriptors are now used to simplify property creation in classes.
- Fixed issue #24: Introduced the
Construct_matrix_systemfunction and removed allAssemblyfunctions. This reduces the amount of code required for each simulation. - Fixed a bug in the
_Create_Linesdispatch methods. - Updated the
_Write_solution_filefunction inutilities.Vizir.py. - Fixed a bug in
Get_pointsInElemcaused bynanvalues in normalized arrays. - Added the
mesh.Evaluate_dofsValues_at_coordinatesfunction. - Added the
HolzapfelOgdenhyperelastic law in theexamples/HyperElastic/HyperElasticLaws.pyscript. - Removed the
useNumbaproperty fromsimuandmodels. - Removed the
dimargument from theThermalmodel. - Updated functions in
EasyFEA/utilities/_params.py. - Clarified tests for
phasefield.
- Added the
I8invariant to theexamples/HyperElastic/HyperElasticInvariants.pyscript. - Fixed issue #22: Implemented
singledispatchmethods in_gmsh_interface.py,geoms/_utils.py,_simu.pyandPyVista.pyto improve code readability. - Introduced the
BUILDING_GALLERYoption and updated theDisplay.Clearfunction to ensure theTichistory is initialized whenBUILDING_GALLERY = True.
- Fixed a bug in the
Mesh.Translate,Mesh.Rotate, andMesh.Symmetryfunctions. - Added the
MeshIO.EasyFEA_to_EnsightandMeshIO.Ensight_to_EasyFEAfunctions. - Fixed a bug in the matrix order in the
Paraview.Save_simufunction. - Added a
depthoption to theFolder.Dirfunction. - Updated the docstrings for weak forms.
- Fixed a bug in the
Vizir.__Write_HOSolAt_Solutionfunction. - Added a
concatenateoption to theField.Get_coordsfunction. - Added the
groupElem.Get_normals_e_pgfunction. - Updated
mesh.Get_normalsto use thegroupElem.Get_normals_e_pgfunction. - Fixed the path used in the Sphinx documentation.
- Fixed a bug in
Mesh.Nodes_Tags.
- Improved documentation by adding more animated GIFs
- Updated
MeshIO.Surface_reconstruction. - Updated
Material.WeakFormsdocstrings. - Fixed issue #21:
- Clarified
Display.pyandPyVista.pymodules. - Improved
Plot_Tagsfunctions.
- Clarified
- Improved mesh and element group tagging.
- Fixed bug in
_Additional_Points(). - Switched
GroupElemFactory_CreateandCreate.
- Updated Python version in README.md.
- Updated Display module according to modifications in #19.
- Updated Vizir module.
- Updated MeshIO docstrings.
- Fixed mypy and ruff type issues.
- Renamed
linesVector_etorowsVector_eandlinesScalar_etorowsScalar_ein simulations and group of elements. - Fixed issue #20: Users can now perform finite element analysis by simply providing weak form functions.
- Renamed Materials to Models.
- Created
Field,BilinearForm,LinearForm,Materials.WeakForms, andSimulations.WeakFormSimu. - Created 2 Poisson and 2 linear elasticity examples with tests.
- Improved the documentation by providing as many animated GIFs as possible.
- Updated meshio's fork dependency in
pyproject.toml[dev]. - Fixed mypy types.
- Updated visualization modules:
Vizir.py,PyVista, andDisplay.py. - Added new topological information (
Nedge,Nvolume) for each element group. - Added
surfacesandedgesdata for each element group. - Created
MeshIO.Surface_reconstruction()method. - Added meshio tests covering surface reconstruction and import functionality.
- Updated meshio's fork dependencies in:
.github/workflows/tests.yamldocs/requirements.txtpyproject.toml[dev]
- Added MeshIO import functions in FEM API documentation.
- Improved convergence criteria in
_Solver_Solve_NewtonRaphson. - Updated mesh used in
test_PhaseFieldfunction. - Moved
ModelType.Is_Non_Lineartosimu._Solver_problemType_is_non_linear.
- Updated links in
docs/index.rstandREADME.md. - Renamed
weightedJacobian_e_pgtowJ_e_pgin scripts. - Updated
Solvers.pydependencies. - Reordered tensor ordering in
Paraview.py. - Fixed issue #17: Fixed Newton-Raphson algorithm and added a new hyperelastic example.
- Fixed issue #18: Updated
MeshIO.pyto importEnSightmeshes.
- Fixed issue #16: Enabled Paraview functionality without a simulation object.
- Updated documentation links to reference external research projects.
- Fixed issue #15: You can now create meshes simply by using geometric objects.
- Enhanced docstrings, documentation and examples.
- Added an interface to Vizir (see issue #9).
- Applied
blackcode formatting across the codebase (see issue #10). - Integrated continuous integration using GitHub Actions (see issues #11, #13, and #14).
- Added comprehensive documentation (see issue #5).
- Fixed tkinter issue in CI for py3.12 on windows. (see: https://github.com/matnoel/EasyFEA/actions/runs/15673958144/job/44150031408)
- Direct dependency on meshio@ git+https://github.com/matnoel/meshio.git cannot be included in PyPI.
- Updated project dependency to https://github.com/matnoel/meshio.git
- Fixed issue #9: add vizir output format
- Fixed issue #10: format the code with black
- Fixed bug in gauss quadrature for prisms
- Fixed issue #11: add continuous integration with github-actions
- Fixed issue #14: test types with mypy.
- Added new badges in the readme file.
- Fixed issues #6 and #7.
- Organized the
tests/directory. - Updated hyperbolic solvers (
hht,newmark,midpoint). - Created a linear algebra module for the
Trace,Det,Inv,TensorProd,Transpose, andNormfunctions. - Updated the
MeshIOinterface. Removed unnecessary node reordering, which is now handled by the https://github.com/matnoel/meshio fork. - Replaced
simu.Get_directions()withsimu.Get_unknowns(). - Clarified the
groupElem.Get_F_e_pg()function. - Created
simufunctions to access Neumann boundary condition values.
- Moved
Display._Init_obj()to_simu._Init_obj(). - Updated the
Display.Plot_Result()andPyVista.Plot()functions. - Updated the
Modal1.pyandModal2.pyexamples. - Clarified the
_GroupElem.Get_F_e_pg()and_GroupElem.Get_invF_e_pg()functions.
- Created the MeshIO interface.
- Updated the Geoms module.
- Created the params check functions.
- Updated pyproject.toml (name = "easyfea") to comply with PyPI distribution format specifications.
- Enhanced Gmsh_Interface to support linked surface creation by adding pointTags to the addSurfaceFilling function in Gmsh.
- Updated Folder functions (New_File -> Join(mkdir=True), Get_Path() -> Dir())
- Removed colors in Display.Plot_Tags()
- Updated the method for setting up a tag in a mesh (_Set_Nodes_Tag and _Set_Elements_Tag).
- Removed the old trick to generate the mesh with gmsh recombine
- Updated Gmsh_Interface tests (test_mesh_isOrganised).
- Enhanced examples.
- Implemented new element types: QUAD9, SEG5, TRI15, HEXA27, PRISM18.
- Enhanced Gmsh_Interface for QUAD and HEXA elements.
- Standardized shape functions.
- Updated Paraview_Interface and PyVista_Interface.
- Updated Gauss points quadrature.
- Migrated from unittest to pytest.
- Enhanced examples.
- Enhanced Gmsh_Interface.
- Finite element shape functions were renamed to improve code readability.
- NEW YEAR.
- Enhanced the Digital Image Correlation (DIC) analysis module.
- Enhanced examples.
- Updated docstrings.
- Updated Display functions.
- Updated phase field solver.
- Updated docstrings.
- Updated Display functions.
- Updated PyVista_Interface functions.
- Added _Elas.Get_sqrt_C_S() function.
- Updated He split for heterogeneous material properties.
- Added Save_pickle() and Load_pickle() functions.
- Updated Gmsh_Interface for cracks.
- Updated Folder functions.
- Ensures compatibility with python 3.9 and 3.10.
- Updated docstrings.
- Updated simulations/_phasefield.py solver.
- Updated Bc Config.
- Updated tests.
- Updated _Additional_Points().
- Updated Mesh_Beams().
- Updated docstrings.
- Added the resetAll option in Set_Iter() to simplify the update process after iteration activation.
- Enhanced clarity in phase field functions, including both simulation and material aspects.
- Improved display options for geometric objects.
- Improved display functions.
- Provided clearer functionality in mesh and group element.
- Updated the interface with Gmsh.
- Improved phasefield examples.
- Enhanced the Digital Image Correlation (DIC) analysis module.
- Updated gmsh interface functions.
- Added controls when calling certain functions.
- Updated geometric objects to modify parameters after creation.
- Added a banner to the project.
- Added CT.py damage simulation.
- Minor adjustments to README.md
- Minor adjustments to object printing.
- Reorganization of save functions in the simulation recording and loading process.
- Modification of the PETSc interface for the new version.
- Implemented minor refinements in Solvers.py to ensure correct canonical values of matrix A in Ax=b equations, thus avoiding potential bugs when using PETSc or pypardiso.
- Renamed functions in fem/_gauss.py to improve clarity and consistency.
- Updated function names in Display.py to improve readability.
- Updated copyright information to reflect the latest changes.
- Added a contribution guide to facilitate community participation and collaboration.
- Creation of a citation file.
- Update library dependencies.
- First version.