Skip to content

Commit d2bb3ce

Browse files
authored
Merge pull request #50 from MultiSimOLab/membrane
2 parents 62ff417 + 3444f00 commit d2bb3ce

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)