From fb8d553a67578ef40940b1d2da22ec9e3b68de79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Mas=C3=B3?= Date: Tue, 26 May 2026 18:02:53 +0200 Subject: [PATCH 1/7] added simplified Aruda Boyce --- src/Exports.jl | 1 + src/PhysicalModels/MechanicalModels.jl | 31 +++++++++++++++++++ src/PhysicalModels/PhysicalModels.jl | 1 + .../PhysicalModelTests.jl | 8 +++++ 4 files changed, 41 insertions(+) diff --git a/src/Exports.jl b/src/Exports.jl index 824bbc4..51b14e9 100644 --- a/src/Exports.jl +++ b/src/Exports.jl @@ -45,6 +45,7 @@ end @publish PhysicalModels NonlinearMooneyRivlin_CV @publish PhysicalModels NonlinearIncompressibleMooneyRivlin2D_CV @publish PhysicalModels EightChain +@publish PhysicalModels EightChain5Terms @publish PhysicalModels TransverseIsotropy3D @publish PhysicalModels TransverseIsotropy2D @publish PhysicalModels ThermalModel diff --git a/src/PhysicalModels/MechanicalModels.jl b/src/PhysicalModels/MechanicalModels.jl index dbf36dc..fd471c3 100644 --- a/src/PhysicalModels/MechanicalModels.jl +++ b/src/PhysicalModels/MechanicalModels.jl @@ -678,6 +678,37 @@ struct EightChain <: IsoElastic end +struct EightChain5Terms <: IsoElastic + μ::Float64 + λm::Float64 + EightChain5Terms(; μ::Float64, λm::Float64) = new(μ, λm) +end + +function (obj::EightChain5Terms)() + (; μ, λm) = obj + α = (1/2, 1/20, 11/1050, 19/7000, 519/673750) + β = 1 / λm^2 + ∂W∂I(I) = sum(i*αi*β^(i-1)*I^(i-1) for (i, αi) in enumerate(α)) + ∂∂W∂II(I) = sum(i*(i-1)*α[i]*β^(i-1)*I^(i-2) for i in 2:length(α)) + C1 = μ / 2 / ∂W∂I(3) + Ψ(F) = begin + I1F = F⊙F + C1 * sum(αi*β^(i-1)*(I1F^i - 3^i) for (i, αi) in enumerate(α)) + end + ∂Ψ∂I(I) = C1 * ∂W∂I(I) + ∂Ψ∂F(F) = begin + I1F = F⊙F + ∂Ψ∂I(I1F) * 2F + end + ∂∂Ψ∂II(I) = C1 * ∂∂W∂II(I) + ∂∂Ψ∂FF(F) = begin + I1F = F⊙F + 4*∂∂Ψ∂II(I1F)*(F⊗F) + 2*∂Ψ∂I(I1F)*δᵢₖδⱼₗ3D + end + return (Ψ, ∂Ψ∂F, ∂∂Ψ∂FF) +end + + struct TransverseIsotropy3D <: AnisoElastic μ::Float64 diff --git a/src/PhysicalModels/PhysicalModels.jl b/src/PhysicalModels/PhysicalModels.jl index b45ae7e..b8dfb5d 100644 --- a/src/PhysicalModels/PhysicalModels.jl +++ b/src/PhysicalModels/PhysicalModels.jl @@ -35,6 +35,7 @@ export NonlinearNeoHookean_CV export NonlinearMooneyRivlin_CV export NonlinearIncompressibleMooneyRivlin2D_CV export EightChain +export EightChain5Terms export TransverseIsotropy3D export TransverseIsotropy2D export LinearElasticity3D diff --git a/test/TestConstitutiveModels/PhysicalModelTests.jl b/test/TestConstitutiveModels/PhysicalModelTests.jl index 3ef7a49..9d2ede7 100644 --- a/test/TestConstitutiveModels/PhysicalModelTests.jl +++ b/test/TestConstitutiveModels/PhysicalModelTests.jl @@ -355,6 +355,14 @@ end end +@testset "EightChain5Terms" begin + # Memory estimate: 0 bytes, allocs estimate: 0. + model = EightChain5Terms(μ=μParams[1], λm=μParams[2]) + test_derivatives_3D_(model, Kinematics(Mechano, Solid), rtol=1e-13) + test_equilibrium_at_rest_3D(model) +end + + @testset "TransverseIsotropy2D" begin # Memory estimate: 0 bytes, allocs estimate: 0. ∇u = TensorValue(1.0, 2.0, 3.0, 4.0) * 1e-3 From cce3bb5b11bbea250e4206b1963796786d69824d Mon Sep 17 00:00:00 2001 From: miguelmaso Date: Thu, 28 May 2026 13:15:55 +0200 Subject: [PATCH 2/7] changing var name --- src/PhysicalModels/MechanicalModels.jl | 8 ++++---- test/TestConstitutiveModels/PhysicalModelTests.jl | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/PhysicalModels/MechanicalModels.jl b/src/PhysicalModels/MechanicalModels.jl index fd471c3..f86d535 100644 --- a/src/PhysicalModels/MechanicalModels.jl +++ b/src/PhysicalModels/MechanicalModels.jl @@ -680,14 +680,14 @@ end struct EightChain5Terms <: IsoElastic μ::Float64 - λm::Float64 - EightChain5Terms(; μ::Float64, λm::Float64) = new(μ, λm) + N::Float64 + EightChain5Terms(; μ::Float64, N::Float64) = new(μ, N) end function (obj::EightChain5Terms)() - (; μ, λm) = obj + (; μ, N) = obj α = (1/2, 1/20, 11/1050, 19/7000, 519/673750) - β = 1 / λm^2 + β = 1 / N ∂W∂I(I) = sum(i*αi*β^(i-1)*I^(i-1) for (i, αi) in enumerate(α)) ∂∂W∂II(I) = sum(i*(i-1)*α[i]*β^(i-1)*I^(i-2) for i in 2:length(α)) C1 = μ / 2 / ∂W∂I(3) diff --git a/test/TestConstitutiveModels/PhysicalModelTests.jl b/test/TestConstitutiveModels/PhysicalModelTests.jl index 9d2ede7..a561b2b 100644 --- a/test/TestConstitutiveModels/PhysicalModelTests.jl +++ b/test/TestConstitutiveModels/PhysicalModelTests.jl @@ -357,7 +357,7 @@ end @testset "EightChain5Terms" begin # Memory estimate: 0 bytes, allocs estimate: 0. - model = EightChain5Terms(μ=μParams[1], λm=μParams[2]) + model = EightChain5Terms(μ=μParams[1], N=μParams[2]) test_derivatives_3D_(model, Kinematics(Mechano, Solid), rtol=1e-13) test_equilibrium_at_rest_3D(model) end From c13e34d83d18cb255b87d7810b61e15c990a0cb1 Mon Sep 17 00:00:00 2001 From: miguelmaso Date: Wed, 3 Jun 2026 15:42:56 +0200 Subject: [PATCH 3/7] Removed temp 5-terms --- src/Exports.jl | 1 - src/PhysicalModels/MechanicalModels.jl | 92 +++---------------- src/PhysicalModels/PhysicalModels.jl | 1 - .../PhysicalModelTests.jl | 8 -- test/runtests.jl | 6 +- 5 files changed, 18 insertions(+), 90 deletions(-) diff --git a/src/Exports.jl b/src/Exports.jl index 51b14e9..824bbc4 100644 --- a/src/Exports.jl +++ b/src/Exports.jl @@ -45,7 +45,6 @@ end @publish PhysicalModels NonlinearMooneyRivlin_CV @publish PhysicalModels NonlinearIncompressibleMooneyRivlin2D_CV @publish PhysicalModels EightChain -@publish PhysicalModels EightChain5Terms @publish PhysicalModels TransverseIsotropy3D @publish PhysicalModels TransverseIsotropy2D @publish PhysicalModels ThermalModel diff --git a/src/PhysicalModels/MechanicalModels.jl b/src/PhysicalModels/MechanicalModels.jl index f86d535..fc33873 100644 --- a/src/PhysicalModels/MechanicalModels.jl +++ b/src/PhysicalModels/MechanicalModels.jl @@ -614,102 +614,40 @@ struct NonlinearIncompressibleMooneyRivlin2D_CV <: IsoElastic end -struct EightChain <: IsoElastic - μ::Float64 - N::Float64 - function EightChain(; μ::Float64, N::Float64) - new(μ, N) - end +I1iso(F) = det(F)^(-2 / 3) * F ⊙ F +∂I1iso_∂F(F) = 2 * det(F)^(-2 / 3) * F +∂I1iso_∂J(F) = -(2 / 3) * det(F)^(-5 / 3) * F ⊙ F +∂I1iso_∂F∂F(F) = 2 * det(F)^(-2 / 3) * I9 +∂I1iso_∂J∂J(F) = (10 / 9) * det(F)^(-8 / 3) * F ⊙ F +∂I1iso_∂F∂J(F) = -(4 / 3) * det(F)^(-5 / 3) * F - function (obj::EightChain)(Λ::Float64=1.0) - μ, N = obj.μ, obj.N - J(F) = det(F) - H(F) = det(F) * inv(F)' - Ψ(F) = begin - C = F' * F - C_iso = J(F)^(-2 / 3) * C - β = sqrt(tr(C_iso) / 3 / N) - L = β * (3.0 - β^2) / (1.0 - β^2) - β0 = 1 / sqrt(N) - L0 = β0 * (3.0 - β0^2) / (1.0 - β0^2) - μ * N * (β * L + log(L / sinh(L)) - β0*L0 - log(L0 / sinh(L0))) - end +∂I1iso_∂Ftotal(F) = ∂I1iso_∂F(F) + ∂I1iso_∂J(F)*cof(F) +∂I1iso_∂F∂Ftotal(F) = ∂I1iso_∂F∂F(F) + ∂I1iso_∂F∂J(F) ⊗ cof(F) + cof(F) ⊗ ∂I1iso_∂F∂J(F) + ∂I1iso_∂J∂J(F)*cof(F) ⊗ cof(F) + ∂I1iso_∂J(F)*×ᵢ⁴(F) - ∂Ψ∂F(F) = begin - C = F' * F - C_iso = J(F)^(-2 / 3) * C - β = sqrt(tr(C_iso) / 3 / N) - L = β * (3.0 - β^2) / (1.0 - β^2) - ∂β∂I1_ = 0.5 / sqrt(tr(C_iso) * 3 * N) - ∂L∂I1_ = ((3 * (1 - β^2)^2 + 2 * β * (3 * β - β^3)) / (1 - β^2)^2) * ∂β∂I1_ - n = (∂L∂I1_ * sinh(L) - L * cosh(L) * ∂L∂I1_) - d = (L * sinh(L)) - ∂Ψ∂I1_ = μ * N * (∂β∂I1_ * L + β * ∂L∂I1_ + n / d) - ∂I1_∂F = 2 * J(F)^(-2 / 3) * F - ∂I1_∂J = -(2 / 3) * J(F)^(-5 / 3) * tr(C) - ∂Ψ∂I1_ * (∂I1_∂F + ∂I1_∂J * H(F)) - end - ∂Ψ∂FF(F) = begin - H_ = H(F) - C = F' * F - C_iso = det(F)^(-2 / 3) * C - β = sqrt(tr(C_iso) / 3 / N) - L = β * (3.0 - β^2) / (1.0 - β^2) - ∂β∂I1_ = 0.5 / sqrt(tr(C_iso) * 3 * N) - ∂L∂I1_ = ((3 * (1 - β^2)^2 + 2 * β * (3 * β - β^3)) / (1 - β^2)^2) * ∂β∂I1_ - ∂β∂I1I1_ = -(3 * N) / (4 * (3 * N * tr(C_iso))^(3 / 2)) - ∂L∂I1I1_ = ((4 * β * (β^2 + 3)) / (1 - β^2)^3) * ∂β∂I1_^2 + ((3 * (1 - β^2)^2 + 2 * β * (3 * β - β^3)) / (1 - β^2)^2) * ∂β∂I1I1_ - ∂I1_∂F = 2 * det(F)^(-2 / 3) * F - ∂I1_∂J = -(2 / 3) * det(F)^(-5 / 3) * tr(C) - ∂I1_∂F∂F = 2 * det(F)^(-2 / 3) * I9 - ∂I1_∂J∂J = (10 / 9) * det(F)^(-8 / 3) * tr(C) - ∂I1_∂F∂J = -(4 / 3) * det(F)^(-5 / 3) * F - n = (∂L∂I1_ * sinh(L) - L * cosh(L) * ∂L∂I1_) - d = (L * sinh(L)) - ∂n∂I1_ = ∂L∂I1I1_ * sinh(L) + ∂L∂I1_ * ∂L∂I1_ * cosh(L) - ∂L∂I1_^2 * cosh(L) - L * sinh(L) * ∂L∂I1_^2 - L * cosh(L) * ∂L∂I1I1_ - ∂d∂I1_ = ∂L∂I1_ * sinh(L) + L * ∂L∂I1_ * cosh(L) - ∂Ψ∂I1_ = μ * N * (∂β∂I1_ * L + β * ∂L∂I1_ + n / d) - ∂Ψ∂I1I1_ = μ * N * (∂β∂I1I1_ * L + 2 * ∂β∂I1_ * ∂L∂I1_ + β * ∂L∂I1I1_ + (∂n∂I1_ * d - n * ∂d∂I1_) / d^2) - ∂Ψ∂I1I1_ * ((∂I1_∂F + ∂I1_∂J * H_) ⊗ (∂I1_∂F + ∂I1_∂J * H_)) + ∂Ψ∂I1_ * (∂I1_∂F∂F + ∂I1_∂F∂J ⊗ H_ + H_ ⊗ ∂I1_∂F∂J + ∂I1_∂J∂J * (H_ ⊗ H_) + I9 × (∂I1_∂J * F)) - end - return (Ψ, ∂Ψ∂F, ∂Ψ∂FF) - end -end - - -struct EightChain5Terms <: IsoElastic +struct EightChain <: IsoElastic μ::Float64 N::Float64 - EightChain5Terms(; μ::Float64, N::Float64) = new(μ, N) + EightChain(; μ::Float64, N::Float64) = new(μ, N) end -function (obj::EightChain5Terms)() +function (obj::EightChain)() (; μ, N) = obj α = (1/2, 1/20, 11/1050, 19/7000, 519/673750) β = 1 / N + WI(I) = sum(αi*β^(i-1)*(I^i - 3^i) for (i, αi) in enumerate(α)) ∂W∂I(I) = sum(i*αi*β^(i-1)*I^(i-1) for (i, αi) in enumerate(α)) ∂∂W∂II(I) = sum(i*(i-1)*α[i]*β^(i-1)*I^(i-2) for i in 2:length(α)) C1 = μ / 2 / ∂W∂I(3) - Ψ(F) = begin - I1F = F⊙F - C1 * sum(αi*β^(i-1)*(I1F^i - 3^i) for (i, αi) in enumerate(α)) - end + Ψ(F) = C1 * WI(I1iso(F)) ∂Ψ∂I(I) = C1 * ∂W∂I(I) - ∂Ψ∂F(F) = begin - I1F = F⊙F - ∂Ψ∂I(I1F) * 2F - end + ∂Ψ∂F(F) = ∂Ψ∂I(I1iso(F)) * ∂I1iso_∂Ftotal(F) ∂∂Ψ∂II(I) = C1 * ∂∂W∂II(I) - ∂∂Ψ∂FF(F) = begin - I1F = F⊙F - 4*∂∂Ψ∂II(I1F)*(F⊗F) + 2*∂Ψ∂I(I1F)*δᵢₖδⱼₗ3D - end + ∂∂Ψ∂FF(F) = ∂∂Ψ∂II(I1iso(F)) * ∂I1iso_∂Ftotal(F) ⊗ ∂I1iso_∂Ftotal(F) + ∂Ψ∂I(I1iso(F)) * ∂I1iso_∂F∂Ftotal(F) return (Ψ, ∂Ψ∂F, ∂∂Ψ∂FF) end - struct TransverseIsotropy3D <: AnisoElastic μ::Float64 α1::Float64 diff --git a/src/PhysicalModels/PhysicalModels.jl b/src/PhysicalModels/PhysicalModels.jl index b8dfb5d..b45ae7e 100644 --- a/src/PhysicalModels/PhysicalModels.jl +++ b/src/PhysicalModels/PhysicalModels.jl @@ -35,7 +35,6 @@ export NonlinearNeoHookean_CV export NonlinearMooneyRivlin_CV export NonlinearIncompressibleMooneyRivlin2D_CV export EightChain -export EightChain5Terms export TransverseIsotropy3D export TransverseIsotropy2D export LinearElasticity3D diff --git a/test/TestConstitutiveModels/PhysicalModelTests.jl b/test/TestConstitutiveModels/PhysicalModelTests.jl index a561b2b..3ef7a49 100644 --- a/test/TestConstitutiveModels/PhysicalModelTests.jl +++ b/test/TestConstitutiveModels/PhysicalModelTests.jl @@ -355,14 +355,6 @@ end end -@testset "EightChain5Terms" begin - # Memory estimate: 0 bytes, allocs estimate: 0. - model = EightChain5Terms(μ=μParams[1], N=μParams[2]) - test_derivatives_3D_(model, Kinematics(Mechano, Solid), rtol=1e-13) - test_equilibrium_at_rest_3D(model) -end - - @testset "TransverseIsotropy2D" begin # Memory estimate: 0 bytes, allocs estimate: 0. ∇u = TensorValue(1.0, 2.0, 3.0, 4.0) * 1e-3 diff --git a/test/runtests.jl b/test/runtests.jl index 85b11d1..db0e1a1 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -6,10 +6,10 @@ using Test include("TestConstitutiveModels/runtests.jl") - include("TestTensorAlgebra/runtests.jl") + # include("TestTensorAlgebra/runtests.jl") - include("TestWeakForms/runtests.jl") + # include("TestWeakForms/runtests.jl") - include("SimulationsTests/runtests.jl") + # include("SimulationsTests/runtests.jl") end; From 4943a36082d921c0c430a11281232057baada46c Mon Sep 17 00:00:00 2001 From: miguelmaso Date: Wed, 3 Jun 2026 15:44:12 +0200 Subject: [PATCH 4/7] hotfix tests --- test/runtests.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index db0e1a1..85b11d1 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -6,10 +6,10 @@ using Test include("TestConstitutiveModels/runtests.jl") - # include("TestTensorAlgebra/runtests.jl") + include("TestTensorAlgebra/runtests.jl") - # include("TestWeakForms/runtests.jl") + include("TestWeakForms/runtests.jl") - # include("SimulationsTests/runtests.jl") + include("SimulationsTests/runtests.jl") end; From c3707b347c8414e92f1b1207f4ad6f7a49ed7e1d Mon Sep 17 00:00:00 2001 From: miguelmaso Date: Wed, 3 Jun 2026 16:04:41 +0200 Subject: [PATCH 5/7] missing default argument --- src/PhysicalModels/MechanicalModels.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PhysicalModels/MechanicalModels.jl b/src/PhysicalModels/MechanicalModels.jl index fc33873..1336eba 100644 --- a/src/PhysicalModels/MechanicalModels.jl +++ b/src/PhysicalModels/MechanicalModels.jl @@ -631,7 +631,7 @@ struct EightChain <: IsoElastic EightChain(; μ::Float64, N::Float64) = new(μ, N) end -function (obj::EightChain)() +function (obj::EightChain)(::Float64=0.0) (; μ, N) = obj α = (1/2, 1/20, 11/1050, 19/7000, 519/673750) β = 1 / N From bb4be33c225ef9d061c85ae9030655764f97b3e5 Mon Sep 17 00:00:00 2001 From: miguelmaso Date: Fri, 5 Jun 2026 11:28:43 +0200 Subject: [PATCH 6/7] even simpler model implementation --- src/PhysicalModels/MechanicalModels.jl | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/PhysicalModels/MechanicalModels.jl b/src/PhysicalModels/MechanicalModels.jl index 1336eba..b81d06f 100644 --- a/src/PhysicalModels/MechanicalModels.jl +++ b/src/PhysicalModels/MechanicalModels.jl @@ -635,14 +635,11 @@ function (obj::EightChain)(::Float64=0.0) (; μ, N) = obj α = (1/2, 1/20, 11/1050, 19/7000, 519/673750) β = 1 / N - WI(I) = sum(αi*β^(i-1)*(I^i - 3^i) for (i, αi) in enumerate(α)) - ∂W∂I(I) = sum(i*αi*β^(i-1)*I^(i-1) for (i, αi) in enumerate(α)) - ∂∂W∂II(I) = sum(i*(i-1)*α[i]*β^(i-1)*I^(i-2) for i in 2:length(α)) - C1 = μ / 2 / ∂W∂I(3) - Ψ(F) = C1 * WI(I1iso(F)) - ∂Ψ∂I(I) = C1 * ∂W∂I(I) + C1 = μ / 2 / sum(i*αi*(3*β)^(i-1) for (i, αi) in enumerate(α)) + Ψ(I) = C1 * sum(αi*β^(i-1)*(I^i - 3^i) for (i, αi) in enumerate(α)) + ∂Ψ∂I(I) = C1 * sum(i*αi*β^(i-1)*I^(i-1) for (i, αi) in enumerate(α)) + ∂∂Ψ∂II(I) = C1 * sum(i*(i-1)*α[i]*β^(i-1)*I^(i-2) for i in 2:length(α)) ∂Ψ∂F(F) = ∂Ψ∂I(I1iso(F)) * ∂I1iso_∂Ftotal(F) - ∂∂Ψ∂II(I) = C1 * ∂∂W∂II(I) ∂∂Ψ∂FF(F) = ∂∂Ψ∂II(I1iso(F)) * ∂I1iso_∂Ftotal(F) ⊗ ∂I1iso_∂Ftotal(F) + ∂Ψ∂I(I1iso(F)) * ∂I1iso_∂F∂Ftotal(F) return (Ψ, ∂Ψ∂F, ∂∂Ψ∂FF) end From 6b4099e62b1696b66a14d5623cec789353132e15 Mon Sep 17 00:00:00 2001 From: miguelmaso Date: Fri, 5 Jun 2026 12:16:19 +0200 Subject: [PATCH 7/7] fixed energy definition --- src/PhysicalModels/MechanicalModels.jl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/PhysicalModels/MechanicalModels.jl b/src/PhysicalModels/MechanicalModels.jl index b81d06f..dc6aeac 100644 --- a/src/PhysicalModels/MechanicalModels.jl +++ b/src/PhysicalModels/MechanicalModels.jl @@ -636,11 +636,12 @@ function (obj::EightChain)(::Float64=0.0) α = (1/2, 1/20, 11/1050, 19/7000, 519/673750) β = 1 / N C1 = μ / 2 / sum(i*αi*(3*β)^(i-1) for (i, αi) in enumerate(α)) - Ψ(I) = C1 * sum(αi*β^(i-1)*(I^i - 3^i) for (i, αi) in enumerate(α)) - ∂Ψ∂I(I) = C1 * sum(i*αi*β^(i-1)*I^(i-1) for (i, αi) in enumerate(α)) - ∂∂Ψ∂II(I) = C1 * sum(i*(i-1)*α[i]*β^(i-1)*I^(i-2) for i in 2:length(α)) - ∂Ψ∂F(F) = ∂Ψ∂I(I1iso(F)) * ∂I1iso_∂Ftotal(F) - ∂∂Ψ∂FF(F) = ∂∂Ψ∂II(I1iso(F)) * ∂I1iso_∂Ftotal(F) ⊗ ∂I1iso_∂Ftotal(F) + ∂Ψ∂I(I1iso(F)) * ∂I1iso_∂F∂Ftotal(F) + W(I) = C1 * sum(αi*β^(i-1)*(I^i - 3^i) for (i, αi) in enumerate(α)) + ∂W∂I(I) = C1 * sum(i*αi*β^(i-1)*I^(i-1) for (i, αi) in enumerate(α)) + ∂∂W∂II(I) = C1 * sum(i*(i-1)*α[i]*β^(i-1)*I^(i-2) for i in 2:length(α)) + Ψ(F) = W(I1iso(F)) + ∂Ψ∂F(F) = ∂W∂I(I1iso(F)) * ∂I1iso_∂Ftotal(F) + ∂∂Ψ∂FF(F) = ∂∂W∂II(I1iso(F)) * ∂I1iso_∂Ftotal(F) ⊗ ∂I1iso_∂Ftotal(F) + ∂W∂I(I1iso(F)) * ∂I1iso_∂F∂Ftotal(F) return (Ψ, ∂Ψ∂F, ∂∂Ψ∂FF) end