summaryrefslogtreecommitdiffstats
path: root/Project/Electromechanical.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Project/Electromechanical.cpp')
-rw-r--r--Project/Electromechanical.cpp57
1 files changed, 46 insertions, 11 deletions
diff --git a/Project/Electromechanical.cpp b/Project/Electromechanical.cpp
index ea8b1bb..5bb9a1d 100644
--- a/Project/Electromechanical.cpp
+++ b/Project/Electromechanical.cpp
@@ -15,8 +15,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-#include "Electromechanical.h"
#include "ControlElementSolver.h"
+#include "Electromechanical.h"
Electromechanical::Electromechanical(wxWindow* parent, std::vector<Element*> elementList, SimulationData data)
{
@@ -70,6 +70,7 @@ bool Electromechanical::RunStabilityCalculation()
wxProgressDialog pbd(_("Running simulation"), _("Initializing..."), 100, m_parent,
wxPD_APP_MODAL | wxPD_AUTO_HIDE | wxPD_CAN_ABORT | wxPD_SMOOTH);
+ PreallocateVectors(); // Reserve the vectors' memory with a estimated size, this can optimize the simulation.
SetSyncMachinesModel();
// Calculate the admittance matrix with the synchronous machines.
@@ -996,6 +997,7 @@ bool Electromechanical::SolveSynchronousMachines()
return false;
}
}
+ m_iterationsNum = iterations;
// Solve controllers.
int ctrlRatio = static_cast<int>(1 / m_ctrlTimeStepMultiplier);
@@ -1006,7 +1008,8 @@ bool Electromechanical::SolveSynchronousMachines()
data.avrSolver->SetSwitchStatus(syncGenerator->IsOnline());
data.avrSolver->SetCurrentTime(m_currentTime);
data.avrSolver->SetTerminalVoltage(std::abs(data.terminalVoltage));
- data.avrSolver->SetDeltaActivePower((data.electricalPower.real() - data.avrSolver->GetActivePower()) / m_timeStep);
+ data.avrSolver->SetDeltaActivePower((data.electricalPower.real() - data.avrSolver->GetActivePower()) /
+ m_timeStep);
data.avrSolver->SetActivePower(data.electricalPower.real());
data.avrSolver->SetReactivePower(data.electricalPower.imag());
data.avrSolver->SetDeltaVelocity((data.speed - data.avrSolver->GetVelocity()) / m_timeStep);
@@ -1066,6 +1069,7 @@ void Electromechanical::SaveData()
load->SetElectricalData(data);
}
}
+ m_iterationsNumVector.push_back(m_iterationsNum);
}
void Electromechanical::SetSyncMachinesModel()
@@ -1089,9 +1093,7 @@ bool Electromechanical::CalculateSyncMachineNonIntVariables(SyncGenerator* syncG
auto data = syncGenerator->GetElectricalData();
int n = static_cast<Bus*>(syncGenerator->GetParentList()[0])->GetElectricalData().number;
- if(syncGenerator->IsOnline()) {
- data.terminalVoltage = m_vBus[n];
- }
+ if(syncGenerator->IsOnline()) { data.terminalVoltage = m_vBus[n]; }
double vd, vq;
ABCtoDQ0(data.terminalVoltage, data.delta, vd, vq);
@@ -1287,9 +1289,7 @@ bool Electromechanical::CalculateSyncMachineSaturation(SyncGenerator* syncMachin
auto smDataModel = GetSyncMachineModelData(syncMachine);
int n = static_cast<Bus*>(syncMachine->GetParentList()[0])->GetElectricalData().number;
- if(syncMachine->IsOnline()) {
- data.terminalVoltage = m_vBus[n];
- }
+ if(syncMachine->IsOnline()) { data.terminalVoltage = m_vBus[n]; }
double idCalc = id;
double iqCalc = iq;
double sdCalc = sd;
@@ -1394,9 +1394,7 @@ SyncMachineModelData Electromechanical::GetSyncMachineModelData(SyncGenerator* s
smModelData.xq = data.transXq * k;
if(smModelData.xq == 0.0) {
smModelData.xq = data.syncXq * k;
- if(smModelData.xq == 0.0) {
- smModelData.xq = data.syncXd * k;
- }
+ if(smModelData.xq == 0.0) { smModelData.xq = data.syncXd * k; }
}
} break;
case Machines::SM_MODEL_3: {
@@ -1418,3 +1416,40 @@ SyncMachineModelData Electromechanical::GetSyncMachineModelData(SyncGenerator* s
}
return smModelData;
}
+
+void Electromechanical::PreallocateVectors()
+{
+ int numPoints = static_cast<unsigned int>(m_simTime / m_plotTime);
+
+ m_timeVector.reserve(numPoints);
+ for(auto it = m_syncGeneratorList.begin(), itEnd = m_syncGeneratorList.end(); it != itEnd; ++it) {
+ SyncGenerator* syncGenerator = *it;
+ auto data = syncGenerator->GetElectricalData();
+ if(data.plotSyncMachine) {
+ data.terminalVoltageVector.reserve(numPoints);
+ data.electricalPowerVector.reserve(numPoints);
+ data.mechanicalPowerVector.reserve(numPoints);
+ data.freqVector.reserve(numPoints);
+ data.fieldVoltageVector.reserve(numPoints);
+ data.deltaVector.reserve(numPoints);
+ syncGenerator->SetElectricalData(data);
+ }
+ }
+ for(auto it = m_busList.begin(), itEnd = m_busList.end(); it != itEnd; ++it) {
+ Bus* bus = *it;
+ auto data = bus->GetElectricalData();
+ if(data.plotBus) {
+ data.stabVoltageVector.reserve(numPoints);
+ bus->SetElectricalData(data);
+ }
+ }
+ for(auto it = m_loadList.begin(), itEnd = m_loadList.end(); it != itEnd; ++it) {
+ Load* load = *it;
+ auto data = load->GetElectricalData();
+ if(data.plotLoad) {
+ data.voltageVector.reserve(numPoints);
+ data.electricalPowerVector.reserve(numPoints);
+ load->SetElectricalData(data);
+ }
+ }
+}