00001 #include "AutoInitializingData.h"
00002 #include <fstream>
00003 #include <iostream>
00004 #include <cassert>
00005 #include "adevs.h"
00006 using namespace std;
00007
00008 AutoInitializingData::AutoInitializingData():
00009 ElectricalData(),
00010 init_done(false)
00011 {
00012 }
00013
00014 void AutoInitializingData::setInitialConditions()
00015 {
00016 if (init_done)
00017 {
00018 throw adevs::exception(
00019 "Second call toAutoInitializingData::setInitialConditions",
00020 this);
00021 }
00022 init_done = true;
00023
00024 Complex* Vt = new Complex[nodes.size()];
00025 Complex* Ig = new Complex[nodes.size()];
00026
00027 AdmittanceNetwork Y(nodes.size());
00028 buildAdmitMatrix(Y);
00029
00030 for (unsigned i = 0; i < nodes.size(); i++)
00031 {
00032
00033 bus_data_t b = nodes[i];
00034 Vt[i] = polar(b.v,b.theta);
00035
00036 Ig[i] = Complex(0,0);
00037
00038 map<unsigned,genr_t>::iterator giter = genrs.find(b.ID);
00039
00040 if (giter != genrs.end())
00041 {
00042 Complex S = Complex(nodes[i].genr_mw,nodes[i].genr_mvar);
00043 Ig[i] = Vt[i]/(*giter).second.Xd+conj(S/Vt[i]);
00044 }
00045 }
00046
00047 Y.solve_for_voltage(Ig,Vt);
00048
00049 for (map<unsigned,genr_t>::iterator giter = genrs.begin();
00050 giter != genrs.end(); giter++)
00051 {
00052
00053 unsigned bus = (*giter).first;
00054 Complex yg = 1.0/(*giter).second.Xd;
00055 Complex S = conj(Ig[bus]-Vt[bus]*yg)*Vt[bus];
00056
00057
00058
00059 if (real(S) < nodes[bus].genr_mw)
00060 {
00061
00062 Complex Sexpected(nodes[bus].genr_mw,imag(S));
00063 Complex Iprev = Ig[bus];
00064
00065 Ig[bus] = conj(Sexpected/Vt[bus])+Vt[bus]*yg;
00066
00067 Complex yl = getAdmittance(bus);
00068 yl = (Ig[bus]-Iprev+Vt[bus]*yl)/Vt[bus];
00069 nodes[bus].B = Complex(0.0,0.0);
00070 Complex Sload = conj(Vt[bus]*yl)*Vt[bus];
00071
00072
00073 nodes[bus].load_mw = real(Sload);
00074 nodes[bus].load_mvar = imag(Sload);
00075 nodes[bus].genr_mw = real(Sexpected);
00076 nodes[bus].genr_mvar = imag(Sexpected);
00077 nodes[bus].v = abs(Vt[bus]);
00078 nodes[bus].theta = arg(Vt[bus]);
00079
00080 cerr << "BUS " << bus << " Pg,Qg= " << nodes[bus].genr_mw << ","
00081 << nodes[bus].genr_mvar << " and Pl,Ql=" << nodes[bus].load_mw
00082 << "," << nodes[bus].load_mvar << " and yl=" << yl << endl;
00083 }
00084 }
00085
00086 for (unsigned i = 0; i < genr_nodes.size(); i++)
00087 {
00088 int node_id = genr_nodes[i];
00089 bus_data_t b = nodes[node_id];
00090 genr_t& g = genrs[node_id];
00091
00092 Complex E = Ig[node_id]*g.Xd;
00093 Complex It = (E-Vt[node_id])/g.Xd;
00094 double Preal = real(Vt[node_id]*conj(It));
00095 if (Preal < 0.0)
00096 cerr << "WARNING: genr " << i << " has Preal=" << Preal << endl;
00097
00098 g.w0 = 0.0;
00099 g.C0 = g.Pm0 = g.Pe0 = Preal;
00100 g.Ef0 = abs(E);
00101
00102 g.Ef_max = 2.0*fabs(g.Ef0);
00103 g.T0 = arg(E);
00104 g.Vref = abs(Vt[node_id]);
00105 if (g.Pe0 < 0.0)
00106 {
00107 cerr << "INIT: genr " << i << " has Pm0=" << g.Pm0 <<
00108 " and g.Pe0=" << g.Pe0 << " and T0=" << g.T0 <<
00109 " and g.Agc="<< g.Agc << endl;
00110 g.Pe0 = 0.0;
00111 }
00112 }
00113
00114 delete [] Ig;
00115 delete [] Vt;
00116 }
00117
00118 void AutoInitializingData::addGenr(bus_data_t bus_data, double mvar_base, double kv_base)
00119 {
00120
00121
00122 genr_t genr_data;
00128 if (bus_data.genr_mw * mvar_base > 600.0)
00129 {
00130 genr_data.M = 3.5*bus_data.genr_mw;
00131 double reactance = 1.9*18.0*18.0/600.0;
00132 genr_data.Xd = Complex(0.0,reactance*mvar_base/(kv_base*kv_base));
00133 genr_data.D = genr_data.M/3.5;
00134 }
00135 else if (bus_data.genr_mw * mvar_base > 300.0)
00136 {
00137 genr_data.M = 4.0*bus_data.genr_mw;
00138 double reactance = 1.3*13.8*13.8/300.0;
00139 genr_data.Xd = Complex(0.0,reactance*mvar_base/(kv_base*kv_base));
00140 genr_data.D = genr_data.M/4.0;
00141 }
00142
00143 else if (bus_data.genr_mw * mvar_base > 150.0)
00144 {
00145 genr_data.M = 6.0*bus_data.genr_mw;
00146 double reactance = 2.13*13.8*13.8/50.0;
00147 genr_data.Xd = Complex(0.0,reactance*mvar_base/(kv_base*kv_base));
00148 genr_data.D = genr_data.M/6.0;
00149 }
00150
00151 else
00152 {
00153 genr_data.Tspd1 = genr_data.Tspd2 = genr_data.Te =
00154 genr_data.Agc = genr_data.R = 0.0;
00155 double reactance = 2.13*13.8*13.8/50.0;
00156 genr_data.Xd = Complex(0.0,reactance*mvar_base/(kv_base*kv_base));
00157 genr_data.M = 2.0;
00158 genr_data.D = 1.0;
00159 }
00160
00161 if (genrs.find(bus_data.ID) == genrs.end())
00162 genr_nodes.push_back(bus_data.ID);
00163 genrs[bus_data.ID] = genr_data;
00164 }
00165
00166 ElectricalData::genr_t AutoInitializingData::getGenrParams(unsigned node)
00167 {
00168 return genrs[node];
00169 }
00170
00171 void AutoInitializingData::setGenrParams(unsigned node, genr_t params)
00172 {
00173 genrs[node] = params;
00174 }
00175
00176 Complex AutoInitializingData::getAdmittance(unsigned node)
00177 {
00178
00179
00180 bus_data_t b = nodes[node];
00181 Complex S(b.load_mw,b.load_mvar);
00182 Complex V = polar(b.v,b.theta);
00183 Complex Ii = conj(S)/conj(V);
00184 Complex Y = Ii/V + b.B;
00185 return Y;
00186 }
00187
00188 AutoInitializingData::~AutoInitializingData()
00189 {
00190 }