""" pymatgen skill helpers — 建材院无机材料场景常用映射(中文相名 → 化学式)。 LLM 在 sandbox 中只应使用 `CEMENT_PHASES` / `lookup_phase` 和离线 pymatgen。 Materials Project 联网查询走 host-side `mp_*` tools,不要在 sandbox 里读 MP_API_KEY。 """ from __future__ import annotations # 中文/简写 → 化学式映射。覆盖建材院 R&D 高频物相。 # 添加新条目时: # - key 用用户最自然的称呼(中文 / 行业简写),value 是 mp 能识别的化学式 # - 同一物相多种叫法都加 key,指向同一化学式(C3S / 硅酸三钙 / 阿利特 都是 Ca3SiO5) CEMENT_PHASES: dict[str, str] = { # ---- 硅酸盐水泥熟料矿物 ---- "C3S": "Ca3SiO5", "硅酸三钙": "Ca3SiO5", "阿利特": "Ca3SiO5", "alite": "Ca3SiO5", "C2S": "Ca2SiO4", "硅酸二钙": "Ca2SiO4", "贝利特": "Ca2SiO4", "belite": "Ca2SiO4", "C3A": "Ca3Al2O6", "铝酸三钙": "Ca3Al2O6", "C4AF": "Ca4Al2Fe2O10", "铁铝酸四钙": "Ca4Al2Fe2O10", "铁相": "Ca4Al2Fe2O10", # ---- 水化产物 ---- "C-S-H": "Ca1.5SiO3.5·xH2O", "水化硅酸钙": "Ca1.5SiO3.5·xH2O", "CH": "Ca(OH)2", "氢氧化钙": "Ca(OH)2", "portlandite": "Ca(OH)2", "钙矾石": "Ca6Al2(SO4)3(OH)12·26H2O", "AFt": "Ca6Al2(SO4)3(OH)12·26H2O", "ettringite": "Ca6Al2(SO4)3(OH)12·26H2O", "AFm": "Ca4Al2(OH)12(SO4)·6H2O", "单硫型水化硫铝酸钙": "Ca4Al2(OH)12(SO4)·6H2O", # ---- 石膏 / 硫酸盐 ---- "石膏": "CaSO4·2H2O", "二水石膏": "CaSO4·2H2O", "gypsum": "CaSO4·2H2O", "半水石膏": "CaSO4·0.5H2O", "硬石膏": "CaSO4", "anhydrite": "CaSO4", # ---- 碳酸盐 / 碳化产物 ---- "方解石": "CaCO3", "calcite": "CaCO3", "文石": "CaCO3", "aragonite": "CaCO3", # ---- 陶瓷 / 耐火常见相 ---- "莫来石": "Al6Si2O13", "mullite": "Al6Si2O13", "堇青石": "Mg2Al4Si5O18", "cordierite": "Mg2Al4Si5O18", "刚玉": "Al2O3", "α-Al2O3": "Al2O3", "corundum": "Al2O3", "方镁石": "MgO", "periclase": "MgO", "尖晶石": "MgAl2O4", "spinel": "MgAl2O4", "锆英石": "ZrSiO4", "zircon": "ZrSiO4", "石英": "SiO2", "quartz": "SiO2", "方石英": "SiO2", "cristobalite": "SiO2", "鳞石英": "SiO2", "tridymite": "SiO2", # ---- 玻璃常见组分晶相 ---- "钙长石": "CaAl2Si2O8", "anorthite": "CaAl2Si2O8", "钠长石": "NaAlSi3O8", "albite": "NaAlSi3O8", "硅灰石": "CaSiO3", "wollastonite": "CaSiO3", "透辉石": "CaMgSi2O6", "diopside": "CaMgSi2O6", # ---- 其他常见 ---- "白云石": "CaMg(CO3)2", "dolomite": "CaMg(CO3)2", "赤铁矿": "Fe2O3", "hematite": "Fe2O3", "磁铁矿": "Fe3O4", "magnetite": "Fe3O4", } def lookup_phase(name: str) -> str: """中文/简写相名 → 化学式。命中返回化学式,未命中抛 KeyError(带建议)。""" if name in CEMENT_PHASES: return CEMENT_PHASES[name] # 大小写不敏感再查一遍 lower = name.lower() for k, v in CEMENT_PHASES.items(): if k.lower() == lower: return v raise KeyError( f"{name!r} 不在 CEMENT_PHASES 映射表里。" f"若是新相,直接把化学式喂给 pymatgen / Materials Project;" f"若高频用,补到 skills/pymatgen/materials.py 的 CEMENT_PHASES。" )