Skip to content

Commit 82073d4

Browse files
authored
Merge pull request #9 from MultiSimOLab/eight-br
Analytical derivatives for eight-chain model
2 parents a15edf1 + 04591ad commit 82073d4

2 files changed

Lines changed: 78 additions & 12 deletions

File tree

src/PhysicalModels/PhysicalModels.jl

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -909,16 +909,57 @@ struct EightChain{A} <: Elasto
909909
end
910910

911911
function (obj::EightChain)(Λ::Float64=1.0)
912+
_, H, J = get_Kinematics(obj.Kinematic; Λ=Λ)
913+
μ, N = obj.μ, obj.N
914+
912915
Ψ(F) = begin
913916
C = F' * F
914-
C_iso = det(C)^(-2/3) * C
915-
β = sqrt(tr(C_iso) / 3 / obj.N)
917+
C_iso = J(F)^(-2/3) * C
918+
β = sqrt(tr(C_iso) / 3 / N)
919+
L = β * (3.0 - β^2) / (1.0 - β^2)
920+
μ * N ** L + log(L / sinh(L)))
921+
end
922+
923+
∂Ψ∂F(F) = begin
924+
C = F' * F
925+
C_iso = J(F)^(-2 / 3) * C
926+
β = sqrt(tr(C_iso) / 3 / N)
916927
L = β * (3.0 - β^2) / (1.0 - β^2)
917-
obj.μ * obj.N **L + log(L / sinh(L)))
928+
∂β∂I1_ = 0.5 / sqrt(tr(C_iso) * 3 * N)
929+
∂L∂I1_ = ((3 * (1 - β^2)^2 + 2 * β * (3 * β - β^3)) / (1 - β^2)^2) * ∂β∂I1_
930+
n = (∂L∂I1_ * sinh(L) - L * cosh(L) * ∂L∂I1_)
931+
d = (L * sinh(L))
932+
∂Ψ∂I1_ = μ * N * (∂β∂I1_ * L + β * ∂L∂I1_ + n / d)
933+
∂I1_∂F = 2 * J(F)^(-2 / 3) * F
934+
∂I1_∂J = -(2 / 3) * J(F)^(-5 / 3) * tr(C)
935+
∂Ψ∂I1_ * (∂I1_∂F + ∂I1_∂J * H(F))
918936
end
919-
∂Ψ∂F(F) = ForwardDiff.gradient(Ψ, get_array(F))
920-
∂Ψ∂FF(F) = ForwardDiff.jacobian(∂Ψ∂F, get_array(F))
921-
return (Ψ, TensorValue ∂Ψ∂F, TensorValue ∂Ψ∂FF)
937+
938+
∂Ψ∂FF(F) = begin
939+
H_ = H(F)
940+
C = F' * F
941+
C_iso = det(F)^(-2 / 3) * C
942+
β = sqrt(tr(C_iso) / 3 / N)
943+
L = β * (3.0 - β^2) / (1.0 - β^2)
944+
∂β∂I1_ = 0.5 / sqrt(tr(C_iso) * 3 * N)
945+
∂L∂I1_ = ((3 * (1 - β^2)^2 + 2 * β * (3 * β - β^3)) / (1 - β^2)^2) * ∂β∂I1_
946+
∂β∂I1I1_ = -(3 * N) / (4 * (3 * N * tr(C_iso))^(3 / 2))
947+
∂L∂I1I1_ = ((4 * β *^2 + 3)) / (1 - β^2)^3) * ∂β∂I1_^2 + ((3 * (1 - β^2)^2 + 2 * β * (3 * β - β^3)) / (1 - β^2)^2) * ∂β∂I1I1_
948+
∂I1_∂F = 2 * det(F)^(-2 / 3) * F
949+
∂I1_∂J = -(2 / 3) * det(F)^(-5 / 3) * tr(C)
950+
∂I1_∂F∂F = 2 * det(F)^(-2 / 3) * I9
951+
∂I1_∂J∂J = (10 / 9) * det(F)^(-8 / 3) * tr(C)
952+
∂I1_∂F∂J = -(4 / 3) * det(F)^(-5 / 3) * F
953+
n = (∂L∂I1_ * sinh(L) - L * cosh(L) * ∂L∂I1_)
954+
d = (L * sinh(L))
955+
∂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_
956+
∂d∂I1_ = ∂L∂I1_ * sinh(L) + L * ∂L∂I1_* cosh(L)
957+
∂Ψ∂I1_ = μ * N * (∂β∂I1_ * L + β * ∂L∂I1_ + n / d)
958+
∂Ψ∂I1I1_ = μ * N * (∂β∂I1I1_ * L + 2 * ∂β∂I1_ * ∂L∂I1_ + β * ∂L∂I1I1_ + (∂n∂I1_ * d - n * ∂d∂I1_) / d^2)
959+
∂Ψ∂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))
960+
end
961+
962+
return (Ψ, ∂Ψ∂F, ∂Ψ∂FF)
922963
end
923964
end
924965

test/TestConstitutiveModels/PhysicalModels.jl

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ using JSON
44
using StaticArrays
55
using Test
66
using HyperFEM.PhysicalModels
7+
using BenchmarkTools
78

89

910
import Base: -
@@ -38,6 +39,30 @@ function test_derivatives_3D_(model::PhysicalModel; rtol=1e-14, kwargs...)
3839
end
3940

4041

42+
function benchmark_derivatives__(model::PhysicalModel, ∇u)
43+
Ψ, ∂Ψu, ∂Ψuu = model()
44+
∂Ψu_(F) = TensorValue(ForwardDiff.gradient(Ψ, get_array(F)))
45+
∂Ψuu_(F) = TensorValue(ForwardDiff.hessian(Ψ, get_array(F)))
46+
47+
F, _, _ = get_Kinematics(model.Kinematic)
48+
print("Analyitical ∂Ψu | ")
49+
@btime $∂Ψu($F($∇u))
50+
print("Numerical ∂Ψu | ")
51+
@btime $∂Ψu_($F($∇u))
52+
print("Analyitical ∂Ψuu | ")
53+
@btime $∂Ψuu($F($∇u))
54+
print("Numerical ∂Ψuu | ")
55+
@btime $∂Ψuu_($F($∇u))
56+
end
57+
58+
function benchmark_derivatives_2D_(model::PhysicalModel)
59+
benchmark_derivatives__(model, ∇u2)
60+
end
61+
62+
function benchmark_derivatives_3D_(model::PhysicalModel)
63+
benchmark_derivatives__(model, ∇u3)
64+
end
65+
4166

4267
@testset "NonlinearMooneyRivlin_CV" begin
4368
model = NonlinearMooneyRivlin_CV=3.0, μ1=1.0, μ2=1.0, α=2.0, β=1.0, γ=6.0)
@@ -141,6 +166,12 @@ end
141166
end
142167

143168

169+
@testset "EightChain" begin
170+
model = EightChain=μParams[1], N=μParams[2])
171+
test_derivatives_3D_(model, rtol=1e-13)
172+
end
173+
174+
144175
@testset "TransverseIsotropy2D" begin
145176
∇u = TensorValue(1.0, 2.0, 3.0, 4.0) * 1e-3
146177
∇u0 = TensorValue(1.0, 2.0, 3.0, 4.0) * 0.0
@@ -701,12 +732,6 @@ end
701732
@testset "Hessian∇JRegularization" begin
702733
∇u = TensorValue(1.0, 2.0, 3.0, 4.0) * 1e-3
703734
∇u0 = TensorValue(1.0, 2.0, 3.0, 4.0) * 0.0
704-
705-
μParams = [6456.9137547089595, 896.4633794151492,
706-
1.999999451256222,
707-
1.9999960497608036,
708-
11747.646562400318,
709-
0.7841068624959612, 1.5386288924587603]
710735
model = ARAP2D=μParams[1])
711736
modelreg = Hessian∇JRegularization(Mechano=model)
712737

0 commit comments

Comments
 (0)