4#include "dpsim-models/Definitions.h"
5#include "dpsim-models/SimNode.h"
6#include "dpsim-models/TopologicalNode.h"
8#include <dpsim-models/Signal/DecouplingIdealTransformer_SP_Ph1.h>
11using namespace CPS::SP::Ph1;
12using namespace CPS::Signal;
14DecouplingIdealTransformer_SP_Ph1::DecouplingIdealTransformer_SP_Ph1(
15 String name, Logger::Level logLevel)
17 mStates(mAttributes->create<Matrix>(
"states")),
18 mSourceVoltageIntfVoltage(mAttributes->create<Complex>(
"v_intf")),
19 mSourceVoltageIntfCurrent(mAttributes->create<Complex>(
"i_intf")),
20 mSrcVoltageRef(mAttributes->create<Complex>(
"v_ref")),
21 mSrcCurrentRef(mAttributes->create<Complex>(
"i_ref")) {
23 mRes1 = Resistor::make(name +
"_r1", logLevel);
24 mRes2 = Resistor::make(name +
"_r2", logLevel);
25 mVoltageSrc = ControlledVoltageSource::make(name +
"_v", logLevel);
26 mCurrentSrc = ControlledCurrentSource::make(name +
"_i", logLevel);
28 mSrcVoltage = mVoltageSrc->mVoltageRef;
29 mSrcCurrent = mCurrentSrc->mCurrentRef;
32void DecouplingIdealTransformer_SP_Ph1::setParameters(
33 SimNode<Complex>::Ptr node1, SimNode<Complex>::Ptr node2, Real delay,
34 Matrix voltageSrcIntfCurr, Complex current1Extrap0, CouplingMethod method) {
38 mVirtualNode = SimNode<Complex>::make(name() +
"_virtual");
41 mCouplingMethod = method;
43 if (mCouplingMethod == CouplingMethod::EXTRAPOLATION_LINEAR) {
44 mExtrapolationDegree = 1;
47 mRes1->setParameters(mInternalSeriesResistance);
48 mRes1->connect({node1, mVirtualNode});
49 mRes2->setParameters(mInternalParallelResistance);
50 mRes2->connect({node2, SimNode<Complex>::GND});
51 mVoltageSrc->setParameters(Complex(0, 0));
52 mVoltageSrcIntfCurr = voltageSrcIntfCurr;
53 mCurrent1Extrap0 = current1Extrap0;
54 mVoltageSrc->connect({SimNode<Complex>::GND, mVirtualNode});
55 mCurrentSrc->setParameters(Complex(0, 0));
56 mCurrentSrc->connect({SimNode<Complex>::GND, node2});
59void DecouplingIdealTransformer_SP_Ph1::initialize(Real omega, Real timeStep) {
65 mBufSize =
static_cast<UInt
>(ceil(mDelay / timeStep));
66 mAlpha = 1 - (mBufSize - mDelay / timeStep);
68 SPDLOG_LOGGER_INFO(
mSLog,
"bufsize {} alpha {}", mBufSize, mAlpha);
70 mVoltageSrc->setIntfCurrent(mVoltageSrcIntfCurr);
71 Complex cur1 = mVoltageSrc->mIntfCurrent->get()(0);
72 Complex volt2 = mNode2->initialSingleVoltage() * RMS3PH_TO_PEAK1PH;
74 mVirtualNode->setInitialVoltage(mNode1->initialSingleVoltage() *
76 cur1 * mInternalSeriesResistance);
78 SPDLOG_LOGGER_INFO(
mSLog,
"initial current: i_1 {}", cur1);
79 SPDLOG_LOGGER_INFO(
mSLog,
"initial voltage: v_2 {}", volt2);
81 **mSrcVoltageRef = volt2;
82 **mSrcCurrentRef = cur1;
83 mVoltageSrc->setParameters(**mSrcVoltageRef);
84 mCurrentSrc->setParameters(**mSrcCurrentRef);
86 Matrix mSourceCurrentIntfVoltage(1, 1);
87 mSourceCurrentIntfVoltage(0, 0) = std::abs(volt2);
88 mCurrentSrc->setIntfVoltage(mSourceCurrentIntfVoltage);
90 mVoltageSrc->setIntfVoltage(mSourceCurrentIntfVoltage);
91 mVoltageSrc->setIntfCurrent(mVoltageSrcIntfCurr);
93 **mSourceVoltageIntfVoltage = volt2;
94 **mSourceVoltageIntfCurrent = mVoltageSrc->intfCurrent()(0, 0);
97 mCur1.resize(mBufSize, cur1);
98 mVol2.resize(mBufSize, volt2);
100 SPDLOG_LOGGER_INFO(
mSLog,
"Verify initial current: i_1 {}",
101 mCurrentSrc->intfCurrent()(0, 0));
102 SPDLOG_LOGGER_INFO(
mSLog,
"Verify initial voltage: v_2 {}",
103 mVoltageSrc->intfVoltage()(0, 0));
105 mCur1Extrap = std::vector<Complex>(mExtrapolationDegree + 1, Complex(0, 0));
106 mCur1Extrap[0] = mCurrent1Extrap0;
107 if (mExtrapolationDegree > 0) {
108 mCur1Extrap[1] = mVoltageSrcIntfCurr(0, 0);
110 mVol2Extrap = std::vector<Complex>(mExtrapolationDegree + 1, volt2);
114DecouplingIdealTransformer_SP_Ph1::interpolate(std::vector<Complex> &data) {
115 Complex c1 = data[mBufIdx];
116 Complex c2 = mBufIdx == mBufSize - 1 ? data[0] : data[mBufIdx + 1];
117 return mAlpha * c1 + (1 - mAlpha) * c2;
121DecouplingIdealTransformer_SP_Ph1::extrapolate(std::vector<Complex> &data) {
122 if (mCouplingMethod == CouplingMethod::EXTRAPOLATION_LINEAR) {
123 Complex c1 = data[mMacroBufIdx];
125 mMacroBufIdx == mExtrapolationDegree ? data[0] : data[mMacroBufIdx + 1];
127 (mDelay * (mBufIdx + 1)) /
static_cast<float>(mBufSize);
128 Real tEval = mDelay + delayFraction;
129 return ((c2 - c1) / mDelay) * tEval + c1;
131 return data[mMacroBufIdx];
135void DecouplingIdealTransformer_SP_Ph1::step(Real time, Int timeStepCount) {
137 if (mCouplingMethod == CouplingMethod::DELAY) {
138 volt1 = interpolate(mVol2);
139 cur2 = interpolate(mCur1);
141 volt1 = extrapolate(mVol2Extrap);
142 cur2 = extrapolate(mCur1Extrap);
146 **mSrcVoltageRef = volt1;
147 **mSrcCurrentRef = cur2;
148 **mSourceVoltageIntfVoltage = mVoltageSrc->intfVoltage()(0, 0);
149 **mSourceVoltageIntfCurrent = mVoltageSrc->intfCurrent()(0, 0);
151 mSrcVoltage->set(**mSrcVoltageRef);
152 mSrcCurrent->set(**mSrcCurrentRef);
155void DecouplingIdealTransformer_SP_Ph1::PreStep::execute(Real time,
157 mITM.step(time, timeStepCount);
160void DecouplingIdealTransformer_SP_Ph1::postStep() {
162 mCur1[mBufIdx] = mVoltageSrc->intfCurrent()(0, 0);
163 mVol2[mBufIdx] = -mCurrentSrc->intfVoltage()(0, 0);
166 if (mBufIdx == mBufSize) {
167 mCur1Extrap[mMacroBufIdx] = mCur1[mBufIdx - 1];
168 mVol2Extrap[mMacroBufIdx] = mVol2[mBufIdx - 1];
170 if (mMacroBufIdx == mExtrapolationDegree + 1) {
177void DecouplingIdealTransformer_SP_Ph1::PostStep::execute(Real time,
182Task::List DecouplingIdealTransformer_SP_Ph1::getTasks() {
184 {std::make_shared<PreStep>(*
this), std::make_shared<PostStep>(*
this)});
187IdentifiedObject::List DecouplingIdealTransformer_SP_Ph1::getComponents() {
188 return IdentifiedObject::List({mRes1, mRes2, mVoltageSrc, mCurrentSrc});
191TopologicalNode::Ptr DecouplingIdealTransformer_SP_Ph1::getVirtualNode() {
Logger::Log mSLog
Component logger.