Skip to content

Commit 0fd19e9

Browse files
authored
Merge pull request #57 from MultiSimOLab/visco-dispatch
2 parents d45fc0f + a6810f9 commit 0fd19e9

File tree

6 files changed

+42
-107
lines changed

6 files changed

+42
-107
lines changed

src/PhysicalModels/ElectroMechanicalModels.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ struct ElectroMechModel{E<:Electro,M<:Mechano} <: ElectroMechano
3636
function (obj::ElectroMechModel{<:Electro,<:ViscoElastic})(Λ::Float64=1.0; Δt)
3737
Ψm, ∂Ψm_u, ∂Ψm_uu = obj.mechano(Λ, Δt=Δt)
3838
Ψem, ∂Ψem_u, ∂Ψem_φ, ∂Ψem_uu, ∂Ψem_φu, ∂Ψem_φφ = _getCoupling(obj.electro, obj.mechano, Λ)
39-
Ψ(F, Fn, E, A...) = Ψm(F, Fn, A...) + Ψem(F, E)
40-
∂Ψu(F, Fn, E, A...) = ∂Ψm_u(F, Fn, A...) + ∂Ψem_u(F, E)
41-
∂Ψφ(F, Fn, E, A...) = ∂Ψem_φ(F, E)
42-
∂Ψuu(F, Fn, E, A...) = ∂Ψm_uu(F, Fn, A...) + ∂Ψem_uu(F, E)
43-
∂Ψφu(F, Fn, E, A...) = ∂Ψem_φu(F, E)
44-
∂Ψφφ(F, Fn, E, A...) = ∂Ψem_φφ(F, E)
39+
Ψ(F, E, Fn, A...) = Ψm(F, Fn, A...) + Ψem(F, E)
40+
∂Ψu(F, E, Fn, A...) = ∂Ψm_u(F, Fn, A...) + ∂Ψem_u(F, E)
41+
∂Ψφ(F, E, Fn, A...) = ∂Ψem_φ(F, E)
42+
∂Ψuu(F, E, Fn, A...) = ∂Ψm_uu(F, Fn, A...) + ∂Ψem_uu(F, E)
43+
∂Ψφu(F, E, Fn, A...) = ∂Ψem_φu(F, E)
44+
∂Ψφφ(F, E, Fn, A...) = ∂Ψem_φφ(F, E)
4545
return (Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ)
4646
end
4747

src/WeakForms/ElectroMechanics.jl

Lines changed: 16 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -7,49 +7,49 @@
77
# Stagered residual
88
# -----------------
99

10-
function residual(physicalmodel::ElectroMechano, ::Type{Mechano}, kine::NTuple{2,KinematicModel}, (u, φ), v, dΩ, Λ=1.0)
11-
= physicalmodel(Λ)
10+
function residual(physicalmodel::ElectroMechano, ::Type{Mechano}, kine::NTuple{2,KinematicModel}, (u, φ), v, dΩ, Λ=1.0, vars...; kwargs...)
11+
= physicalmodel(; kwargs...)
1212
F,_,_ = get_Kinematics(kine[1]; Λ=Λ)
1313
E = get_Kinematics(kine[2]; Λ=Λ)
1414
∂Ψu = DΨ[2]
15-
((v)' (∂Ψu (F(u)', E(φ))))dΩ
15+
((v)' (∂Ψu (F(u)', E(φ), vars...)))dΩ
1616
end
1717

18-
function residual(physicalmodel::ElectroMechano, ::Type{Electro}, kine::NTuple{2,KinematicModel}, (u, φ), vφ, dΩ, Λ=1.0)
19-
= physicalmodel(Λ)
18+
function residual(physicalmodel::ElectroMechano, ::Type{Electro}, kine::NTuple{2,KinematicModel}, (u, φ), vφ, dΩ, Λ=1.0, vars...; kwargs...)
19+
= physicalmodel(; kwargs...)
2020
F,_,_ = get_Kinematics(kine[1]; Λ=Λ)
2121
E = get_Kinematics(kine[2]; Λ=Λ)
2222
∂Ψφ = DΨ[3]
23-
-1.0*((vφ) (∂Ψφ (F(u)', E(φ))))dΩ
23+
-1.0*((vφ) (∂Ψφ (F(u)', E(φ), vars...)))dΩ
2424
end
2525

2626
# -----------------
2727
# Stagered jacobian
2828
# -----------------
2929

30-
function jacobian(physicalmodel::ElectroMechano, ::Type{Mechano}, kine::NTuple{2,KinematicModel}, (u, φ), du, v, dΩ, Λ=1.0)
31-
= physicalmodel(Λ)
30+
function jacobian(physicalmodel::ElectroMechano, ::Type{Mechano}, kine::NTuple{2,KinematicModel}, (u, φ), du, v, dΩ, Λ=1.0, vars...; kwargs...)
31+
= physicalmodel(; kwargs...)
3232
F,_,_ = get_Kinematics(kine[1]; Λ=Λ)
3333
E = get_Kinematics(kine[2]; Λ=Λ)
3434
∂Ψuu = DΨ[4]
35-
((v)' ((∂Ψuu (F(u)', E(φ))) (du)'))dΩ
35+
((v)' ((∂Ψuu (F(u)', E(φ), vars...)) (du)'))dΩ
3636
end
3737

38-
function jacobian(physicalmodel::ElectroMechano, ::Type{Electro}, kine::NTuple{2,KinematicModel}, (u, φ), dφ, vφ, dΩ, Λ=1.0)
39-
= physicalmodel(Λ)
38+
function jacobian(physicalmodel::ElectroMechano, ::Type{Electro}, kine::NTuple{2,KinematicModel}, (u, φ), dφ, vφ, dΩ, Λ=1.0, vars...; kwargs...)
39+
= physicalmodel(; kwargs...)
4040
F,_,_ = get_Kinematics(kine[1]; Λ=Λ)
4141
E = get_Kinematics(kine[2]; Λ=Λ)
4242
∂Ψφφ = DΨ[6]
43-
((vφ)' ((∂Ψφφ (F(u)', E(φ))) (dφ)))dΩ
43+
((vφ)' ((∂Ψφφ (F(u)', E(φ), vars...)) (dφ)))dΩ
4444
end
4545

46-
function jacobian(physicalmodel::ElectroMechano, ::Type{ElectroMechano}, kine::NTuple{2,KinematicModel},(u, φ), (du, dφ), (v, vφ), dΩ, Λ=1.0)
47-
= physicalmodel(Λ)
46+
function jacobian(physicalmodel::ElectroMechano, ::Type{ElectroMechano}, kine::NTuple{2,KinematicModel}, (u, φ), (du, dφ), (v, vφ), dΩ, Λ=1.0, vars...; kwargs...)
47+
= physicalmodel(; kwargs...)
4848
F,_,_ = get_Kinematics(kine[1]; Λ=Λ)
4949
E = get_Kinematics(kine[2]; Λ=Λ)
5050
∂Ψφu = DΨ[5]
51-
-1.0*((dφ) ((∂Ψφu (F(u)', E(φ))) (v)'))dΩ -
52-
((vφ) ((∂Ψφu (F(u)', E(φ))) (du)'))dΩ
51+
-1.0*((dφ) ((∂Ψφu (F(u)', E(φ), vars...)) (v)'))dΩ -
52+
((vφ) ((∂Ψφu (F(u)', E(φ), vars...)) (du)'))dΩ
5353
end
5454

5555
# -------------------
@@ -68,60 +68,6 @@ function jacobian(physicalmodel::ElectroMechano, kine::NTuple{2,KinematicModel}
6868
jacobian(physicalmodel, ElectroMechano, kine, (u, φ), (du, dφ), (v, vφ), dΩ, Λ)
6969
end
7070

71-
72-
# =================
73-
# Visco-elasticity
74-
# =================
75-
76-
# -----------------
77-
# Stagered residual
78-
# -----------------
79-
80-
function residual(physicalmodel::ViscoElectricModel, ::Type{Mechano}, kine::NTuple{2,KinematicModel}, (u, φ), v, dΩ, Λ, Δt, un, A)
81-
= physicalmodel(Λ, Δt=Δt)
82-
F,_,_ = get_Kinematics(kine[1]; Λ=Λ)
83-
E = get_Kinematics(kine[2]; Λ=Λ)
84-
∂Ψu = DΨ[2]
85-
((v)' (∂Ψu (F(u)', F(un)', E(φ), A...)))dΩ
86-
end
87-
88-
function residual(physicalmodel::ViscoElectricModel, ::Type{Electro}, kine::NTuple{2,KinematicModel}, (u, φ), vφ, dΩ, Λ, Δt, un, A)
89-
= physicalmodel(Λ, Δt=Δt)
90-
F,_,_ = get_Kinematics(kine[1]; Λ=Λ)
91-
E = get_Kinematics(kine[2]; Λ=Λ)
92-
∂Ψφ = DΨ[3]
93-
-1.0*((vφ) (∂Ψφ (F(u)', F(un)', E(φ), A...)))dΩ
94-
end
95-
96-
# -----------------
97-
# Stagered jacobian
98-
# -----------------
99-
100-
function jacobian(physicalmodel::ViscoElectricModel, ::Type{Mechano}, kine::NTuple{2,KinematicModel}, (u, φ), du, v, dΩ, Λ, Δt, un, A)
101-
= physicalmodel(Λ, Δt=Δt)
102-
F,_,_ = get_Kinematics(kine[1]; Λ=Λ)
103-
E = get_Kinematics(kine[2]; Λ=Λ)
104-
∂Ψuu = DΨ[4]
105-
((v)' ((∂Ψuu (F(u)', F(un)', E(φ), A...)) ((du)')))dΩ
106-
end
107-
108-
function jacobian(physicalmodel::ViscoElectricModel, ::Type{Electro}, kine::NTuple{2,KinematicModel}, (u, φ), dφ, vφ, dΩ, Λ, Δt, un, A)
109-
= physicalmodel(Λ, Δt=Δt)
110-
F,_,_ = get_Kinematics(kine[1]; Λ=Λ)
111-
E = get_Kinematics(kine[2]; Λ=Λ)
112-
∂Ψφφ = DΨ[6]
113-
((vφ)' ((∂Ψφφ (F(u)', F(un)', E(φ), A...)) (dφ)))dΩ
114-
end
115-
116-
function jacobian(physicalmodel::ViscoElectricModel, ::Type{ElectroMechano}, kine::NTuple{2,KinematicModel}, (u, φ), (du, dφ), (v, vφ), dΩ, Λ, Δt, un, A)
117-
= physicalmodel(Λ, Δt=Δt)
118-
F,_,_ = get_Kinematics(kine[1]; Λ=Λ)
119-
E = get_Kinematics(kine[2]; Λ=Λ)
120-
∂Ψφu = DΨ[5]
121-
-1.0*((dφ) ((∂Ψφu (F(u)', F(un)', E(φ), A...)) ((v)')))dΩ -
122-
((vφ) ((∂Ψφu (F(u)', F(un)', E(φ), A...)) ((du)')))dΩ
123-
end
124-
12571
# -------------------
12672
# Monolithic strategy
12773
# -------------------

src/WeakForms/WeakForms.jl

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,33 +36,21 @@ end
3636
3737
Calculate the residual using the given constitutive model and finite element functions.
3838
"""
39-
function residual(physicalmodel::Mechano, km::KinematicModel ,u, v, dΩ, Λ=1.0, Δt=0.0, vars...)
40-
_, ∂Ψu, _ = physicalmodel(Λ)
39+
function residual(physicalmodel::Mechano, km::KinematicModel, u, v, dΩ, Λ=1.0, vars...; kwargs...)
40+
_, ∂Ψu, _ = physicalmodel(; kwargs...)
4141
F, _, _ = get_Kinematics(km; Λ=Λ)
42-
((v)' (∂Ψu (F(u)')))dΩ
42+
((v)' (∂Ψu (F(u)', vars...)))dΩ
4343
end
4444

4545
"""
4646
jacobian(...)::Gridap.CellData.Integrand
4747
4848
Calculate the jacobian using the given constitutive model and finite element functions.
4949
"""
50-
function jacobian(physicalmodel::Mechano, km::KinematicModel, u, du, v, dΩ, Λ=1.0, Δt=0.0, vars...)
51-
_, _, ∂Ψuu = physicalmodel(Λ)
50+
function jacobian(physicalmodel::Mechano, km::KinematicModel, u, du, v, dΩ, Λ=1.0, vars...; kwargs...)
51+
_, _, ∂Ψuu = physicalmodel(; kwargs...)
5252
F, _, _ = get_Kinematics(km; Λ=Λ)
53-
((v)' ((∂Ψuu (F(u)')) (du)'))dΩ
54-
end
55-
56-
function residual(physicalmodel::ViscoElastic, km::KinematicModel,u, v, dΩ, t, Δt, un, A)
57-
_, ∂Ψu, _ = physicalmodel(t, Δt=Δt)
58-
F, _, _ = get_Kinematics(km, Λ=t)
59-
((v)' (∂Ψu (F(u)', F(un)', A...)))dΩ
60-
end
61-
62-
function jacobian(physicalmodel::ViscoElastic, km::KinematicModel, u, du, v, dΩ, t, Δt, un, A)
63-
_, _, ∂Ψuu = physicalmodel(t, Δt=Δt)
64-
F, _, _ = get_Kinematics(km, Λ=t)
65-
((v)' (inner (∂Ψuu(F(u)', F(un)', A...), (du)')))dΩ
53+
((v)' ((∂Ψuu (F(u)', vars...)) (du)'))dΩ
6654
end
6755

6856

test/TestConstitutiveModels/ElectroMechanicalTests.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ end
115115
λvn = 1e-3
116116
Avn = VectorValue(Uvn..., λvn)
117117
Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ = model(Δt=0.01)
118-
@test norm(∂Ψu(F(∇u), F(∇un), E(∇φ), Avn)) 25.049301121178615
119-
@test norm(∂Ψuu(F(∇u), F(∇un), E(∇φ), Avn)) 3110.7607787445168
118+
@test norm(∂Ψu(F(∇u), E(∇φ), F(∇un), Avn)) 25.049301121178615
119+
@test norm(∂Ψuu(F(∇u), E(∇φ), F(∇un), Avn)) 3110.7607787445168
120120
end
121121

122122

@@ -137,6 +137,6 @@ end
137137
λvn = 1e-3
138138
Avn = VectorValue(Uvn..., λvn)
139139
Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ = model(Δt=0.01)
140-
@test norm(∂Ψu(F(∇u), F(∇un), E(∇φ), Avn, Avn)) 25.102080194257017
141-
@test norm(∂Ψuu(F(∇u), F(∇un), E(∇φ), Avn, Avn)) 3110.9722775475557
140+
@test norm(∂Ψu(F(∇u), E(∇φ), F(∇un), Avn, Avn)) 25.102080194257017
141+
@test norm(∂Ψuu(F(∇u), E(∇φ), F(∇un), Avn, Avn)) 3110.9722775475557
142142
end

test/TestWeakForms/WeakForms.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,22 @@ end
9999

100100

101101
ke=Kinematics(Electro, Solid)
102-
km=Kinematics(Mechano,Solid)
102+
km=Kinematics(Mechano, Solid)
103103
k=(km,ke)
104104
function jach(uh, φh)
105-
jac((du, dφ), (v, vφ)) = jacobian(modelelectro,k, (uh, φh), (du, dφ), (v, vφ), dΩ)
105+
jac((du, dφ), (v, vφ)) = jacobian(modelelectro, k, (uh, φh), (du, dφ), (v, vφ), dΩ)
106106
end
107107
function jac_mech(uh, φh)
108-
jac(du, v) = jacobian(modelelectro, Mechano, k,(uh, φh), du, v, dΩ)
108+
jac(du, v) = jacobian(modelelectro, Mechano, k, (uh, φh), du, v, dΩ)
109109
end
110110
function jac_elech(uh, φh)
111-
jac(dφ, vφ) = jacobian(modelelectro, Electro, k,(uh, φh), dφ, vφ, dΩ)
111+
jac(dφ, vφ) = jacobian(modelelectro, Electro, k, (uh, φh), dφ, vφ, dΩ)
112112
end
113113

114114
jac_ = assemble_matrix(jach(uh, φh), V, V)
115115
jac_m = assemble_matrix(jac_mech(uh, φh), Vu, Vu)
116116
jac_e = assemble_matrix(jac_elech(uh, φh), Vφ, Vφ)
117-
117+
118118
@test norm(jac_) 18.934585248125135
119119
@test jac_[1] 0.7777777777777775
120120
@test jac_[end] -1.3333333333333326

test/data/ViscoElasticSimulation.jl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ function visco_elastic_simulation(;t_end=15, writevtk=true, verbose=true)
2929
hyper_elastic_model = NeoHookean3D=λ, μ=μ)
3030
viscous_branch = ViscousIncompressible(IncompressibleNeoHookean3D=0., μ=μv₁), τ=τv₁)
3131
cons_model = GeneralizedMaxwell(hyper_elastic_model, viscous_branch)
32+
k=Kinematics(Mechano,Solid)
3233

3334
# Dirichlet boundary conditions
3435
strain = 0.5
@@ -59,18 +60,18 @@ function visco_elastic_simulation(;t_end=15, writevtk=true, verbose=true)
5960
uh = FEFunction(Uu, zero_free_values(Uu))
6061
unh = FEFunction(Uun, zero_free_values(Uun))
6162
state_vars = initializeStateVariables(cons_model, dΩ)
63+
F,_,_ = get_Kinematics(k)
64+
Fnh = F(unh)'
6265

63-
k=Kinematics(Mechano,Solid)
64-
res(Λ) = (u,v)->residual(cons_model, k, u, v, dΩ, t_end * Λ, Δt, unh, state_vars)
65-
jac(Λ) = (u,du,v)->jacobian(cons_model, k, u, du, v, dΩ, t_end * Λ, Δt, unh, state_vars)
66+
res(Λ) = (u,v)->residual(cons_model, k, u, v, dΩ, t_end * Λ, Fnh, state_vars...; Δt=Δt)
67+
jac(Λ) = (u,du,v)->jacobian(cons_model, k, u, du, v, dΩ, t_end * Λ, Fnh, state_vars...; Δt=Δt)
6668

6769
ls = LUSolver()
6870
nls = NewtonSolver(ls; maxiter=20, atol=1.e-6, rtol=1.e-6, verbose=verbose)
6971
comp_model = StaticNonlinearModel(res, jac, Uu, Vu, D_bc; nls=nls, xh=uh, xh⁻=unh)
7072

7173
λx = Float64[]
7274
σΓ = Float64[]
73-
F,_,_ = get_Kinematics(k)
7475

7576
function driverpost(post)
7677
σh11, _... = Piola(cons_model, Kinematics(Mechano,Solid),uh, unh, state_vars, Ω, dΩ, 0.0, Δt)

0 commit comments

Comments
 (0)