Add multi-unit combined cycle gas turbine component#232
Add multi-unit combined cycle gas turbine component#232jfrederik-nrel wants to merge 46 commits intoNatLabRockies:developfrom
Conversation
|
The only problem is that we currently do not define the fuel usage independently. Instead, the fuel usage is determined using the efficiency table and the power production, so it is a bit of a chicken or egg story in that sense. I think the easiest solution would be to have the efficiency linked to the state of the thermal unit. If it's off, efficiency is NaN, if its starting up (burning fuel but not producing energy yet), it is 0, and finally, if it is producing energy, we use the interpolation we use now. |
|
Ah good point, yes, that makes sense! |
|
The latest commit does exactly that @misi9170. This is what the efficiency look like now:
I feel like this still isn't perfect, but it might be sufficient for now. Two notes:
|
|
In the latest commit, I ended up choosing a middle way between both methods. It now uses some if-else logic to determine the efficiency based on the state of the gas and steam unit. I honestly don't love this solution, but believe it's currently the best way to model the efficiency given the limitations of the framework (see issue #234). |
|
@genevievestarke @dzalkind it's ready for review now. I would particularly recommend taking a look at the new tests I formulated as this was a first time for me. |
|
Very nice contribution, @jfrederik-nrel! Which PR should this follow? #224? Should #225 also be included? This might help the comparison in the meantime: https://github.com/misi9170/hercules/compare/feature/mm-thermal...jfrederik-nrel:hercules:feature/mu_ccgt?expand=1 |
docs/steam_turbine.md
Outdated
| | Power Fraction | HHV Net Efficiency | | ||
| |---------------|-------------------| | ||
| | 1.00 | 0.35 (35%) | | ||
| | 0.5o | 0.32 (32%) | |
There was a problem hiding this comment.
Possibly just a typo with 0.5o
| - file: thermal_component_base | ||
| - file: open_cycle_gas_turbine | ||
| - file: steam_turbine | ||
| - file: combined_cycle_plant |
There was a problem hiding this comment.
I'm not seeing this combined_cycle_plant.md file in docs
| "For the combined cycle plant, one of the units must be an open cycle gas turbine." | ||
| ) | ||
|
|
||
| if len(generic_units) != 2: |
There was a problem hiding this comment.
We may want to relax this constraint in some cases in the future, where multiple gas generators could be combined to feed a steam unit. We can probably work around this for now.
Will the code break in this case? I'm not sure we should change it now, but it might be good to know in the future.
There was a problem hiding this comment.
Yes, I was thinking about that too. What I think I will try to do on the short term (though perhaps not in this PR) is allow at least 2 (or perhaps more? From what I can find, 2 is currently the max) gas units powering a single steam unit. I don't think that would break anything, but definitely not excluding the possibility that it causes complications that I'm currently not overseeing.
|
|
||
| # Update h_dict with outputs | ||
| h_dict[self.component_name]["power"] = self.power_output | ||
| # h_dict[self.component_name]["state"] = self.state.value |
There was a problem hiding this comment.
Do you want the state or is it not needed because each unit has its own state?
There was a problem hiding this comment.
Each unit has it's own state. We would need to define a new state machine for the combined unit as it has complicated combined states like "gas turbine on, steam turbine off". I refrained from doing that and just left it at each unit having its own state
| return h_dict | ||
|
|
||
| def control(self, power_setpoint): | ||
| """""" |
There was a problem hiding this comment.
Maybe denote that this is the control of the combined plant?
| 1 - self.gas_power_ratio | ||
| ) * power_setpoint | ||
|
|
||
| # TODO: we probably want to add an actual controller for the gas turbine |
There was a problem hiding this comment.
It looks like you did this TODO?
There was a problem hiding this comment.
No I didn't. I meant that right now it uses the basic _control logic defined in the thermal_component_base class, as there is no control method defined in the open_cycle_gas_turbine class. What I meant here is that we might want to add that at some point, or else rename _control in thermal_component_base to control.
dzalkind
left a comment
There was a problem hiding this comment.
Overall, this looks good to me. Nice job!
I like the power set point input addition. It might be nice to have that documented for future reference, along with making sure your new docs are included.
Otherwise, I left some small comments in the files; they are pretty minor and often for my understanding.

Work in progress. Still to do:
feature/mm-thermalback inNo reviews necessary yet at this time.