首页/文章/ 详情

开源Johnson-Cook损伤vumat子程序

3月前浏览1010

    Johnson-CooK (简称 JC)模型主要用于解决金属材料在强冲击、高应变率、剧烈温度变化下的复杂响应问题。在国防穿甲爆破、航空航天器外壳受撞击、汽车高速碰撞以及工业上的金属切削加工等极端工况下,金属材料在极短时间内会发生巨大的变形,并且伴随着由于剧烈摩擦和变形产生的局部高温。传统的弹塑性模型无法准确模拟这种“又快、又热、变形又大”的极端物理过程,而 JC 模型正是为了破解这些高能耗、高破坏性的力学难题而诞生的。

    该模型的核心思想是将复杂的金属材料行为进行“解耦”,认为材料的强度主要受到三个独立因素的叠加影响:应变硬化、应变率(变形速度)强化和热软化。简单来说,它认为金属材料在变形时有三个特点:一是随着变形量增大材料会越变越硬;二是变形发生得越快材料也会变得越硬;三是当变形产生的热量让材料温度升高时,材料就会变软。同时,模型还引入了热功转换机制,将材料变形产生的绝热塑性功直接转化为热量,并配合损伤退化和单元删除机制,从而能够逼真地模拟出材料从开始变形、变硬、变软,直到最终断裂撕裂的全过程。

    它之所以成为高应变率仿真领域的“长青树”,主要原因有三点。首先是参数物理意义明确且极易获取,相比其他复杂的力学模型,JC 模型的参数可以通过标准的高速拉伸或霍普金森压杆(SHPB)试验轻松测得,工程实用性极高。其次是计算效率与数值稳定性极佳,它的数学形式简洁高效,非常适合显式动力学子程序(如 VUMAT)进行大规模并行计算,不易发生数值发散。最后是完美闭环了“力-热-损伤”的耦合,它不仅能算应力,还能同步算出温度升高以及材料的受损程度,在模拟金属穿透、飞溅、切屑形成等断裂失效行为时,具有无与伦比的仿真精度和视觉逼真度。

这里分享一个经典的vumat子程序,方便大家学习Johnson-Cook的相关理论模型:
原始链接:https://github.com/mauroarcidiacono/Abaqus-VUMAT-Johnson-Cook/tree/main
代码由Arcidiacono, Mauro F. and Rahimi, Salaheddin等人开发































































































































































































































































































































































































































































































































########################################################################! User subroutine to model the Johnson-Cook plasticity, damage and the ! Taylor-Quinney conversion of mechanical work into heat during plastic! deformation.!! Abaqus version: Abaqus 2022! Intel Fortran Compiler 2021.11! Visual Studio 2019!! Author: Mauro Francisco Arcidiacono################################################################################################################################################! State Variable (SV) Definitions! SV1: initiation flag. If 0, first step, otherwise, 1.! SV2: effective plastic strain.! SV3: temperature.! SV4: Von Mises yield stress.! SV5: plastic strain increment.! SV6: parameter D of the Johnson-Cook damage model.! SV7: damage evolution parameter.! SV8: total number of iterations.! SV9: status of the element. If 1, the element is active, otherwise, the! element was deleted.! SV10 to SV16: stress tensor in the previous step.!! Note: this code was made to run the job using double precision due to! variable declaration inside the subroutines (real*8).!########################################################################

      subroutine vumat(! Read only (unmodifiable)variables -     1  nblock, ndir, nshr, nstatev, nfieldv, nprops, jInfoArray,     2  stepTime, totalTime, dtArray, cmname, coordMp, charLength,     3  props, density, strainInc, relSpinInc,     4  tempOld, stretchOld, defgradOld, fieldOld,     5  stressOld, stateOld, enerInternOld, enerInelasOld,     6  tempNew, stretchNew, defgradNew, fieldNew,! Write only (modifiable) variables -     7  stressNew, stateNew, enerInternNew, enerInelasNew )!      include 'vaba_param.inc'      parameter (i_info_AnnealFlag = 1     *     i_info_Intpt    = 2, ! Integration station number     *     i_info_layer  = 3, ! Layer number     *     i_info_kspt   = 4, ! Section point number in current layer     *     i_info_effModDefn = 5, ! =1 if Bulk/ShearMod need to be defined     *     i_info_ElemNumStartLoc   = 6) ! Start loc of user element number!      dimension props(nprops), density(nblock), coordMp(nblock,*),     1  charLength(nblock), dtArray(2*(nblock)+1), 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), jInfoArray(*)!      character*80 cmname      integer num_iter, max_num_iter, i, j      real*8 E, nu, A, B, n, m, Tm, Tr, C, epsilon_dot_zero, D1, D2,     1 D3, D4, D5, beta, Cp, D, pl_disp_failure, dmg_evol,     2 convergence_tolerance_factor, tolerance, mu, lambda,      3 eps, Temp, sigmaY, equiv_stress, pl_strain_inc, trace_strainInc,      4 eps_iter, equiv_stress_jc, f, pl_strain_inc_min,      5 pl_strain_inc_max, dWork, dPwork, rho, equiv_strain_fracture,     6 C_mat(ndir+nshr, ndir+nshr), stress_old(ndir+nshr),     7 trial_stress(ndir+nshr), dev_stress(ndir+nshr),      8 pl_strain_dir(ndir+nshr), C_PSD(ndir+nshr),      9 corrected_stress_iter(ndir+nshr)!      pointer (ptrjElemNum, jElemNum)      dimension jElemNum(nblock)!      lAnneal = jInfoArray(i_info_AnnealFlag)       iLayer = jInfoArray(i_info_layer)      kspt   = jInfoArray(i_info_kspt)      intPt  = jInfoArray(i_info_Intpt)      iUpdateEffMod = jInfoArray(i_info_effModDefn)      iElemNumStartLoc = jInfoArray(i_info_ElemNumStartLoc)      ptrjElemNum = loc(jInfoArray(iElemNumStartLoc))!
############################ Input parameters ############################
      ! Elastic properties      E = props(1)                          ! Young's Modulus      nu = props(2)                         ! Poisson's Ratio
      ! Johnson-Cook (JC) plasticity parameters      A = props(3)                          ! Parameter A      B = props(4)                          ! Parameter B      n = props(5)                          ! Parameter n       m = props(6)                          ! Parameter m      Tm = props(7)                         ! Melting temperature      Tr = props(8)                         ! Reference/Room temperature      C = props(9)                          ! Parameter C      epsilon_dot_zero = props(10)          ! Reference strain rate
      ! Johnson-Cook damage parameters      D1 = props(11)      D2 = props(12)      D3 = props(13)      D4 = props(14)      D5 = props(15)
      ! Plastic displacement at failure      pl_disp_failure = props(16)
      ! Taylor-Quinney (TQ) parameters      beta = props(17)                      ! Taylor-Quinney coefficient      Cp = props(18)                        ! Heat capacity      rho = props(19)                       ! Density
      ! Convergence tolerance for the increment of effective strain calculation      convergence_tolerance_factor = props(20)      tolerance = E*convergence_tolerance_factor
      ! Maximum number of iterations      max_num_iter = props(21)

############################ Elasticity Matrix ############################
      ! Lame parameters      ! Lame first parameter      lambda = (E*nu)/((1.d0 + nu)*(1.d0 - 2.0d0*nu))        ! Lame second parameter        mu = E/(2.0d0*(1.d0 + nu))
      ! Elasticity matrix (C_mat)      ! Linear elastic, homogeneous and isotropic material       ! Initialize the elasticity matrix to zero      C_mat = 0.d0
      do i = 1, ndir          do j = 1, ndir              if (i == j) then                  C_mat(i, j) = lambda + 2.d0*mu              else                  C_mat(i, j) = lambda              end if          end do       end do       do i = ndir + 1, ndir + nshr          C_mat(i, i) = 2.d0*mu      end do 

###########################################################################################################      ####################### Loop through each integration point to perform computations ##################################################################################################################################  
      ! Global loop starting point -> loops through each integration point of the model      ! The index of the integration points is i      do i = 1, nblock
          ! ############################## Initial state ###############################             if (stateOld(i, 1) == 0.d0) then
              ! Compute Hooke's Law as a function of the strain increment              ! Trace calculation (EPSILON_kk)              trace_strainInc = sum(strainInc(i, 1:ndir))
              ! Calculate the direct components              stressNew(i, 1:ndir) = stressOld(i, 1:ndir) +       1        lambda*trace_strainInc + 2.d0*mu*strainInc(i, 1:ndir)
              ! Calculate the shear components              stressNew(i, ndir+1:ndir+nshr) = stressOld(i, ndir+1:ndir+nshr) +     1        2.d0*mu*strainInc(i, ndir+1:ndir+nshr)  
              stateNew(i, 1) = 1.d0           ! Initiation flag              stateNew(i, 2) = 0.d0           ! Equivalent plastic strain              stateNew(i, 3) = Tr             ! Initial temperature              stateNew(i, 4) = 0.d0           ! Yield stress              stateNew(i, 5) = 0.d0           ! Plastic strain increment              stateNew(i, 6) = 0.d0           ! Parameter D              stateNew(i, 7) = 0.d0           ! Damage evolution parameter              stateNew(i, 8) = 1              ! Total number of iterations              stateNew(i, 9) = 1              ! Element status
              ! Store the stress tensor in SDVs for damage evolution computation              do j = 1, ndir+nshr                  stateNew(i, j + 9) = stressNew(i, j)              end do
          ! ############################ From step 2 onward ############################              else
              eps = stateOld(i, 2)                                      ! Previous effective plastic strain              Temp = stateOld(i, 3)                                     ! Temperature              sigmaY = stateOld(i, 4)                                   ! Yield stress              D = stateOld(i, 6)                                        ! Parameter D              dmg_evol = stateOld(i, 7)                                 ! Damage evolution parameter              trial_stress = 0.d0                                       ! Trial total stress with increment
              ! stress_old stores the stress tensor in the previous step              if (D < 1.d0) then                  stress_old(1:ndir+nshr) = stressOld(i, 1:ndir+nshr)                     else                  stress_old(1:ndir+nshr) = stateOld(i, 10:ndir+nshr+10)                  end if
              ! Compute Hooke's Law as a function of the strain increment              ! Calculates the stress trial increment tensor assuming a pure elastic response              call elastic_stress(strainInc(i, 1:ndir+nshr), trial_stress,       1                            stress_old(1:ndir+nshr), lambda, mu, ndir, nshr) 
              ! Start the calculations to obtain the direction and magnitude of the              ! plastic strain increment              ! Direction = df/dSigma              ! Magnitude = dLambda (plastic multiplier)              ! dEpsilon^p = dLambda*df/dSigma = dp*3/2*DevStress/EquivalentStress              call equivalent_stress(equiv_stress, trial_stress,      1                               dev_stress, ndir, nshr)
              ! Plastic strain direction              if (equiv_stress /= 0then                  pl_strain_dir = (3.d0*dev_stress)/(2.d0*equiv_stress)              else                  pl_strain_dir = 0              end if
              ! Elasticity matrix C times the plastic strain direction to calculate              ! later the plastic corrector              C_PSD = matmul(C_mat, pl_strain_dir)
              ! Initial value of the strain increment              pl_strain_inc = 0.d0                                      ! Initial plastic strain increment              pl_strain_inc_min = 0.d0                                  ! Minimum plastic strain increment              pl_strain_inc_max = equiv_stress/(2.d0*mu)                ! Maximum plastic strain increment

              !##################################################################################################              ! ######## Iteration to obtain the initial plastic strain increment (pl_strain_incstarts ########              ! Return mapping algorithm
              num_iter = 0    ! number of iterations
              do while (num_iter <= max_num_iter
                  ! Iteration control                  num_iter = num_iter + 1                  if (num_iter == max_num_iterthen                      print*, 'ERROR - too many iterations | iter = ', num_iter                      call XPLB_EXIT                   end if
                  ! Iteration effective plastic strain = effective plastic strain + increment                  eps_iter = eps + pl_strain_inc                    ! Effective plastic strain increment rate                    eps_rate = pl_strain_inc/dtArray(1)
                  ! Compute the stress using the plastic corrector for this iteration                   ! (corrected_stress_iter)                  corrected_stress_iter = trial_stress - pl_strain_inc*C_PSD
                  ! Calculate the equivalent stress with the corrected stress in this                  ! iteration                  call equivalent_stress(equiv_stress, corrected_stress_iter,      1                                   dev_stress, ndir, nshr)
                  ! Calculate the Johnson-Cook equivalent stress                  call johnson_cook_plasticity(eps_iter, A, B, n, m,      1                                         Tm, Tr, Temp, C,     2                                         epsilon_dot_zero,      3                                         eps_rate, equiv_stress_jc)
                  ! If the calculated JC is less than the previous onetake the previous one                  ! as equivalent yield stress                  if (equiv_stress_jc < sigmaYthen                      equiv_stress_jc = sigmaY                  end if
                  ! Compare the calculated JC stress with the equivalent stress resulting from                  ! the corrected stress stateThese two values should be as close as possible                  ! within the specified tolerance to obtain the plastic strain increment for a                  ! JC material                  f = equiv_stress - equiv_stress_jc
                  if (abs(f) < tolerancethen                      exit                  end if
                  ! If there is no plastic strain increment and the JC yield stress is bigger                  ! than the equivalent stressthe stress state is elastic                  if ((pl_strain_inc == 0.d0) .and. (f < 0.d0)then                      exit                  end if
                  ! Update the min and max plastic strain increment limits                  if ((f >= 0.d0) .and. (pl_strain_inc >= pl_strain_inc_min)then                      pl_strain_inc_min = pl_strain_inc                    end if    
                  if ((f < 0.d0) .and. (pl_strain_inc < pl_strain_inc_max)then                      pl_strain_inc_max = pl_strain_inc                    end if
                  ! Update the plastic strain increment                  pl_strain_inc = 0.5d0 * (pl_strain_inc_max + pl_strain_inc_min)
                  ! Update the pl_strain_inc to ensure continuity across increments and to                   ! improve the initial guess                  if (num_iter == 1then                      pl_strain_inc = stateOld(i, 5)                  end if
              end do
              ! Save the newly calculated stress              stressNew(i, 1:ndir+nshr) = corrected_stress_iter(1:ndir+nshr)
              ! Store the stress tensor in SDVs for damage evolution computation              do j = 1, ndir+nshr                  stateNew(i, j + 9) = stressNew(i, j)              end do
              ! Calculate the work increment              dWork = dot_product(0.5d0 * (corrected_stress_iter(1:ndir+nshr) + stress_old(1:ndir+nshr)),      1                            strainInc(i, 1:ndir+nshr))
              ! Calculate the plastic work increment              dPwork = 0.5d0 * pl_strain_inc * equiv_stress
              ! Calculate the internal energy per unit mass              enerInternNew(i) = enerInternOld(i) + dWork/rho
              ! Calculate the dissipated inelastic energy per unit mass              enerInelasNew(i) = enerInelasOld(i) + dPwork/rho
              ! Evaluate the equivalent strain at fracture              call johnson_cook_damage(equiv_strain_fracture, equiv_stress, Tm, Tr, D1, D2,     1                                 D3, D4, D5, Temp, epsilon_dot_zero, eps_rate,      2                                 corrected_stress_iter, ndir, nshr)
              ! Update the parameter D of the Johnson-Cook damage model              if (equiv_strain_fracture /= 0.d0then                  D = D + abs(pl_strain_inc / equiv_strain_fracture)              end if
              ! Fracture is allowed to occur when D = 1.0              if (D >= 1.d0then                  D = 1.d0                  dmg_evol = dmg_evol +      1            abs(pl_strain_inc * charLength(i) / pl_disp_failure)                  if (dmg_evol >= 1.d0then                      dmg_evol = 1.d0                  end if                  stressNew(i, 1:ndir+nshr) = (1.d0 - dmg_evol)*stressNew(i, 1:ndir+nshr)              end if
              ! Update the state variables              stateNew(i, 1) = 1.d0                                                           ! Initiation flag              stateNew(i, 2) = eps_iter                                                       ! Equivalent plastic strain              stateNew(i, 3) = Temp + beta*dPwork/rho/Cp                                      ! Temperature              stateNew(i, 4) = equiv_stress_jc                                                ! Yield stress              stateNew(i, 5) = pl_strain_inc                                                  ! Plastic strain increment in the step              stateNew(i, 6) = D                                                              ! Parameter D              stateNew(i, 7) = dmg_evol                                                       ! Damage evolution parameter              stateNew(i, 8) = stateOld(i, 8) + num_iter                                      ! Total number of iterations
              if (dmg_evol >= 1.d0then                  stateNew(i, 9) = 0    ! Delete element              else                  stateNew(i, 9) = 1    ! Active element              end if
          end if
      end do
      return      end
Additional subroutines      include 'utils.for'       subroutine elastic_stress (strainInc, stressNew, stressOld,     1 lambda, mu, ndir, nshr)      ! This subroutine calculates the elastic stress tensor in Voigt      ! notation using a strain tensorThe calculation is done according       ! to Hooke's law.      ! SIGMA_ij = lambda*EPSILON_kk*KRONECKERDELTA_ij + 2*mu*EPSILON_ij
          integer ndirnshr          real*8 strainInc(ndir+nshr), stressNew(ndir+nshr),       1    stressOld(ndir+nshr), lambdamutrace_strainInc 
          ! Trace calculation (EPSILON_kk)          trace_strainInc = sum(strainInc(1:ndir))
          ! Calculate the direct components          stressNew(1:ndir) = stressOld(1:ndir) +       1    lambda*trace_strainInc + 2.d0*mu*strainInc(1:ndir)
          ! Calculate the shear components          stressNew(ndir+1:ndir+nshr) = stressOld(ndir+1:ndir+nshr) +     1    2.d0*mu*strainInc(ndir+1:ndir+nshr)
      return      end

      subroutine equivalent_stress (equiv_stress, stress_tensor,      1 dev_stress, ndir, nshr)      ! This subroutine calculates the equivalent Von Mises stress             ! from a Voigt notation stress tensor.
          integer ndirnshr          real*8 stress_tensor(ndir+nshr), hyd     1    dev_stress(ndir+nshr), equiv_stress
          ! Calculate the hydrostatic component of the stress tensor          hyd = sum(stress_tensor(1:ndir))/3.d0          ! Calculate the deviatoric tensor          dev_stress(1:ndir) = stress_tensor(1:ndir) - hyd          dev_stress(ndir+1:ndir+nshr) = stress_tensor(ndir+1:ndir+nshr)
          ! Compute the equivalent Von Mises stress          ! stressVM = sqrt(3/2 * dev_stress : dev_stress)          equiv_stress = sqrt(3.d0/2.d0 *(dev_stress(1)**2.d0 +      1    dev_stress(2)**2.d0 + dev_stress(3)**2.d0 +      2    2.d0*dev_stress(4)**2.d0 + 2.d0*dev_stress(5)**2.d0 +          3    2.d0*dev_stress(6)**2.d0))
      return      end

      subroutine johnson_cook_plasticity(eps_iter, A, B, n, m, Tm, Tr,      1 T, C, epsilon_dot_zero, eps_rate, equiv_stress_jc)      ! This subroutine calculates the Von Mises stress using the       ! Johnson Cook equation
          real*8 eps_iterABnmTmTrTC,       1    epsilon_dot_zeroeps_ratehomologous_Temp     2    equiv_stress_jc  
          if (T < Trthen              homologous_Temp = 0.d0          else if (T > Tmthen              homologous_Temp = 1.d0          else              homologous_Temp = (T - Tr)/(Tm - Tr)          end if
          if (eps_rate <= 1D-12then              eps_rate = epsilon_dot_zero          end if
          if (eps_iter <= 1D-12then              eps_iter = 0.d0          end if
          equiv_stress_jc = (A + B*eps_iter**n) *     1    (1 + C*log(eps_rate/epsilon_dot_zero)) *     2    (1 - homologous_Temp**m)
      return      end

      subroutine johnson_cook_damage(equiv_strain_frac, equiv_stress,     1 Tm, Tr, D1, D2, D3, D4, D5, T, epsilon_dot_zero, eps_rate,     2 stress_tensor, ndir, nshr)      ! This subroutine calculates the equivalent strain for fracture      ! for the Johnson-Cook damage model
          integer ndirnshr          real*8 TmTrD1D2D3D4D5T,       1    epsilon_dot_zeroeps_ratehomologous_Temp     2    pressure_stress_ratioequiv_strain_frac,     3    stress_tensor(ndir+nshr), hydequiv_stress
          if (T < Trthen              homologous_Temp = 0.d0          else if (T > Tmthen              homologous_Temp = 1.d0          else              homologous_Temp = (T - Tr)/(Tm - Tr)          end if
          if (eps_rate <= 1D-12then              eps_rate = epsilon_dot_zero          end if
          ! Calculate the hydrostatic component of the stress tensor          hyd = sum(stress_tensor(1:ndir))/3.d0
          ! Calculate the pressure stress ratio          if (equiv_stress == 0.d0then              pressure_stress_ratio = 0.d0          else              pressure_stress_ratio = hyd/equiv_stress          end if
          equiv_strain_frac = (D1 +      1    D2*exp(-D3*pressure_stress_ratio))*     2    (1 + D4*log(eps_rate/epsilon_dot_zero))*     3    (1 + D5*homologous_Temp)
      return      end
作者比较了使用代码计算和abaqus内置的Johnson-Cook模型计算响应的比较(与abaqus内置模型保持一致的精度):
来源:我的博士日记
ACTMechanicalAbaqusDeform显式动力学断裂碰撞二次开发航空航天汽车CONVERGE理论材料试验
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2026-05-27
最近编辑:3月前
此生君子意逍遥
博士 签名征集中
获赞 62粉丝 130文章 153课程 0
点赞
收藏
作者推荐

PMS | 综述: 面向适氢结构功能一体化合金设计的多尺度计算

导读尽管先进适氢金属材料(AHMM)在抗氢、储氢、氢敏已取得诸多进展,但承载结构合金的氢脆问题、功能储氢合金的能力和循环充放限制仍然存在明显挑战,且受服役环境影响显著;现有计算模拟方法虽阐明了氢与晶体缺陷的基础作用,却缺乏对合金材料与氢相互作用过程中力学、化学、微观组织耦合行为的系统研究,难以支撑工程应用中的材料选型与寿命评估。本文聚焦合金材料适氢性能预测的核心难题,将AHMM分为氢暴露结构金属(HESMs)、氢结合结构金属(HISMs)、氢势功能金属(HPFMs)三类,梳理了多尺度计算设计体系,提出需根据不同材料类别差异化组合模拟方法,并指出未来需完善材料数据库、强化模型验证与实验协同,推动耐氢结构功能合金计算设计走向工程实用化,为AHMM研发提供理论参考。文章封面 部分截图 部分内容 图文解读图1清晰呈现本研究的核心框架及三类氢相关金属材料的具体应用场景:其中a为研究整体流程图,直观展示了从材料设计、计算模拟到性能验证的完整逻辑;b为HESMs的典型应用实例,如航空涡轮发动机等需在含氢环境中稳定运行的设备;c为HISMs的应用场景,包括金属氢化物、泡沫铜储罐等储氢设备;d为HPFMs的应用示例,如用于储氢系统的金属-石墨交替双极板,清晰展现各类材料的实际应用场景与功能定位。 图1 氢能应用中金属材料的多尺度表征涉及多个领域:(a) 本文概述不同计算设计领域中金属与氢的相互作用及储氢行为;(b) 航空涡轮发动机为 HESMs;(c) 金属氢化物与泡沫铜储罐为HISMs;(d) 金属 - 石墨交替双极板及其截面为 HPFMs。微观组织会显著影响氢的吸附、扩散与释放,通过晶粒细化、相比例调控和缺陷调控,可兼顾储氢能力与抗氢脆性能。表 1 系统总结了三类AHMM的氢作用机理、关键性能及适配计算方法。表1 AHMM与氢的相互作用总结 图 2a 示意了 Mg₂Ni 合金放氢过程的结构–功能关联与氢演变,金属氢化物(如 MgH₂、LaNi₅H₆)作为储氢功能材料依靠可逆反应储放氢,其储氢系统为集成配套组件的工程装置,二者设计重点不同;微观缺陷调控储氢表面反应,镁合金特殊晶界可降低氢解离能垒,晶界调控是优化功能金属表面性能的有效手段,此外可结合氢作用、电荷特征分析各类先进临氢金属材料,并通过多尺度耦合计算研究多晶材料氢输运行为(图 2b、2c)。 图 2:(a) 镁镍功能金属放氢 7000 秒后的储氢行为模拟计算结果;(b) 中锰钢马氏体与奥氏体结构的氢原子分布、电荷重排及差分电荷密度第一性原理计算结果;(c) 结合相场、密度泛函与分子动力学方法,整合原子尺度数据,完成多晶二氧化钛氢输运的多尺度模拟。密度泛函理论(DFT)作为氢能材料设计的核心手段,可解析化学储氢合金的键合与表面相互作用,针对镁基、钯基等合金揭示氢相关特性并指导材料开发,第一性原理计算还能关联电子结构与宏观性能、计算合金相生成焓、表征氢在金属表界面的吸附行为,依托金属氢化物稳定性与成分结构的关联优化储氢性能,适配三类临氢金属材料研发需求,为多尺度模拟提供基础参数,同时可搭建量子尺度与宏观性能的关联,结合相关理论参数预测合金氢相关动态指标,文中图 3a-e 分别展示了其相关作用机理、优化效果及计算结果。 图 3 基于 DFT 可视化不同场景下的氢 - 金属相互作用:(a) 金属表面氢吸附电荷分布;(b) 氢原子重叠的电子密度,体现共价键特征;(c) 电子局域化函数,表征键合与电子分布;(d) 储氢功能金属的优化晶体结构;(e) 三元合金焓值曲面的内能与生成焓计算。探究氢的输运及其对先进临氢金属材料的影响,对储氢技术发展和氢脆抑制至关重要;分子动力学(MD )与动力学蒙特卡洛( KMC) 是互补的核心模拟方法,MD 擅长解析原子尺度氢的扩散、缺陷作用及氢脆机制,获取关键参数但计算受限,KMC 依托相关参数模拟长时尺度氢行为、预测材料长期演化,二者耦合实现跨尺度仿真,广泛应用于各类临氢材料研究,可解析多种氢致相关问题,模拟精度受原子作用势等限制,图4 展示了二者的相关模拟应用。 图 4 为不同材料体系氢作用的多尺度模拟结果:(a) KMC 模型构建 NiO 与 YSZ 三维晶粒组织,作为氢还原与烧结模拟初始结构;(b) MD 模拟 430 不锈钢中氢原子与螺位错的时效演化作用;(c) 结合 KMC 分析氢渗入后纯铁单晶拉伸过程的裂纹扩展与应力分布。晶体塑性模型(CPM)可有效表征多晶金属在氢作用下的非均匀变形与氢脆行为,纳入氢相关本构规律后,能预测局部应力集中、裂纹萌生与氢致损伤;图 5 结合实例直观呈现:氢会诱发 316L 不锈钢滑移局部化,可提高材料滑移系剪切应变率,降低合金界面能并加速裂纹扩展,同时显著影响镍、钯单晶的强度与加工硬化性能,为解析面心立方金属氢脆机理提供重要模拟手段。 图 5 基于CPM分析面心立方金属的氢致作用:(a) 结合金相、电子背散射衍射,得到 316L 不锈钢滑移系塑性应变与晶体取向分布;(b) 考虑氢效应,修正特定滑移系的剪切应变率本构关系;(c) 氢降低界面能,诱发 Al-Zn-Si 合金裂纹扩展,展示不同应变下的三维晶粒结构与取向变化;(d) 对比氢对镍、钯单晶剪切应力、拉伸应力及加工硬化率的影响。人工智能结合 DFT、MD 等计算方法,可助力结构材料与储氢功能金属的研发。如图 6a 所示,XPEAK智能模拟平台可减少实验试错,定向优化材料动力学性能、指导理性设计。人工智能结合实验验证,是加速固态储氢材料实用化研发的有效途径。图 6b 展示了神经网络、支持向量机、决策树、线性回归等算法的单独应用,及其与各类计算方法的耦合联用模式。 图 6:(a) 基于 XPEAK 统计数据库元素组成,标注各元素出现频次;(b) 机器学习算法应用于氢能材料多类研究方向,结合仿真计算与材料性能,助力固态储氢体系研发。多尺度耦合仿真方法将量子力学、随机模拟、热力学与连续介质力学相结合,统一应用于钢、锆基、镍基合金体系(图 7)。原子模拟提供微观机理参数,DFT 可计算电子结构能量、氢 - 缺陷结合能、固溶热力学与氢化物生成焓,并揭示氢扩散中的量子隧穿效应;MD 则表征氢与缺陷的动态作用、短程扩散及氢化物早期形核过程。DFT 与 MD 耦合研究还阐明了空位 - 氢作用机制,明确氢含量对空位形成能及缺陷形貌的调控规律。 图 7 多模型耦合仿真预测金属氢行为:(a) 相图计算结合 DFT,分析双相不锈钢钝化膜电子特性与氢脆关联;(b) 元素掺杂调控结构金属,优化氢渗透性能;(c) CPM 与 PFM 联用,研究充氢镍合金的断裂演化;(d) PFM 耦合 CPM,模拟锆合金氢致损伤演变;(e) DFT 结合有限元,计算镍基结构金属氢致结合能衰减。图8系统展示AHMMs多尺度仿真全链条成果与现存挑战:a、b、c 分别直观呈现氢致晶格演变、氢化物相变规律及晶界氢敏感特性,验证了多尺度耦合方法在微观机理解析上的优势;d 揭示跨尺度计算误差、算力受限等现实短板;e 明确指出整合多种计算模拟策略与实验校验的一体化跨尺度框架,是提升材料预测精度、推动储氢合金定向设计的核心发展方向。 图 8 多方法耦合计算模拟结果:(a) 高性能储氢功能金属材料的晶格氢化改性机制;(b) 金属氢化物核壳结构形成过程计算;(c) 不同倾斜角度下稳定晶界构型,体心立方配位原子为蓝色,其余为白色;(d) 相图计算耦合相场、晶体塑性模拟,展示氢在高熵结构金属中的气泡效应;(e) 融合密度泛函理论、量子机器学习原子势、蒙特卡洛 / 分子动力学与实验验证的跨尺度计算设计框架。多尺度耦合模拟是对真实物理体系的必要简化与近似表征,过程中必然存在信息损耗。如图9所示,通过不确定性量化、优化采样算法及创新耦合策略,精准识别、定量评估并合理降低这类信息损失,与单一计算方法的迭代优化同等关键。 图9 AHMM设计用多尺度计算方法的关键对比图10完整展示了当前氢能金属材料研究的现存瓶颈与优化方向:a 至 e 依次反映合金成分效应、纳米氢分布、位错作用、光谱干扰及实验表征局限等理论模拟与实验验证的突出问题;f 提出微观结构调控与结构功能一体化设计策略,通过优化组织形貌协同兼顾氢吸附存储与塑性变形能力,结合多尺度仿真、先进实验技术与智能算法,可有效突破现有研究短板,助力高性能抗脆、长寿命氢能金属材料开发。 图10 AHMMs的多尺度表征策略:(a) 三维原子探针重构图(C 蓝、D 红)及 Fe、C、D 元素分布,揭示氢相关研究必要性;(b) 高分辨 TEM 显示室温下氢占据析出相及相界行为;(c) 电子通道衬度成像观测充氢后 AHMM 中位错运动;(d) 二次离子质谱表征金属污染及充氢前后能谱变化;(e) 电子背散射衍射与核平均取向差图,展示氢致退火态、5%/15% 预应变金属失效差异;(f) 耦合模拟方法需重点研究的氢作用相关未来方向适氢合金的精准设计,核心难点在于多尺度计算参数的逐级实验验证,而非仅考核最终性能。可靠的多尺度模型,其原子能级能量、介观动力学系数、宏观本构关系等基础参数,都必须依托实验数据校准。图 11 将各类仿真输出与对应实验表征手段一一关联,实现模型校准直观可追溯,全面提升材料预测设计体系的可靠性。 图11 计算模拟结果与对应实验表征技术关联路线图图12展示了仿真–实验–算法闭环迭代的材料自主优化设计框架,结合计算模型技术成熟度分级标准,以实验数据持续校准多尺度模拟、机器学习补齐研究盲区,打通理论研究与工程应用的壁垒,推动临氢合金的高效、可靠定向研发。 图12 面向 AHMM 设计融合先进表征技术未来方向:(a) 同步辐射 X 射线衍射表征晶格应变与织构演变;(b) 原位中子衍射研究充氢对堆垛层错的影响文章信息简而言之,最优计算策略取决于材料类别与服役挑战。对于HESMs,氢脆(HE)可以通过密度泛函理论(DFT)/分子动力学(MD)进行氢-缺陷定量表征,并借助晶体塑性模型(CPM)/相场法(PFM)/有限元法(FEM)建立失效模型,优先开展缺陷工程调控。同时,化学-力学计算流与基准数据集亦为裂纹预测验证所必需。对于HISMs,基于FEM/CPM的应力分析必须与长期扩散及界面稳定性模型(如动力学蒙特卡洛(KMC)、相图计算(CALPHAD和PFM)耦合,聚焦应力-扩散耦合行为。面向物理储氢,需建立融合氢传输、界面稳定性与循环损伤的环境感知本构模型,并与高压、低温条件下的实验相关联。对于HPFMs,通过DFT/机器学习(ML)进行电子结构筛选以驱动材料发现,同时采用MD/KMC优化传输动力学。研究重心转向通过氢化物形核与生长的介观尺度模型实现功能耐久性,兼顾热力学与微观组织架构设计,以缓解化学储氢中的退化问题。尽管存在通用的计算模拟方法集,但其集成方式必须针对具体材料类别进行定制。文章信息主要作者情况:吴仁豪(共同第一作者,通讯作者), Zaigham Saeed Toor(共同第一作者), Hyoung Seop Kim(通讯作者)通讯作者单位:1.韩国浦项科技大学金属与环保材料研究所2.日本东北大学材料科学高等研究所文章标题:Multiscale Computational Design of Hydrogen-Compatible Integrated Structural–Functional Alloys期刊名称:Progress in Materials Science文章链接:https://doi.org/10.1016/j.pmatsci.2026.101727来源:我的博士日记

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