diff --git a/src/Exports.jl b/src/Exports.jl index 824bbc4..220d57f 100644 --- a/src/Exports.jl +++ b/src/Exports.jl @@ -49,6 +49,7 @@ end @publish PhysicalModels TransverseIsotropy2D @publish PhysicalModels ThermalModel @publish PhysicalModels ThermalVolumetric +@publish PhysicalModels ThermalDeviatoric @publish PhysicalModels IdealDielectric @publish PhysicalModels Magnetic @publish PhysicalModels IdealMagnetic @@ -58,6 +59,7 @@ end @publish PhysicalModels ElectroMechModel @publish PhysicalModels ThermoElectroMechModel @publish PhysicalModels ThermoMechModel +@publish PhysicalModels ThermoElectroModel @publish PhysicalModels ThermoMech_Bonet @publish PhysicalModels ThermoMech_EntropicPolyconvex @publish PhysicalModels FlexoElectroModel @@ -97,7 +99,6 @@ end @publish PhysicalModels EntropicElasticityLaw @publish PhysicalModels NonlinearMeltingLaw @publish PhysicalModels NonlinearSofteningLaw -@publish PhysicalModels TrigonometricLaw @publish PhysicalModels PolynomialLaw @publish PhysicalModels SecondPiola diff --git a/src/PhysicalModels/ElectricalModels.jl b/src/PhysicalModels/ElectricalModels.jl index c4b5c20..a133604 100644 --- a/src/PhysicalModels/ElectricalModels.jl +++ b/src/PhysicalModels/ElectricalModels.jl @@ -9,3 +9,38 @@ struct IdealDielectric <: Electro new(ε) end end + +function (obj::Electro)() + J(F) = det(F) + H(F) = det(F) * inv(F)' + + # Energy # + HE(F, E) = H(F) * E + HEHE(F, E) = HE(F, E) ⋅ HE(F, E) + Ψem(F, E) = (-obj.ε / (2.0 * J(F))) * HEHE(F, E) + + # First Derivatives # + ∂Ψem_∂H(F, E) = (-obj.ε / (J(F))) * (HE(F, E) ⊗ E) + ∂Ψem_∂J(F, E) = (+obj.ε / (2.0 * J(F)^2.0)) * HEHE(F, E) + ∂Ψem_∂E(F, E) = (-obj.ε / (J(F))) * (H(F)' * HE(F, E)) + ∂Ψem∂F(F, E) = ∂Ψem_∂H(F, E) × F + ∂Ψem_∂J(F, E) * H(F) + ∂Ψem∂E(F, E) = ∂Ψem_∂E(F, E) + + # Second Derivatives # + ∂Ψem_HH(F, E) = (-obj.ε / (J(F))) * (I3 ⊗₁₃²⁴ (E ⊗ E)) + ∂Ψem_HJ(F, E) = (+obj.ε / (J(F))^2.0) * (HE(F, E) ⊗ E) + ∂Ψem_JJ(F, E) = (-obj.ε / (J(F))^3.0) * HEHE(F, E) + ∂Ψem∂FF(F, E) = (F × (∂Ψem_HH(F, E) × F)) + + H(F) ⊗₁₂³⁴ (∂Ψem_HJ(F, E) × F) + + (∂Ψem_HJ(F, E) × F) ⊗₁₂³⁴ H(F) + + ∂Ψem_JJ(F, E) * (H(F) ⊗₁₂³⁴ H(F)) + + ×ᵢ⁴(∂Ψem_∂H(F, E) + ∂Ψem_∂J(F, E) * F) + + ∂Ψem_EH(F, E) = (-obj.ε / (J(F))) * ((I3 ⊗₁₃² HE(F, E)) + (H(F)' ⊗₁₂³ E)) + ∂Ψem_EJ(F, E) = (+obj.ε / (J(F))^2.0) * (H(F)' * HE(F, E)) + ∂Ψem∂EF(F, E) = (∂Ψem_EH(F, E) × F) + (∂Ψem_EJ(F, E) ⊗₁²³ H(F)) + + ∂Ψem∂EE(F, E) = (-obj.ε / (J(F))) * (H(F)' * H(F)) + + return (Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂Ψem∂EE) +end diff --git a/src/PhysicalModels/ElectroMechanicalModels.jl b/src/PhysicalModels/ElectroMechanicalModels.jl index 930df47..4a76388 100644 --- a/src/PhysicalModels/ElectroMechanicalModels.jl +++ b/src/PhysicalModels/ElectroMechanicalModels.jl @@ -10,51 +10,62 @@ struct ElectroMechModel{E<:Electro,M<:Mechano} <: ElectroMechano{E,M} function ElectroMechModel(; electro::E, mechano::M) where {E<:Electro,M<:Mechano} new{E,M}(electro, mechano) end +end - function (obj::ElectroMechModel{<:Electro,<:IsoElastic})(Λ::Float64=1.0) - Ψm, ∂Ψm_u, ∂Ψm_uu = obj.mechano() - Ψ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) - ∂Ψuu(F, E) = ∂Ψm_uu(F) + ∂Ψem_uu(F, E) - ∂Ψφu(F, E) = ∂Ψem_φu(F, E) - ∂Ψφφ(F, E) = ∂Ψem_φφ(F, E) - return (Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ) - end - function (obj::ElectroMechModel{<:Electro,<:AnisoElastic})(Λ::Float64=1.0) - Ψm, ∂Ψm_u, ∂Ψm_uu = obj.mechano() - Ψem, ∂Ψem_u, ∂Ψem_φ, ∂Ψem_uu, ∂Ψem_φu, ∂Ψem_φφ = _getCoupling(obj.electro, obj.mechano) - Ψ(F, E, N) = Ψm(F, N) + Ψem(F, E) - ∂Ψu(F, E, N) = ∂Ψm_u(F, N) + ∂Ψem_u(F, E) - ∂Ψφ(F, E, N) = ∂Ψem_φ(F, E) - ∂Ψuu(F, E, N) = ∂Ψm_uu(F, N) + ∂Ψem_uu(F, E) - ∂Ψφu(F, E, N) = ∂Ψem_φu(F, E) - ∂Ψφφ(F, E, N) = ∂Ψem_φφ(F, E) - return (Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ) - end - function (obj::ElectroMechModel{<:Electro,<:ViscoElastic{<:IsoElastic}})(Λ::Float64=1.0) - Ψm, ∂Ψm_u, ∂Ψm_uu = obj.mechano() - Ψem, ∂Ψem_u, ∂Ψem_φ, ∂Ψem_uu, ∂Ψem_φu, ∂Ψem_φφ = _getCoupling(obj.electro, obj.mechano) - Ψ(F, E, Fn, A...) = Ψm(F, Fn, A...) + Ψem(F, E) - ∂Ψu(F, E, Fn, A...) = ∂Ψm_u(F, Fn, A...) + ∂Ψem_u(F, E) - ∂Ψφ(F, E, Fn, A...) = ∂Ψem_φ(F, E) - ∂Ψuu(F, E, Fn, A...) = ∂Ψm_uu(F, Fn, A...) + ∂Ψem_uu(F, E) - ∂Ψφu(F, E, Fn, A...) = ∂Ψem_φu(F, E) - ∂Ψφφ(F, E, Fn, A...) = ∂Ψem_φφ(F, E) - return (Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ) - end - function (obj::ElectroMechModel{<:Electro,<:ViscoElastic{<:AnisoElastic}})(Λ::Float64=1.0) - Ψm, ∂Ψm_u, ∂Ψm_uu = obj.mechano() - Ψem, ∂Ψem_u, ∂Ψem_φ, ∂Ψem_uu, ∂Ψem_φu, ∂Ψem_φφ = _getCoupling(obj.electro, obj.mechano) - Ψ(F, E, n, Fn, A...) = Ψm(F, n, Fn, A...) + Ψem(F, E) - ∂Ψu(F, E, n, Fn, A...) = ∂Ψm_u(F, n, Fn, A...) + ∂Ψem_u(F, E) - ∂Ψφ(F, E, n, Fn, A...) = ∂Ψem_φ(F, E) - ∂Ψuu(F, E, n, Fn, A...) = ∂Ψm_uu(F, n, Fn, A...) + ∂Ψem_uu(F, E) - ∂Ψφu(F, E, n, Fn, A...) = ∂Ψem_φu(F, E) - ∂Ψφφ(F, E, n, Fn, A...) = ∂Ψem_φφ(F, E) - return (Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ) - end +function (+)(Model1::Electro, Model2::Mechano) + ElectroMechModel(Model1, Model2) +end + +function (+)(Model1::Mechano, Model2::Electro) + ElectroMechModel(Model2, Model1) +end + +function (obj::ElectroMechModel{<:Electro,<:IsoElastic})(Λ::Float64=1.0) + Ψm, ∂Ψm∂F, ∂Ψm∂FF = obj.mechano() + Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂Ψem∂EE = obj.electro() + Ψ(F, E) = Ψm(F) + Ψem(F, E) + ∂Ψ∂F(F, E) = ∂Ψm∂F(F) + ∂Ψem∂F(F, E) + ∂Ψ∂E(F, E) = ∂Ψem∂E(F, E) + ∂Ψ∂FF(F, E) = ∂Ψm∂FF(F) + ∂Ψem∂FF(F, E) + ∂Ψ∂EF(F, E) = ∂Ψem∂EF(F, E) + ∂Ψ∂EE(F, E) = ∂Ψem∂EE(F, E) + return (Ψ, ∂Ψ∂F, ∂Ψ∂E, ∂Ψ∂FF, ∂Ψ∂EF, ∂Ψ∂EE) +end + +function (obj::ElectroMechModel{<:Electro,<:AnisoElastic})(Λ::Float64=1.0) + Ψm, ∂Ψm∂F, ∂Ψm∂FF = obj.mechano() + Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂Ψem∂EE = obj.electro() + Ψ(F, E, N) = Ψm(F, N) + Ψem(F, E) + ∂Ψ∂F(F, E, N) = ∂Ψm∂F(F, N) + ∂Ψem∂F(F, E) + ∂Ψ∂E(F, E, N) = ∂Ψem∂E(F, E) + ∂Ψ∂FF(F, E, N) = ∂Ψm∂FF(F, N) + ∂Ψem∂FF(F, E) + ∂Ψ∂EF(F, E, N) = ∂Ψem∂EF(F, E) + ∂Ψ∂EE(F, E, N) = ∂Ψem∂EE(F, E) + return (Ψ, ∂Ψ∂F, ∂Ψ∂E, ∂Ψ∂FF, ∂Ψ∂EF, ∂Ψ∂EE) +end + +function (obj::ElectroMechModel{<:Electro,<:ViscoElastic{<:IsoElastic}})(Λ::Float64=1.0) + Ψm, ∂Ψm∂F, ∂Ψm∂FF = obj.mechano() + Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂Ψem∂EE = obj.electro() + Ψ(F, E, Fn, A...) = Ψm(F, Fn, A...) + Ψem(F, E) + ∂Ψ∂F(F, E, Fn, A...) = ∂Ψm∂F(F, Fn, A...) + ∂Ψem∂F(F, E) + ∂Ψ∂E(F, E, Fn, A...) = ∂Ψem∂E(F, E) + ∂Ψ∂FF(F, E, Fn, A...) = ∂Ψm∂FF(F, Fn, A...) + ∂Ψem∂FF(F, E) + ∂Ψ∂EF(F, E, Fn, A...) = ∂Ψem∂EF(F, E) + ∂Ψ∂EE(F, E, Fn, A...) = ∂Ψem∂EE(F, E) + return (Ψ, ∂Ψ∂F, ∂Ψ∂E, ∂Ψ∂FF, ∂Ψ∂EF, ∂Ψ∂EE) +end + +function (obj::ElectroMechModel{<:Electro,<:ViscoElastic{<:AnisoElastic}})(Λ::Float64=1.0) + Ψm, ∂Ψm∂F, ∂Ψm∂FF = obj.mechano() + Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂Ψem∂EE = obj.electro() + Ψ(F, E, n, Fn, A...) = Ψm(F, n, Fn, A...) + Ψem(F, E) + ∂Ψ∂F(F, E, n, Fn, A...) = ∂Ψm∂F(F, n, Fn, A...) + ∂Ψem∂F(F, E) + ∂Ψ∂E(F, E, n, Fn, A...) = ∂Ψem∂E(F, E) + ∂Ψ∂FF(F, E, n, Fn, A...) = ∂Ψm∂FF(F, n, Fn, A...) + ∂Ψem∂FF(F, E) + ∂Ψ∂EF(F, E, n, Fn, A...) = ∂Ψem∂EF(F, E) + ∂Ψ∂EE(F, E, n, Fn, A...) = ∂Ψem∂EE(F, E) + return (Ψ, ∂Ψ∂F, ∂Ψ∂E, ∂Ψ∂FF, ∂Ψ∂EF, ∂Ψ∂EE) end function update_time_step!(obj::ElectroMechModel, Δt::Float64) @@ -75,48 +86,6 @@ function Dissipation(obj::ElectroMechModel) D(F, E, X...) = Dvis(F, X...) end - -function _getCoupling(elec::Electro, mec::Mechano, Λ::Float64=0.0) - J(F) = det(F) - H(F) = det(F) * inv(F)' - # Energy # - HE(F, E) = H(F) * E - HEHE(F, E) = HE(F, E) ⋅ HE(F, E) - Ψem(F, E) = (-elec.ε / (2.0 * J(F))) * HEHE(F, E) - # First Derivatives # - ∂Ψem_∂H(F, E) = (-elec.ε / (J(F))) * (HE(F, E) ⊗ E) - ∂Ψem_∂J(F, E) = (+elec.ε / (2.0 * J(F)^2.0)) * HEHE(F, E) - ∂Ψem_∂E(F, E) = (-elec.ε / (J(F))) * (H(F)' * HE(F, E)) - ∂Ψem_u(F, E) = ∂Ψem_∂H(F, E) × F + ∂Ψem_∂J(F, E) * H(F) - ∂Ψem_φ(F, E) = ∂Ψem_∂E(F, E) - - # Second Derivatives # - ∂Ψem_HH(F, E) = (-elec.ε / (J(F))) * (I3 ⊗₁₃²⁴ (E ⊗ E)) - ∂Ψem_HJ(F, E) = (+elec.ε / (J(F))^2.0) * (HE(F, E) ⊗ E) - ∂Ψem_JJ(F, E) = (-elec.ε / (J(F))^3.0) * HEHE(F, E) - ∂Ψem_uu(F, E) = (F × (∂Ψem_HH(F, E) × F)) + - H(F) ⊗₁₂³⁴ (∂Ψem_HJ(F, E) × F) + - (∂Ψem_HJ(F, E) × F) ⊗₁₂³⁴ H(F) + - ∂Ψem_JJ(F, E) * (H(F) ⊗₁₂³⁴ H(F)) + - ×ᵢ⁴(∂Ψem_∂H(F, E) + ∂Ψem_∂J(F, E) * F) - - ∂Ψem_EH(F, E) = (-elec.ε / (J(F))) * ((I3 ⊗₁₃² HE(F, E)) + (H(F)' ⊗₁₂³ E)) - ∂Ψem_EJ(F, E) = (+elec.ε / (J(F))^2.0) * (H(F)' * HE(F, E)) - ∂Ψem_φu(F, E) = (∂Ψem_EH(F, E) × F) + (∂Ψem_EJ(F, E) ⊗₁²³ H(F)) - - ∂Ψem_φφ(F, E) = (-elec.ε / (J(F))) * (H(F)' * H(F)) - - return (Ψem, ∂Ψem_u, ∂Ψem_φ, ∂Ψem_uu, ∂Ψem_φu, ∂Ψem_φφ) -end - - -function (+)(Model1::Electro, Model2::Mechano) - ElectroMechModel(Model1, Model2) -end -function (+)(Model1::Mechano, Model2::Electro) - ElectroMechModel(Model2, Model1) -end - struct FlexoElectroModel{EM<:ElectroMechano} <: FlexoElectro{EM} electromechano::EM κ::Float64 @@ -141,7 +110,7 @@ struct FlexoElectroModel{EM<:ElectroMechano} <: FlexoElectro{EM} f3(δϕ) = δϕ ⊗₁² e₃ Φ(ϕ₁, ϕ₂, ϕ₃) = (f1 ∘ (ϕ₁) + f2 ∘ (ϕ₂) + f3 ∘ (ϕ₃)) - Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ = obj.electromechano(Λ) - return Ψ, ∂Ψu, ∂Ψφ, ∂Ψuu, ∂Ψφu, ∂Ψφφ, Φ + Ψ, ∂Ψ∂F, ∂Ψ∂E, ∂Ψ∂FF, ∂Ψ∂EF, ∂Ψ∂EE = obj.electromechano(Λ) + return Ψ, ∂Ψ∂F, ∂Ψ∂E, ∂Ψ∂FF, ∂Ψ∂EF, ∂Ψ∂EE, Φ end end diff --git a/src/PhysicalModels/PhysicalModels.jl b/src/PhysicalModels/PhysicalModels.jl index b45ae7e..b284eeb 100644 --- a/src/PhysicalModels/PhysicalModels.jl +++ b/src/PhysicalModels/PhysicalModels.jl @@ -47,9 +47,11 @@ export HardMagnetic export HardMagnetic2D export ThermalModel export ThermalVolumetric +export ThermalDeviatoric export ElectroMechModel export ThermoElectroMechModel export ThermoMechModel +export ThermoElectroModel export ThermoMech_Bonet export ThermoMech_EntropicPolyconvex export FlexoElectroModel @@ -119,7 +121,7 @@ abstract type MultiPhysicalModel <: PhysicalModel end abstract type ElectroMechano{E,M} <: MultiPhysicalModel end abstract type ThermoElectroMechano{T,E,M} <: MultiPhysicalModel end abstract type ThermoMechano{T,M} <: MultiPhysicalModel end -abstract type ThermoElectro{E,M} <: MultiPhysicalModel end +abstract type ThermoElectro{E} <: MultiPhysicalModel end abstract type FlexoElectro{EM} <: MultiPhysicalModel end abstract type MagnetoMechano{G,M} <: MultiPhysicalModel end @@ -137,6 +139,8 @@ include("ThermalModels.jl") include("ThermoMechanicalModels.jl") +include("ThermoElectroModels.jl") + include("ElectroMechanicalModels.jl") include("MagnetoMechanicalModels.jl") diff --git a/src/PhysicalModels/ThermalModels.jl b/src/PhysicalModels/ThermalModels.jl index 0a005ac..7627ba8 100644 --- a/src/PhysicalModels/ThermalModels.jl +++ b/src/PhysicalModels/ThermalModels.jl @@ -56,35 +56,19 @@ end struct NonlinearSofteningLaw <: ThermalLaw θr::Float64 - θt::Float64 + θT::Float64 γ::Float64 δ::Float64 - NonlinearSofteningLaw(; θr, θt, γ, δ=0) = new(θr, θt, γ, δ) + NonlinearSofteningLaw(; θr, θT, γ, δ=0) = new(θr, θT, γ, δ) end function (law::NonlinearSofteningLaw)() - @unpack θr, θt, γ, δ = law - u(θ) = exp(-(θ/θt)^(γ+1)) + @unpack θr, θT, γ, δ = law + u(θ) = exp(-(θ/θT)^(γ+1)) C = (1-δ) * u(θr) + δ f(θ) = ((1-δ) * u(θ) + δ) / C - ∂f(θ) = -(1-δ)/C * (γ+1)/θt * (θ/θt)^γ * u(θ) - ∂∂f(θ) = (1-δ)/C * (γ+1)/θ^2 * (θ/θt)^(γ+1) * ((γ+1)*(θ/θt)^(γ+1)-γ) * u(θ) - return (f, ∂f, ∂∂f) -end - -struct TrigonometricLaw <: ThermalLaw - θr::Float64 - θM::Float64 -end - -function (law::TrigonometricLaw)() - @unpack θr, θM = law - g(θ) = θ/θr * sin(2π*θ/θM) - G(θ) = 1/2/π * θM/θr * (1 - cos(2π*θ/θM)) - H(θ) = 1/2/π * θM/θr * (θ - θM/2/π * sin(2π*θ/θM)) - f(θ) = (H(θr) - H(θ)) / (H(θM) - H(θr)) + 1.0 - ∂f(θ) = -G(θ) / (H(θM) - H(θr)) - ∂∂f(θ) = -g(θ) / θ / (H(θM) - H(θr)) + ∂f(θ) = -(1-δ)/C * (γ+1)/θT * (θ/θT)^γ * u(θ) + ∂∂f(θ) = (1-δ)/C * (γ+1)/θ^2 * (θ/θT)^(γ+1) * ((γ+1)*(θ/θT)^(γ+1)-γ) * u(θ) return (f, ∂f, ∂∂f) end @@ -93,6 +77,7 @@ struct PolynomialLaw <: ThermalLaw a::Float64 b::Float64 c::Float64 + PolynomialLaw(; θr, a, b, c) = new(θr, a, b, c) end function (law::PolynomialLaw)() diff --git a/src/PhysicalModels/ThermoElectroMechanicalModels.jl b/src/PhysicalModels/ThermoElectroMechanicalModels.jl index 1fff381..613cd3a 100644 --- a/src/PhysicalModels/ThermoElectroMechanicalModels.jl +++ b/src/PhysicalModels/ThermoElectroMechanicalModels.jl @@ -31,7 +31,7 @@ struct ThermoElectroMechModel{T<:Thermo,E<:Electro,M<:Mechano} <: ThermoElectroM 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.electro, obj.mechano, Λ) + Ψem, ∂Ψem_u, ∂Ψem_φ, ∂Ψem_uu, ∂Ψem_φu, ∂Ψem_φφ = obj.electro() Ψtm, ∂Ψtm_u, ∂Ψtm_θ, ∂Ψtm_uu, ∂Ψtm_uθ, ∂Ψtm_θθ = _getCoupling(obj.thermo, obj.mechano, Λ) f(δθ) = (obj.fθ(δθ)::Float64) df(δθ) = (obj.dfdθ(δθ)::Float64) @@ -73,7 +73,7 @@ struct ThermoElectroMech_Govindjee{T<:Thermo,E<:Electro,M<:Mechano} <: ThermoEle function (obj::ThermoElectroMech_Govindjee)(Λ::Float64=1.0) Ψm, _, _ = obj.mechano(Λ) - Ψem, _, _, _, _, _ = _getCoupling(obj.electro, obj.mechano, Λ) + Ψem, _, _, _, _, _ = obj.electro() f(δθ) = obj.fθ(δθ) df(δθ) = obj.dfdθ(δθ) g(δθ) = obj.gθ(δθ) @@ -134,10 +134,14 @@ function ThermoElectroMech_Bonet(thermo::ThermalVolumetric, electro::E, mechano: ThermoElectroMech_Bonet{E,M}(thermo,electro,mechano,el,vis,elec) end +function ThermoElectroMech_Bonet(thermo::ThermalVolumetric, electro::ThermoElectro{E}, mechano::M; el::ThermalLaw, vis::ThermalLaw) where {E<:Electro,M<:ViscoElastic} + ThermoElectroMech_Bonet{E,M}(thermo,electro.electro,mechano,el,vis,electro.law) +end + function (obj::ThermoElectroMech_Bonet{<:Electro,<:Elasto})() Ψt, ∂Ψt∂F, ∂Ψt∂θ, ∂∂Ψt∂FF, ∂∂Ψt∂θθ, ∂∂Ψt∂Fθ = obj.thermo() Ψm, ∂Ψm∂F, ∂∂Ψm∂FF = obj.mechano() - Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂∂Ψem∂EE = _getCoupling(obj.electro, obj.mechano) + Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂∂Ψem∂EE = obj.electro() fe, dfe, ddfe = obj.lawel() felec, dfelec, ddfelec = obj.lawelec() @@ -159,7 +163,7 @@ function (obj::ThermoElectroMech_Bonet{<:Electro,<:ViscoElastic})() Ψt, ∂Ψt∂F, ∂Ψt∂θ, ∂∂Ψt∂FF, ∂∂Ψt∂θθ, ∂∂Ψt∂Fθ = obj.thermo() Ψe, ∂Ψe∂F, ∂∂Ψe∂FF = obj.mechano.longterm() Ψv, ∂Ψv∂F, ∂∂Ψv∂FF = obj.mechano.branches() - Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂∂Ψem∂EE = _getCoupling(obj.electro, obj.mechano) + Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂Ψem∂FF, ∂Ψem∂EF, ∂∂Ψem∂EE = obj.electro() fe, dfe, ddfe = obj.lawel() fv, dfv, ddfv = obj.lawvis() felec, dfelec, ddfelec = obj.lawelec() diff --git a/src/PhysicalModels/ThermoElectroModels.jl b/src/PhysicalModels/ThermoElectroModels.jl new file mode 100644 index 0000000..522be7b --- /dev/null +++ b/src/PhysicalModels/ThermoElectroModels.jl @@ -0,0 +1,27 @@ + +struct ThermoElectroModel{E<:Electro} <: ThermoElectro{E} + electro::E + law::ThermalLaw + + function ThermoElectroModel(electro::E, law::ThermalLaw) where {E <: Electro} + new{E}(electro, law) + end +end + +function (obj::ThermoElectroModel)() + Ψem, ∂Ψem∂F, ∂Ψem∂E, ∂∂Ψem∂FF, ∂∂Ψem∂EF, ∂∂Ψem∂EE = obj.electro() + f, df, ddf = obj.law() + + Ψ(F, E, θ) = f(θ)*Ψem(F,E) + ∂Ψ∂F(F, E, θ) = f(θ)*∂Ψem∂F(F,E) + ∂Ψ∂E(F, E, θ) = f(θ)*∂Ψem∂E(F,E) + ∂Ψ∂θ(F, E, θ) = df(θ)*Ψem(F,E) + ∂∂Ψ∂FF(F, E, θ) = f(θ)*∂∂Ψem∂FF(F,E) + ∂∂Ψ∂EE(F, E, θ) = f(θ)*∂∂Ψem∂EE(F,E) + ∂∂Ψ∂θθ(F, E, θ) = ddf(θ)*Ψem(F,E) + ∂∂Ψ∂EF(F, E, θ) = f(θ)*∂∂Ψem∂EF(F,E) + ∂∂Ψ∂Fθ(F, E, θ) = df(θ)*∂Ψem∂F(F,E) + ∂∂Ψ∂Eθ(F, E, θ) = df(θ)*∂Ψem∂E(F,E) + + return (Ψ, ∂Ψ∂F, ∂Ψ∂E, ∂Ψ∂θ, ∂∂Ψ∂FF, ∂∂Ψ∂EE, ∂∂Ψ∂θθ, ∂∂Ψ∂EF, ∂∂Ψ∂Fθ, ∂∂Ψ∂Eθ) +end diff --git a/src/PhysicalModels/ThermoMechanicalModels.jl b/src/PhysicalModels/ThermoMechanicalModels.jl index 5ad7af1..f626401 100644 --- a/src/PhysicalModels/ThermoMechanicalModels.jl +++ b/src/PhysicalModels/ThermoMechanicalModels.jl @@ -64,6 +64,28 @@ function (obj::ThermalVolumetric)() end +struct ThermalDeviatoric{M<:Mechano} <: ThermoMechano{Nothing,M} + mechano::M + law::ThermalLaw + + function ThermalDeviatoric(mechano::M, law::ThermalLaw) where {M<:Mechano} + new{M}(mechano, law) + end +end + +function (obj::ThermalDeviatoric{<:IsoElastic})() + Ψm, ∂Ψm∂F, ∂∂Ψm∂FF = obj.mechano() + f, df, ddf = obj.law() + Ψ(F,θ) = Ψm(F) * f(θ) + ∂Ψ∂F(F,θ) = ∂Ψm∂F(F) * f(θ) + ∂∂Ψ∂FF(F,θ) = ∂∂Ψm∂FF(F) * f(θ) + ∂Ψ∂θ(F,θ) = Ψm(F) * df(θ) + ∂∂Ψ∂θθ(F,θ) = Ψm(F) * ddf(θ) + ∂∂Ψ∂Fθ(F,θ) = ∂Ψm∂F(F) * df(θ) + return (Ψ, ∂Ψ∂F, ∂Ψ∂θ, ∂∂Ψ∂FF, ∂∂Ψ∂θθ, ∂∂Ψ∂Fθ) +end + + struct ThermoMechModel{T<:Thermo,M<:Mechano} <: ThermoMechano{T,M} thermo::T mechano::M diff --git a/test/TestConstitutiveModels/ThermalLawsTests.jl b/test/TestConstitutiveModels/ThermalLawsTests.jl index 5fc74c9..31a0172 100644 --- a/test/TestConstitutiveModels/ThermalLawsTests.jl +++ b/test/TestConstitutiveModels/ThermalLawsTests.jl @@ -21,7 +21,7 @@ end end @testset "NonlinearSofteningLaw" begin - law = NonlinearSofteningLaw(θr=273.15, θt=300.0, γ=2.0, δ=0.5) + law = NonlinearSofteningLaw(θr=273.15, θT=300.0, γ=2.0, δ=0.5) f, df, ddf = law() for θ ∈ 200.0:50:400 @test isapprox(df(θ), ForwardDiff.derivative(f, θ), rtol=1e-10) @@ -29,8 +29,8 @@ end end end -@testset "TrigonometricLaw" begin - law = TrigonometricLaw(273.15, 400.0) +@testset "PolynomialLaw" begin + law = PolynomialLaw(θr=273.15, a=1.1, b=2.2, c=3.3) f, df, ddf = law() for θ ∈ 200.0:50:400 @test isapprox(df(θ), ForwardDiff.derivative(f, θ), rtol=1e-10)