01迁移路的真实形状:五段,没有「一键」
Ansys 侧能拿到的是一套 XML:随安装包分发的样例库有 15 个 XML、按 <Material> 口径共 805 条材料(MatML 详解页第 01 节逐个数过);Workbench 的 Engineering Data 里 Export 出来的也是同一套 MatML 结构。Abaqus 侧的入口是本插件的本地 JSON。中间没有官方转换器, 所以完整的路是五段:
Ansys Engineering Data / 样例库 XML
│ ① 拿到 XML(安装目录搜文件名,或 Engineering Data 导出)
▼
MatML 解析(先读 Metadata 字典,再读每条材料)
│ ② pr/pa 三层寻址,拿到「属性名 + 数值 + 单位」
▼
字段映射(Ansys 属性名 → 插件 JSON 键)
│ ③ 对得上的直接对,对不上的进跳过清单
▼
单位换算(SI → tonne-mm-s)
│ ④ 密度 ×1e-12、应力 ×1e-6、比热 ×1e6
▼
标准 JSON 材料库 → 插件「本地文件」页签导入第 ②③ 步的完整规则(五层嵌套、pr/pa 三层寻址、单位 power 幂次、 多点曲线逗号配对)在Ansys 材料库 XML(MatML)格式详解里逐条写过,还附了一个只用标准库的解析骨架;这篇不重复, 只讲从解析结果到 Abaqus 材料之间这一段。
pr/pa 编号回查 Metadata 才知道名字,而编号只在同一个文件里有效。 实测样例库三份文件:密度在通用非线性库里是 pr0、 在线弹性通用库里是 pr2、在热库里是 pr1; 弹性在两份通用库里分别是 pr6 和 pr11, 而通用线弹性库里的 pr6 反而是热膨胀系数。 所以脚本只能按解析出的属性名字符串映射, 绝不能写「pr6 就是弹性」这种硬编码。02六组直接对得上的字段
把 Ansys 库里的属性名字符串和插件 JSON 的键对起来, 结构分析常用的六组是干净的。单位一列全部按 Ansys 库存 SI、 Abaqus 用 tonne-mm-s:
| Ansys XML 里的属性名 | 插件 JSON | 单位动作 |
|---|---|---|
| Density | density | kg/m³ → t/mm³,乘 1e-12 |
| Elasticity(Young’s Modulus + Poisson’s Ratio) | elastic.youngsModulus / poissonsRatio | Pa → MPa,乘 1e-6;泊松比不动 |
| Specific Heat | thermal.specificHeat | J/(kg·K) → mJ/(t·K),乘 1e6 |
| Thermal Conductivity | thermal.conductivity | 数值原样,W/(m·K) 与 mJ/(s·mm·K) 同值 |
| Coefficient of Thermal Expansion | thermal.expansion.alpha | 1/°C → 1/°C,数值不动;Definition 必须是 Secant |
| Zero-Thermal-Strain Reference Temperature | thermal.expansion.zeroTemperature | 直接取数,摄氏就保持摄氏 |
导热系数数值不变这件事反直觉(能量和长度各换一千,正好抵消), 完整推导在导热系数与比热里;十项单位的完整对照在帮助文档单位表。
用库里的一条材料走完换算
拿样例库 General Materials Non-linear.xml 里的 Aluminum Alloy NL 一条当算例(以下是 Ansys 自带样例库里该条目的数, 随版本可能不同,这里只演示换算): 密度 2770 kg/m³、比热 875 J/(kg·K)、 弹性模量 7.1e10 Pa、泊松比 0.33。 换算完落进 JSON:
{
"name": "Aluminum_Alloy_NL",
"description": "from Ansys sample library, Aluminum Alloy NL, SI converted to tonne-mm-s",
"density": { "value": 2.77e-9 },
"elastic": { "youngsModulus": 71000.0, "poissonsRatio": 0.33 },
"thermal": {
"specificHeat": 8.75e8,
"expansion": { "zeroTemperature": 22.0 }
}
}2770 × 1e-12 = 2.77e-9,7.1e10 × 1e-6 = 71000,875 × 1e6 = 8.75e8 —— 三个数都能手工复核。 名字里的空格要换成下划线,原因在材料名规则那篇;这条样例没给导热和膨胀,缺的键就不写,不要用 0 补齐(0 在 Abaqus 里是合法值,会被当真数据算下去)。
03三处不能「直接搬」,必须人工判断
一、双线性等向硬化:Abaqus 没有「切线模量」这一格
还是上面那条铝合金,它在样例库里的 Isotropic Hardening 带 Definition = Bilinear,给的是两个数: 屈服 2.8e8 Pa、切线模量 5.0e8 Pa。 Abaqus 的 *PLASTIC 是「真应力–真塑性应变」的数表, 没有切线模量这个参数。搬法只有一个:按直线关系采两个点 ——
σ(εp) = σy + Et · εp
第 1 行(必须正好是 0): 280.0, 0.0
选 εp = 0.01 采一个点: 280 + 50000×0.01 = 780.0, 0.0150000 是切线模量 5.0e8 Pa 换成 MPa。采点的塑性应变区间要盖住分析里实际会到的量, 超出表外 Abaqus 不外推。如果 Ansys 侧给的本来就是多线性表(一串逗号分隔的 应力/应变),那只需要拆逗号、同序配对 —— 但前提是那一列的名字确实是 Plastic Strain。
二、热膨胀:Secant 才能直接对,Instantaneous 要先积分
样例库通用线弹性库每条材料的膨胀系数块都带 Definition = Secant(割线/平均膨胀系数), 这正好对应 Abaqus *EXPANSION 的默认口径, 连同块的 Zero-Thermal-Strain Reference Temperature 一起搬进alpha 和 zeroTemperature 即可。
如果源数据给的是 Instantaneous(瞬态系数),直接填会错, 要先按平均口径积分:ᾱ(T*) = ∫ₜ₀ᵀ α_inst(T)dT / (T*−T⁰), 逐温度点换成平均系数再进 JSON。插件没有这个开关,不替你做这个积分。 参考温度为什么只有在系数随温度变时才真正参与计算,见热膨胀与零应变温度。
三、温度表:默认温度不是曲线上的点
MatML 里每个随温度变的块都有一个独立变量列,往往挂着Default Data = 22,而该列的 <Data> 写的是 哨兵 7.88860905221012e-31(2⁻¹⁰⁰)。 解析时必须按哨兵规则把它替换成 Default Data —— 原样搬,材料就带着一个近零的「室温点」进了模型。 真正的温度点在同一列的逗号列表里,与应力值的逗号列表同序配对(曲线一节)。
进了 JSON 之后温度永远在每行最后一列, 而且塑性表要按温度分组、每组第一行塑性应变重新从 0 起, 规则见温度相关材料表。
04搬不过去的东西:让脚本报清单,别让它安静丢
805 条里有不少属性在 Abaqus/CAE 通用结构分析里没有对应块, 插件 JSON 也不设这些键。映射脚本遇到它们的正确做法是跳过并逐条打印「哪条材料、哪个属性、为什么跳过」 —— 这与插件导入时对不支持块的处理是同一个原则:材料照建,但少了什么必须说。
| Ansys 侧属性(样例库里的名字) | 集中出现的文件 | 为什么不搬 |
|---|---|---|
| S-N Curve、Strain-Life Parameters | General_Materials.xml | 疲劳寿命模型,插件没有对应属性块 |
| Resistivity、Relative Permeability、B-H 曲线 | General_Materials / Magnetic B-H / Thermal | 电磁属性,超出本插件结构+热的范围 |
| Drucker-Prager Strength、Compression、Crack Softening 及 Nonlinear Unloading | General Materials Non-linear.xml | 岩土与混凝土本构的 Ansys 方言定义,不能和 Abaqus CDP 按同名直接对 |
| Tensile Pressure Failure、状态方程类参数 | Explicit_Materials.xml | 显式专用失效/EOS,Abaqus 要另选关键字手工建 |
| 流体、混合物、压电耦合、磁致伸缩整库 | Fluid_*、Mixtures、Piezoelectric 等 | 场域都不在结构力学材料这一层 |
两类要单独说,它们不是直接跳过:
- 正交异性/复合材料弹性。Composite_Materials.xml 里 28 条铺层材料的九个工程常数, 在插件 JSON 里走非等向
elastic的显式表 (Abaqus 侧 ENGINEERING CONSTANTS / LAMINA 等类型)。 列数必须和声明的类型严格对上 —— 六个常数被当成五个加一个温度 是不报错的,各类型的列数规则见温度相关材料表里的速查表。 - 超弹系数。Hyperelastic_Materials.xml 的 Mooney-Rivlin、Ogden 已拟合系数, 插件 1.3 起有
hyperelastic块可接(固定阶数的模型按固定列序, Ogden/多项式阶数可变,要显式给表);给的是试验曲线的另走 testData 路子。 混凝土方面插件有按 GB 50010 的 CDP 生成器,但那是按标号重新生成, 不是从 Ansys 的 Compression/Crack Softening 曲线翻译,两套数据不要混。
05推荐流程:七步,每步留下可核对的东西
- 拿 XML。在 Ansys 安装盘按文件名搜 (如
General_Materials.xml,目录跨版本挪过), 或在 Engineering Data 里 Export 公司私有库 —— 导出的是同一套 MatML 结构。 - 先解析 Metadata 建字典,再遍历材料。用 MatML 详解页第 09 节的解析骨架(标准库即可),映射按属性名字符串,不按 pr 编号。
- 哨兵替换、曲线配对。单值且小于 1e-30 判为 2⁻¹⁰⁰,取 Default Data; 逗号列表按 Variable Type 同序配对;顺手数一下哨兵命中次数, 一次不命中说明判断写错了。
- 字段映射 + 跳过清单。六组直接映射的字段照第 02 节;双线性/瞬态膨胀按第 03 节人工处理; 第 04 节那些逐条进跳过清单,最后人工过一遍。
- 统一换算到 tonne-mm-s。换算集中在这一步、这个脚本里做,JSON 里只放换算后的值;
units字段写清单位制,与示例库同一习惯。 - 写 JSON(UTF-8、材料名 ASCII 下划线)。文件形状和全部键的含义在帮助文档 JSON 一节;中文名、连字符、逗号这些坑见材料名规则。
- 导入后看消息区,再跑材料健康检查。导入报告里有 FAILED、skipped、ignored 三类异常行; 健康检查在菜单
材料库 → 材料健康检查..., 不要求激活,扫模量范围、硬化曲线、互斥组合和单位制一致性。
迁完只代表材料建出来了,不代表模型用上了: Section 和指派这两环没做,材料管理器里再齐全也不参与计算。 五个断点的排查顺序在材料建好了却不生效。
06为什么不是 805 条一次全搬
技术上七步脚本可以批处理,但「能跑」和「搬过来敢用」是两件事。 MatML 详解页第 10 节已经把这一层说透:样例库条目普遍没有牌号、没有试验标准、 没有热处理状态,Granta 那份还是商业数据集样本, 它自己的 Description 都写着不提供数据担保。
所以这批库在 Ansys 语境里做演示、做量级估算是合适的, 整份搬进自己的模型当设计依据不合适。工程上真正值得迁的是: 公司私有材料库(带牌号和试验报告、导出也是这套 MatML), 以及项目上一代模型里已经评审过的那几条。把流程在样例库上调通, 用在自己有数的材料上 —— 这是这条路的正确用法。