diff options
Diffstat (limited to 'Project/ElectricCalculation.cpp')
-rw-r--r-- | Project/ElectricCalculation.cpp | 86 |
1 files changed, 45 insertions, 41 deletions
diff --git a/Project/ElectricCalculation.cpp b/Project/ElectricCalculation.cpp index 3c4c1e5..c78864c 100644 --- a/Project/ElectricCalculation.cpp +++ b/Project/ElectricCalculation.cpp @@ -16,24 +16,24 @@ void ElectricCalculation::GetElementsFromList(std::vector<Element*> elementList) // TODO: Bad design? for(auto it = elementList.begin(); it != elementList.end(); it++) { Element* element = *it; - if(typeid(*element) == typeid(Bus)) - m_busList.push_back((Bus*)element); - else if(typeid(*element) == typeid(Capacitor)) - m_capacitorList.push_back((Capacitor*)element); - else if(typeid(*element) == typeid(IndMotor)) - m_indMotorList.push_back((IndMotor*)element); - else if(typeid(*element) == typeid(Inductor)) - m_inductorList.push_back((Inductor*)element); - else if(typeid(*element) == typeid(Line)) - m_lineList.push_back((Line*)element); - else if(typeid(*element) == typeid(Load)) - m_loadList.push_back((Load*)element); - else if(typeid(*element) == typeid(SyncGenerator)) - m_syncGeneratorList.push_back((SyncGenerator*)element); - else if(typeid(*element) == typeid(SyncMotor)) - m_syncMotorList.push_back((SyncMotor*)element); - else if(typeid(*element) == typeid(Transformer)) - m_transformerList.push_back((Transformer*)element); + if(Bus* bus = dynamic_cast<Bus*>(element)) + m_busList.push_back(bus); + else if(Capacitor* capacitor = dynamic_cast<Capacitor*>(element)) + m_capacitorList.push_back(capacitor); + else if(IndMotor* indMotor = dynamic_cast<IndMotor*>(element)) + m_indMotorList.push_back(indMotor); + else if(Inductor* inductor = dynamic_cast<Inductor*>(element)) + m_inductorList.push_back(inductor); + else if(Line* line = dynamic_cast<Line*>(element)) + m_lineList.push_back(line); + else if(Load* load = dynamic_cast<Load*>(element)) + m_loadList.push_back(load); + else if(SyncGenerator* syncGenerator = dynamic_cast<SyncGenerator*>(element)) + m_syncGeneratorList.push_back(syncGenerator); + else if(SyncMotor* syncMotor = dynamic_cast<SyncMotor*>(element)) + m_syncMotorList.push_back(syncMotor); + else if(Transformer* transformer = dynamic_cast<Transformer*>(element)) + m_transformerList.push_back(transformer); } } @@ -65,7 +65,7 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > for(auto itlo = m_loadList.begin(); itlo != m_loadList.end(); itlo++) { Load* load = *itlo; if(load->IsOnline()) { - int n = ((Bus*)load->GetParentList()[0])->GetEletricalData().number; + int n = static_cast<Bus*>(load->GetParentList()[0])->GetEletricalData().number; LoadElectricalData data = load->GetPUElectricalData(systemPowerBase); if(data.loadType == CONST_IMPEDANCE) yBus[n][n] += std::complex<double>(data.activePower, -data.reactivePower); @@ -76,7 +76,7 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > for(auto itca = m_capacitorList.begin(); itca != m_capacitorList.end(); itca++) { Capacitor* capacitor = *itca; if(capacitor->IsOnline()) { - int n = ((Bus*)capacitor->GetParentList()[0])->GetEletricalData().number; + int n = static_cast<Bus*>(capacitor->GetParentList()[0])->GetEletricalData().number; CapacitorElectricalData data = capacitor->GetPUElectricalData(systemPowerBase); yBus[n][n] += std::complex<double>(0.0, data.reactivePower); } @@ -86,7 +86,7 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > for(auto itin = m_inductorList.begin(); itin != m_inductorList.end(); itin++) { Inductor* inductor = *itin; if(inductor->IsOnline()) { - int n = ((Bus*)inductor->GetParentList()[0])->GetEletricalData().number; + int n = static_cast<Bus*>(inductor->GetParentList()[0])->GetEletricalData().number; InductorElectricalData data = inductor->GetPUElectricalData(systemPowerBase); yBus[n][n] += std::complex<double>(0.0, -data.reactivePower); } @@ -98,8 +98,8 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > if(line->IsOnline()) { LineElectricalData data = line->GetElectricalData(); - int n1 = ((Bus*)line->GetParentList()[0])->GetEletricalData().number; - int n2 = ((Bus*)line->GetParentList()[1])->GetEletricalData().number; + int n1 = static_cast<Bus*>(line->GetParentList()[0])->GetEletricalData().number; + int n2 = static_cast<Bus*>(line->GetParentList()[1])->GetEletricalData().number; yBus[n1][n2] -= 1.0 / std::complex<double>(data.resistance, data.indReactance); yBus[n2][n1] -= 1.0 / std::complex<double>(data.resistance, data.indReactance); @@ -119,8 +119,8 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > if(transformer->IsOnline()) { TransformerElectricalData data = transformer->GetElectricalData(); - int n1 = ((Bus*)transformer->GetParentList()[0])->GetEletricalData().number; - int n2 = ((Bus*)transformer->GetParentList()[1])->GetEletricalData().number; + int n1 = static_cast<Bus*>(transformer->GetParentList()[0])->GetEletricalData().number; + int n2 = static_cast<Bus*>(transformer->GetParentList()[1])->GetEletricalData().number; // If the transformer have nominal turns ratio (1.0) and no phase shifting, it will be modelled as series // impedance. @@ -139,8 +139,8 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > else { // Complex turns ratio double radPhaseShift = wxDegToRad(data.phaseShift); - std::complex<double> a = std::complex<double>(data.turnsRatio * std::cos(radPhaseShift), - -data.turnsRatio * std::sin(radPhaseShift)); + std::complex<double> a = std::complex<double>( + data.turnsRatio * std::cos(radPhaseShift), -data.turnsRatio * std::sin(radPhaseShift)); // Transformer admitance std::complex<double> y = 1.0 / std::complex<double>(data.resistance, data.indReactance); @@ -157,11 +157,15 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > } void ElectricCalculation::UpdateElementsPowerFlow(std::vector<std::complex<double> > voltage, - std::vector<std::complex<double> > power, - std::vector<BusType> busType, - std::vector<ReactiveLimits> reactiveLimit, - double systemPowerBase) + std::vector<std::complex<double> > power, + std::vector<BusType> busType, + std::vector<ReactiveLimits> reactiveLimit, + double systemPowerBase) { + for(int i = 0; i < (int)reactiveLimit.size(); ++i) { + if(reactiveLimit[i].maxLimit > -1e-5 && reactiveLimit[i].maxLimit < 1e-5) reactiveLimit[i].maxLimit = 1e-5; + if(reactiveLimit[i].minLimit > -1e-5 && reactiveLimit[i].minLimit < 1e-5) reactiveLimit[i].minLimit = 1e-5; + } // Buses voltages for(int i = 0; i < (int)m_busList.size(); i++) { Bus* bus = m_busList[i]; @@ -174,17 +178,17 @@ void ElectricCalculation::UpdateElementsPowerFlow(std::vector<std::complex<doubl for(int i = 0; i < (int)m_lineList.size(); i++) { Line* line = m_lineList[i]; if(line->IsOnline()) { - int n1 = ((Bus*)line->GetParentList()[0])->GetEletricalData().number; - int n2 = ((Bus*)line->GetParentList()[1])->GetEletricalData().number; + int n1 = static_cast<Bus*>(line->GetParentList()[0])->GetEletricalData().number; + int n2 = static_cast<Bus*>(line->GetParentList()[1])->GetEletricalData().number; LineElectricalData data = line->GetElectricalData(); std::complex<double> v1 = voltage[n1]; std::complex<double> v2 = voltage[n2]; data.current[0] = (v1 - v2) / std::complex<double>(data.resistance, data.indReactance) + - v1 * std::complex<double>(0.0, data.capSusceptance / 2.0); + v1 * std::complex<double>(0.0, data.capSusceptance / 2.0); data.current[1] = (v2 - v1) / std::complex<double>(data.resistance, data.indReactance) + - v2 * std::complex<double>(0.0, data.capSusceptance / 2.0); + v2 * std::complex<double>(0.0, data.capSusceptance / 2.0); data.powerFlow[0] = v1 * std::conj(data.current[0]); data.powerFlow[1] = v2 * std::conj(data.current[1]); @@ -203,10 +207,10 @@ void ElectricCalculation::UpdateElementsPowerFlow(std::vector<std::complex<doubl Transformer* transformer = m_transformerList[i]; if(transformer->IsOnline()) { TransformerElectricalData data = transformer->GetElectricalData(); - int n1 = ((Bus*)transformer->GetParentList()[0])->GetEletricalData().number; - int n2 = ((Bus*)transformer->GetParentList()[1])->GetEletricalData().number; - std::complex<double> v1 = voltage[n1]; // Primary voltage - std::complex<double> v2 = voltage[n2]; // Secondary voltage + int n1 = static_cast<Bus*>(transformer->GetParentList()[0])->GetEletricalData().number; + int n2 = static_cast<Bus*>(transformer->GetParentList()[1])->GetEletricalData().number; + std::complex<double> v1 = voltage[n1]; // Primary voltage + std::complex<double> v2 = voltage[n2]; // Secondary voltage // Transformer admitance std::complex<double> y = 1.0 / std::complex<double>(data.resistance, data.indReactance); @@ -386,8 +390,8 @@ void ElectricCalculation::UpdateElementsPowerFlow(std::vector<std::complex<doubl reactivePower = childData_PU.minReactive; reachedMachineLimit = true; } else if((!childData_PU.haveMaxReactive && reactiveLimit[i].limitReached == RL_MAX_REACHED) || - (!childData_PU.haveMinReactive && reactiveLimit[i].limitReached == RL_MIN_REACHED) || - (!childData_PU.haveMaxReactive && !childData_PU.haveMaxReactive)) { + (!childData_PU.haveMinReactive && reactiveLimit[i].limitReached == RL_MIN_REACHED) || + (!childData_PU.haveMaxReactive && !childData_PU.haveMaxReactive)) { reactivePower += exceededReactive; exceededReactive = 0.0; } |