Skip to content

Commit 3444f00

Browse files
committed
Refactors kinematic descriptions in physical models
Introduces a more explicit kinematic description and associates it directly with the physics of the solid material, thus decoupling the kinematic model from the specific electrical or magnetic model. This change simplifies the model definitions and usage in weak forms and post-processors, improving overall code clarity and maintainability.
1 parent 62ff417 commit 3444f00

21 files changed

Lines changed: 550 additions & 508 deletions

README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,13 @@ Uφ = TrialFESpace(Vφ, D_bc.BoundaryCondition[2], 1.0)
9292
V = MultiFieldFESpace([Vu, Vφ])
9393
U = MultiFieldFESpace([Uu, Uφ])
9494

95+
# Kinematic Description
96+
km=Kinematics(Mechano,Solid)
97+
ke=Kinematics(Electro,Solid)
98+
9599
# residual and jacobian function of load factor
96-
res(Λ) = ((u, φ), (v, vφ)) -> residual(physmodel, (u, φ), (v, vφ), dΩ)
97-
jac(Λ) = ((u, φ), (du, dφ), (v, vφ)) -> jacobian(physmodel, (u, φ), (du, dφ), (v, vφ), dΩ)
100+
res(Λ) = ((u, φ), (v, vφ)) -> residual(physmodel, (km,ke),(u, φ), (v, vφ), dΩ)
101+
jac(Λ) = ((u, φ), (du, dφ), (v, vφ)) -> jacobian(physmodel, (km,ke), (u, φ), (du, dφ), (v,vφ),dΩ)
98102

99103
# nonlinear solver
100104
ls = LUSolver()

src/ComputationalModels/PostProcessors.jl

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -71,17 +71,16 @@ function (obj::PostProcessor{<:DynamicNonlinearModel,<:Any,<:Any})(Λ)
7171
obj.cache[1](obj, obj.cache[2]...)
7272
end
7373

74-
function Jacobian(uh)
75-
F, _, J = Kinematics(Mechano).metrics
74+
function Jacobian(uh,km)
75+
F, _, J = get_Kinematics(km)
7676
J F (uh)
7777
end
7878

79-
function Cauchy(physmodel::ThermoElectroMechano, uh, φh, θh, Ω, dΩ, Λ=1.0)
79+
function Cauchy(physmodel::ThermoElectroMechano,kine::NTuple{3,KinematicModel}, uh, φh, θh, Ω, dΩ, Λ=1.0)
8080
= physmodel(Λ)
81-
Kinematic_mec = Kinematics(Mechano)
82-
Kinematic_elec = Kinematics(Electro)
83-
F, _, _ = get_Kinematics(Kinematic_mec)
84-
E = get_Kinematics(Kinematic_elec)
81+
82+
F, _, _ = get_Kinematics(kine[1])
83+
E = get_Kinematics(kine[2])
8584
∂Ψu = DΨ[2]
8685
refL2 = ReferenceFE(lagrangian, Float64, 0)
8786
ref = ReferenceFE(lagrangian, Float64, 1)
@@ -101,38 +100,36 @@ function Cauchy(physmodel::ThermoElectroMechano, uh, φh, θh, Ω, dΩ, Λ=1.0)
101100
end
102101

103102

104-
function Cauchy(model::Elasto, uh, unh, state_vars, Ω, dΩ, t, Δt)
105-
σh = Cauchy(model, uh)
103+
function Cauchy(model::Elasto,km::KinematicModel,uh, unh, state_vars, Ω, dΩ, t, Δt)
104+
σh = Cauchy(model,km,uh)
106105
interpolate_L2_tensor(σh, Ω, dΩ)
107106
end
108107

109108

110-
function Cauchy(model::ViscoElastic, uh, unh, state_vars, Ω, dΩ, t, Δt)
111-
σh = Cauchy(model, uh, unh, state_vars, Δt)
109+
function Cauchy(model::ViscoElastic, km::KinematicModel, uh, unh, state_vars, Ω, dΩ, t, Δt)
110+
σh = Cauchy(model, km, uh, unh, state_vars, Δt)
112111
interpolate_L2_tensor(σh, Ω, dΩ)
113112
end
114113

115114

116-
function Cauchy(model::Elasto, uh, vars...)
115+
function Cauchy(model::Elasto, km::KinematicModel,uh, vars...)
117116
_, ∂Ψu, _ = model()
118-
F, _, _ = get_Kinematics(model.Kinematic)
117+
F, _, _ = get_Kinematics(km)
119118
∂Ψu (F(uh))
120119
end
121120

122121

123-
function Cauchy(model::ViscoElastic, uh, unh, states, Δt)
122+
function Cauchy(model::ViscoElastic, km::KinematicModel, uh, unh, states, Δt)
124123
_, ∂Ψu, _ = model(Δt=Δt)
125-
F, _, _ = get_Kinematics(model.Kinematic)
124+
F, _, _ = get_Kinematics(km)
126125
∂Ψu (F(uh), F(unh), states...)
127126
end
128127

129128

130-
function Entropy(physmodel::ThermoElectroMechano, uh, φh, θh, Ω, dΩ, Λ=1.0)
129+
function Entropy(physmodel::ThermoElectroMechano, kine::NTuple{3,KinematicModel}, uh, φh, θh, Ω, dΩ, Λ=1.0)
131130
= physmodel(Λ)
132-
Kinematic_mec = Kinematics(Mechano)
133-
Kinematic_elec = Kinematics(Electro)
134-
F, _, _ = get_Kinematics(Kinematic_mec)
135-
E = get_Kinematics(Kinematic_elec)
131+
F,_,_ = get_Kinematics(kine[1]; Λ=Λ)
132+
E = get_Kinematics(kine[2]; Λ=Λ)
136133
η = DΨ[11]
137134
refL2 = ReferenceFE(lagrangian, Float64, 0)
138135
ref = ReferenceFE(lagrangian, Float64, 1)
@@ -142,12 +139,10 @@ function Entropy(physmodel::ThermoElectroMechano, uh, φh, θh, Ω, dΩ, Λ=1.0)
142139
return ηh
143140
end
144141

145-
function D0(physmodel::ThermoElectroMechano, uh, φh, θh, Ω, dΩ, Λ=1.0)
142+
function D0(physmodel::ThermoElectroMechano, kine::NTuple{3,KinematicModel}, uh, φh, θh, Ω, dΩ, Λ=1.0)
146143
= physmodel(Λ)
147-
Kinematic_mec = Kinematics(Mechano)
148-
Kinematic_elec = Kinematics(Electro)
149-
F, _, _ = get_Kinematics(Kinematic_mec)
150-
E = get_Kinematics(Kinematic_elec)
144+
F,_,_ = get_Kinematics(kine[1]; Λ=Λ)
145+
E = get_Kinematics(kine[2]; Λ=Λ)
151146
∂ΨE = DΨ[3]
152147
refL2 = ReferenceFE(lagrangian, Float64, 0)
153148
ref = ReferenceFE(lagrangian, Float64, 1)

src/Exports.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ end
7979
@publish PhysicalModels EnergyInterpolationScheme
8080
@publish PhysicalModels update_state!
8181
@publish PhysicalModels Kinematics
82+
@publish PhysicalModels Solid
8283
@publish PhysicalModels KinematicModel
8384
@publish PhysicalModels EvolutiveKinematics
8485
@publish PhysicalModels get_Kinematics

src/PhysicalModels/ElectricalModels.jl

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
# Electrical models
44
# ===================
55

6-
struct IdealDielectric{A} <: Electro
6+
struct IdealDielectric <: Electro
77
ε::Float64
8-
Kinematic::A
9-
function IdealDielectric(; ε::Float64, Kinematic::KinematicModel=Kinematics(Electro))
10-
new{typeof(Kinematic)}(ε, Kinematic)
8+
function IdealDielectric(; ε::Float64)
9+
new(ε)
1110
end
1211
end

src/PhysicalModels/ElectroMechanicalModels.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ end
5959

6060

6161
function _getCoupling(elec::Electro, mec::Mechano, Λ::Float64)
62-
_, H, J = get_Kinematics(mec.Kinematic; Λ=Λ)
63-
62+
J(F) = det(F)
63+
H(F) = det(F) * inv(F)'
6464
# Energy #
6565
HE(F, E) = H(F) * E
6666
HEHE(F, E) = HE(F, E) HE(F, E)

src/PhysicalModels/KinematicModels.jl

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,57 @@
11

22
abstract type KinematicModel end
3+
abstract type KinematicDescription end
4+
5+
abstract type Solid <: KinematicDescription end
6+
abstract type SolidShell <: KinematicDescription end
7+
38

4-
struct KinematicDescription{Kind} end
59

610
get_Kinematics(::KinematicModel; Λ::Float64) = @abstractmethod
711

8-
struct Kinematics{T} <: KinematicModel
12+
13+
struct Kinematics{T1,T2} <: KinematicModel
914
metrics
1015

11-
function Kinematics(::Type{M}; F::Function=(∇u) -> one(∇u) + ∇u) where {M <: Mechano}
16+
function Kinematics(::Type{Mechano}, ::Type{Solid}; F::Function=(∇u) -> one(∇u) + ∇u)
1217
J(F) = det(F)
1318
H(F) = det(F) * inv(F)'
1419
metrics = (F, H, J)
15-
new{Mechano}(metrics)
20+
new{Mechano,Solid}(metrics)
1621
end
1722

18-
function Kinematics(::Type{Electro}; E::Function=(∇φ) -> -∇φ)
23+
# function Kinematics(::Type{Mechano}, ::Type{SolidShell})
24+
# function F(∇u, N)
25+
# F̂ = ∇u + one(∇u)
26+
# Ĵ = det(F̂)
27+
# Ĥ = (det(F̂) * inv(F̂)')
28+
# HN = (Ĥ * N) / norm(Ĥ * N)
29+
# F̂ + (1 / Ĵ - 1.0) * (HN ⊗ N)
30+
# end
31+
# J(F) = det(F)
32+
# H(F) = det(F) * inv(F)'
33+
# metrics = (F, H, J)
34+
# new{Mechano,SolidShell}(metrics)
35+
# end
36+
37+
function Kinematics(::Type{Electro}, ::Type{Solid}; E::Function=(∇φ) -> -∇φ)
1938
metrics = (E)
20-
new{Electro}(metrics)
39+
new{Electro,Solid}(metrics)
2140
end
2241

23-
function Kinematics(::Type{Magneto}; H::Function=(∇φ) -> -∇φ)
42+
function Kinematics(::Type{Magneto}, ::Type{Solid}; H::Function=(∇φ) -> -∇φ)
2443
metrics = (H)
25-
new{Magneto}(metrics)
44+
new{Magneto,Solid}(metrics)
45+
end
46+
function Kinematics(::Type{Thermo}, ::Type{Solid})
47+
new{Thermo,Solid}(nothing)
2648
end
2749
end
2850

2951
get_Kinematics(obj::Kinematics; Λ=1.0) = obj.metrics
3052

3153

32-
function getIsoInvariants(obj::Kinematics{Mechano})
54+
function getIsoInvariants(obj::Kinematics{Mechano,<:KinematicDescription})
3355
F, H, J = obj.metrics
3456
I1(F) = tr(F' * F)
3557
I2(F) = tr(H(F)' * H(F))
@@ -38,7 +60,7 @@ function getIsoInvariants(obj::Kinematics{Mechano})
3860
end
3961

4062

41-
function getIsoInvariants(obj_m::Kinematics{Mechano},obj_e::Kinematics{Electro})
63+
function getIsoInvariants(obj_m::Kinematics{Mechano,<:KinematicDescription}, obj_e::Kinematics{Electro,<:KinematicDescription})
4264
F, H, J = obj_m.metrics
4365
E = obj_e.metrics
4466
I1(F) = tr(F' * F)
@@ -65,7 +87,7 @@ struct EvolutiveKinematics{T} <: KinematicModel
6587
function EvolutiveKinematics(::Type{Mechano}, δ::Float64; F::Function=(t) -> ((∇u) -> one(∇u) + ∇u))
6688
# F_(∇u) = one(∇u) + ∇u
6789
# F(t) = (∇u)->(Fmapping(t) ∘ F_)(∇u)
68-
J(F) = 0.5*(det(F) + sqrt(det(F)^2 + δ^2))
90+
J(F) = 0.5 * (det(F) + sqrt(det(F)^2 + δ^2))
6991
H(F) = J(F) * inv(F)'
7092
metrics = (F, H, J)
7193
new{Mechano}(metrics)

src/PhysicalModels/MagneticModels.jl

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ struct Magnetic <: Magneto
88
μ::Float64
99
αr::Ref{Float64}
1010
χe::Float64
11-
Kinematic::Kinematics{Magneto}
1211

13-
function Magnetic(; μ::Float64, αr::Ref{Float64}, χe::Float64=0.0, Kinematic::Kinematics{Magneto}=Kinematics(Magneto))
14-
new(μ, αr, χe, Kinematic)
12+
function Magnetic(; μ::Float64, αr::Ref{Float64}, χe::Float64=0.0)
13+
new(μ, αr, χe)
1514
end
1615
function (obj::Magnetic)(Λ::Float64=1.0)
1716
μ, αr, χe = obj.μ, obj.αr, obj.χe
@@ -27,12 +26,11 @@ end
2726
end
2827

2928

30-
struct IdealMagnetic{A} <: Magneto
29+
struct IdealMagnetic <: Magneto
3130
μ::Float64
3231
χe::Float64
33-
Kinematic::A
34-
function IdealMagnetic(; μ::Float64, χe::Float64=0.0, Kinematic::KinematicModel=Kinematics(Magneto))
35-
new{typeof(Kinematic)}(μ, χe, Kinematic)
32+
function IdealMagnetic(; μ::Float64, χe::Float64=0.0)
33+
new(μ, χe)
3634
end
3735
function (obj::IdealMagnetic)(Λ::Float64=1.0)
3836

@@ -73,12 +71,11 @@ struct IdealMagnetic{A} <: Magneto
7371
end
7472

7573

76-
struct IdealMagnetic2D{A} <: Magneto
74+
struct IdealMagnetic2D <: Magneto
7775
μ::Float64
7876
χe::Float64
79-
Kinematic::A
80-
function IdealMagnetic2D(; μ::Float64, χe::Float64=0.0, Kinematic::KinematicModel=Kinematics(Magneto))
81-
new{typeof(Kinematic)}(μ, χe, Kinematic)
77+
function IdealMagnetic2D(; μ::Float64, χe::Float64=0.0)
78+
new(μ, χe)
8279
end
8380

8481
function (obj::IdealMagnetic2D)(Λ::Float64=1.0)
@@ -115,16 +112,15 @@ struct IdealMagnetic2D{A} <: Magneto
115112
end
116113

117114

118-
struct HardMagnetic{A} <: Magneto
115+
struct HardMagnetic <: Magneto
119116
μ::Float64
120117
αr::Float64
121118
χe::Float64
122119
χr::Float64
123120
βmok::Float64
124121
βcoup::Float64
125-
Kinematic::A
126-
function HardMagnetic(; μ::Float64, αr::Float64, χe::Float64=0.0, χr::Float64=8.0, βmok::Float64=1.0, βcoup::Float64=1.0, Kinematic::KinematicModel=Kinematics(Magneto))
127-
new{typeof(Kinematic)}(μ, αr, χe, χr, βmok, βcoup, Kinematic)
122+
function HardMagnetic(; μ::Float64, αr::Float64, χe::Float64=0.0, χr::Float64=8.0, βmok::Float64=1.0, βcoup::Float64=1.0)
123+
new(μ, αr, χe, χr, βmok, βcoup)
128124
end
129125

130126
function (obj::HardMagnetic)(Λ::Float64=1.0)
@@ -164,16 +160,15 @@ struct HardMagnetic{A} <: Magneto
164160
end
165161

166162

167-
struct HardMagnetic2D{A} <: Magneto
163+
struct HardMagnetic2D <: Magneto
168164
μ::Float64
169165
αr::Float64
170166
χe::Float64
171167
χr::Float64
172168
βmok::Float64
173169
βcoup::Float64
174-
Kinematic::A
175-
function HardMagnetic2D(; μ::Float64, αr::Float64, χe::Float64=0.0, χr::Float64=8.0, βmok::Float64=1.0, βcoup::Float64=1.0, Kinematic::KinematicModel=Kinematics(Magneto))
176-
new{typeof(Kinematic)}(μ, αr, χe, χr, βmok, βcoup, Kinematic)
170+
function HardMagnetic2D(; μ::Float64, αr::Float64, χe::Float64=0.0, χr::Float64=8.0, βmok::Float64=1.0, βcoup::Float64=1.0)
171+
new(μ, αr, χe, χr, βmok, βcoup)
177172
end
178173

179174
function (obj::HardMagnetic2D)(Λ::Float64=1.0)

src/PhysicalModels/MagnetoMechanicalModels.jl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,10 @@ function _getCoupling(mag::HardMagnetic, mec::Mechano, Λ::Float64)
5151
# Hard magnetics in ultra-soft magnetorheological elastomers enhance fracture toughness and
5252
# delay crack propagation, Journal of the Mechanics and Physics of Solids,
5353

54-
_, H, J = get_Kinematics(mec.Kinematic; Λ=Λ)
55-
μ, αr, χe, χr, βcoup, βmok = mag.μ, mag.αr, mag.χe, mag.χr, mag.βcoup, mag.βmok
5654

55+
μ, αr, χe, χr, βcoup, βmok = mag.μ, mag.αr, mag.χe, mag.χr, mag.βcoup, mag.βmok
56+
J(F) = det(F)
57+
H(F) = det(F) * inv(F)'
5758
αr *= Λ
5859
#-------------------------------------------------------------------------------------
5960
# FIRST TERM
@@ -131,8 +132,9 @@ function _getCoupling(mag::HardMagnetic2D, mec::Mechano, Λ::Float64)
131132
# Hard magnetics in ultra-soft magnetorheological elastomers enhance fracture toughness and
132133
# delay crack propagation, Journal of the Mechanics and Physics of Solids,
133134

134-
_, H, J = get_Kinematics(mec.Kinematic; Λ=Λ)
135135
μ, αr, χe, χr, βcoup, βmok = mag.μ, mag.αr, mag.χe, mag.χr, mag.βcoup, mag.βmok
136+
J(F) = det(F)
137+
H(F) = det(F) * inv(F)'
136138
αr *= Λ
137139

138140
# #-------------------------------------------------------------------------------------

0 commit comments

Comments
 (0)