Skip to content

Commit aed2454

Browse files
committed
fixed return mapping
1 parent f9a9ddf commit aed2454

2 files changed

Lines changed: 34 additions & 46 deletions

File tree

src/PhysicalModels/ViscousPolyconvex.jl

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -68,67 +68,61 @@ function ∂Sv∂C_Cᵥfix(obj::ViscousPolyconvex, C, Cv)
6868
μ * IIIc^(-2/3) * (2/3 * (1/IIIc) * G G - ×ᵢ⁴(C))
6969
end
7070

71-
function ∂invCv∂C(obj::ViscousPolyconvex, C, Cn, Cvn)
72-
τ = obj.τ
73-
Δt = obj.Δt[]
74-
invC = inv(C)
75-
invCvn = inv(Cvn)
76-
B = Δt/τ * invC + invCvn
77-
G = cof(C)
78-
IIIb = det(B)
79-
IIIc = det(C)
80-
0.5*Δt * IIIb^(-1/3) * IIIc^(-1) * (IIsym(I3) -1/3*Binv(B)) (-IIIc^(-1) * GG + ×ᵢ⁴(C))
81-
end
82-
8371
# --- Implementation of derivatives ---
8472

8573
function energy(obj::ViscousPolyconvex, F, Fn, Cvn)
86-
C = Cauchy(F)
87-
Cn = Cauchy(Fn)
74+
C, Cn = Cauchy.((F, Fn))
8875
Cv = return_mapping(obj, C, Cn, Cvn)
8976
Ψv(obj, C, Cv)
9077
end
9178

9279
function first_piola(obj::ViscousPolyconvex, F, Fn, Cvn)
93-
C = Cauchy(F)
94-
Cn = Cauchy(Fn)
80+
C, Cn = Cauchy.((F, Fn))
9581
Cv = return_mapping(obj, C, Cn, Cvn)
9682
F * Sv(obj, C, Cv)
9783
end
9884

9985
function tangent(obj::ViscousPolyconvex, F, Fn, Cvn)
100-
C = Cauchy(F)
101-
Cn = Cauchy(Fn)
86+
C, Cn = Cauchy.((F, Fn))
10287
Cv = return_mapping(obj, C, Cn, Cvn)
103-
H1 = ∂Sv∂C_Cᵥfix(obj, C, Cv)
104-
H2 = obj.μ * ∂invCv∂C(obj, C, Cn, Cvn)
88+
H1 = obj.μ * ∂invCv∂C(obj, C, Cn, Cvn)
89+
H2 = ∂Sv∂C_Cᵥfix(obj, C, Cv)
10590
H3 = I3 ₁₃²⁴ Sv(obj, C, Cv)
10691
DCDF = F' ₁₃²⁴ I3 + I3 ₁₄²³ F'
107-
DCDF' · (H1 + H2) · DCDF + H3
92+
0.5 * DCDF' · (H1 + H2) · DCDF + H3
10893
end
10994

11095
function dissipation(obj::ViscousPolyconvex, F, Fn, Cvn)
11196
γ = obj.μ / obj.τ
11297
Τ = obj.τ / obj.Δt
113-
C = Cauchy(F)
114-
Cn = Cauchy(Fn)
98+
C, Cn = Cauchy.((F, Fn))
11599
Cv = return_mapping(obj, C, Cn, Cvn)
116100
invC = inv(C)
117101
λ_algo = 1 / (det(invC + Τ*inv(Cvn))^(1/3) - Τ) # λ = 3 / (Cv ⊙ invC)
118102
-0.5γ * (C -λ_algo*Cv) (invC - (1/λ_algo)*inv(Cv))
119103
end
120104

105+
# --- Return mapping and derivatives for underlying neo-Hookean ---
106+
121107
function return_mapping(obj::ViscousPolyconvex, C, Cn, Cvn)
122-
Τ = obj.τ / obj.Δt[]
108+
Τ = obj.Δt[] / obj.τ
123109
B = Τ * inv(C) + inv(Cvn)
124110
invCv = det(B)^(-1/3) * B
125111
inv(invCv)
126112
end
127113

114+
function ∂invCv∂C(obj::ViscousPolyconvex, C, Cn, Cvn)
115+
Τ = obj.Δt[] / obj.τ
116+
B = Τ * inv(C) + inv(Cvn)
117+
G = cof(C)
118+
IIIb = det(B)
119+
IIIc = det(C)
120+
Τ * IIIb^(-1/3) * IIIc^(-1) * (IIsym(I3) -1/3*Binv(B)) * (-IIIc^(-1) * GG + ×ᵢ⁴(C))
121+
end
122+
128123
function return_mapping(obj::ViscousPolyconvex)
129124
(A, F, Fn) -> begin
130-
C = Cauchy(F)
131-
Cn = Cauchy(Fn)
125+
C, Cn = Cauchy.((F, Fn))
132126
Cv = return_mapping(obj, C, Cn, A)
133127
(true, Cv)
134128
end

test/TestConstitutiveModels/ViscousModelsTests.jl

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -232,39 +232,33 @@ end
232232
end
233233

234234

235-
@testset "ViscousPolyconvex_Base" begin
235+
@testset "ViscousPolyconvex" begin
236236
model = ViscousPolyconvex=1.15, μ=7e4)
237+
Fn = I3
237238
F1 = I3 + 0.1*TensorValue(rand(9)...)
238239
C1 = F1' · F1
239240
Cv = I3
240241

242+
# --- Test neo-Hookean model ---
241243
Ψv = HyperFEM.PhysicalModels.Ψv
242244
Sv = HyperFEM.PhysicalModels.Sv
243245
∂Sv∂C_Cᵥfix = HyperFEM.PhysicalModels.∂Sv∂C_Cᵥfix
244246

245247
Sv_ref = 2*TensorValue(ForwardDiff.gradient(C -> Ψv(model, TensorValue(C), Cv), get_array(C1)))
246248
∂Sv_ref = 2*TensorValue(ForwardDiff.hessian(C -> Ψv(model, TensorValue(C), Cv), get_array(C1)))
247249

248-
@test isapprox(Sv(model, C1, Cv), Sv_ref, rtol=1e-8) # Pass
249-
@test isapprox(∂Sv∂C_Cᵥfix(model, C1, Cv), ∂Sv_ref, rtol=1e-8) # Pass
250-
end
250+
@test isapprox(Sv(model, C1, Cv), Sv_ref, rtol=1e-8)
251+
@test isapprox(∂Sv∂C_Cᵥfix(model, C1, Cv), ∂Sv_ref, rtol=1e-8)
251252

253+
# --- Test return mapping ---
254+
return_mapping = HyperFEM.PhysicalModels.return_mapping
255+
∂invCv∂C = HyperFEM.PhysicalModels.∂invCv∂C
252256

253-
@testset "ViscousPolyconvex" begin
254-
long_term = NeoHookean3D=1e7, μ=8e4)
255-
branch_1 = ViscousPolyconvex=1.15, μ=7e4)
256-
model = GeneralizedMaxwell(long_term, branch_1)
257-
update_time_step!(model, 0.01)
258-
Ψ, ∂Ψ∂F, ∂∂Ψ∂FF = model()
259-
Fn = I3
260-
A = I3
261-
F1 = I3 + 0.1*TensorValue(rand(9)...)
257+
∂invCv_ref = TensorValue(ForwardDiff.jacobian(C -> get_array(return_mapping(model, TensorValue(C), C1, Cv)), get_array(C1)))
258+
@test isapprox(∂invCv∂C(model, C1, C1, Cv), ∂invCv_ref, rtol=1e-8)
262259

263-
# ∂Ψ∂F_ref = TensorValue(ForwardDiff.gradient(F -> Ψ(TensorValue(F), Fn, A), get_array(F1)))
264-
# ∂∂Ψ∂FF_ref = TensorValue(ForwardDiff.hessian(F -> Ψ(TensorValue(F), Fn, A), get_array(F1)))
265-
∂∂Ψ∂FF_ref = TensorValue(ForwardDiff.jacobian(F -> get_array(∂Ψ∂F(TensorValue(F), Fn, A)), get_array(F1)))
266-
267-
@test isapprox(∂∂Ψ∂FF(F1, Fn, A), ∂∂Ψ∂FF_ref, rtol=1e-8)
268-
# @test isapprox(∂Ψ∂F(F1, Fn, A), ∂Ψ∂F_ref, rtol=1e-8) # Fail!!!
269-
# @test isapprox(∂∂Ψ∂FF(F1, Fn, A), ∂∂Ψ∂FF_ref, rtol=1e-8)
260+
# --- Test full model tangent operator ---
261+
Ψ, ∂Ψ∂F, ∂∂Ψ∂FF = model()
262+
∂∂Ψ∂FF_ref = TensorValue(ForwardDiff.jacobian(F -> get_array(∂Ψ∂F(TensorValue(F), Fn, Cv)), get_array(F1)))
263+
@test isapprox(∂∂Ψ∂FF(F1, Fn, Cv), ∂∂Ψ∂FF_ref, rtol=1e-8)
270264
end

0 commit comments

Comments
 (0)