Skip to content

Commit 7267cb1

Browse files
committed
models: add SP_Ph1_Transformer3W for Power Flow solver
1 parent 961bb7a commit 7267cb1

File tree

9 files changed

+938
-75
lines changed

9 files changed

+938
-75
lines changed

Source/PFSolver.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ void PFSolver::initialize(){
2828
mLoads.push_back(load);
2929
else if (std::shared_ptr<CPS::SP::Ph1::Transformer> trafo = std::dynamic_pointer_cast<CPS::SP::Ph1::Transformer>(comp))
3030
mTransformers.push_back(trafo);
31+
else if (std::shared_ptr<CPS::SP::Ph1::Transformer3W> trafo3W = std::dynamic_pointer_cast<CPS::SP::Ph1::Transformer3W>(comp))
32+
mTransformers3W.push_back(trafo3W);
3133
else if (std::shared_ptr<CPS::SP::Ph1::PiLine> line = std::dynamic_pointer_cast<CPS::SP::Ph1::PiLine>(comp))
3234
mLines.push_back(line);
3335
else if (std::shared_ptr<CPS::SP::Ph1::NetworkInjection> extnet = std::dynamic_pointer_cast<CPS::SP::Ph1::NetworkInjection>(comp))
@@ -86,6 +88,9 @@ void PFSolver::initializeComponents(){
8688
for(auto trans : mTransformers) {
8789
trans->calculatePerUnitParameters(mBaseApparentPower, mSystem.mSystemOmega);
8890
}
91+
for(auto trans3w : mTransformers3W) {
92+
trans3w->calculatePerUnitParameters(mBaseApparentPower, mSystem.mSystemOmega);
93+
}
8994
for(auto shunt : mShunts) {
9095
shunt->calculatePerUnitParameters(mBaseApparentPower, mSystem.mSystemOmega);
9196
}
@@ -113,6 +118,16 @@ void PFSolver::setBaseApparentPower() {
113118
if (trafo->attribute<Real>("S")->get() > maxPower)
114119
maxPower = trafo->attribute<Real>("S")->get();
115120
}
121+
else if (!mTransformers3W.empty()) {
122+
for (auto trafo3w : mTransformers3W){
123+
if (trafo3w->attribute<Real>("S1")->get() > maxPower)
124+
maxPower = trafo3w->attribute<Real>("S1")->get();
125+
if (trafo3w->attribute<Real>("S2")->get() > maxPower)
126+
maxPower = trafo3w->attribute<Real>("S2")->get();
127+
if (trafo3w->attribute<Real>("S3")->get() > maxPower)
128+
maxPower = trafo3w->attribute<Real>("S3")->get();
129+
}
130+
}
116131
if (maxPower != 0.)
117132
mBaseApparentPower = pow(10, 1 + floor(log10(maxPower)));
118133
else
@@ -196,6 +211,11 @@ void PFSolver::determinePFBusType() {
196211
mSLog->debug("{}: VD, PV and PQ type component connect -> set as VD bus", node->name());
197212
mVDBusIndices.push_back(node->matrixNodeIndex());
198213
mVDBuses.push_back(node);
214+
} // VD and PQ type component connect -> set as VD bus
215+
else if (!connectedPV && connectedPQ && connectedVD) {
216+
mSLog->debug("{}: VD and PQ type component connect -> set as VD bus", node->name());
217+
mVDBusIndices.push_back(node->matrixNodeIndex());
218+
mVDBuses.push_back(node);
199219
}
200220
else {
201221
std::stringstream ss;
@@ -263,11 +283,21 @@ void PFSolver::composeAdmittanceMatrix() {
263283
}
264284
trans->pfApplyAdmittanceMatrixStamp(mY);
265285
}
286+
for(auto trans3W : mTransformers3W) {
287+
//to check if this transformer could be ignored
288+
if (trans3W->attribute("R1") == 0 && trans3W->attribute("L1") == 0 &&
289+
trans3W->attribute("R2") == 0 && trans3W->attribute("L2") == 0 &&
290+
trans3W->attribute("R3") == 0 && trans3W->attribute("L3") == 0) {
291+
mSLog->info("{} {} ignored for R = 0 and L = 0 in all windings", trans3W->type(), trans3W->name());
292+
continue;
293+
}
294+
trans3W->pfApplyAdmittanceMatrixStamp(mY);
295+
}
266296
for(auto shunt : mShunts) {
267297
shunt->pfApplyAdmittanceMatrixStamp(mY);
268298
}
269299
}
270-
if(mLines.empty() && mTransformers.empty()) {
300+
if(mLines.empty() && mTransformers.empty() && mTransformers3W.empty()) {
271301
throw std::invalid_argument("There are no bus");
272302
}
273303
}

Source/PFSolverPowerPolar.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,10 +306,25 @@ void PFSolverPowerPolar::setSolution() {
306306
baseVoltage_ = trans->attribute<CPS::Real>("nominal_voltage_end2")->get();
307307
break;
308308
}
309-
else if (std::shared_ptr<CPS::SP::Ph1::SynchronGenerator> gen = std::dynamic_pointer_cast<CPS::SP::Ph1::SynchronGenerator>(comp)) {
310-
baseVoltage_ =gen->attribute<CPS::Real>("base_Voltage")->get();
309+
}
310+
else if (std::shared_ptr<CPS::SP::Ph1::Transformer3W> trans3W = std::dynamic_pointer_cast<CPS::SP::Ph1::Transformer3W>(comp)) {
311+
if (trans3W->terminal(0)->node()->name() == node->name()){
312+
baseVoltage_ = trans3W->attribute<CPS::Real>("nominal_voltage_end1")->get();
313+
break;
314+
}
315+
else if (trans3W->terminal(1)->node()->name() == node->name()){
316+
baseVoltage_ = trans3W->attribute<CPS::Real>("nominal_voltage_end2")->get();
311317
break;
312318
}
319+
else if (trans3W->terminal(3)->node()->name() == node->name()){
320+
baseVoltage_ = trans3W->attribute<CPS::Real>("nominal_voltage_end3")->get();
321+
break;
322+
}
323+
}
324+
else if (std::shared_ptr<CPS::SP::Ph1::SynchronGenerator> gen = std::dynamic_pointer_cast<CPS::SP::Ph1::SynchronGenerator>(comp)) {
325+
baseVoltage_ =gen->attribute<CPS::Real>("base_Voltage")->get();
326+
break;
327+
}
313328
else
314329
mSLog->warn("Unable to get base voltage at {}", node->name());
315330
}
@@ -341,6 +356,17 @@ void PFSolverPowerPolar::calculateBranchFlow() {
341356
VectorComp flow_on_branch = v.array()*current.conjugate().array();
342357
trafo->updateBranchFlow(current, flow_on_branch);
343358
}
359+
for (auto trafo3W : mTransformers3W) {
360+
VectorComp v(3);
361+
v(0) = sol_V_complex.coeff(trafo3W->node(0)->matrixNodeIndex());
362+
v(1) = sol_V_complex.coeff(trafo3W->node(1)->matrixNodeIndex());
363+
v(2) = sol_V_complex.coeff(trafo3W->node(2)->matrixNodeIndex());
364+
/// I = Y * V
365+
VectorComp current = trafo3W->Y_element() * v;
366+
/// pf on branch [S_01; S_10] = [V_0 * conj(I_0); V_1 * conj(I_1)]
367+
VectorComp flow_on_branch = v.array()*current.conjugate().array();
368+
trafo3W->updateBranchFlow(current, flow_on_branch);
369+
}
344370
}
345371

346372
void PFSolverPowerPolar::calculateNodalInjection() {
@@ -359,6 +385,10 @@ void PFSolverPowerPolar::calculateNodalInjection() {
359385
trafo->storeNodalInjection(sol_S_complex.coeff(node->matrixNodeIndex()));
360386
break;
361387
}
388+
else if (std::shared_ptr<CPS::SP::Ph1::Transformer3W> trafo3W = std::dynamic_pointer_cast<CPS::SP::Ph1::Transformer3W>(comp)) {
389+
trafo3W->storeNodalInjection(sol_S_complex.coeff(node->matrixNodeIndex()));
390+
break;
391+
}
362392
}
363393
}
364394
}

models/Include/cps/Base/Base_Ph1_Transformer.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,59 @@ namespace Ph1 {
3636
mInductance = inductance;
3737
}
3838
};
39+
40+
class Transformer3W {
41+
protected:
42+
/// Nominal voltage of primary side
43+
Real mNominalVoltageEnd1;
44+
/// Nominal voltage of secondary side
45+
Real mNominalVoltageEnd2;
46+
/// Nominal voltage of secondary side
47+
Real mNominalVoltageEnd3;
48+
/// Transformer ratio primary side
49+
Complex mRatio1;
50+
/// Transformer ratio secondary side
51+
Complex mRatio2;
52+
/// Transformer ratio tetrary side
53+
Complex mRatio3;
54+
/// Resistance [Ohm] primary side
55+
Real mResistance1;
56+
/// Resistance [Ohm] secondary side
57+
Real mResistance2;
58+
/// Resistance [Ohm] tetrary side
59+
Real mResistance3;
60+
/// Inductance [H] primary side
61+
Real mInductance1;
62+
/// Inductance [H] secondary side
63+
Real mInductance2;
64+
/// Inductance [H] tetrary side
65+
Real mInductance3;
66+
67+
public:
68+
///
69+
void setParameters(
70+
Real nomVoltageEnd1, Real nomVoltageEnd2, Real nomVoltageEnd3,
71+
Real ratioAbs1, Real ratioAbs2, Real ratioAbs3,
72+
Real ratioPhase1, Real ratioPhase2, Real ratioPhase3,
73+
Real resistance1, Real resistance2, Real resistance3,
74+
Real inductance1, Real inductance2, Real inductance3
75+
) {
76+
77+
mNominalVoltageEnd1 = nomVoltageEnd1;
78+
mNominalVoltageEnd2 = nomVoltageEnd2;
79+
mNominalVoltageEnd3 = nomVoltageEnd3;
80+
mRatio1 = std::polar<Real>(ratioAbs1, ratioPhase1);
81+
mRatio2 = std::polar<Real>(ratioAbs2, ratioPhase2);
82+
mRatio3 = std::polar<Real>(ratioAbs3, ratioPhase3);
83+
mResistance1 = resistance1;
84+
mResistance2 = resistance2;
85+
mResistance3 = resistance3;
86+
mInductance1 = inductance1;
87+
mInductance2 = inductance2;
88+
mInductance3 = inductance3;
89+
}
90+
};
91+
3992
}
4093
}
4194
}

models/Include/cps/CIM/Reader.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ namespace CIMPP {
4545
class ExternalNetworkInjection;
4646
class EnergyConsumer;
4747
class PowerTransformer;
48+
class PowerTransformer3W;
4849
class EquivalentShunt;
50+
class LinearShuntCompensator;
4951
class TopologicalNode;
5052
class ConductingEquipment;
5153
};
@@ -145,6 +147,7 @@ namespace CIM {
145147
TopologicalPowerComp::Ptr mapExternalNetworkInjection(CIMPP::ExternalNetworkInjection* extnet);
146148
/// Returns a shunt
147149
TopologicalPowerComp::Ptr mapEquivalentShunt(CIMPP::EquivalentShunt *shunt);
150+
TopologicalPowerComp::Ptr mapEquivalentShunt(CIMPP::LinearShuntCompensator *shunt);
148151

149152
// #### Helper Functions ####
150153
/// Determine base voltage associated with object

models/Include/cps/Components.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <cps/SP/SP_Ph1_PiLine.h>
1717
#include <cps/SP/SP_Ph1_Shunt.h>
1818
#include <cps/SP/SP_Ph1_Transformer.h>
19+
#include <cps/SP/SP_Ph1_Transformer3W.h>
1920
#include <cps/SP/SP_Ph1_SolidStateTransformer.h>
2021
#include <cps/SP/SP_Ph1_Load.h>
2122
#include <cps/SP/SP_Ph1_Switch.h>

0 commit comments

Comments
 (0)