首页/文章/ 详情

双线性弹塑性模型(五)

5月前浏览6886

本节内容为多杆结构的弹塑性有限元计算。

对于弹塑性材料,    ,其中

 

含多个杆单元的结构,需要分别判断每个单元的弹塑性状态,确定是    或者    参与计算。

[算例]

如图所示,两个并联的杆,一段固定,另一端另一端施加轴向力P。荷载逐渐增加到    ,然后逐渐卸载至0。杆一

杆二


import matplotlib.pyplot as plt
import numpy as np

import numpy as np
import harden

E1 = 10000; H1 = 1111.11; sYield1 = 5 
E2 = 5000; H2 = 555.55;   sYield2 = 7.5

Et1 = 1000; Et2 = 500

mp1 = [E1,  H1, sYield1]; 
mp2 = [E2,  H2, sYield2]; 
nStress1 = 0; nAlpha1=0; neps1 = 0; eps_new1=0
nStress2 = 0; nAlpha2=0; neps2 = 0; eps_new2=0
A1 = 0.75; L1 = 100
A2 = 1.25; L2 = 100
tol = 1.0E-5; u = 0

RES = 0
nincr = 0
max_iter = 20

Load =[0,1,2,3,4,5,6,7,8,9,10,11,12,13,
        14,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0]
N = len(Load)

flag1 = 0; flag2 = 0

X = np.zeros( (N) )
Y1 = np.zeros( (N) )
Y2 = np.zeros( (N) )


for i in range(N):
    nincr += 1
    print('第{}增量步:' .format(nincr) )

    P = Load[i]

    RES = P - nStress1 * A1 - nStress2 * A2
    du = 0
    
    niter = 0
    conv = 2e12
    print('迭代步            位移                   不平衡力                    收敛参数')
    
    while ( conv > tol and niter < max_iter ):
        niter += 1

        Eep1 = E1; Eep2 = E2
        if flag1 == 1:
            Eep1 = Et1
        if flag2 == 1:
            Eep2 = Et2

        K = Eep1 * A1 / L1 + Eep2 * A2 / L2
        delta_u = RES / K
        du = du + delta_u
        delta_eps = delta_u / L1

        Stress_new1, Alpha_new1, eps_new1, flag1 = harden.KinematicHard1D(mp1,
                    delta_eps,nStress1,nAlpha1,neps1)

        Stress_new2, Alpha_new2, eps_new2, flag2 = harden.KinematicHard1D(mp2,
                    delta_eps,nStress2,nAlpha2,neps2)

        

        RES = P - Stress_new1*A1 - Stress_new2*A2
        conv = RES**2 / (1 + P**2)
        nStress1 = Stress_new1; nStress2 = Stress_new2
        neps1 = eps_new1; neps2 = eps_new2
        nAlpha1  = Alpha_new1; nAlpha2  = Alpha_new2
        print(format(niter, '>3d'), format(u, '>20.12f'), format(nStress1, '>22.8f'),
                format(nStress2, '>22.8f'), format(conv, '>22.14e'))

    u = u + du
    
    X[i] = u; Y1[i] = nStress1; Y2[i] = nStress2
    

print(X)
print(Y1)
print(Y2)

fig, axs = plt.subplots(11,  figsize=(7,12) )
axs.plot(X, Y1, label="M1", linewidth = 2, color = "deeppink",marker='o', markersize=6
axs.plot(X, Y2, label="M1", linewidth = 2, color = "green",marker='o', markersize=6
axs.set_xlabel('$ Displacement(mm) $', fontsize = 18)
axs.set_ylabel('$ Stress(MPa) $', fontsize = 18)
plt.ylim([-5,9])

plt.legend(['Bar1','Bar2']) 

fig.savefig('./f428.png', dpi = 300#保存图片 
plt.show()



#####  harden模块
import math

def Sgn(x):
    if x > 0 :
        return 1
    elif x < 0 :
        return -1
    else :
        return 0

def KinematicHard1D(MP,deps, stressN,alphaN, epsN):

    E  = MP[0]
    H  = MP[1]
    Y0 = MP[2]
    
    stress_tr = stressN + E*deps
    eta_tr = stress_tr - alphaN
    f_tr = math.fabs(eta_tr ) - Y0
    if f_tr < 0:
        stress = stress_tr
        alpha = alphaN
        ep = epsN
        flag = 0     # 处于弹性状态
    else:
        dep = f_tr / ( E + H )
        stress = stress_tr - Sgn(eta_tr) * E * dep
        alpha = alphaN + Sgn(eta_tr) * H * dep
        ep = epsN + dep
        flag = 1    # 处于塑性状态

    return stress, alpha, ep, flag

迭代路径



来源:数值分析与有限元编程
UM材料
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-04-02
最近编辑:5月前
太白金星
本科 慢慢来
获赞 4粉丝 8文章 317课程 0
点赞
收藏
作者推荐

双线性弹塑性模型(四)

本节内容为在牛顿-拉夫逊方法中集成基于随动硬化模型的当前应力计算。对于非线性的问题,一般将其线性化为 一次迭代得到的是位移增量,如图所示接下来要将位移增量转化为应变增量,以一维杆结构为例,其应变增量 其中 为杆初始长度。[算例]一根各向同性杆,一端固定,另一端施加轴向力做拉伸试验.荷载逐渐增加到 ,然后逐渐卸载至0。, 。import mathdef Sgn(x): if x &gt; 0 : return 1 elif x &lt; 0 : return -1 else : return 0def KinematicHard1D(MP,deps, stressN,alphaN, epsN): E = MP[0] H = MP[1] Y0 = MP[2] stress_tr = stressN + E*deps eta_tr = stress_tr - alphaN f_tr = math.fabs(eta_tr ) - Y0 if f_tr &lt; 0: stress = stress_tr alpha = alphaN ep = epsN flag = 0 # 处于弹性状态 else: dep = f_tr / ( E + H ) stress = stress_tr - Sgn(eta_tr) * E * dep alpha = alphaN + Sgn(eta_tr) * H * dep ep = epsN + dep flag = 1 # 处于塑性状态 return stress, alpha, ep, flag######### 以上为harden模块import matplotlib.pyplot as pltimport numpy as npimport numpy as npimport hardenE = 70000; H = 10000; sYield = 250Et = E*H / (E+H)mp = [E, H, sYield]nS = 0nep = 0nA = 0A = 100L = 1000tol = 1.0E-1u = 0Res = 0nincr = 0max_iter = 20epnew = 0Load = [0,5000, 10000, 15000,20000,25000,30000,25000,20000, 15000,10000,5000,0 ]N = len(Load)flag = 0X = np.zeros( (N) )Y = np.zeros( (N) )for i in range(N): nincr += 1 print(&#39;第{}增量步:&#39; .format(nincr) ) P = Load[i] Res = P - nS * A du = 0 niter = 0 conv = 2e12 print(&#39;迭代步 位移 不平衡力 收敛参数&#39;) while ( conv &gt; tol and niter &lt; max_iter ): niter += 1 Eep = E if flag == 1: Eep = Et K = Eep*A/L delta_u = Res / K du = du + delta_u delta_eps = delta_u / L Snew, Anew, epnew, flag = harden.KinematicHard1D(mp,delta_eps,nS,nA,nep) Res = P - Snew*A conv = Res**2 / (1 + P**2) nS = Snew nep = epnew nA = Anew print(format(niter, &#39;&gt;3d&#39;), format(u, &#39;&gt;20.12f&#39;), format(nS, &#39;&gt;26.14f&#39;), format(conv, &#39;&gt;28.16e&#39;)) u = u + du X[i] = u Y[i] = nSprint(X)print(Y)fig, axs = plt.subplots(1, 1, figsize=(8,6) )axs.plot(X, Y, label=&quot;M1&quot;, linewidth = 3, color = &quot;deeppink&quot;,marker=&#39;o&#39;, markersize=12) axs.set_xlabel(&#39;$Displacement(mm)$&#39;, fontsize = 18)axs.set_ylabel(&#39;$Stress(MPa)$&#39;, fontsize = 18)fig.savefig(&#39;./f358.png&#39;, dpi = 300) #保存图片 plt.show()得到的迭代路径★★★★ 往期相关 ★★★★双线性弹塑性模型(三)双线性弹塑性模型(二)双线性弹塑性模型(一)来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈