2. CAE前处理模板自动套用

CAE前处理模板自动套用 学习卡片

为什么“模板套用”不能靠复制粘贴

系列化产品的几何拓扑一致,但尺寸、位置和命名会变化。手工前处理时,工程师通常重复做三件事:按同一套规则划网格、赋同一组材料、加同一类边界条件。问题在于,几何一旦重建,面/边/体的编号和坐标都会变,直接复制旧模型的网格与边界会错位。因此自动化套用的核心不是“复制”,而是用稳定的选择规则重新定位几何对象,再把模板参数重新绑定上去。

模板套用的对象映射关系

把模板拆成三类可复用资产:网格控制模板、材料属性模板、边界条件模板。每类模板都需要一个“锚点”来定位到新几何上。常用锚点包括:命名面(Named Selection)、几何特征(圆柱面、平面、边)、坐标范围、以及拓扑邻接关系。下图给出模板资产与新几何之间的映射链路,以及套用失败时的回退判断。

模板资产库 网格控制模板 全局尺寸 / 局部加密 边界层 / 扫掠设置 材料属性模板 弹性模量 / 泊松比 密度 / 屈服强度 边界条件模板 固定约束 / 对称面 载荷大小 / 方向 锚点选择规则 命名面 / 特征类型 坐标范围 / 邻接关系 模板映射引擎 1. 读取新几何拓扑 2. 按锚点规则匹配面/边 3. 校验匹配数量与类型 4. 绑定模板参数 5. 输出前处理脚本 匹配失败 → 记录并跳过 新几何模型 几何面 A 命名: "MountFace" 类型: 平面 几何面 B 命名: "LoadFace" 类型: 平面 几何体 C 命名: "Body" 材料: 待赋值 几何边 D 命名: "EdgeSym" 类型: 直线边 输出:前处理脚本 / 模型文件 网格已划分 · 材料已赋值 · 边界条件已施加 · 映射日志已生成 匹配失败处理 锚点数量不符 → 检查命名是否丢失 锚点类型不符 → 放宽为坐标范围匹配 仍失败 → 标记待人工 并写入异常清单

模板套用的关键实现步骤

以下以 Python 驱动 CAE 前处理为例,展示模板套用的核心逻辑。假设几何已通过命名面(Named Selection)保留了锚点信息,模板以 JSON 格式存储。

import json

# 模板定义:锚点名称 → 模板参数
TEMPLATE = {
    "mesh": {
        "global_size": 2.0,
        "local_refine": {"MountFace": 0.5, "LoadFace": 0.8},
        "boundary_layer": {"EdgeSym": {"layers": 3, "growth": 1.2}}
    },
    "material": {
        "Body": {"name": "Steel_AISI_1045", "E": 205000, "nu": 0.29, "rho": 7.85e-9}
    },
    "boundary": {
        "MountFace": {"type": "fixed"},
        "LoadFace": {"type": "force", "magnitude": 1500, "direction": [0, -1, 0]}
    }
}

def apply_template(geo, template):
    """将模板套用到新几何上,返回映射日志"""
    log = []
    # 1. 网格控制
    mesh = template["mesh"]
    geo.set_global_mesh_size(mesh["global_size"])
    for face_name, size in mesh["local_refine"].items():
        face = geo.get_named_face(face_name)
        if face is None:
            log.append(f"[WARN] 网格锚点缺失: {face_name}")
            continue
        geo.set_local_mesh_size(face, size)
        log.append(f"[OK] 网格加密: {face_name} -> {size}")

    # 2. 材料赋值
    for body_name, mat in template["material"].items():
        body = geo.get_named_body(body_name)
        if body is None:
            log.append(f"[WARN] 材料锚点缺失: {body_name}")
            continue
        geo.assign_material(body, mat)
        log.append(f"[OK] 材料赋值: {body_name} -> {mat['name']}")

    # 3. 边界条件
    for face_name, bc in template["boundary"].items():
        face = geo.get_named_face(face_name)
        if face is None:
            log.append(f"[WARN] 边界锚点缺失: {face_name}")
            continue
        geo.add_boundary_condition(face, bc)
        log.append(f"[OK] 边界条件: {face_name} -> {bc['type']}")

    return log

# 执行套用
# geo = load_geometry("variant_003.step")
# log = apply_template(geo, TEMPLATE)
# for line in log:
#     print(line)
锚点稳定性建议:优先使用命名面而非几何 ID。命名面在几何重建后若拓扑一致,名称通常能保留;若名称丢失,可退化为“按坐标范围 + 面类型”匹配,但需在日志中标记为降级匹配,便于后续人工复核。

套用结果验证

套用完成后,不能只看脚本是否跑通,还要验证三件事:网格是否覆盖全部体、材料是否赋到正确体、边界条件是否落在正确面上。建议输出一份映射日志,逐条记录“锚点名称 → 匹配结果 → 参数值”。若某条记录为 WARN,则该模型需人工介入。

检查项通过条件异常处理
网格锚点匹配数等于模板中定义的局部加密面数量缺失面记录到日志,不中断整体流程
材料赋值体数等于模板中定义的体数量未匹配体保持默认材料,标记待确认
边界条件面数等于模板中定义的边界面数量缺失面跳过,输出异常清单
网格质量雅可比 > 0.3,无负体积触发局部重划或调整全局尺寸
常见坑:几何重建后,如果命名面在 CAD 端未同步更新,CAE 端会直接找不到锚点。建议在几何重建脚本中同步维护命名面,或在套用前先执行一次“命名面完整性检查”,确认所有锚点存在后再进入模板套用。