📄 text.cpp
字号:
/*
潮流计算程序
*/
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <complex>
#include <iomanip>
#include <time.h> //ANSI标准库
using namespace std;
/*节点信息结构体*/
struct BUSDATA
{
int Number;
string Name;
int Unknown;
int LoadFlowAreaNumber;
int LossZoneNumber;
int Type ;
/*0 - Unregulated (load, PQ)
1 - Hold MVAR generation within voltage limits, (PQ)
2 - Hold voltage within VAR limits (gen, PV)
3 - Hold voltage and angle (swing, V-Theta) (must always have one)
*/
double FinalVoltage;/* p.u. */
double FinalAngle ;/*degrees */
float LoadMW ;
float LoadMVAR ;
float GenerationMW ;
float GenerationMVAR;
float BaseKV;
float DesiredVolts ;
float MaximumLimit;/*MVAR or voltage*/
float MinimumLimit;/*MVAR or voltage*/
float ShuntG ;/*(per unit) */
float ShuntB ;/*(per unit) */
int RemoteControlledBusNumber;
};
/*支路信息结构体*/
struct BRANCHDATA
{
int TapBusNumber; /*
For transformers or phase shifters, the side of the model
the non-unity tap is on*/
int ZBusNumber ;/*
For transformers and phase shifters, the side of the model
the device impedance is on.*/
int LoadFlowArea ;
int LossZone ;
int Circuit ;
int Type ; /*
0 - Transmission line
1 - Fixed tap
2 - Variable tap for voltage control (TCUL, LTC)
3 - Variable tap (turns ratio) for MVAR control
4 - Variable phase angle for MW control (phase shifter)
*/
double BranchR; /*per unit (F) */
double BranchX; /*per unit (F) No zero impedance lines*/
double LineChargingB; /*per unit (F) (total line charging, +B)*/
int LineMVAratingNo1 ;
int LineMVAratingNo2 ;
int LineMVAratingNo3 ;
int ControlBusNumber;
int Side;
/*0 - Controlled bus is one of the terminals
1 - Controlled bus is near the tap side
2 - Controlled bus is near the impedance side (Z bus)
*/
double TransformerFinalTurnsRatio;
double TransformerFinalAngle;/*(phase shifter) */
double MinimumShift;/*tap or phase */
double MaximumShift;/*tap or phase */
double StepSize;
double MinimumLimit ;/* voltage, MVAR or MW */
double MaximumLimit ;/* voltage, MVAR or MW */
};
ofstream outputfile("计算结果.txt");
vector< complex<double> > BusVolts; //母线电压向量
vector< double > JacobianMatrix; //雅克比矩阵
vector< complex<double> > AdmittanceMatrix; //导纳矩阵
// vector<complex<double>> AdmittanceMatrix; 就不对,原因不详
vector< double> BusPQVDelta;
int iBusNumber; //母线个数
vector<struct BUSDATA> BusData; //母线数据向量
int iBranchNumber; //支路个数
vector<struct BRANCHDATA> BranchData; //支路数据向量
vector< double > deltaVolt; //电压修正量
/*--------------------------------------------
导纳矩阵生成函数
输入:cdf数据文件
输出:系统导纳矩阵 AdmittanceMatrix
返回值: 0-文件读取失败
1-导纳矩阵生成成功
---------------------------------------------*/
int MakeAdmittanceMatrix(string & filename)
{
string Data,DataHead,DataTail,DataBlock;
ifstream DataFile(filename.c_str());
int startpos,endpos,i,j,k;
float BaseMW=0; //基准功率
if(!DataFile)
{
outputfile<<"文件 "<<filename<<" 打开失败!"<<endl;
return 0;
}
getline(DataFile,Data,'!'); //分行符号指定为'!',其实质是读取整个文件
DataBlock=Data.substr(31,6);
stringstream tempstream;
tempstream<<DataBlock;
tempstream>>BaseMW;
if(BaseMW<=0)
{
outputfile<<"基准功率未找到!"<<endl;
return 0;
}
outputfile<<" 基准功率 :"<<BaseMW<<endl;
/*-------------读取母线信息-----------------*/
DataHead="BUS DATA FOLLOWS";
DataTail="-999";
startpos=Data.find(DataHead);
if(startpos==string::npos)
{
outputfile<<"母线数据块头未找到!"<<endl;
return 0;
}
endpos=Data.find(DataTail);
if(endpos==string::npos)
{
outputfile<<"母线数据块尾未找到!"<<endl;
return 0;
}
if(endpos>=startpos)
{
DataBlock=Data.substr(startpos,endpos-startpos);
Data.erase(0,endpos+5);
}
else
{
outputfile<<"数据块标志不匹配!"<<endl;
return 0;
}
startpos=DataBlock.find("ITEMS");
string number=DataBlock.substr(startpos-5,4); //项目数可能多位,因此取4位,但这种做法不严谨
stringstream strstream;
strstream<<number;
strstream>>iBusNumber;
outputfile<<"该系统中共有 "<<iBusNumber<<" 条母线:"<<endl;
startpos=DataBlock.find('\n');
DataBlock=DataBlock.erase(0,startpos+1); //去掉数据头
stringstream strstream1;
strstream1<<DataBlock;
for(i=0;i<iBusNumber;i++)
{
string tempstr;
getline(strstream1,tempstr);
stringstream tempstrstream;
struct BUSDATA tempBusData;
tempstrstream<<tempstr;
tempstrstream>>tempBusData.Number;
tempstrstream>>tempBusData.Name;
tempstrstream>>tempBusData.Unknown;
tempstrstream>>tempBusData.LoadFlowAreaNumber;
tempstrstream>>tempBusData.LossZoneNumber;
tempstrstream>>tempBusData.Type ;
tempstrstream>>tempBusData.FinalVoltage;
tempstrstream>>tempBusData.FinalAngle ;
tempstrstream>>tempBusData.LoadMW ;
tempstrstream>>tempBusData.LoadMVAR ;
tempstrstream>>tempBusData.GenerationMW ;
tempstrstream>>tempBusData.GenerationMVAR;
tempstrstream>>tempBusData.BaseKV;
tempstrstream>>tempBusData.DesiredVolts ;
tempstrstream>>tempBusData.MaximumLimit;
tempstrstream>>tempBusData.MinimumLimit;
tempstrstream>>tempBusData.ShuntG ;
tempstrstream>>tempBusData.ShuntB ;
tempstrstream>>tempBusData.RemoteControlledBusNumber;
tempBusData.LoadMW /= BaseMW;
tempBusData.LoadMVAR /= BaseMW;
tempBusData.GenerationMW /= BaseMW;
tempBusData.GenerationMVAR /= BaseMW;
BusData.push_back(tempBusData);
}
outputfile<<"Number"<<"\t"
<<"Name"<<"\t"
<<"LoadFlowAreaNumber"<<"\t"
<<"LossZoneNumber"<<"\t"
<<"Type"<<"\t"
<<"FinalVoltage"<<"\t"
<<"FinalVngle"<<"\t"
<<"LoadMW"<<"\t"
<<"LoadMVAR"<<"\t"
<<"GenerationMW"<<"\t"
<<"GenerationMVAR"<<endl;
for(i=0;i<iBusNumber;i++)
{
outputfile<<BusData[i].Number<<"\t"
<<BusData[i].Name<<"\t"
<<BusData[i].LoadFlowAreaNumber<<"\t"
<<BusData[i].LossZoneNumber<<"\t"
<<BusData[i].Type <<"\t"
<<BusData[i].FinalVoltage<<"\t"
<<BusData[i].FinalAngle <<"\t"
<<BusData[i].LoadMW <<"\t"
<<BusData[i].LoadMVAR <<"\t"
<<BusData[i].GenerationMW<<"\t"
<<BusData[i].GenerationMVAR<<endl;
}
outputfile<<endl;
/*-------------读取支路信息-----------------*/
DataHead="BRANCH DATA";
DataTail="-999";
startpos=Data.find(DataHead);
if(startpos==string::npos)
{
cout<<"数据块头未找到!"<<endl;
return 0;
}
endpos=Data.find(DataTail);endpos=Data.find(DataTail);
if(endpos==string::npos)
{
cout<<"数据块尾未找到!"<<endl;
return 0;
}
if(endpos>=startpos)
DataBlock=Data.substr(startpos,endpos-startpos);
else
{
outputfile<<"数据块标志不匹配!"<<endl;
return 0;
}
startpos=DataBlock.find("ITEMS");
string strBranchNumber=DataBlock.substr(startpos-5,4);
stringstream strstream2;
strstream2<<strBranchNumber;
strstream2>>iBranchNumber;
outputfile<<"该系统中共有 "<<iBranchNumber<<" 条支路:"<<endl;
startpos=DataBlock.find('\n');
DataBlock=DataBlock.erase(0,startpos+1);
stringstream strstream3;
strstream3<<DataBlock;
for(i=0;i<iBranchNumber;i++)
{
string tempstr;
getline(strstream3,tempstr);
stringstream tempstrstream;
struct BRANCHDATA tempBranchData;
tempstrstream<<tempstr;
tempstrstream>>tempBranchData.TapBusNumber;
tempstrstream>>tempBranchData.ZBusNumber ;
tempstrstream>>tempBranchData.LoadFlowArea ;
tempstrstream>>tempBranchData.LossZone ;
tempstrstream>>tempBranchData.Circuit ;
tempstrstream>>tempBranchData.Type ;
tempstrstream>>tempBranchData.BranchR;
tempstrstream>>tempBranchData.BranchX;
tempstrstream>>tempBranchData.LineChargingB;
tempstrstream>>tempBranchData.LineMVAratingNo1 ;
tempstrstream>>tempBranchData.LineMVAratingNo2 ;
tempstrstream>>tempBranchData.LineMVAratingNo3 ;
tempstrstream>>tempBranchData.ControlBusNumber;
tempstrstream>>tempBranchData.Side;
tempstrstream>>tempBranchData.TransformerFinalTurnsRatio;
tempstrstream>>tempBranchData.TransformerFinalAngle;
tempstrstream>>tempBranchData.MinimumShift;
tempstrstream>>tempBranchData.MaximumShift;
tempstrstream>>tempBranchData.StepSize;
tempstrstream>>tempBranchData.MaximumLimit ;
BranchData.push_back(tempBranchData);
}
outputfile <<"TapBusNumber"<<"\t"
<<"ZBusNumber"<<"\t"
<<"Type"<<"\t"
<<"BranchR"<<"\t"
<<"BranchX"<<"\t"
<<"LineChargingB"<<"\t"
<<"TransformerFinalTurnsRatio"<<endl;
for(i=0;i<iBranchNumber;i++)
{
outputfile <<BranchData[i].TapBusNumber<<"\t"
<<BranchData[i].ZBusNumber<<"\t"
<<BranchData[i].Type<<"\t"
<<BranchData[i].BranchR<<"\t"
<<BranchData[i].BranchX <<"\t"
<<BranchData[i].LineChargingB <<"\t"
<<BranchData[i].TransformerFinalTurnsRatio<<endl;
}
outputfile<<endl;
/*-------------生成导纳矩阵-----------------*/
AdmittanceMatrix.resize(iBusNumber*iBusNumber);
complex<double> c(0,0);
for(i=0;i<iBusNumber*iBusNumber;i++)
AdmittanceMatrix[i] = 0; //不初始化不能能使用吗?
for(i=0;i<iBusNumber;i++)
for(j=0;j<=i;j++)
{
if(i==j) //对角元素生成
{
complex<double> ShuntGB(BusData[i].ShuntG, BusData[i].ShuntB);
cout<<ShuntGB<<" "<<endl;
AdmittanceMatrix[i*iBusNumber+j] += ShuntGB;
for(k=0;k<iBranchNumber;k++)
if(BranchData[k].TapBusNumber==i+1||BranchData[k].ZBusNumber==i+1)
{
//cout<<k+1<<"支路:"<<endl;
complex<double> tempcomplex(BranchData[k].BranchR, BranchData[k].BranchX);
//cout<<tempcomplex<<" ";
tempcomplex=conj(tempcomplex)/norm(tempcomplex); //取倒数,得支路导纳
//cout<<tempcomplex<<" "<<endl;
complex<double> B(0,BranchData[k].LineChargingB/2);
if(BranchData[k].Type==0) //传输线支路
AdmittanceMatrix[i*iBusNumber+j] += tempcomplex+B;
if(BranchData[k].Type==2) //变压器支路
{
if(BranchData[k].TapBusNumber==i+1)
AdmittanceMatrix[i*iBusNumber+j] += tempcomplex/(BranchData[k].TransformerFinalTurnsRatio*BranchData[k].TransformerFinalTurnsRatio)+B;
else if(BranchData[k].ZBusNumber==i+1)
AdmittanceMatrix[i*iBusNumber+j] += tempcomplex+B;
}
}
}
else//非对角元素生成
{
for(k=0;k<iBranchNumber;k++)
if( (BranchData[k].TapBusNumber==i+1&&BranchData[k].ZBusNumber==j+1)
||(BranchData[k].TapBusNumber==j+1&&BranchData[k].ZBusNumber==i+1))
{
//cout<<k+1<<"支路:"<<endl;
complex<double> tempcomplex(BranchData[k].BranchR, BranchData[k].BranchX);
//cout<<tempcomplex<<" ";
tempcomplex=conj(tempcomplex)/norm(tempcomplex); //取倒数,得支路导纳
//cout<<tempcomplex<<" "<<endl;
if(BranchData[k].Type==0) //传输线支路
AdmittanceMatrix[i*iBusNumber+j] = - tempcomplex;
if(BranchData[k].Type==2) //变压器支路
AdmittanceMatrix[i*iBusNumber+j] = - tempcomplex/BranchData[k].TransformerFinalTurnsRatio;
}
AdmittanceMatrix[j*iBusNumber+i]=AdmittanceMatrix[i*iBusNumber+j];
}
}
outputfile<<endl<<"生成导纳矩阵:"<<endl;
for(i=0;i<iBusNumber;i++)
{
for(j=0;j<iBusNumber;j++)
outputfile<<AdmittanceMatrix[i*iBusNumber+j]<<"\t";
outputfile<<endl;
}
return 1;
}
void main()
{
clock_t start;
string filename("005IEEE.dat");
outputfile<<setprecision(6)<<fixed<<"计算结果:"<<endl<<endl;
start=clock();
if(!MakeAdmittanceMatrix(filename))
return ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -