DPsim
Loading...
Searching...
No Matches
SteamTurbine.cpp
1// SPDX-FileCopyrightText: 2026 Institute for Automation of Complex Power Systems, EONERC, RWTH Aachen University
2// SPDX-License-Identifier: MPL-2.0
3
4#include <dpsim-models/Signal/SteamTurbine.h>
5
6using namespace CPS;
7using namespace CPS::Signal;
8
9Signal::SteamTurbine::SteamTurbine(const String &name,
10 CPS::Logger::Level logLevel)
11 : SimSignalComp(name, name, logLevel),
12 mPhp(mAttributes->create<Real>("Php")),
13 mPip(mAttributes->create<Real>("Pip")),
14 mPlp(mAttributes->create<Real>("Plp")),
15 mPm(mAttributes->create<Real>("Pm")) {}
16
17void SteamTurbine::setParameters(
18 std::shared_ptr<Base::TurbineParameters> parameters) {
19 auto params =
20 std::dynamic_pointer_cast<Signal::SteamTurbineParameters>(parameters);
21 if (!params) {
22 SPDLOG_LOGGER_ERROR(
23 mSLog,
24 "Type of parameters class of {} has to be SteamTurbineParameters!",
25 this->name());
26 throw CPS::TypeException();
27 }
28 Real fractionSum = params->Fhp + params->Fip + params->Flp;
29 if (std::abs(fractionSum - 1.0) > 1e-9) {
30 SPDLOG_LOGGER_ERROR(
31 mSLog,
32 "The sum of power fractions Fhp+Fip+Flp of steam turbine {} must equal "
33 "1 (got {:f})",
34 this->name(), fractionSum);
35 throw CPS::InvalidArgumentException();
36 }
37 mParameters = params;
38
39 SPDLOG_LOGGER_INFO(mSLog,
40 "Steam turbine parameters:"
41 "\nFhp: {:e}"
42 "\nFip: {:e}"
43 "\nFlp: {:e}"
44 "\nTch: {:e}"
45 "\nTrh: {:e}"
46 "\nTco: {:e}",
47 mParameters->Fhp, mParameters->Fip, mParameters->Flp,
48 mParameters->Tch, mParameters->Trh, mParameters->Tco);
49 mSLog->flush();
50}
51
53 if (Pminit < 0 || Pminit > 1) {
54 SPDLOG_LOGGER_ERROR(
55 mSLog,
56 "Initial mechanical power of steam turbine {} must be in [0, 1] pu",
57 this->name());
59 }
60 **mPhp = Pminit;
61 **mPip = Pminit;
62 **mPlp = Pminit;
63 **mPm = Pminit;
64 mPhp_next = Pminit;
65 mPip_next = Pminit;
66 mPlp_next = Pminit;
67
68 SPDLOG_LOGGER_INFO(mSLog,
69 "Turbine initial values:"
70 "\nPhp: {:f}"
71 "\nPip: {:f}"
72 "\nPlp: {:f}"
73 "\nPm: {:f}",
74 **mPhp, **mPip, **mPlp, **mPm);
75 mSLog->flush();
76}
77
78Real SteamTurbine::step(Real Pgv, Real dt) {
79 // Shift next-step staging into current
80 **mPhp = mPhp_next;
81 **mPip = mPip_next;
82 **mPlp = mPlp_next;
83
84 // High-pressure stage
85 if (mParameters->Tch == 0)
86 **mPhp = Pgv;
87 else
88 mPhp_next = **mPhp + (dt / mParameters->Tch) * (Pgv - **mPhp);
89
90 // Intermediate-pressure stage
91 if (mParameters->Trh == 0)
92 **mPip = **mPhp;
93 else
94 mPip_next = **mPip + (dt / mParameters->Trh) * (**mPhp - **mPip);
95
96 // Low-pressure stage
97 if (mParameters->Tco == 0)
98 **mPlp = **mPip;
99 else
100 mPlp_next = **mPlp + (dt / mParameters->Tco) * (**mPip - **mPlp);
101
102 **mPm = mParameters->Fhp * **mPhp + mParameters->Fip * **mPip +
103 mParameters->Flp * **mPlp;
104
105 return **mPm;
106}
void initializeStates(Real Pminit) final
Set steady-state initial values (call after setParameters, before first step)
Real step(Real Pgv, Real dt) final
Step the turbine with valve/gate opening Pgv and return mechanical power Pm.
Logger::Log mSLog
Component logger.