summaryrefslogtreecommitdiffstats
path: root/Project
diff options
context:
space:
mode:
authorThales Lima Oliveira <thaleslima.ufu@gmail.com>2017-05-22 20:17:41 -0300
committerThales Lima Oliveira <thaleslima.ufu@gmail.com>2017-05-22 20:17:41 -0300
commitf995850b38916b38718b84f4b82948479a81855a (patch)
treedb1f4f79f2d47383451869ce214dc416b0174dac /Project
parent30181ca0ae73f5f7f1856ac289db8fcf849c9a84 (diff)
downloadPSP.git-f995850b38916b38718b84f4b82948479a81855a.tar.gz
PSP.git-f995850b38916b38718b84f4b82948479a81855a.tar.xz
PSP.git-f995850b38916b38718b84f4b82948479a81855a.zip
Events implemented
Effects on adimittance matrix and elements: ->Fault on bus; ->Generation/Load switching; ->Branch switching.
Diffstat (limited to 'Project')
-rw-r--r--Project/Bus.h2
-rw-r--r--Project/BusForm.cpp48
-rw-r--r--Project/Capacitor.cpp2
-rw-r--r--Project/ElectricCalculation.cpp42
-rw-r--r--Project/Electromechanical.cpp317
-rw-r--r--Project/Electromechanical.h5
-rw-r--r--Project/Fault.cpp22
-rw-r--r--Project/FileHanding.cpp20
-rw-r--r--Project/Inductor.cpp2
-rw-r--r--Project/Line.cpp20
-rw-r--r--Project/Load.cpp2
-rw-r--r--Project/PowerFlow.cpp2
-rw-r--r--Project/Project.mk2
-rw-r--r--Project/SyncGenerator.h2
-rw-r--r--Project/Text.cpp10
-rw-r--r--Project/TextForm.cpp10
-rw-r--r--Project/Transformer.cpp4
-rw-r--r--Project/Workspace.cpp31
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;
}