mirror of
https://github.com/JuliaFEM/JuliaFEM.jl.git
synced 2026-08-06 04:21:33 +00:00
554 lines
70 KiB
Plaintext
554 lines
70 KiB
Plaintext
|
|
{
|
|||
|
|
"cells": [
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"# Von Mises material with nonlinear isotropic and kinematic hardening\n",
|
|||
|
|
"\n",
|
|||
|
|
"Author(s): Olli Väinölä <olli.vainola@student.oulu.fi>\n",
|
|||
|
|
"\n",
|
|||
|
|
"In this notebook is an small tutorial, how to create a Von Mises material with hardening. Equations are formulated into rate depended form. Code may or may not include some bugs.."
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"# Theory section\n",
|
|||
|
|
"\n",
|
|||
|
|
"### Continuum equations\n",
|
|||
|
|
"\n",
|
|||
|
|
"Stress:\n",
|
|||
|
|
"\n",
|
|||
|
|
"$\\sigma = C : \\epsilon^e$\n",
|
|||
|
|
"\n",
|
|||
|
|
"$C$ is material tensor and $\\epsilon$ total strain.\n",
|
|||
|
|
"Total strain is divided into elastic and plastic part:\n",
|
|||
|
|
"\n",
|
|||
|
|
"$\\epsilon = \\epsilon^e + \\epsilon^p$\n",
|
|||
|
|
"\n",
|
|||
|
|
"now let's define a strain rate, which is strain increment divide with time increment $dt$\n",
|
|||
|
|
"\n",
|
|||
|
|
"$\\frac{d\\epsilon}{dt} = \\dot \\epsilon = \\dot \\epsilon^e + \\dot \\epsilon^p$\n",
|
|||
|
|
"\n",
|
|||
|
|
"Now same procedure for stress and substitute $\\dot \\epsilon^e$\n",
|
|||
|
|
"\n",
|
|||
|
|
"$\\dot \\sigma = C : \\dot \\epsilon^e = C : (\\dot \\epsilon - \\dot \\epsilon^p )$\n",
|
|||
|
|
"\n",
|
|||
|
|
"Only thing to do is to define yield function. Now we're using Von Mises material:\n",
|
|||
|
|
"\n",
|
|||
|
|
"$f(\\sigma - X, R(\\alpha)) = \\sqrt{3J_2(\\sigma-X))} - R(\\alpha)$ = 0\n",
|
|||
|
|
"\n",
|
|||
|
|
"$f(\\sigma, \\sigma_y) = \\sqrt{3J_2(\\sigma))} - \\sigma_y$ = 0\n",
|
|||
|
|
"\n",
|
|||
|
|
"$J_2 = \\frac{1}{2}s : s$ \n",
|
|||
|
|
"\n",
|
|||
|
|
"$s = \\sigma - \\frac{1}{3}\\sigma I$\n",
|
|||
|
|
"\n",
|
|||
|
|
"$I = eye(3)$"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 1,
|
|||
|
|
"metadata": {
|
|||
|
|
"collapsed": false
|
|||
|
|
},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": [
|
|||
|
|
"# imports\n",
|
|||
|
|
"using PyPlot\n",
|
|||
|
|
"using ForwardDiff\n",
|
|||
|
|
"using NLsolve"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"Let's create a isotropic Hooke material."
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 2,
|
|||
|
|
"metadata": {
|
|||
|
|
"collapsed": false
|
|||
|
|
},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"6x6 Array{Float64,2}:\n",
|
|||
|
|
" 2.69231e5 1.15385e5 1.15385e5 0.0 0.0 0.0 \n",
|
|||
|
|
" 1.15385e5 2.69231e5 1.15385e5 0.0 0.0 0.0 \n",
|
|||
|
|
" 1.15385e5 1.15385e5 2.69231e5 0.0 0.0 0.0 \n",
|
|||
|
|
" 0.0 0.0 0.0 1.53846e5 0.0 0.0 \n",
|
|||
|
|
" 0.0 0.0 0.0 0.0 1.53846e5 0.0 \n",
|
|||
|
|
" 0.0 0.0 0.0 0.0 0.0 1.53846e5"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 2,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"\"\"\"\n",
|
|||
|
|
"Create a isotropic Hooke material matrix C \n",
|
|||
|
|
"\n",
|
|||
|
|
"More information: # http://www.efunda.com/formulae/solid_mechanics/mat_mechanics/hooke_isotropic.cfm\n",
|
|||
|
|
"\n",
|
|||
|
|
"Parameters\n",
|
|||
|
|
"----------\n",
|
|||
|
|
" E: Float\n",
|
|||
|
|
" Elastic modulus\n",
|
|||
|
|
" ν: Float\n",
|
|||
|
|
" Poisson constant\n",
|
|||
|
|
"\n",
|
|||
|
|
"Returns\n",
|
|||
|
|
"-------\n",
|
|||
|
|
" Array{Float64, (6,6)}\n",
|
|||
|
|
"\"\"\"\n",
|
|||
|
|
"function hookeStiffnessTensor(E, ν)\n",
|
|||
|
|
" a = 1 - ν\n",
|
|||
|
|
" b = 1 - 2*ν\n",
|
|||
|
|
" c = 1 + ν\n",
|
|||
|
|
" multiplier = E / (b * c)\n",
|
|||
|
|
" return Float64[a ν ν 0 0 0;\n",
|
|||
|
|
" ν a ν 0 0 0;\n",
|
|||
|
|
" ν ν a 0 0 0;\n",
|
|||
|
|
" 0 0 0 b 0 0;\n",
|
|||
|
|
" 0 0 0 0 b 0;\n",
|
|||
|
|
" 0 0 0 0 0 b].*multiplier\n",
|
|||
|
|
"end\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Pick material values\n",
|
|||
|
|
"E = 200.0e3\n",
|
|||
|
|
"ν = 0.3\n",
|
|||
|
|
"C = hookeStiffnessTensor(E, ν)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {
|
|||
|
|
"collapsed": false
|
|||
|
|
},
|
|||
|
|
"source": [
|
|||
|
|
"# Defining equations for the calculation\n",
|
|||
|
|
"\n",
|
|||
|
|
"Functions are defined for strain controller simulation"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 3,
|
|||
|
|
"metadata": {
|
|||
|
|
"collapsed": false
|
|||
|
|
},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"calculate_stress (generic function with 1 method)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 3,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"# using vectors with double contradiction\n",
|
|||
|
|
"# http://www-2.unipv.it/compmech/teaching/available/const_mod/const_mod_mat-review_notation.pdf\n",
|
|||
|
|
"M = [1 0 0 0 0 0;\n",
|
|||
|
|
" 0 1 0 0 0 0;\n",
|
|||
|
|
" 0 0 1 0 0 0;\n",
|
|||
|
|
" 0 0 0 2 0 0;\n",
|
|||
|
|
" 0 0 0 0 2 0;\n",
|
|||
|
|
" 0 0 0 0 0 2;]\n",
|
|||
|
|
"\n",
|
|||
|
|
"\"\"\"\n",
|
|||
|
|
"Equivalent tensile stress. \n",
|
|||
|
|
"\n",
|
|||
|
|
"More info can be found from: https://en.wikipedia.org/wiki/Von_Mises_yield_criterion\n",
|
|||
|
|
" Section: Reduced von Mises equation for different stress conditions\n",
|
|||
|
|
"\n",
|
|||
|
|
"Parameters\n",
|
|||
|
|
"----------\n",
|
|||
|
|
" σ: Array{Float64, 6}\n",
|
|||
|
|
" Stress in Voigt notation\n",
|
|||
|
|
"\n",
|
|||
|
|
"Returns\n",
|
|||
|
|
"-------\n",
|
|||
|
|
" Float\n",
|
|||
|
|
"\"\"\"\n",
|
|||
|
|
"function σₑ(σ)\n",
|
|||
|
|
" s = σ[1:6] - 1/3 * sum([σ[1], σ[2], σ[3]]) * [1 1 1 0 0 0]'\n",
|
|||
|
|
" return sqrt(3/2 * s' * M * s)[1]\n",
|
|||
|
|
"end\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Some extra data for testing purposes ...\n",
|
|||
|
|
"#ss = σ[1]\n",
|
|||
|
|
"#return sqrt(sum(ss.^2))\n",
|
|||
|
|
"\n",
|
|||
|
|
"\"\"\"\n",
|
|||
|
|
"Von Mises Yield criterion\n",
|
|||
|
|
"\n",
|
|||
|
|
"More info can be found from: http://csm.mech.utah.edu/content/wp-content/uploads/2011/10/9tutorialOnJ2Plasticity.pdf\n",
|
|||
|
|
"\n",
|
|||
|
|
"Parameters\n",
|
|||
|
|
"----------\n",
|
|||
|
|
" σ: Array{Float64, 6}\n",
|
|||
|
|
" Stress in Voigt notation\n",
|
|||
|
|
" k: Float64\n",
|
|||
|
|
" Material constant, Yield limit\n",
|
|||
|
|
"\n",
|
|||
|
|
"Returns\n",
|
|||
|
|
"-------\n",
|
|||
|
|
" Float\n",
|
|||
|
|
"\"\"\"\n",
|
|||
|
|
"function vonMisesYield(σ, k)\n",
|
|||
|
|
" σₑ(σ) - k\n",
|
|||
|
|
"end\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"\"\"\"\n",
|
|||
|
|
"Function for NLsolve. Inside this function are the functions where we want to find root.\n",
|
|||
|
|
"Ψ is the yield function below. Functions defined here:\n",
|
|||
|
|
"\n",
|
|||
|
|
" dσ - C (dϵ - dλ*dΨ/dσ) = 0\n",
|
|||
|
|
" σₑ(σ) - k = 0\n",
|
|||
|
|
"\n",
|
|||
|
|
"Parameters\n",
|
|||
|
|
"----------\n",
|
|||
|
|
" params: Array{Float64, 7}\n",
|
|||
|
|
" Array containing values from solver\n",
|
|||
|
|
" dϵ: Array{Float64, 6}\n",
|
|||
|
|
" Strain rate vector in Voigt notation\n",
|
|||
|
|
" C: Array{Float64, (6, 6)}\n",
|
|||
|
|
" Material tensor\n",
|
|||
|
|
" k: Float\n",
|
|||
|
|
" Material constant, yield limit\n",
|
|||
|
|
" Δt: Float\n",
|
|||
|
|
" time increment\n",
|
|||
|
|
" σ_begin:Array{Float64, 6}\n",
|
|||
|
|
" Stress vector in Voigt notation\n",
|
|||
|
|
" p: Float\n",
|
|||
|
|
" Accumulated plastic strain\n",
|
|||
|
|
" X: Array{Float64, 6}\n",
|
|||
|
|
" Kinematic hardening tensor\n",
|
|||
|
|
" R: Function\n",
|
|||
|
|
" Calculates isotropic hardening as a function of accumulated plastic strain\n",
|
|||
|
|
" α:Float\n",
|
|||
|
|
" Accumulated kinematic evolution variable\n",
|
|||
|
|
" dα: Function\n",
|
|||
|
|
" Calculates kinematic evolution variables rate as a function of accumulated plastic slip rate\n",
|
|||
|
|
" fX: Function\n",
|
|||
|
|
" Calculates the kinematic \n",
|
|||
|
|
"\n",
|
|||
|
|
"Returns\n",
|
|||
|
|
"-------\n",
|
|||
|
|
" Array{Float64, 7}, return values for solver\n",
|
|||
|
|
"\"\"\"\n",
|
|||
|
|
"function G(params, dϵ, C, σ_begin, p, X, R, fX, ϵp)\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Initializing wrapper\n",
|
|||
|
|
" yield(pars) = vonMisesYield(pars, R(p))\n",
|
|||
|
|
" dfdσ = ForwardDiff.gradient(yield)\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Initializing variables\n",
|
|||
|
|
" dσ = params[1:6]\n",
|
|||
|
|
" dλ = params[end]\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Total strain\n",
|
|||
|
|
" σ_new = σ_begin + dσ\n",
|
|||
|
|
" σ_shifted = vec(σ_new - X)\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Creating wrapper for gradient\n",
|
|||
|
|
" vars = dfdσ(σ_shifted)\n",
|
|||
|
|
" dΨdσ = vars[1:6]\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Calculating plastic strain rate\n",
|
|||
|
|
" dϵp = dλ * dΨdσ\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Calculating material evolution variables\n",
|
|||
|
|
" ϵp_new = ϵp + dϵp\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Evaluating equations\n",
|
|||
|
|
" function_1 = dσ - C * (dϵ - dϵp)\n",
|
|||
|
|
" function_2 = yield(σ_shifted)\n",
|
|||
|
|
" [vec(function_1); function_2]\n",
|
|||
|
|
"end\n",
|
|||
|
|
"\n",
|
|||
|
|
"\n",
|
|||
|
|
"\"\"\"\n",
|
|||
|
|
"This is a novice implementation for double contraction, a=b:c\n",
|
|||
|
|
"\n",
|
|||
|
|
"Parameters\n",
|
|||
|
|
"----------\n",
|
|||
|
|
" a: Array{Float64, 6}\n",
|
|||
|
|
"\n",
|
|||
|
|
"Returns\n",
|
|||
|
|
"-------\n",
|
|||
|
|
" Float\n",
|
|||
|
|
"\"\"\"\n",
|
|||
|
|
"function double_contraction(a; b=a)\n",
|
|||
|
|
" indexes = [1, 2, 3, 4, 5, 6, 4, 5, 6]\n",
|
|||
|
|
" summation = 0\n",
|
|||
|
|
" for i in indexes\n",
|
|||
|
|
" summation += a[i]*b[i]\n",
|
|||
|
|
" end\n",
|
|||
|
|
" summation\n",
|
|||
|
|
"end\n",
|
|||
|
|
"\n",
|
|||
|
|
"\"\"\"\n",
|
|||
|
|
"Function which calculates the stress. Also handles if any yielding happens\n",
|
|||
|
|
"\n",
|
|||
|
|
"Parameters\n",
|
|||
|
|
"----------\n",
|
|||
|
|
" dϵ: Array{Float64, 6}\n",
|
|||
|
|
" Strain rate vector in Voigt notation\n",
|
|||
|
|
" Δt: Float\n",
|
|||
|
|
" time increment\n",
|
|||
|
|
" σ: Array{Float64, 6}\n",
|
|||
|
|
" Last stress vector in Voigt notation\n",
|
|||
|
|
" C: Array{Float64, (6, 6)}\n",
|
|||
|
|
" Material tensor\n",
|
|||
|
|
" p: Float\n",
|
|||
|
|
" Accumulated plastic strain\n",
|
|||
|
|
" X: Array{Float64, 6}\n",
|
|||
|
|
" Kinematic hardening tensor\n",
|
|||
|
|
" R: Function\n",
|
|||
|
|
" Calculates isotropic hardening as a function of accumulated plastic strain\n",
|
|||
|
|
" α:Float\n",
|
|||
|
|
" Accumulated kinematic evolution variable\n",
|
|||
|
|
" dα: Function\n",
|
|||
|
|
" Calculates kinematic evolution variables rate as a function of accumulated plastic slip rate\n",
|
|||
|
|
" fX: Function\n",
|
|||
|
|
" Calculates the kinematic \n",
|
|||
|
|
"\n",
|
|||
|
|
"Returns\n",
|
|||
|
|
"-------\n",
|
|||
|
|
" Tuple\n",
|
|||
|
|
" returns following parameters: p, X, α, σ. See Parameters for definitions\n",
|
|||
|
|
"\"\"\"\n",
|
|||
|
|
"function calculate_stress(dϵ, σ, C, p, X, R, fX, ϵp)\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Test stress\n",
|
|||
|
|
" σ_tria = σ + C * dϵ\n",
|
|||
|
|
"\n",
|
|||
|
|
" # Calculating yield\n",
|
|||
|
|
" yield = vonMisesYield(σ_tria - X, R(p))\n",
|
|||
|
|
"\n",
|
|||
|
|
" if yield > 1\n",
|
|||
|
|
" # Yielding happened\n",
|
|||
|
|
" # Creating functions for newton: xₙ₊₁ = xₙ - df⁻¹ * f and initial values\n",
|
|||
|
|
" initial_guess = [vec(σ_tria - σ); 0.1]\n",
|
|||
|
|
" f(σ_) = G(σ_, dϵ, C, σ, p, X, R, fX, ϵp)\n",
|
|||
|
|
" df = ForwardDiff.jacobian(f)\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Calculating root \n",
|
|||
|
|
" result = nlsolve(not_in_place(f, df), initial_guess).zero\n",
|
|||
|
|
" # Extracting values\n",
|
|||
|
|
" σ += result[1:6] \n",
|
|||
|
|
" dλ = result[end]\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Wrapper for gradient\n",
|
|||
|
|
" yield_f(σ_) = vonMisesYield(σ_, R(p))\n",
|
|||
|
|
" dfdσ_ = ForwardDiff.gradient(yield_f)\n",
|
|||
|
|
" dΨdσ = dfdσ_(vec(σ)-X)\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Stress rate and plastic strain rate\n",
|
|||
|
|
" dϵᵖ = dλ * dΨdσ\n",
|
|||
|
|
" ϵp = ϵp + dϵᵖ\n",
|
|||
|
|
" \n",
|
|||
|
|
" # Updating material parameters\n",
|
|||
|
|
" dp = sqrt(2/3 * double_contraction(dϵᵖ))\n",
|
|||
|
|
" p += dp\n",
|
|||
|
|
" X = fX(ϵp)\n",
|
|||
|
|
" else\n",
|
|||
|
|
" σ = σ_tria\n",
|
|||
|
|
" end\n",
|
|||
|
|
" return (p, X, σ, ϵp)\n",
|
|||
|
|
"end"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"# Defining strain history\n",
|
|||
|
|
"\n",
|
|||
|
|
"In the ideal plastic example, we only had tension stress. In this example we'll take it a bit further and calculate the cyclic strain"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 17,
|
|||
|
|
"metadata": {
|
|||
|
|
"collapsed": false
|
|||
|
|
},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"name": "stdout",
|
|||
|
|
"output_type": "stream",
|
|||
|
|
"text": [
|
|||
|
|
"Done\n"
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"steps = 10000\n",
|
|||
|
|
"strain_max = 0.004\n",
|
|||
|
|
"num_cycles = 50\n",
|
|||
|
|
"\n",
|
|||
|
|
"ϵ_tot = zeros(Float64, (steps, 6))\n",
|
|||
|
|
"ϵ_tot2 = zeros(Float64, (steps, 6))\n",
|
|||
|
|
"ϵ_tot3 = zeros(Float64, (steps, 6))\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Adding only strain in x-axis and counting for the poisson effect\n",
|
|||
|
|
"ϵ_tot[:, 1] = strain_max * sin(2 * pi * linspace(0, num_cycles, steps))\n",
|
|||
|
|
"ϵ_tot[:, 2] = strain_max * sin(2 * pi * linspace(0, num_cycles, steps)).*-ν\n",
|
|||
|
|
"ϵ_tot[:, 3] = strain_max * sin(2 * pi * linspace(0, num_cycles, steps)).*-ν\n",
|
|||
|
|
"println(\"Done\")"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"# Hardening evolution equations\n",
|
|||
|
|
"\n",
|
|||
|
|
"Followig equations are in charge of evolution of isotropic and kinematic parameters"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 18,
|
|||
|
|
"metadata": {
|
|||
|
|
"collapsed": false
|
|||
|
|
},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"text/plain": [
|
|||
|
|
"kinematic_hardening (generic function with 1 method)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"execution_count": 18,
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "execute_result"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"function isotropic_hardening(ϵp_cum, R0, Q)\n",
|
|||
|
|
" return R0 + Q * ϵp_cum\n",
|
|||
|
|
"end\n",
|
|||
|
|
"\n",
|
|||
|
|
"function kinematic_hardening(ϵp, C)\n",
|
|||
|
|
" return C * ϵp\n",
|
|||
|
|
"end"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "markdown",
|
|||
|
|
"metadata": {},
|
|||
|
|
"source": [
|
|||
|
|
"# Simulation\n",
|
|||
|
|
"\n",
|
|||
|
|
"Ok, we're good to go! Now we just need to define yield limit and the main loop.\n",
|
|||
|
|
"\n",
|
|||
|
|
"This simulation is not time dependent, but since it's already defined in the equations we'll give it value 1"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": 19,
|
|||
|
|
"metadata": {
|
|||
|
|
"collapsed": false,
|
|||
|
|
"scrolled": false
|
|||
|
|
},
|
|||
|
|
"outputs": [
|
|||
|
|
{
|
|||
|
|
"data": {
|
|||
|
|
"image/png": "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
|
|||
|
|
"text/plain": [
|
|||
|
|
"PyPlot.Figure(PyObject <matplotlib.figure.Figure object at 0x7fdf891fc810>)"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
"metadata": {},
|
|||
|
|
"output_type": "display_data"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"source": [
|
|||
|
|
"ϵ_last = zeros(Float64, (6)) # Last total strain\n",
|
|||
|
|
"ϵᵖ = zeros(Float64, (6)) # Plastic strain\n",
|
|||
|
|
"σ = zeros(Float64, (6, 1)) # Stress\n",
|
|||
|
|
"\n",
|
|||
|
|
"ss = Float64[] # plotting stress\n",
|
|||
|
|
"ee = Float64[] # plotting strain\n",
|
|||
|
|
"pp = Float64[] # plotting strain\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Isotropic hardening\n",
|
|||
|
|
"σy = 200.0 # yield limit\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Kinematic hardening\n",
|
|||
|
|
"Ck = 4000.0 # saturation hardening C/D\n",
|
|||
|
|
"X = zeros(Float64, 6) # kinematic hardening tensor\n",
|
|||
|
|
"\n",
|
|||
|
|
"p = 0.0 # Accumulated plastic strain\n",
|
|||
|
|
"\n",
|
|||
|
|
"# Isotropic hardening\n",
|
|||
|
|
"R(ϵp_cum) = isotropic_hardening(ϵp_cum, σy, σy)\n",
|
|||
|
|
"\n",
|
|||
|
|
"# kinematic hardening\n",
|
|||
|
|
"fX(ϵp) = kinematic_hardening(ϵp, Ck)\n",
|
|||
|
|
"\n",
|
|||
|
|
"ϵp = zeros(Float64, 6)\n",
|
|||
|
|
"for i=1:steps\n",
|
|||
|
|
" # Actual calculation\n",
|
|||
|
|
" dϵ = reshape(ϵ_tot[i, :, :], (6, 1)) - ϵ_last\n",
|
|||
|
|
" p, X, σ, ϵp = calculate_stress(dϵ, σ, C, p, X, R, fX, ϵp)\n",
|
|||
|
|
" ϵ_last += dϵ\n",
|
|||
|
|
" push!(ss, σ[1])\n",
|
|||
|
|
" push!(ee, ϵ_last[1])\n",
|
|||
|
|
" push!(pp, p)\n",
|
|||
|
|
"end\n",
|
|||
|
|
"PyPlot.plot(ee, ss)\n",
|
|||
|
|
"PyPlot.title(\"Stress-Strain curve\")\n",
|
|||
|
|
"PyPlot.xlabel(\"Strain\")\n",
|
|||
|
|
"PyPlot.ylabel(\"Stress\")\n",
|
|||
|
|
"PyPlot.grid()"
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"cell_type": "code",
|
|||
|
|
"execution_count": null,
|
|||
|
|
"metadata": {
|
|||
|
|
"collapsed": true
|
|||
|
|
},
|
|||
|
|
"outputs": [],
|
|||
|
|
"source": []
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"metadata": {
|
|||
|
|
"kernelspec": {
|
|||
|
|
"display_name": "Julia 0.4.1-pre",
|
|||
|
|
"language": "julia",
|
|||
|
|
"name": "julia-0.4"
|
|||
|
|
},
|
|||
|
|
"language_info": {
|
|||
|
|
"file_extension": ".jl",
|
|||
|
|
"mimetype": "application/julia",
|
|||
|
|
"name": "julia",
|
|||
|
|
"version": "0.4.1"
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"nbformat": 4,
|
|||
|
|
"nbformat_minor": 0
|
|||
|
|
}
|