ABAQUS单元刚度矩阵导出全攻略:从MTX文件到Python/MATLAB装配
发布时间:2026/10/2 13:02:04来源:尧图网络
一开始说个我自己折腾了半个月的教训。去年做多晶Voronoi模型的晶界开裂仿真模型里铺了一片cohesive单元跑出来的整体应力-应变曲线比单晶理论解软了差不多15%。第一反应是cohesive的初始刚度给小了把材料卡从头到尾检查三遍没问题又怀疑是网格过渡区太粗重画两版还是软。最后实在没辙把其中几个代表性单元的刚度矩阵直接导出来和理论公式逐项对着看才锁定问题出在单元积分方案上——局部区域的减缩积分单元沙漏刚度不足整体刚度被系统性低估。从那以后“怎么把ABAQUS里的单元刚度矩阵弄出来”就成了我调试这类模型的固定动作。这篇文章就把这套固定动作完整拆开*ELEMENT MATRIX OUTPUT关键词的正确用法、MTX和DAT两种输出文件的格式差异与适用场景、用Python和MATLAB解析文件并重新装配全局刚度矩阵的实战脚本再加上我用单个六面体单元做“体检”验证的完整流程。目标读者很明确正在调UMAT/UEL的子程序开发者、做cohesive或Voronoi细观模型的仿真工程师、以及写论文或做二次开发需要导出刚度矩阵做进一步计算的人。下面直接进正题。1. 单元刚度矩阵是什么以及什么时候你需要把它“抓出来”1.1 从积分公式看单元刚度矩阵的本质单元刚度矩阵的定义大家都不陌生。对线弹性问题每个单元的刚度矩阵是[ K^e \int_{V_e} B^T D B , dV ]其中B是应变-位移矩阵D是本构矩阵积分在整个单元体积上完成。对8节点六面体单元每个节点3个平动自由度Ke是24×24的矩阵对20节点六面体C3D20则是60×60。整个模型的全局刚度矩阵K就是把所有单元的Ke按自由度编号“装配”起来[ K \sum_e L_e^T K^e L_e ]Le是单元自由度到全局自由度的定位矩阵说白了就是把每个单元矩阵的行列“塞”到全局矩阵对应的位置上共享自由度的贡献直接叠加。矩阵里每个元素的物理含义很直白K_ij表示当第j个自由度发生单位位移、其余所有自由度被约束住时在第i个自由度上需要施加的力。这个“一列单位位移一行反力”的解释特别有用因为你可以用它逐个检查导出的矩阵对不对——比如把某一列单独取出来看它是否和理论上的约束反力分布一致。1.2 四个需要导出单元刚度矩阵的典型场景我总结下来实践中碰到最多的是四种情况。第一种是用户子程序调试。写UEL时你需要自己返回单元刚度矩阵AMATRIX和残差向量怎么验证你写的矩阵是对的最直接的办法是拿一个内置同类型单元做对比对完全相同的网格和材料用*ELEMENT MATRIX OUTPUT把内置单元的Ke导出来再和你UEL算出来的Ke逐项比较。对UMAT来说导出单元刚度矩阵也能间接验证切线刚度D矩阵是否正确——D算错了装配出来的Ke一定对不上。第二种是本构模型和单元技术的验证。这就是我开头说的cohesive/Voronoi案例。cohesive单元的刚度矩阵反映了界面在法向和切向上的刚度分配是否合理减缩积分单元的沙漏刚度是否足够全积分单元有没有体积自锁——这些问题从单元刚度矩阵的特征值分布和数量级上都能看出端倪。把矩阵导出来比盯着云图猜原因靠谱得多。第三种是教学演示。有限元课上给学生讲“整体刚度矩阵是怎么装配出来的”与其画一堆示意图不如直接导出一个简单模型的单元刚度矩阵在MATLAB里做一遍装配让学生看着K是怎么从一个个24×24的单元矩阵拼成几百阶的全局矩阵。这个操作对理解有限元入门非常有帮助。第四种是二次开发和数据交互。做子结构、自由度凝聚、或者把ABAQUS的刚度矩阵导到MATLAB里做模态分析和模型降阶都绕不开这一步。网上经常有人搜“matlab与abaqus数据传递”其实最正规也最省事的通道之一就是MTX文件后面我会给完整脚本。2. 输出手段只有一种*ELEMENT MATRIX OUTPUT关键词2.1 关键词的完整语法与每个参数的角色ABAQUS里导出单元刚度矩阵的官方手段就一个关键词*ELEMENT MATRIX OUTPUT。它只能用在ABAQUS/Standard隐式求解器里Explicit不支持这一点先记住省得在Explicit里折腾半天找不到这个选项。基本语法是*ELEMENT MATRIX OUTPUT, ELSET单元集合名, FILE NAME输出文件名 STIFFNESS几个参数逐个说ELSET必填指定要输出哪些单元。这里填的是模型里的单元集合名可以是CAE里创建的Set也可以手动在inp里定义的*Elset。FILE NAME指定输出文件的主文件名。写FILE NAMEKmatrix求解完成后job目录下会生成一个Kmatrix.mtx。如果不写这个参数矩阵就会写到当前job的.dat文件里。OUTPUT FILE这个参数和FILE NAME是两条路。OUTPUT FILE2是默认值把矩阵写到job的.dat文件OUTPUT FILE6则写到.msg文件。我自己基本只用FILE NAME因为.dat文件本来就够大够乱了再塞一堆矩阵进去找起来头疼。FREQUENCY控制输出频率。写在step里时表示每隔多少个增量步输出一次。线性静力分析只有一个增量步写不写无所谓非线性分析如果不想每个增量步都写就设一个合理的间隔。数据行关键词下面那几行是你要输出的矩阵类型可选STIFFNESS刚度、MASS质量、LOAD CORRECTION载荷修正向量。可以同时写两行比如*ELEMENT MATRIX OUTPUT, ELSETAll, FILE NAMEKM STIFFNESS, MASS这样MTX文件里会分别出现刚度矩阵和质量矩阵的数据块。这里有一个很重要的认知*ELEMENT MATRIX OUTPUT不影响求解过程它纯粹是一个输出请求相当于求解器在形成单元矩阵的时候顺便拷一份给你。所以不用担心加了它会把结果算歪。2.2 在CAE里插入关键词的两种姿势如果你习惯在CAE里操作路径是左侧模型树 → Model → Edit Keywords。在弹出的关键词编辑器里找到第一个*Step之前的位置把关键词块插进去。为什么放在所有Step之前因为ELEMENT MATRIX OUTPUT属于模型级输出设置放在这里它对整个模型的所有step都生效。如果你只想在特定step里输出也可以把关键词块插到那个step内部配合FREQUENCY参数控制增量步输出频率。我个人建议新手统一放在*Step之前先跑通流程再说。如果你直接写inp文件事情更简单把下面这段放在*Step之前就行*Element Matrix Output, elsetAll, file nameSingleHex Stiffness注意inp文件里关键词不区分大小写但集合名、文件名区分。文件名不要带扩展名ABAQUS会自动加.mtx。2.3 一个可以直接抄的最小示例下面这个inp文件是完整可运行的我做单元刚度矩阵验证时经常用这个骨架。它定义了一个1×1×1的C3D8R单元材料是钢只做了一个静力分析步没有施加任何载荷——单纯为了把刚度矩阵“逼”出来*Heading ** Single hex element stiffness export test *Node 1, 0., 0., 0. 2, 1., 0., 0. 3, 1., 1., 0. 4, 0., 1., 0. 5, 0., 0., 1. 6, 1., 0., 1. 7, 1., 1., 1. 8, 0., 1., 1. *Element, typeC3D8R 1, 1, 2, 3, 4, 5, 6, 7, 8 *Elset, elsetAll 1, *Solid Section, elsetAll, materialSteel , *Material, nameSteel *Elastic 210000., 0.3 *Element Matrix Output, elsetAll, file nameSingleHex Stiffness *Step, nameStep-1 *Static *Boundary 1, 1, 3 2, 2, 3 3, 3, 3 *End Step边界条件那三行分别约束了节点1的全部平动、节点2的U2和U3、节点3的U3正好消掉6个刚体模态。跑完job后当前目录下会出现SingleHex.mtx。打开看一眼你就知道ABAQUS到底给你导出了什么。这里提醒一句如果你的模型是CAE建的节点和单元都在Part里ELSET用的集会带实例引用直接拿上面的写法可能报错。稳妥的做法是在CAE的Edit Keywords里插入不要手动复制这段到CAE生成的inp里。3. MTX文件与DAT文件格式拆解以及两者的适用边界3.1 MTX文件坐标格式的“机器友好”文件用FILE NAME参数导出的.mtx文件本质是一种坐标格式Coordinate Format的稀疏矩阵存储。我用上面的单单元例子跑完文件内容大概是这样的ELEMENT NUMBER: 1 MATRIX TYPE: STIFFNESS 1 1 0.6294875321E06 1 2 -0.1968123456E06 1 3 -0.1968123456E06 ...结构很清楚每个单元的数据块以“ELEMENT NUMBER: 编号”开头下一行标明矩阵类型“MATRIX TYPE: STIFFNESS”再往下每一行是三个数——行号、列号、数值。行号和列号都是从1开始的对应的是单元矩阵内部的位置不是全局节点号。三个关键细节第一这个文件只记录非零元素。一个24×24的C3D8R单元刚度矩阵本来有576个元素但实际写入的远少于576行。这是好事文件体积小解析快但你要的是完整稠密矩阵就得自己把没出现的元素补成0。第二不同版本ABAQUS在文件最开头可能有一些额外的头信息行。我见过6.14和2020版的输出格式基本稳定但稳妥起见解析脚本里最好以“ELEMENT NUMBER”作为块的起始标志别的行能跳就跳。第三如果同时输出了STIFFNESS和MASS每个单元会出现两个块分别标着MATRIX TYPE: STIFFNESS和MATRIX TYPE: MASS按输出请求的顺序排列。解析时要根据类型区分。3.2 DAT文件ABAQUS帮你排版好的“人读”报告不写FILE NAME参数时矩阵会写进job的主.dat文件。DAT版本的样子和MTX完全不一样它会把整个矩阵以带行列编号的方块形式打印出来而且零元素也会打出来。一个24×24的矩阵就是24行×24列的数字块每列顶上标着对应的自由度编号排版规则跟ABAQUS经典输出风格一致。这种格式的好处是肉眼看着直观适合单个单元快速检查。比如你想看看矩阵是不是对称的、对角线元素数量级正不正常打开.dat文件拉到对应位置就能瞄一眼。坏处也很明显文件巨大。你有1000个单元.dat文件里就躺着1000个完整的方块矩阵几万行起步任何文本编辑器打开都会卡顿。更麻烦的是解析。DAT格式是定长格式打印的夹杂页眉、页脚、分页符和各种星号横幅你写正则表达式去抠数据要处理的边缘情况一大堆。如果目标是批量处理几百上千个单元走DAT这条路基本是给自己找罪受。3.3 MTX和DAT怎么选一张对比表对比维度MTX文件DAT文件文件位置独立生成的.mtx文件写入job主.dat文件数据形式坐标格式只记录非零项全矩阵方块零元素也打印可读性机器友好人看费劲人眼友好排版规整解析难度低按行切分即可高需要处理大量装饰性文本文件体积小随非零项数量增长大随矩阵规模平方增长典型用途脚本批量处理、二次开发输入单元素快速目检、教学演示我的习惯是验证脚本和二次开发一律用MTX偶尔我就想看一个单元的矩阵长什么样会顺手把OUTPUT FILE2的版本打出来放到.dat里跑完直接搜“MATRIX TYPE”跳着看。两条路都留着对应不同场景。4. 从文件到矩阵Python解析脚本与MATLAB装配实战4.1 用Python把MTX读成scipy稀疏矩阵拿到MTX文件之后第一件事是把它解析成能计算的矩阵。下面这个Python函数是我日常在用的兼容我见过的大部分ABAQUS版本输出import numpy as np from scipy.sparse import coo_matrix def read_abaqus_mtx(path, matrix_typeSTIFFNESS): 解析ABAQUS *ELEMENT MATRIX OUTPUT生成的文件。 返回一个dict: element_number - scipy.sparse.coo_matrix data {} cur_elem None cur_type None rows, cols, vals [], [], [] def flush(): if cur_elem is not None and cur_type matrix_type: data[cur_elem] coo_matrix((vals, (rows, cols))) with open(path) as f: for line in f: line line.strip() if line.startswith(ELEMENT NUMBER): flush() cur_elem int(line.split(:)[-1].strip()) rows, cols, vals [], [], [] elif line.startswith(MATRIX TYPE): cur_type line.split(:)[-1].strip() else: parts line.split() if len(parts) 3: try: i, j, v int(parts[0]), int(parts[1]), float(parts[2]) rows.append(i - 1) cols.append(j - 1) vals.append(v) except ValueError: # 跳过版本头等非数据行 pass flush() return data用法很简单matrices read_abaqus_mtx(SingleHex.mtx) Ke matrices[1].toarray() # 1号单元的24x24刚度矩阵几个设计点解释一下。我把行号和列号减了1转成Python从0开始的索引这样直接能和numpy/scipy对接。返回的是稀疏矩阵而不是稠密矩阵因为大模型导出的MTX文件可能有几十万个非零项全转成稠密矩阵内存扛不住。等你要做装配或者特征值分解再按需调.toarray()。4.2 自由度编号规则为什么矩阵行列号不等于节点号解析完文件大多数人会卡在下一步MTX文件里的行号1到24对应模型里的哪个节点哪个方向规则是这样的对实体单元每个节点3个自由度顺序是U1、U2、U3。矩阵的行列按照单元节点在*Element连通性定义里的顺序排列。第一组3行行1~3对应连通性里的第一个节点行1是U1行2是U2行3是U3行4~6对应第二个节点以此类推。所以在全局坐标系里单元内第k个节点k从1开始的第i个方向自由度对应的矩阵行号是3×(k-1)i。反过来如果你知道单元里某个节点的实际编号N它在全局刚度矩阵里的自由度编号是3×(N-1)i。这里的坑在于ABAQUS在求解时使用的是节点在单元连接表里的顺序而不是节点编号的大小顺序。如果你的网格是用脚本生成的节点编号恰好是乱序的那MTX文件里的行顺序和你按节点编号大小推断出来的顺序完全是两回事直接套公式会得到一堆对不上的错误矩阵。正确做法永远是从inp或ODB里读出单元连通性再按照连通性顺序去映射自由度。4.3 MATLAB装配全局刚度矩阵顺手解决“数据传递”难题拿到所有单元的Ke之后下一步通常是装配全局刚度矩阵。如果你把ABAQUS只当成“计算器”把矩阵导到MATLAB里做后续处理这一步就是“matlab与abaqus数据传递”问题的核心。装配的代码思路就三行先建一个全零的全局矩阵再把每个单元的Ke按自由度位置叠加进去。MATLAB里可以这么写function K assemble_global(connect, Ke_cell, nnodes) % connect : nelem x 8 的单元连通性矩阵节点编号 % Ke_cell : 1 x nelem 的元胞数组每个元素是24x24的单元刚度矩阵 % nnodes : 模型中节点总数实体单元按3自由度/节点处理 ndof nnodes * 3; K zeros(ndof, ndof); for e 1:size(connect, 1) nodes connect(e, :); dofs zeros(1, 24); dofs(1:3:end) 3 * (nodes - 1) 1; % U1 dofs(2:3:end) 3 * (nodes - 1) 2; % U2 dofs(3:3:end) 3 * (nodes - 1) 3; % U3 K(dofs, dofs) K(dofs, dofs) full(Ke_cell{e}); end end这个函数里的dofs构造方式值得多看两眼。1:3:end取的是每个节点的U1位置2:3:end取U23:3:end取U3拼出来的dofs向量正好和MTX文件里矩阵的行列顺序一致。如果你的模型包含梁、壳这类每个节点6个自由度的单元把3改成6dofs长度改成6×节点数逻辑不变。装配完的全局矩阵你可以做特征值分析验证模态频率可以做自由度凝聚做子结构也可以和ABAQUS内部求得的位移解做交叉校验。我做过一个对比1000个C3D8R单元的悬臂梁用MATLAB装配全局K解静力方程得到的节点位移和ABAQUS直接算出来的结果在小数点后6位以内对上。这个吻合本身就是对你解析脚本和装配逻辑最好的验证。5. 实测验证单六面体单元刚度矩阵的“体检”流程5.1 测试模型设计为什么要用1×1×1的单单元第一次导单元刚度矩阵强烈建议不要直接在真实模型上操作。先用一个单个六面体单元把整个流程跑通原因很简单单单元模型的期望结果你能用手算或者直觉判断任何一步出错都能立刻发现。我用的模型就是2.3节那个inp文件一个1×1×1的C3D8R单元E210000MPaν0.3。尺寸取单位1是为了让数值尽量“好读”弹性模量取钢材的这样矩阵元素数量级在10^5~10^6之间和手算估计值容易对上。跑完job用4.1节的脚本读回矩阵然后按下面三个步骤做体检。这三步是我反复用的“矩阵健康检查”每次导出的新矩阵都会过一遍。5.2 三项物理校验对称性、行和、特征值第一步对称性检查。理论上刚度矩阵必须是对称的因为应变能密度对位移的二阶导数是对称的。检查方法是用矩阵减去它的转置看Frobenius范数的相对误差residual np.linalg.norm(Ke - Ke.T) relative residual / np.linalg.norm(Ke) print(relative) # 正常应该 1e-12如果相对误差在10的负12次方以下说明解析脚本和文件格式都没问题——ABAQUS内部本来就保证对称你的解析过程破坏了对称性这个检查立刻能抓到。第二步行和检查。物理上把单元所有节点同时平移一个单位向量单元内部应变不变所以任意一个对应平动自由度的行其所有元素之和应该接近0。这个“行和为零”是刚体平动不变性的直接推论。检查方法row_sums Ke.sum(axis1) # C3D8R只有平动自由度24行都应该接近0 print(np.max(np.abs(row_sums))) # 正常应该在1e-6以下这个检查有个需要注意的地方只适用于纯平动自由度的实体单元。梁、壳单元有转动自由度转动自由度对应的行和不为零不要机械套用。第三步特征值检查。对24×24的Ke做特征值分解理论上应该出现6个零特征值对应3个平动和3个转动的刚体模态。C3D8R在默认沙漏控制下情况会有点不同——这一点下面单独说。特征值分解还能帮你发现负特征值如果有说明单元刚度为负多半是材料定义或单元技术出了问题这在umat调试中是个非常灵敏的报警器。5.3 实测对比C3D8与C3D8R在“零特征值”上的差异把2.3节的单元类型从C3D8R换成C3D8重跑一遍分别导出两个矩阵做特征值对比你会看到一个很有信息量的差异。C3D8全积分单元6个特征值严格为0数值上在10的负8次方量级对应6个刚体模态干净利落。C3D8R减缩积分单元6个刚体模态对应的特征值不再是理想的0而是小正数。这是因为减缩积分单元在默认沙漏控制下ABAQUS会额外附加一个沙漏刚度来抑制零能量模式这个附加刚度让原本的零特征值变成小正数。这个“小”是相对的——它比正常变形模态的特征值小2到3个数量级但具体小多少跟单元形状、材料、沙漏控制参数有关。这个对比解释了为什么减缩积分单元在某些工况下偏软沙漏刚度是人为加进去的补丁它对真实变形的贡献是近似的在粗网格下这种近似就会表现为整体刚度偏低。我开头的Voronoi模型踩的就是这个坑——晶界附近的大变形区恰好用了C3D8R沙漏刚度不足导致界面开裂前的整体响应偏软协同cohesive的参数一起把曲线整条拉低了。如果你导出矩阵后发现特征值出现负数或者刚体模态特征值大得离谱说明沙漏控制参数设置有问题或者单元被过度扭曲。这时候回到*Section Controls里调整沙漏刚度系数重新导出对比是最有效的排查路径。6. 踩坑清单从坐标系到自由度编号十几个教训一次列全6.1 局部坐标系陷阱梁、壳和cohesive单元的矩阵不在全局坐标系里这是我在单单元模型跑通之后第一个踩的坑。实体单元C3D8R、C3D20等的单元刚度矩阵是直接在全局坐标系下计算的导出结果可以直接和手算全局坐标系的公式比。但梁单元B31、B32、壳单元S4R、S8R和cohesive单元不一样——它们的刚度矩阵是在单元局部坐标系下形成的。换句话说一个在全局坐标系里斜置45°的B31梁单元你导出的12×12刚度矩阵并不是你按全局坐标展开梁理论得到的那个矩阵。矩阵里的元素对应的是单元局部1轴、2轴方向的位移和转角必须经过坐标变换矩阵T的旋转变换才能得到全局坐标系下的刚度[ K_{global} T^T K_{local} T ]对cohesive单元来说情况更微妙。cohesive单元的局部坐标由单元的几何法向和切向决定矩阵的法向刚度项和切向刚度项直接对应你的cohesive本构参数。我做Voronoi模型时就发现某个随机取向的cohesive单元导出的矩阵和按全局坐标预估的对不上后来才确认是局部坐标系的缘故。所以拿到矩阵先问自己一句这个单元的局部坐标系在哪里实体单元不用问梁壳和cohesive一定要查清楚否则后续对比全是白做。6.2 内部自由度C3D8I的矩阵为什么不是24×24另一个容易栽跟头的地方是带内部自由度的单元。最典型的是C3D8I——8节点非协调六面体单元。它除了8个节点的24个位移自由度还有3个内部非协调模态自由度总共27个自由度。当你导出C3D8I的刚度矩阵时会发现矩阵是27×27其中行号25、26、27对应的不是任何节点的位移而是内部非协调模式的广义自由度。C3D20是60×6020节点×3自由度没有这个问题但C3D8I和用户自定义单元UEL都有可能带内部自由度。如果你的解析脚本硬套“行号1~24是第一节点”“行号25以上报错”就会莫名其妙地翻车。我的建议是解析时不要预先假设矩阵维度直接用MTX文件里的最大行号或最大列号动态推断n max(max(rows), max(cols))然后再根据单元类型判断这些行分别代表什么。这样即使遇到27×27、60×60甚至更奇葩的维度脚本都不会崩。6.3 装配体与实例变换多实例模型的坐标系问题如果你的模型是CAE建的用了Part和一个以上的Instance导出矩阵时的坐标系问题需要额外留意。对实体单元ABAQUS计算刚度矩阵时使用的是实例变换后的节点坐标B矩阵在全局坐标系下构造所以导出的Ke本身已经包含了实例的平移和旋转信息是在全局坐标系下的。这一点和单零件模型没有区别。但有一个例外情况如果零件实例做了非均匀缩放比如X方向拉伸1.2倍、Y方向不变单元形状发生了改变这时候导出的刚度矩阵和你期望的“标准尺寸单元”的刚度矩阵自然不同。非均匀缩放会让单元产生额外的畸变直接影响积分点的雅可比行列式矩阵数值会变得比较“怪”。这是正常的但要意识到。对梁、壳和cohesive单元实例变换叠加局部坐标系的问题更复杂。我建议在跑多实例模型之前先导出一个单实例单单元模型把坐标系问题彻底搞清楚再上复杂模型。不要指望一次性在多实例模型上直接验证矩阵——出错了你根本分不清是坐标系问题还是模型设置问题。6.4 非线性步、频率参数和版本差异最后几个容易忽略的细节非线性分析中导出刚度矩阵要特别小心一个概念当NLGEOM开启时ABAQUS在增量步里形成的单元矩阵是当前状态的切线刚度矩阵里面包含了材料切线模量和几何刚度初应力项的共同贡献。这和线性静力步里那个纯粹的线弹性Ke不是一回事。如果你的目的是验证材料本构的弹性刚度务必在不开NLGEOM的线性静力步里导出或者用Linear Perturbation步在未变形基态上导出。否则拿切线刚度去和理论弹性刚度对比数值对不上还以为是代码写错了。频率相关的坑我也提一句。*ELEMENT MATRIX OUTPUT的FREQUENCY参数控制的是输出频率非线性分析里默认每个增量步都会写。如果你的模型非线性增量很多又没有限制输出频率整个分析步几百个增量步每个增量步都往MTX文件里追加所有选定单元的矩阵文件会膨胀到几个GB。文件大了之后ABAQUS本身求解速度也会被拖慢——因为它要在每个增量步做一次额外的文件IO。实际操作中我通常在调试阶段把FREQUENCY设成1确认没问题后改成FREQUENCY99999只在最后一个增量步输出或者干脆移除这个关键词。最后是版本问题。我在6.14、2019、2023三个版本上跑过同样的单单元模型MTX文件的块结构基本一致但个别版本在文件头部会多一些注释性的行。解析脚本里我已经用异常处理把非数据行跳过了如果你用的是更老的版本建议先手工打开MTX文件看一眼结构再套脚本。还有一个很多人问过的点这个关键词能不能导出全局刚度矩阵答案是不能。ELEMENT MATRIX OUTPUT只输出单元级别的矩阵不做全局装配。想要全局矩阵要么像4.3节那样自己写脚本装配要么用SUBSTRUCTURE GENERATE走子结构生成的路线。子结构生成的.mtx文件格式和单元矩阵输出类似但内容是整体结构的等效刚度矩阵适合做大规模模型降阶。这篇文章不展开但知道有这条路就好。最后再分享一个小习惯桌面放一个空白的单单元inp模板就是2.3节那个文件路径改成自己的临时目录。每次需要验证新的材料参数、新的单元类型或者新的脚本逻辑第一件事就是套这个模板跑一遍导出的矩阵做一遍5.2节的三项体检。体检过了逻辑才敢往大模型上搬。这十分钟的“仪式感”能帮你省下后面排查复杂模型时的好几个通宵。
网站建设高端定制企业官网