ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

TexGen导出inp后如何在ABAQUS中快速修改纱线材料属性

TexGen导出inp后如何在ABAQUS中快速修改纱线材料属性 1. 从TexGen导出到ABAQUS最容易被误解的“材料”环节做织物复合材料单胞仿真的人多少都经历过这个场景在TexGen里辛辛苦苦把经纬纱排好网格一画导出inp满怀期待地导入ABAQUS结果发现整个模型只有一个名字叫“Material-1”的弹性材料。打开材料编辑器里面躺着一行默认的E和ν数值完全不是纱线该有的参数。更让人头疼的是你以为把几组工程常数填进去就能算结果提交作业时报错没有定义材料方向或者截面对应的集合根本找不到。这个环节的误解源于TexGen的定位。它本质上是一个纺织几何建模工具核心能力是生成纱线路径、截面形状、交织关系和三维几何并负责生成网格。至于材料卡片它只会给出一个占位符。说得直白一点如果你只是想把TexGen里的模型导出来然后指望inp自带完整的复合材料本构和方向场那是不可能的。材料属性、单元方向的赋予、截面与材料名称的对应关系这些环节本来就应该在ABAQUS侧完成或者通过后处理脚本补上。所以这篇来解决的核心问题是当TexGen已经导出了inp文件如何又快又稳地把纱线材料属性改成你想要的参数并且不留下隐患。适用对象是正在做纺织复合材料RVE均质化、强度预测、渐进损伤分析的同学也包括用TexGen建几何然后导入ABAQUS做其他多相材料分析的工程师。我默认你至少有基础的ABAQUS操作经验知道材料模块和属性模块在哪里但还没有被“集合、截面、方向”这三座大山压垮。顺便说一句网上关于TexGen和ABAQUS的资料很多但大多数只讲“导出成功”这一步很少讲导出之后“怎么改才能算”。这篇就来把这截空白补上。提示如果你用的TexGen版本比较新比如3.9、3.11导出对话框里的选项和旧版有差异但inp的基本结构是稳定的。后面所有讨论都以inp文本本身为准不依赖某个具体的菜单版本。1.1 为什么材料属性不能指望“一步到位”很多教程会告诉你TexGen导出inp后直接导入CAE就能计算。这话只对了一半。对于“只看几何形状和网格”的验证性分析确实够了但对于纱线这种横观各向同性材料缺了材料方向刚度矩阵完全是错的。再退一步说即使不谈方向单是单位不统一这一点就能让结果差出几个数量级。我接过一个现场案例有人的模型看起来一切正常提交计算后应力片上的数值大得离谱检查发现他把纱线弹性模量按Pa填了进去而几何模型用的是毫米。这就像用米尺量完房间却按厘米去买地板尺寸全乱。TexGen导出的是几何和网格单位是你在建模时定义的ABAQUS只认“数值”不认“单位”它才不会帮你做换算。所以修改材料属性之前第一件事是确认单位制。1.2 材料属性修改的本质是什么搞清楚这件事你后面就有方向了。在inp文件里材料属性一共涉及三个关键词*Material定义材料本构参数。*Solid Section把某个单元集合elset和某个材料绑定在一起。*Orientation定义材料局部坐标系。如果你只是想把同一组参数套到所有纱线上那么只需要改Material里的数值如果你想给经纬纱分别赋不同的材料那么不仅要改Material还要改Solid Section里的material字段把不同集合指向不同材料名。如果纱线是弯曲的、材料方向沿路径变化那还要加Orientation或对应的分布定义。明白了这个关系你会发现“快速修改”其实可以拆成两步第一搞清楚每个单元集合对应哪根纱线第二把正确的材料名或材料卡片替换进去。剩下的都是工程细节。2. 拆解inp文件节点、单元、集合、截面对应的基本盘老实说第一次用文本编辑器打开TexGen导出的inp大部分人都会被几百行节点坐标淹没。所以先给它“脱水”去掉Node和Element两部分真正需要你关心的是靠后的Elset、Solid Section和Material这些区块。一个典型的TexGen导出inp长这样做了裁剪*Node 1, 0.0, 0.0, 0.0 2, 0.1, 0.0, 0.0 ... *Element, typeC3D4 1, 1, 2, 3, 5 ... *Elset, elsetYarn1, generate 1, 356, 1 *Elset, elsetYarn2, generate 357, 721, 1 ... *Elset, elsetMatrix, generate 722, 1500, 1 ... *Solid Section, elsetYarn1, materialMaterial-1 , *Solid Section, elsetYarn2, materialMaterial-1 , *Solid Section, elsetMatrix, materialMaterial-1 , *Material, nameMaterial-1 *Elastic 210000., 0.3注意看这里所有截面都指向同一个Material-1包括基体。这就是问题所在如果不改你算出来的“纱线”和“基体”其实是一模一样的材料那还仿什么复合材料。2.1 集合命名一开始就规划好后面少受罪TexGen导出时默认的集合名通常是Yarn1、Yarn2、Matrix这样的顺序但这取决于你在TexGen里怎么建的模型。如果你在TexGen的纺织树里给纱线改过名字比如warp1、weft1那么导出的inp里集合名也会跟着变。我的建议是分两类场景处理如果你的单胞里经纬纱数量少比如2×2平纹那手工看集合名也能分清如果纱线数量多比如3×3缎纹、多层角连锁那你最好在TexGen里就把纱线命名为有规律的编号比如warp01、warp02、weft01、weft02。这样导出后用脚本按前缀就能把同名系列全挑出来批量修改材料。这里面有一个常见坑有些旧版TexGen导出的集合名里可能包含空格或短横线比如“Yarn 1”。ABAQUS对集合名的要求是不能以数字开头不包含空格、短横线、点号等特殊字符。如果遇到这种名字轻则导入时报warning重则集合直接被改名后面的Solid Section引用全部失效。解决办法是在导入CAE前用文本编辑器或脚本统一改名。2.2 单元类型对材料赋予的影响TexGen默认网格可能是四节点四面体C3D4也可能在特定选项下导出十节点四面体C3D10。两种单元在材料赋予方面没有本质区别反正都是通过elset关联。但要注意如果你之后想在ABAQUS里对纱线表面加Cohesive界面或接触C3D4网格的单元面比较碎建surface会痛苦一些。另外虽然技术上任意单元类型都能赋材料但四面体单元对体积锁定的敏感程度不同这会影响你把材料常数喂给它之后算出来的应力准确性。对于纯均质化计算C3D4通常够用如果你做的是纱线内部的细观损伤最好用C3D10或六面体网格。网格的事先放一边你现在最需要的是弄清楚某个集合代表什么我要把什么材料给它。2.3 材料区块的正确读法Material卡片后面跟着的Elastic默认是各向同性弹性只有两个数弹性模量和泊松比。如果想要横观各向同性就必须写成*Material, nameYarnMaterial *Elastic, typeENGINEERING CONSTANTS 162000., 11000., 11000., 0.25, 0.25, 0.37, 6500., 6500., 4000.这行逗号分隔的9个数依次是E1、E2、E3、NU12、NU13、NU23、G12、G13、G23。顺序不能错少了或多了一个数ABAQUS会直接报错。我在现场看到过有人把E1、E2、E3写对了但G12和G23的顺序搞反导致结果出现负的刚度求解器卡死。也就是说改材料属性前你得先搞清楚自己的纱线本构模型用什么形式。最省事的做法是纱线用工程常数ENGINEERING CONSTANTS基体用各向同性Isotropic两者分开定义然后把Solid Section里的材料名分别指过去。3. 快速替换纱线材料属性的三种方法搞懂文件结构之后替换材料就变成了一个体力活。这里我按省事程度从低到高给出三种方法你可以根据自己的情况选一种也可以组合使用。3.1 方法一在CAE里直接改材料与截面这是最直观、最不容易引入语法错误的方法适合只需要改一两次、集合数量不多的情况。操作路径我简要说一下File - Import - Model选择你导出的inp。进入Property模块在Model Tree里展开Materials双击“Material-1”。在Mechanical - Elasticity - Elastic里把Type从Isotropic改成Engineering Constants然后填9个常数。如果需要分别给经纬纱不同材料就先在Materials里新建两个材料比如WarpMat、WeftMat然后到Sections里编辑每个Solid Section把Material改成对应的名字。如果只改数值不改变材料名那么连Section都不用动改完材料卡直接提交。这个方法有个隐含风险如果原来inp里所有集合共享同一个Material-1你在CAE里把Material-1改了数值会导致基体和纱线变成同一种材料。这种情况下你必须先新增材料再手动把Matrix对应的Section重新指派到新的基体材料。对初学者来说这一步很容易漏。3.2 方法二用文本编辑器直接改inp如果集合不多、只是数值不对直接打开inp文件改是最快的。你只需要用支持语法高亮的编辑器VS Code、Notepad、Sublime打开inp。定位到Material, nameMaterial-1把Elastic下面那行数替换成目标参数。如果需要经纬纱分开就把Solid Section这一行里的material改成新材料名并在文件末尾另起一个Material区块。这里我强烈建议保留一个原始备份。正则替换是个好东西但是你把文件名搞错或者把不该改的字段改了至少还有退路。我自己的习惯是每次改inp之前先复制一份文件名带日期比如texgen_v1_modified.inp。3.3 方法三用Python脚本批量改推荐如果你要做参数化研究比如改变纤维体积分数、换材料体系或者一个项目里要处理十几个单胞模型手改会疯掉的。这时候脚本是唯一靠谱的解法。下面这段脚本的思路是读取inp文本找到每行*Solid Section按照集合名前缀把material字段替换为新的材料名最后在文件末尾追加材料定义块。import re import shutil src texgen_export.inp dst texgen_modified.inp shutil.copy(src, src.replace(.inp, _backup.inp)) with open(src, r, encodingutf-8) as f: text f.read() # 定义集合名到材料名的映射 mat_mapping { warp: T300_Yarn, weft: T300_Yarn, matrix: Epoxy_Matrix, } def replace_section_material(line): 将 Solid Section 中的 material 字段按映射替换 m re.match(r\*Solid Section, elset([^,]), material([^\s,]), line.strip()) if m: elset m.group(1) for prefix, mat_name in mat_mapping.items(): if elset.lower().startswith(prefix): return line.replace(m.group(2), mat_name) return line lines text.splitlines() new_lines [replace_section_material(line) for line in lines] material_block ** T300 yarn *Material, nameT300_Yarn *Elastic, typeENGINEERING CONSTANTS 162000., 11000., 11000., 0.25, 0.25, 0.37, 6500., 6500., 4000. *Density 1.6e-9, ** Epoxy matrix *Material, nameEpoxy_Matrix *Elastic 3450., 0.35 *Density 1.2e-9, with open(dst, w, encodingutf-8) as f: f.write(\n.join(new_lines)) f.write(material_block) print(done:, dst)这个脚本假设你的集合名里带有warp、weft、matrix这类前缀。如果没有你可以把映射改成具体的集合名比如‘Yarn1’、‘Yarn2’。另外注意如果在原inp的Material区块里已经存在旧材料定义脚本并没有删除它。ABAQUS对未引用的材料通常只会出warning不会中断计算所以问题不大但如果你有洁癖可以在最后用正则把旧的Material区块整个删掉。脚本执行完用文本编辑器打开texgen_modified.inp抽查几行确认所有Solid Section都指向了正确的材料然后再导入CAE。3.4 三种方法怎么选方法适用场景优点缺点CAE直接改单次分析集合少不易写错语法集合多时点得累易漏文本编辑器改少量修改临时调整快、直观容易误伤其他字段Python脚本批量、参数化、重复操作可复现、速度快需要调试有编程门槛我的建议是如果只是想把默认材料换成你自己的纱线本构直接方法一如果以后还会重复用或者经纬纱要分开直接上脚本。反正脚本写一次以后所有模型都能用省下来的时间绝对划算。4. 五个典型坑改完材料仍然出错的原因与解决材料数值填进去了不代表就能算对。我见过太多人卡在“材料常数填了但结果不对”这一层下面这五个坑是最常见的按出现频率排序。4.1 坑一单位制混乱结果数量级全错先说症状提交计算后要么应力值大得离谱要么位移小得像没有加载甚至出现“Largest absolute value of a diagonal term of D ....”这类错误。原因基本就是单位制不一致。ABAQUS没有内置单位你要保证输入的所有物理量在同一套单位制下是协调的。最常见的搭配是量单位组合1mm制单位组合2SI制长度mmm力NN应力/模量MPa (N/mm²)Pa (N/m²)密度tonne/mm³kg/m³时间ss如果你在TexGen里建的模型单位为mm那弹性模量就要按MPa填。比如T300碳纤维纱线纵向模量162 GPa在这个单位制下就是162000 MPa不是162000000。密度同理1.6 g/cm³在这个单位制下是1.6e-9 tonne/mm³不是1.6、也不是1600。如果你加了瑞利阻尼阻尼系数里的刚度项也是这个量纲逻辑β的单位是s但具体数值和特征频率挂钩那个坑更大。总之第一步就把单位和数值确认好后面省心。4.2 坑二纱线用各向同性弹性方向性全丢很多人打开材料模块默认看到的是Isotropic顺手就把E和ν填了。但对于纱线尤其是沿着路径方向受力的编织纱线这样做等于把一根钢筋当成橡皮泥来算误差可想而知。纱线本构应该用横观各向同性或正交各向异性。横观各向同性的意思是纱线纵向沿着纤维方向的模量远大于横向横向两个方向性质相同。用ABAQUS里的Engineering Constants类型就是前面那9个常数。需要特别注意的是工程常数里E2和E3可以相等G12和G13可以相等但E2≠E1千万别把所有方向都填成同一个值。如果你手头没有完全准确的9个常数可以用Chamis公式或混合率从纤维和基体的性能推出来。误差当然有但对前期算量级的分析足够用了。第五部分给出一组典型值可以直接抄。4.3 坑三材料方向没定义横观各向同性形同虚设这是最隐蔽的一个坑。即使你正确填了9个工程常数如果没定义*OrientationABAQUS会默认所有单元的材料1方向与全局1方向一致。对于平纹织物里弯曲的纱线这样做会严重高估或低估某些方向的刚度。TexGen的一些版本在导出inp时如果勾选了与方向相关的选项会在文件里生成*Orientation卡片。你自己打开inp搜一下“Orientation”搜得到就说明有方向数据搜不到就得自己想办法。工程上最简单的近似是让所有经纱单元的1方向指向全局X所有纬纱单元的1方向指向全局Y。对于方向变化不太剧烈的平纹织物这个近似比完全不给方向好得多。在CAE里操作路径是Property模块 - Assign - Material Orientation选中某个纱线的单元集合然后指定坐标轴方向。如果单胞里每根纱线路径都弯得厉害那就只能按单元逐个给方向或者写脚本根据纱线中心线切线方向计算局部坐标。关于方向我再多一句很多教材里给RVE加周期性边界条件时默认假设纱线是直的或者近似直的。如果你的织物屈曲明显最好用TexGen导出的真实几何配合方向赋予这样均质化得到的弹性常数才有参考价值。4.4 坑四矩阵缺失或者粘结关系没搭好改完材料后模型能正常提交但结果里纱线和纱线之间互相穿透或者基体到处乱飞这个问题通常出在矩阵和粘结关系上。先检查你到底导出的是干纺织物只有纱线还是复合材料纱线基体。干纺织物导出的inp里根本没有Matrix集合你就算材料赋得再漂亮也没有基体可算。解决办法是在TexGen的导出选项里勾选包含基体或者重新导出一个带基体的版本。如果你已经拿到了带基体的inp还要确认纱线与基体之间是怎么连接的。理想情况下共用节点共网格是最省事的如果有Tie约束要看*Tie卡片是否存在如果什么都没有那模型可能是一个装配体各零件之间没有相互作用一算就飞。在CAE里快速检查的方法是进入Mesh模块在Assembly里选中所有实例然后View - Assembly - Render - Edges看看有没有悬空单元或者提交一个只有极小载荷的测试算例看位移场是不是连续。4.5 坑五集合名非法、重复、引用失效这个坑常常被忽略但一旦踩了比前面几个都费时间。表现为导入CAE时弹出警告某些Solid Section的elset在模型里不存在或者你明明改了材料却看不到效果因为集合引用的根本不是你以为的那个集合。解决办法是在导入前用文本编辑器扫描一遍。你可以搜*Elset把集合名列出来再搜*Solid Section把elSet字段列出来两条对比看有没有对不上的。如果集合名里带空格或短横线建议先全局替换成下划线。用脚本改材料之前顺带做一次命名清洁能省掉后面一堆破事。下面用一张表把上面五个坑汇总一下现象直接原因快速处理应力/位移数量级异常单位制不一致统一为mm-N-MPa-tonne/mm³纱线刚度各向同性材料类型选了Isotropic改为Engineering Constants结果与文献差太大缺少材料方向添加或创建*Orientation模型一算就飞矩阵缺失或无相互作用检查Matrix集合与Tie/共用节点导入报错/集合失效集合名非法或引用断开清洗集合名核对Solid Section5. 实操示例T300/环氧平纹编织单胞材料修改全流程前面讲了原理这部分我放一个完整的例子你可以照着做。我选的体系是T300碳纤维增强环氧树脂平纹编织单胞尺寸4mm×4mm纱线截面用透镜形。这个例子没用特别精确的工艺参数重点是演示从inp到可计算模型的完整链路。5.1 原始数据准备在TexGen里建好模型后先确认纱线名。我在TexGen里把经纱命名为warp01、warp02纬纱命名为weft01、weft02选中“生成包含基体的复合材料模型”的导出选项具体菜单名取决于版本然后导出inp。导出的文件大概长这样*Elset, elsetwarp01 ... *Elset, elsetweft01 ... *Elset, elsetMatrix ... *Solid Section, elsetwarp01, materialMaterial-1 , *Solid Section, elsetweft01, materialMaterial-1 , *Solid Section, elsetMatrix, materialMaterial-1 ,把材料赋值的目标拆开warp01、warp02、weft01、weft02 - T300_YarnMatrix - Epoxy_Matrix纱线用工程常数基体用各向同性。参数按典型的T300/环氧体系取值T300_Yarn: E1 162000 MPa E2 E3 11000 MPa NU12 NU13 0.25 NU23 0.37 G12 G13 6500 MPa G23 4000 MPa 密度 1.6e-9 tonne/mm³ Epoxy_Matrix: E 3450 MPa NU 0.35 密度 1.2e-9 tonne/mm³注意这组参数对应纤维体积分数约0.7如果你用的是其他树脂体系或纤维体积分数务必换成自己的数据。纱线工程常数不是随便拍的至少要经过混合率或细观力学换算。5.2 执行材料替换把第三部分的脚本稍微改一下映射改成mat_mapping { warp: T300_Yarn, weft: T300_Yarn, matrix: Epoxy_Matrix, }运行完后打开texgen_modified.inp单独把*Solid Section那几行挑出来看*Solid Section, elsetwarp01, materialT300_Yarn , *Solid Section, elsetweft01, materialT300_Yarn , *Solid Section, elsetMatrix, materialEpoxy_Matrix ,然后在文件末尾看到追加的两个材料定义。一切正常。如果你发现texgen导出的集合名不是warp01这种而是Yarn1、Yarn2那就直接把映射改成具体集合名效果一样。重点是你得确认“每根纱线对应哪个集合”这个映射关系这是整个替代过程的基础。5.3 导入CAE并指派材料方向材料替换完导入CAE后你会发现模型里已经有两个材料、三四个截面。接下来的关键一步是方向。对于平纹织物我先用最粗暴的近似在Property模块里Assign - Material Orientation选中warp01、warp02的单元定义方向1为全局X选中weft01、weft02定义方向1为全局Y。Matrix不需要方向保持默认。如果你的TexGen导出时已经生成了*Orientation卡片那么导入CAE后方向会自动带到模型里你只需要抽查几个单元的坐标系方向对不对。用CAE的View - Assembly - Render - Material Orientation可以显示每个单元的坐标系三元组看一眼就知道赋错了没有。方向这一步我只强调一个原则方向1必须大致沿着纤维走向。对于平纹织物这种近似结果当然不如逐单元精确方向但比完全没有方向要好一个量级。5.4 加边界条件并试算我习惯给单胞加周期性边界条件用方程约束把相对面节点的位移关联起来。这个操作在CAE里比较繁琐通常用脚本。简单起见你也可以先加对称边界条件只在单胞的1/4或1/2区域加载验证材料方向对不对再上完整周期边界。提交作业之前在Job模块点击Write Input让ABAQUS再生成一次inp然后打开这个新inp检查有没有意外删掉的字段。这一步看似多余但其实是在帮你确认CAE内部模型没有因为导入导出产生丢失。第一次试算时把Step改为Static, General增量步数设小一点输出里勾选应力、应变、位移三项就够了。如果算完应力云图在纱线内部是连续过渡的、矩阵区域没有出现乱七八糟的大变形那说明材料和方向基本赋对了。这时候再用脚本提取体积平均应力应变算均质化弹性常数才有意义。5.5 结果快速验证拿到结果后可以先和已知的数值对比平纹编织T300/环氧单胞纤维体积分数0.6~0.7时面内拉伸模量一般落在55~75 GPa这个区间。如果你的结果差出好几倍回头检查单位制如果面内两个方向模量差得离谱检查方向和集合映射如果结果看起来对称但数值偏小检查基体是否被错误地赋成了纱线材料或者纱线方向上E1是否没写对。这个验证逻辑比任何教程都管用先用文献值卡数量级再逐步排除。材料属性修改本身不难难的是确认你改完之后模型还是物理上合理的。6. 提交计算前的检查清单与收尾经验最后这部分不是总结是我自己踩过无数坑之后沉淀下来的一个检查流程。每次拿到TexGen导出的inp我都会在提交计算前按下面这个清单过一遍能把大部分低级错误挡在门外。6.1 必查项目单位制打开inp看节点坐标数量级。如果坐标是整数几十或几百基本是毫米如果坐标是0.004这种基本是米。然后确认材料模量的数量级和单位制匹配。材料引用搜*Solid Section把每个material后面跟着的名字全部摘出来和*Material, name列表对比确保没有引用不存在的材料。方向存在搜*Orientation。搜不到的话记住你的模型现在没有局部坐标系绝对不要用横观各向同性材料直接算。集合完整性搜*Elset逐条检查生成范围有没有超出单元编号上限。超出的话通常是网格导出时出了问题重新在TexGen里画网格。相互作用如果模型里有多于一个Part或Instance检查Tie或Contact是否存在如果是共网格单Part这一步可跳过。6.2 CAE里的快速验证导入CAE后用下面几个操作可以快速确认模型状态在Property模块里用Render - Material Orientation显示所有单元的局部坐标系确认方向合理。在Mesh模块里用Verify检查单元质量重点看有没有负体积。负体积在提交时直接报错之前所有工作都白费。用Query - Mass Properties选择Whole Model看总体积和质量数量级是否合理。体积和几何对不上说明单位制有问题。提交一个“空载”算例只加一个极小的力看位移方向是否符合直觉。这一步花不了几分钟但能抓住90%的建模错误。6.3 我自己的习惯写了这么多最后分享几个小习惯。第一TexGen导出的原始inp永远保留改名或加日期后缀不做任何修改。这样不管脚本写得多乱随时能回到起点。第二材料参数不直接写在脚本里而是单独放到一个Python字典或文本配置里想换材料体系时只改一处。第三同一套纱线材料卡片我会存成模板下次开新项目直接用不重新敲一遍数字。第四给集合、材料、截面命名时坚持一套约定小写、无空格、带前缀。这能让你用脚本处理时节省大量调试时间。如果你已经走到了“改完材料、能跑出结果”这一步说明基础链路已经通了。剩下的就是慢慢把方向的精确度、基体本构、损伤模型往上加。TexGen导出inp只是整个复合材料细观仿真链条里的一环把这一环理顺后面你才能把精力放到真正重要的力学问题上。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进