diff --git a/Project.toml b/Project.toml index a1e8554..ff95639 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "MaterialModelsBase" uuid = "af893363-701d-44dc-8b1e-d9a2c129bfc9" authors = ["Knut Andreas Meyer and contributors"] -version = "0.3" +version = "0.3.1" [deps] ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" @@ -15,10 +15,11 @@ julia = "1.11" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" MaterialModelsTesting = "882b014b-b96c-4115-8629-e17fb35110d2" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" [sources] MaterialModelsTesting = {url = "https://github.com/KnutAM/MaterialModelsTesting.jl"} #MaterialModelsTesting = {path = "/Users/knutan/.julia/dev/MaterialModelsTesting"} [targets] -test = ["Test", "FiniteDiff", "MaterialModelsTesting"] +test = ["Test", "FiniteDiff", "MaterialModelsTesting", "Random"] diff --git a/docs/Manifest.toml b/docs/Manifest.toml index 143b059..4e868ea 100644 --- a/docs/Manifest.toml +++ b/docs/Manifest.toml @@ -123,9 +123,9 @@ version = "1.1.1" [[deps.CairoMakie]] deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] -git-tree-sha1 = "f8caabc5a1c1fb88bcbf9bc4078e5656a477afd0" +git-tree-sha1 = "1778fd03576b0b6f88d0eafe89c54a3fb8df96a3" uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -version = "0.15.6" +version = "0.15.7" [[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"] @@ -210,9 +210,9 @@ version = "1.3.0+1" [[deps.ComputePipeline]] deps = ["Observables", "Preferences"] -git-tree-sha1 = "cb1299fee09da21e65ec88c1ff3a259f8d0b5802" +git-tree-sha1 = "21f3ae106d1dcc20a66e96366012f7289ebba498" uuid = "95dc2771-c249-4cd0-9c9f-1f3b4330693c" -version = "0.1.4" +version = "0.1.5" [[deps.ConstructionBase]] git-tree-sha1 = "b4b092499347b18a015186eae3042f72267106cb" @@ -237,9 +237,9 @@ version = "1.16.0" [[deps.DataStructures]] deps = ["OrderedCollections"] -git-tree-sha1 = "6c72198e6a101cccdd4c9731d3985e904ba26037" +git-tree-sha1 = "e357641bb3e0638d353c4b29ea0e40ea644066a6" uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.19.1" +version = "0.19.3" [[deps.DataValueInterfaces]] git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" @@ -253,9 +253,9 @@ version = "1.11.0" [[deps.DelaunayTriangulation]] deps = ["AdaptivePredicates", "EnumX", "ExactPredicates", "Random"] -git-tree-sha1 = "5620ff4ee0084a6ab7097a27ba0c19290200b037" +git-tree-sha1 = "783b21581a051ac91a3921ee37e26a23ed7f57a6" uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" -version = "1.6.4" +version = "1.6.5" [[deps.DiffResults]] deps = ["StaticArraysCore"] @@ -297,9 +297,9 @@ 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 = "352b9a04e74edd16429aec79f033620cf8e780d4" +git-tree-sha1 = "b37458ae37d8bdb643d763451585cd8d0e5b4a9e" uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -version = "1.15.0" +version = "1.16.1" [[deps.Downloads]] deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] @@ -336,9 +336,9 @@ version = "0.1.6" [[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 = "eaa040768ea663ca695d442be1bc97edfe6824f2" +git-tree-sha1 = "3a948313e7a41eb1db7a1e733e6335f17b4ab3c4" uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "6.1.3+0" +version = "7.1.1+0" [[deps.FFTW]] deps = ["AbstractFFTs", "FFTW_jll", "Libdl", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] @@ -365,10 +365,20 @@ version = "1.17.1" HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" [[deps.FilePaths]] -deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"] -git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629" +deps = ["FilePathsBase", "MacroTools", "Reexport"] +git-tree-sha1 = "a1b2fbfe98503f15b665ed45b3d149e5d8895e4c" uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" -version = "0.8.3" +version = "0.9.0" + + [deps.FilePaths.extensions] + FilePathsGlobExt = "Glob" + FilePathsURIParserExt = "URIParser" + FilePathsURIsExt = "URIs" + + [deps.FilePaths.weakdeps] + Glob = "c27321d9-0574-5035-807b-f59d2c89b15c" + URIParser = "30578b45-9adc-5946-b283-645ec420af67" + URIs = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" [[deps.FilePathsBase]] deps = ["Compat", "Dates"] @@ -387,9 +397,9 @@ version = "1.11.0" [[deps.FillArrays]] deps = ["LinearAlgebra"] -git-tree-sha1 = "173e4d8f14230a7523ae11b9a3fa9edb3e0efd78" +git-tree-sha1 = "5bfcd42851cf2f1b303f51525a54dc5e98d408a3" uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.14.0" +version = "1.15.0" weakdeps = ["PDMats", "SparseArrays", "Statistics"] [deps.FillArrays.extensions] @@ -416,9 +426,9 @@ version = "1.3.7" [[deps.ForwardDiff]] deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] -git-tree-sha1 = "ba6ce081425d0afb2bedd00d9884464f764a9225" +git-tree-sha1 = "cd33c7538e68650bd0ddbb3f5bd50a4a0fa95b50" uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "1.2.2" +version = "1.3.0" weakdeps = ["StaticArrays"] [deps.ForwardDiff.extensions] @@ -533,9 +543,9 @@ version = "0.3.28" [[deps.IOCapture]] deps = ["Logging", "Random"] -git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" +git-tree-sha1 = "0ee181ec08df7d7c911901ea38baf16f755114dc" uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" -version = "0.2.5" +version = "1.0.0" [[deps.ImageAxes]] deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] @@ -607,9 +617,9 @@ weakdeps = ["ForwardDiff", "Unitful"] [[deps.IntervalArithmetic]] deps = ["CRlibm", "MacroTools", "OpenBLASConsistentFPCSR_jll", "Printf", "Random", "RoundingEmulator"] -git-tree-sha1 = "bf0210c01fb7d67c31fed97d7c1d1716b98ea689" +git-tree-sha1 = "02b61501dbe6da3b927cc25dacd7ce32390ee970" uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" -version = "1.0.1" +version = "1.0.2" [deps.IntervalArithmetic.extensions] IntervalArithmeticArblibExt = "Arblib" @@ -630,9 +640,9 @@ version = "1.0.1" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [[deps.IntervalSets]] -git-tree-sha1 = "5fbb102dcb8b1a858111ae81d56682376130517d" +git-tree-sha1 = "d966f85b3b7a8e49d034d27a189e9a4874b4391a" uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.7.11" +version = "0.7.13" [deps.IntervalSets.extensions] IntervalSetsRandomExt = "Random" @@ -683,9 +693,9 @@ version = "1.7.1" [[deps.JSON]] deps = ["Dates", "Logging", "Parsers", "PrecompileTools", "StructUtils", "UUIDs", "Unicode"] -git-tree-sha1 = "06ea418d0c95878c8f3031023951edcf25b9e0ef" +git-tree-sha1 = "5b6bb73f555bc753a6153deec3717b8904f5551c" uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "1.2.0" +version = "1.3.0" [deps.JSON.extensions] JSONArrowExt = ["ArrowTypes"] @@ -863,9 +873,15 @@ 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 = "368542cde25d381e44d84c3c4209764f05f4ef19" +git-tree-sha1 = "7e6151c8432b91e76d9f9bc3adc6bbaecd00ec0a" uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -version = "0.24.6" +version = "0.24.7" + + [deps.Makie.extensions] + MakieDynamicQuantitiesExt = "DynamicQuantities" + + [deps.Makie.weakdeps] + DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821" [[deps.MappedArrays]] git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" @@ -884,10 +900,10 @@ uuid = "d0879d2d-cac2-40c8-9cee-1863dc0c7391" version = "0.1.2" [[deps.MaterialModelsBase]] -deps = ["StaticArrays", "Tensors"] +deps = ["ForwardDiff", "StaticArrays", "Tensors"] path = ".." uuid = "af893363-701d-44dc-8b1e-d9a2c129bfc9" -version = "0.2.3" +version = "0.3.1" [[deps.MathTeXEngine]] deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] @@ -1042,9 +1058,9 @@ 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 = "1f7f9bbd5f7a2e5a9f7d96e51c9754454ea7f60b" +git-tree-sha1 = "0662b083e11420952f2e62e17eddae7fc07d5997" uuid = "36c8627f-9965-5494-a995-c6b170f724f3" -version = "1.56.4+0" +version = "1.57.0+0" [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] @@ -1075,9 +1091,9 @@ version = "0.3.3" [[deps.PlotUtils]] deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "StableRNGs", "Statistics"] -git-tree-sha1 = "3ca9a356cd2e113c420f2c13bea19f8d3fb1cb18" +git-tree-sha1 = "26ca162858917496748aad52bb5d3be4d26a228a" uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.4.3" +version = "1.4.4" [[deps.PolygonOps]] git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" @@ -1277,9 +1293,9 @@ weakdeps = ["ChainRulesCore"] [[deps.StableRNGs]] deps = ["Random"] -git-tree-sha1 = "95af145932c2ed859b63329952ce8d633719f091" +git-tree-sha1 = "4f96c596b8c8258cc7d3b19797854d368f243ddc" uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" -version = "1.0.3" +version = "1.0.4" [[deps.StackViews]] deps = ["OffsetArrays"] @@ -1321,9 +1337,9 @@ version = "1.7.1" [[deps.StatsBase]] deps = ["AliasTables", "DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "a136f98cefaf3e2924a66bd75173d1c891ab7453" +git-tree-sha1 = "064b532283c97daae49e544bb9cb413c26511f8c" uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.7" +version = "0.34.8" [[deps.StatsFuns]] deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] @@ -1359,9 +1375,9 @@ version = "0.7.2" [[deps.StructUtils]] deps = ["Dates", "UUIDs"] -git-tree-sha1 = "cd47aa083c9c7bdeb7b92de26deb46d6a33163c9" +git-tree-sha1 = "79529b493a44927dd5b13dde1c7ce957c2d049e4" uuid = "ec057cc2-7a8d-4b58-b3b3-92acb9f63b42" -version = "2.5.1" +version = "2.6.0" [deps.StructUtils.extensions] StructUtilsMeasurementsExt = ["Measurements"] diff --git a/docs/src/differentiation.md b/docs/src/differentiation.md index 674db34..4615a93 100644 --- a/docs/src/differentiation.md +++ b/docs/src/differentiation.md @@ -1,6 +1,8 @@ # Differentation of a material ```@docs MaterialDerivatives +StressStateDerivatives allocate_differentiation_output differentiate_material! +reset_derivatives! ``` diff --git a/src/MaterialModelsBase.jl b/src/MaterialModelsBase.jl index 68fd10b..499b4c5 100644 --- a/src/MaterialModelsBase.jl +++ b/src/MaterialModelsBase.jl @@ -27,7 +27,7 @@ export tovector, tovector!, fromvector # Convert to/from `A export get_num_tensorcomponents, get_num_statevars # Information about the specific material export get_vector_length, get_vector_eltype # Get the length and type when converting objects to vectors export MaterialDerivatives, StressStateDerivatives # Derivative collections -export differentiate_material! # Differentiation routines +export differentiate_material!, reset_derivatives! # Differentiation routines export allocate_differentiation_output # abstract type AbstractMaterial end diff --git a/src/differentiation.jl b/src/differentiation.jl index fa3acfe..bb43e3e 100644 --- a/src/differentiation.jl +++ b/src/differentiation.jl @@ -29,10 +29,8 @@ where `σ` is the stress, `ϵ` the strain, `s` and `ⁿs` are the current and old state variables, and `p` the material parameter vector. * `dσdϵ` -* `dσdⁿs` * `dσdp` * `dsdϵ` -* `dsdⁿs` * `dsdp` """ @@ -50,6 +48,25 @@ function MaterialDerivatives(m::AbstractMaterial) ) end +function reset_derivatives!(md::MaterialDerivatives, m::AbstractMaterial) + # User controls derivative calculation: reset properly + fill!(md.dσdϵ, 0) + fill!(md.dσdp, 0) + fill!(md.dsdϵ, 0) + s_from_p(p) = tovector(initial_material_state(fromvector(p, m))) + ForwardDiff.jacobian!(md.dsdp, s_from_p, tovector(m)) # The only that is normally required + return md +end + +function reset_derivatives!(md::MaterialDerivatives, md_prev::MaterialDerivatives) + # User controls derivative calculation: reset properly + copy!(md.dσdϵ, md_prev.dσdϵ) + copy!(md.dσdp, md_prev.dσdp) + copy!(md.dsdϵ, md_prev.dsdϵ) + copy!(md.dsdp, md_prev.dsdp) # The only that is normally required + return md +end + """ allocate_differentiation_output(::AbstractMaterial) @@ -101,13 +118,22 @@ struct StressStateDerivatives{T} # TODO: Reduce the dimensions, for now all entries (even those that are zero) are stored. end +""" + StressStateDerivatives(stress_state::AbstractStressState, m::AbstractMaterial) + +Create `ssd::StressStateDerivatives` object that allows differentiating the material response wrt material +parameters through the `differentiate_material!(ssd, args...)` function. For standard 3d implementations of `m`, defining +`material_response(m)` and `differentiate_material!(::MaterialDerivatives, m, args...)`, `differentiate_material!(ssd, args...)` +is defined already. +""" function StressStateDerivatives(::AbstractStressState, m::AbstractMaterial) mderiv = MaterialDerivatives(m) np = get_vector_length(m) nt = get_num_tensorcomponents(m) # Should be changed to only save non-controlled entries - dϵdp = zeros(nt, np) - dσdp = zeros(nt, np) - # Should be changed to only save non-controlled entries + # Filled with `NaN`s to ensure we don't rely on these being defined. + dϵdp = fill(NaN, nt, np) + dσdp = fill(NaN, nt, np) + # TODO: Should be changed to only save non-controlled entries vo = Tensors.DEFAULT_VOIGT_ORDER[3] if nt == 6 index = SMatrix{3, 3, Int}(min(vo[i, j], vo[j, i]) for i in 1:3, j in 1:3) @@ -117,6 +143,19 @@ function StressStateDerivatives(::AbstractStressState, m::AbstractMaterial) return StressStateDerivatives(mderiv, dϵdp, dσdp, index, index) end +function reset_derivatives!(sd::StressStateDerivatives, m::AbstractMaterial) + reset_derivatives!(sd.mderiv, m) + fill!(sd.dϵdp, NaN) + fill!(sd.dσdp, NaN) + return sd +end +function reset_derivatives!(sd::StressStateDerivatives, sd_prev::StressStateDerivatives) + reset_derivatives!(sd.mderiv, sd_prev.mderiv) + fill!(sd.dϵdp, NaN) + fill!(sd.dσdp, NaN) + return sd +end + function differentiate_material!(ssd::StressStateDerivatives, stress_state::AbstractStressState, m::AbstractMaterial, ϵ::AbstractTensor, args::Vararg{Any,N}) where {N} σ_full, dσdϵ_full, state, ϵ_full = stress_state_material_response(stress_state, m, ϵ, args...) differentiate_material!(ssd.mderiv, m, ϵ_full, args..., dσdϵ_full) @@ -135,6 +174,26 @@ function differentiate_material!(ssd::StressStateDerivatives, stress_state::Abst return reduce_tensordim(stress_state, σ_full), reduce_stiffness(stress_state, dσdϵ_full), state, ϵ_full end +""" + reset_derivatives!(d::Union{MaterialDerivatives, StressStateDerivatives}, m::AbstractMaterial) + +Reset the derivatives to match the initial derivatives after construction of `d` with the material `m`. + + reset_derivatives!(d::MaterialDerivatives, dprev::MaterialDerivatives) + reset_derivatives!(d::StressStateDerivatives, dprev::StressStateDerivatives) + +Reset the `MaterialDerivatives` to match the continuation from a previous set of derivatives. +I.e. setting the values equal to the previous derivatives. + +!!! warning "StressStateDerivatives" + The `StressStateDerivatives` fields `dϵdp` and `dσdp` are not updated (these could be different due to + different stress states in the different steps), and are set to `NaN`s. This means that implementations + of `differentiate_material!(ssd::StressStateDerivatives, args...)` should not depend on the values stored + in these field (i.e. write-only). The default implementation that should be used in most cases fulfills this. + +""" +function reset_derivatives! end + """ stress_controlled_indices(stress_state::AbstractStressState, ::AbstractTensor)::SVector{N, Int} diff --git a/test/differentiation.jl b/test/differentiation.jl index 4543c5e..c617bb7 100644 --- a/test/differentiation.jl +++ b/test/differentiation.jl @@ -90,4 +90,36 @@ end end end end + function fillrand!(s::T) where {T} + for k in fieldnames(T) + rand!(getfield(s, k)) + end + end + function compare_structs(f::Function, s1::T, s2::T) where {T} + for k in fieldnames(T) + compare_structs(f, getfield(s1, k), getfield(s2, k)) + end + end + function compare_structs(f::Function, a1::T, a2::T) where {T <: Union{<:AbstractArray, <:Number}} + f(a1, a2) + end + @testset "Reset functionality" begin + m = ViscoElastic(LinearElastic(0.52, 0.77), LinearElastic(0.33, 0.54), 0.36) + for ss in (PlaneStress(), UniaxialStress(), UniaxialNormalStress()) + ssd = StressStateDerivatives(ss, m) + ssd2 = StressStateDerivatives(ss, m) + fillrand!(ssd2.mderiv) + reset_derivatives!(ssd2, m) + compare_structs(ssd, ssd2) do a1, a2 + @test a1 == a2 || (all(isnan, a1) && all(isnan, a2)) + end + compare_structs(==, ssd.mderiv, ssd2.mderiv) + fillrand!(ssd.mderiv) + reset_derivatives!(ssd2, ssd) + compare_structs(ssd, ssd2) do a1, a2 + @test a1 == a2 || (all(isnan, a1) && all(isnan, a2)) + end + compare_structs(==, ssd.mderiv, ssd2.mderiv) + end + end end diff --git a/test/runtests.jl b/test/runtests.jl index 46e747c..49971fc 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,5 +1,6 @@ using MaterialModelsBase using Test +using Random using Tensors, StaticArrays import MaterialModelsBase as MMB using FiniteDiff: FiniteDiff