From 0ffde159bfe267370164f4088e84aa5db7b9c03c Mon Sep 17 00:00:00 2001 From: Elias Date: Sun, 14 Nov 2021 14:28:44 +0100 Subject: [PATCH 1/4] wip --- src/wrappers.jl | 85 ++++++++++++++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 33 deletions(-) diff --git a/src/wrappers.jl b/src/wrappers.jl index 82bfb6c..bf587a7 100644 --- a/src/wrappers.jl +++ b/src/wrappers.jl @@ -1,29 +1,44 @@ -abstract type AbstractDim{dim} end - -struct Dim{dim} <: AbstractDim{dim} end # generic -struct UniaxialStrain{dim} <: AbstractDim{dim} end # 1D uniaxial strain state -struct UniaxialStress{dim} <: AbstractDim{dim} end # 1D uniaxial stress state -struct PlaneStrain{dim} <: AbstractDim{dim} end # 2D plane strain state -struct PlaneStress{dim} <: AbstractDim{dim} end # 2D plane stress state -# constructors without dim parameter -UniaxialStrain() = UniaxialStrain{1}() -UniaxialStress() = UniaxialStress{1}() -PlaneStrain() = PlaneStrain{2}() -PlaneStress() = PlaneStress{2}() - -reduce_dim(A::Tensor{1,3}, ::AbstractDim{dim}) where dim = Tensor{1,dim}(i->A[i]) -reduce_dim(A::Tensor{2,3}, ::AbstractDim{dim}) where dim = Tensor{2,dim}((i,j)->A[i,j]) -reduce_dim(A::Tensor{4,3}, ::AbstractDim{dim}) where dim = Tensor{4,dim}((i,j,k,l)->A[i,j,k,l]) -reduce_dim(A::SymmetricTensor{2,3}, ::AbstractDim{dim}) where dim = SymmetricTensor{2,dim}((i,j)->A[i,j]) -reduce_dim(A::SymmetricTensor{4,3}, ::AbstractDim{dim}) where dim = SymmetricTensor{4,dim}((i,j,k,l)->A[i,j,k,l]) +abstract type AbstractDim end + +struct UniaxialStrain <: AbstractDim end # 1D uniaxial strain state +struct UniaxialStress <: AbstractDim end # 1D uniaxial stress state +struct PlaneStrain <: AbstractDim end # 2D plane strain state +struct PlaneStress <: AbstractDim end # 2D plane stress state +struct ThreeD <: AbstractDim end # 3D + +getdim(::UniaxialStrain) = 1 +getdim(::UniaxialStress) = 1 +getdim(::PlaneStrain) = 2 +getdim(::PlaneStress) = 2 + +reduce_dim(A::Tensor{1,3}, d::AbstractDim) = Tensor{1,getdim(d)}(i->A[i]) +reduce_dim(A::Tensor{2,3}, d::AbstractDim) = Tensor{2,getdim(d)}((i,j)->A[i,j]) +reduce_dim(A::Tensor{4,3}, d::AbstractDim) = Tensor{4,getdim(d)}((i,j,k,l)->A[i,j,k,l]) +reduce_dim(A::SymmetricTensor{2,3}, ::AbstractDim) = SymmetricTensor{2,dim}((i,j)->A[i,j]) +reduce_dim(A::SymmetricTensor{4,3}, ::AbstractDim) = SymmetricTensor{4,dim}((i,j,k,l)->A[i,j,k,l]) increase_dim(A::Tensor{1,dim,T}) where {dim, T} = Tensor{1,3}(i->(i <= dim ? A[i] : zero(T))) increase_dim(A::Tensor{2,dim,T}) where {dim, T} = Tensor{2,3}((i,j)->(i <= dim && j <= dim ? A[i,j] : zero(T))) increase_dim(A::SymmetricTensor{2,dim,T}) where {dim, T} = SymmetricTensor{2,3}((i,j)->(i <= dim && j <= dim ? A[i,j] : zero(T))) +# 3d materials pass through +function material_response( + ::ThreeD, + m::AbstractMaterial, + Δε::AbstractTensor{2,3,T}, + state::AbstractMaterialState, + Δt = nothing; + cache = nothing, + options = Dict{Symbol, Any}(), + ) where {T} + + return material_response(m, Δε, state, Δt; cache=cache, options=options) + +end + # restricted strain states function material_response( - dim::Union{Dim{d}, UniaxialStrain{d}, PlaneStrain{d}}, + dimstate::Union{UniaxialStrain, PlaneStrain}, m::AbstractMaterial, Δε::AbstractTensor{2,d,T}, state::AbstractMaterialState, @@ -32,15 +47,17 @@ function material_response( options = Dict{Symbol, Any}(), ) where {d,T} + @assert(getdim(dimstate) == d) + Δε_3D = increase_dim(Δε) σ, dσdε, material_state = material_response(m, Δε_3D, state, Δt; cache=cache, options=options) - return reduce_dim(σ, dim), reduce_dim(dσdε, dim), material_state + return reduce_dim(σ, dimstate), reduce_dim(dσdε, dimstate), material_state end # restricted stress states function material_response( - dim::Union{UniaxialStress{d}, PlaneStress{d}}, + dimstate::Union{UniaxialStress, PlaneStress}, m::AbstractMaterial, Δε::AbstractTensor{2,d,T}, state::AbstractMaterialState, @@ -49,14 +66,16 @@ function material_response( options = Dict{Symbol, Any}(), ) where {d, T} + @assert(getdim(dimstate) == d) + tol = get(options, :plane_stress_tol, 1e-8) max_iter = get(options, :plane_stress_max_iter, 10) converged = false Δε_3D = increase_dim(Δε) - zero_idxs = get_zero_indices(dim, Δε_3D) - nonzero_idxs = get_nonzero_indices(dim, Δε_3D) + zero_idxs = get_zero_indices(dimstate, Δε_3D) + nonzero_idxs = get_nonzero_indices(dimstate, Δε_3D) Δε_voigt = cache.x_f fill!(Δε_voigt, 0.0) @@ -69,7 +88,7 @@ function material_response( if norm(view(σ_mandel, zero_idxs)) < tol converged = true ∂σ∂ε_2D = fromvoigt(SymmetricTensor{4,d}, inv(inv(tovoigt(∂σ∂ε))[nonzero_idxs, nonzero_idxs])) - return reduce_dim(σ, dim), ∂σ∂ε_2D, temp_state + return reduce_dim(σ, dimstate), ∂σ∂ε_2D, temp_state end tomandel!(J, ∂σ∂ε) fill!(Δε_voigt, 0.0) @@ -81,15 +100,15 @@ function material_response( end # out of plane / axis components for restricted stress cases -get_zero_indices(::PlaneStress{2}, ::SymmetricTensor{2,3}) = [3, 4, 5] # for voigt/mandel format, do not use on tensor data! -get_nonzero_indices(::PlaneStress{2}, ::SymmetricTensor{2,3}) = [1, 2, 6] # for voigt/mandel format, do not use on tensor data! -get_zero_indices(::PlaneStress{2}, ::Tensor{2,3}) = [3, 4, 5, 7, 8] # for voigt/mandel format, do not use on tensor data! -get_nonzero_indices(::PlaneStress{2}, ::Tensor{2,3}) = [1, 2, 6, 9] # for voigt/mandel format, do not use on tensor data! - -get_zero_indices(::UniaxialStress{1}, ::SymmetricTensor{2,3}) = collect(2:6) # for voigt/mandel format, do not use on tensor data! -get_nonzero_indices(::UniaxialStress{1}, ::SymmetricTensor{2,3}) = [1] # for voigt/mandel format, do not use on tensor data! -get_zero_indices(::UniaxialStress{1}, ::Tensor{2,3}) = collect(2:9) # for voigt/mandel format, do not use on tensor data! -get_nonzero_indices(::UniaxialStress{1}, ::Tensor{2,3}) = [1] # for voigt/mandel format, do not use on tensor data! +get_zero_indices(::PlaneStress, ::SymmetricTensor{2,3}) = [3, 4, 5] # for voigt/mandel format, do not use on tensor data! +get_nonzero_indices(::PlaneStress, ::SymmetricTensor{2,3}) = [1, 2, 6] # for voigt/mandel format, do not use on tensor data! +get_zero_indices(::PlaneStress, ::Tensor{2,3}) = [3, 4, 5, 7, 8] # for voigt/mandel format, do not use on tensor data! +get_nonzero_indices(::PlaneStress, ::Tensor{2,3}) = [1, 2, 6, 9] # for voigt/mandel format, do not use on tensor data! + +get_zero_indices(::UniaxialStress, ::SymmetricTensor{2,3}) = collect(2:6) # for voigt/mandel format, do not use on tensor data! +get_nonzero_indices(::UniaxialStress, ::SymmetricTensor{2,3}) = [1] # for voigt/mandel format, do not use on tensor data! +get_zero_indices(::UniaxialStress, ::Tensor{2,3}) = collect(2:9) # for voigt/mandel format, do not use on tensor data! +get_nonzero_indices(::UniaxialStress, ::Tensor{2,3}) = [1] # for voigt/mandel format, do not use on tensor data! # fallback in case there is no cache defined struct PlaneStressCache{TF, TDF, TX} From 6c7278df8d3bdf41ca3e1047e6d6ef62a2650624 Mon Sep 17 00:00:00 2001 From: Elias Date: Thu, 20 Jan 2022 16:01:23 +0100 Subject: [PATCH 2/4] fix some bugs --- src/wrappers.jl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/wrappers.jl b/src/wrappers.jl index bf587a7..6513852 100644 --- a/src/wrappers.jl +++ b/src/wrappers.jl @@ -10,16 +10,17 @@ getdim(::UniaxialStrain) = 1 getdim(::UniaxialStress) = 1 getdim(::PlaneStrain) = 2 getdim(::PlaneStress) = 2 +getdim(::ThreeD) = 3 reduce_dim(A::Tensor{1,3}, d::AbstractDim) = Tensor{1,getdim(d)}(i->A[i]) reduce_dim(A::Tensor{2,3}, d::AbstractDim) = Tensor{2,getdim(d)}((i,j)->A[i,j]) reduce_dim(A::Tensor{4,3}, d::AbstractDim) = Tensor{4,getdim(d)}((i,j,k,l)->A[i,j,k,l]) -reduce_dim(A::SymmetricTensor{2,3}, ::AbstractDim) = SymmetricTensor{2,dim}((i,j)->A[i,j]) -reduce_dim(A::SymmetricTensor{4,3}, ::AbstractDim) = SymmetricTensor{4,dim}((i,j,k,l)->A[i,j,k,l]) +reduce_dim(A::SymmetricTensor{2,3}, d::AbstractDim) = SymmetricTensor{2,getdim(d)}((i,j)->A[i,j]) +reduce_dim(A::SymmetricTensor{4,3}, d::AbstractDim) = SymmetricTensor{4,getdim(d)}((i,j,k,l)->A[i,j,k,l]) -increase_dim(A::Tensor{1,dim,T}) where {dim, T} = Tensor{1,3}(i->(i <= dim ? A[i] : zero(T))) -increase_dim(A::Tensor{2,dim,T}) where {dim, T} = Tensor{2,3}((i,j)->(i <= dim && j <= dim ? A[i,j] : zero(T))) -increase_dim(A::SymmetricTensor{2,dim,T}) where {dim, T} = SymmetricTensor{2,3}((i,j)->(i <= dim && j <= dim ? A[i,j] : zero(T))) +increase_dim(A::Tensor{1,dim,T}) where {dim,T} = Tensor{1,3}(i->(i <= dim ? A[i] : zero(T))) +increase_dim(A::Tensor{2,dim,T}) where {dim,T} = Tensor{2,3}((i,j)->(i <= dim && j <= dim ? A[i,j] : zero(T))) +increase_dim(A::SymmetricTensor{2,dim,T}) where {dim,T} = SymmetricTensor{2,3}((i,j)->(i <= dim && j <= dim ? A[i,j] : zero(T))) # 3d materials pass through function material_response( From e4cf24400e809ed77ba3a56af489f108303b24e1 Mon Sep 17 00:00:00 2001 From: Elias Date: Fri, 8 Apr 2022 15:04:45 +0200 Subject: [PATCH 3/4] add getdim for abstractdim types --- src/MaterialModels.jl | 2 +- src/wrappers.jl | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/MaterialModels.jl b/src/MaterialModels.jl index 3dfff4c..4fd26b4 100644 --- a/src/MaterialModels.jl +++ b/src/MaterialModels.jl @@ -93,7 +93,7 @@ export material_response export AbstractMaterial, AbstractMaterialState export LinearElastic, Plastic, CrystalViscoPlastic export LinearElasticState, PlasticState, CrystalViscoPlasticState -export AbstractDim, OneD, UniaxialStrain, UniaxialStress, PlaneStrain, PlaneStress +export AbstractDim, UniaxialStrain, UniaxialStress, PlaneStrain, PlaneStress, ThreeD export ∂S∂C, ∂S∂E, ∂Pᵀ∂F export NeoHook, Yeoh, StVenant diff --git a/src/wrappers.jl b/src/wrappers.jl index e496a86..c6fa6d0 100644 --- a/src/wrappers.jl +++ b/src/wrappers.jl @@ -6,11 +6,13 @@ struct PlaneStrain <: AbstractDim end # 2D plane strain state struct PlaneStress <: AbstractDim end # 2D plane stress state struct ThreeD <: AbstractDim end # 3D -getdim(::UniaxialStrain) = 1 -getdim(::UniaxialStress) = 1 -getdim(::PlaneStrain) = 2 -getdim(::PlaneStress) = 2 -getdim(::ThreeD) = 3 +getdim(::Type{UniaxialStrain}) = 1 +getdim(::Type{UniaxialStress}) = 1 +getdim(::Type{PlaneStrain}) = 2 +getdim(::Type{PlaneStress}) = 2 +getdim(::Type{ThreeD}) = 3 + +getdim(d::T) where T<:AbstractDim = getdim(typeof(d)) reduce_dim(A::Tensor{1,3}, d::AbstractDim) = Tensor{1,getdim(d)}(i->A[i]) reduce_dim(A::Tensor{2,3}, d::AbstractDim) = Tensor{2,getdim(d)}((i,j)->A[i,j]) From 897fe87889373a229be64df7cd057ba303a7e515 Mon Sep 17 00:00:00 2001 From: Elias Date: Fri, 8 Apr 2022 15:12:33 +0200 Subject: [PATCH 4/4] fix some bugs --- src/wrappers.jl | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/wrappers.jl b/src/wrappers.jl index c6fa6d0..4cd7a58 100644 --- a/src/wrappers.jl +++ b/src/wrappers.jl @@ -43,14 +43,14 @@ end function material_response( dimstate::Union{UniaxialStrain, PlaneStrain}, m::AbstractMaterial, - Δε::AbstractTensor{2,d,T}, + Δε::AbstractTensor{2,dim,T}, state::AbstractMaterialState, Δt = nothing; cache = nothing, options = Dict{Symbol, Any}(), - ) where {d,T} + ) where {dim,T} - @assert(getdim(dimstate) == d) + @assert(getdim(dimstate) == dim) Δε_3D = increase_dim(Δε) σ, dσdε, material_state = material_response(m, Δε_3D, state, Δt; cache=cache, options=options) @@ -62,14 +62,14 @@ end function material_response( dimstate::Union{UniaxialStress, PlaneStress}, m::AbstractMaterial, - Δε::AbstractTensor{2,d,T}, + Δε::AbstractTensor{2,dim,T}, state::AbstractMaterialState, Δt = nothing; cache::Union{Any, Nothing} = nothing, #get_cache(m), #TODO: create AbstractCache type options = Dict{Symbol, Any}(), - ) where {d, T} + ) where {dim, T} - @assert(getdim(dimstate) == d) + @assert(getdim(dimstate) == dim) tol = get(options, :plane_stress_tol, 1e-8) max_iter = get(options, :plane_stress_max_iter, 10) @@ -81,14 +81,14 @@ function material_response( for _ in 1:max_iter σ, ∂σ∂ε, temp_state = material_response(m, Δε_3D, state, Δt; cache=cache, options=options) - σ_mandel = _tomandel_sarray(dim, σ) + σ_mandel = _tomandel_sarray(dimstate, σ) if norm(σ_mandel) < tol - ∂σ∂ε_2D = fromvoigt(SymmetricTensor{4,d}, inv(inv(tovoigt(∂σ∂ε))[nonzero_idxs, nonzero_idxs])) #TODO: Maybe solve this with static arrays aswell? + ∂σ∂ε_2D = fromvoigt(SymmetricTensor{4,dim}, inv(inv(tovoigt(∂σ∂ε))[nonzero_idxs, nonzero_idxs])) #TODO: Maybe solve this with static arrays aswell? return reduce_dim(σ, dimstate), ∂σ∂ε_2D, temp_state end - J = _tomandel_sarray(dim, ∂σ∂ε) + J = _tomandel_sarray(dimstate, ∂σ∂ε) Δε_temp = -inv(J)*σ_mandel - Δε_correction = _frommandel_sarray(dim, Δε_temp) + Δε_correction = _frommandel_sarray(dimstate, Δε_temp) Δε_3D = Δε_3D + Δε_correction end error("Not converged. Could not find plane stress state.") @@ -127,12 +127,12 @@ end # out of plane / axis components for restricted stress cases -get_zero_indices(::PlaneStress{2}, ::SymmetricTensor{2,3}) = [3, 4, 5] # for voigt/mandel format, do not use on tensor data! -get_nonzero_indices(::PlaneStress{2}, ::SymmetricTensor{2,3}) = [1, 2, 6] # for voigt/mandel format, do not use on tensor data! -get_zero_indices(::PlaneStress{2}, ::Tensor{2,3}) = [3, 4, 5, 7, 8] # for voigt/mandel format, do not use on tensor data! -get_nonzero_indices(::PlaneStress{2}, ::Tensor{2,3}) = [1, 2, 6, 9] # for voigt/mandel format, do not use on tensor data! - -get_zero_indices(::UniaxialStress{1}, ::SymmetricTensor{2,3}) = collect(2:6) # for voigt/mandel format, do not use on tensor data! -get_nonzero_indices(::UniaxialStress{1}, ::SymmetricTensor{2,3}) = [1] # for voigt/mandel format, do not use on tensor data! -get_zero_indices(::UniaxialStress{1}, ::Tensor{2,3}) = collect(2:9) # for voigt/mandel format, do not use on tensor data! -get_nonzero_indices(::UniaxialStress{1}, ::Tensor{2,3}) = [1] # for voigt/mandel format, do not use on tensor data! +get_zero_indices(::PlaneStress, ::SymmetricTensor{2,3}) = [3, 4, 5] # for voigt/mandel format, do not use on tensor data! +get_nonzero_indices(::PlaneStress, ::SymmetricTensor{2,3}) = [1, 2, 6] # for voigt/mandel format, do not use on tensor data! +get_zero_indices(::PlaneStress, ::Tensor{2,3}) = [3, 4, 5, 7, 8] # for voigt/mandel format, do not use on tensor data! +get_nonzero_indices(::PlaneStress, ::Tensor{2,3}) = [1, 2, 6, 9] # for voigt/mandel format, do not use on tensor data! + +get_zero_indices(::UniaxialStress, ::SymmetricTensor{2,3}) = collect(2:6) # for voigt/mandel format, do not use on tensor data! +get_nonzero_indices(::UniaxialStress, ::SymmetricTensor{2,3}) = [1] # for voigt/mandel format, do not use on tensor data! +get_zero_indices(::UniaxialStress, ::Tensor{2,3}) = collect(2:9) # for voigt/mandel format, do not use on tensor data! +get_nonzero_indices(::UniaxialStress, ::Tensor{2,3}) = [1] # for voigt/mandel format, do not use on tensor data!