From cb7225d021d8fc5e54987f088005ec36763c9a5a Mon Sep 17 00:00:00 2001 From: ClaudeBot Date: Mon, 21 Sep 2026 08:57:24 -0400 Subject: [PATCH 1/7] Add calculate_current_stress interface for postprocessing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Upstreams the material-model-independent parts of KnutAM/MechanicalMaterialModels.jl#13 into MaterialModelsBase.jl, resolving #12. Adds calculate_current_stress(m, strain, state), which returns the stress consistent with a given (frozen) state without invoking any local Newton iteration that would advance history/internal variables - useful during postprocessing when the strain differs slightly from the one that produced the state. New src/current_stress.jl provides: - The interface docstring/stub. - A fully generic full-dimensional default for NoMaterialState materials (material_response already is frozen-state for a material with no history). - An internal FrozenStressMaterial wrapper riding the existing stress-state Newton iteration with an autodiff-derived tangent (Tensors.gradient), giving a generic ReducedStressState/AbstractStressState fallback for any material that implements the full-dimensional method. - A cheaper NoMaterialState fast path for the reduced-dimensional case that delegates directly to material_response instead of autodiff. Left out of this PR (material-specific, stay in MechanicalMaterialModels.jl): LinearElastic, HyperElastic, Plastic, GeneralizedMaxwell, FiniteStrainPlastic, and RotatedMaterial methods from MMM#13. Reviewed via two rounds of independent Codex review (same thread): - Plan review caught a real dispatch ambiguity between the NoMaterialState full-dimensional default and the ReducedStressState forwarding method for a ReducedStressState wrapping a stateless material (fixed with an explicit disambiguating overload), plus an incorrect Tensors.gradient argument-order/syntax slip in the plan (fixed by using the correct `dσdϵ, σ = Tensors.gradient(...)` order), and flagged that the tests needed a frozen-vs-fresh comparison rather than only a same-point check. - Diff review against the implementation caught that the NoMaterialState reduced-dimensional fast path assumed material_response always returns 4 outputs, when a specialized stress-state method is explicitly allowed to omit the optional 4th (full-strain) output; fixed by extracting only the first output, with a regression test added. Also regenerates docs/Manifest.toml and adds a [sources] entry to docs/Project.toml for MaterialModelsBase (matching this repo's own documented [sources] convention): the docs environment's lockfile was stale and pinned a package version whose source was no longer available, so docs/make.jl could not run at all before this fix. Test results: Pkg.test() passes (104 tests, up from 89, including 15 new calculate_current_stress tests exercising the NoMaterialState fast path, the stateful full-dimensional and generic reduced-dimensional autodiff fallback (cross-checked against an independent, explicit equivalent material's PlaneStress response), finite-strain (Tensor) support, and the partial-output compatibility regression). docs/make.jl builds cleanly with only pre-existing, unrelated warnings. Co-Authored-By: Claude Sonnet 5 --- docs/Manifest.toml | 876 +++++++++++++++++++++++------------ docs/Project.toml | 3 + docs/src/stressiterations.md | 9 + src/MaterialModelsBase.jl | 4 + src/current_stress.jl | 75 +++ test/current_stress.jl | 188 ++++++++ test/runtests.jl | 1 + 7 files changed, 867 insertions(+), 289 deletions(-) create mode 100644 src/current_stress.jl create mode 100644 test/current_stress.jl diff --git a/docs/Manifest.toml b/docs/Manifest.toml index 4e868ea..bb1c9e0 100644 --- a/docs/Manifest.toml +++ b/docs/Manifest.toml @@ -1,17 +1,19 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.12.1" -manifest_format = "2.0" +julia_version = "1.13.0" +manifest_format = "2.1" project_hash = "88eca5d10896e3e4cedca86ec69cf15857219bab" [[deps.ANSIColoredPrinters]] git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c" +registries = "General" uuid = "a4c015fc-c6ff-483c-b24f-f7ea428134e9" version = "0.0.1" [[deps.AbstractFFTs]] deps = ["LinearAlgebra"] git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" +registries = "General" uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" version = "1.5.0" weakdeps = ["ChainRulesCore", "Test"] @@ -22,14 +24,41 @@ weakdeps = ["ChainRulesCore", "Test"] [[deps.AbstractTrees]] git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" +registries = "General" uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" version = "0.4.5" +[[deps.Accessors]] +deps = ["CompositionsBase", "ConstructionBase", "Dates", "InverseFunctions", "MacroTools"] +git-tree-sha1 = "7063ad1083578215c7c4bf410368150abe8d5524" +registries = "General" +uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +version = "0.1.45" + + [deps.Accessors.extensions] + AxisKeysExt = "AxisKeys" + IntervalSetsExt = "IntervalSets" + LinearAlgebraExt = "LinearAlgebra" + StaticArraysExt = "StaticArrays" + StructArraysExt = "StructArrays" + TestExt = "Test" + UnitfulExt = "Unitful" + + [deps.Accessors.weakdeps] + AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" + StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" + Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" + [[deps.Adapt]] -deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "7e35fca2bdfba44d797c53dfe63a51fabf39bfc0" +deps = ["LinearAlgebra"] +git-tree-sha1 = "7c2c19b5a26e601634bf718490b89d59685f122e" +registries = "General" uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.4.0" +version = "4.7.1" weakdeps = ["SparseArrays", "StaticArrays"] [deps.Adapt.extensions] @@ -38,18 +67,21 @@ weakdeps = ["SparseArrays", "StaticArrays"] [[deps.AdaptivePredicates]] git-tree-sha1 = "7e651ea8d262d2d74ce75fdf47c4d63c07dba7a6" +registries = "General" uuid = "35492f91-a3bd-45ad-95db-fcad7dcfedb7" version = "1.2.0" [[deps.AliasTables]] deps = ["PtrArrays", "Random"] git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" +registries = "General" uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" version = "1.1.3" [[deps.Animations]] deps = ["Colors"] git-tree-sha1 = "e092fa223bf66a3c41f9c022bd074d916dc303e7" +registries = "General" uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" version = "0.4.2" @@ -62,20 +94,23 @@ uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" version = "1.11.0" [[deps.Automa]] -deps = ["PrecompileTools", "SIMD", "TranscodingStreams"] -git-tree-sha1 = "a8f503e8e1a5f583fbef15a8440c8c7e32185df2" +deps = ["PrecompileTools", "TranscodingStreams"] +git-tree-sha1 = "94eab0b3ccdcac361188cc661daf69d4433c1818" +registries = "General" uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" -version = "1.1.0" +version = "1.2.0" [[deps.AxisAlgorithms]] deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" +registries = "General" uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" version = "1.1.0" [[deps.AxisArrays]] deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] git-tree-sha1 = "4126b08903b777c88edf1754288144a0492c05ad" +registries = "General" uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" version = "0.4.8" @@ -84,18 +119,21 @@ uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" version = "1.11.0" [[deps.BaseDirs]] -git-tree-sha1 = "bca794632b8a9bbe159d56bf9e31c422671b35e0" +git-tree-sha1 = "8c290a1b223deaeea9aea44b235d24546da8eb98" +registries = "General" uuid = "18cc8868-cbac-4acf-b575-c8ff214dc66f" -version = "1.3.2" +version = "1.4.0" [[deps.Bzip2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" +registries = "General" uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" version = "1.0.9+0" [[deps.CEnum]] git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +registries = "General" uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" version = "0.5.0" @@ -106,38 +144,44 @@ version = "1.11.0" [[deps.CRlibm]] deps = ["CRlibm_jll"] git-tree-sha1 = "66188d9d103b92b6cd705214242e27f5737a1e5e" +registries = "General" uuid = "96374032-68de-5a5b-8d9e-752f78720389" version = "1.0.2" [[deps.CRlibm_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" +registries = "General" uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" version = "1.0.1+0" [[deps.Cairo]] deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] git-tree-sha1 = "71aa551c5c33f1a4415867fe06b7844faadb0ae9" +registries = "General" uuid = "159f3aea-2a34-519c-b102-8c37f9878175" version = "1.1.1" [[deps.CairoMakie]] deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] -git-tree-sha1 = "1778fd03576b0b6f88d0eafe89c54a3fb8df96a3" +git-tree-sha1 = "1cda0b7d5abfc95357dae18aca934d401f7869ad" +registries = "General" uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -version = "0.15.7" +version = "0.15.15" [[deps.Cairo_jll]] -deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "fde3bf89aead2e723284a8ff9cdf5b551ed700e8" +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "1fa950ebc3e37eccd51c6a8fe1f92f7d86263522" +registries = "General" uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.18.5+0" +version = "1.18.7+0" [[deps.ChainRulesCore]] deps = ["Compat", "LinearAlgebra"] -git-tree-sha1 = "e4c6a16e77171a5f5e25e9646617ab1c276c5607" +git-tree-sha1 = "12177ad6b3cad7fd50c8b3825ce24a99ad61c18f" +registries = "General" uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.26.0" +version = "1.26.1" weakdeps = ["SparseArrays"] [deps.ChainRulesCore.extensions] @@ -145,25 +189,36 @@ weakdeps = ["SparseArrays"] [[deps.CodecZlib]] deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "962834c22b66e32aa10f7611c08c8ca4e20749a9" +git-tree-sha1 = "970758a3d591a2a5c2a907c53f2e2f8c1b1d3537" +registries = "General" uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.8" +version = "0.7.9" + +[[deps.CodecZstd]] +deps = ["TranscodingStreams", "Zstd_jll"] +git-tree-sha1 = "da54a6cd93c54950c15adf1d336cfd7d71f51a56" +registries = "General" +uuid = "6b39b394-51ab-5f42-8807-6242bab2b4c2" +version = "0.8.7" [[deps.ColorBrewer]] deps = ["Colors", "JSON"] git-tree-sha1 = "07da79661b919001e6863b81fc572497daa58349" +registries = "General" uuid = "a2cac450-b92f-5266-8821-25eda20663c8" version = "0.4.2" [[deps.ColorSchemes]] deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] git-tree-sha1 = "b0fd3f56fa442f81e0a47815c92245acfaaa4e34" +registries = "General" uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" version = "3.31.0" [[deps.ColorTypes]] deps = ["FixedPointNumbers", "Random"] git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" +registries = "General" uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" version = "0.12.1" weakdeps = ["StyledStrings"] @@ -174,6 +229,7 @@ weakdeps = ["StyledStrings"] [[deps.ColorVectorSpace]] deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" +registries = "General" uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" version = "0.11.0" weakdeps = ["SpecialFunctions"] @@ -184,18 +240,28 @@ weakdeps = ["SpecialFunctions"] [[deps.Colors]] deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] git-tree-sha1 = "37ea44092930b1811e666c3bc38065d7d87fcc74" +registries = "General" uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" version = "0.13.1" +[[deps.CommonSolve]] +deps = ["PrecompileTools"] +git-tree-sha1 = "6c389fa857f6ca5a95474b52a52023fd77f24cb7" +registries = "General" +uuid = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" +version = "0.2.14" + [[deps.CommonSubexpressions]] deps = ["MacroTools"] git-tree-sha1 = "cda2cfaebb4be89c9084adaca7dd7333369715c5" +registries = "General" uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" version = "0.3.1" [[deps.Compat]] deps = ["TOML", "UUIDs"] git-tree-sha1 = "9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad" +registries = "General" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" version = "4.18.1" weakdeps = ["Dates", "LinearAlgebra"] @@ -206,16 +272,28 @@ weakdeps = ["Dates", "LinearAlgebra"] [[deps.CompilerSupportLibraries_jll]] deps = ["Artifacts", "Libdl"] uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.3.0+1" +version = "1.5.5+2" + +[[deps.CompositionsBase]] +git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" +registries = "General" +uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" +version = "0.1.2" +weakdeps = ["InverseFunctions"] + + [deps.CompositionsBase.extensions] + CompositionsBaseInverseFunctionsExt = "InverseFunctions" [[deps.ComputePipeline]] deps = ["Observables", "Preferences"] -git-tree-sha1 = "21f3ae106d1dcc20a66e96366012f7289ebba498" +git-tree-sha1 = "7bc84b769c1d384315e7b5c4ac03a6c303e6cf35" +registries = "General" uuid = "95dc2771-c249-4cd0-9c9f-1f3b4330693c" -version = "0.1.5" +version = "0.1.8" [[deps.ConstructionBase]] git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" +registries = "General" uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" version = "1.6.0" weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] @@ -227,22 +305,40 @@ weakdeps = ["IntervalSets", "LinearAlgebra", "StaticArrays"] [[deps.Contour]] git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" +registries = "General" uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" version = "0.6.3" +[[deps.CoreMath]] +deps = ["CoreMath_jll"] +git-tree-sha1 = "8c0480f92b1b1796239156a1b9b1bfb1b39499b4" +registries = "General" +uuid = "b7a15901-be09-4a0e-87d2-2e66b0e09b5a" +version = "0.1.0" + +[[deps.CoreMath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a692a4c1dc59a4b8bc0b6403876eb3250fde2bc3" +registries = "General" +uuid = "a38c48d9-6df1-5ac9-9223-b6ada3b5572b" +version = "0.1.0+0" + [[deps.DataAPI]] git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" +registries = "General" uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" version = "1.16.0" [[deps.DataStructures]] deps = ["OrderedCollections"] -git-tree-sha1 = "e357641bb3e0638d353c4b29ea0e40ea644066a6" +git-tree-sha1 = "b0bc6d2cad1fed8b7fd59a1551a991cb3d2809e6" +registries = "General" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.19.3" +version = "0.19.6" [[deps.DataValueInterfaces]] git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +registries = "General" uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" version = "1.0.0" @@ -253,21 +349,24 @@ version = "1.11.0" [[deps.DelaunayTriangulation]] deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] -git-tree-sha1 = "783b21581a051ac91a3921ee37e26a23ed7f57a6" +git-tree-sha1 = "4ac548adcad90c1d5d677af13568a748af4c952b" +registries = "General" uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" -version = "1.6.5" +version = "1.6.7" [[deps.DiffResults]] deps = ["StaticArraysCore"] git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" +registries = "General" uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" version = "1.1.0" [[deps.DiffRules]] deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] -git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" +git-tree-sha1 = "79a2aca180a85c690c58a020d47b426954b590f8" +registries = "General" uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" -version = "1.15.1" +version = "1.16.0" [[deps.Distributed]] deps = ["Random", "Serialization", "Sockets"] @@ -275,88 +374,89 @@ uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" version = "1.11.0" [[deps.Distributions]] -deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "3bc002af51045ca3b47d2e1787d6ce02e68b943a" +deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "Roots", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] +git-tree-sha1 = "a958ab3a40c755563f5e1405c0846cb0446bf19d" +registries = "General" uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.122" +version = "0.25.131" [deps.Distributions.extensions] DistributionsChainRulesCoreExt = "ChainRulesCore" DistributionsDensityInterfaceExt = "DensityInterface" + DistributionsSparseConnectivityTracerExt = "SparseConnectivityTracer" DistributionsTestExt = "Test" [deps.Distributions.weakdeps] ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" + SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [[deps.DocStringExtensions]] git-tree-sha1 = "7442a5dfe1ebb773c29cc2962a8980f47221d76c" +registries = "General" uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" version = "0.9.5" [[deps.Documenter]] deps = ["ANSIColoredPrinters", "AbstractTrees", "Base64", "CodecZlib", "Dates", "DocStringExtensions", "Downloads", "Git", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "MarkdownAST", "Pkg", "PrecompileTools", "REPL", "RegistryInstances", "SHA", "TOML", "Test", "Unicode"] -git-tree-sha1 = "b37458ae37d8bdb643d763451585cd8d0e5b4a9e" +git-tree-sha1 = "191e6bef0cf32cac3a3913cd4787d851715254c2" +registries = "General" uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -version = "1.16.1" +version = "1.19.0" [[deps.Downloads]] deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.6.0" +version = "1.7.0" [[deps.EarCut_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" +registries = "General" uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" version = "2.2.4+0" [[deps.EnumX]] -git-tree-sha1 = "bddad79635af6aec424f53ed8aad5d7555dc6f00" +git-tree-sha1 = "c49898e8438c828577f04b92fc9368c388ac783c" +registries = "General" uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" -version = "1.0.5" +version = "1.0.7" [[deps.ExactPredicates]] deps = ["IntervalArithmetic", "Random", "StaticArrays"] git-tree-sha1 = "83231673ea4d3d6008ac74dc5079e77ab2209d8f" +registries = "General" uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" version = "2.2.9" [[deps.Expat_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "27af30de8b5445644e8ffe3bcb0d72049c089cf1" +git-tree-sha1 = "2bfb1e047e2ad0a5ca94365340bde8005d637568" +registries = "General" uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.7.3+0" - -[[deps.Extents]] -git-tree-sha1 = "b309b36a9e02fe7be71270dd8c0fd873625332b4" -uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" -version = "0.1.6" +version = "2.8.4+0" [[deps.FFMPEG_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "3a948313e7a41eb1db7a1e733e6335f17b4ab3c4" +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libva_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "e3c081ec777297fb8fc433012d15a6eaf806b4d2" +registries = "General" uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "7.1.1+0" +version = "9.0.1+0" -[[deps.FFTW]] -deps = ["AbstractFFTs", "FFTW_jll", "Libdl", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] -git-tree-sha1 = "97f08406df914023af55ade2f843c39e99c5d969" -uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" -version = "1.10.0" - -[[deps.FFTW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6d6219a004b8cf1e0b4dbe27a2860b8e04eba0be" -uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" -version = "3.3.11+0" +[[deps.FFTA]] +deps = ["AbstractFFTs", "DocStringExtensions", "LinearAlgebra", "MuladdMacro", "Primes", "Random", "Reexport"] +git-tree-sha1 = "65e55303b72f4a567a51b174dd2c47496efeb95a" +registries = "General" +uuid = "b86e33f2-c0db-4aa1-a6e0-ab43e668529e" +version = "0.3.1" [[deps.FileIO]] deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "d60eb76f37d7e5a40cc2e7c36974d864b82dc802" +git-tree-sha1 = "6621fef488e496356c9c9625d0562c12a6070819" +registries = "General" uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.17.1" +version = "1.20.0" [deps.FileIO.extensions] HTTPExt = "HTTP" @@ -367,6 +467,7 @@ version = "1.17.1" [[deps.FilePaths]] deps = ["FilePathsBase", "MacroTools", "Reexport"] git-tree-sha1 = "a1b2fbfe98503f15b665ed45b3d149e5d8895e4c" +registries = "General" uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" version = "0.9.0" @@ -383,6 +484,7 @@ version = "0.9.0" [[deps.FilePathsBase]] deps = ["Compat", "Dates"] git-tree-sha1 = "3bab2c5aa25e7840a4b065805c0cdfc01f3068d2" +registries = "General" uuid = "48062228-2e41-5def-b9a4-89aafe57970f" version = "0.9.24" weakdeps = ["Mmap", "Test"] @@ -397,38 +499,44 @@ version = "1.11.0" [[deps.FillArrays]] deps = ["LinearAlgebra"] -git-tree-sha1 = "5bfcd42851cf2f1b303f51525a54dc5e98d408a3" +git-tree-sha1 = "5bad39456d9f0166184fce2248783dd9862645c1" +registries = "General" uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.15.0" -weakdeps = ["PDMats", "SparseArrays", "Statistics"] +version = "1.17.0" +weakdeps = ["PDMats", "SparseArrays", "StaticArrays", "Statistics"] [deps.FillArrays.extensions] FillArraysPDMatsExt = "PDMats" FillArraysSparseArraysExt = "SparseArrays" + FillArraysStaticArraysExt = "StaticArrays" FillArraysStatisticsExt = "Statistics" [[deps.FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +deps = ["Random", "Statistics"] +git-tree-sha1 = "59af96b98217c6ef4ae0dfe065ac7c20831d1a84" +registries = "General" uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.5" +version = "0.8.6" [[deps.Fontconfig_jll]] deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] git-tree-sha1 = "f85dac9a96a01087df6e3a749840015a0ca3817d" +registries = "General" uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" version = "2.17.1+0" [[deps.Format]] git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" +registries = "General" uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" version = "1.3.7" [[deps.ForwardDiff]] deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] -git-tree-sha1 = "cd33c7538e68650bd0ddbb3f5bd50a4a0fa95b50" +git-tree-sha1 = "3b0f72e2ffef1a139ac450725c9ecd01c0a3c050" +registries = "General" uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "1.3.0" +version = "1.4.6" weakdeps = ["StaticArrays"] [deps.ForwardDiff.extensions] @@ -437,167 +545,198 @@ weakdeps = ["StaticArrays"] [[deps.FreeType]] deps = ["CEnum", "FreeType2_jll"] git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" +registries = "General" uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" version = "4.1.1" [[deps.FreeType2_jll]] deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" +git-tree-sha1 = "70329abc09b886fd2c5d94ad2d9527639c421e3e" +registries = "General" uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.13.4+0" +version = "2.14.3+1" [[deps.FreeTypeAbstraction]] deps = ["BaseDirs", "ColorVectorSpace", "Colors", "FreeType", "GeometryBasics", "Mmap"] git-tree-sha1 = "4ebb930ef4a43817991ba35db6317a05e59abd11" +registries = "General" uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" version = "0.10.8" [[deps.FriBidi_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" +registries = "General" uuid = "559328eb-81f9-559d-9380-de523a88c83c" version = "1.0.17+0" +[[deps.Gamma]] +deps = ["LogExpFunctions"] +git-tree-sha1 = "becc397f7cfb06e343496ae6ffb04818a851da51" +registries = "General" +uuid = "a0844989-3bd2-4988-8bea-c9407ab0941b" +version = "1.2.0" + [[deps.GeometryBasics]] -deps = ["EarCut_jll", "Extents", "IterTools", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] -git-tree-sha1 = "1f5a80f4ed9f5a4aada88fc2db456e637676414b" +deps = ["EarCut_jll", "LinearAlgebra", "PrecompileTools", "Random", "StaticArrays"] +git-tree-sha1 = "ec46c5825710fa1a15d468acb2d93cc939a7a5fe" +registries = "General" uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" -version = "0.5.10" +version = "0.5.13" [deps.GeometryBasics.extensions] + ExtentsExt = "Extents" GeometryBasicsGeoInterfaceExt = "GeoInterface" + IntervalSetsExt = "IntervalSets" [deps.GeometryBasics.weakdeps] + Extents = "411431e0-e8b7-467b-b5e0-f676ba4f2910" GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" + IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" [[deps.GettextRuntime_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll"] git-tree-sha1 = "45288942190db7c5f760f59c04495064eedf9340" +registries = "General" uuid = "b0724c58-0f36-5564-988d-3bb0596ebc4a" version = "0.22.4+0" [[deps.Giflib_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "6570366d757b50fabae9f4315ad74d2e40c0560a" +registries = "General" uuid = "59f7168a-df46-5410-90c8-f2779963d0ec" version = "5.2.3+0" [[deps.Git]] deps = ["Git_LFS_jll", "Git_jll", "JLLWrappers", "OpenSSH_jll"] git-tree-sha1 = "824a1890086880696fc908fe12a17bcf61738bd8" +registries = "General" uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2" version = "1.5.0" [[deps.Git_LFS_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "bb8471f313ed941f299aa53d32a94ab3bee08844" +git-tree-sha1 = "8c66e385d631bb934ff05e76d4a566c640c8df69" +registries = "General" uuid = "020c3dae-16b3-5ae5-87b3-4cb189e250b2" -version = "3.7.0+0" +version = "3.7.1+0" [[deps.Git_jll]] deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "b6a684587ebe896d9f68ae777f648205940f0f70" +git-tree-sha1 = "7b16700f9e313c0d972d1222ede50a2076aa0770" +registries = "General" uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb" -version = "2.51.3+0" +version = "2.55.0+0" [[deps.Glib_jll]] deps = ["Artifacts", "GettextRuntime_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "50c11ffab2a3d50192a228c313f05b5b5dc5acb2" +git-tree-sha1 = "090526e65de8f69648ac156daae153de8b56df62" +registries = "General" uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.86.0+0" +version = "2.88.3+0" [[deps.Graphics]] deps = ["Colors", "LinearAlgebra", "NaNMath"] git-tree-sha1 = "a641238db938fff9b2f60d08ed9030387daf428c" +registries = "General" uuid = "a2bd30eb-e257-5431-a919-1863eab51364" version = "1.1.3" [[deps.Graphite2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8" +git-tree-sha1 = "69ffb934a5c5b7e086a0b4fee3427db2556fba6e" +registries = "General" uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" -version = "1.3.15+0" +version = "1.3.16+0" [[deps.GridLayoutBase]] deps = ["GeometryBasics", "InteractiveUtils", "Observables"] -git-tree-sha1 = "93d5c27c8de51687a2c70ec0716e6e76f298416f" +git-tree-sha1 = "ef70da5e123a06a29e2d6ddff0f09985bc226491" +registries = "General" uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" -version = "0.11.2" - -[[deps.Grisu]] -git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" -uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" -version = "1.0.2" +version = "0.11.3" [[deps.HarfBuzz_jll]] deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] -git-tree-sha1 = "f923f9a774fcf3f5cb761bfa43aeadd689714813" +git-tree-sha1 = "9d9531a9cb63a9edc33836414e82a07e81710de2" +registries = "General" uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" -version = "8.5.1+0" +version = "100.14004.0+0" [[deps.HypergeometricFunctions]] -deps = ["LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] -git-tree-sha1 = "68c173f4f449de5b438ee67ed0c9c748dc31a2ec" +deps = ["Gamma", "LinearAlgebra"] +git-tree-sha1 = "31bb6c92405c084617facc1d7ed9eb6c402d061e" +registries = "General" uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" -version = "0.3.28" +version = "0.3.30" [[deps.IOCapture]] deps = ["Logging", "Random"] git-tree-sha1 = "0ee181ec08df7d7c911901ea38baf16f755114dc" +registries = "General" uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" version = "1.0.0" [[deps.ImageAxes]] deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] git-tree-sha1 = "e12629406c6c4442539436581041d372d69c55ba" +registries = "General" uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" version = "0.6.12" [[deps.ImageBase]] deps = ["ImageCore", "Reexport"] git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" +registries = "General" uuid = "c817782e-172a-44cc-b673-b171935fbb9e" version = "0.1.7" [[deps.ImageCore]] deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3" +registries = "General" uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" version = "0.10.5" [[deps.ImageIO]] deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs", "WebP"] -git-tree-sha1 = "696144904b76e1ca433b886b4e7edd067d76cbf7" +git-tree-sha1 = "f0f005f997dfb8c5fe23920d99458a9619873893" +registries = "General" uuid = "82e4d734-157c-48bb-816b-45c225c6df19" -version = "0.6.9" +version = "0.6.10" [[deps.ImageMetadata]] deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] git-tree-sha1 = "2a81c3897be6fbcde0802a0ebe6796d0562f63ec" +registries = "General" uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" version = "0.9.10" [[deps.Imath_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52" +git-tree-sha1 = "dcc8d0cd653e55213df9b75ebc6fe4a8d3254c65" +registries = "General" uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" -version = "3.1.11+0" +version = "3.2.2+0" [[deps.IndirectArrays]] git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" +registries = "General" uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" version = "1.0.0" [[deps.Inflate]] git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" +registries = "General" uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" version = "0.1.5" -[[deps.IntelOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "ec1debd61c300961f98064cfb21287613ad7f303" -uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2025.2.0+0" +[[deps.IntegerMathUtils]] +git-tree-sha1 = "c72458f1962faeb003bf23cbdb75164fe6280906" +registries = "General" +uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" +version = "0.1.4" [[deps.InteractiveUtils]] deps = ["Markdown"] @@ -606,9 +745,10 @@ version = "1.11.0" [[deps.Interpolations]] deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] -git-tree-sha1 = "65d505fa4c0d7072990d659ef3fc086eb6da8208" +git-tree-sha1 = "48922d06068130f87e43edef52382e6a94305ae6" +registries = "General" uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" -version = "0.16.2" +version = "0.16.3" weakdeps = ["ForwardDiff", "Unitful"] [deps.Interpolations.extensions] @@ -616,17 +756,20 @@ weakdeps = ["ForwardDiff", "Unitful"] InterpolationsUnitfulExt = "Unitful" [[deps.IntervalArithmetic]] -deps = ["CRlibm", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Printf", "Random", "RoundingEmulator"] -git-tree-sha1 = "02b61501dbe6da3b927cc25dacd7ce32390ee970" +deps = ["CRlibm", "CoreMath", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Printf", "Random", "RoundingEmulator"] +git-tree-sha1 = "1c531bf0f8a5c60a340926e058fd3f209b5eef5d" +registries = "General" uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" -version = "1.0.2" +version = "1.0.12" [deps.IntervalArithmetic.extensions] IntervalArithmeticArblibExt = "Arblib" IntervalArithmeticDiffRulesExt = "DiffRules" IntervalArithmeticForwardDiffExt = "ForwardDiff" IntervalArithmeticIntervalSetsExt = "IntervalSets" + IntervalArithmeticIrrationalConstantsExt = "IrrationalConstants" IntervalArithmeticLinearAlgebraExt = "LinearAlgebra" + IntervalArithmeticMakieExt = "Makie" IntervalArithmeticRecipesBaseExt = "RecipesBase" IntervalArithmeticSparseArraysExt = "SparseArrays" @@ -635,14 +778,17 @@ version = "1.0.2" DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" + IrrationalConstants = "92d709cd-6900-40b7-9082-c6be49f344b6" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [[deps.IntervalSets]] -git-tree-sha1 = "d966f85b3b7a8e49d034d27a189e9a4874b4391a" +git-tree-sha1 = "79d6bd28c8d9bccc2229784f1bd637689b256377" +registries = "General" uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.7.13" +version = "0.7.14" [deps.IntervalSets.extensions] IntervalSetsRandomExt = "Random" @@ -656,6 +802,7 @@ version = "0.7.13" [[deps.InverseFunctions]] git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" +registries = "General" uuid = "3587e190-3f89-42d0-90ee-14403ec27112" version = "0.1.17" weakdeps = ["Dates", "Test"] @@ -666,36 +813,42 @@ weakdeps = ["Dates", "Test"] [[deps.IrrationalConstants]] git-tree-sha1 = "b2d91fe939cae05960e760110b328288867b5758" +registries = "General" uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" version = "0.2.6" [[deps.Isoband]] deps = ["isoband_jll"] git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" +registries = "General" uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" version = "0.1.1" [[deps.IterTools]] git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" +registries = "General" uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" version = "1.10.0" [[deps.IteratorInterfaceExtensions]] git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +registries = "General" uuid = "82899510-4779-5014-852e-03e436cf321d" version = "1.0.0" [[deps.JLLWrappers]] deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "0533e564aae234aff59ab625543145446d8b6ec2" +git-tree-sha1 = "7204148362dafe5fe6a273f855b8ccbe4df8173e" +registries = "General" uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.7.1" +version = "1.8.0" [[deps.JSON]] deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"] -git-tree-sha1 = "5b6bb73f555bc753a6153deec3717b8904f5551c" +git-tree-sha1 = "633b5a34494e711f694ccbc88a6e00102f10238c" +registries = "General" uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "1.3.0" +version = "1.9.0" [deps.JSON.extensions] JSONArrowExt = ["ArrowTypes"] @@ -706,14 +859,16 @@ version = "1.3.0" [[deps.JpegTurbo]] deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] git-tree-sha1 = "9496de8fb52c224a2e3f9ff403947674517317d9" +registries = "General" uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" version = "0.1.6" [[deps.JpegTurbo_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "4255f0032eafd6451d707a51d5f0248b8a165e4d" +git-tree-sha1 = "037babc10853eeb8e585418922246cb97b8e5b74" +registries = "General" uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.1.3+0" +version = "3.2.0+1" [[deps.JuliaSyntaxHighlighting]] deps = ["StyledStrings"] @@ -721,64 +876,60 @@ uuid = "ac6e5ff7-fb65-4e79-a425-ec3bc9c03011" version = "1.12.0" [[deps.KernelDensity]] -deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] -git-tree-sha1 = "ba51324b894edaf1df3ab16e2cc6bc3280a2f1a7" +deps = ["Distributions", "DocStringExtensions", "FFTA", "Interpolations", "StatsBase"] +git-tree-sha1 = "9eda8292dd3268b3b7ec9df21bbfac24e177ec52" +registries = "General" uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" -version = "0.6.10" +version = "0.6.12" [[deps.LAME_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "059aabebaa7c82ccb853dd4a0ee9d17796f7e1bc" +registries = "General" uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" version = "3.100.3+0" [[deps.LERC_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "aaafe88dccbd957a8d82f7d05be9b69172e0cee3" +git-tree-sha1 = "39bca05343661c347aae0bca57a5994a0bf4f08d" +registries = "General" uuid = "88015f11-f218-50d7-93a8-a6af411a945d" -version = "4.0.1+0" +version = "4.2.0+0" [[deps.LLVMOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "eb62a3deb62fc6d8822c0c4bef73e4412419c5d8" +git-tree-sha1 = "e5b100780d4d30d63b4618d7930d48af409c1772" +registries = "General" uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" -version = "18.1.8+0" - -[[deps.LZO_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" -uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" -version = "2.10.3+0" +version = "23.1.1+0" [[deps.LaTeXStrings]] -git-tree-sha1 = "dda21b8cbd6a6c40d9d02a73230f9d70fed6918c" +git-tree-sha1 = "f88f3ccef05a6a72a0cf0ed417c8fd68530f4ab2" +registries = "General" uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.4.0" +version = "1.4.1" [[deps.LazilyInitializedFields]] git-tree-sha1 = "0f2da712350b020bc3957f269c9caad516383ee0" +registries = "General" uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" version = "1.3.0" -[[deps.LazyArtifacts]] -deps = ["Artifacts", "Pkg"] -uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" -version = "1.11.0" - [[deps.LazyModules]] git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" +registries = "General" uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" version = "0.3.1" [[deps.LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" -version = "0.6.4" +version = "1.0.0" [[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "nghttp2_jll"] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "Zlib_jll", "Zstd_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.11.1+1" +version = "8.18.0+1" [[deps.LibGit2]] deps = ["LibGit2_jll", "NetworkOptions", "Printf", "SHA"] @@ -786,14 +937,14 @@ uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" version = "1.11.0" [[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "OpenSSL_jll"] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "LibSSH2_jll", "Libdl", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"] uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.9.0+0" +version = "1.9.1+0" [[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "OpenSSL_jll"] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl", "OpenSSL_jll", "Zlib_jll"] uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.3+1" +version = "1.11.103+0" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" @@ -802,49 +953,56 @@ version = "1.11.0" [[deps.Libffi_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "c8da7e6a91781c41a863611c7e966098d783c57a" +registries = "General" uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" version = "3.4.7+0" [[deps.Libglvnd_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll"] git-tree-sha1 = "d36c21b9e7c172a44a10484125024495e2625ac0" +registries = "General" uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" version = "1.7.1+1" [[deps.Libiconv_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +registries = "General" uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" version = "1.18.0+0" [[deps.Libmount_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "3acf07f130a76f87c041cfb2ff7d7284ca67b072" +git-tree-sha1 = "cc3ad4faf30015a3e8094c9b5b7f19e85bdf2386" +registries = "General" uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.41.2+0" +version = "2.42.0+0" [[deps.Libtiff_jll]] deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] -git-tree-sha1 = "f04133fe05eff1667d2054c53d59f9122383fe05" +git-tree-sha1 = "aebd334d06cee9f24cea70bd19a39749daf73881" +registries = "General" uuid = "89763e89-9b03-5906-acba-b20f662cd828" -version = "4.7.2+0" +version = "4.7.3+0" [[deps.Libuuid_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "2a7a12fc0a4e7fb773450d17975322aa77142106" +git-tree-sha1 = "d620582b1f0cbe2c72dd1d5bd195a9ce73370ab1" +registries = "General" uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.41.2+0" +version = "2.42.0+0" [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -version = "1.12.0" +version = "1.13.0" [[deps.LogExpFunctions]] deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "13ca9e2586b89836fd20cccf56e57e2b9ae7f38f" +git-tree-sha1 = "bba2d9aa057d8f126415de240573e86a8f39d2a1" +registries = "General" uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.29" +version = "1.0.1" [deps.LogExpFunctions.extensions] LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" @@ -860,22 +1018,18 @@ version = "0.3.29" uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" version = "1.11.0" -[[deps.MKL_jll]] -deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] -git-tree-sha1 = "282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa" -uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2025.2.0+0" - [[deps.MacroTools]] git-tree-sha1 = "1e0228a030642014fe5cfe68c2c0a818f9e3f522" +registries = "General" uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" version = "0.5.16" [[deps.Makie]] -deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "ComputePipeline", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "Pkg", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] -git-tree-sha1 = "7e6151c8432b91e76d9f9bc3adc6bbaecd00ec0a" +deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "ComputePipeline", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageBase", "ImageIO", "InteractiveUtils", "Interpolations", "IntervalSets", "InverseFunctions", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "PNGFiles", "Packing", "Pkg", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] +git-tree-sha1 = "5f6f5d1b1fb7ff98c9a083bbfd4c661a9808e758" +registries = "General" uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -version = "0.24.7" +version = "0.24.15" [deps.Makie.extensions] MakieDynamicQuantitiesExt = "DynamicQuantities" @@ -884,9 +1038,10 @@ version = "0.24.7" DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821" [[deps.MappedArrays]] -git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +git-tree-sha1 = "0ee4497a4e80dbd29c058fcee6493f5219556f40" +registries = "General" uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" -version = "0.4.2" +version = "0.4.3" [[deps.Markdown]] deps = ["Base64", "JuliaSyntaxHighlighting", "StyledStrings"] @@ -895,25 +1050,28 @@ version = "1.11.0" [[deps.MarkdownAST]] deps = ["AbstractTrees", "Markdown"] -git-tree-sha1 = "465a70f0fc7d443a00dcdc3267a497397b8a3899" +git-tree-sha1 = "93c718d892e73931841089cdc0e982d6dd9cc87b" +registries = "General" uuid = "d0879d2d-cac2-40c8-9cee-1863dc0c7391" -version = "0.1.2" +version = "0.1.3" [[deps.MaterialModelsBase]] deps = ["ForwardDiff", "StaticArrays", "Tensors"] path = ".." uuid = "af893363-701d-44dc-8b1e-d9a2c129bfc9" -version = "0.3.1" +version = "0.4.0" [[deps.MathTeXEngine]] deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] -git-tree-sha1 = "7eb8cdaa6f0e8081616367c10b31b9d9b34bb02a" +git-tree-sha1 = "aa1078778be5a8e5259ff04fbc3d258b3e78d464" +registries = "General" uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" -version = "0.6.7" +version = "0.6.9" [[deps.Missings]] deps = ["DataAPI"] git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" +registries = "General" uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" version = "1.2.0" @@ -924,22 +1082,32 @@ version = "1.11.0" [[deps.MosaicViews]] deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +registries = "General" uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" version = "0.3.4" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2025.5.20" +version = "2026.8.13" + +[[deps.MuladdMacro]] +deps = ["PrecompileTools"] +git-tree-sha1 = "283bf85d4a767481dd924dff0eee1735e95f449e" +registries = "General" +uuid = "46d2c3a1-f734-5fdb-9937-b9b9aeba4221" +version = "0.2.7" [[deps.NaNMath]] deps = ["OpenLibm_jll"] -git-tree-sha1 = "9b8215b1ee9e78a293f99797cd31375471b2bcae" +git-tree-sha1 = "dbd2e8cd2c1c27f0b584f6661b4309609c5a685e" +registries = "General" uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "1.1.3" +version = "1.1.4" [[deps.Netpbm]] deps = ["FileIO", "ImageCore", "ImageMetadata"] git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" +registries = "General" uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" version = "1.1.1" @@ -949,11 +1117,13 @@ version = "1.3.0" [[deps.Observables]] git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" +registries = "General" uuid = "510215fc-4207-5dde-b226-833fc4488ee2" version = "0.5.5" [[deps.OffsetArrays]] git-tree-sha1 = "117432e406b5c023f665fa73dc26e79ec3630151" +registries = "General" uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" version = "1.17.0" weakdeps = ["Adapt"] @@ -964,75 +1134,84 @@ weakdeps = ["Adapt"] [[deps.Ogg_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "b6aa4566bb7ae78498a5e68943863fa8b5231b59" +registries = "General" uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" version = "1.3.6+0" [[deps.OpenBLASConsistentFPCSR_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "567515ca155d0020a45b05175449b499c63e7015" +git-tree-sha1 = "38a93f17e431141c6470bb67a88952a7c4f0e928" +registries = "General" uuid = "6cdc7f73-28fd-5e50-80fb-958a8875b1af" -version = "0.3.29+0" +version = "0.3.34+0" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.29+0" +version = "0.3.30+0" [[deps.OpenEXR]] deps = ["Colors", "FileIO", "OpenEXR_jll"] git-tree-sha1 = "97db9e07fe2091882c765380ef58ec553074e9c7" +registries = "General" uuid = "52e1d378-f018-4a11-a4be-720524705ac7" version = "0.3.3" [[deps.OpenEXR_jll]] deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "8292dd5c8a38257111ada2174000a33745b06d4e" +git-tree-sha1 = "1bcebd887dd33f1108210b3954049b1bb8af0e7a" +registries = "General" uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" -version = "3.2.4+0" +version = "3.4.15+0" [[deps.OpenLibm_jll]] -deps = ["Artifacts", "Libdl"] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" version = "0.8.7+0" [[deps.OpenSSH_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenSSL_jll", "Zlib_jll"] -git-tree-sha1 = "301412a644646fdc0ad67d0a87487466b491e53d" +git-tree-sha1 = "2da18ab26a6eb38b374c16b157d5a4cc3ab74e02" +registries = "General" uuid = "9bd350c2-7e96-507f-8002-3f2e150b4e1b" -version = "10.2.1+0" +version = "10.5.1+0" [[deps.OpenSSL_jll]] deps = ["Artifacts", "Libdl"] uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.5.1+0" +version = "3.5.6+0" [[deps.OpenSpecFun_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl"] git-tree-sha1 = "1346c9208249809840c91b26703912dff463d335" +registries = "General" uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" version = "0.5.6+0" [[deps.Opus_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c392fc5dd032381919e3b22dd32d6443760ce7ea" +git-tree-sha1 = "e2bb57a313a74b8104064b7efd01406c0a50d2ff" +registries = "General" uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.5.2+0" +version = "1.6.1+0" [[deps.OrderedCollections]] -git-tree-sha1 = "05868e21324cede2207c6f0f466b4bfef6d5e7ee" +git-tree-sha1 = "05f45c2e0de6259db764adbfd2f1dc6d3f8de13c" +registries = "General" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.8.1" +version = "2.0.1" [[deps.PCRE2_jll]] deps = ["Artifacts", "Libdl"] uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.44.0+1" +version = "10.46.0+0" [[deps.PDMats]] deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "d922b4d80d1e12c658da7785e754f4796cc1d60d" +git-tree-sha1 = "123266c25174ef6c8d4718920abc206452cf8de6" +registries = "General" uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.36" +version = "0.11.41" weakdeps = ["StatsBase"] [deps.PDMats.extensions] @@ -1040,44 +1219,50 @@ weakdeps = ["StatsBase"] [[deps.PNGFiles]] deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] -git-tree-sha1 = "cf181f0b1e6a18dfeb0ee8acc4a9d1672499626c" +git-tree-sha1 = "32b657a0d57c310a1a172bfc8c8cf68c5e674323" +registries = "General" uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" -version = "0.4.4" +version = "0.4.5" [[deps.Packing]] deps = ["GeometryBasics"] git-tree-sha1 = "bc5bf2ea3d5351edf285a06b0016788a121ce92c" +registries = "General" uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" version = "0.5.1" [[deps.PaddedViews]] deps = ["OffsetArrays"] git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +registries = "General" uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" version = "0.5.12" [[deps.Pango_jll]] deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "0662b083e11420952f2e62e17eddae7fc07d5997" +git-tree-sha1 = "1912a9f1b9ca55005b03ba075f8e19993583e237" +registries = "General" uuid = "36c8627f-9965-5494-a995-c6b170f724f3" -version = "1.57.0+0" +version = "1.58.2+0" [[deps.Parsers]] -deps = ["Dates", "PrecompileTools", "UUIDs"] -git-tree-sha1 = "7d2f8f21da5db6a806faf7b9b292296da42b2810" +deps = ["Dates", "PrecompileTools"] +git-tree-sha1 = "663e8b48b789916221e0765393b289ca6c88f24e" +registries = "General" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.8.3" +version = "3.0.0" [[deps.Pixman_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] -git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" +git-tree-sha1 = "e4a6721aa89e62e5d4217c0b21bd714263779dda" +registries = "General" uuid = "30392449-352a-5448-841d-b1acce4e97dc" -version = "0.44.2+0" +version = "0.46.4+0" [[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "Zstd_jll", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.12.0" +version = "1.13.0" weakdeps = ["REPL"] [deps.Pkg.extensions] @@ -1086,31 +1271,43 @@ weakdeps = ["REPL"] [[deps.PkgVersion]] deps = ["Pkg"] git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" +registries = "General" uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" version = "0.3.3" [[deps.PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] -git-tree-sha1 = "26ca162858917496748aad52bb5d3be4d26a228a" +deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Reexport", "Statistics"] +git-tree-sha1 = "f20e945b895d2009c6c28d8bbf40a5cd846f7c2f" +registries = "General" uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.4.4" +version = "1.5.0" [[deps.PolygonOps]] git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" +registries = "General" uuid = "647866c9-e3ac-4575-94e7-e3d426903924" version = "0.1.2" [[deps.PrecompileTools]] deps = ["Preferences"] -git-tree-sha1 = "07a921781cab75691315adc645096ed5e370cb77" +git-tree-sha1 = "edbeefc7a4889f528644251bdb5fc9ab5348bc2c" +registries = "General" uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.3.3" +version = "1.3.4" [[deps.Preferences]] deps = ["TOML"] -git-tree-sha1 = "0f27480397253da18fe2c12a4ba4eb9eb208bf3d" +git-tree-sha1 = "5005266de4bfe50e53ff44a5cb5c540b6e47a254" +registries = "General" uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.5.0" +version = "1.6.0" + +[[deps.Primes]] +deps = ["IntegerMathUtils"] +git-tree-sha1 = "25cdd1d20cd005b52fc12cb6be3f75faaf59bb9b" +registries = "General" +uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" +version = "0.5.7" [[deps.Printf]] deps = ["Unicode"] @@ -1120,25 +1317,29 @@ version = "1.11.0" [[deps.ProgressMeter]] deps = ["Distributed", "Printf"] git-tree-sha1 = "fbb92c6c56b34e1a2c4c36058f68f332bec840e7" +registries = "General" uuid = "92933f4c-e287-5a05-a399-4b506db050ca" version = "1.11.0" [[deps.PtrArrays]] -git-tree-sha1 = "1d36ef11a9aaf1e8b74dacc6a731dd1de8fd493d" +git-tree-sha1 = "4fbbafbc6251b883f4d2705356f3641f3652a7fe" +registries = "General" uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" -version = "1.3.0" +version = "1.4.0" [[deps.QOI]] deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] -git-tree-sha1 = "8b3fc30bc0390abdce15f8822c889f669baed73d" +git-tree-sha1 = "472daaa816895cb7aee81658d4e7aec901fa1106" +registries = "General" uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" -version = "1.0.1" +version = "1.0.2" [[deps.QuadGK]] deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "9da16da70037ba9d701192e27befedefb91ec284" +git-tree-sha1 = "5e8e8b0ab68215d7a2b14b9921a946fee794749e" +registries = "General" uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.11.2" +version = "2.11.3" [deps.QuadGK.extensions] QuadGKEnzymeExt = "Enzyme" @@ -1147,7 +1348,7 @@ version = "2.11.2" Enzyme = "7da242da-08ed-463a-9acd-ee780be4f1d9" [[deps.REPL]] -deps = ["InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"] +deps = ["Base64", "Dates", "FileWatching", "InteractiveUtils", "JuliaSyntaxHighlighting", "Markdown", "Sockets", "StyledStrings", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" version = "1.11.0" @@ -1158,12 +1359,14 @@ version = "1.11.0" [[deps.RangeArrays]] git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" +registries = "General" uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" version = "0.3.2" [[deps.Ratios]] deps = ["Requires"] git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" +registries = "General" uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" version = "0.4.5" weakdeps = ["FixedPointNumbers"] @@ -1173,57 +1376,89 @@ weakdeps = ["FixedPointNumbers"] [[deps.Reexport]] git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +registries = "General" uuid = "189a3867-3050-52da-a836-e630ba90ab69" version = "1.2.2" [[deps.RegistryInstances]] deps = ["LazilyInitializedFields", "Pkg", "TOML", "Tar"] git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51" +registries = "General" uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3" version = "0.1.0" [[deps.RelocatableFolders]] deps = ["SHA", "Scratch"] git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" +registries = "General" uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" version = "1.0.1" [[deps.Requires]] deps = ["UUIDs"] git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +registries = "General" uuid = "ae029012-a4dd-5104-9daa-d747884805df" version = "1.3.1" [[deps.Rmath]] deps = ["Random", "Rmath_jll"] git-tree-sha1 = "5b3d50eb374cea306873b371d3f8d3915a018f0b" +registries = "General" uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" version = "0.9.0" [[deps.Rmath_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "58cdd8fb2201a6267e1db87ff148dd6c1dbd8ad8" +git-tree-sha1 = "6d40b2fe70437b01397d2a4d5b020008da4e7019" +registries = "General" uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" -version = "0.5.1+0" +version = "0.5.2+0" + +[[deps.Roots]] +deps = ["Accessors", "CommonSolve", "Printf"] +git-tree-sha1 = "4db094d5e079abbda658acfe1c4d098430417717" +registries = "General" +uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" +version = "3.0.8" + + [deps.Roots.extensions] + RootsChainRulesCoreExt = "ChainRulesCore" + RootsForwardDiffExt = "ForwardDiff" + RootsIntervalRootFindingExt = "IntervalRootFinding" + RootsSymPyExt = "SymPy" + RootsSymPyPythonCallExt = "SymPyPythonCall" + RootsUnitfulExt = "Unitful" + + [deps.Roots.weakdeps] + ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + IntervalRootFinding = "d2bf35a9-74e0-55ec-b149-d360ff49b807" + SymPy = "24249f21-da20-56a4-8eb1-6a02cf4ae2e6" + SymPyPythonCall = "bc8888f7-b21e-4b7c-a06a-5d9c9496438c" + Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" [[deps.RoundingEmulator]] git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" +registries = "General" uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" version = "0.2.1" [[deps.SHA]] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" -version = "0.7.0" +version = "1.0.0" [[deps.SIMD]] deps = ["PrecompileTools"] git-tree-sha1 = "e24dc23107d426a096d3eae6c165b921e74c18e4" +registries = "General" uuid = "fdea26ae-647d-5447-a871-4b548cad5224" version = "3.7.2" [[deps.Scratch]] deps = ["Dates"] git-tree-sha1 = "9b81b8393e50b7d4e6d0a9f14e192294d3b7c109" +registries = "General" uuid = "6c6a2e73-6563-6170-7368-637461726353" version = "1.3.0" @@ -1233,36 +1468,34 @@ version = "1.11.0" [[deps.ShaderAbstractions]] deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays"] -git-tree-sha1 = "818554664a2e01fc3784becb2eb3a82326a604b6" +git-tree-sha1 = "57aa595158717ef165e6f5ab639fe2e3178c0a2b" +registries = "General" uuid = "65257c39-d410-5151-9873-9b3e5be5013e" -version = "0.5.0" +version = "0.5.1" [[deps.SharedArrays]] deps = ["Distributed", "Mmap", "Random", "Serialization"] uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" version = "1.11.0" -[[deps.Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - [[deps.SignedDistanceFields]] -deps = ["Random", "Statistics", "Test"] -git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" +deps = ["Statistics"] +git-tree-sha1 = "3949ad92e1c9d2ff0cd4a1317d5ecbba682f4b92" +registries = "General" uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" -version = "0.4.0" +version = "0.4.1" [[deps.SimpleTraits]] deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "be8eeac05ec97d379347584fa9fe2f5f76795bcb" +git-tree-sha1 = "7ddb0b49c109481b046972c0e4ab02b2127d6a75" +registries = "General" uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.5" +version = "0.9.6" [[deps.Sixel]] deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] git-tree-sha1 = "0494aed9501e7fb65daba895fb7fd57cc38bc743" +registries = "General" uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" version = "0.1.5" @@ -1272,42 +1505,40 @@ version = "1.11.0" [[deps.SortingAlgorithms]] deps = ["DataStructures"] -git-tree-sha1 = "64d974c2e6fdf07f8155b5b2ca2ffa9069b608d9" +git-tree-sha1 = "13cd91cc9be159e3f4d95b857fa2aa383b53772a" +registries = "General" uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.2.2" +version = "1.2.3" [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.12.0" +version = "1.13.0" [[deps.SpecialFunctions]] deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "f2685b435df2613e25fc10ad8c26dddb8640f547" +git-tree-sha1 = "429071b23f4c9a13fb6582f807cc2ef454082408" +registries = "General" uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.6.1" +version = "2.9.0" weakdeps = ["ChainRulesCore"] [deps.SpecialFunctions.extensions] SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" -[[deps.StableRNGs]] -deps = ["Random"] -git-tree-sha1 = "4f96c596b8c8258cc7d3b19797854d368f243ddc" -uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" -version = "1.0.4" - [[deps.StackViews]] deps = ["OffsetArrays"] git-tree-sha1 = "be1cf4eb0ac528d96f5115b4ed80c26a8d8ae621" +registries = "General" uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" version = "0.1.2" [[deps.StaticArrays]] deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "b8693004b385c842357406e3af647701fe783f98" +git-tree-sha1 = "39e70e0ab5d7f89833a62ab7c79df15d4fc417c1" +registries = "General" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.15" +version = "1.9.22" weakdeps = ["ChainRulesCore", "Statistics"] [deps.StaticArrays.extensions] @@ -1316,14 +1547,16 @@ weakdeps = ["ChainRulesCore", "Statistics"] [[deps.StaticArraysCore]] git-tree-sha1 = "6ab403037779dae8c514bad259f32a447262455a" +registries = "General" uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" version = "1.4.4" [[deps.Statistics]] deps = ["LinearAlgebra"] -git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +git-tree-sha1 = "e2b53ce13a53367e96601081e33d34746b571bad" +registries = "General" uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.11.1" +version = "1.11.5" weakdeps = ["SparseArrays"] [deps.Statistics.extensions] @@ -1331,21 +1564,24 @@ weakdeps = ["SparseArrays"] [[deps.StatsAPI]] deps = ["LinearAlgebra"] -git-tree-sha1 = "9d72a13a3f4dd3795a195ac5a44d7d6ff5f552ff" +git-tree-sha1 = "178ed29fd5b2a2cfc3bd31c13375ae925623ff36" +registries = "General" uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.7.1" +version = "1.8.0" [[deps.StatsBase]] -deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "064b532283c97daae49e544bb9cb413c26511f8c" +deps = ["AliasTables", "DataAPI", "DataStructures", "IrrationalConstants", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "adb9da019510162e67a4493fc235c23203d8b09e" +registries = "General" uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.8" +version = "0.34.13" [[deps.StatsFuns]] deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "91f091a8716a6bb38417a6e6f274602a19aaa685" +git-tree-sha1 = "91a5737baed20ee31f3faea0e51f57461f6a689e" +registries = "General" uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "1.5.2" +version = "2.2.1" weakdeps = ["ChainRulesCore", "InverseFunctions"] [deps.StatsFuns.extensions] @@ -1354,9 +1590,10 @@ weakdeps = ["ChainRulesCore", "InverseFunctions"] [[deps.StructArrays]] deps = ["ConstructionBase", "DataAPI", "Tables"] -git-tree-sha1 = "a2c37d815bf00575332b7bd0389f771cb7987214" +git-tree-sha1 = "ad8002667372439f2e3611cfd14097e03fa4bccd" +registries = "General" uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.7.2" +version = "0.7.3" [deps.StructArrays.extensions] StructArraysAdaptExt = "Adapt" @@ -1375,16 +1612,21 @@ version = "0.7.2" [[deps.StructUtils]] deps = ["Dates", "UUIDs"] -git-tree-sha1 = "79529b493a44927dd5b13dde1c7ce957c2d049e4" +git-tree-sha1 = "b814d5005d6a529d740ffe06f8a86396f6501138" +registries = "General" uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42" -version = "2.6.0" +version = "2.9.2" [deps.StructUtils.extensions] + StructUtilsLazilyInitializedFieldsExt = ["LazilyInitializedFields"] StructUtilsMeasurementsExt = ["Measurements"] + StructUtilsStaticArraysCoreExt = ["StaticArraysCore"] StructUtilsTablesExt = ["Tables"] [deps.StructUtils.weakdeps] + LazilyInitializedFields = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" Measurements = "eff96d63-e80a-5855-80a2-b1b0885c5ab7" + StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" [[deps.StyledStrings]] @@ -1396,9 +1638,9 @@ deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" [[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.8.3+2" +version = "7.10.1+0" [[deps.TOML]] deps = ["Dates"] @@ -1408,14 +1650,16 @@ version = "1.0.3" [[deps.TableTraits]] deps = ["IteratorInterfaceExtensions"] git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +registries = "General" uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" version = "1.0.1" [[deps.Tables]] deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] -git-tree-sha1 = "f2c1efbc8f3a609aadf318094f8fc5204bdaf344" +git-tree-sha1 = "a94d9bdda1b7bed0046cea645639ab3f62196fac" +registries = "General" uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.12.1" +version = "1.14.0" [[deps.Tar]] deps = ["ArgTools", "SHA"] @@ -1425,14 +1669,16 @@ version = "1.10.0" [[deps.TensorCore]] deps = ["LinearAlgebra"] git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +registries = "General" uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" version = "0.1.1" [[deps.Tensors]] deps = ["ForwardDiff", "LinearAlgebra", "PrecompileTools", "SIMD", "StaticArrays", "Statistics"] -git-tree-sha1 = "399ec4c46786c47380121f8a6497c65b89f0573f" +git-tree-sha1 = "28b845db2855a43f0228dfb2e1c69cac08e53553" +registries = "General" uuid = "48a634ad-e948-5137-8d70-aa71f2a747f4" -version = "1.16.2" +version = "1.17.1" [[deps.Test]] deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] @@ -1440,18 +1686,21 @@ uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" version = "1.11.0" [[deps.TiffImages]] -deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "PrecompileTools", "ProgressMeter", "SIMD", "UUIDs"] -git-tree-sha1 = "98b9352a24cb6a2066f9ababcc6802de9aed8ad8" +deps = ["CodecZstd", "ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "PrecompileTools", "ProgressMeter", "SIMD", "UUIDs"] +git-tree-sha1 = "9ca5f1f2d42f80df4b8c9f6ab5a64f438bbd9976" +registries = "General" uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" -version = "0.11.6" +version = "0.11.9" [[deps.TranscodingStreams]] git-tree-sha1 = "0c45878dcfdcfa8480052b6ab162cdd138781742" +registries = "General" uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" version = "0.11.3" [[deps.TriplotBase]] git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" +registries = "General" uuid = "981d1d27-644d-49a2-9326-4793e63143c3" version = "0.1.0" @@ -1467,20 +1716,23 @@ version = "1.11.0" [[deps.UnicodeFun]] deps = ["REPL"] git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +registries = "General" uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" version = "0.4.1" [[deps.Unitful]] deps = ["Dates", "LinearAlgebra", "Random"] -git-tree-sha1 = "83360bda12f61c250835830cc40b64f487cc2230" +git-tree-sha1 = "1f0f9f401753701a7e4113b5056ca38d33875b55" +registries = "General" uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" -version = "1.25.1" +version = "1.29.0" [deps.Unitful.extensions] ConstructionBaseUnitfulExt = "ConstructionBase" ForwardDiffExt = "ForwardDiff" InverseFunctionsUnitfulExt = "InverseFunctions" LatexifyExt = ["Latexify", "LaTeXStrings"] + NaNMathExt = "NaNMath" PrintfExt = "Printf" [deps.Unitful.weakdeps] @@ -1489,65 +1741,90 @@ version = "1.25.1" InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" LaTeXStrings = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" Latexify = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" + NaNMath = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" [[deps.WebP]] deps = ["CEnum", "ColorTypes", "FileIO", "FixedPointNumbers", "ImageCore", "libwebp_jll"] git-tree-sha1 = "aa1ca3c47f119fbdae8770c29820e5e6119b83f2" +registries = "General" uuid = "e3aaa7dc-3e4b-44e0-be63-ffb868ccd7c1" version = "0.1.3" [[deps.WoodburyMatrices]] deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" +git-tree-sha1 = "248a7031b3da79a127f14e5dc5f417e26f9f6db7" +registries = "General" uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" -version = "1.0.0" +version = "1.1.0" [[deps.XZ_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "fee71455b0aaa3440dfdd54a9a36ccef829be7d4" +git-tree-sha1 = "e52eca002a11c30a858185efdfb15311e1c7a6bf" +registries = "General" uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" -version = "5.8.1+0" +version = "5.8.4+0" [[deps.Xorg_libX11_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "b5899b25d17bf1889d25906fb9deed5da0c15b3b" +git-tree-sha1 = "808090ede1d41644447dd5cbafced4731c56bd2f" +registries = "General" uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.8.12+0" +version = "1.8.13+0" [[deps.Xorg_libXau_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "aa1261ebbac3ccc8d16558ae6799524c450ed16b" +registries = "General" uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" version = "1.0.13+0" [[deps.Xorg_libXdmcp_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "52858d64353db33a56e13c341d7bf44cd0d7b309" +registries = "General" uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" version = "1.1.6+0" [[deps.Xorg_libXext_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "a4c0ee07ad36bf8bbce1c3bb52d21fb1e0b987fb" +git-tree-sha1 = "1a4a26870bf1e5d26cd585e38038d399d7e65706" +registries = "General" uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.7+0" +version = "1.3.8+0" + +[[deps.Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "75e00946e43621e09d431d9b95818ee751e6b2ef" +registries = "General" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "6.0.2+0" [[deps.Xorg_libXrender_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] git-tree-sha1 = "7ed9347888fac59a618302ee38216dd0379c480d" +registries = "General" uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" version = "0.9.12+0" +[[deps.Xorg_libpciaccess_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "58972370b81423fc546c56a60ed1a009450177c3" +registries = "General" +uuid = "a65dc6b1-eb27-53a1-bb3e-dea574b5389e" +version = "0.19.0+0" + [[deps.Xorg_libxcb_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libXau_jll", "Xorg_libXdmcp_jll"] git-tree-sha1 = "bfcaf7ec088eaba362093393fe11aa141fa15422" +registries = "General" uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" version = "1.17.1+0" [[deps.Xorg_xtrans_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" +registries = "General" uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" version = "1.6.0+0" @@ -1557,88 +1834,109 @@ uuid = "83775a58-1f1d-513f-b197-d71354ab007a" version = "1.3.1+2" [[deps.Zstd_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "446b23e73536f84e8037f5dce465e92275f6a308" +deps = ["CompilerSupportLibraries_jll", "Libdl"] uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" version = "1.5.7+1" [[deps.isoband_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" +registries = "General" uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" version = "0.2.3+0" [[deps.libaom_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "371cc681c00a3ccc3fbc5c0fb91f58ba9bec1ecf" +git-tree-sha1 = "ef17c47d22224aaecc76e597ab21a072e025cf7b" +registries = "General" uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" -version = "3.13.1+0" +version = "3.14.1+0" [[deps.libass_jll]] deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "125eedcb0a4a0bba65b657251ce1d27c8714e9d6" +git-tree-sha1 = "cb007192783c56d8249db4cf0e3495001edfe414" +registries = "General" uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.17.4+0" +version = "0.17.5+0" [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" version = "5.15.0+0" +[[deps.libdrm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libpciaccess_jll"] +git-tree-sha1 = "28e57478e8a160d346a19c28b3fffb9273bcc9c2" +registries = "General" +uuid = "8e53e030-5e6c-5a89-a30b-be5b7263a166" +version = "2.4.134+0" + [[deps.libfdk_aac_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "646634dd19587a56ee2f1199563ec056c5f228df" +registries = "General" uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" version = "2.0.4+0" [[deps.libpng_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "07b6a107d926093898e82b3b1db657ebe33134ec" +git-tree-sha1 = "e51150d5ab85cee6fc36726850f0e627ad2e4aba" +registries = "General" uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.50+0" +version = "1.6.58+0" [[deps.libsixel_jll]] deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "libpng_jll"] git-tree-sha1 = "c1733e347283df07689d71d61e14be986e49e47a" +registries = "General" uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" version = "1.10.5+0" +[[deps.libva_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll", "Xorg_libXext_jll", "Xorg_libXfixes_jll", "libdrm_jll"] +git-tree-sha1 = "7dbf96baae3310fe2fa0df0ccbb3c6288d5816c9" +registries = "General" +uuid = "9a156e7d-b971-5f62-b2c9-67348b8fb97c" +version = "2.23.0+0" + [[deps.libvorbis_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll"] git-tree-sha1 = "11e1772e7f3cc987e9d3de991dd4f6b2602663a5" +registries = "General" uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" version = "1.3.8+0" [[deps.libwebp_jll]] deps = ["Artifacts", "Giflib_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libglvnd_jll", "Libtiff_jll", "libpng_jll"] git-tree-sha1 = "4e4282c4d846e11dce56d74fa8040130b7a95cb3" +registries = "General" uuid = "c5f90fcd-3b7e-5836-afba-fc50a0988cb2" version = "1.6.0+0" [[deps.nghttp2_jll]] -deps = ["Artifacts", "Libdl"] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.64.0+1" - -[[deps.oneTBB_jll]] -deps = ["Artifacts", "JLLWrappers", "LazyArtifacts", "Libdl"] -git-tree-sha1 = "1350188a69a6e46f799d3945beef36435ed7262f" -uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" -version = "2022.0.0+1" +version = "1.67.1+0" [[deps.p7zip_jll]] -deps = ["Artifacts", "Libdl"] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.5.0+2" +version = "17.8.2+0" [[deps.x264_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "14cc7083fc6dff3cc44f2bc435ee96d06ed79aa7" +registries = "General" uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" version = "10164.0.1+0" [[deps.x265_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "e7b67590c14d487e734dcb925924c5dc43ec85f3" +registries = "General" uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" version = "4.1.0+0" + +[registries.General] +url = "https://github.com/JuliaRegistries/General.git" +uuid = "23338594-aafe-5451-b93e-139f81909106" diff --git a/docs/Project.toml b/docs/Project.toml index 14f88e7..1e99430 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -3,3 +3,6 @@ CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" MaterialModelsBase = "af893363-701d-44dc-8b1e-d9a2c129bfc9" Tensors = "48a634ad-e948-5137-8d70-aa71f2a747f4" + +[sources] +MaterialModelsBase = {path = ".."} diff --git a/docs/src/stressiterations.md b/docs/src/stressiterations.md index a6b70c5..fb95b48 100644 --- a/docs/src/stressiterations.md +++ b/docs/src/stressiterations.md @@ -33,4 +33,13 @@ state and the material type into a single type that is passed to the element rou The wrapper `ReducedStressState` is provided for that purpose. ```@docs ReducedStressState +``` + +## Postprocessing +When postprocessing an already converged simulation, it is often useful to calculate +the stress at a strain that is close to, but not exactly, the one used to produce a +given state (e.g. an interpolated value), without advancing any history variables. +`calculate_current_stress` provides this, and supports `ReducedStressState` as well. +```@docs +calculate_current_stress ``` \ No newline at end of file diff --git a/src/MaterialModelsBase.jl b/src/MaterialModelsBase.jl index 499b4c5..ef6f54f 100644 --- a/src/MaterialModelsBase.jl +++ b/src/MaterialModelsBase.jl @@ -22,6 +22,9 @@ export PlaneStress, UniaxialStress, UniaxialNormalStress # Iterative stress s export GeneralStressState # General iterative 3D non-zero stress state export update_stress_state! # For nonzero stress-conditions +# Postprocessing +export calculate_current_stress # Stress consistent with a frozen state + # For parameter identification and differentiation of materials export tovector, tovector!, fromvector # Convert to/from `AbstractVector`s export get_num_tensorcomponents, get_num_statevars # Information about the specific material @@ -158,6 +161,7 @@ struct NoExtraOutput <: AbstractExtraOutput end include("vector_conversion.jl") include("stressiterations.jl") +include("current_stress.jl") include("differentiation.jl") include("ErrorExceptions.jl") diff --git a/src/current_stress.jl b/src/current_stress.jl new file mode 100644 index 0000000..f978f77 --- /dev/null +++ b/src/current_stress.jl @@ -0,0 +1,75 @@ +""" + calculate_current_stress(m::AbstractMaterial, strain, state::AbstractMaterialState) + calculate_current_stress(rss::ReducedStressState, strain, state::AbstractMaterialState) + +Calculate the stress that is energy-conjugated to `strain`, consistent with the *given* +`state`, without invoking any local iteration that would advance history/internal +variables. `state` is normally the already-converged state obtained from a previous +call to `material_response`, e.g. during postprocessing where `strain` may differ +slightly from the strain that produced `state`, such as an interpolated quadrature +point value. + +# Implementing this interface +A material-model developer only needs to implement the full-dimensional method, +`calculate_current_stress(m::MyMaterial, strain, state::MyMaterialState)`. If `MyMaterial` +has no state (i.e. `initial_material_state(m) isa NoMaterialState`), this is not +required either, since [`material_response`](@ref) is then already frozen-state by +definition and a generic fallback is provided. + +Support for a reduced-dimensional stress state (via [`ReducedStressState`](@ref)) then +follows automatically from a generic fallback, which rides `MaterialModelsBase`'s +existing stress-state Newton iteration (e.g. [`PlaneStress`](@ref)) using an internal +frozen-state wrapper, with the tangent obtained by automatic differentiation via +`Tensors.gradient`. A specific reduced-dimensional method, +`calculate_current_stress(stress_state::AbstractStressState, m::MyMaterial, strain, state::MyMaterialState)`, +can be added when a cheaper, non-autodiff alternative exists. +""" +function calculate_current_stress end + +# Fully generic: a material with no state has, by definition, nothing to freeze - +# `material_response` already gives the frozen-state stress. +function calculate_current_stress(m::AbstractMaterial, strain, state::NoMaterialState) + σ, _, _ = material_response(m, strain, state) + return σ +end + +# Wraps a frozen-state stress formula, `f`, mapping a strain (`SecondOrderTensor{3}`, +# i.e. `Tensor{2,3}` or `SymmetricTensor{2,3}`) to a stress (at fixed history/internal +# variables) as an `AbstractMaterial`, so that it can ride the existing stress-state +# Newton iteration (e.g. for `PlaneStress`). The tangent needed for that iteration is +# obtained via automatic differentiation. This powers the generic reduced-dimensional +# fallback of `calculate_current_stress` below. +struct FrozenStressMaterial{F} <: AbstractMaterial + f::F +end +function material_response(fm::FrozenStressMaterial, strain::SecondOrderTensor{3}, old::AbstractMaterialState, args::Vararg{Any,N}) where {N} + dσdϵ, σ = Tensors.gradient(fm.f, strain, :all) + return σ, dσdϵ, old +end + +# Generic reduced-dimensional fallback: as long as `calculate_current_stress(m, strain, +# state)` (full-dimensional) is implemented for `m`, this makes `ReducedStressState` +# support "just work", by autodiff-ing through it. The `NoMaterialState` fast path +# below takes precedence when a cheaper, non-autodiff alternative exists. +function calculate_current_stress(stress_state::AbstractStressState, m::AbstractMaterial, strain, state::AbstractMaterialState) + frozen = FrozenStressMaterial(e -> calculate_current_stress(m, e, state)) + σ, _, _, _ = material_response(stress_state, frozen, strain, NoMaterialState{eltype(strain)}()) + return σ +end + +# Reduced-dimensional fast path for stateless materials: avoids the autodiff in the +# generic fallback above by delegating directly to `material_response`'s own +# (potentially analytic) stress-state handling. +function calculate_current_stress(stress_state::AbstractStressState, m::AbstractMaterial, strain, state::NoMaterialState) + return first(material_response(stress_state, m, strain, state)) +end + +function calculate_current_stress(rss::ReducedStressState, strain, state::AbstractMaterialState) + return calculate_current_stress(rss.stress_state, rss.material, strain, state) +end + +# Disambiguates the two 3-argument methods above for a `ReducedStressState` wrapping a +# stateless material. +function calculate_current_stress(rss::ReducedStressState, strain, state::NoMaterialState) + return calculate_current_stress(rss.stress_state, rss.material, strain, state) +end diff --git a/test/current_stress.jl b/test/current_stress.jl new file mode 100644 index 0000000..c6fb2c7 --- /dev/null +++ b/test/current_stress.jl @@ -0,0 +1,188 @@ +module CurrentStressTestMaterials +using MaterialModelsBase +using Tensors +import MaterialModelsBase as MMB + +# Well-conditioned isotropic elastic stiffness tensors, so that the `PlaneStress` +# Newton iteration used below converges reliably (unlike an arbitrary random +# 4th-order tensor, which need not be positive definite). +function isotropic_C(G, K) + I2 = one(SymmetricTensor{2,3}) + I4vol = otimes(I2, I2) / 3 + I4dev = one(SymmetricTensor{4,3}) - I4vol + return 2G * I4dev + 3K * I4vol +end +function isotropic_C_finite(G, K) + I2 = one(Tensor{2,3}) + return 2G * otimesu(I2, I2) + K * otimes(I2, I2) +end + +# Stateless (NoMaterialState) toy material: exercises the fully generic +# NoMaterialState fallbacks without any material-specific +# `calculate_current_stress` method at all. +struct ToyElastic{T} <: AbstractMaterial + C::SymmetricTensor{4,3,T} +end +MMB.initial_material_state(m::ToyElastic{T}) where {T} = MMB.NoMaterialState{T}() +function MMB.material_response(m::ToyElastic, ϵ::SymmetricTensor{2,3}, state, args...) + return m.C ⊡ ϵ, m.C, state +end + +# Same as `ToyElastic`, but with a specialized `PlaneStress` method that omits the +# optional 4th (full-strain) output, as explicitly permitted by the +# `material_response(::AbstractStressState, ...)` interface. Regression test for a +# `calculate_current_stress` fast path that would otherwise assume 4 outputs. +struct ToyElasticSpecialized{T} <: AbstractMaterial + C::SymmetricTensor{4,3,T} +end +MMB.initial_material_state(m::ToyElasticSpecialized{T}) where {T} = MMB.NoMaterialState{T}() +function MMB.material_response(m::ToyElasticSpecialized, ϵ::SymmetricTensor{2,3}, state, args...) + return m.C ⊡ ϵ, m.C, state +end +function MMB.material_response(::PlaneStress, m::ToyElasticSpecialized, ϵ::SymmetricTensor{2,2}, state, args...) + C_red = SymmetricTensor{4,2}((i, j, k, l) -> m.C[i, j, k, l]) + return C_red ⊡ ϵ, C_red, state +end + +# Small-strain toy material with a state that unconditionally "evolves" every call +# (unlike real plasticity with a yield surface), so that a frozen-state evaluation +# at a different strain is guaranteed to differ from a fresh `material_response` call. +struct ToyHistory{T} <: AbstractMaterial + C::SymmetricTensor{4,3,T} + H::T +end +struct ToyHistoryState{T} <: AbstractMaterialState + ϵp::SymmetricTensor{2,3,T} +end +MMB.initial_material_state(m::ToyHistory{T}) where {T} = ToyHistoryState(zero(SymmetricTensor{2,3,T})) +function MMB.material_response(m::ToyHistory, ϵ::SymmetricTensor{2,3}, state::ToyHistoryState, args...) + ϵp_new = state.ϵp + m.H * (ϵ - state.ϵp) + σ = m.C ⊡ (ϵ - ϵp_new) + dσdϵ = (1 - m.H) * m.C # Consistent tangent: ϵp_new depends linearly on ϵ + return σ, dσdϵ, ToyHistoryState(ϵp_new) +end +MMB.calculate_current_stress(m::ToyHistory, ϵ::SymmetricTensor{2,3}, state::ToyHistoryState) = m.C ⊡ (ϵ - state.ϵp) + +# Finite-strain (nonsymmetric `Tensor{2,3}`) analogue, to check that +# `FrozenStressMaterial`'s autodiff also works for the `Tensor` tensor family. +struct ToyHistoryFinite{T} <: AbstractMaterial + C::Tensor{4,3,T} + H::T +end +struct ToyHistoryFiniteState{T} <: AbstractMaterialState + Fp::Tensor{2,3,T} +end +MMB.initial_material_state(m::ToyHistoryFinite{T}) where {T} = ToyHistoryFiniteState(zero(Tensor{2,3,T})) +function MMB.material_response(m::ToyHistoryFinite, F::Tensor{2,3}, state::ToyHistoryFiniteState, args...) + Fp_new = state.Fp + m.H * (F - state.Fp) + P = m.C ⊡ (F - Fp_new) + dPdF = (1 - m.H) * m.C # Consistent tangent: Fp_new depends linearly on F + return P, dPdF, ToyHistoryFiniteState(Fp_new) +end +MMB.calculate_current_stress(m::ToyHistoryFinite, F::Tensor{2,3}, state::ToyHistoryFiniteState) = m.C ⊡ (F - state.Fp) + +# A plain, stateless material equivalent to `ToyHistory` frozen at a given `ϵp`, used +# as an independent reference to check the generic reduced-dimensional fallback +# (which goes through `FrozenStressMaterial` and autodiff) against MMB's own, +# already-tested, `PlaneStress` Newton iteration on an explicit material. +struct FrozenLinear{T} <: AbstractMaterial + C::SymmetricTensor{4,3,T} + ϵp::SymmetricTensor{2,3,T} +end +MMB.initial_material_state(m::FrozenLinear{T}) where {T} = MMB.NoMaterialState{T}() +function MMB.material_response(m::FrozenLinear, ϵ::SymmetricTensor{2,3}, state, args...) + return m.C ⊡ (ϵ - m.ϵp), m.C, state +end + +end # module + +import .CurrentStressTestMaterials as CT + +@testset "calculate_current_stress" begin + @testset "NoMaterialState generic fallback" begin + C = CT.isotropic_C(80.e3, 160.e3) + m = CT.ToyElastic(C) + state = initial_material_state(m) + @test state isa MaterialModelsBase.NoMaterialState + ϵ = rand(SymmetricTensor{2,3}) + @test calculate_current_stress(m, ϵ, state) ≈ C ⊡ ϵ + + # Reduced-dimensional fast path (no material-specific method exists at all) + rss = ReducedStressState(PlaneStress(), m) + ϵ_red = rand(SymmetricTensor{2,2}) + state_red = initial_material_state(rss) + σ_direct = calculate_current_stress(rss, ϵ_red, state_red) + σ_mr, _, _, _ = material_response(rss, ϵ_red, state_red) + @test σ_direct ≈ σ_mr + + # Regression test: a specialized `material_response(stress_state, m, ...)` + # method is allowed to omit the optional 4th (full-strain) output. + m_spec = CT.ToyElasticSpecialized(C) + state_spec = initial_material_state(m_spec) + σ_spec_direct = calculate_current_stress(PlaneStress(), m_spec, ϵ_red, state_spec) + σ_spec_mr, _, _ = material_response(PlaneStress(), m_spec, ϵ_red, state_spec) + @test σ_spec_direct ≈ σ_spec_mr + end + + @testset "Stateful material, full dimension" begin + C = CT.isotropic_C(80.e3, 160.e3) + m = CT.ToyHistory(C, 0.5) + + state0 = initial_material_state(m) + ϵ1 = rand(SymmetricTensor{2,3}) + σ1, _, state1 = material_response(m, ϵ1, state0) + @test calculate_current_stress(m, ϵ1, state1) ≈ σ1 + + # Frozen-state postprocessing: a different strain should give the frozen-ϵp + # response, NOT a fresh history update. + ϵ2 = ϵ1 + rand(SymmetricTensor{2,3}) / 10 + σ2_frozen = calculate_current_stress(m, ϵ2, state1) + @test σ2_frozen ≈ C ⊡ (ϵ2 - state1.ϵp) + σ2_true, _, state2_true = material_response(m, ϵ2, state1) + @test !(σ2_true ≈ σ2_frozen) + @test state2_true.ϵp != state1.ϵp + end + + @testset "Stateful material, generic reduced-dimensional fallback" begin + C = CT.isotropic_C(80.e3, 160.e3) + m = CT.ToyHistory(C, 0.5) + rss = ReducedStressState(PlaneStress(), m) + + state0 = initial_material_state(rss) + ϵ1 = rand(SymmetricTensor{2,2}) / 10 + σ1, _, state1, _ = material_response(rss, ϵ1, state0) + @test calculate_current_stress(rss, ϵ1, state1) ≈ σ1 + + ϵ2 = ϵ1 + rand(SymmetricTensor{2,2}) / 10 + σ2_frozen = calculate_current_stress(rss, ϵ2, state1) + + # Independent reference: the frozen material is exactly linear elastic in + # (ϵ - state1.ϵp), so its plane-stress response can be obtained directly + # from MMB's own (already-tested) stress-state iteration on an explicit, + # equivalent material, bypassing `calculate_current_stress` entirely. + flin = CT.FrozenLinear(C, state1.ϵp) + σ2_expected, _, _, _ = material_response(PlaneStress(), flin, ϵ2, initial_material_state(flin)) + @test σ2_frozen ≈ σ2_expected + + σ2_true, _, state2_true, _ = material_response(rss, ϵ2, state1) + @test !(σ2_true ≈ σ2_frozen) + @test state2_true.ϵp != state1.ϵp + end + + @testset "Finite-strain (Tensor) frozen-state fallback" begin + C = CT.isotropic_C_finite(80.e3, 160.e3) + m = CT.ToyHistoryFinite(C, 0.5) + rss = ReducedStressState(PlaneStress(), m) + + state0 = initial_material_state(rss) + F1 = one(Tensor{2,2}) + rand(Tensor{2,2}) / 20 + P1, _, state1, _ = material_response(rss, F1, state0) + @test calculate_current_stress(rss, F1, state1) ≈ P1 + + F2 = F1 + rand(Tensor{2,2}) / 20 + P2_frozen = calculate_current_stress(rss, F2, state1) + P2_true, _, state2_true, _ = material_response(rss, F2, state1) + @test !(P2_true ≈ P2_frozen) + @test state2_true.Fp != state1.Fp + end +end diff --git a/test/runtests.jl b/test/runtests.jl index 87ae3a5..bae3982 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -15,6 +15,7 @@ include("utils4testing.jl") include("vector_conversion.jl") include("stressiterations.jl") +include("current_stress.jl") include("differentiation.jl") include("errors.jl") include("performance.jl") From 5780de2eda2d8d3032cd78b99404a000ae9f932a Mon Sep 17 00:00:00 2001 From: Knut Andreas Date: Mon, 21 Sep 2026 09:19:50 -0400 Subject: [PATCH 2/7] Shorten description and change to --- src/current_stress.jl | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/current_stress.jl b/src/current_stress.jl index f978f77..babd089 100644 --- a/src/current_stress.jl +++ b/src/current_stress.jl @@ -1,26 +1,23 @@ """ calculate_current_stress(m::AbstractMaterial, strain, state::AbstractMaterialState) + calculate_current_stress(stress_state::AbstractStressState, m::AbstractMaterial, strain, state::AbstractMaterialState) calculate_current_stress(rss::ReducedStressState, strain, state::AbstractMaterialState) +## Using this interface Calculate the stress that is energy-conjugated to `strain`, consistent with the *given* `state`, without invoking any local iteration that would advance history/internal variables. `state` is normally the already-converged state obtained from a previous -call to `material_response`, e.g. during postprocessing where `strain` may differ -slightly from the strain that produced `state`, such as an interpolated quadrature -point value. +call to `material_response`, e.g. during postprocessing. -# Implementing this interface +## Implementing this interface A material-model developer only needs to implement the full-dimensional method, `calculate_current_stress(m::MyMaterial, strain, state::MyMaterialState)`. If `MyMaterial` has no state (i.e. `initial_material_state(m) isa NoMaterialState`), this is not required either, since [`material_response`](@ref) is then already frozen-state by -definition and a generic fallback is provided. - -Support for a reduced-dimensional stress state (via [`ReducedStressState`](@ref)) then -follows automatically from a generic fallback, which rides `MaterialModelsBase`'s -existing stress-state Newton iteration (e.g. [`PlaneStress`](@ref)) using an internal -frozen-state wrapper, with the tangent obtained by automatic differentiation via -`Tensors.gradient`. A specific reduced-dimensional method, +definition and a generic fallback is provided. Support for a reduced-dimensional stress +state (e.g. via [`ReducedStressState`](@ref)) then follows automatically from a generic +fallback, using the tangent obtained by automatic differentiation via `Tensors.gradient`. +A specific reduced-dimensional method, `calculate_current_stress(stress_state::AbstractStressState, m::MyMaterial, strain, state::MyMaterialState)`, can be added when a cheaper, non-autodiff alternative exists. """ @@ -39,11 +36,12 @@ end # Newton iteration (e.g. for `PlaneStress`). The tangent needed for that iteration is # obtained via automatic differentiation. This powers the generic reduced-dimensional # fallback of `calculate_current_stress` below. -struct FrozenStressMaterial{F} <: AbstractMaterial - f::F +struct FrozenStressMaterial{MT <: AbstractMaterial, ST <: AbstractMaterialState} <: AbstractMaterial + m::MT + s::ST end -function material_response(fm::FrozenStressMaterial, strain::SecondOrderTensor{3}, old::AbstractMaterialState, args::Vararg{Any,N}) where {N} - dσdϵ, σ = Tensors.gradient(fm.f, strain, :all) +function material_response(fm::FrozenStressMaterial, strain::SecondOrderTensor{3}, old::AbstractMaterialState, args...) + dσdϵ, σ = Tensors.gradient(e -> calculate_current_stress(fm.m, e, fm.s), strain, :all) return σ, dσdϵ, old end @@ -52,7 +50,7 @@ end # support "just work", by autodiff-ing through it. The `NoMaterialState` fast path # below takes precedence when a cheaper, non-autodiff alternative exists. function calculate_current_stress(stress_state::AbstractStressState, m::AbstractMaterial, strain, state::AbstractMaterialState) - frozen = FrozenStressMaterial(e -> calculate_current_stress(m, e, state)) + frozen = FrozenStressMaterial(m, state) σ, _, _, _ = material_response(stress_state, frozen, strain, NoMaterialState{eltype(strain)}()) return σ end From bcc44259d2dee12633c16e46c8ac989e34c72d05 Mon Sep 17 00:00:00 2001 From: ClaudeBot Date: Mon, 21 Sep 2026 09:27:22 -0400 Subject: [PATCH 3/7] Fix stale comment after FrozenStressMaterial refactor Follow-up to the field-based FrozenStressMaterial refactor: the comment above the struct still described the old closure-based design. Checked test/current_stress.jl and docs/src/stressiterations.md for anything else referencing the old closure design - neither does (only the type name itself), so the refactor is otherwise fully consistent with tests and docs. Reviewed via Codex (same thread as PR #21): plan and diff review both returned no findings. Pkg.test() passes (104 tests). docs/make.jl builds cleanly with only pre-existing, unrelated warnings. Co-Authored-By: Claude Sonnet 5 --- src/current_stress.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/current_stress.jl b/src/current_stress.jl index babd089..a9685f9 100644 --- a/src/current_stress.jl +++ b/src/current_stress.jl @@ -30,10 +30,10 @@ function calculate_current_stress(m::AbstractMaterial, strain, state::NoMaterial return σ end -# Wraps a frozen-state stress formula, `f`, mapping a strain (`SecondOrderTensor{3}`, -# i.e. `Tensor{2,3}` or `SymmetricTensor{2,3}`) to a stress (at fixed history/internal -# variables) as an `AbstractMaterial`, so that it can ride the existing stress-state -# Newton iteration (e.g. for `PlaneStress`). The tangent needed for that iteration is +# Wraps a material `m` and a frozen state `s` as an `AbstractMaterial`, whose +# `material_response` evaluates `calculate_current_stress(m, strain, s)` (at fixed +# history/internal variables) so that it can ride the existing stress-state Newton +# iteration (e.g. for `PlaneStress`). The tangent needed for that iteration is # obtained via automatic differentiation. This powers the generic reduced-dimensional # fallback of `calculate_current_stress` below. struct FrozenStressMaterial{MT <: AbstractMaterial, ST <: AbstractMaterialState} <: AbstractMaterial From ddce2f7f1ee7181243d558574927e718c63a7e9e Mon Sep 17 00:00:00 2001 From: Knut Andreas Date: Mon, 21 Sep 2026 09:34:46 -0400 Subject: [PATCH 4/7] Reorganize docs and add warning about autodiff --- docs/src/index.md | 8 ++++++++ docs/src/stressiterations.md | 9 --------- src/current_stress.jl | 5 +++++ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/docs/src/index.md b/docs/src/index.md index 3575e6c..63c415b 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -104,6 +104,14 @@ given as AbstractExtraOutput ``` +## Postprocessing +When postprocessing an already converged simulation, it is often useful to calculate +the stress again without advancing any history variables. +`calculate_current_stress` provides this and supports lower-dimensional stress states as well. +```@docs +calculate_current_stress +``` + ### Exceptions Finally, the following exceptions are included ```@docs diff --git a/docs/src/stressiterations.md b/docs/src/stressiterations.md index fb95b48..bcc7bdf 100644 --- a/docs/src/stressiterations.md +++ b/docs/src/stressiterations.md @@ -34,12 +34,3 @@ The wrapper `ReducedStressState` is provided for that purpose. ```@docs ReducedStressState ``` - -## Postprocessing -When postprocessing an already converged simulation, it is often useful to calculate -the stress at a strain that is close to, but not exactly, the one used to produce a -given state (e.g. an interpolated value), without advancing any history variables. -`calculate_current_stress` provides this, and supports `ReducedStressState` as well. -```@docs -calculate_current_stress -``` \ No newline at end of file diff --git a/src/current_stress.jl b/src/current_stress.jl index a9685f9..c62073d 100644 --- a/src/current_stress.jl +++ b/src/current_stress.jl @@ -9,6 +9,11 @@ Calculate the stress that is energy-conjugated to `strain`, consistent with the variables. `state` is normally the already-converged state obtained from a previous call to `material_response`, e.g. during postprocessing. +!!! warning + The tangent obtained by automatic differentiation through this function will not give the + consistent tangent, so it cannot be used as a replacement for `material_response` during + e.g. equilibrium iterations. + ## Implementing this interface A material-model developer only needs to implement the full-dimensional method, `calculate_current_stress(m::MyMaterial, strain, state::MyMaterialState)`. If `MyMaterial` From 08406eac06e5410fde56abc343eed6c5a845a43e Mon Sep 17 00:00:00 2001 From: ClaudeBot Date: Mon, 21 Sep 2026 09:40:40 -0400 Subject: [PATCH 5/7] Fix heading nesting and overbroad wording from docs reorg Follow-up to the docs reorganization and autodiff warning commit. - docs/src/index.md: the new "Postprocessing" section was inserted as a `##` heading, the same level as "API" itself, between "### Extra outputs" and "### Exceptions" (both API subsections). This made "Exceptions" render as a nested subsection of "Postprocessing" instead of a sibling section under "API", confirmed by inspecting the built page's sidebar TOC. Changed to `### Postprocessing`, a sibling of the other API subsections. - src/current_stress.jl: the new warning claimed autodiff through calculate_current_stress "will not give the consistent tangent" - categorically true for materials with history/internal state, but wrong for a stateless material (e.g. `ToyElastic` in test/current_stress.jl), where it returns exactly the consistent tangent. Reworded to scope the claim to materials whose internal/history variables would evolve with strain. Reviewed via Codex (same thread as PR #21): plan review caught the overbroad warning wording (accepted and fixed); diff review after the fix returned no findings. Pkg.test() passes (104 tests, unchanged). docs/make.jl builds cleanly; the sidebar TOC now correctly lists "Postprocessing" as a subsection of "API" rather than displacing "Exceptions". Co-Authored-By: Claude Sonnet 5 --- docs/src/index.md | 2 +- src/current_stress.jl | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/src/index.md b/docs/src/index.md index 63c415b..5e4b34a 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -104,7 +104,7 @@ given as AbstractExtraOutput ``` -## Postprocessing +### Postprocessing When postprocessing an already converged simulation, it is often useful to calculate the stress again without advancing any history variables. `calculate_current_stress` provides this and supports lower-dimensional stress states as well. diff --git a/src/current_stress.jl b/src/current_stress.jl index c62073d..b55112d 100644 --- a/src/current_stress.jl +++ b/src/current_stress.jl @@ -10,9 +10,11 @@ variables. `state` is normally the already-converged state obtained from a previ call to `material_response`, e.g. during postprocessing. !!! warning - The tangent obtained by automatic differentiation through this function will not give the - consistent tangent, so it cannot be used as a replacement for `material_response` during - e.g. equilibrium iterations. + Differentiating this function wrt. `strain` while holding `state` fixed gives a + frozen-state tangent, which generally differs from `material_response`'s consistent + tangent whenever internal/history variables would evolve with `strain` (e.g. for a + plastic or viscous material). It is therefore not a general replacement for + `material_response` during, e.g., equilibrium iterations. ## Implementing this interface A material-model developer only needs to implement the full-dimensional method, From b71d3469ef265c946799c2f67f59c4b636ecc00b Mon Sep 17 00:00:00 2001 From: ClaudeBot Date: Mon, 21 Sep 2026 10:23:37 -0400 Subject: [PATCH 6/7] Rename postprocessing API to stress_from_state Rename the exported function, implementations, documentation, and source/test files to make the fixed-state semantics explicit. Full Pkg.test() suite passes, including all 15 stress_from_state tests; documentation builds successfully. --- docs/src/index.md | 4 +-- src/MaterialModelsBase.jl | 4 +-- ...current_stress.jl => stress_from_state.jl} | 34 +++++++++---------- test/runtests.jl | 2 +- ...current_stress.jl => stress_from_state.jl} | 30 ++++++++-------- 5 files changed, 37 insertions(+), 37 deletions(-) rename src/{current_stress.jl => stress_from_state.jl} (66%) rename test/{current_stress.jl => stress_from_state.jl} (87%) diff --git a/docs/src/index.md b/docs/src/index.md index 5e4b34a..08163a6 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -107,9 +107,9 @@ AbstractExtraOutput ### Postprocessing When postprocessing an already converged simulation, it is often useful to calculate the stress again without advancing any history variables. -`calculate_current_stress` provides this and supports lower-dimensional stress states as well. +`stress_from_state` provides this and supports lower-dimensional stress states as well. ```@docs -calculate_current_stress +stress_from_state ``` ### Exceptions diff --git a/src/MaterialModelsBase.jl b/src/MaterialModelsBase.jl index ef6f54f..18fbdaf 100644 --- a/src/MaterialModelsBase.jl +++ b/src/MaterialModelsBase.jl @@ -23,7 +23,7 @@ export GeneralStressState # General iterative export update_stress_state! # For nonzero stress-conditions # Postprocessing -export calculate_current_stress # Stress consistent with a frozen state +export stress_from_state # Stress consistent with a frozen state # For parameter identification and differentiation of materials export tovector, tovector!, fromvector # Convert to/from `AbstractVector`s @@ -161,7 +161,7 @@ struct NoExtraOutput <: AbstractExtraOutput end include("vector_conversion.jl") include("stressiterations.jl") -include("current_stress.jl") +include("stress_from_state.jl") include("differentiation.jl") include("ErrorExceptions.jl") diff --git a/src/current_stress.jl b/src/stress_from_state.jl similarity index 66% rename from src/current_stress.jl rename to src/stress_from_state.jl index b55112d..c2dc083 100644 --- a/src/current_stress.jl +++ b/src/stress_from_state.jl @@ -1,7 +1,7 @@ """ - calculate_current_stress(m::AbstractMaterial, strain, state::AbstractMaterialState) - calculate_current_stress(stress_state::AbstractStressState, m::AbstractMaterial, strain, state::AbstractMaterialState) - calculate_current_stress(rss::ReducedStressState, strain, state::AbstractMaterialState) + stress_from_state(m::AbstractMaterial, strain, state::AbstractMaterialState) + stress_from_state(stress_state::AbstractStressState, m::AbstractMaterial, strain, state::AbstractMaterialState) + stress_from_state(rss::ReducedStressState, strain, state::AbstractMaterialState) ## Using this interface Calculate the stress that is energy-conjugated to `strain`, consistent with the *given* @@ -18,45 +18,45 @@ call to `material_response`, e.g. during postprocessing. ## Implementing this interface A material-model developer only needs to implement the full-dimensional method, -`calculate_current_stress(m::MyMaterial, strain, state::MyMaterialState)`. If `MyMaterial` +`stress_from_state(m::MyMaterial, strain, state::MyMaterialState)`. If `MyMaterial` has no state (i.e. `initial_material_state(m) isa NoMaterialState`), this is not required either, since [`material_response`](@ref) is then already frozen-state by definition and a generic fallback is provided. Support for a reduced-dimensional stress state (e.g. via [`ReducedStressState`](@ref)) then follows automatically from a generic fallback, using the tangent obtained by automatic differentiation via `Tensors.gradient`. A specific reduced-dimensional method, -`calculate_current_stress(stress_state::AbstractStressState, m::MyMaterial, strain, state::MyMaterialState)`, +`stress_from_state(stress_state::AbstractStressState, m::MyMaterial, strain, state::MyMaterialState)`, can be added when a cheaper, non-autodiff alternative exists. """ -function calculate_current_stress end +function stress_from_state end # Fully generic: a material with no state has, by definition, nothing to freeze - # `material_response` already gives the frozen-state stress. -function calculate_current_stress(m::AbstractMaterial, strain, state::NoMaterialState) +function stress_from_state(m::AbstractMaterial, strain, state::NoMaterialState) σ, _, _ = material_response(m, strain, state) return σ end # Wraps a material `m` and a frozen state `s` as an `AbstractMaterial`, whose -# `material_response` evaluates `calculate_current_stress(m, strain, s)` (at fixed +# `material_response` evaluates `stress_from_state(m, strain, s)` (at fixed # history/internal variables) so that it can ride the existing stress-state Newton # iteration (e.g. for `PlaneStress`). The tangent needed for that iteration is # obtained via automatic differentiation. This powers the generic reduced-dimensional -# fallback of `calculate_current_stress` below. +# fallback of `stress_from_state` below. struct FrozenStressMaterial{MT <: AbstractMaterial, ST <: AbstractMaterialState} <: AbstractMaterial m::MT s::ST end function material_response(fm::FrozenStressMaterial, strain::SecondOrderTensor{3}, old::AbstractMaterialState, args...) - dσdϵ, σ = Tensors.gradient(e -> calculate_current_stress(fm.m, e, fm.s), strain, :all) + dσdϵ, σ = Tensors.gradient(e -> stress_from_state(fm.m, e, fm.s), strain, :all) return σ, dσdϵ, old end -# Generic reduced-dimensional fallback: as long as `calculate_current_stress(m, strain, +# Generic reduced-dimensional fallback: as long as `stress_from_state(m, strain, # state)` (full-dimensional) is implemented for `m`, this makes `ReducedStressState` # support "just work", by autodiff-ing through it. The `NoMaterialState` fast path # below takes precedence when a cheaper, non-autodiff alternative exists. -function calculate_current_stress(stress_state::AbstractStressState, m::AbstractMaterial, strain, state::AbstractMaterialState) +function stress_from_state(stress_state::AbstractStressState, m::AbstractMaterial, strain, state::AbstractMaterialState) frozen = FrozenStressMaterial(m, state) σ, _, _, _ = material_response(stress_state, frozen, strain, NoMaterialState{eltype(strain)}()) return σ @@ -65,16 +65,16 @@ end # Reduced-dimensional fast path for stateless materials: avoids the autodiff in the # generic fallback above by delegating directly to `material_response`'s own # (potentially analytic) stress-state handling. -function calculate_current_stress(stress_state::AbstractStressState, m::AbstractMaterial, strain, state::NoMaterialState) +function stress_from_state(stress_state::AbstractStressState, m::AbstractMaterial, strain, state::NoMaterialState) return first(material_response(stress_state, m, strain, state)) end -function calculate_current_stress(rss::ReducedStressState, strain, state::AbstractMaterialState) - return calculate_current_stress(rss.stress_state, rss.material, strain, state) +function stress_from_state(rss::ReducedStressState, strain, state::AbstractMaterialState) + return stress_from_state(rss.stress_state, rss.material, strain, state) end # Disambiguates the two 3-argument methods above for a `ReducedStressState` wrapping a # stateless material. -function calculate_current_stress(rss::ReducedStressState, strain, state::NoMaterialState) - return calculate_current_stress(rss.stress_state, rss.material, strain, state) +function stress_from_state(rss::ReducedStressState, strain, state::NoMaterialState) + return stress_from_state(rss.stress_state, rss.material, strain, state) end diff --git a/test/runtests.jl b/test/runtests.jl index bae3982..5387978 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -15,7 +15,7 @@ include("utils4testing.jl") include("vector_conversion.jl") include("stressiterations.jl") -include("current_stress.jl") +include("stress_from_state.jl") include("differentiation.jl") include("errors.jl") include("performance.jl") diff --git a/test/current_stress.jl b/test/stress_from_state.jl similarity index 87% rename from test/current_stress.jl rename to test/stress_from_state.jl index c6fb2c7..972551d 100644 --- a/test/current_stress.jl +++ b/test/stress_from_state.jl @@ -19,7 +19,7 @@ end # Stateless (NoMaterialState) toy material: exercises the fully generic # NoMaterialState fallbacks without any material-specific -# `calculate_current_stress` method at all. +# `stress_from_state` method at all. struct ToyElastic{T} <: AbstractMaterial C::SymmetricTensor{4,3,T} end @@ -31,7 +31,7 @@ end # Same as `ToyElastic`, but with a specialized `PlaneStress` method that omits the # optional 4th (full-strain) output, as explicitly permitted by the # `material_response(::AbstractStressState, ...)` interface. Regression test for a -# `calculate_current_stress` fast path that would otherwise assume 4 outputs. +# `stress_from_state` fast path that would otherwise assume 4 outputs. struct ToyElasticSpecialized{T} <: AbstractMaterial C::SymmetricTensor{4,3,T} end @@ -61,7 +61,7 @@ function MMB.material_response(m::ToyHistory, ϵ::SymmetricTensor{2,3}, state::T dσdϵ = (1 - m.H) * m.C # Consistent tangent: ϵp_new depends linearly on ϵ return σ, dσdϵ, ToyHistoryState(ϵp_new) end -MMB.calculate_current_stress(m::ToyHistory, ϵ::SymmetricTensor{2,3}, state::ToyHistoryState) = m.C ⊡ (ϵ - state.ϵp) +MMB.stress_from_state(m::ToyHistory, ϵ::SymmetricTensor{2,3}, state::ToyHistoryState) = m.C ⊡ (ϵ - state.ϵp) # Finite-strain (nonsymmetric `Tensor{2,3}`) analogue, to check that # `FrozenStressMaterial`'s autodiff also works for the `Tensor` tensor family. @@ -79,7 +79,7 @@ function MMB.material_response(m::ToyHistoryFinite, F::Tensor{2,3}, state::ToyHi dPdF = (1 - m.H) * m.C # Consistent tangent: Fp_new depends linearly on F return P, dPdF, ToyHistoryFiniteState(Fp_new) end -MMB.calculate_current_stress(m::ToyHistoryFinite, F::Tensor{2,3}, state::ToyHistoryFiniteState) = m.C ⊡ (F - state.Fp) +MMB.stress_from_state(m::ToyHistoryFinite, F::Tensor{2,3}, state::ToyHistoryFiniteState) = m.C ⊡ (F - state.Fp) # A plain, stateless material equivalent to `ToyHistory` frozen at a given `ϵp`, used # as an independent reference to check the generic reduced-dimensional fallback @@ -98,20 +98,20 @@ end # module import .CurrentStressTestMaterials as CT -@testset "calculate_current_stress" begin +@testset "stress_from_state" begin @testset "NoMaterialState generic fallback" begin C = CT.isotropic_C(80.e3, 160.e3) m = CT.ToyElastic(C) state = initial_material_state(m) @test state isa MaterialModelsBase.NoMaterialState ϵ = rand(SymmetricTensor{2,3}) - @test calculate_current_stress(m, ϵ, state) ≈ C ⊡ ϵ + @test stress_from_state(m, ϵ, state) ≈ C ⊡ ϵ # Reduced-dimensional fast path (no material-specific method exists at all) rss = ReducedStressState(PlaneStress(), m) ϵ_red = rand(SymmetricTensor{2,2}) state_red = initial_material_state(rss) - σ_direct = calculate_current_stress(rss, ϵ_red, state_red) + σ_direct = stress_from_state(rss, ϵ_red, state_red) σ_mr, _, _, _ = material_response(rss, ϵ_red, state_red) @test σ_direct ≈ σ_mr @@ -119,7 +119,7 @@ import .CurrentStressTestMaterials as CT # method is allowed to omit the optional 4th (full-strain) output. m_spec = CT.ToyElasticSpecialized(C) state_spec = initial_material_state(m_spec) - σ_spec_direct = calculate_current_stress(PlaneStress(), m_spec, ϵ_red, state_spec) + σ_spec_direct = stress_from_state(PlaneStress(), m_spec, ϵ_red, state_spec) σ_spec_mr, _, _ = material_response(PlaneStress(), m_spec, ϵ_red, state_spec) @test σ_spec_direct ≈ σ_spec_mr end @@ -131,12 +131,12 @@ import .CurrentStressTestMaterials as CT state0 = initial_material_state(m) ϵ1 = rand(SymmetricTensor{2,3}) σ1, _, state1 = material_response(m, ϵ1, state0) - @test calculate_current_stress(m, ϵ1, state1) ≈ σ1 + @test stress_from_state(m, ϵ1, state1) ≈ σ1 # Frozen-state postprocessing: a different strain should give the frozen-ϵp # response, NOT a fresh history update. ϵ2 = ϵ1 + rand(SymmetricTensor{2,3}) / 10 - σ2_frozen = calculate_current_stress(m, ϵ2, state1) + σ2_frozen = stress_from_state(m, ϵ2, state1) @test σ2_frozen ≈ C ⊡ (ϵ2 - state1.ϵp) σ2_true, _, state2_true = material_response(m, ϵ2, state1) @test !(σ2_true ≈ σ2_frozen) @@ -151,15 +151,15 @@ import .CurrentStressTestMaterials as CT state0 = initial_material_state(rss) ϵ1 = rand(SymmetricTensor{2,2}) / 10 σ1, _, state1, _ = material_response(rss, ϵ1, state0) - @test calculate_current_stress(rss, ϵ1, state1) ≈ σ1 + @test stress_from_state(rss, ϵ1, state1) ≈ σ1 ϵ2 = ϵ1 + rand(SymmetricTensor{2,2}) / 10 - σ2_frozen = calculate_current_stress(rss, ϵ2, state1) + σ2_frozen = stress_from_state(rss, ϵ2, state1) # Independent reference: the frozen material is exactly linear elastic in # (ϵ - state1.ϵp), so its plane-stress response can be obtained directly # from MMB's own (already-tested) stress-state iteration on an explicit, - # equivalent material, bypassing `calculate_current_stress` entirely. + # equivalent material, bypassing `stress_from_state` entirely. flin = CT.FrozenLinear(C, state1.ϵp) σ2_expected, _, _, _ = material_response(PlaneStress(), flin, ϵ2, initial_material_state(flin)) @test σ2_frozen ≈ σ2_expected @@ -177,10 +177,10 @@ import .CurrentStressTestMaterials as CT state0 = initial_material_state(rss) F1 = one(Tensor{2,2}) + rand(Tensor{2,2}) / 20 P1, _, state1, _ = material_response(rss, F1, state0) - @test calculate_current_stress(rss, F1, state1) ≈ P1 + @test stress_from_state(rss, F1, state1) ≈ P1 F2 = F1 + rand(Tensor{2,2}) / 20 - P2_frozen = calculate_current_stress(rss, F2, state1) + P2_frozen = stress_from_state(rss, F2, state1) P2_true, _, state2_true, _ = material_response(rss, F2, state1) @test !(P2_true ≈ P2_frozen) @test state2_true.Fp != state1.Fp From 9fa1a35850cff77026f26d469d97ba3b08ae03e0 Mon Sep 17 00:00:00 2001 From: ClaudeBot Date: Tue, 22 Sep 2026 13:24:57 -0400 Subject: [PATCH 7/7] Remove NoMaterialState fast-path methods from stress_from_state per PR review Deletes the three NoMaterialState-specific stress_from_state methods (full- dimensional fallback, reduced-dimensional fast path, and ReducedStressState disambiguation), per review comments on PR #21. Material developers must now always implement the full-dimensional stress_from_state(m, strain, state) method themselves, even for stateless materials; reduced-dimensional and ReducedStressState support keep following automatically from the existing generic autodiff fallback (via FrozenStressMaterial), which already covers NoMaterialState since it is an AbstractMaterialState. Updated the docstring per the reviewer's suggested wording, dropping the now- removed NoMaterialState carve-out. Updated tests: ToyElastic now implements stress_from_state explicitly; removed ToyElasticSpecialized and its regression test, since it only guarded the deleted fast-path method (material-specific stress_from_state implementations now control their own output count). Pkg.test(): 353 tests pass (14/14 in stress_from_state). docs/make.jl builds cleanly (only pre-existing benign warnings). --- src/stress_from_state.jl | 34 +++++----------------------------- test/stress_from_state.jl | 36 +++++++----------------------------- 2 files changed, 12 insertions(+), 58 deletions(-) diff --git a/src/stress_from_state.jl b/src/stress_from_state.jl index c2dc083..2696611 100644 --- a/src/stress_from_state.jl +++ b/src/stress_from_state.jl @@ -18,25 +18,15 @@ call to `material_response`, e.g. during postprocessing. ## Implementing this interface A material-model developer only needs to implement the full-dimensional method, -`stress_from_state(m::MyMaterial, strain, state::MyMaterialState)`. If `MyMaterial` -has no state (i.e. `initial_material_state(m) isa NoMaterialState`), this is not -required either, since [`material_response`](@ref) is then already frozen-state by -definition and a generic fallback is provided. Support for a reduced-dimensional stress -state (e.g. via [`ReducedStressState`](@ref)) then follows automatically from a generic -fallback, using the tangent obtained by automatic differentiation via `Tensors.gradient`. -A specific reduced-dimensional method, +`stress_from_state(m::MyMaterial, strain, state::MyMaterialState)`. Support for a reduced-dimensional stress +state (e.g. via [`ReducedStressState`](@ref)) then follows automatically from a generic +fallback, using the tangent obtained by automatic differentiation via `Tensors.gradient`. +A specific reduced-dimensional method, `stress_from_state(stress_state::AbstractStressState, m::MyMaterial, strain, state::MyMaterialState)`, can be added when a cheaper, non-autodiff alternative exists. """ function stress_from_state end -# Fully generic: a material with no state has, by definition, nothing to freeze - -# `material_response` already gives the frozen-state stress. -function stress_from_state(m::AbstractMaterial, strain, state::NoMaterialState) - σ, _, _ = material_response(m, strain, state) - return σ -end - # Wraps a material `m` and a frozen state `s` as an `AbstractMaterial`, whose # `material_response` evaluates `stress_from_state(m, strain, s)` (at fixed # history/internal variables) so that it can ride the existing stress-state Newton @@ -54,27 +44,13 @@ end # Generic reduced-dimensional fallback: as long as `stress_from_state(m, strain, # state)` (full-dimensional) is implemented for `m`, this makes `ReducedStressState` -# support "just work", by autodiff-ing through it. The `NoMaterialState` fast path -# below takes precedence when a cheaper, non-autodiff alternative exists. +# support "just work", by autodiff-ing through it. function stress_from_state(stress_state::AbstractStressState, m::AbstractMaterial, strain, state::AbstractMaterialState) frozen = FrozenStressMaterial(m, state) σ, _, _, _ = material_response(stress_state, frozen, strain, NoMaterialState{eltype(strain)}()) return σ end -# Reduced-dimensional fast path for stateless materials: avoids the autodiff in the -# generic fallback above by delegating directly to `material_response`'s own -# (potentially analytic) stress-state handling. -function stress_from_state(stress_state::AbstractStressState, m::AbstractMaterial, strain, state::NoMaterialState) - return first(material_response(stress_state, m, strain, state)) -end - function stress_from_state(rss::ReducedStressState, strain, state::AbstractMaterialState) return stress_from_state(rss.stress_state, rss.material, strain, state) end - -# Disambiguates the two 3-argument methods above for a `ReducedStressState` wrapping a -# stateless material. -function stress_from_state(rss::ReducedStressState, strain, state::NoMaterialState) - return stress_from_state(rss.stress_state, rss.material, strain, state) -end diff --git a/test/stress_from_state.jl b/test/stress_from_state.jl index 972551d..6a488f4 100644 --- a/test/stress_from_state.jl +++ b/test/stress_from_state.jl @@ -17,9 +17,9 @@ function isotropic_C_finite(G, K) return 2G * otimesu(I2, I2) + K * otimes(I2, I2) end -# Stateless (NoMaterialState) toy material: exercises the fully generic -# NoMaterialState fallbacks without any material-specific -# `stress_from_state` method at all. +# Stateless (NoMaterialState) toy material: exercises the generic +# reduced-dimensional fallback (via `FrozenStressMaterial` and autodiff), given +# only a full-dimensional `stress_from_state` method. struct ToyElastic{T} <: AbstractMaterial C::SymmetricTensor{4,3,T} end @@ -27,22 +27,7 @@ MMB.initial_material_state(m::ToyElastic{T}) where {T} = MMB.NoMaterialState{T}( function MMB.material_response(m::ToyElastic, ϵ::SymmetricTensor{2,3}, state, args...) return m.C ⊡ ϵ, m.C, state end - -# Same as `ToyElastic`, but with a specialized `PlaneStress` method that omits the -# optional 4th (full-strain) output, as explicitly permitted by the -# `material_response(::AbstractStressState, ...)` interface. Regression test for a -# `stress_from_state` fast path that would otherwise assume 4 outputs. -struct ToyElasticSpecialized{T} <: AbstractMaterial - C::SymmetricTensor{4,3,T} -end -MMB.initial_material_state(m::ToyElasticSpecialized{T}) where {T} = MMB.NoMaterialState{T}() -function MMB.material_response(m::ToyElasticSpecialized, ϵ::SymmetricTensor{2,3}, state, args...) - return m.C ⊡ ϵ, m.C, state -end -function MMB.material_response(::PlaneStress, m::ToyElasticSpecialized, ϵ::SymmetricTensor{2,2}, state, args...) - C_red = SymmetricTensor{4,2}((i, j, k, l) -> m.C[i, j, k, l]) - return C_red ⊡ ϵ, C_red, state -end +MMB.stress_from_state(m::ToyElastic, ϵ::SymmetricTensor{2,3}, state) = m.C ⊡ ϵ # Small-strain toy material with a state that unconditionally "evolves" every call # (unlike real plasticity with a yield surface), so that a frozen-state evaluation @@ -99,7 +84,7 @@ end # module import .CurrentStressTestMaterials as CT @testset "stress_from_state" begin - @testset "NoMaterialState generic fallback" begin + @testset "Stateless material, generic reduced-dimensional fallback" begin C = CT.isotropic_C(80.e3, 160.e3) m = CT.ToyElastic(C) state = initial_material_state(m) @@ -107,21 +92,14 @@ import .CurrentStressTestMaterials as CT ϵ = rand(SymmetricTensor{2,3}) @test stress_from_state(m, ϵ, state) ≈ C ⊡ ϵ - # Reduced-dimensional fast path (no material-specific method exists at all) + # Reduced-dimensional support follows automatically from the full-dimensional + # method above, via `FrozenStressMaterial` and autodiff. rss = ReducedStressState(PlaneStress(), m) ϵ_red = rand(SymmetricTensor{2,2}) state_red = initial_material_state(rss) σ_direct = stress_from_state(rss, ϵ_red, state_red) σ_mr, _, _, _ = material_response(rss, ϵ_red, state_red) @test σ_direct ≈ σ_mr - - # Regression test: a specialized `material_response(stress_state, m, ...)` - # method is allowed to omit the optional 4th (full-strain) output. - m_spec = CT.ToyElasticSpecialized(C) - state_spec = initial_material_state(m_spec) - σ_spec_direct = stress_from_state(PlaneStress(), m_spec, ϵ_red, state_spec) - σ_spec_mr, _, _ = material_response(PlaneStress(), m_spec, ϵ_red, state_spec) - @test σ_spec_direct ≈ σ_spec_mr end @testset "Stateful material, full dimension" begin