EXL-50U V58 PTEFIT 训练数据集
收藏资源简介:
### 第一步:注册魔搭账号 1. 打开 [魔搭社区官网](https://www.modelscope.cn/) 2. 点击右上角 **登录 / 注册**,使用手机号或邮箱完成注册 3. 登录后可在右上角头像处进入 **个人中心** ### 第二步:申请数据集访问权限 1. 打开本数据集页面:[https://www.modelscope.cn/datasets/roumen/EXL50U-V58-PTEFIT](https://www.modelscope.cn/datasets/roumen/EXL50U-V58-PTEFIT) 2. 在数据集主页查看访问状态: - **公开数据集**:页面可直接浏览文件列表,可跳过申请步骤 - **需授权数据集**:点击 **「申请使用」** 或 **「申请数据集」** 按钮,填写用途说明并提交 3. 等待数据集所有者审核(通常 1–2 个工作日;公开数据集无需等待) 4. 审核通过后,页面会显示 **「已授权」** 或可直接下载 > 若下载时报 `403 Forbidden` 或提示无权限,请先回到数据集页面确认是否已完成授权申请。 ### 第三步:获取 Access Token 程序化下载需要 **SDK Token**: 1. 登录魔搭后,打开:[https://modelscope.cn/my/myaccesstoken](https://modelscope.cn/my/myaccesstoken) 2. 点击 **「创建令牌」**(若已有可用令牌可直接复制) 3. 复制生成的 Token,格式类似:`ms-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` 4. 在下方示例代码中,将 `YOUR_MODELSCOPE_TOKEN` 替换为你自己的 Token 5. **切勿**将 Token 提交到 Git 仓库或公开分享 ### 第四步:安装 Python 依赖 建议使用 Python 3.10+: ```bash pip install modelscope h5py numpy ``` 验证安装: ```bash python -c "import modelscope, h5py; print('ok')" ``` ### 第五步:用 Python 下载数据 将下面代码中的 `YOUR_MODELSCOPE_TOKEN` 替换为第三步复制的 Token,然后直接运行。 #### 5.1 下载单炮文件 ```python from modelscope.hub.file_download import dataset_file_download # 将 YOUR_MODELSCOPE_TOKEN 替换为你在第三步复制的 Access Token TOKEN = "YOUR_MODELSCOPE_TOKEN" local_path = dataset_file_download( dataset_id="roumen/EXL50U-V58-PTEFIT", file_path="data/13518.h5", # 远程数据集中的文件目录 local_dir="./EXL50U-V58-PTEFIT", # 下载到本地目录 token=TOKEN, ) print("已下载到:", local_path) # 例如: ./EXL50U-V58-PTEFIT/data/13518.h5 ``` #### 5.2 下载整个数据集 ```python from modelscope.hub.snapshot_download import snapshot_download # 将 YOUR_MODELSCOPE_TOKEN 替换为你在第三步复制的 Access Token TOKEN = "YOUR_MODELSCOPE_TOKEN" dataset_dir = snapshot_download( repo_id="roumen/EXL50U-V58-PTEFIT", repo_type="dataset", local_dir="./EXL50U-V58-PTEFIT", token=TOKEN, ) print("数据集目录:", dataset_dir) # 目录内含 README.md 与 data/*.h5 ``` #### 5.3 下载多个指定炮号 ```python from modelscope.hub.file_download import dataset_file_download TOKEN = "YOUR_MODELSCOPE_TOKEN" shots = [13518, 13546, 13547] local_dir = "./EXL50U-V58-PTEFIT" for shot in shots: path = dataset_file_download( dataset_id="roumen/EXL50U-V58-PTEFIT", file_path=f"data/{shot}.h5", local_dir=local_dir, token=TOKEN, ) print(f"shot {shot} -> {path}") ``` ### 第六步:读取已下载的 HDF5 下载完成后,每个炮对应一个文件 `data/{shot}.h5`: ```python import h5py import numpy as np path = "./EXL50U-V58-PTEFIT/data/13518.h5" with h5py.File(path, "r") as f: shot = int(f["shot"][()]) time = f["time"][:] flux = f["chns/flux"][:] ip_meas = f["chns/IP"][:] w_flux = f["weights/flux"][:] psi = f["inv_result/psi"][:] surfs = f["inv_result/surfs"][:] # (T, 2, 90) kappa = f["inv_result/kappa"][:] print(shot, time.shape, psi.shape, surfs.shape) ``` ### 常见问题 | 现象 | 可能原因 | 处理办法 | | ----------------------------------- | ---------------------------- | -------------------------------------------------------------- | | `403 Forbidden` | 未申请数据集权限或审核未通过 | 回到数据集页面申请/确认授权 | | `401 Unauthorized` | Token 无效、过期或未传入 | 检查代码中`TOKEN` 是否正确替换为你的 Access Token | | `ModuleNotFoundError: modelscope` | 未安装 SDK | 执行`pip install modelscope` | | 找不到`data/13518.h5` | 路径不对 | 检查`local_dir`,确认文件在 `./EXL50U-V58-PTEFIT/data/` 下 | | 下载很慢 | 单文件约 75 MB | 先按 5.1 下载单炮测试,再按 5.2 / 5.3 批量下载 | --- # PTEFIT 训练用 HDF5 说明(EXL-50U V58.6) ## 结构概览 ```text / ├── shot () int32 炮号 ├── time (T,) int32 时间,ms ├── R (129,) float32 psi 径向网格,m ├── Z (129,) float32 psi 轴向网格,m ├── chns/ 该时刻送入 EqInv.invert() 的测量 │ ├── flux (T, 47) Wb/rad │ ├── mpt (T, 84) T │ ├── mpn (T, 80) T │ ├── IP (T,) A 测量等离子体电流 │ ├── eddy_current (T,) A │ ├── vloops (T, 47) V │ ├── CS (T,) A │ ├── PF (T, 14) A PF1–12 + PF13/14 │ └── TF (T,) A ├── weights/ 与 chns 列对齐,无时间维 │ ├── flux (47,) │ ├── mpt (84,) │ ├── mpn (80,) │ ├── IP () │ ├── eddy_current () │ ├── vloops (47,) │ ├── CS () │ ├── PF (14,) │ └── TF () └── inv_result/ 反演结果 ├── psi (T, 129, 129) Wb/rad 极向磁通分布 ├── jphi (T, 129, 128) A/m² 电流密度分布 ├── surfs (T, 2, 90) m 等离子体最外闭合磁面(LCFS)90个点RZ坐标 ├── isoflux (T, 9) 九个指定点的磁通值 ├── rmin, rmax, zmin, zmax (T,) m LCFS 几何信息 ├── rc, zc, a (T,) m LCFS 几何信息 ├── kappa, deltal, deltau (T,) 拉长比、上下三角形边 ├── psi_a, psi_b (T,) Wb/rad 磁轴磁通、边界磁通 ├── ra, za (T,) m 磁轴中心RZ坐标 ├── rx, zx (T, 4) m 四个X点RZ坐标,上下各两个 ├── li, betap, betat (T,) ``` `chns/` 与 `inv_result/` 下各数据通道带属性 `units`。读取方式: ```python import h5py with h5py.File("data/13518.h5", "r") as f: flux_unit = f["chns/flux"].attrs["units"] # "Wb/rad" psi_unit = f["inv_result/psi"].attrs["units"] # "Wb/rad" chns_units = {name: f["chns"][name].attrs["units"] for name in f["chns"]} inv_units = {name: f["inv_result"][name].attrs["units"] for name in f["inv_result"]} ``` 无量纲量(`kappa`、`deltal`、`deltau`、`li`、`betap`、`betat`)的 `units` 为 `"none"`。 ## 顶层 | 数据集 | 形状 | 含义 | | -------- | ---------- | ------------------------------- | | `shot` | `()` | 炮号。读取:`f["shot"][()]`。 | | `time` | `(T,)` | 成功反演的时间,单位 ms。 | | `R` | `(129,)` | Green 表径向网格,m。 | | `Z` | `(129,)` | Green 表轴向网格,m。 | ## `chns/` 诊断输入 均为该时刻实际传入 `EqInv.invert()` 的物理量(磁通已换成 Wb/rad;IP 为 A)。 | 数据集 | 形状 | 单位 | 含义 | | ---------------- | ----------- | ------ | ----------------------------------------- | | `flux` | `(T, 47)` | Wb/rad | 磁通环。 | | `mpt` | `(T, 84)` | T | 切向磁探针。 | | `mpn` | `(T, 80)` | T | 法向磁探针。 | | `IP` | `(T,)` | A | **测量**等离子体电流,不是反演 IP。 | | `eddy_current` | `(T,)` | A | 总涡流;当前无数据,用0填充。 | | `vloops` | `(T, 47)` | V | 环电压。当前无数据,用0填充。 | | `CS` | `(T,)` | A | 中心螺线管电流。 | | `PF` | `(T, 14)` | A | 极向场线圈电流PF1–PF14。 | | `TF` | `(T,)` | A | 环向场线圈电流。 | ## `weights/` 通道权重 与 `chns/` 同名、无时间维。仅记录该炮反演时各个通道的权重,表示是否参与反演。 | 数据集 | 形状 | | ---------------------------- | --------------------------------- | | `flux` / `mpt` / `mpn` | `(47,)` / `(84,)` / `(80,)` | | `IP` | `()` | | `eddy_current` | `()` | | `vloops` | `(47,)` | | `CS` / `TF` | `()` | | `PF` | `(14,)` | ## `inv_result/` 反演输出 核心为二维极向磁通分布 psi 与 电流密度 jphi,其他为根据最外闭合磁面信息引申得到的几何信息,可作为评估指标判断位形差异。 | 数据集 | 形状 | 单位 | 含义 | | ----------------------- | ----------------- | ------ | --------------------------------------------------------- | | `psi` | `(T, 129, 129)` | Wb/rad | 极向磁通\(\Psi(R,Z)\)。 | | `jphi` | `(T, 129, 128)` | A/m² | 环向电流密度;Z 方向比`psi` 少一格,不可当成 129×129。 | | `surfs` | `(T, 2, 90)` | m | LCFS 多边形顶点;`[0]` 为 R,`[1]` 为 Z。 | | `isoflux` | `(T, 9)` | Wb/rad | 配置中 9 个等磁通约束点上的\(\Psi\)。 | | `rmin` / `rmax` | `(T,)` | m | LCFS 最小 / 最大 R。 | | `zmin` / `zmax` | `(T,)` | m | LCFS 最小 / 最大 Z。 | | `rc` / `zc` | `(T,)` | m | LCFS 几何中心。 | | `a` | `(T,)` | m | LCFS 小半径。 | | `kappa` | `(T,)` | — | LCFS 拉长比。 | | `deltal` / `deltau` | `(T,)` | — | LCFS 下 / 上三角。 | | `psi_a` / `psi_b` | `(T,)` | Wb/rad | 磁轴 / 边界磁通。 | | `ra` / `za` | `(T,)` | m | 磁轴坐标。 | | `rx` / `zx` | `(T, 4)` | m | X 点候选;无效为 0。 | | `li` | `(T,)` | — | 归一化内感。 | | `betap` / `betat` | `(T,)` | — | 极向 / 环向\(\beta\)。 | ## 读取示例 ```python import h5py import numpy as np path = "data/13518.h5" with h5py.File(path, "r") as f: shot = int(f["shot"][()]) time = f["time"][:] flux = f["chns/flux"][:] ip_meas = f["chns/IP"][:] w_flux = f["weights/flux"][:] psi = f["inv_result/psi"][:] surfs = f["inv_result/surfs"][:] # (T, 2, 90) kappa = f["inv_result/kappa"][:] print(shot, time.shape, psi.shape, surfs.shape) ``` 只取某一个时刻: ```python import h5py import numpy as np target_t = 500 # 实验炮例如 500 ms with h5py.File("data/13518.h5", "r") as f: times = f["time"][:] idx = int(np.where(times == target_t)[0][0]) psi_t = f["inv_result/psi"][idx] r_lcfs, z_lcfs = f["inv_result/surfs"][idx] ip_t = f["chns/IP"][idx] ``` ## 注意事项 - `time` 只含反演成功的片;`inv_result/` 与 `chns/` 的第 0 维都与之对齐。 - `jphi` 网格与 `psi` 不同,不要按 129×129 reshape。 - `weights/CS`、`weights/PF`、`weights/TF` 的 `1` 不是最小二乘约束权重。



