Add a simple nuclear plant performance and cost model#538
Add a simple nuclear plant performance and cost model#538johnjasa wants to merge 17 commits intoNatLabRockies:developfrom
Conversation
elenya-grant
left a comment
There was a problem hiding this comment.
Nice clean PR! Thanks John! I have one question that I'd be interested in your response on (related to the cost model) before approving but it looks good!
| Args: | ||
| system_capacity_mw (float): Rated electric capacity in MW. | ||
| reactor_type (str): Key selecting a reactor type in type_costs. | ||
| type_costs (dict): Reactor type cost data with keys: |
There was a problem hiding this comment.
Why have type_costs as a dict instead of having the keys in type_costs be attributes of NuclearCostModelConfig? I understand the convince of having different costs dictionaries in the tech config so that the costs can be easily changed by just changing the reactor_type.
Alternatives to the imbedded dictionaries would be to use the modify_tech_config function or having a different file set-up where it's easy to switch the cost parameters.
I'm just curious - not necessarily asking for a change.
There was a problem hiding this comment.
You know what, I don't think there's a great reason to have the costs specified differently here. I've made them directly part of the cost config. Thanks for the good question! I think it was just a holdover in logic from me trying out different reactor_types, which should be handled at the config level instead.
| # array of arrays containing left-to-right technology | ||
| # interconnections; can support bidirectional connections | ||
| # with the reverse definition. | ||
| # this will naturally grow as we mature the interconnected tech |
There was a problem hiding this comment.
thanks for cleaning up this example file!
elenya-grant
left a comment
There was a problem hiding this comment.
Thanks for the quick change!
| system_capacity_mw (float): Rated electric capacity in MW. | ||
| capex_per_kw (float): Capital cost per kW. | ||
| fixed_opex_per_kw_year (float): Fixed O&M per kW per year. | ||
| variable_opex_per_mwh (float): Variable O&M per MWh. |
There was a problem hiding this comment.
thanks for updating this!
jaredthomas68
left a comment
There was a problem hiding this comment.
Looks pretty good. I just have a few comments to be addressed.
docs/technology_models/nuclear.md
Outdated
| C_{\text{capex}} = (c_{\text{capex}} \cdot (P / P_{\text{ref}})^{(e-1)}) \cdot P | ||
| $$ | ||
|
|
||
| Where $c_{\text{capex}}$ is `capex_per_kw`, $P$ is plant capacity (kW), $P_{\text{ref}}$ is `reference_capacity_mw`, and $e$ is `capex_scaling_exponent`. |
There was a problem hiding this comment.
I would avoid using
docs/technology_models/nuclear.md
Outdated
| Cost defaults are intended to be populated from literature, such as Quinn et al. (2023) on SMR LWR techno-economic analysis. | ||
| See the paper here: https://doi.org/10.1016/j.apenergy.2023.120669. |
There was a problem hiding this comment.
I suggest using markdown reference here linking to the reference given at the bottom and moving the url to the references section.
docs/user_guide/model_overview.md
Outdated
| + `'NaturalGasCostModel'` | ||
| - `nuclear`: nuclear power plant | ||
| - performance models: | ||
| + `'NuclearPerformanceModel'` |
There was a problem hiding this comment.
Would it make since to delineate this as the QuinnNuclearPerformanceModel or something similar to make room for future nuclear models?
| prob.set_val("system_capacity", system_capacity) | ||
| prob.set_val("electricity_out", electricity_out) | ||
| prob.run_model() | ||
|
|
||
| capex = prob.get_val("CapEx")[0] | ||
| opex = prob.get_val("OpEx")[0] | ||
| cost_year = prob.get_val("cost_year") |
There was a problem hiding this comment.
Can you specify units here?
|
|
||
| The model limits output by a fixed capacity factor and optional demand profile. | ||
|
|
||
| Based on Quinn, J. et al., 2023. |
There was a problem hiding this comment.
Thanks for including the source in the doc string
| capex_scaling_exponent = self.config.capex_scaling_exponent | ||
|
|
||
| system_capacity_mw = inputs["system_capacity"] | ||
| capacity_kw = system_capacity_mw * 1000 |
There was a problem hiding this comment.
Why use MW in inputs if you later convert to kW? Given that most other techs use kW, it may make more sense. Non-blocking.
There was a problem hiding this comment.
Good call, modified!
Add a simple nuclear plant performance and cost model
We often get asked if we have a nuclear plant model in H2I.
This PR introduces an extremely simple model based on Quinn et al.
This model only produces electricity and outputs costs based on scaling factors.
It's up to the user to use reasonable cost inputs; there are no defaults assumed here.
Because of this generality, this plant could be seen as LWR or SMR or any other architecture.
Section 1: Type of Contribution
Section 3: General PR Checklist
docs/files are up-to-date, or added when necessaryCHANGELOG.mdhas been updated to describe the changes made in this PRSection 3: Related Issues
Section 4: Impacted Areas of the Software
Section 5: Additional Supporting Information
Section 6: Test Results, if applicable
Section 7 (Optional): New Model Checklist
docs/developer_guide/coding_guidelines.mdattrsclass to define theConfigto load in attributes for the modelBaseConfigorCostModelBaseConfiginitialize()method,setup()method,compute()methodCostModelBaseClasssupported_models.pycreate_financial_modelinh2integrate_model.pydocs/user_guide/model_overview.mddocs/section<model_name>.mdis added to the_toc.yml