Skip to content

Additional functions for postprocessing / dissipation #46

Description

@kimauth

Perhaps it would be nice to have some additional functionality for each material that allows recovering information e.g. for postprocessing. Here is an example for the material that's currently called Plastic:

function state_conjugates(
    ε::SymmetricTensor{2,3,T,6}, 
    material::Plastic,
    state::PlasticState{3},
)
    (; Eᵉ, r, H) = material

    σ = Eᵉ ⊡ (ε - state.εᵖ)
    k = - state.κ / (r * H)
    a = - 3/2 / ((1-r)*H) * state.α

    return σ, k, a
end

function strain_rates(
    material::Plastic,
    σ::SymmetricTensor{2,3},
    κ::Real,
    α::SymmetricTensor{2,3},
    λ::Real,
)
    (; κ_∞, α_∞) = material

    σʳᵉᵈ = σ - α
    σʳᵉᵈ_dev = dev(σʳᵉᵈ)
    σₑʳᵉᵈ = sqrt(3/2) * norm(σʳᵉᵈ_dev)
    α_dev = dev(α)

    # flow + hardening rules
    ν = 3/2 * σʳᵉᵈ_dev / σₑʳᵉᵈ
    ζ_κ = -1. + κ / κ_∞
    ζ_α = -ν + 3. / (2α_∞) * α_dev

    # evolution equations
    dεᵖdt = λ * ν
    dkdt = λ * ζ_κ
    dadt = λ * ζ_α

    return dεᵖdt, dkdt, dadt
end

function dissipation(
    ::Plastic, # could perhaps be more general
    σ::SymmetricTensor{2,3},
    κ::Real,
    α::SymmetricTensor{2,3},
    dεᵖdt::SymmetricTensor{2,3},
    dkdt::Real,
    dadt::SymmetricTensor{2,3},
)
    # dissipation
    𝔇 = σ ⊡ dεᵖdt + κ * dkdt + α ⊡ dadt

    return 𝔇
end

This design tries to avoid recomputations of variables where possible, thus the function signatures. For convenience, these functions can of course be glued together and then have simpler signatures:

## convenience wrappers if intermediate results are not needed
function strain_rates(
    ε::SymmetricTensor{2,3}, 
    material::Plastic,
    state::PlasticState{3},
    Δt::Float64,
)
    σ, _, _ = state_conjugates(ε, material, state)
    (; κ, α, μ) = state

    λ = μ / Δt
    return strain_rates(material, σ, κ, α, λ)
end

function dissipation(
    ε::SymmetricTensor{2,3}, 
    material::Plastic,
    state::PlasticState{3},
    Δt::Float64,
)
    σ, _, _ = state_conjugates(ε, material, state)
    (; κ, α, μ) = state

    λ = μ / Δt
    dεᵖdt, dkdt, dadt = strain_rates(material, σ, κ, α, λ)

    return dissipation(material, σ, κ, α, dεᵖdt, dkdt, dadt)
end

Happy to hear some feedback!

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions