# SPDX-License-Identifier: MIT
# Copyright (c) 2011–2026 Joris J.C. Remmers
from numpy import dot,zeros,insert,array,ones
from math import sqrt
[docs]
def vonMisesStress( s ):
smises = 0.;
if len(s) == 3:
return sqrt(s[0]*s[0]+s[1]*s[1]-s[0]*s[1]+3.*s[2]*s[2]);
elif len(s) == 6:
smises = ( s[0] - s[1] ) * ( s[0] - s[1] ) + \
( s[1] - s[2] ) * ( s[1] - s[2] ) + \
( s[2] - s[0] ) * ( s[2] - s[0] )
smises += 6.0 * dot(s[3:] , s[3:] )
return sqrt( 0.5 * smises )
[docs]
def hydrostaticStress( s ):
return 0.333333333333333*sum( s[:3] )
[docs]
class Hardening:
def __init__ ( self, props ):
self.n = 20
self.maxStrain = 1.0
for name,val in props:
setattr( self, name, val )
self.htype = 0
if hasattr( props , "EqPlasStrains" ):
self.htype = 1
insert(self.Stresses, 0, self.syield )
insert(self.EqPlasStrains, 0, 0. )
elif hasattr( props , "q" ):
self.htype = 2
self.Stresses = zeros( self.n+1 )
self.EqPlasStrains = zeros( self.n + 1 )
epsInc = self.maxStrain / ( 1.0*self.n )
if not hasattr( props , "K" ):
self.K = self.syield*pow(self.E/self.syield,self.q)
eps0 = self.syield/self.E
self.Stresses[0] = self.syield
for i in range(self.n):
self.EqPlasStrains[i+1] = (i+1)*epsInc
self.Stresses[i+1] = self.K * pow(self.EqPlasStrains[i+1]+eps0,self.q)
[docs]
def getHardening( self , eqplas ):
# if self.n == 0:
# return self.Stresses[0] , self.EqPlasStrains[0]
# else:
if True:
for i in range(self.n):
eqpl1 = self.EqPlasStrains[i+1]
if eqplas < eqpl1:
eqpl0 = self.EqPlasStrains[i]
deqpl = eqpl1-eqpl0
syiel0 = self.Stresses[i]
dsyiel = self.Stresses[i+1]-syiel0
hard = dsyiel / deqpl
return syiel0 + ( eqplas-eqpl0)*hard , hard
eqpl0 = self.EqPlasStrains[:-1]
deqpl = self.EqPlasStrains[:]-eqpl0
syiel0 = self.Stresses[:-1]
dsyiel = self.Stresses[:]-syiel0
hard = dsyiel / deqpl
return siyel0 + ( eqplas-eqpl0)*hard , hard
#
#
#
#------------------------------------------------------------------------------
# hydroStaticStress
#------------------------------------------------------------------------------
[docs]
def hydroStatic( s ):
return sum( s[:3] )/3.0
#------------------------------------------------------------------------------
# splitStrains
#------------------------------------------------------------------------------
[docs]
def splitStrains( eps ):
theta = hydroStatic( eps )
deps = zeros(6)
deps[:3] = eps[:3] - theta*ones(3)
deps[3:] = 0.5*eps[3:]
return theta,deps