ARTICLE · 1161840
开源版BPA电力系统分析软件解读(二)潮流计算调用链
开源版BPA电力系统分析软件解读(二)潮流计算调用链
潮流计算调用链,看这两件事就够了
把代码里的细节先放一边,抓住两件事:
text 第一,程序之间的调用逻辑第二,每个程序实现什么功能
把这两件事看明白,调试时就不会迷路。
一、潮流核心程序的调用逻辑
先看批量潮流计算 bpf 的主调用链:
text main -> bpf_sub -> pwrflo -> procse -> proces -> prodat -> solton -> nrsoln -> jacbus
这条链可以分成三段来理解:
text 第一段:程序启动main -> bpf_sub
第二段:案例准备 pwrflo -> procse -> proces -> prodat
第三段:潮流求解solton -> nrsoln其中,solton 和 nrsoln 里面还各自带着一组关键子程序。
solton 内部的主要顺序是:
text presln -> nrbase,满足特定选项时调用 -> sumsol -> opsln1 -> slnhdr -> nrcnvt -> nrsoln
nrsoln 内部的核心顺序是:
text iter = iter + 1 -> 计算不平衡量 -> jacltc,计算 LTC 相关雅可比元素 -> jacbus,计算母线约束雅可比元素 -> 计算 dpqnu -> 判断是否收敛 -> nrbksl,分解和回代 -> 未收敛则回到迭代入口
一句话总结:
text prodat 负责把系统准备好solton 负责把求解器启动起来nrsoln 负责真正一轮一轮地迭代```
不管是批量运行还是交互命令,最后都会汇入 solton 和 nrsoln。
二、每个程序负责什么任务
1. 程序启动层
| 子程序 | 所在位置 | 主要任务 |
|---|---|---|
main | bpf/bpf_main.c | C 程序入口,接收命令行参数 |
bpf_sub | bpf/bpf_sub.c | 处理输入文件名,调用 pwrflo |
pwrflo | ipf/pwrflo.f | 初始化程序,进入案例循环 |
这一层可以理解成“启动器”。它不负责潮流计算,只负责把程序带起来。
2. 案例处理层
| 子程序 | 所在位置 | 主要任务 |
|---|---|---|
procse | ipf/procse.f | 管理单个案例的开始、处理和结束 |
probeg | ipf/probeg.f | 案例开始前的准备 |
proces | ipf/proces.f | 处理当前案例的基态和系统数据 |
dfnbse | ipf/dfnbse.f | 建立初始基态系统 |
proend | ipf/proend.f | 案例结束后的收尾 |
这一层负责把一个 case 从“准备开始”推进到“可以求解”。
3. 数据加工与求解调度层
| 子程序 | 所在位置 | 主要任务 |
|---|---|---|
prodat | ipf/prodat.f | 数据加工、建表、排序和求解调度 |
reordr | 相关排序模块 | 对网络和设备重新排序 |
chgorder | 相关顺序转换模块 | 在输入顺序和内部优化顺序之间转换 |
solton | ipf/solton.f | 潮流求解总调度 |
prodat 负责把数据整理成适合求解的状态,然后调用 solton。
4. 潮流求解层
| 子程序 | 所在位置 | 主要任务 |
|---|---|---|
solton | ipf/solton.f | 组织求解前准备,调用牛顿迭代 |
presln | ipf/presln.f | 求解前准备和状态初始化 |
nrbase | 相关基态处理模块 | 在特定选项下装载基态解或启动电压 |
sumsol | ipf/sumsol.f | 汇总求解相关数据 |
opsln1 | ipf/opsln1.f | 初始化求解环境 |
slnhdr | ipf/slnhdr.f | 输出求解表头 |
nrcnvt | ipf/nrcnvt.f | 牛顿迭代前的网络转换和预处理 |
nrsoln | ipf/nrsoln.f | 牛顿-拉夫逊迭代循环本体 |
这里最容易混淆的一点是:
text nrcnvt 不是牛顿迭代入口nrsoln 才是真正的牛顿迭代核心
5. 牛顿迭代内部子程序
| 子程序 | 主要任务 |
|---|---|
jacltc | 计算 LTC 相关雅可比元素 |
jacbus | 计算母线约束雅可比元素 |
nrbksl | 进行分解和回代 |
nrsoln 负责迭代循环,具体形成矩阵和求解修正量的工作,会落到这些子程序里。
一句话总结
潮流计算的核心调用链,可以记成:
text main -> bpf_sub -> pwrflo -> procse -> proces -> prodat -> solton -> nrsoln -> jacbus
每个子程序的分工,可以记成:
text 启动程序 -> 处理案例 -> 建立基态 -> 加工数据 -> 调度求解 -> 牛顿迭代 -> 形成雅可比 -> 判断收敛
调试时只要先确认自己走到哪一层,再去看这一层该看什么变量,就不会被一堆子程序名字带着跑了。