DPsim
Loading...
Searching...
No Matches
SP_Ph1_SolidStateTransformer.cpp
Go to the documentation of this file.
1/* Copyright 2017-2021 Institute for Automation of Complex Power Systems,
2 * EONERC, RWTH Aachen University
3 *
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at https://mozilla.org/MPL/2.0/.
7 *********************************************************************************/
8
11
12using namespace CPS;
13
15 Logger::Level logLevel)
16 : CompositePowerComp<Complex>(uid, name, false, false, logLevel),
17 mPref(mAttributes->create<Real>("P_ref",
18 std::numeric_limits<double>::infinity())),
19 mQ1ref(mAttributes->create<Real>("Q1_ref")),
20 mQ2ref(mAttributes->create<Real>("Q2_ref")) {
21 SPDLOG_LOGGER_INFO(mSLog, "Create {} of type {}", **mName, this->type());
22 mSLog->flush();
23 **mIntfVoltage = MatrixComp::Zero(1, 1);
24 **mIntfCurrent = MatrixComp::Zero(1, 1);
26};
27
29 // everything set by initializeFromNodesAndTerminals
31}
32
34 Real Pref, Real Q1ref,
35 Real Q2ref) {
36 mNominalVoltageEnd1 = nomV1;
37 mNominalVoltageEnd2 = nomV2;
38 **mPref = Pref;
39 **mQ1ref = Q1ref;
40 **mQ2ref = Q2ref;
41 mP2 = -1 * std::sqrt(Pref * Pref + Q1ref * Q1ref - Q2ref * Q2ref);
42}
43
46 return;
47 mSubCompCreated = true;
48
49 mSubLoadSide1 = Load::make(**mName + "_subLoad1", mLogLevel);
50 mSubLoadSide2 = Load::make(**mName + "_subLoad2", mLogLevel);
51 mSubLoadSide1->connect({mTerminals[0]->node()});
52 mSubLoadSide2->connect({mTerminals[1]->node()});
53
58}
59
61 Real frequency) {
62
63 // Parametrize the sub-loads before the recursive sub-init runs, else each Load wrongly reads its own terminal.
64 mSubLoadSide1->setParameters(**mPref, **mQ1ref, mNominalVoltageEnd1);
65 mSubLoadSide2->setParameters(mP2, **mQ2ref, mNominalVoltageEnd2);
66
67 if (!Math::isFinite(mP2)) {
68 SPDLOG_LOGGER_ERROR(mSLog,
69 "SST {}: non-finite secondary-side power {} (or "
70 "initialized before setting parameters)",
71 this->name(), mP2);
73 }
74 if ((**mPref * mP2) > 0) {
75 throw std::invalid_argument(
76 "power at primary and secondary sides should be opposite");
77 }
78
79 SPDLOG_LOGGER_INFO(mSLog,
80 "\n--- Initialization from powerflow ---"
81 "\nTerminal 0 power flow: {:s} VA"
82 "\nTerminal 1 power flow: {:s} VA"
83 "\n--- Initialization from powerflow finished ---",
86}
87
89 Real baseApparentPower, Real baseOmega) {
90 mPref_perUnit = **mPref / baseApparentPower;
91 mP2_perUnit = mP2 / baseApparentPower;
92 mQ1ref_perUnit = **mQ1ref / baseApparentPower;
93 mQ2ref_perUnit = **mQ2ref / baseApparentPower;
94 mSubLoadSide1->calculatePerUnitParameters(baseApparentPower, baseOmega);
95 mSubLoadSide2->calculatePerUnitParameters(baseApparentPower, baseOmega);
96 SPDLOG_LOGGER_INFO(
97 mSLog,
98 "\n#### Calculate Per Unit Parameters for {}"
99 "\nTerminal 0 power flow: {:s} p.u."
100 "\nTerminal 1 power flow: {:s} p.u."
101 "\n#### Calculate Per Unit Parameters finished ---",
102 **mName, Logger::complexToString(Complex(mPref_perUnit, mQ1ref_perUnit)),
103 Logger::complexToString(Complex(mP2_perUnit, mQ2ref_perUnit)));
104}
105
108 if (node->name() == mTerminals[0]->node()->name()) {
109 SPDLOG_LOGGER_INFO(
110 mSLog,
111 "\n#### get nodal injection for primary side"
112 "\nreturned {:s} p.u.",
113 Logger::complexToString(Complex(mPref_perUnit, mQ1ref_perUnit)));
114 return Complex(mPref_perUnit, mQ1ref_perUnit);
115 } else if (node->name() == mTerminals[1]->node()->name()) {
116 SPDLOG_LOGGER_INFO(
117 mSLog,
118 "\n#### get nodal injection for secondary side"
119 "\nreturned {:s} p.u.",
120 Logger::complexToString(Complex(mP2_perUnit, mQ2ref_perUnit)));
121 return Complex(mP2_perUnit, mQ2ref_perUnit);
122 } else {
123 throw std::invalid_argument(
124 "Failed to process nodal power injection of Solid State Transformer" +
125 this->name());
126 }
127}
void addMNASubComponent(typename SimPowerComp< Complex >::Ptr subc, MNA_SUBCOMP_TASK_ORDER preStepOrder, MNA_SUBCOMP_TASK_ORDER postStepOrder, Bool contributeToRightVector)
CompositePowerComp(String uid, String name, Bool hasPreStep, Bool hasPostStep, Logger::Level logLevel)
const Attribute< String >::Ptr mName
Human readable name.
String uid()
Returns unique id.
String type()
Get component type (cross-platform)
AttributeList::Ptr mAttributes
Attribute List.
spdlog::level::level_enum Level
Definition Logger.h:33
static String complexToString(const Complex &num)
Definition Logger.cpp:63
static bool isFinite(Real value)
Definition MathUtils.cpp:63
const Attribute< Real >::Ptr mQ2ref
Reactive power at secondary side [var].
const Attribute< Real >::Ptr mQ1ref
Reactive power at primary side [var].
void createSubComponents() override
Constructs and registers MNA subcomponents; idempotent.
void setParameters(Real nomV1, Real nomV2, Real Pref, Real Q1ref, Real Q2ref)
void initializeParentFromNodesAndTerminals(Real frequency) override
Initializes component.
SolidStateTransformer(String uid, String name, Logger::Level logLevel=Logger::Level::off)
Complex getNodalInjection(CPS::TopologicalNode::Ptr node)
const Attribute< Real >::Ptr mPref
Power [watt].
SimPowerComp< Complex >::Ptr clone(String name) override
Returns a modified copy of the component with the given suffix added to the name and without.
void calculatePerUnitParameters(Real baseApparentPower, Real baseOmega)
const Attribute< MatrixVar< Complex > >::Ptr mIntfCurrent
SimTerminal< Complex >::List mTerminals
SimNode< Complex >::Ptr node(UInt index)
const Attribute< MatrixVar< Complex > >::Ptr mIntfVoltage
std::shared_ptr< SimPowerComp< VarType > > Ptr
std::shared_ptr< TopologicalNode > Ptr
Logger::Level mLogLevel
Component logger control for internal variables.
Logger::Log mSLog
Component logger.
static std::shared_ptr< SolidStateTransformer > make(Args &&...args)
Definition PtrFactory.h:19
std::string String
Definition Definitions.h:65
double Real
Definition Definitions.h:62
std::complex< Real > Complex
Definition Definitions.h:63