diff options
-rw-r--r-- | Project/Bus.h | 2 | ||||
-rw-r--r-- | Project/BusForm.cpp | 48 | ||||
-rw-r--r-- | Project/Capacitor.cpp | 2 | ||||
-rw-r--r-- | Project/ElectricCalculation.cpp | 42 | ||||
-rw-r--r-- | Project/Electromechanical.cpp | 317 | ||||
-rw-r--r-- | Project/Electromechanical.h | 5 | ||||
-rw-r--r-- | Project/Fault.cpp | 22 | ||||
-rw-r--r-- | Project/FileHanding.cpp | 20 | ||||
-rw-r--r-- | Project/Inductor.cpp | 2 | ||||
-rw-r--r-- | Project/Line.cpp | 20 | ||||
-rw-r--r-- | Project/Load.cpp | 2 | ||||
-rw-r--r-- | Project/PowerFlow.cpp | 2 | ||||
-rw-r--r-- | Project/Project.mk | 2 | ||||
-rw-r--r-- | Project/SyncGenerator.h | 2 | ||||
-rw-r--r-- | Project/Text.cpp | 10 | ||||
-rw-r--r-- | Project/TextForm.cpp | 10 | ||||
-rw-r--r-- | Project/Transformer.cpp | 4 | ||||
-rw-r--r-- | Project/Workspace.cpp | 31 |
18 files changed, 435 insertions, 108 deletions
diff --git a/Project/Bus.h b/Project/Bus.h index 2522be3..3f802df 100644 --- a/Project/Bus.h +++ b/Project/Bus.h @@ -57,7 +57,7 @@ public: virtual bool PickboxContains(wxPoint2DDouble position); virtual bool GetContextMenu(wxMenu& menu); virtual wxString GetTipText() const; - virtual BusElectricalData GetEletricalData() const { return m_electricalData; } + virtual BusElectricalData GetElectricalData() const { return m_electricalData; } virtual void SetElectricalData(BusElectricalData electricalData) { m_electricalData = electricalData; } virtual bool ShowForm(wxWindow* parent, Element* element); diff --git a/Project/BusForm.cpp b/Project/BusForm.cpp index d7d622e..98ec0da 100644 --- a/Project/BusForm.cpp +++ b/Project/BusForm.cpp @@ -9,21 +9,21 @@ BusForm::BusForm(wxWindow* parent, Bus* bus) m_parent = parent; m_bus = bus; - m_textCtrlName->SetValue(bus->GetEletricalData().name); - m_textCtrlNomVoltage->SetValue(bus->StringFromDouble(bus->GetEletricalData().nominalVoltage)); + m_textCtrlName->SetValue(bus->GetElectricalData().name); + m_textCtrlNomVoltage->SetValue(bus->StringFromDouble(bus->GetElectricalData().nominalVoltage)); - if(bus->GetEletricalData().nominalVoltageUnit == UNIT_V) + if(bus->GetElectricalData().nominalVoltageUnit == UNIT_V) m_choiceNomVoltage->SetSelection(0); else m_choiceNomVoltage->SetSelection(1); - m_checkBoxCtrlVoltage->SetValue(bus->GetEletricalData().isVoltageControlled); - m_textCtrlCtrlVoltage->SetValue(bus->StringFromDouble(bus->GetEletricalData().controlledVoltage)); - m_choiceCtrlVoltage->SetSelection(bus->GetEletricalData().controlledVoltageUnitChoice); - m_checkBoxSlackBus->SetValue(bus->GetEletricalData().slackBus); + m_checkBoxCtrlVoltage->SetValue(bus->GetElectricalData().isVoltageControlled); + m_textCtrlCtrlVoltage->SetValue(bus->StringFromDouble(bus->GetElectricalData().controlledVoltage)); + m_choiceCtrlVoltage->SetSelection(bus->GetElectricalData().controlledVoltageUnitChoice); + m_checkBoxSlackBus->SetValue(bus->GetElectricalData().slackBus); - m_checkBoxFault->SetValue(bus->GetEletricalData().hasFault); - switch(bus->GetEletricalData().faultType) { + m_checkBoxFault->SetValue(bus->GetElectricalData().hasFault); + switch(bus->GetElectricalData().faultType) { case FAULT_THREEPHASE: { m_choiceFaultType->SetSelection(0); } break; @@ -39,7 +39,7 @@ BusForm::BusForm(wxWindow* parent, Bus* bus) default: break; } - switch(bus->GetEletricalData().faultLocation) { + switch(bus->GetElectricalData().faultLocation) { case FAULT_LINE_A: { m_choiceFaultPlace->SetSelection(0); } break; @@ -52,26 +52,26 @@ BusForm::BusForm(wxWindow* parent, Bus* bus) default: break; } - m_textCtrlFaultResistance->SetValue(bus->StringFromDouble(bus->GetEletricalData().faultResistance)); - m_textCtrlFaultReactance->SetValue(bus->StringFromDouble(bus->GetEletricalData().faultReactance)); - - m_checkBoxPlotData->SetValue(bus->GetEletricalData().plotBus); - m_checkBoxStabFault->SetValue(bus->GetEletricalData().stabHasFault); - m_textCtrlStabFaultTime->SetValue(bus->StringFromDouble(bus->GetEletricalData().stabFaultTime)); - m_textCtrlStabFaultLength->SetValue(bus->StringFromDouble(bus->GetEletricalData().stabFaultLength)); - m_textCtrlStabFaultResistance->SetValue(bus->StringFromDouble(bus->GetEletricalData().stabFaultResistance)); - m_textCtrlStabFaultReactance->SetValue(bus->StringFromDouble(bus->GetEletricalData().stabFaultReactance)); - - EnableCtrlVoltageFields(bus->GetEletricalData().isVoltageControlled); - EnableFaultFields(bus->GetEletricalData().hasFault); - EnableStabFaultFields(bus->GetEletricalData().stabHasFault); + m_textCtrlFaultResistance->SetValue(bus->StringFromDouble(bus->GetElectricalData().faultResistance)); + m_textCtrlFaultReactance->SetValue(bus->StringFromDouble(bus->GetElectricalData().faultReactance)); + + m_checkBoxPlotData->SetValue(bus->GetElectricalData().plotBus); + m_checkBoxStabFault->SetValue(bus->GetElectricalData().stabHasFault); + m_textCtrlStabFaultTime->SetValue(bus->StringFromDouble(bus->GetElectricalData().stabFaultTime)); + m_textCtrlStabFaultLength->SetValue(bus->StringFromDouble(bus->GetElectricalData().stabFaultLength)); + m_textCtrlStabFaultResistance->SetValue(bus->StringFromDouble(bus->GetElectricalData().stabFaultResistance)); + m_textCtrlStabFaultReactance->SetValue(bus->StringFromDouble(bus->GetElectricalData().stabFaultReactance)); + + EnableCtrlVoltageFields(bus->GetElectricalData().isVoltageControlled); + EnableFaultFields(bus->GetElectricalData().hasFault); + EnableStabFaultFields(bus->GetElectricalData().stabHasFault); } BusForm::~BusForm() {} void BusForm::OnButtonCancelClick(wxCommandEvent& event) { EndModal(wxID_CANCEL); } void BusForm::OnButtonOKClick(wxCommandEvent& event) { - BusElectricalData data = m_bus->GetEletricalData(); + BusElectricalData data = m_bus->GetElectricalData(); data.name = m_textCtrlName->GetValue(); if(!m_bus->DoubleFromString(m_parent, m_textCtrlNomVoltage->GetValue(), data.nominalVoltage, _("Value entered incorrectly in the field \"Rated voltage\"."))) diff --git a/Project/Capacitor.cpp b/Project/Capacitor.cpp index 4bf595b..6830ffc 100644 --- a/Project/Capacitor.cpp +++ b/Project/Capacitor.cpp @@ -180,7 +180,7 @@ wxString Capacitor::GetTipText() const if(!m_online) reactivePower = 0.0; else { - std::complex<double> v = static_cast<Bus*>(m_parentList[0])->GetEletricalData().voltage; + std::complex<double> v = static_cast<Bus*>(m_parentList[0])->GetElectricalData().voltage; reactivePower *= std::pow(std::abs(v), 2); } tipText += "\n"; diff --git a/Project/ElectricCalculation.cpp b/Project/ElectricCalculation.cpp index 86653d5..847249d 100644 --- a/Project/ElectricCalculation.cpp +++ b/Project/ElectricCalculation.cpp @@ -65,7 +65,7 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > int busNumber = 0; for(auto itb = m_busList.begin(); itb != m_busList.end(); itb++) { Bus* bus = *itb; - BusElectricalData data = bus->GetEletricalData(); + BusElectricalData data = bus->GetElectricalData(); data.number = busNumber; bus->SetElectricalData(data); busNumber++; @@ -75,10 +75,16 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > for(auto it = m_loadList.begin(), itEnd = m_loadList.end(); it != itEnd; ++it) { Load* load = *it; if(load->IsOnline()) { - int n = static_cast<Bus*>(load->GetParentList()[0])->GetEletricalData().number; + int n = static_cast<Bus*>(load->GetParentList()[0])->GetElectricalData().number; LoadElectricalData data = load->GetPUElectricalData(systemPowerBase); - if(data.loadType == CONST_IMPEDANCE || allLoadsAsImpedances) - yBus[n][n] += std::complex<double>(data.activePower, -data.reactivePower); + if(data.loadType == CONST_IMPEDANCE || allLoadsAsImpedances) { + std::complex<double> yLoad = std::complex<double>(data.activePower, -data.reactivePower); + if(allLoadsAsImpedances) { + std::complex<double> v = static_cast<Bus*>(load->GetParentList()[0])->GetElectricalData().voltage; + yLoad /= (v * v); + } + yBus[n][n] += yLoad; + } } } @@ -86,7 +92,7 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > for(auto it = m_capacitorList.begin(), itEnd = m_capacitorList.end(); it != itEnd; ++it) { Capacitor* capacitor = *it; if(capacitor->IsOnline()) { - int n = static_cast<Bus*>(capacitor->GetParentList()[0])->GetEletricalData().number; + int n = static_cast<Bus*>(capacitor->GetParentList()[0])->GetElectricalData().number; CapacitorElectricalData data = capacitor->GetPUElectricalData(systemPowerBase); yBus[n][n] += std::complex<double>(0.0, data.reactivePower); } @@ -96,7 +102,7 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > for(auto it = m_inductorList.begin(), itEnd = m_inductorList.end(); it != itEnd; ++it) { Inductor* inductor = *it; if(inductor->IsOnline()) { - int n = static_cast<Bus*>(inductor->GetParentList()[0])->GetEletricalData().number; + int n = static_cast<Bus*>(inductor->GetParentList()[0])->GetElectricalData().number; InductorElectricalData data = inductor->GetPUElectricalData(systemPowerBase); yBus[n][n] += std::complex<double>(0.0, -data.reactivePower); } @@ -108,8 +114,8 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > if(line->IsOnline()) { LineElectricalData data = line->GetElectricalData(); - int n1 = static_cast<Bus*>(line->GetParentList()[0])->GetEletricalData().number; - int n2 = static_cast<Bus*>(line->GetParentList()[1])->GetEletricalData().number; + int n1 = static_cast<Bus*>(line->GetParentList()[0])->GetElectricalData().number; + int n2 = static_cast<Bus*>(line->GetParentList()[1])->GetElectricalData().number; switch(sequence) { case POSITIVE_SEQ: @@ -144,8 +150,8 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > if(transformer->IsOnline()) { TransformerElectricalData data = transformer->GetElectricalData(); - int n1 = static_cast<Bus*>(transformer->GetParentList()[0])->GetEletricalData().number; - int n2 = static_cast<Bus*>(transformer->GetParentList()[1])->GetEletricalData().number; + int n1 = static_cast<Bus*>(transformer->GetParentList()[0])->GetElectricalData().number; + int n2 = static_cast<Bus*>(transformer->GetParentList()[1])->GetElectricalData().number; // If the transformer have nominal turns ratio (1.0) and no phase shifting, it will be modelled as series // impedance. @@ -223,7 +229,7 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > for(auto it = m_syncGeneratorList.begin(), itEnd = m_syncGeneratorList.end(); it != itEnd; ++it) { SyncGenerator* syncGenerator = *it; if(syncGenerator->IsOnline()) { - int n = static_cast<Bus*>(syncGenerator->GetParentList()[0])->GetEletricalData().number; + int n = static_cast<Bus*>(syncGenerator->GetParentList()[0])->GetElectricalData().number; SyncGeneratorElectricalData data = syncGenerator->GetPUElectricalData(systemPowerBase); switch(sequence) { case POSITIVE_SEQ: { @@ -242,7 +248,7 @@ bool ElectricCalculation::GetYBus(std::vector<std::vector<std::complex<double> > for(auto it = m_syncMotorList.begin(), itEnd = m_syncMotorList.end(); it != itEnd; ++it) { SyncMotor* syncMotor = *it; if(syncMotor->IsOnline()) { - int n = static_cast<Bus*>(syncMotor->GetParentList()[0])->GetEletricalData().number; + int n = static_cast<Bus*>(syncMotor->GetParentList()[0])->GetElectricalData().number; SyncMotorElectricalData data = syncMotor->GetPUElectricalData(systemPowerBase); switch(sequence) { case POSITIVE_SEQ: { @@ -275,7 +281,7 @@ void ElectricCalculation::UpdateElementsPowerFlow(std::vector<std::complex<doubl // Buses voltages for(int i = 0; i < (int)m_busList.size(); i++) { Bus* bus = m_busList[i]; - BusElectricalData data = bus->GetEletricalData(); + BusElectricalData data = bus->GetElectricalData(); data.voltage = voltage[i]; bus->SetElectricalData(data); } @@ -284,8 +290,8 @@ 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 = static_cast<Bus*>(line->GetParentList()[0])->GetEletricalData().number; - int n2 = static_cast<Bus*>(line->GetParentList()[1])->GetEletricalData().number; + int n1 = static_cast<Bus*>(line->GetParentList()[0])->GetElectricalData().number; + int n2 = static_cast<Bus*>(line->GetParentList()[1])->GetElectricalData().number; LineElectricalData data = line->GetElectricalData(); std::complex<double> v1 = voltage[n1]; @@ -313,8 +319,8 @@ void ElectricCalculation::UpdateElementsPowerFlow(std::vector<std::complex<doubl Transformer* transformer = m_transformerList[i]; if(transformer->IsOnline()) { TransformerElectricalData data = transformer->GetElectricalData(); - int n1 = static_cast<Bus*>(transformer->GetParentList()[0])->GetEletricalData().number; - int n2 = static_cast<Bus*>(transformer->GetParentList()[1])->GetEletricalData().number; + int n1 = static_cast<Bus*>(transformer->GetParentList()[0])->GetElectricalData().number; + int n2 = static_cast<Bus*>(transformer->GetParentList()[1])->GetElectricalData().number; std::complex<double> v1 = voltage[n1]; // Primary voltage std::complex<double> v2 = voltage[n2]; // Secondary voltage @@ -348,7 +354,7 @@ void ElectricCalculation::UpdateElementsPowerFlow(std::vector<std::complex<doubl // Synchronous machines for(int i = 0; i < (int)m_busList.size(); i++) { Bus* bus = m_busList[i]; - BusElectricalData data = bus->GetEletricalData(); + BusElectricalData data = bus->GetElectricalData(); // Get the synchronous machines connected and calculate the load power on the bus. std::vector<SyncGenerator*> syncGeneratorsOnBus; diff --git a/Project/Electromechanical.cpp b/Project/Electromechanical.cpp index 85e10b4..191a1da 100644 --- a/Project/Electromechanical.cpp +++ b/Project/Electromechanical.cpp @@ -12,7 +12,7 @@ void Electromechanical::SetEventTimeList() // Fault for(auto it = m_busList.begin(), itEnd = m_busList.end(); it != itEnd; ++it) { Bus* bus = *it; - auto data = bus->GetEletricalData(); + auto data = bus->GetElectricalData(); if(data.stabHasFault) { m_eventTimeList.push_back(data.stabFaultTime); m_eventOccurrenceList.push_back(false); @@ -35,7 +35,7 @@ bool Electromechanical::HasEvent(double currentTime) { for(unsigned int i = 0; i < m_eventTimeList.size(); ++i) { if(!m_eventOccurrenceList[i]) { - if((m_eventTimeList[i] - m_timeStep) < currentTime && m_eventTimeList[i] >= currentTime) { + if(EventTrigger(m_eventTimeList[i], currentTime)) { m_eventOccurrenceList[i] = true; return true; } @@ -44,16 +44,327 @@ bool Electromechanical::HasEvent(double currentTime) return false; } -void Electromechanical::SetEvent(double currentTime) {} +void Electromechanical::SetEvent(double currentTime) +{ + // Fault + for(auto it = m_busList.begin(), itEnd = m_busList.end(); it != itEnd; ++it) { + Bus* bus = *it; + auto data = bus->GetElectricalData(); + if(data.stabHasFault) { + int n = data.number; + + // Insert fault + if(EventTrigger(data.stabFaultTime, currentTime)) { + double r, x; + r = data.stabFaultResistance; + x = data.stabFaultReactance; + if(x < 1e-5) x = 1e-5; + m_yBus[n][n] += std::complex<double>(1.0, 0.0) / std::complex<double>(r, x); + } + + // Remove fault + else if(EventTrigger(data.stabFaultTime + data.stabFaultLength, currentTime)) { + double r, x; + r = data.stabFaultResistance; + x = data.stabFaultReactance; + if(x < 1e-5) x = 1e-5; + m_yBus[n][n] -= std::complex<double>(1.0, 0.0) / std::complex<double>(r, x); + } + } + } + + // SyncGenerator switching + for(auto it = m_syncGeneratorList.begin(), itEnd = m_syncGeneratorList.end(); it != itEnd; ++it) { + SyncGenerator* generator = *it; + auto swData = generator->GetSwitchingData(); + for(unsigned int i = 0; i < swData.swType.size(); ++i) { + if(EventTrigger(swData.swTime[i], currentTime)) { + // Remove machine (only connected machines) + if(swData.swType[i] == SW_REMOVE && generator->IsOnline()) { + generator->SetOnline(false); + auto data = generator->GetPUElectricalData(m_powerSystemBase); + int n = static_cast<Bus*>(generator->GetParentList()[0])->GetElectricalData().number; + m_yBus[n][n] -= GetSyncMachineAdmittance(generator); + } + + // Insert machine (only disconnected machines) + if(swData.swType[i] == SW_INSERT && !generator->IsOnline() && generator->GetParentList().size() == 1) { + generator->SetOnline(true); + auto data = generator->GetPUElectricalData(m_powerSystemBase); + int n = static_cast<Bus*>(generator->GetParentList()[0])->GetElectricalData().number; + m_yBus[n][n] += GetSyncMachineAdmittance(generator); + } + } + } + } + + // Load switching + for(auto it = m_loadList.begin(), itEnd = m_loadList.end(); it != itEnd; ++it) { + Load* load = *it; + auto swData = load->GetSwitchingData(); + for(unsigned int i = 0; i < swData.swType.size(); ++i) { + if(EventTrigger(swData.swTime[i], currentTime)) { + // Remove load (only connected loads) + if(swData.swType[i] == SW_REMOVE && load->IsOnline()) { + load->SetOnline(false); + auto data = load->GetPUElectricalData(m_powerSystemBase); + Bus* parentBus = static_cast<Bus*>(load->GetParentList()[0]); + int n = parentBus->GetElectricalData().number; + std::complex<double> v = parentBus->GetElectricalData().voltage; + m_yBus[n][n] -= std::complex<double>(data.activePower, -data.reactivePower) / (v * v); + } + + // Insert load (only disconnected load) + if(swData.swType[i] == SW_INSERT && !load->IsOnline() && load->GetParentList().size() == 1) { + load->SetOnline(true); + auto data = load->GetPUElectricalData(m_powerSystemBase); + Bus* parentBus = static_cast<Bus*>(load->GetParentList()[0]); + int n = parentBus->GetElectricalData().number; + std::complex<double> v = parentBus->GetElectricalData().voltage; + m_yBus[n][n] += std::complex<double>(data.activePower, -data.reactivePower) / (v * v); + } + } + } + } + + // Line switching + for(auto it = m_lineList.begin(), itEnd = m_lineList.end(); it != itEnd; ++it) { + Line* line = *it; + auto swData = line->GetSwitchingData(); + for(unsigned int i = 0; i < swData.swType.size(); ++i) { + if(EventTrigger(swData.swTime[i], currentTime)) { + // Remove line (only connected lines) + if(swData.swType[i] == SW_REMOVE && line->IsOnline()) { + line->SetOnline(false); + auto data = line->GetElectricalData(); + + int n1 = static_cast<Bus*>(line->GetParentList()[0])->GetElectricalData().number; + int n2 = static_cast<Bus*>(line->GetParentList()[1])->GetElectricalData().number; + + m_yBus[n1][n2] += 1.0 / std::complex<double>(data.resistance, data.indReactance); + m_yBus[n2][n1] += 1.0 / std::complex<double>(data.resistance, data.indReactance); + + m_yBus[n1][n1] -= 1.0 / std::complex<double>(data.resistance, data.indReactance); + m_yBus[n2][n2] -= 1.0 / std::complex<double>(data.resistance, data.indReactance); + + m_yBus[n1][n1] -= std::complex<double>(0.0, data.capSusceptance / 2.0); + m_yBus[n2][n2] -= std::complex<double>(0.0, data.capSusceptance / 2.0); + } + + // Insert line (only disconnected lines) + if(swData.swType[i] == SW_INSERT && !line->IsOnline() && line->GetParentList().size() == 2) { + if(line->GetParentList()[0] && line->GetParentList()[1]) { + line->SetOnline(true); + auto data = line->GetElectricalData(); + + int n1 = static_cast<Bus*>(line->GetParentList()[0])->GetElectricalData().number; + int n2 = static_cast<Bus*>(line->GetParentList()[1])->GetElectricalData().number; + + m_yBus[n1][n2] -= 1.0 / std::complex<double>(data.resistance, data.indReactance); + m_yBus[n2][n1] -= 1.0 / std::complex<double>(data.resistance, data.indReactance); + + m_yBus[n1][n1] += 1.0 / std::complex<double>(data.resistance, data.indReactance); + m_yBus[n2][n2] += 1.0 / std::complex<double>(data.resistance, data.indReactance); + + m_yBus[n1][n1] += std::complex<double>(0.0, data.capSusceptance / 2.0); + m_yBus[n2][n2] += std::complex<double>(0.0, data.capSusceptance / 2.0); + } + } + } + } + } + + // Transformer switching + for(auto it = m_transformerList.begin(), itEnd = m_transformerList.end(); it != itEnd; ++it) { + Transformer* transformer = *it; + auto swData = transformer->GetSwitchingData(); + for(unsigned int i = 0; i < swData.swType.size(); ++i) { + if(EventTrigger(swData.swTime[i], currentTime)) { + // Remove transformer (only connected transformers) + if(swData.swType[i] == SW_REMOVE && transformer->IsOnline()) { + transformer->SetOnline(false); + auto data = transformer->GetElectricalData(); + + int n1 = static_cast<Bus*>(transformer->GetParentList()[0])->GetElectricalData().number; + int n2 = static_cast<Bus*>(transformer->GetParentList()[1])->GetElectricalData().number; + + if(data.turnsRatio == 1.0 && data.phaseShift == 0.0) { + m_yBus[n1][n2] -= -1.0 / std::complex<double>(data.resistance, data.indReactance); + m_yBus[n2][n1] -= -1.0 / std::complex<double>(data.resistance, data.indReactance); + + m_yBus[n1][n1] -= 1.0 / std::complex<double>(data.resistance, data.indReactance); + m_yBus[n2][n2] -= 1.0 / std::complex<double>(data.resistance, data.indReactance); + } 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)); + + // Transformer admitance + std::complex<double> y = 1.0 / std::complex<double>(data.resistance, data.indReactance); + m_yBus[n1][n1] -= y / std::pow(std::abs(a), 2.0); + m_yBus[n1][n2] -= -(y / std::conj(a)); + m_yBus[n2][n1] -= -(y / a); + m_yBus[n2][n2] -= y; + } + } + + // Insert transformer (only disconnected transformers) + if(swData.swType[i] == SW_INSERT && !transformer->IsOnline() && + transformer->GetParentList().size() == 2) { + if(transformer->GetParentList()[0] && transformer->GetParentList()[1]) { + transformer->SetOnline(true); + auto data = transformer->GetElectricalData(); + + int n1 = static_cast<Bus*>(transformer->GetParentList()[0])->GetElectricalData().number; + int n2 = static_cast<Bus*>(transformer->GetParentList()[1])->GetElectricalData().number; + + if(data.turnsRatio == 1.0 && data.phaseShift == 0.0) { + m_yBus[n1][n2] += -1.0 / std::complex<double>(data.resistance, data.indReactance); + m_yBus[n2][n1] += -1.0 / std::complex<double>(data.resistance, data.indReactance); + + m_yBus[n1][n1] += 1.0 / std::complex<double>(data.resistance, data.indReactance); + m_yBus[n2][n2] += 1.0 / std::complex<double>(data.resistance, data.indReactance); + } 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)); + + // Transformer admitance + std::complex<double> y = 1.0 / std::complex<double>(data.resistance, data.indReactance); + m_yBus[n1][n1] += y / std::pow(std::abs(a), 2.0); + m_yBus[n1][n2] += -(y / std::conj(a)); + m_yBus[n2][n1] += -(y / a); + m_yBus[n2][n2] += y; + } + } + } + } + } + } + + // Capacitor switching + for(auto it = m_capacitorList.begin(), itEnd = m_capacitorList.end(); it != itEnd; ++it) { + Capacitor* capacitor = *it; + auto swData = capacitor->GetSwitchingData(); + for(unsigned int i = 0; i < swData.swType.size(); ++i) { + if(EventTrigger(swData.swTime[i], currentTime)) { + // Remove capacitor (only connected capacitors) + if(swData.swType[i] == SW_REMOVE && capacitor->IsOnline()) { + capacitor->SetOnline(false); + auto data = capacitor->GetPUElectricalData(m_powerSystemBase); + int n = static_cast<Bus*>(capacitor->GetParentList()[0])->GetElectricalData().number; + m_yBus[n][n] += std::complex<double>(0.0, data.reactivePower); + } + + // Insert capacitor (only disconnected capacitors) + if(swData.swType[i] == SW_INSERT && !capacitor->IsOnline() && capacitor->GetParentList().size() == 1) { + if(capacitor->GetParentList()[0]) { + capacitor->SetOnline(true); + auto data = capacitor->GetPUElectricalData(m_powerSystemBase); + int n = static_cast<Bus*>(capacitor->GetParentList()[0])->GetElectricalData().number; + m_yBus[n][n] -= std::complex<double>(0.0, data.reactivePower); + } + } + } + } + } + + // Capacitor switching + for(auto it = m_inductorList.begin(), itEnd = m_inductorList.end(); it != itEnd; ++it) { + Inductor* inductor = *it; + auto swData = inductor->GetSwitchingData(); + for(unsigned int i = 0; i < swData.swType.size(); ++i) { + if(EventTrigger(swData.swTime[i], currentTime)) { + // Remove inductor (only connected inductors) + if(swData.swType[i] == SW_REMOVE && inductor->IsOnline()) { + inductor->SetOnline(false); + auto data = inductor->GetPUElectricalData(m_powerSystemBase); + int n = static_cast<Bus*>(inductor->GetParentList()[0])->GetElectricalData().number; + m_yBus[n][n] += std::complex<double>(0.0, -data.reactivePower); + } + + // Insert inductor (only disconnected inductors) + if(swData.swType[i] == SW_INSERT && !inductor->IsOnline() && inductor->GetParentList().size() == 1) { + if(inductor->GetParentList()[0]) { + inductor->SetOnline(true); + auto data = inductor->GetPUElectricalData(m_powerSystemBase); + int n = static_cast<Bus*>(inductor->GetParentList()[0])->GetElectricalData().number; + m_yBus[n][n] -= std::complex<double>(0.0, -data.reactivePower); + } + } + } + } + } +} + bool Electromechanical::RunStabilityCalculation() { + // Calculate the admittance matrix with the synchronous machines. + if(!GetYBus(m_yBus, m_powerSystemBase, POSITIVE_SEQ, false, true)) { + m_errorMsg = _("It was not possible to build the admittance matrix."); + return false; + } + InsertSyncMachinesOnYBus(); + // test double simTime = 10.0; double currentTime = 0.0; while(currentTime <= simTime) { if(HasEvent(currentTime)) { + SetEvent(currentTime); } currentTime += m_timeStep; } return true; } + +void Electromechanical::InsertSyncMachinesOnYBus() +{ + for(auto it = m_syncGeneratorList.begin(), itEnd = m_syncGeneratorList.end(); it != itEnd; ++it) { + SyncGenerator* generator = *it; + if(generator->IsOnline()) { + auto data = generator->GetElectricalData(); + int n = static_cast<Bus*>(generator->GetParentList()[0])->GetElectricalData().number; + m_yBus[n][n] += GetSyncMachineAdmittance(generator); + } + } +} + +bool Electromechanical::EventTrigger(double eventTime, double currentTime) +{ + return (((eventTime - m_timeStep) < currentTime) && (eventTime >= currentTime)); +} + +std::complex<double> Electromechanical::GetSyncMachineAdmittance(SyncGenerator* generator) +{ + auto data = generator->GetPUElectricalData(m_powerSystemBase); + double k = 1.0; // Power base change factor. + if(data.useMachineBase) { + double oldBase = data.nominalPower * std::pow(1000.0f, data.nominalPowerUnit); + k = m_powerSystemBase / oldBase; + } + + double xd = 0.0; + double xq = 0.0; + double ra = data.armResistance * k; + + switch(GetMachineModel(generator)) { + case SM_MODEL_1: + case SM_MODEL_2: + case SM_MODEL_3: { + xd = data.transXd * k; + xq = data.transXq * k; + break; + } + case SM_MODEL_4: + case SM_MODEL_5: { + xd = data.subXd * k; + xq = data.subXq * k; + break; + } + } + double xdq = 0.5 * (xd + xq); + return std::complex<double>(ra, -xdq) / std::complex<double>(ra * ra + xd * xq, 0.0); +} diff --git a/Project/Electromechanical.h b/Project/Electromechanical.h index c8555b7..172428f 100644 --- a/Project/Electromechanical.h +++ b/Project/Electromechanical.h @@ -16,12 +16,15 @@ protected: void SetEventTimeList(); bool HasEvent(double currentTime); void SetEvent(double currentTime); + inline bool EventTrigger(double eventTime, double currentTime); - void Insert + void InsertSyncMachinesOnYBus(); + std::complex<double> GetSyncMachineAdmittance(SyncGenerator* generator); wxString m_errorMsg = _("Unknown error"); std::vector<std::vector<std::complex<double> > > m_yBus; + double m_powerSystemBase = 100e6; double m_timeStep = 1e-3; diff --git a/Project/Fault.cpp b/Project/Fault.cpp index 505634e..fc4769b 100644 --- a/Project/Fault.cpp +++ b/Project/Fault.cpp @@ -52,7 +52,7 @@ bool Fault::RunFaultCalculation(double systemPowerBase) std::complex<double> fImpedance = std::complex<double>(0.0, 0.0); for(auto it = m_busList.begin(), itEnd = m_busList.end(); it != itEnd; ++it) { Bus* bus = *it; - BusElectricalData data = bus->GetEletricalData(); + BusElectricalData data = bus->GetElectricalData(); preFaultVoltages.push_back(data.voltage); if(data.hasFault) { fNumber = data.number; @@ -184,7 +184,7 @@ void Fault::UpdateElementsFault(double systemPowerBase) for(auto it = m_busList.begin(), itEnd = m_busList.end(); it != itEnd; ++it) { Bus* bus = *it; - auto data = bus->GetEletricalData(); + auto data = bus->GetElectricalData(); if(data.hasFault) { data.faultCurrent[0] = m_fCurrentA; data.faultCurrent[1] = m_fCurrentB; @@ -201,8 +201,8 @@ void Fault::UpdateElementsFault(double systemPowerBase) for(auto it = m_lineList.begin(), itEnd = m_lineList.end(); it != itEnd; ++it) { Line* line = *it; if(line->IsOnline()) { - int n1 = static_cast<Bus*>(line->GetParentList()[0])->GetEletricalData().number; - int n2 = static_cast<Bus*>(line->GetParentList()[1])->GetEletricalData().number; + int n1 = static_cast<Bus*>(line->GetParentList()[0])->GetElectricalData().number; + int n2 = static_cast<Bus*>(line->GetParentList()[1])->GetElectricalData().number; auto data = line->GetElectricalData(); std::complex<double> vPos[2] = { m_posFaultVoltagePos[n1], m_posFaultVoltagePos[n2] }; std::complex<double> vNeg[2] = { m_posFaultVoltageNeg[n1], m_posFaultVoltageNeg[n2] }; @@ -237,8 +237,8 @@ void Fault::UpdateElementsFault(double systemPowerBase) for(auto it = m_transformerList.begin(), itEnd = m_transformerList.end(); it != itEnd; ++it) { Transformer* transformer = *it; if(transformer->IsOnline()) { - int n1 = static_cast<Bus*>(transformer->GetParentList()[0])->GetEletricalData().number; - int n2 = static_cast<Bus*>(transformer->GetParentList()[1])->GetEletricalData().number; + int n1 = static_cast<Bus*>(transformer->GetParentList()[0])->GetElectricalData().number; + int n2 = static_cast<Bus*>(transformer->GetParentList()[1])->GetElectricalData().number; auto data = transformer->GetElectricalData(); std::complex<double> vPos[2] = { m_posFaultVoltagePos[n1], m_posFaultVoltagePos[n2] }; @@ -314,8 +314,8 @@ void Fault::UpdateElementsFault(double systemPowerBase) SyncGenerator* syncGenerator = *it; if(syncGenerator->IsOnline()) { Bus* bus = static_cast<Bus*>(syncGenerator->GetParentList()[0]); - int n = bus->GetEletricalData().number; - std::complex<double> v = bus->GetEletricalData().voltage; // Pre-fault voltage. + int n = bus->GetElectricalData().number; + std::complex<double> v = bus->GetElectricalData().voltage; // Pre-fault voltage. auto data = syncGenerator->GetElectricalData(); std::complex<double> vPos = m_posFaultVoltagePos[n]; @@ -346,8 +346,8 @@ void Fault::UpdateElementsFault(double systemPowerBase) SyncMotor* syncMotor = *it; if(syncMotor->IsOnline()) { Bus* bus = static_cast<Bus*>(syncMotor->GetParentList()[0]); - int n = bus->GetEletricalData().number; - std::complex<double> v = bus->GetEletricalData().voltage; // Pre-fault voltage. + int n = bus->GetElectricalData().number; + std::complex<double> v = bus->GetElectricalData().voltage; // Pre-fault voltage. auto data = syncMotor->GetElectricalData(); std::complex<double> vPos = m_posFaultVoltagePos[n]; @@ -390,7 +390,7 @@ bool Fault::RunSCPowerCalcutation(double systemPowerBase) // Set the SC power. for(auto it = m_busList.begin(), itEnd = m_busList.end(); it != itEnd; ++it) { Bus* bus = *it; - auto data = bus->GetEletricalData(); + auto data = bus->GetElectricalData(); int n = data.number; data.scPower = 1.0 / std::abs(m_zBusPos[n][n]); bus->SetElectricalData(data); diff --git a/Project/FileHanding.cpp b/Project/FileHanding.cpp index 02a0f56..dbd40d2 100644 --- a/Project/FileHanding.cpp +++ b/Project/FileHanding.cpp @@ -54,7 +54,7 @@ void FileHanding::SaveProject(wxFileName path) auto angle = AppendNode(doc, cadProp, "Angle"); SetNodeValue(doc, angle, bus->GetAngle()); - BusElectricalData data = bus->GetEletricalData(); + BusElectricalData data = bus->GetElectricalData(); auto electricalProp = AppendNode(doc, busNode, "ElectricalProperties"); auto name = AppendNode(doc, electricalProp, "Name"); SetNodeValue(doc, name, data.name); @@ -126,7 +126,7 @@ void FileHanding::SaveProject(wxFileName path) SetNodeValue(doc, nodePosY, capacitor->GetPointList()[0].m_y); auto parentID = AppendNode(doc, cadProp, "ParentID"); Bus* parent = static_cast<Bus*>(capacitor->GetParentList()[0]); - if(parent) SetNodeValue(doc, parentID, parent->GetEletricalData().number); + if(parent) SetNodeValue(doc, parentID, parent->GetElectricalData().number); CapacitorElectricalData data = capacitor->GetElectricalData(); auto electricalProp = AppendNode(doc, capacitorNode, "ElectricalProperties"); @@ -177,7 +177,7 @@ void FileHanding::SaveProject(wxFileName path) SetNodeValue(doc, nodePosY, indMotor->GetPointList()[0].m_y); auto parentID = AppendNode(doc, cadProp, "ParentID"); Bus* parent = static_cast<Bus*>(indMotor->GetParentList()[0]); - if(parent) SetNodeValue(doc, parentID, parent->GetEletricalData().number); + if(parent) SetNodeValue(doc, parentID, parent->GetElectricalData().number); IndMotorElectricalData data = indMotor->GetElectricalData(); auto electricalProp = AppendNode(doc, indMotorNode, "ElectricalProperties"); @@ -220,7 +220,7 @@ void FileHanding::SaveProject(wxFileName path) SetNodeValue(doc, nodePosY, inductor->GetPointList()[0].m_y); auto parentID = AppendNode(doc, cadProp, "ParentID"); Bus* parent = static_cast<Bus*>(inductor->GetParentList()[0]); - if(parent) SetNodeValue(doc, parentID, parent->GetEletricalData().number); + if(parent) SetNodeValue(doc, parentID, parent->GetElectricalData().number); InductorElectricalData data = inductor->GetElectricalData(); auto electricalProp = AppendNode(doc, inductorNode, "ElectricalProperties"); @@ -273,7 +273,7 @@ void FileHanding::SaveProject(wxFileName path) if(parent) { auto parentID = AppendNode(doc, parentIDList, "ParentID"); SetNodeAttribute(doc, parentID, "ID", j); - SetNodeValue(doc, parentID, parent->GetEletricalData().number); + SetNodeValue(doc, parentID, parent->GetElectricalData().number); } } @@ -350,7 +350,7 @@ void FileHanding::SaveProject(wxFileName path) SetNodeValue(doc, nodePosY, load->GetPointList()[0].m_y); auto parentID = AppendNode(doc, cadProp, "ParentID"); Bus* parent = static_cast<Bus*>(load->GetParentList()[0]); - if(parent) SetNodeValue(doc, parentID, parent->GetEletricalData().number); + if(parent) SetNodeValue(doc, parentID, parent->GetElectricalData().number); LoadElectricalData data = load->GetElectricalData(); auto electricalProp = AppendNode(doc, loadNode, "ElectricalProperties"); @@ -406,7 +406,7 @@ void FileHanding::SaveProject(wxFileName path) SetNodeValue(doc, nodePosY, syncGenerator->GetPointList()[0].m_y); auto parentID = AppendNode(doc, cadProp, "ParentID"); Bus* parent = static_cast<Bus*>(syncGenerator->GetParentList()[0]); - if(parent) SetNodeValue(doc, parentID, parent->GetEletricalData().number); + if(parent) SetNodeValue(doc, parentID, parent->GetElectricalData().number); SyncGeneratorElectricalData data = syncGenerator->GetElectricalData(); auto electricalProp = AppendNode(doc, syncGeneratorNode, "ElectricalProperties"); @@ -542,7 +542,7 @@ void FileHanding::SaveProject(wxFileName path) SetNodeValue(doc, nodePosY, syncMotor->GetPointList()[0].m_y); auto parentID = AppendNode(doc, cadProp, "ParentID"); Bus* parent = static_cast<Bus*>(syncMotor->GetParentList()[0]); - if(parent) SetNodeValue(doc, parentID, parent->GetEletricalData().number); + if(parent) SetNodeValue(doc, parentID, parent->GetElectricalData().number); SyncMotorElectricalData data = syncMotor->GetElectricalData(); auto electricalProp = AppendNode(doc, syncMotorNode, "ElectricalProperties"); @@ -684,7 +684,7 @@ void FileHanding::SaveProject(wxFileName path) if(parent) { auto parentID = AppendNode(doc, parentIDList, "ParentID"); SetNodeAttribute(doc, parentID, "ID", j); - SetNodeValue(doc, parentID, parent->GetEletricalData().number); + SetNodeValue(doc, parentID, parent->GetElectricalData().number); } } @@ -842,7 +842,7 @@ bool FileHanding::OpenProject(wxFileName path) } for(int i = 0; i < numRot; i++) bus->Rotate(clockwise); - BusElectricalData data = bus->GetEletricalData(); + BusElectricalData data = bus->GetElectricalData(); auto electricalProp = busNode->first_node("ElectricalProperties"); if(!electricalProp) return false; diff --git a/Project/Inductor.cpp b/Project/Inductor.cpp index b9a3da6..b169f8a 100644 --- a/Project/Inductor.cpp +++ b/Project/Inductor.cpp @@ -174,7 +174,7 @@ wxString Inductor::GetTipText() const if(!m_online) reactivePower = 0.0; else { - std::complex<double> v = static_cast<Bus*>(m_parentList[0])->GetEletricalData().voltage; + std::complex<double> v = static_cast<Bus*>(m_parentList[0])->GetElectricalData().voltage; reactivePower *= std::pow(std::abs(v), 2); } tipText += "\n"; diff --git a/Project/Line.cpp b/Project/Line.cpp index 86d947c..ba56ebc 100644 --- a/Project/Line.cpp +++ b/Project/Line.cpp @@ -134,16 +134,16 @@ bool Line::AddParent(Element* parent, wxPoint2DDouble position) UpdateSwitches(); Bus* parentBus = static_cast<Bus*>(parent); - m_electricaData.nominalVoltage = parentBus->GetEletricalData().nominalVoltage; - m_electricaData.nominalVoltageUnit = parentBus->GetEletricalData().nominalVoltageUnit; + m_electricaData.nominalVoltage = parentBus->GetElectricalData().nominalVoltage; + m_electricaData.nominalVoltageUnit = parentBus->GetElectricalData().nominalVoltageUnit; return false; } // Second bus. else if(parent != m_parentList[0]) { Bus* parentBus = static_cast<Bus*>(parent); - if(m_electricaData.nominalVoltage != parentBus->GetEletricalData().nominalVoltage || - m_electricaData.nominalVoltageUnit != parentBus->GetEletricalData().nominalVoltageUnit) { + if(m_electricaData.nominalVoltage != parentBus->GetElectricalData().nominalVoltage || + m_electricaData.nominalVoltageUnit != parentBus->GetElectricalData().nominalVoltageUnit) { wxMessageDialog msgDialog(NULL, _("Unable to connect two buses with different nominal voltages.\n" "Use a transformer or edit the bus properties."), _("Error"), wxOK | wxCENTRE | wxICON_ERROR); @@ -366,10 +366,10 @@ bool Line::SetNodeParent(Element* parent) // two different voltages buses Bus* parentBus = static_cast<Bus*>(parent); if(!m_parentList[0] && !m_parentList[1]) { - m_electricaData.nominalVoltage = parentBus->GetEletricalData().nominalVoltage; - m_electricaData.nominalVoltageUnit = parentBus->GetEletricalData().nominalVoltageUnit; - } else if(m_electricaData.nominalVoltage != parentBus->GetEletricalData().nominalVoltage || - m_electricaData.nominalVoltageUnit != parentBus->GetEletricalData().nominalVoltageUnit) { + m_electricaData.nominalVoltage = parentBus->GetElectricalData().nominalVoltage; + m_electricaData.nominalVoltageUnit = parentBus->GetElectricalData().nominalVoltageUnit; + } else if(m_electricaData.nominalVoltage != parentBus->GetElectricalData().nominalVoltage || + m_electricaData.nominalVoltageUnit != parentBus->GetElectricalData().nominalVoltageUnit) { wxMessageDialog msgDialog(NULL, _("Unable to connect two buses with different nominal voltages.\n" "Use a transformer or edit the bus properties."), _("Error"), wxOK | wxCENTRE | wxICON_ERROR); @@ -488,8 +488,8 @@ wxString Line::GetTipText() const if(m_online) { tipText += "\n"; int busNumber[2]; - busNumber[0] = static_cast<Bus*>(m_parentList[0])->GetEletricalData().number + 1; - busNumber[1] = static_cast<Bus*>(m_parentList[1])->GetEletricalData().number + 1; + busNumber[0] = static_cast<Bus*>(m_parentList[0])->GetElectricalData().number + 1; + busNumber[1] = static_cast<Bus*>(m_parentList[1])->GetElectricalData().number + 1; tipText += _("\nP") + wxString::Format("(%d-%d) = ", busNumber[0], busNumber[1]) + wxString::FromDouble(m_electricaData.powerFlow[0].real(), 5) + _(" p.u."); diff --git a/Project/Load.cpp b/Project/Load.cpp index 3cce7a1..d9574d9 100644 --- a/Project/Load.cpp +++ b/Project/Load.cpp @@ -194,7 +194,7 @@ wxString Load::GetTipText() const reactivePower = 0.0; } if(m_online && m_electricalData.loadType == CONST_IMPEDANCE) { - std::complex<double> v = static_cast<Bus*>(m_parentList[0])->GetEletricalData().voltage; + std::complex<double> v = static_cast<Bus*>(m_parentList[0])->GetElectricalData().voltage; reactivePower *= std::pow(std::abs(v), 2); activePower *= std::pow(std::abs(v), 2); } diff --git a/Project/PowerFlow.cpp b/Project/PowerFlow.cpp index bfee2af..fe59067 100644 --- a/Project/PowerFlow.cpp +++ b/Project/PowerFlow.cpp @@ -39,7 +39,7 @@ bool PowerFlow::RunGaussSeidel(double systemPowerBase, int busNumber = 0; for(auto itb = m_busList.begin(); itb != m_busList.end(); itb++) { Bus* bus = *itb; - BusElectricalData data = bus->GetEletricalData(); + BusElectricalData data = bus->GetElectricalData(); // Fill the bus type if(data.slackBus) busType.push_back(BUS_SLACK); diff --git a/Project/Project.mk b/Project/Project.mk index 7f113a8..04ea9da 100644 --- a/Project/Project.mk +++ b/Project/Project.mk @@ -13,7 +13,7 @@ CurrentFileName := CurrentFilePath := CurrentFileFullPath := User :=NDSE-69 -Date :=20/05/2017 +Date :=22/05/2017 CodeLitePath :="C:/Program Files/CodeLite" LinkerName :=C:/TDM-GCC-64/bin/g++.exe SharedObjectLinkerName :=C:/TDM-GCC-64/bin/g++.exe -shared -fPIC diff --git a/Project/SyncGenerator.h b/Project/SyncGenerator.h index 282d9fa..5fe078f 100644 --- a/Project/SyncGenerator.h +++ b/Project/SyncGenerator.h @@ -23,7 +23,7 @@ struct SyncGeneratorElectricalData { bool haveMinReactive = false; double minReactive = -9999.0; ElectricalUnit minReactiveUnit = UNIT_MVAr; - bool useMachineBase = false; + bool useMachineBase = true; // Fault double positiveResistance = 0.0; diff --git a/Project/Text.cpp b/Project/Text.cpp index 9fe4fe8..51cdce9 100644 --- a/Project/Text.cpp +++ b/Project/Text.cpp @@ -164,14 +164,14 @@ void Text::UpdateText(double systemPowerBase) case TYPE_BUS: { Bus* bus = static_cast<Bus*>(m_element); if(bus) { - BusElectricalData data = bus->GetEletricalData(); + BusElectricalData data = bus->GetElectricalData(); double baseVoltage = data.nominalVoltage; if(data.nominalVoltageUnit == UNIT_kV) baseVoltage *= 1e3; double baseCurrent = systemPowerBase / (std::sqrt(3.0) * baseVoltage); switch(m_dataType) { case DATA_NAME: { - SetText(bus->GetEletricalData().name); + SetText(bus->GetElectricalData().name); } break; case DATA_VOLTAGE: { double voltage = std::abs(data.voltage); @@ -672,7 +672,7 @@ void Text::UpdateText(double systemPowerBase) LoadElectricalData data = load->GetPUElectricalData(systemPowerBase); std::complex<double> sPower(data.activePower, data.reactivePower); if(data.loadType == CONST_IMPEDANCE && load->IsOnline()) { - std::complex<double> v = static_cast<Bus*>(load->GetParentList()[0])->GetEletricalData().voltage; + std::complex<double> v = static_cast<Bus*>(load->GetParentList()[0])->GetElectricalData().voltage; sPower = std::pow(std::abs(v), 2) * sPower; } if(!load->IsOnline()) sPower = std::complex<double>(0.0, 0.0); @@ -847,7 +847,7 @@ void Text::UpdateText(double systemPowerBase) reativePower = 0.0; else { std::complex<double> v = - static_cast<Bus*>(capacitor->GetParentList()[0])->GetEletricalData().voltage; + static_cast<Bus*>(capacitor->GetParentList()[0])->GetElectricalData().voltage; reativePower *= std::pow(std::abs(v), 2); } switch(m_dataType) { @@ -888,7 +888,7 @@ void Text::UpdateText(double systemPowerBase) reativePower = 0.0; else { std::complex<double> v = - static_cast<Bus*>(inductor->GetParentList()[0])->GetEletricalData().voltage; + static_cast<Bus*>(inductor->GetParentList()[0])->GetElectricalData().voltage; reativePower *= std::pow(std::abs(v), 2); } switch(m_dataType) { diff --git a/Project/TextForm.cpp b/Project/TextForm.cpp index b33c64b..6c3304f 100644 --- a/Project/TextForm.cpp +++ b/Project/TextForm.cpp @@ -773,7 +773,7 @@ void TextForm::ElementTypeChoice() case TYPE_BUS: { for(int i = 0; i < (int)m_allElements.GetBusList().size(); i++) { Bus* bus = m_allElements.GetBusList()[i]; - arrayString.Add(bus->GetEletricalData().name); + arrayString.Add(bus->GetElectricalData().name); } } break; case TYPE_SYNC_GENERATOR: { @@ -1004,8 +1004,8 @@ void TextForm::DataTypeChoice() Bus* bus1 = static_cast<Bus*>(line->GetParentList()[0]); Bus* bus2 = static_cast<Bus*>(line->GetParentList()[1]); - wxString bus1Name = bus1->GetEletricalData().name; - wxString bus2Name = bus2->GetEletricalData().name; + wxString bus1Name = bus1->GetElectricalData().name; + wxString bus2Name = bus2->GetElectricalData().name; m_choiceTextFromBus->Append(bus1Name); m_choiceTextFromBus->Append(bus2Name); @@ -1026,8 +1026,8 @@ void TextForm::DataTypeChoice() Bus* bus1 = static_cast<Bus*>(transformer->GetParentList()[0]); Bus* bus2 = static_cast<Bus*>(transformer->GetParentList()[1]); - wxString bus1Name = bus1->GetEletricalData().name; - wxString bus2Name = bus2->GetEletricalData().name; + wxString bus1Name = bus1->GetElectricalData().name; + wxString bus2Name = bus2->GetElectricalData().name; m_choiceTextFromBus->Append(bus1Name); m_choiceTextFromBus->Append(bus2Name); diff --git a/Project/Transformer.cpp b/Project/Transformer.cpp index 3d3156a..7848abb 100644 --- a/Project/Transformer.cpp +++ b/Project/Transformer.cpp @@ -427,8 +427,8 @@ wxString Transformer::GetTipText() const if(m_online) { tipText += "\n"; int busNumber[2]; - busNumber[0] = static_cast<Bus*>(m_parentList[0])->GetEletricalData().number + 1; - busNumber[1] = static_cast<Bus*>(m_parentList[1])->GetEletricalData().number + 1; + busNumber[0] = static_cast<Bus*>(m_parentList[0])->GetElectricalData().number + 1; + busNumber[1] = static_cast<Bus*>(m_parentList[1])->GetElectricalData().number + 1; tipText += _("\nP") + wxString::Format("(%d-%d) = ", busNumber[0], busNumber[1]) + wxString::FromDouble(m_electricalData.powerFlow[0].real(), 5) + _(" p.u."); diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp index 4b2cf29..a45518f 100644 --- a/Project/Workspace.cpp +++ b/Project/Workspace.cpp @@ -256,8 +256,9 @@ void Workspace::OnLeftDoubleClick(wxMouseEvent& event) // propagated through the lines if(elementIsBus) { // The voltage was changed - if(oldBus.GetEletricalData().nominalVoltage != currentBus->GetEletricalData().nominalVoltage || - oldBus.GetEletricalData().nominalVoltageUnit != currentBus->GetEletricalData().nominalVoltageUnit) { + if(oldBus.GetElectricalData().nominalVoltage != currentBus->GetElectricalData().nominalVoltage || + oldBus.GetElectricalData().nominalVoltageUnit != + currentBus->GetElectricalData().nominalVoltageUnit) { // Check if the bus has line as child. std::vector<Element*> childList = element->GetChildList(); for(auto itc = childList.begin(), itcEnd = childList.end(); itc != itcEnd; ++itc) { @@ -268,9 +269,9 @@ void Workspace::OnLeftDoubleClick(wxMouseEvent& event) if(msgDialog.ShowModal() == wxID_YES) ValidateBusesVoltages(element); else { - auto data = currentBus->GetEletricalData(); - data.nominalVoltage = oldBus.GetEletricalData().nominalVoltage; - data.nominalVoltageUnit = oldBus.GetEletricalData().nominalVoltageUnit; + auto data = currentBus->GetElectricalData(); + data.nominalVoltage = oldBus.GetElectricalData().nominalVoltage; + data.nominalVoltageUnit = oldBus.GetElectricalData().nominalVoltageUnit; currentBus->SetElectricalData(data); } break; @@ -1039,16 +1040,16 @@ void Workspace::Fit() void Workspace::ValidateBusesVoltages(Element* initialBus) { - double nominalVoltage = static_cast<Bus*>(initialBus)->GetEletricalData().nominalVoltage; - ElectricalUnit nominalVoltageUnit = static_cast<Bus*>(initialBus)->GetEletricalData().nominalVoltageUnit; + double nominalVoltage = static_cast<Bus*>(initialBus)->GetElectricalData().nominalVoltage; + ElectricalUnit nominalVoltageUnit = static_cast<Bus*>(initialBus)->GetElectricalData().nominalVoltageUnit; for(auto it = m_elementList.begin(); it != m_elementList.end(); it++) { Element* child = *it; if(typeid(*child) == typeid(Line)) { if(child->GetParentList()[0] && child->GetParentList()[1]) { - BusElectricalData data1 = static_cast<Bus*>(child->GetParentList()[0])->GetEletricalData(); - BusElectricalData data2 = static_cast<Bus*>(child->GetParentList()[1])->GetEletricalData(); + BusElectricalData data1 = static_cast<Bus*>(child->GetParentList()[0])->GetElectricalData(); + BusElectricalData data2 = static_cast<Bus*>(child->GetParentList()[1])->GetElectricalData(); if(data1.nominalVoltage != data2.nominalVoltage || data1.nominalVoltageUnit != data2.nominalVoltageUnit) { @@ -1079,8 +1080,8 @@ void Workspace::ValidateElementsVoltages() for(int i = 0; i < (int)child->GetParentList().size(); i++) { Bus* parent = static_cast<Bus*>(child->GetParentList()[i]); if(parent) { - nominalVoltage.push_back(parent->GetEletricalData().nominalVoltage); - nominalVoltageUnit.push_back(parent->GetEletricalData().nominalVoltageUnit); + nominalVoltage.push_back(parent->GetElectricalData().nominalVoltage); + nominalVoltageUnit.push_back(parent->GetElectricalData().nominalVoltageUnit); } } child->SetNominalVoltage(nominalVoltage, nominalVoltageUnit); @@ -1120,7 +1121,7 @@ void Workspace::CopySelection() Element* element = *it; if(typeid(*element) == typeid(Bus)) { Bus* bus = static_cast<Bus*>(element); - auto data = bus->GetEletricalData(); + auto data = bus->GetElectricalData(); data.number = busNumber; bus->SetElectricalData(data); busNumber++; @@ -1393,6 +1394,9 @@ bool Workspace::RunSCPower() bool Workspace::RunStability() { + // Run power flow before stability. + RunPowerFlow(); + Electromechanical stability(GetElementList()); bool result = stability.RunStabilityCalculation(); if(!result) { @@ -1400,5 +1404,8 @@ bool Workspace::RunStability() msgDialog.ShowModal(); } + // Run power flow after stability. + RunPowerFlow(); + return result; } |