4. 网格文件格式与数据交换
在 Sentaurus 工作流中,网格从来不是“画完就固定”的静态产物。结构编辑器生成网格、器件仿真器读取网格、可视化工具渲染网格、脚本工具后处理网格,每一步都涉及网格数据在不同工具之间的传递。理解 TDR、DF-ISE、Grd 等格式的定位与差异,是避免“网格明明画好了,仿真却报错”这类问题的前提。
一、三类格式的定位差异
Sentaurus 生态中常见的网格相关格式可以按“角色”分为三层:
- TDR(Taurus Data Repository):Sentaurus 的原生容器格式,基于 HDF5。它不只存网格,还存掺杂、材料、电极、数据集(如电场、载流子浓度)以及仿真状态。TDR 是“网格 + 物理场 + 元数据”的一体化载体,也是 Sentaurus Workbench 中默认的节点间传递格式。
- DF-ISE(ISE Data Format):早期 ISE TCAD 体系的数据格式,由
dfise库读写,通常以.grd(网格)和.dat(数据集)成对出现。它结构清晰、文本可读性好,常用于与旧版工具或第三方脚本交换网格。 - Grd / 纯网格文件:只描述几何、节点、单元连接关系和区域/电极归属,不携带物理场。它是最“轻”的交换格式,适合把网格单独交给外部工具做质量检查或重划分。
三者的关系可以概括为:Grd 是骨架,DF-ISE 是骨架加标签,TDR 是骨架、标签、物理场和仿真状态的完整快照。选择哪种格式,取决于你要传递的是“几何”还是“几何 + 结果”。
二、TDR 格式解析要点
TDR 基于 HDF5,可以用 h5ls、h5dump 或 Python 的 h5py 直接查看内部结构。一个典型的 TDR 文件包含以下层级:
/collection/ # 数据集集合
/dataset/ # 物理场数据(电场、浓度等)
/geometry/ # 网格几何
/vertex/ # 节点坐标
/element/ # 单元连接
/region/ # 区域划分
/boundary/ # 边界与电极
/state/ # 仿真状态与求解器信息
/parameters/ # 材料与模型参数
实际使用中最容易出问题的是 /geometry/region 与 /geometry/boundary 的命名。SDevice 在读取 TDR 时,会按区域名和电极名去匹配物理模型与接触条件。如果 SDE 中定义的是 R.Source,而重划分后变成了 R.Source_1,仿真就会报“找不到接触”或“区域未定义”。因此,在 TDR 传递前后,建议用 tdx 或 Python 脚本先列出区域与电极清单,确认命名未漂移。
三、DF-ISE 与 Grd 的转换操作
DF-ISE 格式通常由 .grd 和 .dat 两个文件组成。转换时最常用的命令是 dfise 工具集:
# 将 TDR 转为 DF-ISE 网格
tdx -m tdr2ise -i input.tdr -o output
# 生成 output.grd 与 output.dat
# 仅提取网格,剥离数据集
dfise -g output.grd -o mesh_only.grd
# 查看网格统计信息
dfise -s mesh_only.grd
转换过程中需要重点检查三类信息:
- 节点与单元数量:转换前后应一致。若数量变化,说明有单元被丢弃或合并,通常与退化单元或重复节点有关。
- 区域与材料映射:DF-ISE 用
region和material字段描述,转换后要确认材料名与 SDevice 材料库一致(如Silicon而非Si)。 - 电极边界:电极在 DF-ISE 中通常以
contact形式出现在边界段,转换后要确认每个电极仍有对应的边界节点集。
四、跨工具传递的常见陷阱与处理
网格数据在工具间传递时,问题往往不在“格式能不能读”,而在“读进来之后语义是否还对”。以下三类陷阱最常见:
第一,坐标系与单位不一致。 SDE 默认长度单位是微米,但某些外部网格生成器可能用纳米或米。转换后如果节点坐标整体差 1000 倍,仿真区域会变成“巨大”或“极小”,收敛行为完全改变。处理方式是在转换脚本中显式检查坐标范围,例如用 Python 读取 .grd 后打印 min/max 坐标,与预期器件尺寸比对。
第二,区域命名与材料绑定丢失。 纯 Grd 文件只保留几何,不保留材料语义。如果直接把 Grd 交给 SDevice,仿真器无法知道哪个区域是硅、哪个是氧化层。正确做法是:要么在 DF-ISE 层面保留 material 字段,要么在 SDevice 命令文件中用 Region 语句显式重新绑定材料。
第三,数据集与网格不匹配。 把旧网格的 .dat 强行套到新网格上,会出现“节点数不一致”或“插值错误”。TDR 内部通过数据集与几何的引用关系避免这个问题,但 DF-ISE 的 .grd 与 .dat 是分离文件,必须成对更新。重划分网格后,旧 .dat 应丢弃或通过插值工具重新映射。
.grd 虽然可读,但节点编号与单元连接是强耦合的,手工改动极易引入孤立节点或负体积单元,导致仿真直接失败。五、一个可复用的转换检查清单
下面这份清单可直接用于每次网格格式转换后的快速验证,字段和判断依据都来自实际工程经验:
| 检查项 | 检查方法 | 合格判据 |
|---|---|---|
| 节点/单元数量 | dfise -s 或 h5dump 统计 |
转换前后一致,偏差为 0 |
| 坐标范围 | 读取顶点坐标 min/max | 与器件设计尺寸一致(如 0~1 μm) |
| 区域清单 | 列出所有 region 名称 | 与 SDE 中定义完全一致,无后缀漂移 |
| 材料绑定 | 检查 material 字段 | 材料名在 SDevice 材料库中存在 |
| 电极边界 | 统计 contact 节点数 | 每个电极节点数 > 0,且与预期接触面积匹配 |
| 单元质量 | 检查最小角、体积 | 无负体积、无零面积单元 |
把这份清单固化到脚本里,每次转换后自动跑一遍,比等到 SDevice 报错再回头排查要高效得多。网格格式本身并不复杂,复杂的是格式背后承载的语义——区域、材料、电极、单位、数据集引用。只要在传递的每个环节都确认这些语义没有丢失,TDR、DF-ISE、Grd 之间的转换就可以做到稳定可控。