From 95c9dee7269191cd9f68725e7b2d6a329ccfc6e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Mas=C3=B3?= Date: Wed, 28 Jan 2026 11:16:30 +0100 Subject: [PATCH 1/6] using multiple dispatch --- src/Exports.jl | 2 +- src/PhysicalModels/PhysicalModels.jl | 2 +- src/PhysicalModels/ThermalModels.jl | 26 ++++++++ .../ThermoElectroMechanicalModels.jl | 65 +++++-------------- src/PhysicalModels/ThermoMechanicalModels.jl | 26 ++++++++ src/WeakForms/WeakForms.jl | 2 +- .../PhysicalModelTests.jl | 12 ++-- 7 files changed, 79 insertions(+), 56 deletions(-) diff --git a/src/Exports.jl b/src/Exports.jl index 0f2a7ba..44e6b70 100644 --- a/src/Exports.jl +++ b/src/Exports.jl @@ -44,6 +44,7 @@ end @publish PhysicalModels TransverseIsotropy3D @publish PhysicalModels TransverseIsotropy2D @publish PhysicalModels ThermalModel +@publish PhysicalModels ThermalModel3rdLaw @publish PhysicalModels IdealDielectric @publish PhysicalModels Magnetic @publish PhysicalModels IdealMagnetic @@ -57,7 +58,6 @@ end @publish PhysicalModels FlexoElectroModel @publish PhysicalModels ThermoElectroMech_Govindjee @publish PhysicalModels ThermoElectroMech_PINNs -@publish PhysicalModels ThermoElectroMech_Bonet @publish PhysicalModels MagnetoMechModel @publish PhysicalModels ARAP2D @publish PhysicalModels ARAP2D_regularized diff --git a/src/PhysicalModels/PhysicalModels.jl b/src/PhysicalModels/PhysicalModels.jl index e3ec151..45b5abb 100644 --- a/src/PhysicalModels/PhysicalModels.jl +++ b/src/PhysicalModels/PhysicalModels.jl @@ -45,6 +45,7 @@ export IdealMagnetic2D export HardMagnetic export HardMagnetic2D export ThermalModel +export ThermalModel3rdLaw export ElectroMechModel export ThermoElectroMechModel export ThermoMechModel @@ -52,7 +53,6 @@ export ThermoMech_EntropicPolyconvex export FlexoElectroModel export ThermoElectroMech_Govindjee export ThermoElectroMech_PINNs -export ThermoElectroMech_Bonet export MagnetoMechModel export GeneralizedMaxwell export ViscousIncompressible diff --git a/src/PhysicalModels/ThermalModels.jl b/src/PhysicalModels/ThermalModels.jl index e1539d9..32c7819 100644 --- a/src/PhysicalModels/ThermalModels.jl +++ b/src/PhysicalModels/ThermalModels.jl @@ -20,5 +20,31 @@ struct ThermalModel <: Thermo ∂Ψθθ(δθ) = -obj.Cv / (δθ + obj.θr) return (Ψ, ∂Ψθ, ∂Ψθθ) end +end + + +struct ThermalModel3rdLaw <: Thermo + Cv0::Float64 + θr::Float64 + α::Float64 + κ::Float64 + γv::Float64 + γd::Float64 + function ThermalModel3rdLaw(; Cv0::Float64, θr::Float64, α::Float64, κ::Float64, γv::Float64, γd::Float64) + new(Cv0, θr, α, κ, γv, γd) + end +end +function (obj::ThermalModel3rdLaw)() + @unpack Cv0, θr, α, κ, γv, γd = obj + g(θ,θr,γ) = 1/(γ+1) * ((θ/θr)^(γ+1) -1) + ∂g(θ,θr,γ) = θ^γ / θr^(γ+1) + ∂∂g(θ,θr,γ) = γ*θ^(γ-1) / θr^(γ+1) + gd(θ) = g(θ,θr,γd) + ∂gd(θ) = ∂g(θ,θr,γd) + ∂∂gd(θ) = ∂∂g(θ,θr,γd) + gv(θ) = g(θ,θr,γv) + ∂gv(θ) = ∂g(θ,θr,γv) + ∂∂gv(θ) = ∂∂g(θ,θr,γv) + return (gv, ∂gv, ∂∂gv, gd, ∂gd, ∂∂gd) end diff --git a/src/PhysicalModels/ThermoElectroMechanicalModels.jl b/src/PhysicalModels/ThermoElectroMechanicalModels.jl index 141c16e..b95ef8c 100644 --- a/src/PhysicalModels/ThermoElectroMechanicalModels.jl +++ b/src/PhysicalModels/ThermoElectroMechanicalModels.jl @@ -7,6 +7,12 @@ function update_state!(obj::TEM, state, F, E, θ, args...) where {TEM<:ThermoEle update_state!(obj.mechano, state, F, args...) end +function update_time_step!(obj::TEM, Δt::Float64) where {TEM<:ThermoElectroMechano} + update_time_step!(obj.thermo, Δt) + update_time_step!(obj.electro, Δt) + update_time_step!(obj.mechano, Δt) +end + struct ThermoElectroMechModel{T<:Thermo,E<:Electro,M<:Mechano} <: ThermoElectroMechano thermo::T electro::E @@ -22,6 +28,10 @@ struct ThermoElectroMechModel{T<:Thermo,E<:Electro,M<:Mechano} <: ThermoElectroM new{T,E,M}(thermo, electro, mechano, fθ, dfdθ) end + function ThermoElectroMechModel(thermo::ThermalModel3rdLaw, electro::E, mechano::M) where {E<:Electro, M<:Mechano} + new{ThermalModel3rdLaw,E,M}(thermo, electro, mechano) + end + function (obj::ThermoElectroMechModel)(Λ::Float64=1.0) Ψt, ∂Ψt_θ, ∂Ψt_θθ = obj.thermo(Λ) Ψm, ∂Ψm_u, ∂Ψm_uu = obj.mechano(Λ) @@ -111,43 +121,12 @@ struct ThermoElectroMech_Govindjee{T<:Thermo,E<:Electro,M<:Mechano} <: ThermoEle end -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 -end - -g(θ,θr,γ) = 1/(γ+1) * ((θ/θr)^(γ+1) -1) -∂g(θ,θr,γ) = θ^γ / θr^(γ+1) -∂∂g(θ,θr,γ) = γ*θ^(γ-1) / θr^(γ+1) - -function (obj::ThermoElectroMech_Bonet)(Λ::Float64=1.0) - @unpack Cv, θr, α, κ, γv, γd = obj.thermo +function (obj::ThermoElectroMechModel{ThermalModel3rdLaw,<:Electro,<:Mechano})(Λ::Float64=0.0) + @unpack Cv0, θr, α, κ, γv, γd = obj.thermo em = ElectroMechModel(obj.electro, obj.mechano) Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂Ψem∂EE = em() - - gd(θ) = g(θ,θr,γd) - ∂gd(θ) = ∂g(θ,θr,γd) - ∂∂gd(θ) = ∂∂g(θ,θr,γd) - gv(θ) = g(θ,θr,γv) - ∂gv(θ) = ∂g(θ,θr,γv) - ∂∂gv(θ) = ∂∂g(θ,θr,γv) - - J(F) = det(F) - H(F) = cof(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) + gv, ∂gv, ∂∂gv, gd, ∂gd, ∂∂gd = obj.thermo() + ηR, ∂ηR∂F, ∂∂ηR∂FF = _getCoupling(obj.thermo, obj.mechano) Ψ(F, E, θ, X...) = Ψem(F, E, X...)*(1.0+gd(θ)) - θr*gv(θ)*ηR(F) @@ -155,28 +134,20 @@ function (obj::ThermoElectroMech_Bonet)(Λ::Float64=1.0) ∂Ψ∂E(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂E(F, E, X...) ∂Ψ∂θ(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) + ∂∂Ψ∂FF(F, E, θ, X...) = (1.0+gd(θ)) *∂Ψem∂FF(F, E, X...) - θr*gv(θ)*∂∂η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...) - return (Ψ, ∂Ψ∂F, ∂Ψ∂E, ∂Ψ∂θ, ∂∂Ψ∂FF, ∂∂Ψ∂EE, ∂∂Ψ∂θθ, ∂∂Ψ∂EF, ∂∂Ψ∂Fθ, ∂∂Ψ∂Eθ) end -function update_time_step!(obj::ThermoElectroMech_Bonet, Δt::Float64) - update_time_step!(obj.thermo, Δt) - update_time_step!(obj.electro, Δt) - update_time_step!(obj.mechano, Δt) -end - -function Dissipation(obj::ThermoElectroMech_Bonet) - @unpack Cv, θr, α, κ, γv, γd = obj.thermo +function Dissipation(obj::ThermoElectroMechModel{ThermalModel3rdLaw,<:Electro,<:Mechano}) + @unpack Cv0, θr, α, κ, γv, γd = obj.thermo + gv, ∂gv, ∂∂gv, gd, ∂gd, ∂∂gd = obj.thermo() 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...) return(D, ∂D∂θ) diff --git a/src/PhysicalModels/ThermoMechanicalModels.jl b/src/PhysicalModels/ThermoMechanicalModels.jl index b5f6a4d..c4e72d8 100644 --- a/src/PhysicalModels/ThermoMechanicalModels.jl +++ b/src/PhysicalModels/ThermoMechanicalModels.jl @@ -35,6 +35,32 @@ struct ThermoMechModel{T<:Thermo,M<:Mechano} <: ThermoMechano end +function (obj::ThermoMechModel{ThermalModel3rdLaw,<:Mechano})(Λ::Float64=0.0) + @unpack Cv0, θr, α, κ, γv, γd = obj.thermo + gv, ∂gv, ∂∂gv, gd, ∂gd, ∂∂gd = obj.thermo() + Ψm, ∂Ψm∂F, ∂∂Ψm∂FF = obj.mechano() + ηR, ∂ηR∂F, ∂∂ηR∂FF = _getCoupling(obj.thermo, obj.mechano) + Ψ(F, θ, X...) = Ψm(F, X...)*(1.0+gd(θ)) - θr*gv(θ)*ηR(F) + ∂Ψ∂F(F, θ, X...) = (1.0+gd(θ)) *∂Ψm∂F(F, X...) - θr*gv(θ)*∂ηR∂F(F) + ∂Ψ∂θ(F, θ, X...) = ∂gd(θ) *Ψm(F, X...) - θr*∂gv(θ)*ηR(F) + ∂∂Ψ∂FF(F, θ, X...) = (1.0+gd(θ)) *∂∂Ψm∂FF(F, E, X...) - θr*gv(θ)*∂∂ηR∂FF(F) + ∂∂Ψ∂θθ(F, θ, X...) = ∂∂gd(θ) *Ψm(F, X...) - θr*∂∂gv(θ)*ηR(F) + ∂∂Ψ∂Fθ(F, θ, X...) = ∂gd(θ) *∂Ψm∂F(F, X...) - θr*∂gv(θ)*∂ηR∂F(F) + return (Ψ, ∂Ψ∂F, ∂Ψ∂θ, ∂∂Ψ∂FF, ∂∂Ψ∂θθ, ∂∂Ψ∂Fθ) +end + +function _getCoupling(thermo::ThermalModel3rdLaw, ::Mechano) + @unpack Cv0, θr, α, κ, γv, γd = thermo + J(F) = det(F) + H(F) = cof(F) + ηR(F) = α*(J(F) - 1.0) + Cv0/γv + ∂ηR∂J(F) = α + ∂ηR∂F(F) = ∂ηR∂J(F)*H(F) + ∂∂ηR∂FF(F) = ×ᵢ⁴(∂ηR∂J(F) * F) + return (ηR, ∂ηR∂F, ∂∂ηR∂FF) +end + + struct ThermoMech_EntropicPolyconvex{T<:Thermo,M<:Mechano} <: ThermoMechano thermo::T mechano::M diff --git a/src/WeakForms/WeakForms.jl b/src/WeakForms/WeakForms.jl index 3a49653..7611a6b 100644 --- a/src/WeakForms/WeakForms.jl +++ b/src/WeakForms/WeakForms.jl @@ -412,7 +412,7 @@ function jacobian(physicalmodel::ThermoElectroMech_PINNs, kine::NTuple{2,Kinemat jacobian(physicalmodel, ThermoElectro, kine,(u, φ, θ), dθ, vφ, dΩ, Λ) end -function transient_residual(physicalmodel::ThermoElectroMech_Bonet, ::Type{Thermo}, kine::NTuple{3,KinematicModel}, (u, φ, θ), vθ, dΩ, Λ=1.0) +function transient_residual(physicalmodel::ThermoElectroMechModel, ::Type{Thermo}, kine::NTuple{3,KinematicModel}, (u, φ, θ), vθ, dΩ, Λ=1.0) κ = physicalmodel.thermo.κ return ∫(κ * ∇(θ) ⋅ ∇(vθ))dΩ end diff --git a/test/TestConstitutiveModels/PhysicalModelTests.jl b/test/TestConstitutiveModels/PhysicalModelTests.jl index b31d2c6..720d8e4 100644 --- a/test/TestConstitutiveModels/PhysicalModelTests.jl +++ b/test/TestConstitutiveModels/PhysicalModelTests.jl @@ -5,7 +5,7 @@ using StaticArrays using Test using HyperFEM.PhysicalModels using HyperFEM.TensorAlgebra - +using HyperFEM.IO import Base: - @@ -470,12 +470,11 @@ end ∇φ = VectorValue(1.0, 2.0, 3.0) θt = 3.4 - 1.0 θr = 293.0 - Cv = 17.385 + Cv0 = 17.385 modelMR = MooneyRivlin3D(λ=0.0, μ1=0.5, μ2=0.5) modelID = IdealDielectric(ε=1.0) - modelT = ThermalModel(Cv=Cv, θr=θr, α=0.00156331, γv=2.0, γd=2.0) - - modelTEM = ThermoElectroMech_Bonet(modelT, modelID, modelMR) + modelT = ThermalModel3rdLaw(Cv0=Cv0, θr=θr, α=0.00156331, κ=1.0, γv=2.0, γd=2.0) + modelTEM = ThermoElectroMechModel(modelT, modelID, modelMR) Ψ, ∂Ψu, ∂ΨE, ∂Ψθ, ∂ΨFF, ∂ΨEE, ∂2Ψθθ, ∂ΨEF, ∂ΨFθ, ∂ΨEθ = modelTEM() K = Kinematics(Mechano, Solid) @@ -509,7 +508,8 @@ end F0 = I3 E0 = VectorValue(0.,0.,0.) cv(F,E,θ,x...) = -θ*∂2Ψ∂2θ(F,E,θ,x...) - @test isapprox(Cv, cv(F0, E0, θr); rtol=1e-14) + @test isapprox(Cv0, cv(F0, E0, θr); rtol=1e-14) + # @test isapprox(0, Ψ(F0, E0, 0); atol=1e-14) end From 6cf94adb16c9f059b802aaf34580dede29edb3d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Mas=C3=B3?= Date: Wed, 28 Jan 2026 11:17:47 +0100 Subject: [PATCH 2/6] renamed internal variable --- src/PhysicalModels/ThermalModels.jl | 8 ++++---- src/PhysicalModels/ThermoElectroMechanicalModels.jl | 4 ++-- src/PhysicalModels/ThermoMechanicalModels.jl | 6 +++--- test/TestConstitutiveModels/PhysicalModelTests.jl | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/PhysicalModels/ThermalModels.jl b/src/PhysicalModels/ThermalModels.jl index 32c7819..7537326 100644 --- a/src/PhysicalModels/ThermalModels.jl +++ b/src/PhysicalModels/ThermalModels.jl @@ -24,19 +24,19 @@ end struct ThermalModel3rdLaw <: Thermo - Cv0::Float64 + cv0::Float64 θr::Float64 α::Float64 κ::Float64 γv::Float64 γd::Float64 - function ThermalModel3rdLaw(; Cv0::Float64, θr::Float64, α::Float64, κ::Float64, γv::Float64, γd::Float64) - new(Cv0, θr, α, κ, γv, γd) + function ThermalModel3rdLaw(; cv0::Float64, θr::Float64, α::Float64, κ::Float64, γv::Float64, γd::Float64) + new(cv0, θr, α, κ, γv, γd) end end function (obj::ThermalModel3rdLaw)() - @unpack Cv0, θr, α, κ, γv, γd = obj + @unpack cv0, θr, α, κ, γv, γd = obj g(θ,θr,γ) = 1/(γ+1) * ((θ/θr)^(γ+1) -1) ∂g(θ,θr,γ) = θ^γ / θr^(γ+1) ∂∂g(θ,θr,γ) = γ*θ^(γ-1) / θr^(γ+1) diff --git a/src/PhysicalModels/ThermoElectroMechanicalModels.jl b/src/PhysicalModels/ThermoElectroMechanicalModels.jl index b95ef8c..22f7fc7 100644 --- a/src/PhysicalModels/ThermoElectroMechanicalModels.jl +++ b/src/PhysicalModels/ThermoElectroMechanicalModels.jl @@ -122,7 +122,7 @@ end function (obj::ThermoElectroMechModel{ThermalModel3rdLaw,<:Electro,<:Mechano})(Λ::Float64=0.0) - @unpack Cv0, θr, α, κ, γv, γd = obj.thermo + @unpack cv0, θr, α, κ, γv, γd = obj.thermo em = ElectroMechModel(obj.electro, obj.mechano) Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂Ψem∂EE = em() gv, ∂gv, ∂∂gv, gd, ∂gd, ∂∂gd = obj.thermo() @@ -145,7 +145,7 @@ function (obj::ThermoElectroMechModel{ThermalModel3rdLaw,<:Electro,<:Mechano})( end function Dissipation(obj::ThermoElectroMechModel{ThermalModel3rdLaw,<:Electro,<:Mechano}) - @unpack Cv0, θr, α, κ, γv, γd = obj.thermo + @unpack cv0, θr, α, κ, γv, γd = obj.thermo gv, ∂gv, ∂∂gv, gd, ∂gd, ∂∂gd = obj.thermo() Dvis = Dissipation(obj.mechano) D(F, E, θ, X...) = (1 + gd(θ)) * Dvis(F, X...) diff --git a/src/PhysicalModels/ThermoMechanicalModels.jl b/src/PhysicalModels/ThermoMechanicalModels.jl index c4e72d8..83e009f 100644 --- a/src/PhysicalModels/ThermoMechanicalModels.jl +++ b/src/PhysicalModels/ThermoMechanicalModels.jl @@ -36,7 +36,7 @@ end function (obj::ThermoMechModel{ThermalModel3rdLaw,<:Mechano})(Λ::Float64=0.0) - @unpack Cv0, θr, α, κ, γv, γd = obj.thermo + @unpack cv0, θr, α, κ, γv, γd = obj.thermo gv, ∂gv, ∂∂gv, gd, ∂gd, ∂∂gd = obj.thermo() Ψm, ∂Ψm∂F, ∂∂Ψm∂FF = obj.mechano() ηR, ∂ηR∂F, ∂∂ηR∂FF = _getCoupling(obj.thermo, obj.mechano) @@ -50,10 +50,10 @@ function (obj::ThermoMechModel{ThermalModel3rdLaw,<:Mechano})(Λ::Float64=0.0) end function _getCoupling(thermo::ThermalModel3rdLaw, ::Mechano) - @unpack Cv0, θr, α, κ, γv, γd = thermo + @unpack cv0, θr, α, κ, γv, γd = thermo J(F) = det(F) H(F) = cof(F) - ηR(F) = α*(J(F) - 1.0) + Cv0/γv + ηR(F) = α*(J(F) - 1.0) + cv0/γv ∂ηR∂J(F) = α ∂ηR∂F(F) = ∂ηR∂J(F)*H(F) ∂∂ηR∂FF(F) = ×ᵢ⁴(∂ηR∂J(F) * F) diff --git a/test/TestConstitutiveModels/PhysicalModelTests.jl b/test/TestConstitutiveModels/PhysicalModelTests.jl index 720d8e4..e254acb 100644 --- a/test/TestConstitutiveModels/PhysicalModelTests.jl +++ b/test/TestConstitutiveModels/PhysicalModelTests.jl @@ -470,10 +470,10 @@ end ∇φ = VectorValue(1.0, 2.0, 3.0) θt = 3.4 - 1.0 θr = 293.0 - Cv0 = 17.385 + cv0 = 17.385 modelMR = MooneyRivlin3D(λ=0.0, μ1=0.5, μ2=0.5) modelID = IdealDielectric(ε=1.0) - modelT = ThermalModel3rdLaw(Cv0=Cv0, θr=θr, α=0.00156331, κ=1.0, γv=2.0, γd=2.0) + modelT = ThermalModel3rdLaw(cv0=cv0, θr=θr, α=0.00156331, κ=1.0, γv=2.0, γd=2.0) modelTEM = ThermoElectroMechModel(modelT, modelID, modelMR) Ψ, ∂Ψu, ∂ΨE, ∂Ψθ, ∂ΨFF, ∂ΨEE, ∂2Ψθθ, ∂ΨEF, ∂ΨFθ, ∂ΨEθ = modelTEM() @@ -508,7 +508,7 @@ end F0 = I3 E0 = VectorValue(0.,0.,0.) cv(F,E,θ,x...) = -θ*∂2Ψ∂2θ(F,E,θ,x...) - @test isapprox(Cv0, cv(F0, E0, θr); rtol=1e-14) + @test isapprox(cv0, cv(F0, E0, θr); rtol=1e-14) # @test isapprox(0, Ψ(F0, E0, 0); atol=1e-14) end From 02e20bcf3a72dfe02ed6f9d2882f4352a92bf71d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Mas=C3=B3?= Date: Wed, 28 Jan 2026 15:56:40 +0100 Subject: [PATCH 3/6] missing constructor --- src/PhysicalModels/ThermoElectroMechanicalModels.jl | 2 +- src/PhysicalModels/ThermoMechanicalModels.jl | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/PhysicalModels/ThermoElectroMechanicalModels.jl b/src/PhysicalModels/ThermoElectroMechanicalModels.jl index 22f7fc7..84dcd2f 100644 --- a/src/PhysicalModels/ThermoElectroMechanicalModels.jl +++ b/src/PhysicalModels/ThermoElectroMechanicalModels.jl @@ -19,7 +19,7 @@ struct ThermoElectroMechModel{T<:Thermo,E<:Electro,M<:Mechano} <: ThermoElectroM mechano::M fθ::Function dfdθ::Function - + 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 diff --git a/src/PhysicalModels/ThermoMechanicalModels.jl b/src/PhysicalModels/ThermoMechanicalModels.jl index 83e009f..e364a4f 100644 --- a/src/PhysicalModels/ThermoMechanicalModels.jl +++ b/src/PhysicalModels/ThermoMechanicalModels.jl @@ -17,6 +17,10 @@ struct ThermoMechModel{T<:Thermo,M<:Mechano} <: ThermoMechano new{T,M}(thermo, mechano, fθ, dfdθ) end + function ThermoMechModel(thermo::ThermalModel3rdLaw, mechano::M) where {M<:Mechano} + new{ThermalModel3rdLaw,M}(thermo,mechano) + end + function (obj::ThermoMechModel)(Λ::Float64=1.0) Ψt, ∂Ψt_θ, ∂Ψt_θθ = obj.thermo(Λ) Ψm, ∂Ψm_u, ∂Ψm_uu = obj.mechano(Λ) From 88b7bfab522ec1e95fc78d945f6f0477598d4a9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Mas=C3=B3?= Date: Wed, 28 Jan 2026 16:56:30 +0100 Subject: [PATCH 4/6] enhancing error handling --- src/PhysicalModels/ViscousModels.jl | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/PhysicalModels/ViscousModels.jl b/src/PhysicalModels/ViscousModels.jl index 9f7fbd8..1e34ac0 100644 --- a/src/PhysicalModels/ViscousModels.jl +++ b/src/PhysicalModels/ViscousModels.jl @@ -165,9 +165,18 @@ function return_mapping_algorithm!(obj::ViscousIncompressible, res, ∂res = JacobianReturnMapping(γα, Ce, Se(Ce), Se_trial, ∂Se∂Ce(Ce), C, λα) maxiter = 20 tol = 1e-6 - for _ in 1:maxiter + for i in 1:maxiter #---------- Update -----------# - Δu = -∂res \ res[:] + local Δu + try + Δu = -∂res \ res[:] + catch e + if e isa LinearAlgebra.SingularException + error("Singular jacobian in return mapping algorithm (singular value at pos $(e.info), iteration $i)") + else + rethrow() + end + end Ce += TensorValue{3,3}(Tuple(Δu[1:end-1])) # TODO: Check reconstruction of TensorValue. ERROR: MethodError: no method matching (TensorValue{3, 3})(::Vector{Float64}) λα += Δu[end] #---- Residual and jacobian ---------# From f16fd2e4cb64197bde8853c889dded58fd299f21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Mas=C3=B3?= Date: Wed, 28 Jan 2026 17:37:41 +0100 Subject: [PATCH 5/6] missing functions --- src/PhysicalModels/ThermoMechanicalModels.jl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/PhysicalModels/ThermoMechanicalModels.jl b/src/PhysicalModels/ThermoMechanicalModels.jl index e364a4f..2e7ccbf 100644 --- a/src/PhysicalModels/ThermoMechanicalModels.jl +++ b/src/PhysicalModels/ThermoMechanicalModels.jl @@ -1,4 +1,21 @@ +# =================== +# Common functions +# =================== + +function initialize_state(obj::TM, points::Measure) where {TM<:ThermoMechano} + initialize_state(obj.mechano, points) +end + +function update_state!(obj::TM, state, F, θ, args...) where {TM<:ThermoMechano} + update_state!(obj.mechano, state, F, args...) +end + +function update_time_step!(obj::TM, Δt::Float64) where {TM<:ThermoMechano} + update_time_step!(obj.thermo, Δt) + update_time_step!(obj.mechano, Δt) +end + # =================== # MultiPhysicalModel models # =================== From b238d17904643f92be6eefd0dda453e4b979aac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20Mas=C3=B3?= Date: Wed, 28 Jan 2026 17:49:07 +0100 Subject: [PATCH 6/6] added dissipation --- src/PhysicalModels/ThermoMechanicalModels.jl | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/PhysicalModels/ThermoMechanicalModels.jl b/src/PhysicalModels/ThermoMechanicalModels.jl index 2e7ccbf..fddc52c 100644 --- a/src/PhysicalModels/ThermoMechanicalModels.jl +++ b/src/PhysicalModels/ThermoMechanicalModels.jl @@ -81,6 +81,15 @@ function _getCoupling(thermo::ThermalModel3rdLaw, ::Mechano) return (ηR, ∂ηR∂F, ∂∂ηR∂FF) end +function Dissipation(obj::ThermoMechModel{ThermalModel3rdLaw,<:Mechano}) + @unpack cv0, θr, α, κ, γv, γd = obj.thermo + gv, ∂gv, ∂∂gv, gd, ∂gd, ∂∂gd = obj.thermo() + Dvis = Dissipation(obj.mechano) + D(F, θ, X...) = (1 + gd(θ)) * Dvis(F, X...) + ∂D∂θ(F, θ, X...) = ∂gd(θ) * Dvis(F, X...) + return(D, ∂D∂θ) +end + struct ThermoMech_EntropicPolyconvex{T<:Thermo,M<:Mechano} <: ThermoMechano thermo::T