Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ using BenchmarkTools

function benchmark_viscous_model()
elasto = NeoHookean3D(λ=1e6, μ=1e3)
visco = ViscousIncompressible(IncompressibleNeoHookean3D(λ=0., μ=1e3), 10.)
visco = ViscousIncompressible(IncompressibleNeoHookean3D(λ=0., μ=1e3), τ=10.)
model = GeneralizedMaxwell(elasto, visco)
Ψ, ∂Ψu, ∂Ψuu = model(Δt = 1e-2)
F = TensorValue(1.:9...) * 1e-3 + I3
Expand Down
42 changes: 24 additions & 18 deletions src/PhysicalModels/ElectroMechanicalModels.jl
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@

struct ElectroMechModel{M<:Mechano, E<:Electro} <: ElectroMechano
mechano::M
struct ElectroMechModel{E<:Electro, M<:Mechano} <: ElectroMechano
electro::E
mechano::M

function ElectroMechModel(mechano::M, electro::E) where {M<:Mechano, E<:Electro}
new{M,E}(mechano,electro)
function ElectroMechModel(electro::E, mechano::M) where {E<:Electro, M<:Mechano}
new{E,M}(electro, mechano)
end

function ElectroMechModel(;mechano::M, electro::E) where {M<:Mechano, E<:Electro}
new{M,E}(mechano,electro)
function ElectroMechModel(; electro::E, mechano::M) where {E<:Electro, M<:Mechano}
new{E,M}(electro, mechano)
end

function (obj::ElectroMechModel)(Λ::Float64=1.0)
Ψm, ∂Ψm_u, ∂Ψm_uu = obj.mechano(Λ)
Ψem, ∂Ψem_u, ∂Ψem_φ, ∂Ψem_uu, ∂Ψem_φu, ∂Ψem_φφ = _getCoupling(obj.mechano, obj.electro, Λ)
Ψem, ∂Ψem_u, ∂Ψem_φ, ∂Ψem_uu, ∂Ψem_φu, ∂Ψem_φφ = _getCoupling(obj.electro, obj.mechano, Λ)
Ψ(F, E) = Ψm(F) + Ψem(F, E)
∂Ψu(F, E) = ∂Ψm_u(F) + ∂Ψem_u(F, E)
∂Ψφ(F, E) = ∂Ψem_φ(F, E)
Expand All @@ -23,9 +23,9 @@ struct ElectroMechModel{M<:Mechano, E<:Electro} <: ElectroMechano
return (Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ)
end

function (obj::ElectroMechModel{<:ViscoElastic,<:Electro})(Λ::Float64=1.0; Δt)
function (obj::ElectroMechModel{<:Electro,<:ViscoElastic})(Λ::Float64=1.0; Δt)
Ψm, ∂Ψm_u, ∂Ψm_uu = obj.mechano(Λ, Δt=Δt)
Ψem, ∂Ψem_u, ∂Ψem_φ, ∂Ψem_uu, ∂Ψem_φu, ∂Ψem_φφ = _getCoupling(obj.mechano, obj.electro, Λ)
Ψem, ∂Ψem_u, ∂Ψem_φ, ∂Ψem_uu, ∂Ψem_φu, ∂Ψem_φφ = _getCoupling(obj.electro, obj.mechano, Λ)
Ψ(F, Fn, E, A...) = Ψm(F, Fn, A...) + Ψem(F, E)
∂Ψu(F, Fn, E, A...) = ∂Ψm_u(F, Fn, A...) + ∂Ψem_u(F, E)
∂Ψφ(F, Fn, E, A...) = ∂Ψem_φ(F, E)
Expand All @@ -36,7 +36,7 @@ struct ElectroMechModel{M<:Mechano, E<:Electro} <: ElectroMechano
end
end

ViscoElectricModel = ElectroMechModel{<:ViscoElastic,<:Electro}
ViscoElectricModel = ElectroMechModel{<:Electro,<:ViscoElastic}

function initializeStateVariables(obj::ElectroMechano, points::Measure)
initializeStateVariables(obj.mechano, points)
Expand All @@ -47,7 +47,7 @@ function updateStateVariables!(state, obj::ElectroMechano, args...)
end


function _getCoupling(mec::Mechano, elec::Electro, Λ::Float64)
function _getCoupling(elec::Electro, mec::Mechano, Λ::Float64)
_, H, J = get_Kinematics(mec.Kinematic; Λ=Λ)

# Energy #
Expand Down Expand Up @@ -81,14 +81,20 @@ function _getCoupling(mec::Mechano, elec::Electro, Λ::Float64)
end


struct FlexoElectroModel{A} <: FlexoElectro
ElectroMechano::A
struct FlexoElectroModel{EM<:ElectroMechano} <: FlexoElectro
electromechano::EM
κ::Float64
function FlexoElectroModel(; mechano::Mechano, electro::Electro, κ=1.0)
physmodel = ElectroMechModel(mechano=mechano, electro=electro)
A = typeof(physmodel)
new{A}(physmodel, κ)

function FlexoElectroModel(electro::E, mechano::M; κ=1.0) where {E <: Electro, M <: Mechano}
physmodel = ElectroMechModel(electro, mechano)
new{ElectroMechModel{E,M}}(physmodel, κ)
end

function FlexoElectroModel(; electro::E, mechano::M, κ=1.0) where {E <: Electro, M <: Mechano}
physmodel = ElectroMechModel(electro, mechano)
new{ElectroMechModel{E,M}}(physmodel, κ)
end

function (obj::FlexoElectroModel)(Λ::Float64=1.0)
e₁ = VectorValue(1.0, 0.0, 0.0)
e₂ = VectorValue(0.0, 1.0, 0.0)
Expand All @@ -99,7 +105,7 @@ struct FlexoElectroModel{A} <: FlexoElectro
f3(δϕ) = δϕ ⊗₁² e₃
Φ(ϕ₁, ϕ₂, ϕ₃) = (f1 ∘ (ϕ₁) + f2 ∘ (ϕ₂) + f3 ∘ (ϕ₃))

Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ = obj.ElectroMechano(Λ)
Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ = obj.electromechano(Λ)
return Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ, Φ
end
end
26 changes: 15 additions & 11 deletions src/PhysicalModels/MagnetoMechanicalModels.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,21 @@
# Magneto mechanical models
# ===============================

struct MagnetoMechModel{A,B} <: MagnetoMechano
Mechano::A
Magneto::B
function MagnetoMechModel(; Mechano::Mechano, Magneto::Magneto)
A, B = typeof(Mechano), typeof(Magneto)
new{A,B}(Mechano, Magneto)
struct MagnetoMechModel{MG<:Magneto,MC<:Mechano} <: MagnetoMechano
magneto::MG
mechano::MC

function MagnetoMechModel(magneto::MG, mechano::MC) where {MG <: Magneto, MC <: Mechano}
new{MG,MC}(magneto, mechano)
end

function MagnetoMechModel(; magneto::MG, mechano::MC) where {MG <: Magneto, MC <: Mechano}
new{MG,MC}(magneto, mechano)
end

function (obj::MagnetoMechModel)(Λ::Float64=1.0)
Ψm, ∂Ψm_u, ∂Ψm_uu = obj.Mechano(Λ)
Ψmm, ∂Ψmm_u, ∂Ψmm_φ, ∂Ψmm_uu, ∂Ψmm_φu, ∂Ψmm_φφ = _getCoupling(obj.Mechano, obj.Magneto, Λ)
Ψm, ∂Ψm_u, ∂Ψm_uu = obj.mechano(Λ)
Ψmm, ∂Ψmm_u, ∂Ψmm_φ, ∂Ψmm_uu, ∂Ψmm_φu, ∂Ψmm_φφ = _getCoupling(obj.magneto, obj.mechano, Λ)

Ψ(F, ℋ₀, N) = Ψm(F) + Ψmm(F, ℋ₀, N)
∂Ψu(F, ℋ₀, N) = ∂Ψm_u(F) + ∂Ψmm_u(F, ℋ₀, N)
Expand All @@ -27,7 +31,7 @@ struct MagnetoMechModel{A,B} <: MagnetoMechano
end


function _getCoupling(::Mechano, mag::Union{IdealMagnetic,IdealMagnetic2D}, Λ::Float64)
function _getCoupling(mag::Union{IdealMagnetic,IdealMagnetic2D}, ::Mechano, Λ::Float64)
Ψmm, ∂Ψmm_∂u, ∂Ψmm_∂φ, ∂Ψmm_∂uu, ∂Ψmm_∂φu, ∂Ψmm_∂φφ = mag(Λ)

Ψ(F, ℋ₀, N) = Ψmm(F, ℋ₀)
Expand All @@ -41,7 +45,7 @@ function _getCoupling(::Mechano, mag::Union{IdealMagnetic,IdealMagnetic2D}, Λ::
end


function _getCoupling(mec::Mechano, mag::HardMagnetic, Λ::Float64)
function _getCoupling(mag::HardMagnetic, mec::Mechano, Λ::Float64)

# Miguel Angel Moreno-Mateos, Mokarram Hossain, Paul Steinmann, Daniel Garcia-Gonzalez,
# Hard magnetics in ultra-soft magnetorheological elastomers enhance fracture toughness and
Expand Down Expand Up @@ -121,7 +125,7 @@ function _getCoupling(mec::Mechano, mag::HardMagnetic, Λ::Float64)
end


function _getCoupling(mec::Mechano, mag::HardMagnetic2D, Λ::Float64)
function _getCoupling(mag::HardMagnetic2D, mec::Mechano, Λ::Float64)

# Miguel Angel Moreno-Mateos, Mokarram Hossain, Paul Steinmann, Daniel Garcia-Gonzalez,
# Hard magnetics in ultra-soft magnetorheological elastomers enhance fracture toughness and
Expand Down
45 changes: 28 additions & 17 deletions src/PhysicalModels/MechanicalModels.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,21 @@
# Regularization of Mechanical models
# ============================================

struct HessianRegularization{A,B} <: Mechano
Mechano::A
struct HessianRegularization{M<:Mechano,B} <: Mechano
mechano::M
δ::Float64
Kinematic::B
function HessianRegularization(; Mechano::Mechano, δ::Float64=1.0e-6)
new{typeof(Mechano),typeof(Mechano.Kinematic)}(Mechano, δ, Mechano.Kinematic)

function HessianRegularization(mechano::M; δ::Float64=1.0e-6) where {M <: Mechano}
new{M,typeof(mechano.Kinematic)}(mechano, δ, mechano.Kinematic)
end

function HessianRegularization(; mechano::M, δ::Float64=1.0e-6) where {M <: Mechano}
new{M,typeof(mechano.Kinematic)}(mechano, δ, mechano.Kinematic)
end

function (obj::HessianRegularization)(Λ::Float64=1.0)
Ψs, ∂Ψs, ∂2Ψs = obj.Mechano()
Ψs, ∂Ψs, ∂2Ψs = obj.mechano()
δ = obj.δ

∂2Ψ(F) = begin
Expand All @@ -26,18 +31,23 @@ struct HessianRegularization{A,B} <: Mechano
end


struct Hessian∇JRegularization{A,B} <: Mechano
Mechano::A
struct Hessian∇JRegularization{M<:Mechano,B} <: Mechano
mechano::M
δ::Float64
κ::Float64
Kinematic::B
function Hessian∇JRegularization(; Mechano::Mechano, δ::Float64=1.0e-6, κ::Float64=1.0)
new{typeof(Mechano),typeof(Mechano.Kinematic)}(Mechano, δ, κ, Mechano.Kinematic)

function Hessian∇JRegularization(mechano::M; δ::Float64=1.0e-6, κ::Float64=1.0) where {M <: Mechano}
new{M,typeof(mechano.Kinematic)}(mechano, δ, κ, mechano.Kinematic)
end

function Hessian∇JRegularization(; mechano::M, δ::Float64=1.0e-6, κ::Float64=1.0) where {M <: Mechano}
new{M,typeof(mechano.Kinematic)}(mechano, δ, κ, mechano.Kinematic)
end

function (obj::Hessian∇JRegularization)(Λ::Float64=1.0)
Ψs, ∂Ψs, ∂2Ψs = obj.Mechano()
_, H, J = get_Kinematics(obj.Mechano.Kinematic; Λ=Λ)
Ψs, ∂Ψs, ∂2Ψs = obj.mechano()
_, H, J = get_Kinematics(obj.mechano.Kinematic; Λ=Λ)
δ, κ = obj.δ, obj.κ

Ψ(F, Jh) = Ψs(F) + 0.5 * κ * (J(F) - Jh)^2
Expand All @@ -57,15 +67,16 @@ end
# ======================
# Energy interpolations
# ======================
struct EnergyInterpolationScheme{A,B} <: PhysicalModel
struct EnergyInterpolationScheme{M1<:Mechano,M2<:Mechano} <: PhysicalModel
p::Float64
model1::A
model2::B
function EnergyInterpolationScheme(model1, model2; p::Float64=3.0)
new{typeof(model1),typeof(model2)}(p, model1, model2)
model1::M1
model2::M2

function EnergyInterpolationScheme(model1::M1, model2::M2; p::Float64=3.0) where {M1 <: Mechano, M2 <: Mechano}
new{M1,M2}(p, model1, model2)
end

function (obj::EnergyInterpolationScheme{<:Mechano,<:Mechano})()
function (obj::EnergyInterpolationScheme)()
Ψs, ∂Ψs, ∂2Ψs = obj.model1()
Ψv, ∂Ψv, ∂2Ψv = obj.model2()
p = obj.p
Expand Down
78 changes: 45 additions & 33 deletions src/PhysicalModels/ThermoElectroMechanicalModels.jl
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@

struct ThermoElectroMechModel{A,B,C} <: ThermoElectroMechano
Thermo::A
Electro::B
Mechano::C
struct ThermoElectroMechModel{T<:Thermo,E<:Electro,M<:Mechano} <: ThermoElectroMechano
thermo::T
electro::E
mechano::M
fθ::Function
dfdθ::Function
function ThermoElectroMechModel(; Thermo::Thermo, Electro::Electro, Mechano::Mechano, fθ::Function, dfdθ::Function)
A, B, C = typeof(Thermo), typeof(Electro), typeof(Mechano)
new{A,B,C}(Thermo, Electro, Mechano, fθ, dfdθ)

function ThermoElectroMechModel(thermo::T, electro::E, mechano::M; fθ::Function, dfdθ::Function) where {T<:Thermo,E<:Electro,M<:Mechano}
new{T,E,M}(thermo, electro, mechano, fθ, dfdθ)
end

function ThermoElectroMechModel(; thermo::T, electro::E, mechano::M, fθ::Function, dfdθ::Function) where {T<:Thermo,E<:Electro,M<:Mechano}
new{T,E,M}(thermo, electro, mechano, fθ, dfdθ)
end

function (obj::ThermoElectroMechModel)(Λ::Float64=1.0)
Ψt, ∂Ψt_θ, ∂Ψt_θθ = obj.Thermo(Λ)
Ψm, ∂Ψm_u, ∂Ψm_uu = obj.Mechano(Λ)
Ψem, ∂Ψem_u, ∂Ψem_φ, ∂Ψem_uu, ∂Ψem_φu, ∂Ψem_φφ = _getCoupling(obj.Mechano, obj.Electro, Λ)
Ψtm, ∂Ψtm_u, ∂Ψtm_θ, ∂Ψtm_uu, ∂Ψtm_uθ, ∂Ψtm_θθ = _getCoupling(obj.Mechano, obj.Thermo, Λ)
Ψt, ∂Ψt_θ, ∂Ψt_θθ = obj.thermo(Λ)
Ψm, ∂Ψm_u, ∂Ψm_uu = obj.mechano(Λ)
Ψem, ∂Ψem_u, ∂Ψem_φ, ∂Ψem_uu, ∂Ψem_φu, ∂Ψem_φφ = _getCoupling(obj.electro, obj.mechano, Λ)
Ψtm, ∂Ψtm_u, ∂Ψtm_θ, ∂Ψtm_uu, ∂Ψtm_uθ, ∂Ψtm_θθ = _getCoupling(obj.thermo, obj.mechano, Λ)
f(δθ) = (obj.fθ(δθ)::Float64)
df(δθ) = (obj.dfdθ(δθ)::Float64)

Expand All @@ -35,31 +39,35 @@ struct ThermoElectroMechModel{A,B,C} <: ThermoElectroMechano
end


struct ThermoElectroMech_Govindjee{A,B,C} <: ThermoElectroMechano
Thermo::A
Electro::B
Mechano::C
struct ThermoElectroMech_Govindjee{T<:Thermo,E<:Electro,M<:Mechano} <: ThermoElectroMechano
thermo::T
electro::E
mechano::M
fθ::Function
dfdθ::Function
gθ::Function
dgdθ::Function
β::Float64
function ThermoElectroMech_Govindjee(; Thermo::Thermo, Electro::Electro, Mechano::Mechano, fθ::Function, dfdθ::Function, gθ::Function, dgdθ::Function, β::Float64=0.0)
A, B, C, = typeof(Thermo), typeof(Electro), typeof(Mechano)
new{A,B,C}(Thermo, Electro, Mechano, fθ, dfdθ, gθ, dgdθ, β)

function ThermoElectroMech_Govindjee(thermo::T, electro::E, mechano::M; fθ::Function, dfdθ::Function, gθ::Function, dgdθ::Function, β::Float64=0.0) where {T<:Thermo,E<:Electro,M<:Mechano}
new{T,E,M}(thermo, electro, mechano, fθ, dfdθ, gθ, dgdθ, β)
end

function ThermoElectroMech_Govindjee(; thermo::T, electro::E, mechano::M, fθ::Function, dfdθ::Function, gθ::Function, dgdθ::Function, β::Float64=0.0) where {T<:Thermo,E<:Electro,M<:Mechano}
new{T,E,M}(thermo, electro, mechano, fθ, dfdθ, gθ, dgdθ, β)
end

function (obj::ThermoElectroMech_Govindjee)(Λ::Float64=1.0)
Ψm, _, _ = obj.Mechano(Λ)
Ψem, _, _, _, _, _ = _getCoupling(obj.Mechano, obj.Electro, Λ)
Ψm, _, _ = obj.mechano(Λ)
Ψem, _, _, _, _, _ = _getCoupling(obj.electro, obj.mechano, Λ)
f(δθ) = obj.fθ(δθ)
df(δθ) = obj.dfdθ(δθ)
g(δθ) = obj.gθ(δθ)
dg(δθ) = obj.dgdθ(δθ)

_, _, J = get_Kinematics(obj.Mechano.Kinematic; Λ=Λ)
Ψer(F) = obj.Thermo.α * (J(F) - 1.0) * obj.Thermo.θr
ΨL1(δθ) = obj.Thermo.Cv * obj.Thermo.θr * (1 - obj.β) * ((δθ + obj.Thermo.θr) / obj.Thermo.θr * (1.0 - log((δθ + obj.Thermo.θr) / obj.Thermo.θr)) - 1.0)
_, _, J = get_Kinematics(obj.mechano.Kinematic; Λ=Λ)
Ψer(F) = obj.thermo.α * (J(F) - 1.0) * obj.thermo.θr
ΨL1(δθ) = obj.thermo.Cv * obj.thermo.θr * (1 - obj.β) * ((δθ + obj.thermo.θr) / obj.thermo.θr * (1.0 - log((δθ + obj.thermo.θr) / obj.thermo.θr)) - 1.0)
ΨL3(δθ) = g(δθ) - g(0.0) - dg(0.0) * δθ

Ψ(F, E, δθ) = f(δθ) * (Ψm(F) + Ψem(F, E)) + (1 - f(δθ)) * Ψer(F) + ΨL1(δθ) + ΨL3(δθ) * (Ψm(F) + Ψem(F, E))
Expand Down Expand Up @@ -94,26 +102,30 @@ struct ThermoElectroMech_Govindjee{A,B,C} <: ThermoElectroMechano
end


struct ThermoElectroMech_Bonet{A,B,C} <: ThermoElectroMechano
Thermo::A
Electro::B
Mechano::C
function ThermoElectroMech_Bonet(; Thermo::ThermalModel, Electro::Electro, Mechano::Mechano)
A, B, C, = typeof(Thermo), typeof(Electro), typeof(Mechano)
new{A,B,C}(Thermo, Electro, Mechano)
struct ThermoElectroMech_Bonet{T<:Thermo,E<:Electro,M<:Mechano} <: ThermoElectroMechano
thermo::T
electro::E
mechano::M

function ThermoElectroMech_Bonet(thermo::T, electro::E, mechano::M) where {T<:Thermo,E<:Electro,M<:Mechano}
new{T,E,M}(thermo, electro, mechano)
end

function ThermoElectroMech_Bonet(; thermo::T, electro::E, mechano::M) where {T<:Thermo,E<:Electro,M<:Mechano}
new{T,E,M}(thermo, electro, mechano)
end

function (obj::ThermoElectroMech_Bonet)(Λ::Float64=1.0)
@unpack Cv,θr, α, κ, γv, γd =obj.Thermo
Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂Ψem∂EE = _getCoupling(obj.Mechano, obj.Electro, Λ)
@unpack Cv,θr, α, κ, γv, γd = obj.thermo
Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂Ψem∂EE = _getCoupling(obj.electro, obj.mechano, Λ)
gd(δθ) = 1/(γd+1) * (((δθ+θr)/θr)^(γd+1) -1)
∂gd(δθ) = (δθ+θr)^γd / θr^(γd+1)
∂∂gd(δθ) = γd*(δθ+θr)^(γd-1) / θr^(γd+1)
gv(δθ) = 1/(γv+1) * (((δθ+θr)/θr)^(γv+1) -1)
∂gv(δθ) = (δθ+θr)^γv / θr^(γv+1)
∂∂gv(δθ) = γv*(δθ+θr)^(γv-1) / θr^(γv+1)

_, H, J = get_Kinematics(obj.Mechano.Kinematic; Λ=Λ)
_, H, J = get_Kinematics(obj.mechano.Kinematic; Λ=Λ)

η(F)=α*(J(F) - 1.0)+Cv/γv
∂η∂J(F)=α
Expand Down
Loading
Loading