Skip to content

Commit

Permalink
Merge 3f7e915 into da04332
Browse files Browse the repository at this point in the history
  • Loading branch information
Technologicat committed Aug 10, 2020
2 parents da04332 + 3f7e915 commit 8aa5dfa
Show file tree
Hide file tree
Showing 32 changed files with 1,500 additions and 1,277 deletions.
64 changes: 32 additions & 32 deletions examples/abstractmaterial_full_workflow.jl
Expand Up @@ -14,7 +14,7 @@ end

@with_kw mutable struct ChabocheDriverState <: AbstractMaterialState
time :: Float64 = zero(Float64)
strain :: SymmetricTensor{2,3} = zero(SymmetricTensor{2,3,Float64})
strain :: Symm2 = zero(Symm2{Float64})
end

@with_kw struct ChabocheParameterState <: AbstractMaterialState
Expand All @@ -32,13 +32,13 @@ end
end

@with_kw struct ChabocheVariableState <: AbstractMaterialState
stress :: SymmetricTensor{2,3} = zero(SymmetricTensor{2,3,Float64})
X1 :: SymmetricTensor{2,3} = zero(SymmetricTensor{2,3,Float64})
X2 :: SymmetricTensor{2,3} = zero(SymmetricTensor{2,3,Float64})
plastic_strain :: SymmetricTensor{2,3} = zero(SymmetricTensor{2,3,Float64})
stress :: Symm2 = zero(Symm2{Float64})
X1 :: Symm2 = zero(Symm2{Float64})
X2 :: Symm2 = zero(Symm2{Float64})
plastic_strain :: Symm2 = zero(Symm2{Float64})
cumeq :: Float64 = zero(Float64)
R :: Float64 = zero(Float64)
jacobian :: SymmetricTensor{4,3} = zero(SymmetricTensor{4,3,Float64})
jacobian :: Symm4 = zero(Symm4{Float64})
end

@with_kw mutable struct Chaboche <: AbstractMaterial
Expand All @@ -50,20 +50,20 @@ end
dparameters :: ChabocheParameterState = ChabocheParameterState()
end

@with_kw mutable struct IdealPlasticDriverState <: AbstractMaterialState
@with_kw mutable struct PerfectPlasticDriverState <: AbstractMaterialState
time :: Float64 = zero(Float64)
strain :: SymmetricTensor{2,3} = zero(SymmetricTensor{2,3,Float64})
strain :: Symm2 = zero(Symm2{Float64})
end

@with_kw struct IdealPlasticParameterState <: AbstractMaterialState
@with_kw struct PerfectPlasticParameterState <: AbstractMaterialState
youngs_modulus :: Float64 = zero(Float64)
poissons_ratio :: Float64 = zero(Float64)
yield_stress :: Float64 = zero(Float64)
end

@with_kw struct IdealPlasticVariableState <: AbstractMaterialState
stress :: SymmetricTensor{2,3} = zero(SymmetricTensor{2,3,Float64})
plastic_strain :: SymmetricTensor{2,3} = zero(SymmetricTensor{2,3,Float64})
@with_kw struct PerfectPlasticVariableState <: AbstractMaterialState
stress :: Symm2 = zero(Symm2{Float64})
plastic_strain :: Symm2 = zero(Symm2{Float64})
cumeq :: Float64 = zero(Float64)
end

Expand Down Expand Up @@ -92,23 +92,23 @@ end
# dparameters :: ParameterState{M} = ParameterState{M}()
# end

@with_kw mutable struct IdealPlastic <: AbstractMaterial
drivers :: IdealPlasticDriverState = IdealPlasticDriverState()
ddrivers :: IdealPlasticDriverState = IdealPlasticDriverState()
variables :: IdealPlasticVariableState = IdealPlasticVariableState()
variables_new :: IdealPlasticVariableState = IdealPlasticVariableState()
parameters :: IdealPlasticParameterState = IdealPlasticParameterState()
dparameters :: IdealPlasticParameterState = IdealPlasticParameterState()
@with_kw mutable struct PerfectPlastic <: AbstractMaterial
drivers :: PerfectPlasticDriverState = PerfectPlasticDriverState()
ddrivers :: PerfectPlasticDriverState = PerfectPlasticDriverState()
variables :: PerfectPlasticVariableState = PerfectPlasticVariableState()
variables_new :: PerfectPlasticVariableState = PerfectPlasticVariableState()
parameters :: PerfectPlasticParameterState = PerfectPlasticParameterState()
dparameters :: PerfectPlasticParameterState = PerfectPlasticParameterState()
end


mat = Chaboche()
mat2 = IdealPlastic()
mat2 = PerfectPlastic()

function isotropic_elasticity_tensor(lambda, mu)
delta(i,j) = i==j ? 1.0 : 0.0
g(i,j,k,l) = lambda*delta(i,j)*delta(k,l) + mu*(delta(i,k)*delta(j,l)+delta(i,l)*delta(j,k))
jacobian = SymmetricTensor{4, 3, Float64}(g)
jacobian = Symm4{Float64}(g)
return jacobian
end

Expand Down Expand Up @@ -140,10 +140,10 @@ function integrate_material!(material::Chaboche)
x = res.zero
res.f_converged || error("Nonlinear system of equations did not converge!")

stress = fromvoigt(SymmetricTensor{2,3,Float64}, @view x[1:6])
stress = fromvoigt(Symm2{Float64}, @view x[1:6])
R = x[7]
X1 = fromvoigt(SymmetricTensor{2,3,Float64}, @view x[8:13])
X2 = fromvoigt(SymmetricTensor{2,3,Float64}, @view x[14:19])
X1 = fromvoigt(Symm2{Float64}, @view x[8:13])
X2 = fromvoigt(Symm2{Float64}, @view x[14:19])
seff = stress - X1 - X2
seff_dev = dev(seff)
f = sqrt(1.5)*norm(seff_dev) - (R0 + R)
Expand All @@ -162,7 +162,7 @@ function integrate_material!(material::Chaboche)
drdx = ForwardDiff.jacobian(residuals, x)
drde = zeros((length(x),6))
drde[1:6, 1:6] = -tovoigt(jacobian)
jacobian = fromvoigt(SymmetricTensor{4,3}, (drdx\drde)[1:6, 1:6])
jacobian = fromvoigt(Symm4, (drdx\drde)[1:6, 1:6])
end
variables_new = ChabocheVariableState(stress = stress,
X1 = X1,
Expand Down Expand Up @@ -190,10 +190,10 @@ function create_nonlinear_system_of_equations(material::Chaboche)

function g!(F, x::Vector{T}) where {T} # System of non-linear equations
jacobian = isotropic_elasticity_tensor(lambda, mu)
stress_ = fromvoigt(SymmetricTensor{2,3,T}, @view x[1:6])
stress_ = fromvoigt(Symm2{T}, @view x[1:6])
R_ = x[7]
X1_ = fromvoigt(SymmetricTensor{2,3,T}, @view x[8:13])
X2_ = fromvoigt(SymmetricTensor{2,3,T}, @view x[14:19])
X1_ = fromvoigt(Symm2{T}, @view x[8:13])
X2_ = fromvoigt(Symm2{T}, @view x[14:19])

seff = stress_ - X1_ - X2_
seff_dev = dev(seff)
Expand Down Expand Up @@ -232,7 +232,7 @@ function simple_integration_test()
Q = 50.0,
b = 0.1)

dstrain_dtime = fromvoigt(SymmetricTensor{2,3,Float64}, 1e-3*[1.0, -0.3, -0.3, 0.0, 0.0, 0.0]; offdiagscale=2.0)
dstrain_dtime = fromvoigt(Symm2{Float64}, 1e-3*[1.0, -0.3, -0.3, 0.0, 0.0, 0.0]; offdiagscale=2.0)
ddrivers = ChabocheDriverState(time = 0.25, strain = 0.25*dstrain_dtime)
chabmat = Chaboche(parameters = parameters, ddrivers = ddrivers)
@info "time = $(chabmat.drivers.time), stress = $(chabmat.variables.stress)"
Expand Down Expand Up @@ -286,7 +286,7 @@ function test_chaboche()
s33s = [chabmat.variables.stress[3,3]]
for i=2:length(ts)
dtime = ts[i]-ts[i-1]
dstrain = fromvoigt(SymmetricTensor{2,3,Float64}, strains[i]-strains[i-1]; offdiagscale=2.0)
dstrain = fromvoigt(Symm2{Float64}, strains[i]-strains[i-1]; offdiagscale=2.0)
chabmat.ddrivers = ChabocheDriverState(time = dtime, strain = dstrain)
integrate_material!(chabmat)
update!(chabmat)
Expand Down Expand Up @@ -314,7 +314,7 @@ function simple_integration_test_fd_tangent()
Q = 50.0,
b = 0.1)

dstrain_dtime = fromvoigt(SymmetricTensor{2,3,Float64}, 1e-3*[1.0, -0.3, -0.3, 0.0, 0.0, 0.0]; offdiagscale=2.0)
dstrain_dtime = fromvoigt(Symm2{Float64}, 1e-3*[1.0, -0.3, -0.3, 0.0, 0.0, 0.0]; offdiagscale=2.0)
ddrivers = ChabocheDriverState(time = 0.25, strain = 0.25*dstrain_dtime)
chabmat = Chaboche(parameters = parameters, ddrivers = ddrivers)

Expand Down Expand Up @@ -394,7 +394,7 @@ function simple_integration_test_fd_tangent2()
Q = 50.0,
b = 0.1)

dstrain_dtime = fromvoigt(SymmetricTensor{2,3,Float64}, 1e-3*[1.0, -0.3, -0.3, 0.0, 0.0, 0.0]; offdiagscale=2.0)
dstrain_dtime = fromvoigt(Symm2{Float64}, 1e-3*[1.0, -0.3, -0.3, 0.0, 0.0, 0.0]; offdiagscale=2.0)
ddrivers = ChabocheDriverState(time = 0.25, strain = 0.25*dstrain_dtime)
chabmat = Chaboche(parameters = parameters, ddrivers = ddrivers)
integrate_material!(chabmat)
Expand Down
24 changes: 12 additions & 12 deletions examples/abstractmaterial_testing.jl
Expand Up @@ -67,9 +67,9 @@ function bench_tensor()
end
function bench_symtensor()
# Random walk test
var = Variable(SymmetricTensor{2, 3}([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]))
var = Variable(Symm2([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]))
for i in 1:N
var.dvalue += randn(SymmetricTensor{2,3,Float64})
var.dvalue += randn(Symm2{Float64})
update!(var)
end
end
Expand Down Expand Up @@ -106,21 +106,21 @@ function update!(state::T) where {T<:AbstractVariableState}
end

function bench_chaboche_style_variablestate()
stress = Variable(zero(SymmetricTensor{2,3}))
strain = Variable(zero(SymmetricTensor{2,3}))
backstress1 = Variable(zero(SymmetricTensor{2,3}))
backstress2 = Variable(zero(SymmetricTensor{2,3}))
plastic_strain = Variable(zero(SymmetricTensor{2,3}))
stress = Variable(zero(Symm2))
strain = Variable(zero(Symm2))
backstress1 = Variable(zero(Symm2))
backstress2 = Variable(zero(Symm2))
plastic_strain = Variable(zero(Symm2))
cumeq = Variable(0.0)
R = Variable(0.0)
state = VariableState(stress, strain, backstress1,
backstress2, plastic_strain, cumeq, R)
for i in 1:N
state.stress.dvalue = randn(SymmetricTensor{2,3})
state.strain.dvalue = randn(SymmetricTensor{2,3})
state.backstress1.dvalue = randn(SymmetricTensor{2,3})
state.backstress2.dvalue = randn(SymmetricTensor{2,3})
state.plastic_strain.dvalue = randn(SymmetricTensor{2,3})
state.stress.dvalue = randn(Symm2)
state.strain.dvalue = randn(Symm2)
state.backstress1.dvalue = randn(Symm2)
state.backstress2.dvalue = randn(Symm2)
state.plastic_strain.dvalue = randn(Symm2)
state.cumeq.dvalue = norm(state.plastic_strain.dvalue)
state.R.dvalue = randn()
update!(state)
Expand Down
30 changes: 15 additions & 15 deletions examples/abstractmaterial_testing_states.jl
Expand Up @@ -9,23 +9,23 @@ abstract type AbstractMaterialState end
end

struct SomeState <: AbstractMaterialState
stress::SymmetricTensor{2,3,Float64}
stress::Symm2{Float64}
end


state = SomeState(SymmetricTensor{2,3,Float64}([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]))
state = SomeState(Symm2{Float64}([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]))

N = 1000
function bench_state(N)
state = SomeState(SymmetricTensor{2,3,Float64}([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]))
state = SomeState(Symm2{Float64}([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]))
for i in 1:N
dstate = SomeState(randn(SymmetricTensor{2,3,Float64}))
dstate = SomeState(randn(Symm2{Float64}))
state = state + dstate
end
return state
end

# println("Benchmark State{SymmetricTensor{2,3,Float64}}")
# println("Benchmark State{Symm2{Float64}}")
# @btime bench_state(N)

struct AnotherState <: AbstractMaterialState
Expand All @@ -38,21 +38,21 @@ struct AnotherState <: AbstractMaterialState
R::Float64
end
function bench_chaboche_style_state(N)
stress = zero(SymmetricTensor{2,3})
strain = zero(SymmetricTensor{2,3})
backstress1 = zero(SymmetricTensor{2,3})
backstress2 = zero(SymmetricTensor{2,3})
plastic_strain = zero(SymmetricTensor{2,3})
stress = zero(Symm2)
strain = zero(Symm2)
backstress1 = zero(Symm2)
backstress2 = zero(Symm2)
plastic_strain = zero(Symm2)
cumeq = 0.0
R = 0.0
state = AnotherState(stress, strain, backstress1,
backstress2, plastic_strain, cumeq, R)
for i in 1:N
dstress = randn(SymmetricTensor{2,3})
dstrain = randn(SymmetricTensor{2,3})
dbackstress1 = randn(SymmetricTensor{2,3})
dbackstress2 = randn(SymmetricTensor{2,3})
dplastic_strain = randn(SymmetricTensor{2,3})
dstress = randn(Symm2)
dstrain = randn(Symm2)
dbackstress1 = randn(Symm2)
dbackstress2 = randn(Symm2)
dplastic_strain = randn(Symm2)
dcumeq = norm(dplastic_strain)
dR = randn()
dstate = AnotherState(dstress, dstrain, dbackstress1,
Expand Down
2 changes: 1 addition & 1 deletion examples/continuum.jl
Expand Up @@ -5,7 +5,7 @@ mutable struct Continuum3D <: FieldProblem
material_model :: Symbol
end

Continuum3D() = Continuum3D(:IdealPlastic)
Continuum3D() = Continuum3D(:PerfectPlastic)
FEMBase.get_unknown_field_name(::Continuum3D) = "displacement"

function FEMBase.assemble_elements!(problem::Problem{Continuum3D},
Expand Down
4 changes: 2 additions & 2 deletions examples/one_element_ideal_plastic.jl
Expand Up @@ -5,7 +5,7 @@ using Materials, FEMBase, LinearAlgebra

# Standard simulation of ideal plastic material model

analysis, problem, element, bc_elements, ip = get_material_analysis(:IdealPlastic)
analysis, problem, element, bc_elements, ip = get_material_analysis(:PerfectPlastic)
update!(element, "youngs modulus", 200.0e3)
update!(element, "poissons ratio", 0.3)
update!(element, "yield stress", 100.0)
Expand Down Expand Up @@ -44,7 +44,7 @@ t = 0.0:0.1:3.0
plot(e11.(t), s11.(t), label="\$\\sigma_{11}\$")
plot!(e22.(t), s22.(t), label="\$\\sigma_{22}\$")
plot!(e33.(t), s33.(t), label="\$\\sigma_{33}\$")
title!("Stress-strain curve of idealplastic material model, uniaxial strain")
title!("Stress-strain curve of perfect plastic material model, uniaxial strain")
ylabel!("Stress [MPa]")
xlabel!("Strain [str]")
savefig(joinpath("one_element_ideal_plastic/uniaxial_strain.svg"))

0 comments on commit 8aa5dfa

Please sign in to comment.