Skip to content

Commit 2f5de8e

Browse files
committed
model optimisation
1 parent 4d8327e commit 2f5de8e

2 files changed

Lines changed: 37 additions & 41 deletions

File tree

src/PhysicalModels/ViscousPolyconvex.jl

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -49,19 +49,19 @@ end
4949

5050
# --- Underlying neo-Hookean model in terms of viscous distortional invariants ---
5151

52-
function Ψv(obj::ViscousPolyconvex, C, Cv)
52+
function Ψv(obj::ViscousPolyconvex, C, invCv)
5353
μ = obj.μ
5454
IIIc = det(C)
55-
0.5μ * (C inv(Cv) -3*IIIc^(1/3))
55+
0.5μ * (C invCv -3*IIIc^(1/3))
5656
end
5757

58-
function Sv(obj::ViscousPolyconvex, C, Cv)
58+
function Sv(obj::ViscousPolyconvex, C, invCv)
5959
μ = obj.μ
6060
IIIc = det(C)
61-
μ * (inv(Cv) -IIIc^(1/3) * inv(C))
61+
μ * (invCv -IIIc^(1/3) * inv(C))
6262
end
6363

64-
function ∂Sv∂C_Cᵥfix(obj::ViscousPolyconvex, C, Cv)
64+
function ∂Sv∂C_Cᵥfix(obj::ViscousPolyconvex, C, invCv)
6565
μ = obj.μ
6666
IIIc = det(C)
6767
G = cof(C)
@@ -72,22 +72,22 @@ end
7272

7373
function energy(obj::ViscousPolyconvex, F, Fn, Cvn)
7474
C, Cn = Cauchy.((F, Fn))
75-
Cv = return_mapping(obj, C, Cn, Cvn)
76-
Ψv(obj, C, Cv)
75+
invCv = Cv⁻¹(obj, C, Cn, Cvn)
76+
Ψv(obj, C, invCv)
7777
end
7878

7979
function first_piola(obj::ViscousPolyconvex, F, Fn, Cvn)
8080
C, Cn = Cauchy.((F, Fn))
81-
Cv = return_mapping(obj, C, Cn, Cvn)
82-
F * Sv(obj, C, Cv)
81+
invCv = Cv⁻¹(obj, C, Cn, Cvn)
82+
F * Sv(obj, C, invCv)
8383
end
8484

8585
function tangent(obj::ViscousPolyconvex, F, Fn, Cvn)
8686
C, Cn = Cauchy.((F, Fn))
87-
Cv = return_mapping(obj, C, Cn, Cvn)
88-
H1 = obj.μ * invCv∂C(obj, C, Cn, Cvn)
89-
H2 = ∂Sv∂C_Cᵥfix(obj, C, Cv)
90-
H3 = I3 ₁₃²⁴ Sv(obj, C, Cv)
87+
invCv = Cv⁻¹(obj, C, Cn, Cvn)
88+
H1 = obj.μ * Cv⁻¹∂C(obj, C, Cn, Cvn)
89+
H2 = ∂Sv∂C_Cᵥfix(obj, C, invCv)
90+
H3 = I3 ₁₃²⁴ Sv(obj, C, invCv)
9191
DCDF = F' ₁₃²⁴ I3 + I3 ₁₄²³ F'
9292
0.5 * DCDF' · (H1 + H2) · DCDF + H3
9393
end
@@ -96,34 +96,32 @@ function dissipation(obj::ViscousPolyconvex, F, Fn, Cvn)
9696
γ = obj.μ / obj.τ
9797
Τ = obj.τ / obj.Δt[]
9898
C, Cn = Cauchy.((F, Fn))
99-
Cv = return_mapping(obj, C, Cn, Cvn)
100-
invC = inv(C)
99+
invCv = Cv⁻¹(obj, C, Cn, Cvn)
100+
Cv = inv(Cv)
101101
λ_algo = 1 / (det(invC + Τ*inv(Cvn))^(1/3) - Τ) # λ = 3 / (Cv ⊙ invC)
102-
-0.5γ * (C -λ_algo*Cv) (invC - (1/λ_algo)*inv(Cv))
102+
-0.5γ * (C -λ_algo*Cv) (invC - (1/λ_algo)*invCv)
103103
end
104104

105105
# --- Return mapping and derivatives for the underlying neo-Hookean ---
106106

107-
function return_mapping(obj::ViscousPolyconvex, C, Cn, Cvn)
107+
function Cv⁻¹(obj::ViscousPolyconvex, C, Cn, Cvn)
108108
Τ = obj.Δt[] / obj.τ
109109
B = Τ * inv(C) + inv(Cvn)
110-
invCv = det(B)^(-1/3) * B
111-
inv(invCv)
112-
# Cv = det(B)^(1/3) * inv(B)
110+
det(B)^(-1/3) * B
113111
end
114112

115-
function invCv∂C(obj::ViscousPolyconvex, C, Cn, Cvn)
113+
function Cv⁻¹∂C(obj::ViscousPolyconvex, C, Cn, Cvn)
116114
Τ = obj.Δt[] / obj.τ
117-
B = Τ * inv(C) + inv(Cvn)
118-
G = cof(C)
119-
IIIb = det(B)
120-
IIIc = det(C)
121-
Τ * IIIb^(-1/3) * IIIc^(-1) * (IIsym(I3) -1/3*Binv(B)) * (-IIIc^(-1) * GG + ×ᵢ⁴(C))
122-
# invC = inv(C)
123-
# B = Τ * invC + inv(Cvn)
124-
# ∂invCv∂B = det(B)^(-1/3) * (IIsym(I3) - (1/3) * (B ⊗ inv(B)))
125-
# ∂B∂C = -Τ * IIsym(invC)
126-
#invCv∂B · ∂B∂C
115+
invC = inv(C)
116+
B = Τ * invC + inv(Cvn)
117+
∂invCv∂B = det(B)^(-1/3) * (IIsym(I3) - (1/3) * (B inv(B)))
118+
∂B∂C = -Τ * IIsym(invC)
119+
∂invCv∂B · ∂B∂C
120+
end
121+
122+
function return_mapping(obj::ViscousPolyconvex, C, Cn, Cvn)
123+
invCv = Cv⁻¹(obj, C, Cn, Cvn)
124+
inv(invCv)
127125
end
128126

129127
function return_mapping(obj::ViscousPolyconvex)

test/TestConstitutiveModels/ViscousModelsTests.jl

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -246,20 +246,18 @@ end
246246
Sv = HyperFEM.PhysicalModels.Sv
247247
∂Sv∂C_Cᵥfix = HyperFEM.PhysicalModels.∂Sv∂C_Cᵥfix
248248

249-
Sv_ref = 2*TensorValue(ForwardDiff.gradient(C -> Ψv(model, TensorValue(C), Cv), get_array(C1)))
250-
∂Sv_ref = 2*TensorValue(ForwardDiff.hessian(C -> Ψv(model, TensorValue(C), Cv), get_array(C1)))
249+
Sv_ref = 2*TensorValue(ForwardDiff.gradient(C -> Ψv(model, TensorValue(C), inv(Cv)), get_array(C1)))
250+
∂Sv_ref = 2*TensorValue(ForwardDiff.hessian(C -> Ψv(model, TensorValue(C), inv(Cv)), get_array(C1)))
251251

252-
@test isapprox(Sv(model, C1, Cv), Sv_ref, rtol=1e-8)
253-
@test isapprox(∂Sv∂C_Cᵥfix(model, C1, Cv), ∂Sv_ref, rtol=1e-8)
252+
@test isapprox(Sv(model, C1, inv(Cv)), Sv_ref, rtol=1e-8)
253+
@test isapprox(∂Sv∂C_Cᵥfix(model, C1, inv(Cv)), ∂Sv_ref, rtol=1e-8)
254254

255255
# --- Test return mapping ---
256-
return_mapping = HyperFEM.PhysicalModels.return_mapping
257-
invCv∂C = HyperFEM.PhysicalModels.∂invCv∂C
256+
Cv⁻¹ = HyperFEM.PhysicalModels.Cv⁻¹
257+
Cv⁻¹∂C = HyperFEM.PhysicalModels.∂Cv⁻¹∂C
258258

259-
∂invCv_ref = TensorValue(ForwardDiff.jacobian(
260-
C -> get_array(inv(return_mapping(model, 0.5*TensorValue(C+C'), Cn, Cv))), # Enforce symmetry of C within ForwardDiff
261-
get_array(C1)))
262-
@test isapprox(∂invCv∂C(model, C1, Cn, Cv), ∂invCv_ref, rtol=1e-8)
259+
∂invCv_ref = TensorValue(ForwardDiff.jacobian(C -> get_array(Cv⁻¹(model, 0.5*TensorValue(C+C'), Cn, Cv)), get_array(C1))) # Enforce symmetry of C within ForwardDiff
260+
@test isapprox(∂Cv⁻¹∂C(model, C1, Cn, Cv), ∂invCv_ref, rtol=1e-8)
263261

264262
# --- Test full model tangent operator ---
265263
Ψ, ∂Ψ∂F, ∂∂Ψ∂FF = model()

0 commit comments

Comments
 (0)