From 59c28b89bb2a4eb05a87bb28154442266c35b17d Mon Sep 17 00:00:00 2001 From: Thales Lima Oliveira Date: Tue, 22 Jan 2019 15:06:09 -0200 Subject: Some code stability optimization --- Project/Workspace.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'Project/Workspace.cpp') diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp index 8a67456..e652f51 100644 --- a/Project/Workspace.cpp +++ b/Project/Workspace.cpp @@ -1429,7 +1429,9 @@ bool Workspace::RunStability() RunPowerFlow(); Electromechanical stability(this, GetElementList(), m_properties->GetSimulationPropertiesData()); + wxStopWatch sw; bool result = stability.RunStabilityCalculation(); + sw.Pause(); if(!result) { wxMessageDialog msgDialog(this, stability.GetErrorMessage(), _("Error"), wxOK | wxCENTRE | wxICON_ERROR); msgDialog.ShowModal(); @@ -1440,8 +1442,11 @@ bool Workspace::RunStability() // Run power flow after stability. RunPowerFlow(); - wxMessageDialog msgDialog(this, _("Do you wish to open the stability graphics?"), _("Question"), - wxYES_NO | wxCENTRE | wxICON_QUESTION); + wxMessageDialog msgDialog( + this, + wxString::Format(_("The program took %ld ms to run this system.\nDo you wish to open the stability graphics?"), + sw.Time()), + _("Question"), wxYES_NO | wxCENTRE | wxICON_QUESTION); if(msgDialog.ShowModal() == wxID_YES) { std::vector plotDataList; for(auto it = m_elementList.begin(), itEnd = m_elementList.end(); it != itEnd; ++it) { @@ -1449,7 +1454,7 @@ bool Workspace::RunStability() ElementPlotData plotData; if(element->GetPlotData(plotData)) plotDataList.push_back(plotData); } - + ElementPlotData plotData; plotData.SetName(_("Simulation parameters")); plotData.SetCurveType(ElementPlotData::CT_TEST); -- cgit From 2771fff79ac9c3c09b70f4668e7142b2e944d1f2 Mon Sep 17 00:00:00 2001 From: Thales Lima Oliveira Date: Thu, 25 Apr 2019 01:25:41 -0300 Subject: Matpower Importer and power quality calculation Power quality in implementation --- Project/Workspace.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'Project/Workspace.cpp') diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp index e652f51..a17faae 100644 --- a/Project/Workspace.cpp +++ b/Project/Workspace.cpp @@ -28,12 +28,14 @@ #include "SyncGenerator.h" #include "SyncMotor.h" #include "Transformer.h" +#include "HarmCurrent.h" #include "Text.h" #include "Electromechanical.h" #include "Fault.h" #include "PowerFlow.h" +#include "PowerQuality.h" #include "ChartView.h" #include "ElementPlotData.h" @@ -154,6 +156,7 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) Element* newElement = NULL; bool showNewElementForm = false; bool clickOnSwitch = false; + if(m_mode == MODE_INSERT_TEXT || m_mode == MODE_PASTE || m_mode == MODE_DRAG_PASTE) { m_mode = MODE_EDIT; } else if(m_mode == MODE_INSERT || m_mode == MODE_DRAG_INSERT || m_mode == MODE_DRAG_INSERT_TEXT) { @@ -799,6 +802,19 @@ void Workspace::OnKeyDown(wxKeyEvent& event) } } } break; + case 'H': { + if(!insertingElement) { + if(event.GetModifiers() == wxMOD_SHIFT) { // Insert an harmonic current source. + HarmCurrent* newHarmCurrent = + new HarmCurrent(wxString::Format(_("Harmonic Current %d"), GetElementNumber(ID_HARMCURRENT))); + IncrementElementNumber(ID_HARMCURRENT); + m_elementList.push_back(newHarmCurrent); + m_mode = MODE_INSERT; + m_statusBar->SetStatusText(_("Insert Harmonic Current Source: Click on a buses, ESC to cancel.")); + } + Redraw(); + } + } break; case 'V': { if(!insertingElement) { if(event.GetModifiers() == wxMOD_CONTROL) { Paste(); } @@ -1496,3 +1512,16 @@ bool Workspace::RunStaticStudies() return false; } + +bool Workspace::RunHarmonicDistortion() +{ + auto simProp = m_properties->GetSimulationPropertiesData(); + double basePower = simProp.basePower; + if(simProp.basePowerUnit == UNIT_MVA) + basePower *= 1e6; + else if(simProp.basePowerUnit == UNIT_kVA) + basePower *= 1e3; + if(!RunPowerFlow()) return false; + PowerQuality pq(GetElementList()); + return pq.CalculateDistortions(basePower); +} -- cgit From a40d5a405d60b4e429f6f578dcfe3c33ab5ad81a Mon Sep 17 00:00:00 2001 From: Thales Lima Oliveira Date: Fri, 26 Apr 2019 02:29:47 -0300 Subject: Frequency response implemented Need a form --- Project/Workspace.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) (limited to 'Project/Workspace.cpp') diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp index a17faae..6b8d197 100644 --- a/Project/Workspace.cpp +++ b/Project/Workspace.cpp @@ -1491,8 +1491,8 @@ void Workspace::OnMiddleDoubleClick(wxMouseEvent& event) bool Workspace::RunStaticStudies() { - bool pfStatus, faultStatus, scStatus; - pfStatus = faultStatus = scStatus = false; + bool pfStatus, faultStatus, scStatus, harmStatus; + pfStatus = faultStatus = scStatus = harmStatus = false; pfStatus = RunPowerFlow(); @@ -1507,8 +1507,14 @@ bool Workspace::RunStaticStudies() } else { scStatus = true; } + + if(m_properties->GetSimulationPropertiesData().harmDistortionAfterPowerFlow) { + if(pfStatus) harmStatus = RunHarmonicDistortion(); + } else { + harmStatus = true; + } - if(pfStatus && faultStatus && scStatus) return true; + if(pfStatus && faultStatus && scStatus && harmStatus) return true; return false; } @@ -1523,5 +1529,43 @@ bool Workspace::RunHarmonicDistortion() basePower *= 1e3; if(!RunPowerFlow()) return false; PowerQuality pq(GetElementList()); - return pq.CalculateDistortions(basePower); + bool result = pq.CalculateDistortions(basePower); + + UpdateTextElements(); + Redraw(); + + return result; +} + +bool Workspace::RunFrequencyResponse() +{ + auto simProp = m_properties->GetSimulationPropertiesData(); + double basePower = simProp.basePower; + if(simProp.basePowerUnit == UNIT_MVA) + basePower *= 1e6; + else if(simProp.basePowerUnit == UNIT_kVA) + basePower *= 1e3; + PowerQuality pq(GetElementList()); + bool result = pq.CalculateFrequencyResponse(simProp.stabilityFrequency, 0.0, 1500.0, 1.0, basePower); + + wxMessageDialog msgDialog( + this, + wxString::Format(_("Calculations done.\nDo you wish to open the frequency response graphics?")), + _("Question"), wxYES_NO | wxCENTRE | wxICON_QUESTION); + if(msgDialog.ShowModal() == wxID_YES) { + std::vector plotDataList; + for(auto it = m_elementList.begin(), itEnd = m_elementList.end(); it != itEnd; ++it) { + PowerElement* element = *it; + ElementPlotData plotData; + if(element->GetPlotData(plotData, FREQRESPONSE)) plotDataList.push_back(plotData); + } + + ChartView* cView = new ChartView(this, plotDataList, pq.GetFrequencies()); + cView->Show(); + } + + UpdateTextElements(); + Redraw(); + + return result; } -- cgit From 2b02ef22cc5f2025b09b700f1cb6e1cec94d80f6 Mon Sep 17 00:00:00 2001 From: Thales Lima Oliveira Date: Fri, 26 Apr 2019 17:52:32 -0300 Subject: Power quality fully implemented A formal filter element must be implemented in future --- Project/Workspace.cpp | 51 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 15 deletions(-) (limited to 'Project/Workspace.cpp') diff --git a/Project/Workspace.cpp b/Project/Workspace.cpp index 6b8d197..0bd53fa 100644 --- a/Project/Workspace.cpp +++ b/Project/Workspace.cpp @@ -21,6 +21,7 @@ //#include "Bus.h" #include "Capacitor.h" #include "ElementDataObject.h" +#include "HarmCurrent.h" #include "IndMotor.h" #include "Inductor.h" #include "Line.h" @@ -28,7 +29,6 @@ #include "SyncGenerator.h" #include "SyncMotor.h" #include "Transformer.h" -#include "HarmCurrent.h" #include "Text.h" @@ -42,6 +42,8 @@ #include "PropertiesData.h" +#include "FrequencyResponseForm.h" + // Workspace Workspace::Workspace() : WorkspaceBase(NULL) {} Workspace::Workspace(wxWindow* parent, wxString name, wxStatusBar* statusBar, wxGLContext* sharedGLContext) @@ -156,7 +158,7 @@ void Workspace::OnLeftClickDown(wxMouseEvent& event) Element* newElement = NULL; bool showNewElementForm = false; bool clickOnSwitch = false; - + if(m_mode == MODE_INSERT_TEXT || m_mode == MODE_PASTE || m_mode == MODE_DRAG_PASTE) { m_mode = MODE_EDIT; } else if(m_mode == MODE_INSERT || m_mode == MODE_DRAG_INSERT || m_mode == MODE_DRAG_INSERT_TEXT) { @@ -805,12 +807,13 @@ void Workspace::OnKeyDown(wxKeyEvent& event) case 'H': { if(!insertingElement) { if(event.GetModifiers() == wxMOD_SHIFT) { // Insert an harmonic current source. - HarmCurrent* newHarmCurrent = - new HarmCurrent(wxString::Format(_("Harmonic Current %d"), GetElementNumber(ID_HARMCURRENT))); + HarmCurrent* newHarmCurrent = new HarmCurrent( + wxString::Format(_("Harmonic Current %d"), GetElementNumber(ID_HARMCURRENT))); IncrementElementNumber(ID_HARMCURRENT); m_elementList.push_back(newHarmCurrent); m_mode = MODE_INSERT; - m_statusBar->SetStatusText(_("Insert Harmonic Current Source: Click on a buses, ESC to cancel.")); + m_statusBar->SetStatusText( + _("Insert Harmonic Current Source: Click on a buses, ESC to cancel.")); } Redraw(); } @@ -1507,7 +1510,7 @@ bool Workspace::RunStaticStudies() } else { scStatus = true; } - + if(m_properties->GetSimulationPropertiesData().harmDistortionAfterPowerFlow) { if(pfStatus) harmStatus = RunHarmonicDistortion(); } else { @@ -1529,16 +1532,35 @@ bool Workspace::RunHarmonicDistortion() basePower *= 1e3; if(!RunPowerFlow()) return false; PowerQuality pq(GetElementList()); - bool result = pq.CalculateDistortions(basePower); - + bool result = pq.CalculateDistortions(basePower); + UpdateTextElements(); Redraw(); - + return result; } bool Workspace::RunFrequencyResponse() { + // Get bus list + std::vector busList; + for(auto it = m_elementList.begin(), itEnd = m_elementList.end(); it != itEnd; ++it) { + if(Bus* bus = dynamic_cast(*it)) { busList.push_back(bus); } + } + + auto data = m_properties->GetFreqRespData(); + + FrequencyResponseForm frForm(this, busList, data.injBusNumber, data.initFreq, data.finalFreq, data.stepFreq); + + if(frForm.ShowModal() == wxID_OK) { + data.initFreq = frForm.GetInitFreq(); + data.finalFreq = frForm.GetEndFreq(); + data.stepFreq = frForm.GetStepFreq(); + data.injBusNumber = frForm.GetInjBusNumber(); + m_properties->SetFreqRespData(data); + } else + return false; + auto simProp = m_properties->GetSimulationPropertiesData(); double basePower = simProp.basePower; if(simProp.basePowerUnit == UNIT_MVA) @@ -1546,11 +1568,10 @@ bool Workspace::RunFrequencyResponse() else if(simProp.basePowerUnit == UNIT_kVA) basePower *= 1e3; PowerQuality pq(GetElementList()); - bool result = pq.CalculateFrequencyResponse(simProp.stabilityFrequency, 0.0, 1500.0, 1.0, basePower); - + bool result = pq.CalculateFrequencyResponse(simProp.stabilityFrequency, data.initFreq , data.finalFreq, data.stepFreq, data.injBusNumber, basePower); + wxMessageDialog msgDialog( - this, - wxString::Format(_("Calculations done.\nDo you wish to open the frequency response graphics?")), + this, wxString::Format(_("Calculations done.\nDo you wish to open the frequency response graphics?")), _("Question"), wxYES_NO | wxCENTRE | wxICON_QUESTION); if(msgDialog.ShowModal() == wxID_YES) { std::vector plotDataList; @@ -1563,9 +1584,9 @@ bool Workspace::RunFrequencyResponse() ChartView* cView = new ChartView(this, plotDataList, pq.GetFrequencies()); cView->Show(); } - + UpdateTextElements(); Redraw(); - + return result; } -- cgit