14 mRf(0.0), mRc(0.0), mOmegaN(0.0), mNominalVoltage(0.0), mPRef(0.0),
15 mQRef(0.0), mVirtualInertia(0.0), mDampingCoefficient(0.0),
16 mVoltageDroopGain(0.0), mReactiveIntegralGain(0.0), mKpVoltage(0.0),
17 mKiVoltage(0.0), mKpCurrent(0.0), mKiCurrent(0.0),
18 mActiveDampingGain(0.0), mPowerFilterCutoff(0.0), mDelayBandwidth(0.0),
19 mVirtualResistance(0.0), mVirtualReactance(0.0),
20 mGridCurrentFeedforward(1.0), mReactivePowerDroop(0.0),
21 mReactiveDroopCutoff(0.0), mVoltageSetpoint(0.0),
22 mJacobianRelativeStep(1e-6), mJacobianAbsoluteStep(1e-8),
27 mVoltageMagnitudeGFM(
mAttributes->create<
Real>(
"voltage_magnitude_gfm")),
44 **mVoltageMagnitudeGFM = 0.0;
55 **mVoltageReferenceD = 0.0;
56 **mVoltageReferenceQ = 0.0;
66 "voltage_integrator_d",
67 "voltage_integrator_q",
69 "current_integrator_d",
70 "current_integrator_q",
85std::vector<EMT::SSNComp::LocalAbcStateBlock>
88 {{
static_cast<Int>(VcA),
static_cast<Int>(VcB),
static_cast<Int>(VcC)},
91 {{
static_cast<Int>(IfA),
static_cast<Int>(IfB),
static_cast<Int>(IfC)},
99 Real voltageDroopGain,
Real reactiveIntegralGain,
Real kpVoltage,
101 Real powerFilterCutoff,
Real delayBandwidth) {
104 throw std::invalid_argument(
"Filter inductance lf must be positive.");
107 throw std::invalid_argument(
"Filter capacitance cf must be positive.");
110 throw std::invalid_argument(
"Filter resistance rf must be non-negative.");
113 throw std::invalid_argument(
"Coupling resistance rc must be positive.");
115 if (nominalVoltage <= 0.0)
116 throw std::invalid_argument(
"Nominal voltage must be positive.");
119 throw std::invalid_argument(
120 "Nominal angular frequency omegaN must be positive.");
122 if (virtualInertia <= 0.0)
123 throw std::invalid_argument(
"Virtual inertia must be positive.");
125 if (dampingCoefficient < 0.0)
126 throw std::invalid_argument(
"Damping coefficient must be non-negative.");
128 if (kiVoltage == 0.0)
129 throw std::invalid_argument(
130 "Voltage-controller integral gain must be non-zero.");
132 if (kiCurrent == 0.0)
133 throw std::invalid_argument(
134 "Current-controller integral gain must be non-zero.");
136 if (powerFilterCutoff < 0.0)
137 throw std::invalid_argument(
138 "Power-filter cutoff frequency must be non-negative.");
140 if (delayBandwidth <= 0.0)
141 throw std::invalid_argument(
"Delay bandwidth must be positive.");
148 mNominalVoltage = nominalVoltage;
154 mVirtualInertia = virtualInertia;
155 mDampingCoefficient = dampingCoefficient;
156 mVoltageDroopGain = voltageDroopGain;
157 mReactiveIntegralGain = reactiveIntegralGain;
159 mKpVoltage = kpVoltage;
160 mKiVoltage = kiVoltage;
162 mKpCurrent = kpCurrent;
163 mKiCurrent = kiCurrent;
165 mActiveDampingGain = activeDampingGain;
166 mPowerFilterCutoff = powerFilterCutoff;
167 mDelayBandwidth = delayBandwidth;
175 Matrix::Zero(mStateSize, mInputSize),
176 Matrix::Zero(mOutputSize, mStateSize),
177 Matrix::Zero(mOutputSize, mInputSize),
178 Matrix::Zero(mStateSize, 1),
179 Matrix::Zero(mOutputSize, 1));
185 if (relativeStep <= 0.0)
186 throw std::invalid_argument(
187 "Relative finite-difference step must be positive.");
189 if (absoluteStep <= 0.0)
190 throw std::invalid_argument(
191 "Absolute finite-difference step must be positive.");
193 mJacobianRelativeStep = relativeStep;
194 mJacobianAbsoluteStep = absoluteStep;
198 Real virtualReactance) {
199 if (virtualResistance < 0.0)
200 throw std::invalid_argument(
"Virtual resistance must be non-negative.");
202 mVirtualResistance = virtualResistance;
203 mVirtualReactance = virtualReactance;
207 mGridCurrentFeedforward = scale;
212 throw std::invalid_argument(
"Reactive-droop gain must be non-negative.");
214 throw std::invalid_argument(
"Reactive-droop cutoff must be non-negative.");
216 mReactivePowerDroop = droopGain;
217 mReactiveDroopCutoff = cutoff;
220Matrix EMT::Ph3::SSN_GFM::getParkTransformMatrix(
Real theta)
const {
222 theta = std::remainder(theta, 2.0 *
PI);
225 constexpr Real scale = 2.0 / 3.0;
227 transform.row(0) << scale * std::cos(theta),
228 scale * std::cos(theta - 2.0 *
PI / 3.0),
229 scale * std::cos(theta + 2.0 *
PI / 3.0);
231 transform.row(1) << -scale * std::sin(theta),
232 -scale * std::sin(theta - 2.0 *
PI / 3.0),
233 -scale * std::sin(theta + 2.0 *
PI / 3.0);
238Matrix EMT::Ph3::SSN_GFM::getInverseParkTransformMatrix(
Real theta)
const {
240 theta = std::remainder(theta, 2.0 *
PI);
243 transform << std::cos(theta), -std::sin(theta),
245 std::cos(theta - 2.0 *
PI / 3.0), -std::sin(theta - 2.0 *
PI / 3.0),
247 std::cos(theta + 2.0 *
PI / 3.0), -std::sin(theta + 2.0 *
PI / 3.0);
252Real EMT::Ph3::SSN_GFM::regularizedOmega(
Real omega)
const {
253 constexpr Real minimumOmega = 1.0;
255 if (std::abs(omega) >= minimumOmega)
258 return omega >= 0.0 ? minimumOmega : -minimumOmega;
261void EMT::Ph3::SSN_GFM::evaluateStateDerivative(
const Matrix &x,
263 Matrix &stateDerivative)
const {
265 if (x.rows() != mStateSize || x.cols() != 1)
266 throw std::invalid_argument(
267 "SSN_GFM state vector has an invalid dimension.");
269 if (u.rows() != mInputSize || u.cols() != 1)
270 throw std::invalid_argument(
271 "SSN_GFM input vector has an invalid dimension.");
273 stateDerivative.setZero(mStateSize, 1);
275 const Real pFiltered = x(PFiltered, 0);
276 const Real qFiltered = x(QFiltered, 0);
277 const Real omega = x(Omega, 0);
278 const Real theta = x(Theta, 0);
279 const Real voltageMagnitude = x(VoltageMagnitude, 0);
281 const Real voltageIntegratorD = x(VoltageIntegratorD, 0);
282 const Real voltageIntegratorQ = x(VoltageIntegratorQ, 0);
284 const Real currentIntegratorD = x(CurrentIntegratorD, 0);
285 const Real currentIntegratorQ = x(CurrentIntegratorQ, 0);
287 const Real delayVoltageD = x(DelayVoltageD, 0);
288 const Real delayVoltageQ = x(DelayVoltageQ, 0);
290 const Matrix vcAbc = x.block(VcA, 0, 3, 1);
291 const Matrix ifAbc = x.block(IfA, 0, 3, 1);
293 const Matrix parkTransform = getParkTransformMatrix(theta);
294 const Matrix inverseParkTransform = getInverseParkTransformMatrix(theta);
297 const Matrix iGridAbc = (vcAbc - u) / mRc;
299 const Matrix vcDq = parkTransform * vcAbc;
300 const Matrix ifDq = parkTransform * ifAbc;
301 const Matrix iGridDq = parkTransform * iGridAbc;
303 const Real vcD = vcDq(0, 0);
304 const Real vcQ = vcDq(1, 0);
306 const Real ifD = ifDq(0, 0);
307 const Real ifQ = ifDq(1, 0);
309 const Real iGridD = iGridDq(0, 0);
310 const Real iGridQ = iGridDq(1, 0);
313 const Real iCapD = ifD - iGridD;
314 const Real iCapQ = ifQ - iGridQ;
318 const Real pInstantaneous = 1.5 * (vcD * iGridD + vcQ * iGridQ);
320 const Real qInstantaneous = 1.5 * (vcQ * iGridD - vcD * iGridQ);
322 const Real pccVoltageMagnitude = std::sqrt(vcD * vcD + vcQ * vcQ);
328 stateDerivative(PFiltered, 0) =
329 mPowerFilterCutoff * (pInstantaneous - pFiltered);
331 stateDerivative(QFiltered, 0) =
332 mPowerFilterCutoff * (qInstantaneous - qFiltered);
344 stateDerivative(Omega, 0) = ((mPRef - pFiltered) / regularizedOmega(omega) -
345 mDampingCoefficient * (omega - mOmegaN)) /
348 stateDerivative(Theta, 0) = omega;
358 if (mReactiveDroopCutoff > 0.0) {
361 const Real droopTarget =
362 mVoltageSetpoint + mReactivePowerDroop * (mQRef - qFiltered);
363 stateDerivative(VoltageMagnitude, 0) =
364 mReactiveDroopCutoff * (droopTarget - voltageMagnitude);
367 stateDerivative(VoltageMagnitude, 0) =
368 mReactiveIntegralGain * (mQRef - qFiltered) +
369 mVoltageDroopGain * (mNominalVoltage - pccVoltageMagnitude);
374 const Real voltageReferenceD =
375 voltageMagnitude - (mVirtualResistance * ifD - mVirtualReactance * ifQ);
376 const Real voltageReferenceQ =
377 -(mVirtualResistance * ifQ + mVirtualReactance * ifD);
379 const Real voltageErrorD = voltageReferenceD - vcD;
380 const Real voltageErrorQ = voltageReferenceQ - vcQ;
382 stateDerivative(VoltageIntegratorD, 0) = voltageErrorD;
383 stateDerivative(VoltageIntegratorQ, 0) = voltageErrorQ;
394 const Real currentReferenceD =
395 mGridCurrentFeedforward * iGridD - omega * mCf * vcQ +
396 mKpVoltage * voltageErrorD + mKiVoltage * voltageIntegratorD;
398 const Real currentReferenceQ =
399 mGridCurrentFeedforward * iGridQ + omega * mCf * vcD +
400 mKpVoltage * voltageErrorQ + mKiVoltage * voltageIntegratorQ;
402 const Real currentErrorD = currentReferenceD - ifD;
403 const Real currentErrorQ = currentReferenceQ - ifQ;
405 stateDerivative(CurrentIntegratorD, 0) = currentErrorD;
406 stateDerivative(CurrentIntegratorQ, 0) = currentErrorQ;
418 const Real converterVoltageReferenceD =
419 vcD - omega * mLf * ifQ + mKpCurrent * currentErrorD +
420 mKiCurrent * currentIntegratorD - mActiveDampingGain * iCapD;
422 const Real converterVoltageReferenceQ =
423 vcQ + omega * mLf * ifD + mKpCurrent * currentErrorQ +
424 mKiCurrent * currentIntegratorQ - mActiveDampingGain * iCapQ;
430 stateDerivative(DelayVoltageD, 0) =
431 mDelayBandwidth * (converterVoltageReferenceD - delayVoltageD);
433 stateDerivative(DelayVoltageQ, 0) =
434 mDelayBandwidth * (converterVoltageReferenceQ - delayVoltageQ);
436 Matrix converterVoltageDq(2, 1);
437 converterVoltageDq << delayVoltageD, delayVoltageQ;
446 const Matrix converterVoltageAbc = inverseParkTransform * converterVoltageDq;
448 const Matrix vcDerivative = (ifAbc + (u - vcAbc) / mRc) / mCf;
450 const Matrix ifDerivative = (converterVoltageAbc - vcAbc - mRf * ifAbc) / mLf;
452 stateDerivative.block(VcA, 0, 3, 1) = vcDerivative;
453 stateDerivative.block(IfA, 0, 3, 1) = ifDerivative;
456void EMT::Ph3::SSN_GFM::evaluateOutput(
const Matrix &x,
const Matrix &u,
459 if (x.rows() != mStateSize || x.cols() != 1)
460 throw std::invalid_argument(
461 "SSN_GFM state vector has an invalid dimension.");
463 if (u.rows() != mInputSize || u.cols() != 1)
464 throw std::invalid_argument(
465 "SSN_GFM input vector has an invalid dimension.");
467 const Matrix vcAbc = x.block(VcA, 0, 3, 1);
478 output = (u - vcAbc) / mRc;
481void EMT::Ph3::SSN_GFM::calculateNumericalJacobians(
const Matrix &x,
486 A.setZero(mStateSize, mStateSize);
487 B.setZero(mStateSize, mInputSize);
488 C.setZero(mOutputSize, mStateSize);
489 D.setZero(mOutputSize, mInputSize);
491 Matrix fPlus = Matrix::Zero(mStateSize, 1);
492 Matrix fMinus = Matrix::Zero(mStateSize, 1);
494 Matrix gPlus = Matrix::Zero(mOutputSize, 1);
495 Matrix gMinus = Matrix::Zero(mOutputSize, 1);
498 for (
Int column = 0; column < mStateSize; ++column) {
500 mJacobianAbsoluteStep +
501 mJacobianRelativeStep * std::max(1.0, std::abs(x(column, 0)));
506 xPlus(column, 0) += step;
507 xMinus(column, 0) -= step;
509 evaluateStateDerivative(xPlus, u, fPlus);
510 evaluateStateDerivative(xMinus, u, fMinus);
512 evaluateOutput(xPlus, u, gPlus);
513 evaluateOutput(xMinus, u, gMinus);
515 A.col(column) = (fPlus - fMinus) / (2.0 * step);
516 C.col(column) = (gPlus - gMinus) / (2.0 * step);
520 for (
Int column = 0; column < mInputSize; ++column) {
522 mJacobianAbsoluteStep +
523 mJacobianRelativeStep * std::max(1.0, std::abs(u(column, 0)));
528 uPlus(column, 0) += step;
529 uMinus(column, 0) -= step;
531 evaluateStateDerivative(x, uPlus, fPlus);
532 evaluateStateDerivative(x, uMinus, fMinus);
534 evaluateOutput(x, uPlus, gPlus);
535 evaluateOutput(x, uMinus, gMinus);
537 B.col(column) = (fPlus - fMinus) / (2.0 * step);
538 D.col(column) = (gPlus - gMinus) / (2.0 * step);
542void EMT::Ph3::SSN_GFM::buildStateSpaceModel(
const Matrix &x,
const Matrix &u,
547 calculateNumericalJacobians(x, u,
A,
B,
C, D);
549 Matrix stateDerivative = Matrix::Zero(mStateSize, 1);
550 Matrix output = Matrix::Zero(mOutputSize, 1);
552 evaluateStateDerivative(x, u, stateDerivative);
553 evaluateOutput(x, u, output);
559 E = stateDerivative -
A * x -
B * u;
560 F = output -
C * x - D * u;
582 const Real theta = x(Theta, 0);
584 const Matrix parkTransform = getParkTransformMatrix(theta);
586 const Matrix vcAbc = x.block(VcA, 0, 3, 1);
587 const Matrix ifAbc = x.block(IfA, 0, 3, 1);
589 const Matrix iGridAbc = (vcAbc - u) / mRc;
591 const Matrix vcDq = parkTransform * vcAbc;
592 const Matrix ifDq = parkTransform * ifAbc;
593 const Matrix iGridDq = parkTransform * iGridAbc;
595 const Real vcD = vcDq(0, 0);
596 const Real vcQ = vcDq(1, 0);
598 const Real iGridD = iGridDq(0, 0);
599 const Real iGridQ = iGridDq(1, 0);
601 const Real ifD = ifDq(0, 0);
602 const Real ifQ = ifDq(1, 0);
613 **mPInst = 1.5 * (vcD * iGridD + vcQ * iGridQ);
614 **mQInst = 1.5 * (vcQ * iGridD - vcD * iGridQ);
616 **mOmegaGFM = x(Omega, 0);
618 **mVoltageMagnitudeGFM = x(VoltageMagnitude, 0);
621 **mVoltageReferenceD = x(VoltageMagnitude, 0) -
622 (mVirtualResistance * ifD - mVirtualReactance * ifQ);
623 **mVoltageReferenceQ = -(mVirtualResistance * ifQ + mVirtualReactance * ifD);
629 throw std::logic_error(
"setParameters() must be called before "
630 "initializeFromNodesAndTerminals().");
632 const Real omegaInitialization = 2.0 *
PI * frequency;
633 const Complex imaginaryUnit(0.0, 1.0);
635 const Complex powerReference(mPRef, mQRef);
643 MatrixComp iInjectionPhasor = MatrixComp::Zero(3, 1);
652 const Complex vcA = vcPhasor(0, 0);
655 iInjectionPhasor.setZero();
663 const Complex currentA = std::conj(powerReference / (1.5 * vcA));
670 const MatrixComp nextVcPhasor = uPhasor + mRc * nextInjectionCurrent;
672 iInjectionPhasor = nextInjectionCurrent;
675 vcPhasor = nextVcPhasor;
679 vcPhasor = nextVcPhasor;
686 iInjectionPhasor + imaginaryUnit * omegaInitialization * mCf * vcPhasor;
692 vcPhasor + (mRf + imaginaryUnit * omegaInitialization * mLf) * ifPhasor;
694 const Matrix vcAbc0 = vcPhasor.real();
695 const Matrix ifAbc0 = ifPhasor.real();
696 const Matrix iGridAbc0 = iInjectionPhasor.real();
697 const Matrix converterVoltageAbc0 = converterVoltagePhasor.real();
703 const Complex virtualImpedance(mVirtualResistance, mVirtualReactance);
704 const MatrixComp emfPhasor = vcPhasor + virtualImpedance * ifPhasor;
705 const Real theta0 = std::arg(emfPhasor(0, 0));
707 const Matrix parkTransform = getParkTransformMatrix(theta0);
709 const Matrix vcDq0 = parkTransform * vcAbc0;
710 const Matrix ifDq0 = parkTransform * ifAbc0;
711 const Matrix iGridDq0 = parkTransform * iGridAbc0;
712 const Matrix converterVoltageDq0 = parkTransform * converterVoltageAbc0;
714 const Real vcD0 = vcDq0(0, 0);
715 const Real vcQ0 = vcDq0(1, 0);
717 const Real ifD0 = ifDq0(0, 0);
718 const Real ifQ0 = ifDq0(1, 0);
720 const Real iGridD0 = iGridDq0(0, 0);
721 const Real iGridQ0 = iGridDq0(1, 0);
723 const Real pInitial = 1.5 * (vcD0 * iGridD0 + vcQ0 * iGridQ0);
725 const Real qInitial = 1.5 * (vcQ0 * iGridD0 - vcD0 * iGridQ0);
727 const Real iCapD0 = ifD0 - iGridD0;
728 const Real iCapQ0 = ifQ0 - iGridQ0;
730 Matrix x0 = Matrix::Zero(mStateSize, 1);
732 x0(PFiltered, 0) = pInitial;
733 x0(QFiltered, 0) = qInitial;
735 x0(Omega, 0) = omegaInitialization;
736 x0(Theta, 0) = theta0;
739 x0(VoltageMagnitude, 0) = std::abs(emfPhasor(0, 0));
743 mVoltageSetpoint = x0(VoltageMagnitude, 0);
747 const Real voltageReferenceD0 =
748 x0(VoltageMagnitude, 0) -
749 (mVirtualResistance * ifD0 - mVirtualReactance * ifQ0);
750 const Real voltageReferenceQ0 =
751 -(mVirtualResistance * ifQ0 + mVirtualReactance * ifD0);
752 const Real voltageErrorD0 = voltageReferenceD0 - vcD0;
753 const Real voltageErrorQ0 = voltageReferenceQ0 - vcQ0;
763 x0(VoltageIntegratorD, 0) =
764 (ifD0 - mGridCurrentFeedforward * iGridD0 +
765 omegaInitialization * mCf * vcQ0 - mKpVoltage * voltageErrorD0) /
774 x0(VoltageIntegratorQ, 0) =
775 (ifQ0 - mGridCurrentFeedforward * iGridQ0 -
776 omegaInitialization * mCf * vcD0 - mKpVoltage * voltageErrorQ0) /
786 x0(CurrentIntegratorD, 0) =
787 (converterVoltageDq0(0, 0) - vcD0 + omegaInitialization * mLf * ifQ0 +
788 mActiveDampingGain * iCapD0) /
796 x0(CurrentIntegratorQ, 0) =
797 (converterVoltageDq0(1, 0) - vcQ0 - omegaInitialization * mLf * ifD0 +
798 mActiveDampingGain * iCapQ0) /
802 x0(DelayVoltageD, 0) = converterVoltageDq0(0, 0);
803 x0(DelayVoltageQ, 0) = converterVoltageDq0(1, 0);
805 x0.block(VcA, 0, 3, 1) = vcAbc0;
806 x0.block(IfA, 0, 3, 1) = ifAbc0;
836 Matrix stateDerivative = Matrix::Zero(mStateSize, 1);
840 const Matrix nonlinearOutput = [&]() {
841 Matrix output = Matrix::Zero(mOutputSize, 1);
850 "\n--- SSN GFM initialization ---"
851 "\nInput voltage u: {:s}"
852 "\nInterface current y: {:s}"
854 "\nState derivative norm: {:.6e}"
855 "\nNonlinear output: {:s}"
857 "\nOutput mismatch norm: {:.6e}"
859 "\nHistory-vector norm: {:.6e}"
860 "\nP/Q initial: [{:.6e}, {:.6e}]"
861 "\nVc dq: [{:.6e}, {:.6e}]"
862 "\nIGrid dq: [{:.6e}, {:.6e}]"
863 "\nIf dq: [{:.6e}, {:.6e}]"
864 "\nConverter voltage dq: [{:.6e}, {:.6e}]"
865 "\n--- SSN GFM initialization finished ---",
870 mW.norm(),
mYHist.norm(), pInitial, qInitial, vcD0, vcQ0, iGridD0,
871 iGridQ0, ifD0, ifQ0, converterVoltageDq0(0, 0),
872 converterVoltageDq0(1, 0));
878 Matrix stateDerivative = Matrix::Zero(mStateSize, 1);
882 return stateDerivative;
void setNumericalLinearizationParameters(Real relativeStep, Real absoluteStep)
Configure finite-difference steps for local linearization.
SSN_GFM(String uid, String name, Logger::Level logLevel=Logger::Level::off)
Matrix getStateDerivative() const
Bool updateComponentParameters() override final
Matrix getInterfaceCurrent() const
std::vector< SSNComp::LocalAbcStateBlock > getLocalAbcStateBlocks() const override final
Matrix getInterfaceVoltage() const
void updateLogAttributes(const Matrix &u) const override final
Update derived attributes used for logging/inspection.
void setReactivePowerDroop(Real droopGain, Real cutoff)
Opt-in proportional Q-V droop replacing the integral excitation. droopGain is Dq [V/var]; cutoff [rad...
void setParameters(Real lf, Real cf, Real rf, Real rc, Real nominalVoltage, Real omegaN, Real pRef, Real qRef, Real virtualInertia, Real dampingCoefficient, Real voltageDroopGain, Real reactiveIntegralGain, Real kpVoltage, Real kiVoltage, Real kpCurrent, Real kiCurrent, Real activeDampingGain, Real powerFilterCutoff, Real delayBandwidth)
Configure the GFM model.
std::vector< String > getLocalStateNames() const override final
void setGridCurrentFeedforward(Real scale)
Scale on the voltage-loop grid-current feedforward (default 1).
void setVirtualImpedance(Real virtualResistance, Real virtualReactance=0.0)
Opt-in virtual output impedance Zv = Rv + jXv, subtracted from the EMF reference across the filter cu...
void initializeFromNodesAndTerminals(Real frequency) override final
Initializes Component variables according to power flow data stored in Nodes.
TwoTerminalVTypeVariableSSNComp(String uid, String name, Logger::Level logLevel=Logger::Level::off)
MatrixComp buildInitialInputFromNodes(Real frequency) override final
const Attribute< Matrix >::Ptr mX
void setStateOffset(const Matrix &E)
Matrix calculateHistoryVector() const override final
void setParameters(const Matrix &A, const Matrix &B, const Matrix &C, const Matrix &D)
static constexpr Real mInitializationTolerance
void updateStateSpaceModel() override final
Hook for variable/time-varying SSN components.
void setOutputOffset(const Matrix &F)
static constexpr Int mInitializationMaxIterations
String uid()
Returns unique id.
AttributeList::Ptr mAttributes
Attribute List.
spdlog::level::level_enum Level
static String matrixToString(const Matrix &mat)
const Attribute< MatrixVar< Real > >::Ptr mIntfCurrent
const Attribute< MatrixVar< Real > >::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.