DPsim
Loading...
Searching...
No Matches
DecouplingIdealTransformer_EMT_Ph1.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 Institute for Automation of Complex Power Systems, EONERC, RWTH Aachen University
2// SPDX-License-Identifier: MPL-2.0
3
7
8using namespace CPS;
9using namespace CPS::EMT::Ph1;
10using namespace CPS::Signal;
11
13 String name, Logger::Level logLevel)
14 : SimSignalComp(name, name, logLevel),
15 mStates(mAttributes->create<Matrix>("states")),
16 mSourceVoltageIntfVoltage(mAttributes->create<Real>("v_intf")),
17 mSourceVoltageIntfCurrent(mAttributes->create<Real>("i_intf")),
18 mSrcVoltageRef(mAttributes->create<Real>("v_ref")),
19 mSrcCurrentRef(mAttributes->create<Real>("i_ref")) {
20
21 mRes1 = Resistor::make(name + "_r1", logLevel);
22 mRes2 = Resistor::make(name + "_r2", logLevel);
23 mVoltageSrc = VoltageSource::make(name + "_v", logLevel);
24 mCurrentSrc = CurrentSource::make(name + "_i", logLevel);
25
26 mSrcVoltage = mVoltageSrc->mVoltageRef;
27 mSrcCurrent = mCurrentSrc->mCurrentRef;
28}
29
31 SimNode<Real>::Ptr node1, SimNode<Real>::Ptr node2, Real delay,
32 Matrix voltageSrcIntfCurr, Real current1Extrap0, CouplingMethod method) {
33
34 mNode1 = node1;
35 mNode2 = node2;
37
38 mDelay = delay;
39 mCouplingMethod = method;
40
43 }
44
45 mRes1->setParameters(mInternalSeriesResistance);
46 mRes1->connect({node1, mVirtualNode});
47 mRes2->setParameters(mInternalParallelResistance);
48 mRes2->connect({node2, SimNode<Real>::GND});
49 mVoltageSrc->setParameters(0);
50 mVoltageSrcIntfCurr = voltageSrcIntfCurr;
51 mCurrent1Extrap0 = current1Extrap0;
53 mCurrentSrc->setParameters(0);
54 mCurrentSrc->connect({SimNode<Real>::GND, node2});
55}
56
58 if (mDelay <= 0) {
59 mDelay = 0;
60 mBufSize = 1;
61 mAlpha = 1;
62 } else {
63 mBufSize = static_cast<UInt>(ceil(mDelay / timeStep));
64 mAlpha = 1 - (mBufSize - mDelay / timeStep);
65 }
66 SPDLOG_LOGGER_INFO(mSLog, "bufsize {} alpha {}", mBufSize, mAlpha);
67
68 mVoltageSrc->setIntfCurrent(mVoltageSrcIntfCurr);
69 Complex cur1 = mVoltageSrc->mIntfCurrent->get()(0);
70 Complex volt2 = mNode2->initialSingleVoltage() * RMS3PH_TO_PEAK1PH;
71
72 mVirtualNode->setInitialVoltage(mNode1->initialSingleVoltage() -
74
75 SPDLOG_LOGGER_INFO(mSLog, "initial current: i_1 {}", cur1);
76 SPDLOG_LOGGER_INFO(mSLog, "initial voltage: v_2 {}", volt2);
77
78 **mSrcVoltageRef = volt2.real();
79 **mSrcCurrentRef = cur1.real();
80 mVoltageSrc->setParameters(**mSrcVoltageRef);
81 mCurrentSrc->setParameters(**mSrcCurrentRef);
82
83 Matrix mSourceCurrentIntfVoltage(1, 1);
84 mSourceCurrentIntfVoltage(0, 0) = volt2.real();
85 mCurrentSrc->setIntfVoltage(mSourceCurrentIntfVoltage);
86
87 mVoltageSrc->setIntfVoltage(mSourceCurrentIntfVoltage);
88 mVoltageSrc->setIntfCurrent(mVoltageSrcIntfCurr);
89
90 **mSourceVoltageIntfVoltage = volt2.real();
91 **mSourceVoltageIntfCurrent = mVoltageSrc->intfCurrent()(0, 0);
92
93 // Resize ring buffers and initialize
94 mCur1.resize(mBufSize, cur1.real());
95 mVol2.resize(mBufSize, volt2.real());
96
97 SPDLOG_LOGGER_INFO(mSLog, "Verify initial current: i_1 {}",
98 mCurrentSrc->intfCurrent()(0, 0));
99 SPDLOG_LOGGER_INFO(mSLog, "Verify initial voltage: v_2 {}",
100 mVoltageSrc->intfVoltage()(0, 0));
101
102 mCur1Extrap.resize(mExtrapolationDegree + 1, 0);
104 if (mExtrapolationDegree > 0) {
106 }
107 mVol2Extrap.resize(mExtrapolationDegree + 1, volt2.real());
108}
109
111 Real c1 = data[mBufIdx];
112 Real c2 = mBufIdx == mBufSize - 1 ? data[0] : data[mBufIdx + 1];
113 return mAlpha * c1 + (1 - mAlpha) * c2;
114}
115
118 Real c1 = data[mMacroBufIdx];
119 Real c2 =
121 Real delayFraction =
122 (mDelay * (mBufIdx + 1)) / static_cast<float>(mBufSize);
123 Real tEval = mDelay + delayFraction;
124 return ((c2 - c1) / mDelay) * tEval + c1;
125 } else {
126 return data[mMacroBufIdx];
127 }
128}
129
131 Real volt1, cur2;
133 volt1 = interpolate(mVol2);
134 cur2 = interpolate(mCur1);
135 } else {
136 volt1 = extrapolate(mVol2Extrap);
137 cur2 = extrapolate(mCur1Extrap);
138 }
139
140 // Update voltage and current
141 **mSrcVoltageRef = volt1;
142 **mSrcCurrentRef = cur2;
143 **mSourceVoltageIntfVoltage = mVoltageSrc->intfVoltage()(0, 0);
144 **mSourceVoltageIntfCurrent = mVoltageSrc->intfCurrent()(0, 0);
145
148}
149
151 Int timeStepCount) {
152 mITM.step(time, timeStepCount);
153}
154
156 // Update ringbuffers with new values
157 mCur1[mBufIdx] = mVoltageSrc->intfCurrent()(0, 0);
158 mVol2[mBufIdx] = -mCurrentSrc->intfVoltage()(0, 0);
159
160 mBufIdx++;
161 if (mBufIdx == mBufSize) {
164 mMacroBufIdx++;
166 mMacroBufIdx = 0;
167 }
168 mBufIdx = 0;
169 }
170}
171
173 Int timeStepCount) {
174 mITM.postStep();
175}
176
178 return Task::List(
179 {std::make_shared<PreStep>(*this), std::make_shared<PostStep>(*this)});
180}
181
185
std::vector< Ptr > List
AttributeList::Ptr mAttributes
Attribute List.
spdlog::level::level_enum Level
Definition Logger.h:33
void execute(Real time, Int timeStepCount)
void setParameters(SimNode< Real >::Ptr node1, SimNode< Real >::Ptr node2, Real delay, Matrix voltageSrcIntfCurr, Real current1Extrap0, CouplingMethod method=CouplingMethod::DELAY)
DecouplingIdealTransformer_EMT_Ph1(String name, Logger::Level logLevel=Logger::Level::info)
const Attribute< Matrix >::Ptr mStates
FIXME: workaround for dependency analysis as long as the states aren't attributes.
std::shared_ptr< SimNode< VarType > > Ptr
Definition SimNode.h:32
static Ptr GND
Definition SimNode.h:35
SimSignalComp(String uid, String name, Logger::Level logLevel=Logger::Level::off)
std::vector< Ptr > List
Definition Task.h:28
std::shared_ptr< TopologicalNode > Ptr
Logger::Log mSLog
Component logger.
static std::shared_ptr< Resistor > make(Args &&...args)
Definition PtrFactory.h:19
#define RMS3PH_TO_PEAK1PH
Definition Definitions.h:50
struct dps_magma_data data
Eigen::Matrix< Real, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor > Matrix
Dense matrix for real numbers.
Definition Definitions.h:81
std::string String
Definition Definitions.h:65
double Real
Definition Definitions.h:62
CouplingMethod
int Int
Definition Definitions.h:61
std::complex< Real > Complex
Definition Definitions.h:63
unsigned int UInt
Definition Definitions.h:60