Files
SystemSimulationApp/native

C 数值后端

后端 Python 校验 XML、检查连接、生成系统专用 C 并编译;独立 EXE 执行完整数值循环。原生运行不调用 Python。当前构建支持 Windows x64 和 Linux x86_64;Linux 使用静态链接的 SUNDIALS。

启用网页后端

当前默认使用 native。也可在启动后端的 PowerShell 中显式设置:

$env:SIMULATION_NUMERIC_ENGINE = 'native'
$env:SIMULATION_NATIVE_CC = 'F:/Projects/mingw64/bin/gcc.exe'
$env:SUNDIALS_ROOT = 'F:/Anaconda/Library'
.venv-win/Scripts/python.exe -m uvicorn app.main:app --host 127.0.0.1 --port 8000

Linux 使用现有 Python 虚拟环境,并将 C 依赖独立放在 .venv/native/:

bash bat/setup-native-linux.sh
.venv/bin/python -m uvicorn app.main:app --host 127.0.0.1 --port 8000

脚本下载并校验固定版本 SUNDIALS 7.4.0,在本地构建静态库;不会安装系统包。构建器先读取 SUNDIALS_ROOT,未指定时查找当前 Python 环境的 native/sundials-7.4.0、/usr/local 和 /usr。Linux 安装需包含静态 .a 库;生成的 ELF 程序名为 model,不依赖 SUNDIALS 共享库或 Python。.venv/、app/data/ 和 test/ 均在 Git 忽略范围。

沿用 /api/system-xml/simulate 与 /api/system-xml/simulate-stream。native 遇到不支持的组件或方法时报告错误,不静默切换。旧 Python 后端已退役,显式选择 python 会报错。

bat/start-backend.bat、bat/start-backend.sh 及其 start-all 上层入口默认设置 native,保留明确指定的环境变量覆盖。直接通过 uvicorn 启动也使用相同的默认选择。启动日志显示所选内核;C 模式只检查工具链与 XML Schema,不再预热 SciPy 积分/代数求解器。工具链检查失败会记录启动诊断,编辑器仍可使用,提交仿真时会明确报错,不会自动调用 Python 数值后端。

通用诊断包含 stateCount、sampleCount。pressureFlow、stream 属于 Python 后端的可选诊断;C 后端不报告未计算的方程残差,网页仅在该值存在时显示它。

原生运行库已在本机 GCC 8.1 / SUNDIALS 7.4.0 验证。构建需要对应 C 头文件、导入库和 DLL,单纯安装 Python 包不能代替这些文件。构建器根据环境变量或当前 Python 基础环境查找 SUNDIALS,根据环境变量或 PATH 查找 GCC。

独立生成与运行

.venv-win/Scripts/python.exe -m app.simulation.native_codegen tests/fixtures/native-skill-test.xml --output-dir test/native-v1/example-run --runs 3 --solve-only

输入支持 XML,或带普通算术表达式的工程 JSON。JSON 普通数字已经是 SI 值;算术表达式按编辑器所选单位换算,例如 3.14*10**2/4 mm2 转为 0.0000785 m2。较复杂的表达式应先在网页导出 XML。CLI 不执行任意 Python/JavaScript 表达式。

输出目录包含 input.xml、model-manifest.json、program/、预热和各次运行结果,以及 summary.json。program/ 包含 EXE、生成的模型 C/头文件、SUNDIALS DLL 和依赖声明,可以复制整目录独立运行:

test/native-v1/example-run/program/model.exe --method RK45 --start 0 --stop 10 --sample-step 0.02 --max-step 0.001 --rtol 1e-6 --output test/native-v1/standalone-result.json

EXE 不需要 Python、SciPy、XML 或原工程文件。DLL 需要与 EXE 一同保留。默认运行设置是 RK45、0–10 s、最大步长 0.001 s;按需要传入运行选项。

--solve-only 关闭轨迹采样,只输出最终状态与诊断。solveSeconds 是程序内部数值求解墙钟时间,包含求解必需的 RHS 和事件定位,排除模型初始化、结果投影和文件写入;processWallSeconds 另含进程启动与结果处理。预热一次后报告三次求解的中位数。

能力与限制

  • 已实现当前注册的 27 类组件:22 类 Amesim 公开组件(含空气、氦气两种介质定义)和 5 类实验组件。完整清单及验证说明见 组件覆盖记录。介质定义在编译期选择对应的 C 物性函数。
  • 管路覆盖 PNL00R、PNL0001/2/3;阀覆盖 PNOR001、固定/信号开度 PNVO001 及面积/Cv/Kv 模式;连接件覆盖 PN3NODE2、P4NODE2、LMECHN1。支持串联阻力的压力求解、节点焓混合及温度参考、刚性质量合并、兼容管路容腔的等密度状态投影。
  • MECMAS21 支持现有 Python 方程中的摩擦、风阻、柔性限位和 stoptype=1/2/3/4,含反弹系数与速度阈值;气腔和管路支持换热。LSTP00A 接受两种刚度模式及接触力符号模式,严格沿用当前组件方程。已有参数中尚未参与 Python 方程的物理效应不会在 C 端凭空补造,详见覆盖记录。
  • 扩展编译器上限 1024 状态、16384 输出;无连续状态的信号系统使用隐藏常量状态驱动输出。气动网络必须有压力状态锚点;独立气腔之间不能无阻力直接相连。兼容固定管路容腔是已实现的合并例外。闭合未收敛或方程欠定时明确失败,不静默回退。
  • 支持原生 RK45 与 CVODE BDF。CVODE 继续使用默认数值雅可比和稠密线性求解;本次删除不改变 C 求解器的雅可比策略。
  • 网页和 Python CLI 默认 rtol=1e-8;生成的状态绝对误差限为质量 1e-14 kg、内能 1e-8 J、速度/位移 1e-12(各自 SI 单位)。独立 C 程序默认 rtol=1e-6,对照时应显式传入。CLI 可覆盖 rtol;本版不支持自定义 atol 或 first_step。不同积分器相同局部容差不保证全局曲线误差完全相同。
  • 时间信号显式分段,塑性/反弹端挡用稠密插值定位并重启。试探 RHS 不修改已接受状态。柔性接触沿用现有分段力公式,不改变刚度或阻尼来提速。
  • 每任务独立进程,支持进度、取消及超时。进程崩溃不会作为成功返回,受控失败保留最后接受状态。
  • 编译缓存位于 app/data/native-builds/,校验模型、组件合同、源码、编译选项及依赖哈希。本版参数特化入 C,修改模型数值参数会重新编译;修改时间、步长、rtol、采样选项可复用 EXE。

代码职责

  • app/simulation/native_codegen/input.py:CLI 输入适配。
  • contracts.py:逐组件 C 实现版本白名单,新增模型或版本不会自动视为已支持。
  • compiler.py / extended.py:能力检查、状态/输出布局、连接分组、常系数约束消元、C 生成。保留已验证的简单拓扑快速生成路径,两条路径均只运行 C 数值代码。
  • build.py / runner.py:编译缓存、依赖打包、隔离执行与结果适配。
  • native/components/kernels.c:空气/氦气物性、阀与管路流量、信号、摩擦接触和端挡原语。
  • native/runtime/:RK45、CVODE 适配、事件定位、采样与 CLI。
  • app/simulation/backends.py / results.py:共用执行入口与结果合同。

执行 .venv-win/Scripts/python.exe -m unittest tests.test_native_catalog tests.test_native_codegen tests.test_simulation_warmup 可验证全部注册合同、空气/氦气正反向流、换热/摩擦、节点和串联闭合、刚性与管路状态合并、反弹事件、纯信号系统、缓存、独立 EXE、取消及默认 C 的 XML 接口。新增组件库对照测试需要可用的 C 工具链。

Python 保留范围

  • app/main.py、system_xml.py:HTTP、XML 校验与结果返回。
  • registry.py、core/、components/、systems/network.py:参数、端口、介质常量、输出与方程结构声明;不执行模型数值公式。
  • native_codegen/:生成系统 C、构建缓存、管理独立进程。
  • config.py、sampling.py、results.py:配置、进度、采样合法性和结果合同。
  • performance.py:Python 编排阶段计时,求解耗时读取 C 报告。

solvers/、systems/generic.py、旧示例、Python 物性/流量/机械公式和物性缓存已删除。数值回归读取 tests/baselines/native/native-python-reference.json 的 50 个网络、112 组冻结参考状态,不需要 Python 求解器。旧算法及历史对照资料可从 Git 历史找回。

测试安装:python -m pip install -r requirements-test.txt。完整数值测试需要 GCC 与 SUNDIALS;Windows x64 使用导入库/DLL,Linux x86_64 使用静态库。

AME 对齐后的工程输入

当前用户运行请使用 tests/data/test-mql-4-corrected.json 或 tests/data/test-mql-8-corrected.json。四路执行 XML 位于 tests/fixtures/amesim/,与其 JSON 同步;原八路 JSON 已移入 tests/fixtures/legacy/ 供差异审计。test-mql-4-amesim-reference.json 是曲线基准,不是工程输入。模型复核、P4 端口图形修正、默认 rtol=1e-8 的验收和速度记录见 本轮验证报告。