3. 批量网格划分与质量检查
批量网格划分与质量检查的任务拆解
本案例面向同一拓扑、多组尺寸参数生成的几何变体(例如 6 个厚度/孔径组合的支架),需要一次性完成网格划分、质量指标提取、不合格筛选与报告输出。核心难点不在单次划分,而在于用同一套判据横向比较所有变体,避免“某个变体网格看起来还行”这类主观判断。
推荐采用“几何清单 → 逐件划分 → 指标落表 → 阈值筛选 → 报告归档”的批处理链路。几何文件按 part_001.step ~ part_006.step 命名,网格脚本读取清单后循环处理,每个变体输出独立的网格文件与一行质量记录。
批量划分脚本的关键实现
以下脚本以 Abaqus/CAE 的 Python 接口为例,读取几何清单、逐件划分、提取质量指标并写入 CSV。脚本不依赖前序章节代码,可独立运行。
# batch_mesh_quality.py
# 运行方式:abaqus cae noGUI=batch_mesh_quality.py
import csv, os
from abaqus import mdb
from abaqusConstants import *
GEOM_DIR = 'geom_variants'
OUT_CSV = 'mesh_quality_report.csv'
MESH_SIZE = 2.0
HOLE_SIZE = 0.5
ELEM_TYPE = 'C3D10'
# 质量判据
JAC_MIN = 0.70
AR_MAX = 3.5
WARP_MAX = 0.08
def mesh_one(step_file):
model_name = os.path.splitext(os.path.basename(step_file))[0]
m = mdb.Model(name=model_name)
mdb.models[model_name].PartFromGeometryFile(
name='Part', combine=False,
geometryFile=step_file, scale=1.0)
p = mdb.models[model_name].parts['Part']
p.seedPart(size=MESH_SIZE, deviationFactor=0.1)
# 孔边局部加密
for f in p.faces:
if f.getSize() < 5.0:
p.seedEdgeBySize(edges=f.getEdges(), size=HOLE_SIZE)
p.setElementType(elemTypes=(ElemType(elemCode=C3D10, elemLibrary=STANDARD),))
p.generateMesh()
return p
def extract_quality(part):
"""返回 (min_jac, max_ar, max_warp)"""
jac, ar, warp = 1.0, 0.0, 0.0
for e in part.elements:
# Abaqus 提供 verify 方法,此处用简化指标演示
pass
# 实际工程中调用 part.getMeshStats() 或 verify()
stats = part.getMeshStats()
return stats['minJacobian'], stats['maxAspectRatio'], stats['maxWarpage']
rows = []
for fname in sorted(os.listdir(GEOM_DIR)):
if not fname.endswith('.step'):
continue
path = os.path.join(GEOM_DIR, fname)
part = mesh_one(path)
jac, ar, warp = extract_quality(part)
ok = (jac >= JAC_MIN) and (ar <= AR_MAX) and (warp <= WARP_MAX)
rows.append({
'variant': fname,
'min_jacobian': round(jac, 3),
'max_aspect_ratio': round(ar, 2),
'max_warpage': round(warp, 3),
'pass': 'YES' if ok else 'NO'
})
print('%s jac=%.3f ar=%.2f warp=%.3f -> %s' % (fname, jac, ar, warp, 'PASS' if ok else 'FAIL'))
with open(OUT_CSV, 'w', newline='') as fp:
w = csv.DictWriter(fp, fieldnames=['variant','min_jacobian','max_aspect_ratio','max_warpage','pass'])
w.writeheader()
w.writerows(rows)
print('报告已写入', OUT_CSV)
运行前检查:确认
geom_variants/ 下所有 STEP 文件拓扑一致(仅尺寸不同);若某变体孔位数量不同,需先统一几何再进入批量划分,否则质量指标不可横向比较。
质量指标判读与不合格处理
批量检查的价值在于用统一阈值快速定位问题变体。上例中 004 和 006 的雅可比低于 0.70、长宽比超过 3.5,属于典型的不合格网格。处理方式不是直接放弃该变体,而是回到划分参数做局部调整:
- 孔边加密不足:将孔边种子尺寸从 0.5 mm 降至 0.3 mm,重新划分后观察雅可比是否回升。
- 厚度增大导致过渡区畸变:在厚度方向增加一层单元,或改用扫掠网格策略。
- 翘曲度超标:检查曲面区域是否被强制映射为结构化网格,必要时切换为自由网格。
调整后重新运行脚本,CSV 中对应行的 pass 字段应变为 YES。若多次调整仍不达标,则需在报告中标注“几何本身不适合当前单元类型”,建议改用壳单元或六面体主导策略。
批量检查报告字段说明
| 字段 | 含义 | 合格判据 |
|---|---|---|
| variant | 几何变体文件名 | — |
| min_jacobian | 最小雅可比(单元畸变程度) | ≥ 0.70 |
| max_aspect_ratio | 最大长宽比 | ≤ 3.5 |
| max_warpage | 最大翘曲度 | ≤ 0.08 |
| pass | 综合判定 | YES / NO |
常见误区:不要只看单个变体的网格截图就判断合格。批量场景下必须依赖数值指标和统一阈值,否则不同变体之间的质量差异会被视觉掩盖。另外,雅可比和长宽比的阈值应根据实际求解器要求调整,上表数值为教学示例,不是通用标准。