DPsim
Loading...
Searching...
No Matches
EMT_Ph3_SynchronGeneratorVBR.cpp
Go to the documentation of this file.
1/* Copyright 2017-2021 Institute for Automation of Complex Power Systems,
2 * EONERC, RWTH Aachen University
3 *
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at https://mozilla.org/MPL/2.0/.
7 *********************************************************************************/
8
10
11using namespace CPS;
12
13// !!! TODO: Adaptions to use in EMT_Ph3 models phase-to-ground peak variables
14// !!! with initialization from phase-to-phase RMS variables
15
17 Logger::Level logLevel)
18 : MNASimPowerComp<Real>(uid, name, true, true, logLevel),
22 **mIntfVoltage = Matrix::Zero(3, 1);
23 **mIntfCurrent = Matrix::Zero(3, 1);
24}
25
29
33
35 Real nomPower, Real nomVolt, Real nomFreq, Int poleNumber, Real nomFieldCur,
36 Real Rs, Real Ld, Real Lq, Real Ld_t, Real Lq_t, Real Ld_s, Real Lq_s,
37 Real Ll, Real Td0_t, Real Tq0_t, Real Td0_s, Real Tq0_s, Real inertia) {
38
40 nomPower, nomVolt, nomFreq, poleNumber, nomFieldCur, Rs, Ld, Lq, Ld_t,
41 Lq_t, Ld_s, Lq_s, Ll, Td0_t, Tq0_t, Td0_s, Tq0_s, inertia);
42
43 SPDLOG_LOGGER_INFO(
44 mSLog,
45 "Set base parameters: \n"
46 "nomPower: {:e}\nnomVolt: {:e}\nnomFreq: {:e}\n nomFieldCur: {:e}\n",
47 nomPower, nomVolt, nomFreq, nomFieldCur);
48
49 SPDLOG_LOGGER_INFO(mSLog,
50 "Set operational parameters in per unit: \n"
51 "poleNumber: {:d}\ninertia: {:e}\n"
52 "Rs: {:e}\nLd: {:e}\nLq: {:e}\nLl: {:e}\n"
53 "Ld_t: {:e}\nLq_t: {:e}\nLd_s: {:e}\nLq_s: {:e}\n"
54 "Td0_t: {:e}\nTq0_t: {:e}\nTd0_s: {:e}\nTq0_s: {:e}\n",
55 poleNumber, inertia, Rs, Ld, Lq, Ll, Ld_t, Lq_t, Ld_s,
56 Lq_s, Td0_t, Tq0_t, Td0_s, Tq0_s);
57
58 SPDLOG_LOGGER_INFO(
59 mSLog,
60 "Set fundamental parameters in per unit: \n"
61 "Rs: {:e}\nLl: {:e}\nLmd: {:e}\nLmq: {:e}\nRfd: {:e}\nLlfd: {:e}\nRkd: "
62 "{:e}\n"
63 "Llkd: {:e}\nRkq1: {:e}\nLlkq1: {:e}\nRkq2: {:e}\nLlkq2: {:e}\n",
65 mLlkq2);
66}
67
69 Real nomPower, Real nomVolt, Real nomFreq, Int poleNumber, Real nomFieldCur,
70 Real Rs, Real Ll, Real Lmd, Real Lmq, Real Rfd, Real Llfd, Real Rkd,
71 Real Llkd, Real Rkq1, Real Llkq1, Real Rkq2, Real Llkq2, Real inertia) {
72
74 nomPower, nomVolt, nomFreq, nomFieldCur, poleNumber, Rs, Ll, Lmd, Lmq,
75 Rfd, Llfd, Rkd, Llkd, Rkq1, Llkq1, Rkq2, Llkq2, inertia);
76
77 SPDLOG_LOGGER_INFO(mSLog,
78 "Set base and fundamental parameters in per unit: \n"
79 "nomPower: {:e}\nnomVolt: {:e}\nnomFreq: "
80 "{:e}\npoleNumber: {:d}\nnomFieldCur: {:e}\n"
81 "Rs: {:e}\nLl: {:e}\nLmd: {:e}\nLmq: {:e}\nRfd: "
82 "{:e}\nLlfd: {:e}\nRkd: {:e}\n"
83 "Llkd: {:e}\nRkq1: {:e}\nLlkq1: {:e}\nRkq2: {:e}\nLlkq2: "
84 "{:e}\ninertia: {:e}",
85 nomPower, nomVolt, nomFreq, poleNumber, nomFieldCur, Rs,
86 Ll, Lmd, Lmq, Rfd, Llfd, Rkd, Llkd, Rkq1, Llkq1, Rkq2,
87 Llkq2, inertia);
88}
89
91 Real initReactivePower,
92 Real initTerminalVolt,
93 Real initVoltAngle,
94 Real initMechPower) {
95
96 Base::SynchronGenerator::setInitialValues(initActivePower, initReactivePower,
97 initTerminalVolt, initVoltAngle,
98 initMechPower);
99
100 SPDLOG_LOGGER_INFO(
101 mSLog,
102 "Set initial values: \n"
103 "initActivePower: {:e}\ninitReactivePower: {:e}\ninitTerminalVolt: {:e}\n"
104 "initVoltAngle: {:e} \ninitMechPower: {:e}",
105 initActivePower, initReactivePower, initTerminalVolt, initVoltAngle,
106 initMechPower);
107}
108
110 Real frequency) {
111 if (!mInitialValuesSet) {
112 SPDLOG_LOGGER_INFO(mSLog, "--- Initialization from powerflow ---");
113
114 // terminal powers in consumer system -> convert to generator system
115 Real activePower = -terminal(0)->singlePower().real();
116 Real reactivePower = -terminal(0)->singlePower().imag();
117
118 // voltage magnitude in phase-to-phase RMS -> convert to phase-to-ground peak expected by setInitialValues
120
121 this->setInitialValues(activePower, reactivePower, voltMagnitude,
122 Math::phase(initialSingleVoltage(0)), activePower);
123
124 SPDLOG_LOGGER_INFO(mSLog,
125 "\nTerminal 0 voltage: {:s}"
126 "\nTerminal 0 power: {:s}"
127 "\n--- Initialization from powerflow finished ---",
129 Logger::complexToString(terminal(0)->singlePower()));
130 } else {
131 SPDLOG_LOGGER_INFO(mSLog, "Initial values already set, skipping "
132 "initializeFromNodesAndTerminals.");
133 }
134 mSLog->flush();
135}
136
138 Real omega, Real timeStep, Attribute<Matrix>::Ptr leftVector) {
140
141 for (UInt phase1Idx = 0; phase1Idx < 3; ++phase1Idx)
142 for (UInt phase2Idx = 0; phase2Idx < 3; ++phase2Idx)
143 mVariableSystemMatrixEntries.push_back(std::make_pair<UInt, UInt>(
144 matrixNodeIndex(0, phase1Idx), matrixNodeIndex(0, phase2Idx)));
145
146 SPDLOG_LOGGER_INFO(mSLog, "List of index pairs of varying matrix entries: ");
147 for (auto indexPair : mVariableSystemMatrixEntries)
148 SPDLOG_LOGGER_INFO(mSLog, "({}, {})", indexPair.first, indexPair.second);
149
150 mSystemOmega = omega;
151 mTimeStep = timeStep;
152
154 mResistanceMat << **mRs, 0, 0, 0, **mRs, 0, 0, 0, **mRs;
155
156 //Dynamic mutual inductances
157 mDLmd = 1. / (1. / mLmd + 1. / mLlfd + 1. / mLlkd);
158
159 if (mNumDampingWindings == 2)
160 mDLmq = 1. / (1. / mLmq + 1. / mLlkq1 + 1. / mLlkq2);
161 else {
162 mDLmq = 1. / (1. / mLmq + 1. / mLlkq1);
163 K1a = Matrix::Zero(2, 1);
164 K1 = Matrix::Zero(2, 1);
165 }
166
167 mLa = (mDLmq + mDLmd) / 3.;
168 mLb = (mDLmd - mDLmq) / 3.;
169
170 // steady state per unit initial value
172
173 // Correcting variables
174 mThetaMech = mThetaMech + PI / 2;
176 mIq = -mIq;
177 mId = -mId;
178
179 // Init stator currents
180 mIq = mIsr(3, 0);
181 mId = mIsr(0, 0);
182 mI0 = mIsr(6, 0);
183
184 // Init stator voltages
185 mVq = mVsr(3, 0);
186 mVd = mVsr(0, 0);
187 mV0 = mVsr(6, 0);
188
189 // Init magnetizing flux linkage
190 mPsikq1 = mPsisr(4, 0);
191 mPsikq2 = mPsisr(5, 0);
192 mPsikd = mPsisr(2, 0);
193 mPsifd = mPsisr(1, 0);
194 mPsimq = mPsisr(3, 0);
195 mPsimd = mPsisr(0, 0);
196
198 mVfd = mVsr(1, 0);
199
200 // #### VBR Model Dynamic variables #######################################
202
203 if (mNumDampingWindings == 2)
205 else
206 mPsimq = mDLmq * (mPsikq1 / mLlkq1 + mIq);
207
208 mPsimd = mDLmd * (mPsifd / mLlfd + mPsikd / mLlkd + mId);
209
211
214
216 K1K2 << K1, K2;
218 mDVq = mDVqd(0);
219 mDVd = mDVqd(1);
220
224
225 mDVabc << mDVa, mDVb, mDVc;
226
230
234
235 CalculateL();
236
237 SPDLOG_LOGGER_INFO(mSLog, "Initialize right side vector of size {}",
238 leftVector->get().rows());
239 SPDLOG_LOGGER_INFO(
240 mSLog, "Component affects right side vector entries {}, {} and {}",
242
243 // set initial interface current
244 mVabc << mVa, mVb, mVc;
246
247 // set initial interface voltage
248 mIabc << mIa, mIb, mIc;
250}
251
257
265
267 AttributeBase::List &prevStepDependencies,
268 AttributeBase::List &attributeDependencies,
269 AttributeBase::List &modifiedAttributes) {
270 // add pre-step dependencies of component itself
271 prevStepDependencies.push_back(mIntfCurrent);
272 prevStepDependencies.push_back(mIntfVoltage);
273 modifiedAttributes.push_back(mRightVector);
274}
275
284
286
287 // Update of mechanical torque from turbine governor
289 Real Pgv = mGovernor->step(**mOmMech, mTimeStep);
290 **mMechTorque = -mTurbine->step(Pgv, mTimeStep);
291 } else if (mHasTurbineGovernorType1)
293 else if (mHasTurbineGovernor)
294 **mMechTorque = -mTurbineGovernor->step(
295 **mOmMech, 1, mInitElecPower.real() / mNomPower, mTimeStep);
296
297 // Estimate mechanical variables with euler
298 **mElecTorque = (mPsimd * mIq - mPsimq * mId);
299 **mOmMech = **mOmMech + mTimeStep * (1. / (2. * **mInertia) *
300 (**mElecTorque - **mMechTorque));
302
303 // Calculate equivalent Resistance and current source
304 mVabc << mVa, mVb, mVc;
305
306 mIabc << mIa, mIb, mIc;
307
308 mEsh_vbr =
310 mIabc +
311 mDVabc - mVabc;
312
313 CalculateL();
314
317
319
320 R_eq_vbr =
323
324 MatrixFixedSize<3, 3> R_eq_vbr_mBase_Z = R_eq_vbr * mBase_Z;
325
326 mConductanceMat = R_eq_vbr_mBase_Z.inverse();
327 mISourceEq = R_eq_vbr.inverse() * E_eq_vbr * mBase_I;
328}
329
331 Real time, Int timeStepCount, Attribute<Matrix>::Ptr &leftVector) {
332 if (terminalNotGrounded(0)) {
333 mVa = Math::realFromVectorElement(*leftVector, matrixNodeIndex(0, 0)) /
334 mBase_V;
335 mVb = Math::realFromVectorElement(*leftVector, matrixNodeIndex(0, 1)) /
336 mBase_V;
337 mVc = Math::realFromVectorElement(*leftVector, matrixNodeIndex(0, 2)) /
338 mBase_V;
339 } else {
340 mVa = 0;
341 mVb = 0;
342 mVc = 0;
343 }
344
345 // ################ Update machine stator and rotor variables ############################
346 mVabc << mVa, mVb, mVc;
347
351
352 if (mHasExciter) {
353 Real Vpss = mHasPSS
354 ? mPSS->step(**mOmMech, **mElecTorque, mVd, mVq, mTimeStep)
355 : 0.0;
356 // Note: scaled by Rfd/Lmd to transform from exciter pu system
357 // to the synchronous generator pu system
358 mVfd = (mRfd / mLmd) * mExciter->step(mVd, mVq, mTimeStep, Vpss);
359 }
360 mIabc = R_eq_vbr.inverse() * (mVabc - E_eq_vbr);
361
362 mIa = mIabc(0);
363 mIb = mIabc(1);
364 mIc = mIabc(2);
365
366 mIq_hist = mIq;
367 mId_hist = mId;
368
372
373 // Calculate rotor flux likanges
374 if (mNumDampingWindings == 2) {
376
378 mPsifdkd = F1 * mId + F2 * mPsifdkd + F1 * mId_hist + F3 * mVfd;
379
380 mPsikq1 = mPsikq1kq2(0);
381 mPsikq2 = mPsikq1kq2(1);
382 mPsifd = mPsifdkd(0);
383 mPsikd = mPsifdkd(1);
384
385 } else {
386
388
390 mPsifdkd = F1 * mId + F2 * mPsifdkd + F1 * mId_hist + F3 * mVfd;
391
392 mPsifd = mPsifdkd(0);
393 mPsikd = mPsifdkd(1);
394 }
395
396 // Calculate dynamic flux likages
397 if (mNumDampingWindings == 2) {
399 } else {
400 mPsimq = mDLmq * (mPsikq1 / mLlkq1 + mIq);
401 }
402
403 mPsimd = mDLmd * (mPsifd / mLlfd + mPsikd / mLlkd + mId);
404
405 K1K2 << K1, K2;
407 mDVq = mDVqd(0);
408 mDVd = mDVqd(1);
409
413 mDVabc << mDVa, mDVb, mDVc;
414
417}
418
420 AttributeBase::List &prevStepDependencies,
421 AttributeBase::List &attributeDependencies,
422 AttributeBase::List &modifiedAttributes,
423 Attribute<Matrix>::Ptr &leftVector) {
424 // add post-step dependencies of component itself
425 attributeDependencies.push_back(leftVector);
426 modifiedAttributes.push_back(mIntfVoltage);
427 modifiedAttributes.push_back(mIntfCurrent);
428}
429
431 mDInductanceMat << **mLl + mLa - mLb * cos(2 * mThetaMech),
432 -mLa / 2 - mLb * cos(2 * mThetaMech - 2 * PI / 3),
433 -mLa / 2 - mLb * cos(2 * mThetaMech + 2 * PI / 3),
434 -mLa / 2 - mLb * cos(2 * mThetaMech - 2 * PI / 3),
435 **mLl + mLa - mLb * cos(2 * mThetaMech - 4 * PI / 3),
436 -mLa / 2 - mLb * cos(2 * mThetaMech),
437 -mLa / 2 - mLb * cos(2 * mThetaMech + 2 * PI / 3),
438 -mLa / 2 - mLb * cos(2 * mThetaMech),
439 **mLl + mLa - mLb * cos(2 * mThetaMech + 4 * PI / 3);
440}
441
443
444 b11 = (mRkq1 / mLlkq1) * (mDLmq / mLlkq1 - 1);
445 b13 = mRkq1 * mDLmq / mLlkq1;
446 b31 = (mRfd / mLlfd) * (mDLmd / mLlfd - 1);
447 b32 = mRfd * mDLmd / (mLlfd * mLlkd);
448 b33 = mRfd * mDLmd / mLlfd;
449 b41 = mRkd * mDLmd / (mLlfd * mLlkd);
450 b42 = (mRkd / mLlkd) * (mDLmd / mLlkd - 1);
451 b43 = mRkd * mDLmd / mLlkd;
452
453 c23 = mDLmd * mRfd / (mLlfd * mLlfd) * (mDLmd / mLlfd - 1) +
454 mDLmd * mDLmd * mRkd / (mLlkd * mLlkd * mLlfd);
455 c24 = mDLmd * mRkd / (mLlkd * mLlkd) * (mDLmd / mLlkd - 1) +
456 mDLmd * mDLmd * mRfd / (mLlfd * mLlfd * mLlkd);
457 c25 = (mRfd / (mLlfd * mLlfd) + mRkd / (mLlkd * mLlkd)) * mDLmd * mDLmd;
458 c26 = mDLmd / mLlfd;
459
460 if (mNumDampingWindings == 2) {
461 b12 = mRkq1 * mDLmq / (mLlkq1 * mLlkq2);
462 b21 = mRkq2 * mDLmq / (mLlkq1 * mLlkq2);
463 b22 = (mRkq2 / mLlkq2) * (mDLmq / mLlkq2 - 1);
464 b23 = mRkq2 * mDLmq / mLlkq2;
465 c11 = mDLmq * mRkq1 / (mLlkq1 * mLlkq1) * (mDLmq / mLlkq1 - 1) +
466 mDLmq * mDLmq * mRkq2 / (mLlkq2 * mLlkq2 * mLlkq1);
467 c12 = mDLmq * mRkq2 / (mLlkq2 * mLlkq2) * (mDLmq / mLlkq2 - 1) +
468 mDLmq * mDLmq * mRkq1 / (mLlkq1 * mLlkq1 * mLlkq2);
469 c15 =
470 (mRkq1 / (mLlkq1 * mLlkq1) + mRkq2 / (mLlkq2 * mLlkq2)) * mDLmq * mDLmq;
471
472 Ea << 2 - dt * b11, -dt * b12, -dt * b21, 2 - dt * b22;
473 E1b << dt * b13, dt * b23;
474
475 Matrix Ea_inv = Ea.inverse();
476
477 E1 = Ea_inv * E1b;
478
479 E2b << 2 + dt * b11, dt * b12, dt * b21, 2 + dt * b22;
480 E2 = Ea_inv * E2b;
481 } else {
482 c11 = mDLmq * mRkq1 / (mLlkq1 * mLlkq1) * (mDLmq / mLlkq1 - 1);
483 c15 = (mRkq1 / (mLlkq1 * mLlkq1)) * mDLmq * mDLmq;
484
485 E1_1d = (1 / (2 - dt * b11)) * dt * b13;
486 E2_1d = (1 / (2 - dt * b11)) * (2 + dt * b11);
487 }
488
489 Fa << 2 - dt * b31, -dt * b32, -dt * b41, 2 - dt * b42;
490
491 F1b << dt * b33, dt * b43;
492 F1 = Fa.inverse() * F1b;
493
494 F2b << 2 + dt * b31, dt * b32, dt * b41, 2 + dt * b42;
495
496 F2 = Fa.inverse() * F2b;
497
498 F3b << 2 * dt, 0;
499 F3 = Fa.inverse() * F3b;
500
501 C26 << 0, c26;
502}
503
505
506 if (mNumDampingWindings == 2) {
507 c21_omega = -**mOmMech * mDLmq / mLlkq1;
508 c22_omega = -**mOmMech * mDLmq / mLlkq2;
511
513 K1b << c15, 0;
514 K1 = K1a * E1 + K1b;
515 } else {
516 c21_omega = -**mOmMech * mDLmq / mLlkq1;
519
520 K1a << c11, c21_omega;
521 K1b << c15, 0;
522 K1 = K1a * E1_1d + K1b;
523 }
524
526 K2b << 0, c25;
527 K2 = K2a * F1 + K2b;
528
529 K << K1, K2, Matrix::Zero(2, 1), 0, 0, 0;
530
531 mKrs_teta << 2. / 3. * cos(mThetaMech),
532 2. / 3. * cos(mThetaMech - 2. * M_PI / 3.),
533 2. / 3. * cos(mThetaMech + 2. * M_PI / 3.), 2. / 3. * sin(mThetaMech),
534 2. / 3. * sin(mThetaMech - 2. * M_PI / 3.),
535 2. / 3. * sin(mThetaMech + 2. * M_PI / 3.), 1. / 3., 1. / 3., 1. / 3.;
536
537 mKrs_teta_inv << cos(mThetaMech), sin(mThetaMech), 1.,
538 cos(mThetaMech - 2. * M_PI / 3.), sin(mThetaMech - 2. * M_PI / 3.), 1,
539 cos(mThetaMech + 2. * M_PI / 3.), sin(mThetaMech + 2. * M_PI / 3.), 1.;
540
542
543 if (mNumDampingWindings == 2)
544 h_qdr = K1a * E2 * mPsikq1kq2 + K1a * E1 * mIq + K2a * F2 * mPsifdkd +
545 K2a * F1 * mId + (K2a * F3 + C26) * mVfd;
546 else
547 h_qdr = K1a * E2_1d * mPsikq1 + K1a * E1_1d * mIq + K2a * F2 * mPsifdkd +
548 K2a * F1 * mId + (K2a * F3 + C26) * mVfd;
549
550 H_qdr << h_qdr, 0;
551
553}
554
556 Real c) {
557
558 Matrix dq0vector(3, 1);
559
560 Real q, d, zero;
561
562 q = 2. / 3. * cos(theta) * a + 2. / 3. * cos(theta - 2. * M_PI / 3.) * b +
563 2. / 3. * cos(theta + 2. * M_PI / 3.) * c;
564 d = 2. / 3. * sin(theta) * a + 2. / 3. * sin(theta - 2. * M_PI / 3.) * b +
565 2. / 3. * sin(theta + 2. * M_PI / 3.) * c;
566 zero = 1. / 3. * a + 1. / 3. * b + 1. / 3. * c;
567
568 dq0vector << q, d, zero;
569
570 return dq0vector;
571}
572
574 Real d, Real zero) {
575
576 Matrix abcVector(3, 1);
577
578 Real a, b, c;
579
580 a = cos(theta) * q + sin(theta) * d + 1. * zero;
581 b = cos(theta - 2. * M_PI / 3.) * q + sin(theta - 2. * M_PI / 3.) * d +
582 1. * zero;
583 c = cos(theta + 2. * M_PI / 3.) * q + sin(theta + 2. * M_PI / 3.) * d +
584 1. * zero;
585
586 abcVector << a, b, c;
587
588 return abcVector;
589}
std::vector< Ptr > List
Definition Attribute.h:123
AttributePointer< Attribute< T > > Ptr
Definition Attribute.h:250
Matrix mIsr
Vector of stator and rotor currents.
Bool mHasTurbineGovernorType1
Determines if TurbineGovernorType1 is activated.
Real mTimeStep
Simulation time step.
Real mSystemOmega
Simulation angular system speed.
Real mRkq1
q-axis damper resistance 1 Rkq1 [Ohm]
Real mLmd
d-axis mutual inductance Lmd [H]
Real mBase_I
base stator current peak
Bool mHasExciter
Determines if Exciter is activated.
const Attribute< Real >::Ptr mMechTorque
mechanical torque
void setInitialValues(Real initActivePower, Real initReactivePower, Real initTerminalVolt, Real initVoltAngle, Real initMechPower)
Real mLmq
q-axis mutual inductance Lmq [H]
std::shared_ptr< Base::Exciter > mExciter
Signal component modelling voltage regulator and exciter.
SynchronGenerator(CPS::AttributeList::Ptr attributeList)
Constructor.
std::shared_ptr< Base::Turbine > mTurbine
Modular turbine (SteamTurbine / HydroTurbine)
Real mLlfd
field leakage inductance Llfd [H]
Bool mInitialValuesSet
Flag to remember when initial values are set.
Real mLlkd
d-axis damper leakage inductance Llkd [H]
Matrix mVsr
Vector of stator and rotor voltages.
Matrix mPsisr
Vector of stator and rotor fluxes.
Real mBase_Z
base stator impedance
const Attribute< Real >::Ptr mRs
stator resistance Rs [Ohm]
Matrix mResistanceMat
resistance matrix
Bool mHasGovernorAndTurbine
Determines if modular Governor + Turbine pair is activated.
std::shared_ptr< Base::PSS > mPSS
Power system stabilizer.
std::shared_ptr< Signal::TurbineGovernor > mTurbineGovernor
Signal component modelling governor control and steam turbine (legacy)
Real mLlkq1
q-axis damper leakage inductance 1 Llkq1 [H]
std::shared_ptr< Base::Governor > mGovernor
Modular governor (SteamTurbineGovernor / HydroTurbineGovernor)
void setBaseAndFundamentalPerUnitParameters(Real nomPower, Real nomVolt, Real nomFreq, Real nomFieldCur, Int poleNumber, Real Rs, Real Ll, Real Lmd, Real Lmq, Real Rfd, Real Llfd, Real Rkd, Real Llkd, Real Rkq1, Real Llkq1, Real Rkq2, Real Llkq2, Real inertia)
Initializes the base and fundamental machine parameters in per unit.
Real mRkd
d-axis damper resistance Rkd [Ohm]
Real mRfd
field resistance Rfd [Ohm]
Real mBase_OmElec
base electrical angular frequency
const Attribute< Real >::Ptr mLl
leakage inductance Ll [H]
Real mBase_OmMech
base mechanical angular frequency
Real mRkq2
q-axis damper resistance 2 Rkq2 [Ohm]
Bool mHasPSS
Determines if PSS is activated.
Int mNumDampingWindings
Number of damping windings in q.
Real mBase_V
base stator voltage (phase-to-ground peak)
Real mNomPower
nominal power Pn [VA]
void setBaseAndOperationalPerUnitParameters(Real nomPower, Real nomVolt, Real nomFreq, Int poleNumber, Real nomFieldCur, Real Rs, Real Ld, Real Lq, Real Ld_t, Real Lq_t, Real Ld_s, Real Lq_s, Real Ll, Real Td0_t, Real Tq0_t, Real Td0_s, Real Tq0_s, Real inertia)
const Attribute< Real >::Ptr mOmMech
rotor speed omega_r
Bool mHasTurbineGovernor
Determines if legacy TurbineGovernor is activated.
Real mLlkq2
q-axis damper leakage inductance 2 Llkq2 [H]
std::shared_ptr< Signal::TurbineGovernorType1 > mTurbineGovernorType1
Signal component modelling governor control and steam turbine (TurbineGovernorType1)
const Attribute< Real >::Ptr mInertia
inertia constant H [s] for per unit or moment of inertia J [kg*m^2]
const Attribute< Real >::Ptr mElecTorque
electrical torque
SynchronGeneratorVBR(String name, String uid, Logger::Level logLevel=Logger::Level::off)
Defines UID, name and logging level.
Real mPsikq1
Magnetizing flux linkage 1st damper winding q axis.
void setBaseAndFundamentalPerUnitParameters(Real nomPower, Real nomVolt, Real nomFreq, Int poleNumber, Real nomFieldCur, Real Rs, Real Ll, Real Lmd, Real Lmq, Real Rfd, Real Llfd, Real Rkd, Real Llkd, Real Rkq1, Real Llkq1, Real Rkq2, Real Llkq2, Real inertia)
Initializes the base and fundamental machine parameters in per unit.
Real mPsimd
Magnetizing flux linkage in d axis.
Real mVq
Interface voltage q component.
Real mV0
Interface voltage 0 component.
Matrix mConductanceMat
Equivalent Stator Conductance Matrix.
void initialize(Matrix frequencies) override
Initialize components with correct network frequencies.
void setBaseAndOperationalPerUnitParameters(Real nomPower, Real nomVolt, Real nomFreq, Int poleNumber, Real nomFieldCur, Real Rs, Real Ld, Real Lq, Real Ld_t, Real Lq_t, Real Ld_s, Real Lq_s, Real Ll, Real Td0_t, Real Tq0_t, Real Td0_s, Real Tq0_s, Real inertia)
MatrixFixedSize< 3, 3 > R_eq_vbr
Equivalent VBR Stator Resistance.
void mnaCompAddPreStepDependencies(AttributeBase::List &prevStepDependencies, AttributeBase::List &attributeDependencies, AttributeBase::List &modifiedAttributes) override
Add MNA pre step dependencies.
Real mId_hist
D axis stator current of from last time step.
void mnaCompPostStep(Real time, Int timeStepCount, Attribute< Matrix >::Ptr &leftVector) override
MNA post step operations.
MatrixFixedSize< 3, 3 > mKrs_teta
Park Transformation Matrix.
Real mPsikd
Magnetizing flux linkage damper winding d axis.
Matrix E_eq_vbr
Equivalent VBR Stator Voltage Source.
Real mPsifd
Magnetizing flux linkage excitation.
void mnaCompPreStep(Real time, Int timeStepCount) override
MNA pre step operations.
Real mIq
Interface current q component.
Real mIq_hist
Q axis stator current of from last time step.
Matrix inverseParkTransform(Real theta, Real q, Real d, Real zero)
Inverse Park transform as described in Krause.
MatrixFixedSize< 3, 3 > mKrs_teta_inv
Inverse Park Transformation Matrix.
void mnaCompInitialize(Real omega, Real timeStep, Attribute< Matrix >::Ptr leftVector) override
Initializes internal variables of the component.
Matrix mDqStatorCurrents
Dq stator current vector.
Real mPsimq
Magnetizing flux linkage in q axis.
void mnaCompApplyRightSideVectorStamp(Matrix &rightVector) override
Stamps right side (source) vector.
Matrix mISourceEq
Equivalent Stator Current Source.
void mnaCompAddPostStepDependencies(AttributeBase::List &prevStepDependencies, AttributeBase::List &attributeDependencies, AttributeBase::List &modifiedAttributes, Attribute< Matrix >::Ptr &leftVector) override
Add MNA post step dependencies.
Matrix parkTransform(Real theta, Real a, Real b, Real c)
Park transform as described in Krause.
Real mPsikq2
Magnetizing flux linkage 2nd damper winding q axis.
void setInitialValues(Real initActivePower, Real initReactivePower, Real initTerminalVolt, Real initVoltAngle, Real initMechPower)
Initialize states according to desired initial electrical powerflow and mechanical input power.
Real mId
Interface current d component.
Real mI0
Interface current 0 component.
void mnaCompApplySystemMatrixStamp(SparseMatrixRow &systemMatrix) override
Stamps system matrix.
void initializeFromNodesAndTerminals(Real frequency) override
Initializes component from power flow data.
void CalculateL()
Calculate inductance Matrix L and its derivative.
Real mVd
Interface voltage d component.
String uid()
Returns unique id.
AttributeList::Ptr mAttributes
Attribute List.
spdlog::level::level_enum Level
Definition Logger.h:33
static String complexToString(const Complex &num)
Definition Logger.cpp:63
static String phasorToString(const Complex &num)
Definition Logger.cpp:57
MNASimPowerComp(String uid, String name, Bool hasPreStep, Bool hasPostStep, Logger::Level logLevel)
Attribute< Matrix >::Ptr mRightVector
static void stamp3x3ConductanceMatrixNodeToGround(const Matrix &conductanceMat, SparseMatrixRow &mat, UInt nodeIndex, const Logger::Log &mSLog)
std::vector< std::pair< UInt, UInt > > mVariableSystemMatrixEntries
static Real realFromVectorElement(const Matrix &mat, Matrix::Index row)
static void setVectorElement(Matrix &mat, Matrix::Index row, Complex value, Int maxFreq=1, Int freqIdx=0, Matrix::Index colOffset=0)
Definition MathUtils.cpp:73
static Real phase(Complex value)
Definition MathUtils.cpp:23
static Real abs(Complex value)
Definition MathUtils.cpp:27
UInt matrixNodeIndex(UInt nodeIndex)
const Attribute< MatrixVar< Real > >::Ptr mIntfCurrent
virtual void initialize(Matrix frequencies)
Initialize components with correct network frequencies.
SimTerminal< Real >::Ptr terminal(UInt index)
const Attribute< MatrixVar< Real > >::Ptr mIntfVoltage
Bool terminalNotGrounded(UInt index)
Complex initialSingleVoltage(UInt index)
void setTerminalNumber(UInt num)
Logger::Log mSLog
Component logger.
#define PI
Definition Definitions.h:43
#define RMS3PH_TO_PEAK1PH
Definition Definitions.h:50
#define M_PI
Definition Definitions.h:41
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
Eigen::Matrix< Real, rows, cols, Eigen::ColMajor > MatrixFixedSize
Dense matrix for real numbers with fixed dimension.
double Real
Definition Definitions.h:62
int Int
Definition Definitions.h:61
unsigned int UInt
Definition Definitions.h:60
Eigen::SparseMatrix< Real, Eigen::RowMajor > SparseMatrixRow
Sparse matrix for real numbers (row major).
Definition Definitions.h:74