From 2342104d5a9e865e43f8d459ff3d6d39403d79d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Mas=C3=B3?= Date: Wed, 21 Jan 2026 17:12:24 +0100 Subject: [PATCH 1/3] missing function --- .../ThermoElectroMechanicalModels.jl | 75 +++++++++++-------- 1 file changed, 44 insertions(+), 31 deletions(-) diff --git a/src/PhysicalModels/ThermoElectroMechanicalModels.jl b/src/PhysicalModels/ThermoElectroMechanicalModels.jl index 667f38b..3941cd5 100644 --- a/src/PhysicalModels/ThermoElectroMechanicalModels.jl +++ b/src/PhysicalModels/ThermoElectroMechanicalModels.jl @@ -1,4 +1,12 @@ +function initialize_state(obj::TEM, points::Measure) where {TEM<:ThermoElectroMechano} + initialize_state(obj.mechano, points) +end + +function update_state!(obj::TEM, state, F, E, θ, args...) where {TEM<:ThermoElectroMechano} + update_state!(obj.mechano, state, F, args...) +end + struct ThermoElectroMechModel{T<:Thermo,E<:Electro,M<:Mechano} <: ThermoElectroMechano thermo::T electro::E @@ -115,42 +123,47 @@ struct ThermoElectroMech_Bonet{T<:Thermo,E<:Electro,M<:Mechano} <: ThermoElectro function ThermoElectroMech_Bonet(; thermo::T, electro::E, mechano::M) where {T<:Thermo,E<:Electro,M<:Mechano} new{T,E,M}(thermo, electro, mechano) end +end - function (obj::ThermoElectroMech_Bonet)(Λ::Float64=1.0; kwargs...) - @unpack Cv, θr, α, κ, γv, γd = obj.thermo - em = ElectroMechModel(obj.electro, obj.mechano) - Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂Ψem∂EE = em(;kwargs...) - gd(θ) = 1/(γd+1) * ((θ/θr)^(γd+1) -1) - ∂gd(θ) = θ^γd / θr^(γd+1) - ∂∂gd(θ) = γd*θ^(γd-1) / θr^(γd+1) - gv(θ) = 1/(γv+1) * ((θ/θr)^(γv+1) -1) - ∂gv(θ) = θ^γv / θr^(γv+1) - ∂∂gv(θ) = γv*θ^(γv-1) / θr^(γv+1) +g(θ,θr,γ) = 1/(γ+1) * ((θ/θr)^(γ+1) -1) +∂g(θ,θr,γ) = θ^γ / θr^(γ+1) +∂∂g(θ,θr,γ) = γ*θ^(γ-1) / θr^(γ+1) - J(F) = det(F) - H(F) = det(F) * inv(F)' +function (obj::ThermoElectroMech_Bonet)(Λ::Float64=1.0) + @unpack Cv, θr, α, κ, γv, γd = obj.thermo + em = ElectroMechModel(obj.electro, obj.mechano) + Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂Ψem∂EE = em() - ηR(F) = α*(J(F) - 1.0)+Cv/γv - ∂ηR∂J(F) = α - ∂ηR∂F(F) = ∂ηR∂J(F)*H(F) - ∂2ηR∂FF(F) = ×ᵢ⁴(∂ηR∂J(F) * F) + gd(θ) = g(θ,θr,γd) + ∂gd(θ) = ∂g(θ,θr,γd) + ∂∂gd(θ) = ∂∂g(θ,θr,γd) + gv(θ) = g(θ,θr,γv) + ∂gv(θ) = ∂g(θ,θr,γv) + ∂∂gv(θ) = ∂∂g(θ,θr,γv) - Ψ(F, E, θ, X...) = Ψem(F, E, X...)*(1.0+gd(θ)) - θr*gv(θ)*ηR(F) + J(F) = det(F) + H(F) = cof(F) - ∂Ψ_∂F(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂F(F, E, X...) - θr*gv(θ)*∂ηR∂F(F) - ∂Ψ_∂E(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂E(F, E, X...) - ∂Ψ_∂θ(F, E, θ, X...) = ∂gd(θ) *Ψem(F, E, X...) - θr*∂gv(θ)*ηR(F) + ηR(F) = α*(J(F) - 1.0)+Cv/γv + ∂ηR∂J(F) = α + ∂ηR∂F(F) = ∂ηR∂J(F)*H(F) + ∂2ηR∂FF(F) = ×ᵢ⁴(∂ηR∂J(F) * F) - ∂2Ψ_∂2F(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂FF(F, E, X...) - θr*gv(θ)*∂2ηR∂FF(F) - ∂2Ψ_∂2E(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂EE(F, E, X...) - ∂2Ψ_∂2θ(F, E, θ, X...) = ∂∂gd(θ) *Ψem(F, E, X...) - θr*∂∂gv(θ)*ηR(F) + Ψ(F, E, θ, X...) = Ψem(F, E, X...)*(1.0+gd(θ)) - θr*gv(θ)*ηR(F) - ∂ΨEF(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂EF(F, E, X...) - ∂ΨFθ(F, E, θ, X...) = ∂gd(θ) *∂Ψem∂F(F, E, X...) - θr*∂gv(θ)*∂ηR∂F(F) - ∂ΨEθ(F, E, θ, X...) = ∂gd(θ) *∂Ψem∂E(F, E, X...) + ∂Ψ_∂F(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂F(F, E, X...) - θr*gv(θ)*∂ηR∂F(F) + ∂Ψ_∂E(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂E(F, E, X...) + ∂Ψ_∂θ(F, E, θ, X...) = ∂gd(θ) *Ψem(F, E, X...) - θr*∂gv(θ)*ηR(F) - return (Ψ, ∂Ψ_∂F, ∂Ψ_∂E, ∂Ψ_∂θ, ∂2Ψ_∂2F, ∂2Ψ_∂2E, ∂2Ψ_∂2θ, ∂ΨEF, ∂ΨFθ, ∂ΨEθ) - end + ∂2Ψ_∂2F(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂FF(F, E, X...) - θr*gv(θ)*∂2ηR∂FF(F) + ∂2Ψ_∂2E(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂EE(F, E, X...) + ∂2Ψ_∂2θ(F, E, θ, X...) = ∂∂gd(θ) *Ψem(F, E, X...) - θr*∂∂gv(θ)*ηR(F) + + ∂ΨEF(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂EF(F, E, X...) + ∂ΨFθ(F, E, θ, X...) = ∂gd(θ) *∂Ψem∂F(F, E, X...) - θr*∂gv(θ)*∂ηR∂F(F) + ∂ΨEθ(F, E, θ, X...) = ∂gd(θ) *∂Ψem∂E(F, E, X...) + + return (Ψ, ∂Ψ_∂F, ∂Ψ_∂E, ∂Ψ_∂θ, ∂2Ψ_∂2F, ∂2Ψ_∂2E, ∂2Ψ_∂2θ, ∂ΨEF, ∂ΨFθ, ∂ΨEθ) end function update_time_step!(obj::ThermoElectroMech_Bonet, Δt::Float64) @@ -160,10 +173,10 @@ function update_time_step!(obj::ThermoElectroMech_Bonet, Δt::Float64) end function Dissipation(obj::ThermoElectroMech_Bonet) - @unpack Cv,θr, α, κ, γv, γd = obj.thermo + @unpack Cv, θr, α, κ, γv, γd = obj.thermo Dvis = Dissipation(obj.mechano) - gd(δθ) = 1/(γd+1) * (((δθ+θr)/θr)^(γd+1) -1) - ∂gd(δθ) = (δθ+θr)^γd / θr^(γd+1) + gd(θ) = g(θ,θr,γd) + ∂gd(θ) = ∂g(θ,θr,γd) D(F, E, δθ, X...) = (1 + gd(δθ)) * Dvis(F, X...) ∂D∂θ(F, E, δθ, X...) = ∂gd(δθ) * Dvis(F, X...) return(D, ∂D∂θ) From c1c4bfe4e084e5a7e9c96819628c588c5749e206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Mas=C3=B3?= Date: Fri, 23 Jan 2026 12:00:47 +0100 Subject: [PATCH 2/3] missing electro-mechanic dissipation --- src/PhysicalModels/ElectroMechanicalModels.jl | 5 +++++ src/PhysicalModels/ThermoElectroMechanicalModels.jl | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/PhysicalModels/ElectroMechanicalModels.jl b/src/PhysicalModels/ElectroMechanicalModels.jl index 5014560..07801bd 100644 --- a/src/PhysicalModels/ElectroMechanicalModels.jl +++ b/src/PhysicalModels/ElectroMechanicalModels.jl @@ -72,6 +72,11 @@ function update_state!(obj::ElectroMechModel, state, F, E, args...) update_state!(obj.mechano, state, F, args...) end +function Dissipation(obj::ElectroMechModel) + Dvis = Dissipation(obj.mechano) + D(F, E, X...) = Dvis(F, X...) +end + function _getCoupling(elec::Electro, mec::Mechano, Λ::Float64=0.0) J(F) = det(F) diff --git a/src/PhysicalModels/ThermoElectroMechanicalModels.jl b/src/PhysicalModels/ThermoElectroMechanicalModels.jl index 3941cd5..1cbff48 100644 --- a/src/PhysicalModels/ThermoElectroMechanicalModels.jl +++ b/src/PhysicalModels/ThermoElectroMechanicalModels.jl @@ -177,7 +177,7 @@ function Dissipation(obj::ThermoElectroMech_Bonet) Dvis = Dissipation(obj.mechano) gd(θ) = g(θ,θr,γd) ∂gd(θ) = ∂g(θ,θr,γd) - D(F, E, δθ, X...) = (1 + gd(δθ)) * Dvis(F, X...) - ∂D∂θ(F, E, δθ, X...) = ∂gd(δθ) * Dvis(F, X...) + D(F, E, θ, X...) = (1 + gd(θ)) * Dvis(F, X...) + ∂D∂θ(F, E, θ, X...) = ∂gd(θ) * Dvis(F, X...) return(D, ∂D∂θ) end From cee31b5934749e9f7d41784712532f2fed4b7668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Mas=C3=B3?= Date: Fri, 23 Jan 2026 12:38:33 +0100 Subject: [PATCH 3/3] reraming functions --- src/PhysicalModels/ElectroMechanicalModels.jl | 2 -- .../ThermoElectroMechanicalModels.jl | 20 +++++++++---------- src/WeakForms/ElectroMechanics.jl | 4 ++-- src/WeakForms/WeakForms.jl | 1 - 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/PhysicalModels/ElectroMechanicalModels.jl b/src/PhysicalModels/ElectroMechanicalModels.jl index 07801bd..ad1b1ed 100644 --- a/src/PhysicalModels/ElectroMechanicalModels.jl +++ b/src/PhysicalModels/ElectroMechanicalModels.jl @@ -57,8 +57,6 @@ struct ElectroMechModel{E<:Electro,M<:Mechano} <: ElectroMechano end end -ViscoElectricModel = ElectroMechModel{<:Electro,<:ViscoElastic} - function update_time_step!(obj::ElectroMechModel, Δt::Float64) update_time_step!(obj.electro, Δt) update_time_step!(obj.mechano, Δt) diff --git a/src/PhysicalModels/ThermoElectroMechanicalModels.jl b/src/PhysicalModels/ThermoElectroMechanicalModels.jl index 1cbff48..141c16e 100644 --- a/src/PhysicalModels/ThermoElectroMechanicalModels.jl +++ b/src/PhysicalModels/ThermoElectroMechanicalModels.jl @@ -151,19 +151,19 @@ function (obj::ThermoElectroMech_Bonet)(Λ::Float64=1.0) Ψ(F, E, θ, X...) = Ψem(F, E, X...)*(1.0+gd(θ)) - θr*gv(θ)*ηR(F) - ∂Ψ_∂F(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂F(F, E, X...) - θr*gv(θ)*∂ηR∂F(F) - ∂Ψ_∂E(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂E(F, E, X...) - ∂Ψ_∂θ(F, E, θ, X...) = ∂gd(θ) *Ψem(F, E, X...) - θr*∂gv(θ)*ηR(F) + ∂Ψ∂F(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂F(F, E, X...) - θr*gv(θ)*∂ηR∂F(F) + ∂Ψ∂E(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂E(F, E, X...) + ∂Ψ∂θ(F, E, θ, X...) = ∂gd(θ) *Ψem(F, E, X...) - θr*∂gv(θ)*ηR(F) - ∂2Ψ_∂2F(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂FF(F, E, X...) - θr*gv(θ)*∂2ηR∂FF(F) - ∂2Ψ_∂2E(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂EE(F, E, X...) - ∂2Ψ_∂2θ(F, E, θ, X...) = ∂∂gd(θ) *Ψem(F, E, X...) - θr*∂∂gv(θ)*ηR(F) + ∂∂Ψ∂FF(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂FF(F, E, X...) - θr*gv(θ)*∂2ηR∂FF(F) + ∂∂Ψ∂EE(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂EE(F, E, X...) + ∂∂Ψ∂θθ(F, E, θ, X...) = ∂∂gd(θ) *Ψem(F, E, X...) - θr*∂∂gv(θ)*ηR(F) - ∂ΨEF(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂EF(F, E, X...) - ∂ΨFθ(F, E, θ, X...) = ∂gd(θ) *∂Ψem∂F(F, E, X...) - θr*∂gv(θ)*∂ηR∂F(F) - ∂ΨEθ(F, E, θ, X...) = ∂gd(θ) *∂Ψem∂E(F, E, X...) + ∂∂Ψ∂EF(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂EF(F, E, X...) + ∂∂Ψ∂Fθ(F, E, θ, X...) = ∂gd(θ) *∂Ψem∂F(F, E, X...) - θr*∂gv(θ)*∂ηR∂F(F) + ∂∂Ψ∂Eθ(F, E, θ, X...) = ∂gd(θ) *∂Ψem∂E(F, E, X...) - return (Ψ, ∂Ψ_∂F, ∂Ψ_∂E, ∂Ψ_∂θ, ∂2Ψ_∂2F, ∂2Ψ_∂2E, ∂2Ψ_∂2θ, ∂ΨEF, ∂ΨFθ, ∂ΨEθ) + return (Ψ, ∂Ψ∂F, ∂Ψ∂E, ∂Ψ∂θ, ∂∂Ψ∂FF, ∂∂Ψ∂EE, ∂∂Ψ∂θθ, ∂∂Ψ∂EF, ∂∂Ψ∂Fθ, ∂∂Ψ∂Eθ) end function update_time_step!(obj::ThermoElectroMech_Bonet, Δt::Float64) diff --git a/src/WeakForms/ElectroMechanics.jl b/src/WeakForms/ElectroMechanics.jl index 3e2d780..862cd1c 100644 --- a/src/WeakForms/ElectroMechanics.jl +++ b/src/WeakForms/ElectroMechanics.jl @@ -72,12 +72,12 @@ end # Monolithic strategy # ------------------- -function residual(physicalmodel::ViscoElectricModel, kine::NTuple{2,KinematicModel}, (u, φ), (v, vφ), dΩ, Λ, un, A) +function residual(physicalmodel::ElectroMechModel{<:Electro,<:ViscoElastic}, kine::NTuple{2,KinematicModel}, (u, φ), (v, vφ), dΩ, Λ, un, A) residual(physicalmodel, Mechano, kine, (u, φ), v, dΩ, Λ, un, A) + residual(physicalmodel, Electro, kine, (u, φ), vφ, dΩ, Λ, un, A) end -function jacobian(physicalmodel::ViscoElectricModel, kine::NTuple{2,KinematicModel}, (u, φ), (du, dφ), (v, vφ), dΩ, Λ, un, A) +function jacobian(physicalmodel::ElectroMechModel{<:Electro,<:ViscoElastic}, kine::NTuple{2,KinematicModel}, (u, φ), (du, dφ), (v, vφ), dΩ, Λ, un, A) jacobian(physicalmodel, Mechano, kine,(u, φ), du, v, dΩ, Λ, un, A) + jacobian(physicalmodel, Electro, kine,(u, φ), dφ, vφ, dΩ, Λ, un, A) + jacobian(physicalmodel, ElectroMechano, kine,(u, φ), (du, dφ), (v, vφ), dΩ, Λ, un, A) diff --git a/src/WeakForms/WeakForms.jl b/src/WeakForms/WeakForms.jl index 76cceff..3a49653 100644 --- a/src/WeakForms/WeakForms.jl +++ b/src/WeakForms/WeakForms.jl @@ -3,7 +3,6 @@ module WeakForms using Gridap using HyperFEM.TensorAlgebra using HyperFEM.PhysicalModels -using HyperFEM.PhysicalModels:ViscoElectricModel export residual export jacobian