夜雨聆风学习资料网

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. 程序启动层

子程序所在位置主要任务
mainbpf/bpf_main.cC 程序入口,接收命令行参数
bpf_subbpf/bpf_sub.c处理输入文件名,调用 pwrflo
pwrfloipf/pwrflo.f初始化程序,进入案例循环

这一层可以理解成“启动器”。它不负责潮流计算,只负责把程序带起来。

2. 案例处理层

子程序所在位置主要任务
procseipf/procse.f管理单个案例的开始、处理和结束
probegipf/probeg.f案例开始前的准备
procesipf/proces.f处理当前案例的基态和系统数据
dfnbseipf/dfnbse.f建立初始基态系统
proendipf/proend.f案例结束后的收尾

这一层负责把一个 case 从“准备开始”推进到“可以求解”。

3. 数据加工与求解调度层

子程序所在位置主要任务
prodatipf/prodat.f数据加工、建表、排序和求解调度
reordr相关排序模块对网络和设备重新排序
chgorder相关顺序转换模块在输入顺序和内部优化顺序之间转换
soltonipf/solton.f潮流求解总调度

prodat 负责把数据整理成适合求解的状态,然后调用 solton。

4. 潮流求解层

子程序所在位置主要任务
soltonipf/solton.f组织求解前准备,调用牛顿迭代
preslnipf/presln.f求解前准备和状态初始化
nrbase相关基态处理模块在特定选项下装载基态解或启动电压
sumsolipf/sumsol.f汇总求解相关数据
opsln1ipf/opsln1.f初始化求解环境
slnhdripf/slnhdr.f输出求解表头
nrcnvtipf/nrcnvt.f牛顿迭代前的网络转换和预处理
nrsolnipf/nrsoln.f牛顿-拉夫逊迭代循环本体

这里最容易混淆的一点是:

text
nrcnvt 不是牛顿迭代入口nrsoln 才是真正的牛顿迭代核心

5. 牛顿迭代内部子程序

子程序主要任务
jacltc计算 LTC 相关雅可比元素
jacbus计算母线约束雅可比元素
nrbksl进行分解和回代

nrsoln 负责迭代循环,具体形成矩阵和求解修正量的工作,会落到这些子程序里。


一句话总结

潮流计算的核心调用链,可以记成:

text
main  -> bpf_sub    -> pwrflo      -> procse        -> proces          -> prodat            -> solton              -> nrsoln                -> jacbus

每个子程序的分工,可以记成:

text
启动程序  -> 处理案例    -> 建立基态      -> 加工数据        -> 调度求解          -> 牛顿迭代            -> 形成雅可比              -> 判断收敛

调试时只要先确认自己走到哪一层,再去看这一层该看什么变量,就不会被一堆子程序名字带着跑了。

相关学习资料