13const Real K23 = std::sqrt(2.0 / 3.0);
14const Real K32 = std::sqrt(1.5);
21 mEnableNegSeqControl(enableNegSeqControl),
47 throw std::invalid_argument(
"Filter inductance lf must be positive.");
50 throw std::invalid_argument(
"Filter capacitance cf must be positive.");
53 throw std::invalid_argument(
"Filter resistance rf must be non-negative.");
56 throw std::invalid_argument(
"Coupling resistance rc must be positive.");
59 throw std::invalid_argument(
60 "Nominal angular frequency omegaN must be positive.");
62 if (omegaCutoff < 0.0)
63 throw std::invalid_argument(
64 "Power-filter cutoff frequency omegaCutoff must be non-negative.");
67 throw std::invalid_argument(
"PLL integral gain kiPLL must be non-zero.");
69 if (kiPowerCtrl == 0.0)
70 throw std::invalid_argument(
71 "Power-control integral gain kiPowerCtrl must be non-zero.");
73 if (kiCurrCtrl == 0.0)
74 throw std::invalid_argument(
75 "Current-control integral gain kiCurrCtrl must be non-zero.");
86 mOmegaCutoff = omegaCutoff;
89 mKpPowerCtrl = kpPowerCtrl;
90 mKiPowerCtrl = kiPowerCtrl;
91 mKpCurrCtrl = kpCurrCtrl;
92 mKiCurrCtrl = kiCurrCtrl;
97 const Matrix u0 = Matrix::Zero(6, 1);
99 Matrix aMatrix, bMatrix, cMatrix, dMatrix, eVector, fVector;
100 buildStateSpaceModel(x0, u0, aMatrix, bMatrix, cMatrix, dMatrix, eVector,
107DP::Ph3::AvVoltSourceInverterStateSpace::NegSeqTerms
108DP::Ph3::AvVoltSourceInverterStateSpace::computeNegSeqTerms(
109 const Matrix &x,
const Complex3 &vc,
const Complex3 &uEnv,
110 const Complex3 &redistFactor,
const Complex3 &projCoeff,
111 const Complex &expJPsi)
const {
117 for (
Int p = 0; p < 3; ++p) {
118 nV += redistFactor[p] * vc[p];
119 nU += redistFactor[p] * uEnv[p];
122 const Complex nI = (nV - nU) / mRc;
123 terms.ircNDQ = 0.5 * K23 * expJPsi * std::conj(nI);
126 for (
Int p = 0; p < 3; ++p)
127 terms.hIrcN[p] = 0.5 * K23 * expJPsi * projCoeff[p] / mRc;
129 const Real vRefNd = -mKpCurrCtrl * terms.ircNDQ.real() +
130 mKiCurrCtrl * x(GammaND, 0) + mKpCurrCtrl * mIRefNd;
131 const Real vRefNq = -mKpCurrCtrl * terms.ircNDQ.imag() +
132 mKiCurrCtrl * x(GammaNQ, 0) + mKpCurrCtrl * mIRefNq;
133 terms.vRefNDQ =
Complex(vRefNd, vRefNq);
134 terms.vRefNEnv0 = K23 * std::conj(terms.vRefNDQ) * expJPsi;
139void DP::Ph3::AvVoltSourceInverterStateSpace::buildStateSpaceModel(
143 const Real psi = x(Psi, 0);
144 const Real phiPLL = x(PhiPLL, 0);
145 const Real pF = x(PFiltered, 0);
146 const Real qF = x(QFiltered, 0);
147 const Real phiD = x(PhiD, 0);
148 const Real phiQ = x(PhiQ, 0);
149 const Real gammaD = x(GammaD, 0);
150 const Real gammaQ = x(GammaQ, 0);
156 for (
Int p = 0; p < 3; ++p) {
157 vc[p] =
Complex(x(mVcReCol[p], 0), x(mVcImCol[p], 0));
158 iF[p] =
Complex(x(mIfReCol[p], 0), x(mIfImCol[p], 0));
160 const Complex3 uEnv = {
Complex(u(0, 0), u(1, 0)),
Complex(u(2, 0), u(3, 0)),
166 const Complex3 redistFactor = {std::conj(projCoeff[0]),
167 std::conj(projCoeff[1]),
168 std::conj(projCoeff[2])};
170 const Complex rot = std::exp(-j * psi);
171 const Complex expJPsi = std::conj(rot);
176 for (
Int p = 0; p < 3; ++p) {
177 pV += projCoeff[p] * vc[p];
178 pU += projCoeff[p] * uEnv[p];
180 const Complex pI = (pV - pU) / mRc;
182 const Complex vcDQ = 0.5 * K23 * rot * pV;
183 const Complex ircDQ = 0.5 * K23 * rot * pI;
184 const Real vcD = vcDQ.real();
185 const Real vcQ = vcDQ.imag();
186 const Real ircD = ircDQ.real();
187 const Real ircQ = ircDQ.imag();
193 for (
Int p = 0; p < 3; ++p) {
194 gVc[p] = 0.5 * K23 * rot * projCoeff[p];
195 gIrcVc[p] = gVc[p] / mRc;
196 gIrcU[p] = -gVc[p] / mRc;
200 const Complex pq = vcDQ * std::conj(ircDQ);
201 const Real pInst = pq.real();
202 const Real qInst = pq.imag();
206 -mKpPowerCtrl * pF + mKiPowerCtrl * phiD + mKpPowerCtrl * mPRef;
208 mKpPowerCtrl * qF + mKiPowerCtrl * phiQ - mKpPowerCtrl * mQRef;
209 const Complex iRefDQ(iRefD, iRefQ);
210 const Complex gammaDQ(gammaD, gammaQ);
213 -mKpCurrCtrl * ircDQ + mKiCurrCtrl * gammaDQ + mKpCurrCtrl * iRefDQ;
216 const Complex vRefEnv0 = K23 * vRefDQ * expJPsi;
221 if (mEnableNegSeqControl)
222 neg = computeNegSeqTerms(x, vc, uEnv, redistFactor, projCoeff, expJPsi);
224 const Real ircND = neg.ircNDQ.real();
225 const Real ircNQ = neg.ircNDQ.imag();
229 for (
Int p = 0; p < 3; ++p)
230 vRef[p] = redistFactor[p] * vRefEnv0 + projCoeff[p] * neg.vRefNEnv0;
235 for (
Int p = 0; p < 3; ++p) {
237 iF[p] / mCf + (uEnv[p] - vc[p]) / (mCf * mRc) - j * mOmegaN * vc[p];
238 ifDot[p] = (vRef[p] - vc[p] - mRf * iF[p]) / mLf - j * mOmegaN * iF[p];
241 Matrix f = Matrix::Zero(stateSize(), 1);
242 f(Psi, 0) = mKpPLL * vcQ + mKiPLL * phiPLL;
244 f(PFiltered, 0) = mOmegaCutoff * (pInst - pF);
245 f(QFiltered, 0) = mOmegaCutoff * (qInst - qF);
246 f(PhiD, 0) = mPRef - pF;
247 f(PhiQ, 0) = qF - mQRef;
248 f(GammaD, 0) = iRefD - ircD;
249 f(GammaQ, 0) = iRefQ - ircQ;
250 if (mEnableNegSeqControl) {
251 f(GammaND, 0) = mIRefNd - ircND;
252 f(GammaNQ, 0) = mIRefNq - ircNQ;
254 for (
Int p = 0; p < 3; ++p) {
255 f(mVcReCol[p], 0) = vcDot[p].real();
256 f(mVcImCol[p], 0) = vcDot[p].imag();
257 f(mIfReCol[p], 0) = ifDot[p].real();
258 f(mIfImCol[p], 0) = ifDot[p].imag();
262 A = Matrix::Zero(stateSize(), stateSize());
263 B = Matrix::Zero(stateSize(), 6);
266 A(Psi, Psi) = mKpPLL * (-vcD);
267 A(Psi, PhiPLL) = mKiPLL;
268 A(PhiPLL, Psi) = -vcD;
269 for (
Int p = 0; p < 3; ++p) {
270 const Real dVcQdRe = gVc[p].imag();
271 const Real dVcQdIm = gVc[p].real();
272 A(Psi, mVcReCol[p]) = mKpPLL * dVcQdRe;
273 A(Psi, mVcImCol[p]) = mKpPLL * dVcQdIm;
274 A(PhiPLL, mVcReCol[p]) = dVcQdRe;
275 A(PhiPLL, mVcImCol[p]) = dVcQdIm;
279 A(PFiltered, PFiltered) = -mOmegaCutoff;
280 A(QFiltered, QFiltered) = -mOmegaCutoff;
281 for (
Int p = 0; p < 3; ++p) {
283 gVc[p] * std::conj(ircDQ) + vcDQ * std::conj(gIrcVc[p]);
285 (j * gVc[p]) * std::conj(ircDQ) + vcDQ * std::conj(j * gIrcVc[p]);
286 A(PFiltered, mVcReCol[p]) = mOmegaCutoff * dpqVcRe.real();
287 A(QFiltered, mVcReCol[p]) = mOmegaCutoff * dpqVcRe.imag();
288 A(PFiltered, mVcImCol[p]) = mOmegaCutoff * dpqVcIm.real();
289 A(QFiltered, mVcImCol[p]) = mOmegaCutoff * dpqVcIm.imag();
291 const Complex dpqURe = vcDQ * std::conj(gIrcU[p]);
292 const Complex dpqUIm = vcDQ * std::conj(j * gIrcU[p]);
293 B(PFiltered, mUReCol[p]) = mOmegaCutoff * dpqURe.real();
294 B(QFiltered, mUReCol[p]) = mOmegaCutoff * dpqURe.imag();
295 B(PFiltered, mUImCol[p]) = mOmegaCutoff * dpqUIm.real();
296 B(QFiltered, mUImCol[p]) = mOmegaCutoff * dpqUIm.imag();
299 A(PhiD, PFiltered) = -1.0;
300 A(PhiQ, QFiltered) = 1.0;
303 A(GammaD, PFiltered) = -mKpPowerCtrl;
304 A(GammaD, PhiD) = mKiPowerCtrl;
305 A(GammaD, Psi) = -ircQ;
306 A(GammaQ, QFiltered) = mKpPowerCtrl;
307 A(GammaQ, PhiQ) = mKiPowerCtrl;
308 A(GammaQ, Psi) = ircD;
309 for (
Int p = 0; p < 3; ++p) {
310 const Real dIrcDdVcRe = gIrcVc[p].real();
311 const Real dIrcDdVcIm = -gIrcVc[p].imag();
312 const Real dIrcQdVcRe = gIrcVc[p].imag();
313 const Real dIrcQdVcIm = gIrcVc[p].real();
314 A(GammaD, mVcReCol[p]) = -dIrcDdVcRe;
315 A(GammaD, mVcImCol[p]) = -dIrcDdVcIm;
316 A(GammaQ, mVcReCol[p]) = -dIrcQdVcRe;
317 A(GammaQ, mVcImCol[p]) = -dIrcQdVcIm;
319 const Real dIrcDdURe = gIrcU[p].real();
320 const Real dIrcDdUIm = -gIrcU[p].imag();
321 const Real dIrcQdURe = gIrcU[p].imag();
322 const Real dIrcQdUIm = gIrcU[p].real();
323 B(GammaD, mUReCol[p]) = -dIrcDdURe;
324 B(GammaD, mUImCol[p]) = -dIrcDdUIm;
325 B(GammaQ, mUReCol[p]) = -dIrcQdURe;
326 B(GammaQ, mUImCol[p]) = -dIrcQdUIm;
331 if (mEnableNegSeqControl) {
332 A(GammaND, Psi) = ircNQ;
333 A(GammaNQ, Psi) = -ircND;
334 for (
Int p = 0; p < 3; ++p) {
335 A(GammaND, mVcReCol[p]) = -neg.hIrcN[p].real();
336 A(GammaND, mVcImCol[p]) = -neg.hIrcN[p].imag();
337 A(GammaNQ, mVcReCol[p]) = -neg.hIrcN[p].imag();
338 A(GammaNQ, mVcImCol[p]) = neg.hIrcN[p].real();
339 B(GammaND, mUReCol[p]) = neg.hIrcN[p].real();
340 B(GammaND, mUImCol[p]) = neg.hIrcN[p].imag();
341 B(GammaNQ, mUReCol[p]) = neg.hIrcN[p].imag();
342 B(GammaNQ, mUImCol[p]) = -neg.hIrcN[p].real();
347 for (
Int p = 0; p < 3; ++p) {
348 const Int reRow = mVcReCol[p];
349 const Int imRow = mVcImCol[p];
350 A(reRow, reRow) = -1.0 / (mCf * mRc);
351 A(reRow, imRow) = mOmegaN;
352 A(imRow, reRow) = -mOmegaN;
353 A(imRow, imRow) = -1.0 / (mCf * mRc);
354 A(reRow, mIfReCol[p]) = 1.0 / mCf;
355 A(imRow, mIfImCol[p]) = 1.0 / mCf;
356 B(reRow, mUReCol[p]) = 1.0 / (mCf * mRc);
357 B(imRow, mUImCol[p]) = 1.0 / (mCf * mRc);
361 RefSensitivities sens;
364 j * K23 * expJPsi * (mKpCurrCtrl * ircDQ + vRefDQ);
367 const Complex dVRefEnv0DpF = K23 * expJPsi * (mKpCurrCtrl * (-mKpPowerCtrl));
368 const Complex dVRefEnv0DqF = K23 * expJPsi * j * (mKpCurrCtrl * mKpPowerCtrl);
369 const Complex dVRefEnv0DPhiD = K23 * expJPsi * (mKpCurrCtrl * mKiPowerCtrl);
371 K23 * expJPsi * j * (mKpCurrCtrl * mKiPowerCtrl);
372 const Complex dVRefEnv0DGammaD = K23 * expJPsi * mKiCurrCtrl;
373 const Complex dVRefEnv0DGammaQ = K23 * expJPsi * j * mKiCurrCtrl;
375 sens.posOwn = {dVRefEnv0DPsi, dVRefEnv0DpF, dVRefEnv0DqF,
376 dVRefEnv0DPhiD, dVRefEnv0DPhiQ, dVRefEnv0DGammaD,
380 for (
Int p = 0; p < 3; ++p) {
381 sens.posVcRe[p] = K23 * expJPsi * (-mKpCurrCtrl * gIrcVc[p]);
382 sens.posVcIm[p] = K23 * expJPsi * (-mKpCurrCtrl * j * gIrcVc[p]);
383 sens.posURe[p] = K23 * expJPsi * (-mKpCurrCtrl * gIrcU[p]);
384 sens.posUIm[p] = K23 * expJPsi * (-mKpCurrCtrl * j * gIrcU[p]);
389 if (mEnableNegSeqControl) {
392 (mKpCurrCtrl * std::conj(neg.ircNDQ) + std::conj(neg.vRefNDQ));
393 sens.negGammaND = K23 * expJPsi * mKiCurrCtrl;
394 sens.negGammaNQ = -j * K23 * expJPsi * mKiCurrCtrl;
395 for (
Int p = 0; p < 3; ++p) {
397 mKpCurrCtrl * std::conj(neg.hIrcN[p]) * K23 * expJPsi;
398 sens.negVcRe[p] = -base;
399 sens.negVcIm[p] = -j * base;
400 sens.negURe[p] = base;
401 sens.negUIm[p] = j * base;
405 buildInductorRows(redistFactor, projCoeff, sens,
A,
B);
408 E = f -
A * x -
B * u;
411 C = Matrix::Zero(6, stateSize());
412 for (
Int p = 0; p < 3; ++p) {
413 C(2 * p, mVcReCol[p]) = -1.0 / mRc;
414 C(2 * p + 1, mVcImCol[p]) = -1.0 / mRc;
417 D = Matrix::Zero(6, 6);
418 for (
Int p = 0; p < 3; ++p) {
419 D(2 * p, mUReCol[p]) = 1.0 / mRc;
420 D(2 * p + 1, mUImCol[p]) = 1.0 / mRc;
423 F = Matrix::Zero(6, 1);
426void DP::Ph3::AvVoltSourceInverterStateSpace::buildInductorRows(
427 const Complex3 &redistFactor,
const Complex3 &projCoeff,
429 for (
Int pOut = 0; pOut < 3; ++pOut) {
430 const Int reRow = mIfReCol[pOut];
431 const Int imRow = mIfImCol[pOut];
434 A(reRow, mVcReCol[pOut]) = -1.0 / mLf;
435 A(imRow, mVcImCol[pOut]) = -1.0 / mLf;
436 A(reRow, reRow) = -mRf / mLf;
437 A(imRow, imRow) = -mRf / mLf;
438 A(reRow, imRow) = mOmegaN;
439 A(imRow, reRow) = -mOmegaN;
442 for (
Int k = 0; k < 7; ++k) {
443 const Complex dVRef = redistFactor[pOut] * sens.posOwn[k];
444 A(reRow, mOwnCol[k]) += dVRef.real() / mLf;
445 A(imRow, mOwnCol[k]) += dVRef.imag() / mLf;
447 for (
Int pSrc = 0; pSrc < 3; ++pSrc) {
448 const Complex dVRefVcRe = redistFactor[pOut] * sens.posVcRe[pSrc];
449 const Complex dVRefVcIm = redistFactor[pOut] * sens.posVcIm[pSrc];
450 A(reRow, mVcReCol[pSrc]) += dVRefVcRe.real() / mLf;
451 A(imRow, mVcReCol[pSrc]) += dVRefVcRe.imag() / mLf;
452 A(reRow, mVcImCol[pSrc]) += dVRefVcIm.real() / mLf;
453 A(imRow, mVcImCol[pSrc]) += dVRefVcIm.imag() / mLf;
455 const Complex dVRefURe = redistFactor[pOut] * sens.posURe[pSrc];
456 const Complex dVRefUIm = redistFactor[pOut] * sens.posUIm[pSrc];
457 B(reRow, mUReCol[pSrc]) += dVRefURe.real() / mLf;
458 B(imRow, mUReCol[pSrc]) += dVRefURe.imag() / mLf;
459 B(reRow, mUImCol[pSrc]) += dVRefUIm.real() / mLf;
460 B(imRow, mUImCol[pSrc]) += dVRefUIm.imag() / mLf;
465 const Complex dNPsi = projCoeff[pOut] * sens.negPsi;
466 A(reRow, Psi) += dNPsi.real() / mLf;
467 A(imRow, Psi) += dNPsi.imag() / mLf;
468 if (mEnableNegSeqControl) {
469 const Complex dNGammaND = projCoeff[pOut] * sens.negGammaND;
470 A(reRow, GammaND) += dNGammaND.real() / mLf;
471 A(imRow, GammaND) += dNGammaND.imag() / mLf;
472 const Complex dNGammaNQ = projCoeff[pOut] * sens.negGammaNQ;
473 A(reRow, GammaNQ) += dNGammaNQ.real() / mLf;
474 A(imRow, GammaNQ) += dNGammaNQ.imag() / mLf;
476 for (
Int pSrc = 0; pSrc < 3; ++pSrc) {
477 const Complex dNVcRe = projCoeff[pOut] * sens.negVcRe[pSrc];
478 const Complex dNVcIm = projCoeff[pOut] * sens.negVcIm[pSrc];
479 A(reRow, mVcReCol[pSrc]) += dNVcRe.real() / mLf;
480 A(imRow, mVcReCol[pSrc]) += dNVcRe.imag() / mLf;
481 A(reRow, mVcImCol[pSrc]) += dNVcIm.real() / mLf;
482 A(imRow, mVcImCol[pSrc]) += dNVcIm.imag() / mLf;
484 const Complex dNURe = projCoeff[pOut] * sens.negURe[pSrc];
485 const Complex dNUIm = projCoeff[pOut] * sens.negUIm[pSrc];
486 B(reRow, mUReCol[pSrc]) += dNURe.real() / mLf;
487 B(imRow, mUReCol[pSrc]) += dNURe.imag() / mLf;
488 B(reRow, mUImCol[pSrc]) += dNUIm.real() / mLf;
489 B(imRow, mUImCol[pSrc]) += dNUIm.imag() / mLf;
512 const Real psi = x(Psi, 0);
514 const Complex expJPsi = std::conj(rot);
522 for (
Int p = 0; p < 3; ++p) {
523 const Complex vc(x(mVcReCol[p], 0), x(mVcImCol[p], 0));
524 const Complex uEnv(u(mUReCol[p], 0), u(mUImCol[p], 0));
525 pV += projCoeff[p] * vc;
526 pU += projCoeff[p] * uEnv;
527 nV += std::conj(projCoeff[p]) * vc;
528 nU += std::conj(projCoeff[p]) * uEnv;
530 const Complex pI = (pV - pU) / mRc;
532 const Complex vcDQ = 0.5 * K23 * rot * pV;
533 const Complex ircDQ = 0.5 * K23 * rot * pI;
535 **mVcD = vcDQ.real();
536 **mVcQ = vcDQ.imag();
537 **mIrcD = ircDQ.real();
538 **mIrcQ = ircDQ.imag();
539 if (mEnableNegSeqControl) {
540 const Complex nI = (nV - nU) / mRc;
541 const Complex ircNDQ = 0.5 * K23 * expJPsi * std::conj(nI);
542 **mIrcNd = ircNDQ.real();
543 **mIrcNq = ircNDQ.imag();
546 **mPInst = **mVcD * **mIrcD + **mVcQ * **mIrcQ;
547 **mQInst = -**mVcD * **mIrcQ + **mVcQ * **mIrcD;
549 **mOmegaPLL = mOmegaN + mKpPLL * **mVcQ + mKiPLL * x(PhiPLL, 0);
555 throw std::logic_error(
"setParameters() must be called before "
556 "initializeFromNodesAndTerminals().");
559 const Real omega = 2.0 *
PI * frequency;
561 const Complex powerRef(mPRef, mQRef);
564 const Complex ua = uInit(0, 0);
575 const Complex iNext = std::conj(powerRef / (1.5 * vc));
576 const Complex vcNext = ua + mRc * iNext;
588 const Complex ifCurrent = j * omega * mCf * vc + irc;
589 const Complex vRef = vc + (mRf + j * omega * mLf) * ifCurrent;
592 const Real psi0 = std::arg(vc);
593 const Complex rot0 = std::exp(-j * psi0);
595 const Complex vcDQ = K32 * vc * rot0;
596 const Real vcD = vcDQ.real();
597 const Real vcQ = vcDQ.imag();
598 const Complex ircDQ = K32 * irc * rot0;
599 const Real ircD = ircDQ.real();
600 const Real ircQ = ircDQ.imag();
602 const Real pInit = vcD * ircD + vcQ * ircQ;
603 const Real qInit = -vcD * ircQ + vcQ * ircD;
605 const Real phiPLL0 = (omega - mOmegaN) / mKiPLL;
606 const Real phiD0 = (ircD + mKpPowerCtrl * (pInit - mPRef)) / mKiPowerCtrl;
607 const Real phiQ0 = (ircQ - mKpPowerCtrl * (qInit - mQRef)) / mKiPowerCtrl;
610 -mKpPowerCtrl * pInit + mKiPowerCtrl * phiD0 + mKpPowerCtrl * mPRef;
612 mKpPowerCtrl * qInit + mKiPowerCtrl * phiQ0 - mKpPowerCtrl * mQRef;
614 const Complex vRefDQ0 = K32 * vRef * rot0;
616 (vRefDQ0.real() + mKpCurrCtrl * (ircD - iRefD0)) / mKiCurrCtrl;
618 (vRefDQ0.imag() + mKpCurrCtrl * (ircQ - iRefQ0)) / mKiCurrCtrl;
625 x0(PhiPLL, 0) = phiPLL0;
626 x0(PFiltered, 0) = pInit;
627 x0(QFiltered, 0) = qInit;
630 x0(GammaD, 0) = gammaD0;
631 x0(GammaQ, 0) = gammaQ0;
634 for (
Int p = 0; p < 3; ++p) {
635 x0(mVcReCol[p], 0) = vcAbc(p, 0).real();
636 x0(mVcImCol[p], 0) = vcAbc(p, 0).imag();
637 x0(mIfReCol[p], 0) = ifAbc(p, 0).real();
638 x0(mIfImCol[p], 0) = ifAbc(p, 0).imag();
643 (**mIntfCurrent)(0, 0) = (ua - vc) / mRc;
644 (**mIntfCurrent)(1, 0) = (uInit(1, 0) - vcAbc(1, 0)) / mRc;
645 (**mIntfCurrent)(2, 0) = (uInit(2, 0) - vcAbc(2, 0)) / mRc;
650 SPDLOG_LOGGER_INFO(
mSLog,
651 "\n--- Inverter SSN mixed real+per-phase-complex "
656 "\nP/Q init: [{:.6e}, {:.6e}]"
657 "\nVc dq (phase a): [{:.6e}, {:.6e}]"
658 "\nIinj dq (phase a): [{:.6e}, {:.6e}]"
659 "\n--- Initialization finished ---",
void setParameters(Real lf, Real cf, Real rf, Real rc, Real omegaN, Real kpPLL, Real kiPLL, Real omegaCutoff, Real pRef, Real qRef, Real kpPowerCtrl, Real kiPowerCtrl, Real kpCurrCtrl, Real kiCurrCtrl, Real iRefNd=0.0, Real iRefNq=0.0)
void initializeFromNodesAndTerminals(Real frequency) override
Initializes Component variables according to power flow data stored in Nodes.
void updateLogAttributes(const Matrix &u) const override final
AvVoltSourceInverterStateSpace(String uid, String name, Logger::Level logLevel=Logger::Level::off, Bool enableNegSeqControl=false)
Bool updateComponentParameters() override final
Rebuild A/B/C/D/E/F from the current state/input; returns true if the stamp changed.
const Attribute< Matrix >::Ptr mX
static constexpr Int mInitializationMaxIterations
void setStateOffset(const Matrix &E)
Attribute< MatrixComp >::Ptr inputAttribute() const
Int stateSize() const
Total packed real state size: realStateCount + 2*complexStateCount.
void setParameters(const Matrix &A, const Matrix &B, const Matrix &C, const Matrix &D)
static Matrix packComplex(const MatrixComp &c)
Pack an m-vector of complex into a 2m real vector [Re0,Im0,Re1,Im1,...].
virtual MatrixComp buildInitialInputFromNodes(Real frequency)
Default: balanced envelope from v_terminal1 - v_terminal0.
static constexpr Real mInitializationTolerance
Matrix mA
Continuous-time real model over the packed state and packed [Re,Im] input/output.
void setOutputOffset(const Matrix &F)
MixedVTypeVariableSSNComp(String uid, String name, Int realStateCount, Int complexStateCount, Logger::Level logLevel=Logger::Level::off)
String uid()
Returns unique id.
AttributeList::Ptr mAttributes
Attribute List.
spdlog::level::level_enum Level
static String matrixCompToString(const MatrixComp &mat)
static String matrixToString(const Matrix &mat)
static MatrixComp singlePhaseVariableToThreePhase(Complex var_1ph)
To convert single phase complex variables (voltages, currents) to symmetrical three phase ones.
const Attribute< MatrixVar< Complex > >::Ptr mIntfCurrent
const Attribute< MatrixVar< Complex > >::Ptr mIntfVoltage
bool mParametersSet
Flag indicating that parameters are set via setParameters() function.
Logger::Log mSLog
Component logger.
Eigen::Matrix< Real, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor > Matrix
Dense matrix for real numbers.
std::complex< Real > Complex
Eigen::Matrix< Complex, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor > MatrixComp
Dense matrix for complex numbers.