5.5 KiB
5.5 KiB
关于不同形状设备尺寸信息获取建议
当前 SimBuilder 中的 injectDeviceSize 方法仅处理了简单的 diameter (或 outer_diameter) 和 height 属性,主要适用于 CylindricalTank(圆柱槽)和 AnnularTank(环形槽)。根据文档《关于不同形状设备尺寸信息.md》,系统中存在多种形状复杂的设备,其尺寸信息结构各异。
为了确保仿真模型能够准确获取各类设备的几何参数,建议对 injectDeviceSize 方法进行如下扩展:
1. 设备类型与尺寸结构分析
| 设备类型 (type) | 中文名称 | JSON 结构示例 | 需提取的关键属性 | 备注 |
|---|---|---|---|---|
| FlatTank | 扁平槽 | {"width": 40, "height": 15, "length": 100} |
width, height, length |
平板几何,无直径概念 |
| CylindricalTank | 圆柱槽 | {"height": 120, "diameter": 200} |
diameter, height |
已支持 |
| AnnularTank | 环形槽 | {"height": 150, "outer_diameter": 100} |
outer_diameter, height, inner_diameter (如有) |
环形,通常关注外径 |
| TubeBundleTank | 管束槽 | {"height": 200, "outer_diameter": 120} |
outer_diameter, height |
结构类似圆柱,但内部有管束 |
| ExtractionColumn | 萃取柱 | {"tray_section": {"height": 800, "diameter": 100}, "lower_expanded": {...}, ...} |
复合结构。建议提取主体段 (tray_section) 的尺寸,或展平所有段的尺寸。 | 结构复杂,需分段解析 |
| FluidizedBed | 流化床 | {"expanded_section": {...}, "reaction_section": {...}, ...} |
复合结构。建议提取反应段 (reaction_section) 的尺寸。 | 结构复杂,需分段解析 |
| ACFTank | 锥底环形槽 | {"frustum_bottom": {...}, "annular_cylinder": {...}} |
复合结构。建议提取圆柱段 (annular_cylinder) 的尺寸。 | 结构复杂,需分段解析 |
2. 代码修改建议
建议将 injectDeviceSize 重构为基于 deviceType 的分发逻辑,针对不同设备类型采用不同的解析策略。
private void injectDeviceSize(Device device, Map<String, Double> staticProps) {
try {
String sizeJson = device.getSize();
if (sizeJson == null || sizeJson.isBlank()) return;
JsonNode sizeNode = objectMapper.readTree(sizeJson);
String type = device.getType(); // 假设 Device 有 getType() 方法,或从外部传入
if (type == null) {
// Fallback: 尝试通用解析 (现有逻辑)
parseCommonSize(sizeNode, staticProps);
return;
}
switch (type) {
case "FlatTank":
if (sizeNode.has("width")) staticProps.put("width", sizeNode.get("width").asDouble());
if (sizeNode.has("length")) staticProps.put("length", sizeNode.get("length").asDouble());
if (sizeNode.has("height")) staticProps.put("height", sizeNode.get("height").asDouble());
break;
case "CylindricalTank":
case "AnnularTank":
case "TubeBundleTank":
parseCommonSize(sizeNode, staticProps);
break;
case "ExtractionColumn":
// 优先提取 tray_section (塔身)
if (sizeNode.has("tray_section")) {
parseCommonSize(sizeNode.get("tray_section"), staticProps);
}
// 可选:将其他段的尺寸作为特殊属性注入,例如 lower_expanded_height
break;
case "FluidizedBed":
// 优先提取 reaction_section (反应段)
if (sizeNode.has("reaction_section")) {
parseCommonSize(sizeNode.get("reaction_section"), staticProps);
}
break;
case "ACFTank":
// 优先提取 annular_cylinder (圆柱段)
if (sizeNode.has("annular_cylinder")) {
parseCommonSize(sizeNode.get("annular_cylinder"), staticProps);
}
break;
default:
parseCommonSize(sizeNode, staticProps);
}
} catch (Exception e) {
System.err.println("解析Device.size失败:" + e.getMessage());
}
}
private void parseCommonSize(JsonNode node, Map<String, Double> staticProps) {
if (node.has("outer_diameter")) {
staticProps.put("diameter", node.get("outer_diameter").asDouble());
} else if (node.has("diameter")) {
staticProps.put("diameter", node.get("diameter").asDouble());
}
if (node.has("height")) {
staticProps.put("height", node.get("height").asDouble());
}
}
3. 注意事项
- 复合结构处理:对于
ExtractionColumn等分段设备,目前的建议是提取“主体段”的尺寸作为该设备的代表尺寸(diameter/height)。如果仿真计算需要每一段的精确尺寸,建议将staticProps的结构进行展平(例如tray_section_diameter,lower_expanded_height)或嵌套存储(需修改 SimUnit 和 SimResultConverter 以支持嵌套 Map)。 - 单位统一:确保 JSON 中的数值单位与仿真模型要求的单位一致(通常为 cm 或 mm)。
- 鲁棒性:解析时需判空,避免因 JSON 结构缺失导致异常。