首页/文章/ 详情

IJMS期刊喷丸诱导晶粒细化的程序分享

7天前浏览18
原始文献名称:《Numerical study of grain refinement induced by severe shot peening》
DOI:10.1016/j.ijmecsci.2018.08.005
简介:作者开发了一个能够准确模拟严重喷丸引起的晶粒细化过程的数值模型,并利用该模型研究关键喷丸参数对晶粒细化效果的影响  。该本构模型被编写成用户材料子程序(VUMAT),并嵌入到有限元软件 ABAQUS/Explicit 中进行计算  。作者的模拟效果如下:
详细本构介绍可以参考原始文献。这里展示文章共享的一个vumat代码

      subroutine vumat(

C Read only (unmodifiable)variables -

     1  nblock, ndir, nshr, nstatev, nfieldv, nprops, lanneal,

     2  stepTime, totalTime, dt, cmname, coordMp, charLength,

     3  props, density, strainInc, relSpinInc,

     4  tempOld, stretchOld, defgradOld, fieldOld,

     5  stressOld, stateOld, enerInternOld, enerInelasOld,

     6  tempNew, stretchNew, defgradNew, fieldNew,

C Write only (modifiable) variables -

     7  stressNew, stateNew, enerInternNew, enerInelasNew )

C

      include 'vaba_param.inc'

C

      dimension props(nprops), density(nblock), coordMp(nblock,*),

     1  charLength(nblock), strainInc(nblock,ndir+nshr),

     2  relSpinInc(nblock,nshr), tempOld(nblock),

     3  stretchOld(nblock,ndir+nshr),

     4  defgradOld(nblock,ndir+nshr+nshr),

     5  fieldOld(nblock,nfieldv), stressOld(nblock,ndir+nshr),

     6  stateOld(nblock,nstatev), enerInternOld(nblock),

     7  enerInelasOld(nblock), tempNew(nblock),

     8  stretchNew(nblock,ndir+nshr),

     8  defgradNew(nblock,ndir+nshr+nshr),

     9  fieldNew(nblock,nfieldv),

     1  stressNew(nblock,ndir+nshr), stateNew(nblock,nstatev),

     2  enerInternNew(nblock), enerInelasNew(nblock)

C

      character*80 cmname

c     常量声明 const parameter

      real*8,parameter:: x0=1.0d-30,PRECISION_GAMMA=5.0d-3,

     1  PRECISION_RHO=5.0d-3,DPEEQ_SHRINK=1.0d-5

      parameter(ZERO=0.0d0,ONE=1.0d0,TWO=2.0d0,THREE=3.0d0,HALF=0.5d0,

     1  SIX=6.0d0,MAXSTEP=50)

C

      real*8 E,mu,Rho_c0,Rho_w0,diameter,dpeeq,peeq,Rho,rho_w,rho_c,

     1  rhoc_old,rhow_old,pre_dpeeq,dpeeq_trial,volFrac,K_frac


c     状态变量内容

c     state(*,1) 屈服应力 Yeild Stress

c     state(*,2) 等效塑性应变 PEEQ

c     state(*,3) 位错壁密度 Dislocation Wall Density

c     state(*,4) 位错胞密度 Dislocation Cell Density

c     state(*,5) 位错胞直径 Dislocation Cell Diameter

c     state(*,6) 位错壁体积分数 Volume Fraction


c     state(*,7) 总位错密度 Total Dislocation Density


c     用户输入参数赋予 Parameters about Material

      E = props(1) !弹性模量

      Mu = props(2) !泊松比 


      Sig1 = props(3) !初始应力S1

      Alpha_star = props(4) !α*

      Beta_star = props(5) !β*

      K_c = props(6) !kc

      K_w = props(7) !kw

      N_c = props(8) !nc

      N_w = props(9) !nw

      M_star = props(10) !m*

      Burger = props(11) !b 伯氏矢量

      Taylor = props(12) !M 泰勒因子

      Eta = props(13) !η 常数

      volFrac_zero = props(14) !f_0 体积分数参数

      volFrac_infin = props(15) !f_infin 体积分数参数

      Gamma0 = props(16) !参考剪应变率

      K_zero = props(17) !K参数

      K_infin = props(18) !K参数

      Peeq_wave = props(19) !常数

      Beta = props(20) !常数

      Rho_c0 = props(21) !初始位错胞密度

      Rho_w0 = props(22) !初始位错壁密度




c     拉梅常数 Lame constant

      La = (Mu*E)/((ONE+Mu)*(ONE-TWO*Mu)) !lambda

      Lb = E/(TWO*(ONE+Mu)) !G


      if(stepTime .eq. ZERO)then !初始时间步 initial step

          do k=1,nblock

              trace = strainInc(k,1)+strainInc(k,2)+strainInc(k,3)


              stressNew(k,1) = TWO*Lb*strainInc(k,1) + trace*La

              stressNew(k,2) = TWO*Lb*strainInc(k,2) + trace*La

              stressNew(k,3) = TWO*Lb*strainInc(k,3) + trace*La

              stressNew(k,4) = TWO*Lb*strainInc(k,4)

              stressNew(k,5) = TWO*Lb*strainInc(k,5)

              stressNew(k,6) = TWO*Lb*strainInc(k,6)

          end do

      else !非初始时间步 following step

          do k=1,nblock !计算试应力 calculating trial stress

              trace = strainInc(k,1)+strainInc(k,2)+strainInc(k,3)


              s1 = stressOld(k,1) + TWO*Lb*strainInc(k,1) + trace*La

              s2 = stressOld(k,2) + TWO*Lb*strainInc(k,2) + trace*La

              s3 = stressOld(k,3) + TWO*Lb*strainInc(k,3) + trace*La

              s4 = stressOld(k,4) + TWO*Lb*strainInc(k,4)

              s5 = stressOld(k,5) + TWO*Lb*strainInc(k,5)

              s6 = stressOld(k,6) + TWO*Lb*strainInc(k,6)


              !计算mise应力,判断是否屈服 calculating mise stress then check Is yeild?

              s m = (s1+s2+s3)/THREE

              s1 = s1 - s m

              s2 = s2 - s m

              s3 = s3 - s m


              mise = sqrt(1.5d0 * 

     1  ((s1*s1 + s2*s2 + s3*s3) + TWO*(s4*s4 + s5*s5 +s6*s6)))


              !传递量 variable could be changed in process

              sig_y = stateOld(k,1)

              peeq = stateOld(k,2)

              rho_w = stateOld(k,3)

              rho_c = stateOld(k,4)

              diameter = stateOld(k,5)

              volFrac = stateOld(k,6)


              !不传递量 variable havn't changed in process

              Rho = StateOld(k,7)




              dpeeq = ZERO


              if(sig_y .EQ. ZERO)then !在未屈服时为相关变量赋值 Assign values to related variables when unyielding

                  peeq = ZERO


                  rho_w = rho_w0

                  rho_c = rho_c0


                  !相关变量初值计算 Calculation of initial values of relevant variables

                  K_frac = K_zero


                  volFrac = volFrac_zero


                  Rho = volFrac*rho_w + (ONE-volFrac)*rho_c


                  diameter = K_frac/sqrt(Rho)


                  sig_y = sig1 + Taylor*Eta*Lb*Burger*

     1  (volFrac*sqrt(rho_w)+(ONE-volFrac)*sqrt(rho_c))


              end if


              if(mise .LE. sig_y)then !未屈服 试探应力就是实际应力 The test stress at unyielding is the actual stress

                  !应力计算 stress calculation

                  stressNew(k,1) = s1 + s m

                  stressNew(k,2) = s2 + s m

                  stressNew(k,3) = s3 + s m

                  stressNew(k,4) = s4

                  stressNew(k,5) = s5

                  stressNew(k,6) = s6


                  !能量计算 energy calculation

                  strainEnergy = HALF * (

     1  (stressNew(k,1)+stressOld(k,1))*strainInc(k,1) + 

     2  (stressNew(k,2)+stressOld(k,2))*strainInc(k,2) + 

     3  (stressNew(k,3)+stressOld(k,3))*strainInc(k,3) ) + 

     4  (stressNew(k,4)+stressOld(k,4))*strainInc(k,4) + 

     5  (stressNew(k,5)+stressOld(k,5))*strainInc(k,5) + 

     6  (stressNew(k,6)+stressOld(k,6))*strainInc(k,6)


                  enerInternNew(k) = enerInternOld(k) + 

     1  strainEnergy/density(k)


                  enerInelasNew(k) = enerInelasOld(k)

              else !屈服 按位错密度本构模型计算 According to dislocation density constitutive model when yeild

                  !计算试探等效塑性应变初值 Calculating the initial value of equivalent plastic strain


                  rhoc_old = rho_c

                  rhow_old = rho_w

                  d_old = diameter



          !迭代计算增量步开始时的等效应变增量(按牛顿迭代法求解)

          !The equivalent strain increment at the beginning of the increment step is computed iteratively (solved by Newton iteration method).

          !该增量步作为为初始试探值

          !This incremental step is taken as the initial trial stress value


          !迭代常数声明 Iterative constant declaration

          jstep = ZERO

          dpeeq = (mise-Sig1)/(THREE*Lb) !由mise控制的假设迭代初值 mise controlled initial value of hypothetical iteration


          !计算迭代初值 Calculating the initial iteration value

          f = ONE

          do while(f .GT. ZERO)

              dpeeq = dpeeq*DPEEQ_SHRINK

              f = Sig1-mise+THREE*Lb*dpeeq+Taylor*Eta*Lb*Burger*

     1  (volFrac*dsqrt(rho_w)+(ONE-volFrac)*dsqrt(rho_c))*

     2  (((Taylor*dpeeq)/(Gamma0*dt))**(ONE/M_star))

          end do


          pre_dpeeq = -dpeeq

      !开始用牛顿迭代计算等效应变增量 The equivalent strain increment is calculated by Newton iteration

      do while(abs((pre_dpeeq-dpeeq)/pre_dpeeq) .GT. PRECISION_GAMMA)


          f = Sig1-mise+THREE*Lb*dpeeq+Taylor*Eta*Lb*Burger*

     1  (volFrac*dsqrt(rho_w)+(ONE-volFrac)*dsqrt(rho_c))*

     2  (((Taylor*dpeeq)/(Gamma0*dt))**(ONE/M_star))


          df = THREE*Lb + Taylor*Eta*Lb*Burger*

     1  (volFrac*dsqrt(rho_w)+(ONE-volFrac)*dsqrt(rho_c))*

     2  (((Taylor*dpeeq)/(Gamma0*dt))**((ONE/M_star)-ONE))*

     3  (Taylor/(Gamma0*dt))*(ONE/M_star)


          pre_dpeeq = dpeeq

          dpeeq = dpeeq - f/df


          !计数器

          jstep = jstep + ONE


          if(jstep .GT. MAXSTEP)then

              EXIT

          end if

      end do




          dpeeq_trial = -dpeeq


      !迭代计算试探位错密度与屈服应力

      !The dislocation density and yield stress were tested by iterative calculation

      !设置最多迭代步数,以防迭代不收敛时卡死程序

      !Set the maximum number of iteration steps to prevent the program from getting stuck when iteration does not converge

      kstep = ZERO      

      do while(kstep .LT. MAXSTEP)!迭代循环 iterative loop

          dpeeq_trail = dpeeq


          !体积分数 Volume Fraction

          volFrac = volFrac_infin + (volFrac_zero-volFrac_infin)*

     1  exp((-Taylor*(peeq+dpeeq))/Peeq_wave)


          !位错胞密度 Dislocation Wall Density

          rho_c = rhoc_old + (

     1  dsqrt(rhow_old/THREE)*((Taylor*Alpha_star)/Burger) - 

     2  (SIX*Beta_star*Taylor)/

     3  (Burger*d_old*((ONE-volFrac)**(ONE/THREE))) - 

     4  K_c*Taylor*rhoc_old*(((Taylor*dpeeq)/(dt*Gamma0))**(-ONE/N_c))

     5  ) * dpeeq


          !位错壁密度 Dislocation Cell Density

          rho_w = rhow_old + (

     1  (dsqrt(THREE*rhow_old)*Beta_star*Taylor*(ONE-volFrac))/

     2  (volFrac*Burger) + 

     3  (SIX*Beta_star*Taylor*((ONE-volFrac)**(TWO/THREE)))/

     4  (Burger*d_old*volFrac) - 

     5  K_w*Taylor*rhow_old*(((Taylor*dpeeq)/(dt*Gamma0))**(-ONE/N_w)) 

     6  ) * dpeeq


          !总位错密度 Total Dislocation Density

          Rho = volFrac*rho_w + (ONE-volFrac)*rho_c


          !晶胞直径表达式中的分子 Molecules in the cell diameter expression

          K_frac = K_infin + (K_zero-K_infin)*

     1  exp(-Beta*Taylor*(peeq+dpeeq))


          !晶胞直径 Dislocation Cell Diameter

          diameter = K_frac/dsqrt(Rho)


          !计算位错更新后的等效塑性应变增量

          !Calculate the equivalent plastic strain increment after dislocation updating

          !迭代常数声明

          !Iterative constant declaration

          jstep = ZERO

          dpeeq = (mise-Sig1)/(THREE*Lb) !由mise控制的假设迭代初值 mise controlled initial value of hypothetical iteration


          !计算迭代初值 Calculate the initial iteration value

          f = ONE

          do while(f .GT. ZERO)

              dpeeq = dpeeq*DPEEQ_SHRINK

              f = Sig1-mise+THREE*Lb*dpeeq+Taylor*Eta*Lb*Burger*

     1  (volFrac*dsqrt(rho_w)+(ONE-volFrac)*dsqrt(rho_c))*

     2  (((Taylor*dpeeq)/(Gamma0*dt))**(ONE/M_star))

          end do


          pre_dpeeq = -dpeeq

      !开始用牛顿迭代计算等效应变增量 

      !The equivalent strain increment is calculated by Newton iteration

      do while(abs((pre_dpeeq-dpeeq)/pre_dpeeq) .GT. PRECISION_GAMMA)


          f = Sig1-mise+THREE*Lb*dpeeq+Taylor*Eta*Lb*Burger*

     1  (volFrac*dsqrt(rho_w)+(ONE-volFrac)*dsqrt(rho_c))*

     2  (((Taylor*dpeeq)/(Gamma0*dt))**(ONE/M_star))


          df = THREE*Lb + Taylor*Eta*Lb*Burger*

     1  (volFrac*dsqrt(rho_w)+(ONE-volFrac)*dsqrt(rho_c))*

     2  (((Taylor*dpeeq)/(Gamma0*dt))**((ONE/M_star)-ONE))*

     3  (Taylor/(Gamma0*dt))*(ONE/M_star)


          pre_dpeeq = dpeeq

          dpeeq = dpeeq - f/df


          !计数器 counter

          jstep = jstep + ONE


          if(jstep .GT. MAXSTEP)then

              EXIT

          end if

      end do




          if(abs((dpeeq_trial-dpeeq)/dpeeq_trial)

     1  .GT. PRECISION_GAMMA)then

              dpeeq_trial = dpeeq

          else

              EXIT

          end if


      !计数器 counter

      kstep = kstep + ONE


      end do!迭代循环结束 End of iteration loop




      !屈服应力 Yeild Stress


      if(dpeeq .EQ. ZERO)then

          sig_y = mise

      else

          sig_y = Sig1 + (Taylor*Eta*Lb*Burger)*

     1  (volFrac*dsqrt(rho_w)+(ONE-volFrac)*dsqrt(rho_c))*

     2  (((Taylor*dpeeq)/(dt*Gamma0))**(ONE/M_star))

      end if


                  !根据迭代得出的等效塑性应变计算折减系数

                  !The reduction coefficient is calculated according to the equivalent plastic strain obtained by iteration

                  factor = sig_y/mise


                  !计算应力 Calculating Stress

                  stressNew(k,1) = s1*factor + s m

                  stressNew(k,2) = s2*factor + s m

                  stressNew(k,3) = s3*factor + s m

                  stressNew(k,4) = s4*factor

                  stressNew(k,5) = s5*factor

                  stressNew(k,6) = s6*factor


                  !计算能量 Calculating Energy

                  strainEnergy = HALF * (

     1  (stressNew(k,1)+stressOld(k,1))*strainInc(k,1) + 

     2  (stressNew(k,2)+stressOld(k,2))*strainInc(k,2) + 

     3  (stressNew(k,3)+stressOld(k,3))*strainInc(k,3) ) + 

     4  (stressNew(k,4)+stressOld(k,4))*strainInc(k,4) + 

     5  (stressNew(k,5)+stressOld(k,5))*strainInc(k,5) + 

     6  (stressNew(k,6)+stressOld(k,6))*strainInc(k,6)


                  plasEnergy = dpeeq*sig_y


                  enerInternNew(k) = enerInternOld(k) + 

     1  strainEnergy/density(k)


                  enerInelasNew(k) = enerInelasOld(k) +

     2  plasEnergy/density(k)


              end if

          stateNew(k,1) = sig_y

          stateNew(k,2) = peeq + dpeeq

          stateNew(k,3) = rho_w

          stateNew(k,4) = rho_c

          stateNew(k,5) = diameter

          stateNew(k,6) = volFrac

c

          stateNew(k,7) = Rho

          end do

      end if


      return

      end




来源:我的博士日记
ACTAbaqusSTEPSCONVERGEUM材料控制
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-08-09
最近编辑:7天前
此生君子意逍遥
博士 签名征集中
获赞 57粉丝 103文章 103课程 0
点赞
收藏
作者推荐

常用参数自动标定算法总结(单纯形,遗传算法,贝叶斯优化算法,粒子群算法等)

在本推文中介绍四类常用参数自动标定方案,分别是单纯形方案,粒子群方案,遗传算法方案,以及贝叶斯优化ego方案。单纯形方案实现最简单,适用于少参数,更窄的初始区间粒子群方案,遗传算法方案适用于多参数更大的空间适合全局搜索ego方案相比于其余三类方案的优势体现为EGO使用代理模型(如高斯过程回归)来预测目标函数,极大减少了实际函数评估次数。EGO在每一步都智能选择下一个最值得评估的位置(如使用EI, Expected Improvement)。这种探索与利用的动态平衡比GA中盲目变异与交叉更具理论指导。由于EGO最大化信息利用率,在样本数量极少的情况下表现优于GA。当样本数量少,且有约束优化时适合使用ego方法。例如在评估晶体塑性模型参数时不过这些优化算法经常容易陷入局部最优,即优化算法在搜索过程中被某个“看起来很好”的解吸引,不断围绕它进行微小改进,最终卡在“局部低谷”而不是“全局最低点”。一个更合理的做法是:使用粒子群和遗传算法在全局进行初始搜索,使用ego回归分析进行特定区间的优化,最后使用NM方案进行小区间寻找,如果陷入局部最优解,引入全局扰动方案或者爆炸方法跳出局部区间重新搜索即可。基于该思路编写对应的程序,实现参数的自动标定过程:这里实现对vpsc模型的复杂参数自动标定;这里使用相对复杂的镁合金为例,考虑3组滑移+一组孪晶,每个系统考虑tau_0,tau_s,h_0,一共12个待标定参数给定参数区间如下设置最大迭代次数为2000次,初始优化来自粒子群算法,依次是遗传算法单纯形算法和贝叶斯优化算法。以实验曲线和模拟曲线的标准差作为目标函数:迭代到270次时,模型与实现误差为0.00563此时陷入局部最优解;算法自动切换为遗传算法目标函数的动图如下:矫正结束后的实验曲线和模拟曲线如下所示:可以看到两条曲线几乎完全重合可以看到该方案得到的效果非常完美来源:我的博士日记

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