9#include <dpsim-models/EMT/EMT_Ph3_RXLoad.h>
19 mPhaseType = PhaseType::ABC;
22 SPDLOG_LOGGER_INFO(
mSLog,
"Create {} {}", this->
type(), name);
29 :
RXLoad(name, name, logLevel) {}
32 Real volt, Logger::Level logLevel)
36 mPower = MatrixComp::Zero(3, 3);
48 initPowerFromTerminal =
false;
51void EMT::Ph3::RXLoad::setParameters(Matrix activePower, Matrix reactivePower,
52 Real volt,
bool reactanceInSeries) {
53 **mActivePower = activePower;
54 **mReactivePower = reactivePower;
55 mReactanceInSeries = reactanceInSeries;
57 if (mReactanceInSeries) {
58 setVirtualNodeNumber(1);
61 mPower = MatrixComp::Zero(3, 3);
62 mPower(0, 0) = {(**mActivePower)(0, 0), (**mReactivePower)(0, 0)};
63 mPower(1, 1) = {(**mActivePower)(1, 1), (**mReactivePower)(1, 1)};
64 mPower(2, 2) = {(**mActivePower)(2, 2), (**mReactivePower)(2, 2)};
68 SPDLOG_LOGGER_INFO(mSLog,
69 "\nActive Power [W]: {}"
70 "\nReactive Power [VAr]: {}",
71 Logger::matrixToString(**mActivePower),
72 Logger::matrixToString(**mReactivePower));
73 SPDLOG_LOGGER_INFO(mSLog,
"Nominal Voltage={} [V]", **mNomVoltage);
75 initPowerFromTerminal =
false;
80 if (initPowerFromTerminal) {
82 (**mActivePower)(0, 0) =
mTerminals[0]->singleActivePower() / 3.;
83 (**mActivePower)(1, 1) =
mTerminals[0]->singleActivePower() / 3.;
84 (**mActivePower)(2, 2) =
mTerminals[0]->singleActivePower() / 3.;
87 (**mReactivePower)(0, 0) =
mTerminals[0]->singleReactivePower() / 3.;
88 (**mReactivePower)(1, 1) =
mTerminals[0]->singleReactivePower() / 3.;
89 (**mReactivePower)(2, 2) =
mTerminals[0]->singleReactivePower() / 3.;
92 mPower = MatrixComp::Zero(3, 3);
99 SPDLOG_LOGGER_INFO(
mSLog,
100 "\nActive Power [W]: {}"
101 "\nReactive Power [VAr]: {}",
107 MatrixComp vInitABC = MatrixComp::Zero(3, 1);
108 vInitABC(0, 0) = RMS3PH_TO_PEAK1PH *
mTerminals[0]->initialSingleVoltage();
109 vInitABC(1, 0) = vInitABC(0, 0) * SHIFT_TO_PHASE_B;
110 vInitABC(2, 0) = vInitABC(0, 0) * SHIFT_TO_PHASE_C;
115 std::pow(**
mNomVoltage / sqrt(3), 2) * (**mActivePower).inverse();
120 std::pow(**
mNomVoltage / sqrt(3), 2) * (**mReactivePower).inverse();
125 MatrixComp impedance = MatrixComp::Zero(3, 3);
135 **
mIntfCurrent = (impedance.inverse() * vInitABC).real();
139 MatrixComp vInitTerm0 = MatrixComp::Zero(3, 1);
140 vInitTerm0(0, 0) = initialSingleVoltage(0);
141 vInitTerm0(1, 0) = vInitTerm0(0, 0) * SHIFT_TO_PHASE_B;
142 vInitTerm0(2, 0) = vInitTerm0(0, 0) * SHIFT_TO_PHASE_C;
149 std::make_shared<EMT::Ph3::Resistor>(**
mName +
"_res",
mLogLevel);
157 mSubResistor->initializeFromNodesAndTerminals(frequency);
159 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
170 std::make_shared<EMT::Ph3::Inductor>(**
mName +
"_ind",
mLogLevel);
178 mSubInductor->initializeFromNodesAndTerminals(frequency);
180 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
189 std::make_shared<EMT::Ph3::Capacitor>(**
mName +
"_cap",
mLogLevel);
199 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
200 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
208 "\n--- Initialization from powerflow ---"
209 "\nVoltage across: {:s}"
211 "\nTerminal 0 voltage: {:s}"
212 "\nActive Power: {:s}"
213 "\nReactive Power: {:s}"
216 "\n--- Initialization from powerflow finished ---",
219 Logger::phasorToString(RMS3PH_TO_PEAK1PH * initialSingleVoltage(0)),
226void EMT::Ph3::RXLoad::mnaParentAddPreStepDependencies(
227 AttributeBase::List &prevStepDependencies,
228 AttributeBase::List &attributeDependencies,
229 AttributeBase::List &modifiedAttributes) {
230 modifiedAttributes.push_back(mRightVector);
233void EMT::Ph3::RXLoad::mnaParentAddPostStepDependencies(
234 AttributeBase::List &prevStepDependencies,
235 AttributeBase::List &attributeDependencies,
236 AttributeBase::List &modifiedAttributes,
237 Attribute<Matrix>::Ptr &leftVector) {
238 attributeDependencies.push_back(leftVector);
239 modifiedAttributes.push_back(mIntfCurrent);
240 modifiedAttributes.push_back(mIntfVoltage);
247void EMT::Ph3::RXLoad::mnaParentPostStep(Real time, Int timeStepCount,
248 Attribute<Matrix>::Ptr &leftVector) {
249 mnaCompUpdateVoltage(**leftVector);
250 mnaCompUpdateCurrent(**leftVector);
253void EMT::Ph3::RXLoad::mnaCompUpdateVoltage(
const Matrix &leftVector) {
254 **mIntfVoltage = Matrix::Zero(3, 1);
255 (**mIntfVoltage)(0, 0) =
256 Math::realFromVectorElement(leftVector, matrixNodeIndex(0, 0));
257 (**mIntfVoltage)(1, 0) =
258 Math::realFromVectorElement(leftVector, matrixNodeIndex(0, 1));
259 (**mIntfVoltage)(2, 0) =
260 Math::realFromVectorElement(leftVector, matrixNodeIndex(0, 2));
263void EMT::Ph3::RXLoad::mnaCompUpdateCurrent(
const Matrix &leftVector) {
264 if (mReactanceInSeries) {
265 **mIntfCurrent = mSubInductor->intfCurrent();
267 **mIntfCurrent = Matrix::Zero(3, 1);
268 for (
auto &subc : mSubComponents) {
269 **mIntfCurrent += subc->intfCurrent();
void addMNASubComponent(typename SimPowerComp< Real >::Ptr subc, MNA_SUBCOMP_TASK_ORDER preStepOrder, MNA_SUBCOMP_TASK_ORDER postStepOrder, Bool contributeToRightVector)
void mnaCompApplyRightSideVectorStamp(Matrix &rightVector) override
CompositePowerComp(String uid, String name, Bool hasPreStep, Bool hasPostStep, Logger::Level logLevel)
const Attribute< Matrix >::Ptr mActivePower
Active power [Watt].
Bool mReactanceInSeries
If set to true, the reactance is in series with the resistor. Otherwise it is parallel to the resisto...
RXLoad(String uid, String name, Logger::Level logLevel=Logger::Level::off)
Defines UID, name and logging level.
std::shared_ptr< EMT::Ph3::Resistor > mSubResistor
Internal resistance.
MatrixComp mPower
Power [Watt].
std::shared_ptr< EMT::Ph3::Inductor > mSubInductor
Internal inductor.
std::shared_ptr< EMT::Ph3::Capacitor > mSubCapacitor
Internal capacitor.
Matrix mResistance
Resistance [Ohm].
Matrix mReactance
Reactance [Ohm].
const Attribute< Real >::Ptr mNomVoltage
Nominal voltage [V].
void initializeFromNodesAndTerminals(Real frequency) override
Initializes component from power flow data.
void mnaParentPreStep(Real time, Int timeStepCount) override
MNA pre and post step operations.
Matrix mCapacitance
Capacitance [F].
const Attribute< Matrix >::Ptr mReactivePower
Reactive power [VAr].
Matrix mInductance
Inductance [H].
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.
Attribute< Matrix >::Ptr mRightVector
const Attribute< MatrixVar< Real > >::Ptr mIntfCurrent
SimTerminal< Real >::List mTerminals
const Attribute< MatrixVar< Real > >::Ptr mIntfVoltage
SimNode< Real >::List mVirtualNodes
Logger::Level mLogLevel
Component logger control for internal variables.
Logger::Log mSLog
Component logger.