ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ABAQUS单晶塑性UMAT从理论到代码实现:滑移系、硬化模型与调试指南

ABAQUS单晶塑性UMAT从理论到代码实现:滑移系、硬化模型与调试指南 1. 单晶塑性UMAT到底在算什么如果你也在搞晶体塑性多半是被两件事逼过来的一是商业有限元软件自带的材料库里面找不到你想要的那个“单晶行为”二是你查阅文献时发现几乎所有做微观组织—宏观性能关联的研究都绕不开一套自己写的本构子程序。单晶塑性UMAT本质上是把你从固体力学课本里学到的晶体塑性理论一段一段翻译成ABAQUS能读懂的语言交给求解器在每一个积分点上去执行。先说清楚它解决什么问题。宏观的J2塑形只关心等效应力达到屈服面之后怎么流动材料是“各向同性”的不分晶粒。但实际金属是多晶体每个晶粒有自己的取向滑移只能在特定的滑移面上沿特定方向发生。单晶塑性UMAT干的事情就是在每一个积分点上基于当前晶粒的取向、当前应力状态、当前硬化状态计算新的应力和切线刚度矩阵把“晶粒尺度”的变形机理嵌入到“宏观有限元”的框架里。这套东西适合谁学如果你正在做细晶强化、织构演化、疲劳裂纹萌生、微压痕、焊接接头各区域力学行为差异这类研究单晶塑性UMAT几乎是绕不开的。当然如果你是纯做实验的可能用不上这套东西但如果你想理解那些“玄学”的各向异性现象是怎么从晶粒层面冒出来的学一学也很有价值。我当年踩了不少坑最大的体会是写UMAT之前一定要把连续介质力学的基础再过一遍至少要把“变形梯度→速度梯度→率本构→增量积分”这条线打通。否则就算你拿到一份能跑的UMAT代码也改不出自己想要的东西。2. 理论框架和几个关键选择2.1 运动学变形梯度的乘法分解是绕不开的起点单晶塑性本构的基石是Taylor在1938年提出的变形梯度乘法分解F Fe · Fp物理含义很直观总变形梯度F可以看成两部分串联——Fe是晶格的弹性变形加刚体转动Fp是晶体通过滑移产生的塑性剪切变形。注意这里的“串联”是通过矩阵乘法实现的顺序很重要Fe在前Fp在后因为先滑移后晶格畸变还是先晶格畸变后滑移最终构型完全不一样。为什么要拆成这两部分因为塑性只改变晶体的形状不改变晶格的取向而弹性变形和晶格转动改变了晶格取向从而影响了后续滑移系的分解剪应力。你后面要算滑移系的Schmid因子要知道晶粒取向随变形怎么演化都离不开这个分解。实际写代码时不会直接用F做积分变量而是用速度梯度LL Ḟ · F⁻¹ Le Fe · Lp · Fe⁻¹这个式子看起来绕但它在数值实现上的意义是我们把“变形历史”分成弹性部分和塑性部分弹性部分用胡克定律关联应力率塑性部分由各个滑移系的剪切率叠加而成。2.2 流动法则剪切率不是猜出来的有了运动学框架接下来要回答的问题是给定当前应力状态各滑移系以多大的速率滑移这就是流动法则。最常用的率相关模型是Power Lawγ̇ᵃ γ̇₀ · (|τᵃ| / gᵃ)ⁿ · sign(τᵃ)其中τᵃ是第a个滑移系上的分解剪应力Resolved Shear Stressgᵃ是该滑移系当前强度γ̇₀是参考剪切应变率n是率敏感指数。这里三个参数各有各的门道γ̇₀参考剪切应变率。它和加载的应变率在一个量级附近即可不必太纠结通常取0.001或0.01/s。n率敏感指数。n越大材料越接近率无关但n太大会导致方程高度非线性收敛困难。金属常温下n一般在20~100之间但UMAT里常见取值是10~30再大就非常难收敛了。这算是一个数值妥协很多文献里也明说用的是较低n值来改善收敛性。gᵃ当前滑移系强度也就是滑移阻力与位错密度、晶粒尺寸直接相关通过硬化律演化。2.3 硬化模型Voce硬化是新手最稳的选择硬化模型描述的是gᵃ如何随累积滑移演化。常用的有线性硬化、幂硬化、Voce饱和硬化。我最推荐新手从Voce硬化入手因为参数少、物理意义直观、数值稳定。Voce模型的形式是ġᵃ h₀ · (1 - gᵃ / g∞)ᵃ · Σ|γ̇ᵇ|这里h₀是初始硬化率g∞是饱和强度a是硬化指数Σ|γ̇ᵇ|是所有滑移系的累积剪切率之和也有人只取同滑移系的看你怎么定义。这里还需要决定是否考虑潜在硬化Latent Hardening即一个滑移系的滑移导致其他滑移系强度也上升。最简单的做法是引入相互作用矩阵q让塑性剪切率按qᵃᵇ矩阵加权叠加到所有滑移系的硬化增量上。对于FCC晶体12个滑移系之间的相互作用分共面、共滑移方向、共滑移面等几类q值大致在1~1.4之间。新手阶段建议全部设成1.0也就是各向同性硬化先把流程跑通再说。2.4 滑移系统FCC和HCP是两种完全不同的难度晶体塑性第一步是定义滑移系统。这是“晶体学”和“力学”的交汇点也是新手第一个容易出错的地方。对于FCC面心立方晶体{111}面有4个每个面上有3个110方向共12个滑移系统。每一个滑移系统由滑移面的法向量n和滑移方向m唯一确定。写UMAT时这两种向量都要设定在晶体的局部坐标系下。HCP密排六方晶体的滑移系统就复杂得多了基面滑移、柱面滑移、锥面滑移还有不同的滑移方向。不同滑移系的临界分剪应力差异非常大而且硬化的耦合关系也很复杂。如果你的研究体系是钛合金、镁合金这类HCP金属建议不要一上来就挑战全滑移系模型先只考虑最容易激活的基面柱面滑移跑通了再逐步加锥面。3. UMAT框架剖析与代码实现3.1 UMAT的输入输出先搞清楚ABAQUS的UMAT接口长这样以Standard为例SUBROUTINE UMAT(STRESS, STATEV, DDSDDE, SSE, SPD, SCD, 1 RPL, DDSDDT, DRPLDE, DRPLDT, 2 STRAN, DSTRAN, TIME, DTIME, TEMP, DTEMP, PREDEF, DPRED, CMNAME, 3 NDI, NSHR, NTENS, NSTATV, PROPS, NPROPS, COORDS, DROT, PNEWDT, 4 CELENT, DFGRD0, DFGRD1, NOEL, NPT, LAYER, KSPT, KSTEP, KINC)要理解的关键变量不多但每个都必须吃透STRESS当前积分点的应力张量进入子程序时是增量步开始的值出来时更新为增量步结束的值。DDSDDEJacobian矩阵即∂Δσ/∂Δε求解器用它来建立整体刚度矩阵决定了收敛速度和解的正确性。STATEV状态变量数组用来存每个积分点上需要“记住”的历史量。DFGRD0/DFGRD1分别是增量步开始和结束的变形梯度。这两个变量是单晶塑性UMAT的关键输入很多实现用它们而不是应变增量来驱动计算。DROT增量步内的材料转动增量。大变形分析中晶体取向的旋转就靠它初次实现时可以先忽略只用于小变形。PNEWDT时间增量建议值。如果子程序内部计算不收敛或者预测下一步难以收敛可以把它设置成小于1的值ABAQUS会自动减小增量步。3.2 从应变驱动到变形梯度驱动ABAQUS内置的弹塑性UMAT教科书模板几乎都是以应变增量DSTRAN为驱动变量的。但晶体塑性UMAT绝大多数文献实现都采用变形梯度驱动也就是利用DFGRD0和DFGRD1来计算速度梯度LL (DFGRD1 - DFGRD0) / DTIME · DFGRD0⁻¹为什么不用应变增量因为大变形下应变增量本身没有明确定义有限应变不能简单相加而变形梯度的乘法分解是精确的。此外晶体塑性的本构方程天然建立在变形梯度的框架下用变形梯度驱动不需要在UMAT里去转换各种应变的定义。但这里有个问题ABAQUS传给UMAT的DSTRAN在小变形情况下是工程应变增量大变形情况下是某种对数应变增量它的定义在有限变形框架下有时并不稳定。我见过不少论文在有限变形下仍用应变增量驱动单晶UMAT结果大变形时应力响应严重偏离参考解。所以如果你打算做有限变形分析强烈建议采用变形梯度驱动。3.3 核心积分算法割线法、切线法还是显式法单晶塑性UMAT的数值积分方法没有统一的答案但不同方法的稳定性和实现难度差很多。显式前欧拉法是最容易实现的直接用当前增量步开始的应力去算滑移剪切率一步更新到位。它的好处是简单不需要迭代坏处是精度一阶对增量步大小极度敏感一不小心应力就振荡。如果增量步足够小比如DTIME在1e-4量级显式法也能给出合理结果但现实中ABAQUS不太会主动给这么小的步长所以新手不推荐。完全隐式后欧拉法对所有滑移系的剪切率增量做Newton-Raphson迭代收敛后更新应力。精度和稳定性最好但代码量非常大Jacobian推导极其痛苦。新手往往在这里卡壳一两个月。**割线法也叫半隐式法、切向速度梯度法**是中间路线——在增量步内用当前应力状态计算剪切率然后通过迭代求解剪切率增量和应力增量的一致性。Huang Yong在“A user-material subroutine incorporating single crystal plasticity in the ABAQUS finite element program”中给出的实现就是这种方式。他先把剪切率增量展开为应力增量的线性函数再线性化求解每一轮内部迭代只需反复更新一个12×12的线性方程组收敛很快。这个版本是我见过所有单晶UMAT里最适合自学的模板。我个人的建议第一版先照着Huang的框架写跑通了再想怎么换更精确的隐式格式。你要明白你的目的是搞懂原理并跑出结果而不是在数值算法的数学推导里就耗尽热情。3.4 应力更新和Jacobian推导的核心步骤以Huang版切向速度梯度法为例应力更新的核心步骤如下根据输入的DFGRD0和DFGRD1计算出增量步内的速度梯度L。假设整个增量步内塑性剪切率为常数由当前应力计算各滑移系的Schmid张量和分解剪应力。对每个滑移系将γ̇ᵃ对τ展开成线性函数这就是“切线”的含义得到dγ̇/ dτ。利用协调条件和本构关系组装线性方程组求解各滑移系的γ̇增量。更新塑性变形梯度、应力通过弹性关系、滑移阻力g。计算Jacobian矩阵DDSDDE即∂Δσ/∂Δε。这里如果嫌推导麻烦可以采用数值微分——对每个扰动Δε再做一遍应力更新——得到数值Jacobian精度够用且省去大量推导。别小看“数值Jacobian”这招。虽然求解器迭代次数会稍微增加但对新手来说能让你跳过最劝退的解析推导一步到位看到结果。等你确认物理响应没问题以后再回头补解析DDSDDE也不迟。4. 从空壳到能跑的UMAT自学路线怎么安排4.1 第一步把弹性UMAT写通我见过太多人一上来就啃Huang那篇报告看了一周代码还云里雾里。正确做法是分三步走。先写一个最最简单的线弹性UMAT。这个阶段不涉及任何塑性、取向、滑移系就验证你对UMAT接口的理解。ABAQUS帮助文档里有线弹性UMAT的Fortran示例直接照着敲一遍、跑通一个单单元拉伸确认应力结果和内置弹性材料一致。这一步的意义在于熟悉整个编译、调试、提交、后处理的流程。你会在这一阶段第一次遇到各种环境问题而这些环境问题和你的本构模型本身一点关系都没有——但如果不提前踩坑后面会把问题混在一起搞不清是代码逻辑错了还是环境配置错了。4.2 第二步在弹性基础上加一个滑移系试试真正的晶体塑性UMAT从最简单的“单滑移”开始——只考虑一个滑移系。这样做的目的是用最少的变量去理解核心逻辑取向如何影响应力、分解剪应力怎么算、剪切滑移如何反馈到应力应变关系。你可以用一个小立方体模型给它一个已知取向做一个单轴拉伸然后手算预期剪切量和UMAT输出对比。这一步做完你应该能彻底理解“在ABAQUS里UMAT需要提供什么信息ABAQUS又反馈什么信息”这件事。4.3 第三步扩展到完整的FCC 12滑移系把滑移系从1个扩展到12个代码量的增加主要在滑移系的定义、Schmid张量的批量计算、剪切率对分解剪应力的偏导、硬化耦合。逻辑本身没有新增。此时做验证试验建议采用FCC单晶的单轴拉伸沿[001]或[111]方向这两个方向有解析解或公开发表过的参考结果。比如[001]拉伸时初始阶段会有多个滑移系同时激活应力应变曲线较为平滑[111]拉伸时对称性更高激活的滑移系组合不同。对比参考结果能确认你每个模块的实现是否正确。还有一个很值的验证方案用UMAT跑一个单晶单元在不同取向下做单轴拉伸画出应力应变曲线观察各向异性是否明显。FCC单晶在不同方向拉伸的屈服强度差异很大如果算出来几乎没差异大概率是代码里取向设定或Schmid张量的归一化出了问题。4.4 调试技巧没有Debug输出很难过日子Fortran子程序在ABAQUS里调试很痛苦但有些技巧非常好用用WRITE(*,*)输出中间变量到 .dat 或 .msg 文件。ABAQUS对UMAT的标准输出默认会写到stderr所以有时候写成WRITE(6,*)反而不容易看到。建议直接用OPEN(UNIT100, FILEdebug.txt, STATUSUNKNOWN)自行输出到工作目录记得在子程序结尾关掉文件。大量使用CHECK参数不ABAQUS没有这个。但你可以用IF (NPT1 .AND. KINC1)之类的条件只输出第一个增量步第一个积分点的数据避免文件被刷爆。输出关键变量时把应力分量、变形梯度分量、滑移系剪切率都打出来人工手算一遍增量步内的数值对比代码结果。遇到不收敛先看 .msg 文件里提示是“convergence level 0”还是“time increment 小于最小限制”——前者说明Jacobian可能不对后者说明你的剪切率更新有振荡需要减小增量步或调整参数。4.5 边界条件和inp设置是另一个大坑UMAT跑起来之后你可能发现死活不收敛但代码逻辑查了好多遍都没问题——这时候看看你的边界条件是不是合理。单晶塑性UMAT作为材料子程序本身不负责“多晶”行为。如果只在一个单元上做单晶拉伸约束必须注意避免刚体转动。特别是晶粒取向不是沿着加载方向时单晶变形会产生剪切分量如果你约束太少单元会旋转应力应变曲线会失真约束太多又会引入额外的边界应力。常见做法是用周期性边界条件针对代表性体积元或单点约束加对称边界针对单晶单胞模拟。另一个新手常犯的错*SOLID SECTION里没有给方向。对单晶塑性来说材料方向决定了晶粒初始取向在全局坐标系下的摆放。你必须在inp文件里通过*ORIENTATION定义局部坐标系UMAT才能根据你这个取向计算滑移系在当前坐标下的取向矩阵。这一步错了后面全部白干。5. 常见问题与排查技巧实录5.1 编译通过但ABAQUS说找不到子程序这是环境问题排行榜第一名尤其是刚换电脑或换版本时。常见原因有三个一是ABAQUS安装路径和Intel编译器版本不匹配ABAQUS 2020要求配对应版本的Intel oneAPI二是环境变量没有配好特别是INCLUDE和LIB路径三是用户子程序文件名不是 .for 或 .f 后缀ABAQUS不识别。解决思路先用一个最简单的UMAT就返回值两个变量测试编译环境。如果这个都过不了基本是环境问题。看看ABAQUS command窗口有没有打印Fortran编译器版本信息。提示如果你的操作系统是Windows建议用ABAQUS自带的“ABAQUS Command”窗口运行job务必确认子程序文件路径不含中文、空格和特殊字符否则链接必挂。5.2 应力张量死活不更新或增量步不断减小增量步不断减小的最常见原因就是Jacobian给得不准确。ABAQUS求解器靠DDSDDE预测下一步的应力如果DDSDDE和实际应力更新不一致Newton迭代就不收敛。如果你暂时不想手推解析DDSDDE至少保证用数值Jacobian扰动法的时候扰动步长足够小而且在你更新完应力之后再扰动别用更新前的。数值Jacobian实现方式对每个应力和应变分量组合给应变增量一个小扰动ε重新跑一遍应力更新求差商。另一个常见因素是幂次n太大。当n50以上时滑移系剪切率对分解剪应力极为敏感很小的应力扰动就会导致剪切率数量级的改变系统变得非常刚性。这时你可以尝试把n降到15~20看看收敛性如果立刻改善那就是n导致的。这算是一个折中的策略反应在结果上只是屈服平台稍“圆滑”一些总体趋势不变。5.3 状态变量数量不够或类型不对UMAT里有些变量是用“每个积分点”存储的。如果你的模型网格很大、单元很多状态变量数量不仅影响内存也会影响重启动分析时的数据量。晶体塑性UMAT至少需要存每个积分点当前的滑移系强度12个和累积滑移量1个推荐再加塑性变形梯度9个分量和当前取向可以用欧拉角3个也可以用旋转矩阵9个。如果你的后续输出还需要“变形集中区域分布”考虑在STATEV里存累积滑移量或等效塑性应变——后处理画云图时非常有用。inp文件里记得用*USER MATERIAL, CONSTANTS和*DEPVAR声明材料参数个数和状态变量个数。状态变量个数写得比代码里实际用到的少ABAQUS会报错“STATEV index exceeds NSTATV”但注意这个错误不一定在job提交时就能暴露可能跑到某个积分点才报出来。5.4 单晶结果后处理时的取向信息很多人算完单晶变形想看晶粒旋转了多少结果发现不知道从哪提取。简单方案把每个积分点的取向矩阵存到STATEV里后处理时通过*ELEMENT OUTPUT中的SDV输出在Contour图里显示特定分量就能画出色差图来体现取向梯度。不过要注意SDV输出的是局部坐标下的你要拿到全局坐标下还需要做坐标变换。更高级一点可以在后处理中计算“取向差”misorientation把每个积分的取向和某个参考取向做差得到取向差分布云图直接用于分析变形不均匀性。这个方法在研究微压痕、裂纹尖端的取向旋转时是标配。5.5 焊接仿真、cohesive和Voronoi与单晶UMAT的搭配很多人在学习晶体塑性UMAT时实际课题可能要跟焊接仿真结合或者要建多晶Voronoi模型或者要考虑晶界失效。这里稍微说几句坑焊接仿真中热-力耦合和晶体塑性UMAT的结合要格外小心。单晶塑性的力学行为对温度非常敏感滑移阻力、率敏感指数都随温度变化。如果你想在焊接热循环后接力学分析建议先把热场算好再以“预制温度场”形式导入力学分析中别在同一个分析步里同时做热-力耦合和UMAT否则收敛性会让你怀疑人生。Voronoi多晶模型在ABAQUS里的生成通常靠第三方工具如Neper、自编Python脚本生成后每个晶粒有单独的取向UMAT的*ORIENTATION必须与晶粒一一对应。这里最容易出的错是“取向赋值和晶粒编号错位”导致算出来的织构完全错误却毫无察觉。务必做一步验证提取几个晶粒的初始取向手动算Schmid因子和变形初期各滑移系的激活情况对比。cohesive单元和Voronoi晶粒搭配时要注意晶界单元的材料属性不能再用单晶UMAT而应该用牵引分离本构或双线性cohesive。两个材料之间的应力传递在UDG用户定义间隙单元和常规cohesive之间差异很大搞混了会导致晶界失效模式完全错误。6. 学习路线之外的判断什么时候该自己写什么时候该用现成代码坦白说自学路上最大的时间陷阱是不断觉得自己能写出更好的版本于是反复推翻重来。我的建议是第一版绝对不要追求完美哪怕你觉得Huang版本老旧、没有考虑几何必需位错、硬化模型太简单都先跑通。你跑通的这个版本就是你后续所有改进的基准。如果你是构造材料或力学背景建议至少手推一遍从变形梯度到应力的完整推导链哪怕最终实现时用了现成代码。因为只有亲手推过你才知道哪些项在什么假设下可以忽略哪些项在你的研究体系里必须保留。反过来如果你的目标是发文章做工程分析而非深入研究本构开发也可以基于开源代码二次开发把精力放在物理问题本身——比如织构演化、变形不均匀性、裂纹萌生判据。并没有人规定UMAT必须从第一行Fortran写起。我个人的学习顺序是理论看Asaro的综述Asaro Rice, J. Mech. Phys. Solids 1977代码参考Huang的报告验证参照个人手写弹性解和公开文献的FCC单晶拉伸曲线然后花两周时间在代码里调整硬化模型、加温度项、耦合损伤判据。整个过程大约四个月每周能稳定投入15小时左右。你要有心理预期前两个月可能反复折在收敛性上但方向对的话第三个月开始会顺畅很多。这套东西一旦跑起来后面加功能是非常顺的把滑移系定义换成HCP的、把硬化模型改成物理基的、把率相关改成率无关的都是在现成框架里改参数表、改解析方程而已。真正难的第一道坎永远是最开始那个“从零到一”的过程。最后再分享一个我一直沿用的小技巧每次改完本构不要直接提交大模型而是先用单单元、单增量步跑通一个最小case输出应力和主要状态变量和手算或上一个版本对比。这个习惯帮我省掉的时间远比它花掉的时间多。
返回列表