65 if (Math::abs(**
mRatio) < 1.) {
67 std::shared_ptr<SimTerminal<Real>> tmp =
mTerminals[0];
73 SPDLOG_LOGGER_INFO(
mSLog,
"Switching terminals to have first terminal at "
74 "higher voltage side. Updated parameters: ");
76 mSLog,
"Nominal Voltage End 1 = {} [V] Nominal Voltage End 2 = {} [V]",
78 SPDLOG_LOGGER_INFO(
mSLog,
"Tap Ratio = {} [ ] Phase Shift = {} [deg]",
86 Real omega = 2. * PI * frequency;
87 MatrixComp impedance = MatrixComp::Zero(3, 3);
98 SPDLOG_LOGGER_INFO(
mSLog,
99 "Resistance (referred to higher voltage side) = {} [Ohm]",
101 SPDLOG_LOGGER_INFO(
mSLog,
102 "Inductance (referred to higher voltage side) = {} [H]",
104 SPDLOG_LOGGER_INFO(
mSLog,
105 "Reactance (referred to higher voltage side) = {} [Ohm]",
108 MatrixComp vInitABC = MatrixComp::Zero(3, 1);
111 (
mVirtualNodes[0]->initialSingleVoltage() - initialSingleVoltage(0));
112 vInitABC(1, 0) = vInitABC(0, 0) * SHIFT_TO_PHASE_B;
113 vInitABC(2, 0) = vInitABC(0, 0) * SHIFT_TO_PHASE_C;
115 MatrixComp iInit = impedance.inverse() * vInitABC;
121 std::make_shared<EMT::Ph3::Inductor>(**
mName +
"_ind",
mLogLevel);
124 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
127 mVirtualNodes[2]->setInitialVoltage(initialSingleVoltage(0));
129 std::make_shared<EMT::Ph3::Resistor>(**
mName +
"_res",
mLogLevel);
131 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
145 mSnubberResistance1 =
148 std::make_shared<EMT::Ph3::Resistor>(**
mName +
"_snub_res1",
mLogLevel);
149 mSubSnubResistor1->setParameters(mSnubberResistance1);
150 mSubSnubResistor1->connect({
node(0), EMT::SimNode::GND});
153 "Snubber Resistance 1 (connected to higher voltage side {}) = {} [Ohm]",
154 node(0)->name(), Logger::matrixToString(mSnubberResistance1));
156 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
157 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
161 mSnubberResistance2 =
164 std::make_shared<EMT::Ph3::Resistor>(**
mName +
"_snub_res2",
mLogLevel);
165 mSubSnubResistor2->setParameters(mSnubberResistance2);
166 mSubSnubResistor2->connect({
node(1), EMT::SimNode::GND});
169 "Snubber Resistance 2 (connected to lower voltage side {}) = {} [Ohm]",
170 node(1)->name(), Logger::matrixToString(mSnubberResistance2));
172 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
173 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
185 Real snubberCapacitance2 =
187 mSnubberCapacitance2 =
190 std::make_shared<EMT::Ph3::Capacitor>(**
mName +
"_snub_cap2",
mLogLevel);
191 mSubSnubCapacitor2->setParameters(mSnubberCapacitance2);
192 mSubSnubCapacitor2->connect({
node(1), EMT::SimNode::GND});
195 "Snubber Capacitance 2 (connected to lower voltage side {}) = {} [F]",
196 node(1)->name(), Logger::matrixToString(mSnubberCapacitance2));
198 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
199 MNA_SUBCOMP_TASK_ORDER::TASK_BEFORE_PARENT,
true);
202 SPDLOG_LOGGER_INFO(
mSLog,
"Electrical subcomponents: ");
204 SPDLOG_LOGGER_INFO(
mSLog,
"- {}", subcomp->name());
206 subcomp->initializeFromNodesAndTerminals(frequency);
211 "\n--- Initialization from powerflow ---"
212 "\nVoltage across: {:s}"
214 "\nTerminal 0 voltage: {:s}"
215 "\nTerminal 1 voltage: {:s}"
216 "\nVirtual Node 1 voltage: {:s}"
217 "\n--- Initialization from powerflow finished ---",
220 Logger::phasorToString(RMS3PH_TO_PEAK1PH * initialSingleVoltage(0)),
221 Logger::phasorToString(RMS3PH_TO_PEAK1PH * initialSingleVoltage(1)),
222 Logger::phasorToString(RMS3PH_TO_PEAK1PH *
237 SparseMatrixRow &systemMatrix) {
239 if (terminalNotGrounded(0)) {
240 Math::setMatrixElement(
241 systemMatrix,
mVirtualNodes[0]->matrixNodeIndex(PhaseType::A),
243 Math::setMatrixElement(
244 systemMatrix,
mVirtualNodes[0]->matrixNodeIndex(PhaseType::B),
246 Math::setMatrixElement(
247 systemMatrix,
mVirtualNodes[0]->matrixNodeIndex(PhaseType::C),
250 Math::setMatrixElement(systemMatrix,
253 Math::setMatrixElement(systemMatrix,
256 Math::setMatrixElement(systemMatrix,
260 if (terminalNotGrounded(1)) {
261 Math::setMatrixElement(systemMatrix, matrixNodeIndex(1, 0),
264 Math::setMatrixElement(systemMatrix, matrixNodeIndex(1, 1),
267 Math::setMatrixElement(systemMatrix, matrixNodeIndex(1, 2),
270 Math::setMatrixElement(systemMatrix,
272 matrixNodeIndex(1, 0), -(**mRatio).real());
273 Math::setMatrixElement(systemMatrix,
275 matrixNodeIndex(1, 1), -(**mRatio).real());
276 Math::setMatrixElement(systemMatrix,
278 matrixNodeIndex(1, 2), -(**mRatio).real());
283 if (
auto mnasubcomp = std::dynamic_pointer_cast<MNAInterface>(subcomp))
284 mnasubcomp->mnaApplySystemMatrixStamp(systemMatrix);
286 if (terminalNotGrounded(0)) {
287 SPDLOG_LOGGER_INFO(
mSLog,
"Add {:s} to system at ({:d},{:d})",
288 Logger::complexToString(Complex(-1.0, 0)),
291 SPDLOG_LOGGER_INFO(
mSLog,
"Add {:s} to system at ({:d},{:d})",
292 Logger::complexToString(Complex(-1.0, 0)),
295 SPDLOG_LOGGER_INFO(
mSLog,
"Add {:s} to system at ({:d},{:d})",
296 Logger::complexToString(Complex(-1.0, 0)),
300 SPDLOG_LOGGER_INFO(
mSLog,
"Add {:s} to system at ({:d},{:d})",
301 Logger::complexToString(Complex(1.0, 0)),
304 SPDLOG_LOGGER_INFO(
mSLog,
"Add {:s} to system at ({:d},{:d})",
305 Logger::complexToString(Complex(1.0, 0)),
308 SPDLOG_LOGGER_INFO(
mSLog,
"Add {:s} to system at ({:d},{:d})",
309 Logger::complexToString(Complex(1.0, 0)),
313 if (terminalNotGrounded(1)) {
314 SPDLOG_LOGGER_INFO(
mSLog,
"Add {:s} to system at ({:d},{:d})",
315 Logger::complexToString(**
mRatio), matrixNodeIndex(1, 0),
317 SPDLOG_LOGGER_INFO(
mSLog,
"Add {:s} to system at ({:d},{:d})",
318 Logger::complexToString(**
mRatio), matrixNodeIndex(1, 1),
320 SPDLOG_LOGGER_INFO(
mSLog,
"Add {:s} to system at ({:d},{:d})",
321 Logger::complexToString(**
mRatio), matrixNodeIndex(1, 2),
324 SPDLOG_LOGGER_INFO(
mSLog,
"Add {:s} to system at ({:d},{:d})",
325 Logger::complexToString(-**
mRatio),
327 matrixNodeIndex(1, 0));
328 SPDLOG_LOGGER_INFO(
mSLog,
"Add {:s} to system at ({:d},{:d})",
329 Logger::complexToString(-**
mRatio),
331 matrixNodeIndex(1, 1));
332 SPDLOG_LOGGER_INFO(
mSLog,
"Add {:s} to system at ({:d},{:d})",
333 Logger::complexToString(-**
mRatio),
335 matrixNodeIndex(1, 2));