Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
425d958
New updates to the nuclear thermal plant model
Apr 14, 2026
3d0af8e
Updates including test location, but test is not ready to be run yet
Apr 21, 2026
902d1ee
Updates with separate nuclear, HTSE, definitions but intending to hav…
Apr 28, 2026
6c8dd2a
May 12 update to nuclear and HTSE new models
May 12, 2026
3831202
Updates to the nuclear-htse system with the new configuration startin…
May 14, 2026
5d148ee
A couple more adjustments that should allow for the HTSE unit to demo…
May 14, 2026
13f00c2
merge in nuclear+htse branch
jaredthomas68 May 19, 2026
7df8f82
update for current h2i develop
jaredthomas68 May 19, 2026
9978339
merge in develop
jaredthomas68 May 19, 2026
fee9c51
Merge pull request #2 from jaredthomas68/nuchtse-develop
mikkdm May 19, 2026
6c4bd73
Merge branch 'nuchtse-develop' into nuchtse
jaredthomas68 May 19, 2026
e123155
Merge pull request #3 from jaredthomas68/nuchtse
mikkdm May 19, 2026
d3bdb24
updates to work with new changes to H2I
jaredthomas68 Jun 11, 2026
a10669f
Merge pull request #5 from jaredthomas68/nucdev
mikkdm Jun 11, 2026
d357dca
add test
jaredthomas68 Jun 11, 2026
5b7b812
Merge branch 'develop' into nucdev
jaredthomas68 Jun 16, 2026
6d6011a
Merge pull request #6 from jaredthomas68/nucdev
mikkdm Jun 16, 2026
8bdbbe3
update naming and units
jaredthomas68 Jun 17, 2026
bba9f26
Merge branch 'develop' into nucdev
jaredthomas68 Jun 23, 2026
0082741
update test value since the original test value came from running an …
jaredthomas68 Jun 23, 2026
4c5f108
Merge pull request #7 from jaredthomas68/nucdev
mikkdm Jun 23, 2026
1cc6659
Some modifiers on nuclear units, and step changes to update HTSE unit
Jun 24, 2026
d3580f9
HTSE and nuclear model updates, HTSE system now outputs consumed elec…
Jun 25, 2026
ccb37ef
Continued updates
Jun 25, 2026
972519d
Nuclear & HTSE updates, along with test value updated
Jun 25, 2026
943bd3d
updated heat demand to piont at hydrogen_demand, which can be dynamic…
Jun 25, 2026
2deb7c7
Merge branch 'develop' into main
johnjasa Jul 7, 2026
32b4647
Adding figures to documentation on the thermal nuclear and HTSE models.
Jul 8, 2026
693c943
Simplified documentation files
Jul 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 177 additions & 0 deletions docs/technology_models/h2_htse.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
# High-Temperature Steam Electrolysis (HTSE) Model

The HTSE model in H2Integrate represents hydrogen production from high-temperature steam electrolysis using electricity and thermal input. It is implemented as two components:

- `HTSEPerformanceModel`
- `HTSECostModel`

The performance model converts electricity and heat into hydrogen, water demand, and operating signals for connected technologies. The cost model computes installed capital cost and fixed operating cost from installed HTSE size.

## Model Overview

This is a simplified HTSE representation with constant nominal specific energy requirements:

- `nominal_electricity_required` in `kWh/kg`
- `nominal_heat_required` in `kWh/kg`

At each timestep, hydrogen production is determined from:

- installed HTSE size
- available `electricity_in`
- available `heat_in`
- optional `hydrogen_command_value` when system-level control is enabled
- turndown behavior

The model also exposes internal operating signals that are useful for coupled systems, including:

- `heat_demand`
- `electricity_demand`
- `electricity_consumed`
- `water_demand`

```{note}
The current implementation uses `electricity_demand` to report installed electrical demand equal to nameplate size, while `electricity_consumed` reports the timestep electricity required by the energy balance. For coupled analyses, `electricity_consumed` is the more literal consumption signal.
```

## Performance Model

Use this model by setting:

- performance model: `HTSEPerformanceModel`

The HTSE performance model inherits from the electrolyzer base classes, so it is treated as a hydrogen-producing, dispatchable technology with an `electricity_in` input and a `hydrogen_out` output.

```{figure} images/HTSE.png
:alt: HTSE schematic
:width: 100%
:align: center
```

### Performance configuration parameters

These are read from `performance_parameters` and `shared_parameters`.

| Key | Type | Units | Description |
| --- | --- | --- | --- |
| `n_clusters` | int | unitless | Number of HTSE clusters. |
| `cluster_rating_MW` | float | MW | Nameplate electrical rating per cluster. |
| `nominal_heat_required` | float | kWh/kg | Nominal thermal energy required per kg of hydrogen. |
| `nominal_electricity_required` | float | kWh/kg | Nominal electrical energy required per kg of hydrogen. |
| `turndown_ratio` | float | unitless | Minimum fraction of rated hydrogen production required to stay on. |
| `location` | str | n/a | `onshore` or `offshore`. Present in config but not used directly in the current performance calculation. |
| `eol_eff_percent_loss` | float | percent | End-of-life efficiency loss setting. Present in config but not used directly in the current timestep energy balance. |
| `uptime_hours_until_eol` | int | h | Hours of operation between replacement events. |
| `include_degradation_penalty` | bool | n/a | Present in config but not used directly in the current timestep energy balance. |
| `pressure_H2` | float | n/a | Hydrogen pressure setting. Present in config but not used directly in the current timestep energy balance. |
| `size_mode` | str | n/a | Optional resizing mode inherited from the resizeable performance base class. |
| `flow_used_for_sizing` | str | n/a | Required for non-default sizing modes. |
| `max_feedstock_ratio` | float | unitless | Used when `size_mode = resize_by_max_feedstock`. |
| `max_commodity_ratio` | float | unitless | Used when `size_mode = resize_by_max_commodity`. |

### Performance inputs

| Name | Shape | Units | Description |
| --- | --- | --- | --- |
| `electricity_in` | array[n_timesteps] | kW | Available electrical input. Added by the electrolyzer base class. |
| `heat_in` | array[n_timesteps] | kW | Available thermal input. |
| `n_clusters` | scalar | unitless | Number of HTSE clusters used to determine installed size. |
| `cluster_size` | scalar | MW | Declared input in the component. Currently not used in the timestep calculation. |
| `max_hydrogen_capacity` | scalar | kg/h | Used in resize-by-commodity sizing mode. |
| `hydrogen_command_value` | array[n_timesteps] | kg/h | Optional hydrogen demand signal when `system_level_control` is enabled. |
| `max_feedstock_ratio` | scalar | unitless | Inherited optional resize input. |
| `max_commodity_ratio` | scalar | unitless | Inherited optional resize input. |

### Performance outputs

| Name | Shape | Units | Description |
| --- | --- | --- | --- |
| `hydrogen_out` | array[n_timesteps] | kg/h | Hydrogen production. |
| `rated_hydrogen_production` | scalar | kg/h | Rated hydrogen output based on installed electrical size and `nominal_electricity_required`. |
| `total_hydrogen_produced` | scalar | kg | Hydrogen produced over the simulated period. |
| `annual_hydrogen_produced` | array[plant_life] | kg/year | Annualized hydrogen production repeated across plant life. |
| `capacity_factor` | array[plant_life] | unitless | Simulated production relative to rated production. |
| `electrolyzer_size_mw` | scalar | MW | Installed HTSE electrical nameplate size. |
| `heat_demand` | array[n_timesteps] | kW | Requested HTSE thermal demand based on hydrogen demand. |
| `electricity_demand` | array[n_timesteps] | kW | Reported electrical demand signal. In the current implementation this is set to installed electrical size in kW. |
| `electricity_consumed` | array[n_timesteps] | kW | Electricity required by the current energy balance calculation. |
| `water_demand` | array[n_timesteps] | kg/h | Water consumption based on hydrogen production stoichiometry. |
| `efficiency` | scalar | unitless | Mean ratio of utilized input energy to available input energy over the simulation. |
| `replacement_schedule` | array[plant_life] | unitless | Replacement events derived from `uptime_hours_until_eol`. |
| `time_until_replacement` | scalar | h | Hours until replacement. |

### Dispatch and sizing behavior

Installed size is first inferred from:

$$
\text{electrolyzer\_size\_mw} = n_{clusters} \times cluster\_rating\_MW
$$

The model supports additional sizing modes inherited from the resizeable performance base class:

- `normal`
- `resize_by_max_feedstock`
- `resize_by_max_commodity`

In the current implementation:

- `resize_by_max_feedstock` supports sizing from `electricity`
- `resize_by_max_commodity` supports sizing from `hydrogen`

When system-level control is enabled, hydrogen demand is taken from `hydrogen_command_value`. Otherwise, the model assumes demand equal to rated hydrogen production implied by installed electrical size.

### Energy balance behavior

The model forms:

$$
\text{total\_specific\_energy} = nominal\_heat\_required + nominal\_electricity\_required
$$

and computes a nominal heat-to-electricity ratio:

$$
\text{ratio\_heat\_elec\_nom} = \frac{nominal\_heat\_required}{nominal\_electricity\_required}
$$

Available heat is used first up to the requested `heat_demand`. The remaining required energy is supplied electrically when possible. Hydrogen production is then limited by the combined energy available and by the turndown threshold.

```{note}
The current implementation is intentionally simple and should be interpreted as a reduced-order plant representation, not a detailed SOEC stack model with thermal transients, degradation coupling, startup dynamics, or detailed balance-of-plant behavior.
```

## Cost Model

Use this model by setting:

- cost model: `HTSECostModel`

The cost model is size-based and currently depends only on installed HTSE size.

### Cost configuration parameters

| Key | Type | Units | Description |
| --- | --- | --- | --- |
| `unit_capex` | float | USD/kW | Installed capital cost per kW of HTSE electrical size. |
| `fixed_opex` | float, optional | USD/(kW*year) | Fixed annual operating cost per kW. |
| `fixed_capex` | float, optional | USD/(kW*year) | Fallback value used to populate `fixed_opex` if `fixed_opex` is omitted. |
| `cost_year` | int | year | Dollar year of the cost inputs. Defaults to `2025`. |

### Cost inputs

| Name | Shape | Units | Description |
| --- | --- | --- | --- |
| `electrolyzer_size_mw` | scalar | MW | Installed HTSE size from the performance model. |
| `total_hydrogen_produced` | scalar | kg | Added by the electrolyzer cost base class, but not used directly in the current HTSE cost calculation. |
| `electricity_in` | array[n_timesteps] | kW | Added by the electrolyzer cost base class, but not used directly in the current HTSE cost calculation. |

### Cost outputs

| Name | Shape | Units | Description |
| --- | --- | --- | --- |
| `CapEx` | scalar | USD | `unit_capex * electrolyzer_size_kw` |
| `OpEx` | scalar | USD/year | `fixed_opex * electrolyzer_size_kw` |
| `VarOpEx` | array[plant_life] | USD/year | Inherited base output. The current model does not set a nonzero variable operating cost. |
| `cost_year` | scalar | year | Cost dollar year. |


Binary file added docs/technology_models/images/HTSE.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
93 changes: 46 additions & 47 deletions docs/technology_models/nuclear.md
Original file line number Diff line number Diff line change
@@ -1,83 +1,81 @@
# Nuclear power plant model
# Nuclear power plant models

The nuclear power plant model provides a simple, size-based performance model and a type-based cost model.
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: [Quinn et al. (2023)](#references).
H2Integrate currently includes two nuclear converter options:

To use this model, set the performance model to `QuinnNuclearPerformanceModel` and the cost model to `QuinnNuclearCostModel` in your `tech_config`.
- `QuinnNuclearPerformanceModel` with `QuinnNuclearCostModel` for a simple electricity-only nuclear plant
- `SimpleThermalNuclearReactorPerformanceModel` with `SimpleThermalNuclearReactorCostModel` for a thermal reactor that can trade off electricity production and process heat delivery

## Performance model
The first model is based on Quinn et al. (2023). The second is a simplified thermal reactor representation intended for coupled workflows such as nuclear plus HTSE.

The performance model limits electricity production by the rated capacity and an optional demand signal.
## Quinn electricity-only nuclear model

Use this model by setting:

- performance model: `QuinnNuclearPerformanceModel`
- cost model: `QuinnNuclearCostModel`

### Performance behavior

This model produces electricity only. It clips the commanded electricity output to the rated plant capacity and reports aggregate production metrics.

**Inputs**

| Name | Shape | Units | Description |
| --- | --- | --- | --- |
| `system_capacity` | scalar | kW | Rated electrical capacity. |
| `electricity_set_point` | array[n_timesteps] | kW | Optional set point profile; defaults to rated capacity. |
| `electricity_command_value` | array[n_timesteps] | kW | Requested electrical output profile. Defaults to `system_capacity`. |

**Outputs**

| Name | Shape | Units | Description |
| --- | --- | --- | --- |
| `electricity_out` | array[n_timesteps] | kW | Electricity produced, capped at `system_capacity`. |
| `rated_electricity_production` | scalar | kW | Rated production (capacity). |
| `total_electricity_produced` | scalar | kW*h | Sum of production over the simulation. |
| `annual_electricity_produced` | array[plant_life] | kW*h/year | Annualized production. |
| `capacity_factor` | array[plant_life] | unitless | Ratio of actual to maximum production. |
| `replacement_schedule` | array[plant_life] | unitless | Placeholder replacement schedule (zeros). |
| `operational_life` | scalar | yr | Operational life (defaults to plant life). |
| `electricity_out` | array[n_timesteps] | kW | Electricity output after clipping to capacity. |
| `rated_electricity_production` | scalar | kW | Rated plant capacity. |
| `total_electricity_produced` | scalar | kW*h | Electricity produced over the simulated period. |
| `annual_electricity_produced` | scalar | kW*h/year | Annualized electricity production. |
| `capacity_factor` | scalar | unitless | Simulated production divided by maximum possible production. |

## Cost model
### Cost behavior

The cost model uses direct cost parameters to compute capital and operating costs.
It supports optional scaling of capex with size using a reference capacity and scaling exponent.
The cost model applies:

**Inputs**
| Name | Shape | Units | Description |
| --- | --- | --- | --- |
| `system_capacity` | scalar | kW | Plant capacity used for cost scaling. |
| `electricity_out` | array[n_timesteps] | kW | Output from performance model. |
- capital cost from `capex_per_kw`
- fixed O&M from `fixed_opex_per_kw_year`
- variable O&M from `variable_opex_per_mwh`
- optional capex scaling using `reference_capacity_kw` and `capex_scaling_exponent`

**Cost parameters**

**Cost parameters (tech_config)**
| Key | Type | Description |
| --- | --- | --- |
| `system_capacity_kw` | float | Rated electrical capacity (kW). |
| `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. |
| `reference_capacity_kw` | float | Reference capacity for capex scaling (defaults to `system_capacity_kw`). |
| `capex_scaling_exponent` | float | Capex scaling exponent (defaults to 1.0). |
| `cost_year` | int | Dollar year for the input costs. |

The capex calculation follows:

$$
C_{\text{capex}} = (c_{\text{capex}} \cdot (P / P_{\text{ref}})^{(k-1)}) \cdot P
$$

Where $c_{\text{capex}}$ is `capex_per_kw`, $P$ is plant capacity (kW), $P_{\text{ref}}$ is `reference_capacity_kw`, and $k$ is `capex_scaling_exponent`.
| `system_capacity_kw` | float | Rated electrical capacity in kW. |
| `capex_per_kw` | float | Capital cost in USD/kW. |
| `fixed_opex_per_kw_year` | float | Fixed O&M in USD/(kW*year). |
| `variable_opex_per_mwh` | float | Variable O&M in USD/MWh. |
| `reference_capacity_kw` | float, optional | Reference capacity for capex scaling. Defaults to `system_capacity_kw`. |
| `capex_scaling_exponent` | float | Scaling exponent applied to capex. Defaults to `1.0`. |
| `cost_year` | int | Dollar year of the cost inputs. |

**Outputs**

| Name | Shape | Units | Description |
| --- | --- | --- | --- |
| `CapEx` | scalar | USD | Total capital expenditure. |
| `OpEx` | scalar | USD/year | Fixed plus variable O&M. |
| `VarOpEx` | array[plant_life] | USD/year | Variable O&M (repeated each year). |
| `cost_year` | scalar | year | Dollar year of costs. |
| `CapEx` | scalar | USD | Total capital cost. |
| `OpEx` | scalar | USD/year | Fixed annual O&M. |
| `VarOpEx` | array[plant_life] | USD/year | Variable annual O&M repeated across plant life. |

## Example tech_config
### Example `tech_config`

```yaml
technologies:
nuclear:
performance_model:
model: "QuinnNuclearPerformanceModel"
model: QuinnNuclearPerformanceModel
cost_model:
model: "QuinnNuclearCostModel"
model: QuinnNuclearCostModel
model_inputs:
performance_parameters:
system_capacity_kw: 300000.0
capacity_factor: 0.9
cost_parameters:
system_capacity_kw: 450000.0
capex_per_kw: 6000.0
Expand All @@ -88,6 +86,7 @@ technologies:
cost_year: 2023
```


## References

- Quinn, J. et al., 2023. Small modular reactor light water reactor techno-economic analysis. Applied Energy 120669. https://doi.org/10.1016/j.apenergy.2023.120669
Loading