diff --git a/docs/technology_models/h2_htse.md b/docs/technology_models/h2_htse.md new file mode 100644 index 000000000..02afcc418 --- /dev/null +++ b/docs/technology_models/h2_htse.md @@ -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. | + + diff --git a/docs/technology_models/images/HTSE.png b/docs/technology_models/images/HTSE.png new file mode 100644 index 000000000..ab8ccfdad Binary files /dev/null and b/docs/technology_models/images/HTSE.png differ diff --git a/docs/technology_models/images/ThermalNucReactor-H2I.png b/docs/technology_models/images/ThermalNucReactor-H2I.png new file mode 100644 index 000000000..2888110a4 Binary files /dev/null and b/docs/technology_models/images/ThermalNucReactor-H2I.png differ diff --git a/docs/technology_models/nuclear.md b/docs/technology_models/nuclear.md index 694e17e23..56a3b289b 100644 --- a/docs/technology_models/nuclear.md +++ b/docs/technology_models/nuclear.md @@ -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 @@ -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 diff --git a/docs/technology_models/nuclear_thermal.md b/docs/technology_models/nuclear_thermal.md new file mode 100644 index 000000000..1ae860599 --- /dev/null +++ b/docs/technology_models/nuclear_thermal.md @@ -0,0 +1,90 @@ +## Simple thermal nuclear reactor model + +Use this model by setting: + +- performance model: `SimpleThermalNuclearReactorPerformanceModel` +- cost model: `SimpleThermalNuclearReactorCostModel` + +This model represents a reactor with: + +- a high-pressure electric conversion stage +- a low-pressure electric conversion stage +- an extractable process heat stream, extracted upstream of the low-pressure turbine stages + +It supports two operating modes: + +- `heat`: satisfy heat demand first, then convert remaining low-pressure heat to electricity +- `electricity`: satisfy the electricity command first, then send the remaining available heat + +```{figure} images/ThermalNucReactor-H2I.png +:alt: Thermal nuclear reactor schematic +:width: 100% +:align: center +``` + +### Performance inputs + +The performance config is built from `performance_parameters` and shared inputs from `shared_parameters`. + +| Name | Source | Units | Description | +| --- | --- | --- | --- | +| `operating_mode` | `performance_parameters` | n/a | Must be `heat` or `electricity`. | +| `electricity_command_value` | `performance_parameters` | kW | Requested electrical output. Added as a time-series input named `electricity_command_value`. | +| `high_pressure_electrical_efficiency` | `performance_parameters` | unitless | Fraction of total thermal input converted in the high-pressure stage. | +| `low_pressure_electrical_efficiency` | `performance_parameters` | unitless | Efficiency applied to remaining low-pressure heat when generating electricity. | +| `minimum_heat_extract` | `performance_parameters` | kW | Minimum process heat reserved for extraction. Defaults to `0.0`. | +| `rated_capacity` | `shared_parameters` | kW | Rated electrical capacity used to infer reactor thermal capacity. | +| `heat_command_value` | runtime input | kW | Downstream process heat request. Defaults to `6400` if not connected. | + +### Performance outputs + +| Name | Shape | Units | Description | +| --- | --- | --- | --- | +| `electricity_out` | array[n_timesteps] | kW | Electrical output of the nuclear system. | +| `heat_out` | array[n_timesteps] | kW | Delivered process heat. | +| `high_pressure_heat_demanded` | array[n_timesteps] | kW | Requested heat after applying `minimum_heat_extract`. | +| `high_pressure_heat` | array[n_timesteps] | kW | Available process heat stream before low-pressure electric conversion. | +| `low_pressure_heat` | array[n_timesteps] | kW | Remaining unused low-pressure heat after dispatch. | +| `rated_electricity_production` | scalar | kW | Rated electrical production. | +| `total_electricity_produced` | scalar | kW*h | Electricity produced over the simulated period. | +| `annual_electricity_produced` | array[plant_life] | kW*h/year | Annualized electricity production repeated across plant life. | +| `capacity_factor` | array[plant_life] | unitless | Electrical capacity factor, likely below nominal fleet values. | +| `replacement_schedule` | array[plant_life] | unitless | Currently zeros. | + +### Thermal reactor dispatch logic + +The model computes a combined electric efficiency: + +$$ +\eta_{combined} = \eta_{hp} + (1 - \eta_{hp}) \eta_{lp} +$$ + +Then infers thermal capacity from rated electrical capacity: + +$$ +P_{thermal} = \frac{P_{electric,rated}}{\eta_{combined}} +$$ + +In `heat` mode, delivered heat is limited by available process heat and the requested heat demand. Remaining low-pressure heat is converted to electricity. + +In `electricity` mode, electricity is limited by the command value and rated capacity. Remaining process heat is then sent as `heat_out`. + +### Thermal reactor cost model + +The thermal reactor cost model uses direct capacity-based cost inputs and computes variable O&M from delivered electricity. + +| Key | Source | Units | Description | +| --- | --- | --- | --- | +| `rated_capacity` | `shared_parameters` | kW | Rated capacity used for cost calculations. | +| `nuclear_reactor_upfront_cost` | `cost_parameters` | USD/kW | Capital cost per kW. | +| `nuclear_reactor_fixed_om_cost` | `cost_parameters` | USD/(kW*year) | Fixed annual O&M. | +| `nuclear_reactor_variable_om_cost` | `cost_parameters` | USD/(kW*h) | Variable O&M applied to simulated electricity production. | +| `cost_year` | `cost_parameters` | year | Optional cost year, default `2025`. | + +**Outputs** + +| Name | Shape | Units | Description | +| --- | --- | --- | --- | +| `CapEx` | scalar | USD | `rated_capacity * nuclear_reactor_upfront_cost` | +| `OpEx` | scalar | USD/year | `rated_capacity * nuclear_reactor_fixed_om_cost` | +| `VarOpEx` | array[plant_life] | USD/year | Variable O&M from simulated electricity output, repeated across plant life. | diff --git a/examples/24_solar_battery_grid/tech_config.yaml b/examples/24_solar_battery_grid/tech_config.yaml index 969cfbf63..6ae8fd0c7 100644 --- a/examples/24_solar_battery_grid/tech_config.yaml +++ b/examples/24_solar_battery_grid/tech_config.yaml @@ -35,7 +35,7 @@ technologies: cost_model: model: ATBBatteryCostModel control_strategy: - model: DemandOpenLoopStorageController + model: SimpleStorageOpenLoopController model_inputs: shared_parameters: commodity: electricity diff --git a/examples/99_nuclear_reactor_htse/driver_config.yaml b/examples/99_nuclear_reactor_htse/driver_config.yaml new file mode 100644 index 000000000..edf1a9391 --- /dev/null +++ b/examples/99_nuclear_reactor_htse/driver_config.yaml @@ -0,0 +1,52 @@ +name: driver_config +description: Runs a thermal nuclear plant with simple optimization +general: + folder_output: nuclear_thermal_plant +### Use This For Parameter Sweep +# driver: +# design_of_experiments: +# flag: true +# generator: "FullFact" #type of generator to use +# levels: 3 # input is specific to this generator +# debug_print: true +driver: + optimization: + flag: false + solver: COBYLA + tol: 0.1 + catol: 100000 + max_iter: 100 + rhobeg: 0.1 + disp: 3 + debug_print: true +design_variables: + nuclear: + electricity_command_value: + flag: true + lower: 1000 + upper: 500000 + units: kW + htse: + n_clusters: + flag: true + lower: 2.0 + upper: 40.0 + units: unitless +# Add constraints later to the code +# constraints: + # nuclear: + # electricity_out: + # flag: true + # upper: 5000.0 + # units: MW + # ramping_rate: + # flag: true + # upper: 500 + # units: kW/hr + # electrolyzer: + # total_hydrogen_produced: + # flag: false + # lower: 60500000. + # units: kg/year +objective: + name: finance_subgroup_hydrogen.LCOH diff --git a/examples/99_nuclear_reactor_htse/gitcheckdoc.txt b/examples/99_nuclear_reactor_htse/gitcheckdoc.txt new file mode 100644 index 000000000..dfd1d580d --- /dev/null +++ b/examples/99_nuclear_reactor_htse/gitcheckdoc.txt @@ -0,0 +1 @@ +gonna check about git. \ No newline at end of file diff --git a/examples/99_nuclear_reactor_htse/nuclear_example_output.html b/examples/99_nuclear_reactor_htse/nuclear_example_output.html new file mode 100644 index 000000000..4848fc399 --- /dev/null +++ b/examples/99_nuclear_reactor_htse/nuclear_example_output.html @@ -0,0 +1,3888 @@ + + + +
+
+ + \ No newline at end of file diff --git a/examples/99_nuclear_reactor_htse/nuclear_example_output.svg b/examples/99_nuclear_reactor_htse/nuclear_example_output.svg new file mode 100644 index 000000000..e5e1ebebf --- /dev/null +++ b/examples/99_nuclear_reactor_htse/nuclear_example_output.svg @@ -0,0 +1 @@ +020004000600080000.999779M0.9997795M0.99978M0.9997805M0.999781M706706.5707707.5Electricity OutHydrogen ProducedNuclear Reactor Optimization OutputPower (kW)Hydrogen Produced (kg/h)Time \ No newline at end of file diff --git a/examples/99_nuclear_reactor_htse/nuclear_reactor_example.ipynb b/examples/99_nuclear_reactor_htse/nuclear_reactor_example.ipynb new file mode 100644 index 000000000..732668114 --- /dev/null +++ b/examples/99_nuclear_reactor_htse/nuclear_reactor_example.ipynb @@ -0,0 +1,1893 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 4, + "id": "0b2733b8-9d16-4424-8b98-c03a7ac006a9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: kaleido in C:\\Users\\MIKKDM\\AppData\\Local\\miniconda3\\envs\\h2integrate\\Lib\\site-packages (1.3.0)\n", + "Requirement already satisfied: choreographer>=1.3.0 in C:\\Users\\MIKKDM\\AppData\\Local\\miniconda3\\envs\\h2integrate\\Lib\\site-packages (from kaleido) (1.3.0)\n", + "Requirement already satisfied: logistro>=1.0.8 in C:\\Users\\MIKKDM\\AppData\\Local\\miniconda3\\envs\\h2integrate\\Lib\\site-packages (from kaleido) (2.0.1)\n", + "Requirement already satisfied: orjson>=3.10.15 in C:\\Users\\MIKKDM\\AppData\\Local\\miniconda3\\envs\\h2integrate\\Lib\\site-packages (from kaleido) (3.11.9)\n", + "Requirement already satisfied: packaging in C:\\Users\\MIKKDM\\AppData\\Local\\miniconda3\\envs\\h2integrate\\Lib\\site-packages (from kaleido) (26.2)\n", + "Requirement already satisfied: platformdirs>=4.3.6 in C:\\Users\\MIKKDM\\AppData\\Local\\miniconda3\\envs\\h2integrate\\Lib\\site-packages (from choreographer>=1.3.0->kaleido) (4.9.6)\n", + "Requirement already satisfied: simplejson>=3.19.3 in C:\\Users\\MIKKDM\\AppData\\Local\\miniconda3\\envs\\h2integrate\\Lib\\site-packages (from choreographer>=1.3.0->kaleido) (4.1.1)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], + "source": [ + "# Run First Time Only To Install Packages and Restart Kernel\n", + "# %pip install openmdao[doe]\n", + "# %pip install pyDOE3\n", + "%pip install kaleido\n", + "# I've had to add the following lines for some reason, possibly because I have a conda install\n", + "# setup elsewhere? But that doesn't really make a lot of sense.\n", + "# %pip install matplotlib\n", + "# %pip install requests-cache\n", + "# %pip install openmeteo-requests\n", + "# %pip install retry_requests\n", + "# %pip install orbit-nrel\n", + "# %pip install rich\n", + "# %pip install wombat\n", + "# %pip install CoolProp\n", + "# %pip install ruamel.yaml\n", + "# %pip install numpy_financial\n", + "# %pip install pandas\n", + "# %pip install dill\n", + "# %pip install ProFAST\n", + "# %pip install floris\n", + "# %pip install nrel-pysam\n", + "# %pip install hopp\n", + "# %pip install geopy" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "25e0132b-8197-4667-8c54-4d0627392412", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "=====\n", + "plant\n", + "=====\n", + "NL: NLBGSSolver 'NL: NLBGS' on system 'plant': residuals contain 'inf' or 'NaN' after 2 iterations.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\MIKKDM\\Documents\\H2Integrate\\NucH2INtegrate\\h2integrate\\core\\pose_optimization.py:338: UserWarning: Design variables are set to be optimized or studied, but no driver is selected. If you want to run an optimization, please enable a driver.\n", + " warnings.warn(\n", + "C:\\Users\\MIKKDM\\AppData\\Local\\miniconda3\\envs\\h2integrate\\Lib\\site-packages\\openmdao\\core\\group.py:1197: DerivativesWarning:Constraints or objectives [plant.finance_subgroup_hydrogen.hydrogen_finance_profast_model.LCOH] cannot be impacted by the design variables of the problem because no partials were defined for them in their parent component(s).\n", + "C:\\Users\\MIKKDM\\AppData\\Local\\miniconda3\\envs\\h2integrate\\Lib\\site-packages\\openmdao\\utils\\relevance.py:1296: OpenMDAOWarning:The following groups have a nonlinear solver that computes gradients and will be treated as atomic for the purposes of determining which systems are included in the optimization iteration: \n", + "plant\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "
\n",
+       "65 explicit inputs:\n",
+       "
\n" + ], + "text/plain": [ + "\n", + "\u001b[1;36m65\u001b[0m explicit inputs:\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                                     ╷                  ╷             ╷       ╷                                    \n",
+       " Variable                                         Mean  Units        Shape  Promoted name                      \n",
+       "╶────────────────────────────────────┼──────────────────┼─────────────┼───────┼───────────────────────────────────╴\n",
+       " plant                               │                  │             │       │                                    \n",
+       "   combiner                          │                  │             │       │                                    \n",
+       "     GenericCombinerPerformanceModel │                  │             │       │                                    \n",
+       "       hydrogen_in1                  │               0. │ kg/h        │ 8760  │ combiner.hydrogen_in1              \n",
+       "       rated_hydrogen_production1    │               0. │ kg/h        │ 1     │ combiner.rated_hydrogen_production \n",
+       "                                     │                  │             │       │ 1                                  \n",
+       "       hydrogen_capacity_factor1     │               0. │ unitless    │ 30    │ combiner.hydrogen_capacity_factor1 \n",
+       "       hydrogen_in2                  │               0. │ kg/h        │ 8760  │ combiner.hydrogen_in2              \n",
+       "       rated_hydrogen_production2    │               0. │ kg/h        │ 1     │ combiner.rated_hydrogen_production \n",
+       "                                     │                  │             │       │ 2                                  \n",
+       "       hydrogen_capacity_factor2     │               0. │ unitless    │ 30    │ combiner.hydrogen_capacity_factor2 \n",
+       "   finance_subgroup_electricity      │                  │             │       │                                    \n",
+       "     adjusted_capex_opex_comp        │                  │             │       │                                    \n",
+       "       capex_nuclear                 │   5,750,000,000. │ USD         │ 1     │ finance_subgroup_electricity.capex \n",
+       "                                     │                  │             │       │ _nuclear                           \n",
+       "       opex_nuclear                  │       2,640,000. │ USD/year    │ 1     │ finance_subgroup_electricity.opex_ \n",
+       "                                     │                  │             │       │ nuclear                            \n",
+       "       varopex_nuclear               │   126,898,502.61 │ USD/year    │ 30    │ finance_subgroup_electricity.varop \n",
+       "                                     │                  │             │       │ ex_nuclear                         \n",
+       "       cost_year_nuclear             │           2,025. │ n/a         │ n/a   │ finance_subgroup_electricity.cost_ \n",
+       "                                     │                  │             │       │ year_nuclear                       \n",
+       "     electricity_finance_profast_mod │                  │             │       │                                    \n",
+       " el                                  │                  │             │       │                                    \n",
+       "       rated_electricity_production  │       1,000,000. │ kW          │ 1     │ finance_subgroup_electricity.rated \n",
+       "                                     │                  │             │       │ _electricity_production            \n",
+       "       capacity_factor               │            0.999 │ unitless    │ 30    │ finance_subgroup_electricity.capac \n",
+       "                                     │                  │             │       │ ity_factor                         \n",
+       "       capex_adjusted_nuclear        │ 5,339,446,612.79 │ USD         │ 1     │ finance_subgroup_electricity.capex \n",
+       "                                     │                  │             │       │ _adjusted_nuclear                  \n",
+       "       opex_adjusted_nuclear         │     2,451,502.44 │ USD/year    │ 1     │ finance_subgroup_electricity.opex_ \n",
+       "                                     │                  │             │       │ adjusted_nuclear                   \n",
+       "       varopex_adjusted_nuclear      │   117,837,874.77 │ USD/year    │ 30    │ finance_subgroup_electricity.varop \n",
+       "                                     │                  │             │       │ ex_adjusted_nuclear                \n",
+       "       replacement_schedule_nuclear  │               0. │ unitless    │ 30    │ finance_subgroup_electricity.repla \n",
+       "                                     │                  │             │       │ cement_schedule_nuclear            \n",
+       "   finance_subgroup_hydrogen         │                  │             │       │                                    \n",
+       "     adjusted_capex_opex_comp        │                  │             │       │                                    \n",
+       "       capex_nuclear                 │   5,750,000,000. │ USD         │ 1     │ finance_subgroup_hydrogen.capex_nu \n",
+       "                                     │                  │             │       │ clear                              \n",
+       "       opex_nuclear                  │       2,640,000. │ USD/year    │ 1     │ finance_subgroup_hydrogen.opex_nuc \n",
+       "                                     │                  │             │       │ lear                               \n",
+       "       varopex_nuclear               │   126,898,502.61 │ USD/year    │ 30    │ finance_subgroup_hydrogen.varopex_ \n",
+       "                                     │                  │             │       │ nuclear                            \n",
+       "       capex_htse                    │      32,375,000. │ USD         │ 1     │ finance_subgroup_hydrogen.capex_ht \n",
+       "                                     │                  │             │       │ se                                 \n",
+       "       opex_htse                     │               0. │ USD/year    │ 1     │ finance_subgroup_hydrogen.opex_hts \n",
+       "                                     │                  │             │       │ e                                  \n",
+       "       varopex_htse                  │               0. │ USD/year    │ 30    │ finance_subgroup_hydrogen.varopex_ \n",
+       "                                     │                  │             │       │ htse                               \n",
+       "       cost_year_nuclear             │           2,025. │ n/a         │ n/a   │ finance_subgroup_hydrogen.cost_yea \n",
+       "                                     │                  │             │       │ r_nuclear                          \n",
+       "       cost_year_htse                │           2,025. │ n/a         │ n/a   │ finance_subgroup_hydrogen.cost_yea \n",
+       "                                     │                  │             │       │ r_htse                             \n",
+       "     hydrogen_finance_profast_model  │                  │             │       │                                    \n",
+       "       rated_hydrogen_production     │         679.3478 │ kg/h        │ 1     │ finance_subgroup_hydrogen.rated_hy \n",
+       "                                     │                  │             │       │ drogen_production                  \n",
+       "       capacity_factor               │               1. │ unitless    │ 30    │ finance_subgroup_hydrogen.capacity \n",
+       "                                     │                  │             │       │ _factor                            \n",
+       "       capex_adjusted_nuclear        │ 5,339,446,612.79 │ USD         │ 1     │ finance_subgroup_hydrogen.capex_ad \n",
+       "                                     │                  │             │       │ justed_nuclear                     \n",
+       "       opex_adjusted_nuclear         │     2,451,502.44 │ USD/year    │ 1     │ finance_subgroup_hydrogen.opex_adj \n",
+       "                                     │                  │             │       │ usted_nuclear                      \n",
+       "       varopex_adjusted_nuclear      │   117,837,874.77 │ USD/year    │ 30    │ finance_subgroup_hydrogen.varopex_ \n",
+       "                                     │                  │             │       │ adjusted_nuclear                   \n",
+       "       replacement_schedule_nuclear  │               0. │ unitless    │ 30    │ finance_subgroup_hydrogen.replacem \n",
+       "                                     │                  │             │       │ ent_schedule_nuclear               \n",
+       "       capex_adjusted_htse           │    30,063,405.93 │ USD         │ 1     │ finance_subgroup_hydrogen.capex_ad \n",
+       "                                     │                  │             │       │ justed_htse                        \n",
+       "       opex_adjusted_htse            │               0. │ USD/year    │ 1     │ finance_subgroup_hydrogen.opex_adj \n",
+       "                                     │                  │             │       │ usted_htse                         \n",
+       "       varopex_adjusted_htse         │               0. │ USD/year    │ 30    │ finance_subgroup_hydrogen.varopex_ \n",
+       "                                     │                  │             │       │ adjusted_htse                      \n",
+       "       replacement_schedule_htse     │              0.1 │ unitless    │ 30    │ finance_subgroup_hydrogen.replacem \n",
+       "                                     │                  │             │       │ ent_schedule_htse                  \n",
+       "   h2_storage                        │                  │             │       │                                    \n",
+       "     LinedRockCavernStorageCostModel │                  │             │       │                                    \n",
+       "       max_charge_rate               │         679.3478 │ kg/h        │ 1     │ h2_storage.max_charge_rate         \n",
+       "       storage_capacity              │               0. │ kg          │ 1     │ h2_storage.storage_capacity        \n",
+       "       hydrogen_in                   │         679.3478 │ kg/h        │ 8760  │ h2_storage.hydrogen_in             \n",
+       "     SimpleStorageOpenLoopController │                  │             │       │                                    \n",
+       "       hydrogen_in                   │         679.3478 │ kg/h        │ 8760  │ h2_storage.hydrogen_in             \n",
+       "     StorageAutoSizingModel          │                  │             │       │                                    \n",
+       "       hydrogen_in                   │         679.3478 │ kg/h        │ 8760  │ h2_storage.hydrogen_in             \n",
+       "       hydrogen_set_point            │               0. │ kg/h        │ 8760  │ h2_storage.hydrogen_set_point      \n",
+       "       hydrogen_command_value        │               0. │ kg/h        │ 8760  │ h2_storage.hydrogen_command_value  \n",
+       "   htse                              │                  │             │       │                                    \n",
+       "     HTSECostModel                   │                  │             │       │                                    \n",
+       "       total_hydrogen_produced       │     5,951,086.96 │ kg          │ 1     │ htse.total_hydrogen_produced       \n",
+       "       electricity_in                │       999,043.48 │ kW          │ 8760  │ htse.electricity_in                \n",
+       "     HTSEPerformanceModel            │                  │             │       │                                    \n",
+       "       electricity_in                │       999,043.48 │ kW          │ 8760  │ htse.electricity_in                \n",
+       "       electrolyzer_size_mw          │              25. │ MW          │ 1     │ htse.electrolyzer_size_mw          \n",
+       "       n_clusters                    │              25. │ unitless    │ 1     │ htse.n_clusters                    \n",
+       "       heat_in                       │       4,347.8261 │ kW          │ 8760  │ htse.heat_in                       \n",
+       "       cluster_size                  │               1. │ MW          │ 1     │ htse.cluster_size                  \n",
+       "       max_hydrogen_capacity         │           1,000. │ kg/h        │ 1     │ htse.max_hydrogen_capacity         \n",
+       "       size_mode                     │              n/a │ n/a         │ n/a   │ htse.size_mode                     \n",
+       "     controller                      │                  │             │       │                                    \n",
+       "       hydrogen_set_point            │   1,000,000,000. │ kg/h        │ 8760  │ htse.hydrogen_set_point            \n",
+       "   htse_to_h2_storage_pipe           │                  │             │       │                                    \n",
+       "     hydrogen_in                     │           0.1887 │ kg/s        │ 8760  │ htse_to_h2_storage_pipe.hydrogen_i \n",
+       "                                     │                  │             │       │ n                                  \n",
+       "   nuclear                           │                  │             │       │                                    \n",
+       "     SimpleThermalNuclearReactorCost │                  │             │       │                                    \n",
+       " Model                               │                  │             │       │                                    \n",
+       "       rated_capacity                │       1,000,000. │ kW          │ 1     │ nuclear.rated_capacity             \n",
+       "     SimpleThermalNuclearReactorPerf │                  │             │       │                                    \n",
+       " ormanceModel                        │                  │             │       │                                    \n",
+       "       rated_capacity                │       1,000,000. │ kW          │ 1     │ nuclear.rated_capacity             \n",
+       "       nuclear_reactor_upfront_cost  │           5,750. │ USD/kW      │ 1     │ nuclear.nuclear_reactor_upfront_co \n",
+       "                                     │                  │             │       │ st                                 \n",
+       "       nuclear_reactor_fixed_om_cost │             2.64 │ USD/kW/year │ 1     │ nuclear.nuclear_reactor_fixed_om_c \n",
+       "                                     │                  │             │       │ ost                                \n",
+       "       nuclear_reactor_variable_om_c │           0.0145 │ USD/kW/h    │ 1     │ nuclear.nuclear_reactor_variable_o \n",
+       " ost                                 │                  │             │       │ m_cost                             \n",
+       "       electricity_out               │       999,043.48 │ kW          │ 8760  │ nuclear.electricity_out            \n",
+       "       electricity_command_value     │         500,000. │ kW          │ 8760  │ nuclear.electricity_command_value  \n",
+       "       high_pressure_electrical_effi │             0.12 │ unitless    │ 1     │ nuclear.high_pressure_electrical_e \n",
+       " ciency                              │                  │             │       │ fficiency                          \n",
+       "       low_pressure_electrical_effic │             0.22 │ unitless    │ 1     │ nuclear.low_pressure_electrical_ef \n",
+       " iency                               │                  │             │       │ ficiency                           \n",
+       "       minimum_heat_extract          │           1,000. │ kW          │ 1     │ nuclear.minimum_heat_extract       \n",
+       "       heat_command_value            │       4,347.8261 │ kW          │ 8760  │ nuclear.heat_command_value         \n",
+       "       operating_mode                │              n/a │ n/a         │ n/a   │ nuclear.operating_mode             \n",
+       "   nuclear_to_htse_cable             │                  │             │       │                                    \n",
+       "     electricity_in                  │       999,043.48 │ kW          │ 8760  │ nuclear_to_htse_cable.electricity_ \n",
+       "                                     │                  │             │       │ in                                 \n",
+       "                                     ╵                  ╵             ╵       ╵                                    \n",
+       "
\n" + ], + "text/plain": [ + " ╷ ╷ ╷ ╷ \n", + " \u001b[1mVariable \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1m Mean\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mUnits \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mShape\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mPromoted name \u001b[0m \n", + "╶────────────────────────────────────┼──────────────────┼─────────────┼───────┼───────────────────────────────────╴\n", + " plant │ │ │ │ \n", + " combiner │ │ │ │ \n", + " GenericCombinerPerformanceModel │ │ │ │ \n", + " hydrogen_in1 │ 0. │ kg/h │ 8760 │ combiner.hydrogen_in1 \n", + " rated_hydrogen_production1 │ 0. │ kg/h │ 1 │ combiner.rated_hydrogen_production \n", + " │ │ │ │ 1 \n", + " hydrogen_capacity_factor1 │ 0. │ unitless │ 30 │ combiner.hydrogen_capacity_factor1 \n", + " hydrogen_in2 │ 0. │ kg/h │ 8760 │ combiner.hydrogen_in2 \n", + " rated_hydrogen_production2 │ 0. │ kg/h │ 1 │ combiner.rated_hydrogen_production \n", + " │ │ │ │ 2 \n", + " hydrogen_capacity_factor2 │ 0. │ unitless │ 30 │ combiner.hydrogen_capacity_factor2 \n", + " finance_subgroup_electricity │ │ │ │ \n", + " adjusted_capex_opex_comp │ │ │ │ \n", + " capex_nuclear │ 5,750,000,000. │ USD │ 1 │ finance_subgroup_electricity.capex \n", + " │ │ │ │ _nuclear \n", + " opex_nuclear │ 2,640,000. │ USD/year │ 1 │ finance_subgroup_electricity.opex_ \n", + " │ │ │ │ nuclear \n", + " varopex_nuclear │ 126,898,502.61 │ USD/year │ 30 │ finance_subgroup_electricity.varop \n", + " │ │ │ │ ex_nuclear \n", + " cost_year_nuclear │ 2,025. │ n/a │ n/a │ finance_subgroup_electricity.cost_ \n", + " │ │ │ │ year_nuclear \n", + " electricity_finance_profast_mod │ │ │ │ \n", + " el │ │ │ │ \n", + " rated_electricity_production │ 1,000,000. │ kW │ 1 │ finance_subgroup_electricity.rated \n", + " │ │ │ │ _electricity_production \n", + " capacity_factor │ 0.999 │ unitless │ 30 │ finance_subgroup_electricity.capac \n", + " │ │ │ │ ity_factor \n", + " capex_adjusted_nuclear │ 5,339,446,612.79 │ USD │ 1 │ finance_subgroup_electricity.capex \n", + " │ │ │ │ _adjusted_nuclear \n", + " opex_adjusted_nuclear │ 2,451,502.44 │ USD/year │ 1 │ finance_subgroup_electricity.opex_ \n", + " │ │ │ │ adjusted_nuclear \n", + " varopex_adjusted_nuclear │ 117,837,874.77 │ USD/year │ 30 │ finance_subgroup_electricity.varop \n", + " │ │ │ │ ex_adjusted_nuclear \n", + " replacement_schedule_nuclear │ 0. │ unitless │ 30 │ finance_subgroup_electricity.repla \n", + " │ │ │ │ cement_schedule_nuclear \n", + " finance_subgroup_hydrogen │ │ │ │ \n", + " adjusted_capex_opex_comp │ │ │ │ \n", + " capex_nuclear │ 5,750,000,000. │ USD │ 1 │ finance_subgroup_hydrogen.capex_nu \n", + " │ │ │ │ clear \n", + " opex_nuclear │ 2,640,000. │ USD/year │ 1 │ finance_subgroup_hydrogen.opex_nuc \n", + " │ │ │ │ lear \n", + " varopex_nuclear │ 126,898,502.61 │ USD/year │ 30 │ finance_subgroup_hydrogen.varopex_ \n", + " │ │ │ │ nuclear \n", + " capex_htse │ 32,375,000. │ USD │ 1 │ finance_subgroup_hydrogen.capex_ht \n", + " │ │ │ │ se \n", + " opex_htse │ 0. │ USD/year │ 1 │ finance_subgroup_hydrogen.opex_hts \n", + " │ │ │ │ e \n", + " varopex_htse │ 0. │ USD/year │ 30 │ finance_subgroup_hydrogen.varopex_ \n", + " │ │ │ │ htse \n", + " cost_year_nuclear │ 2,025. │ n/a │ n/a │ finance_subgroup_hydrogen.cost_yea \n", + " │ │ │ │ r_nuclear \n", + " cost_year_htse │ 2,025. │ n/a │ n/a │ finance_subgroup_hydrogen.cost_yea \n", + " │ │ │ │ r_htse \n", + " hydrogen_finance_profast_model │ │ │ │ \n", + " rated_hydrogen_production │ 679.3478 │ kg/h │ 1 │ finance_subgroup_hydrogen.rated_hy \n", + " │ │ │ │ drogen_production \n", + " capacity_factor │ 1. │ unitless │ 30 │ finance_subgroup_hydrogen.capacity \n", + " │ │ │ │ _factor \n", + " capex_adjusted_nuclear │ 5,339,446,612.79 │ USD │ 1 │ finance_subgroup_hydrogen.capex_ad \n", + " │ │ │ │ justed_nuclear \n", + " opex_adjusted_nuclear │ 2,451,502.44 │ USD/year │ 1 │ finance_subgroup_hydrogen.opex_adj \n", + " │ │ │ │ usted_nuclear \n", + " varopex_adjusted_nuclear │ 117,837,874.77 │ USD/year │ 30 │ finance_subgroup_hydrogen.varopex_ \n", + " │ │ │ │ adjusted_nuclear \n", + " replacement_schedule_nuclear │ 0. │ unitless │ 30 │ finance_subgroup_hydrogen.replacem \n", + " │ │ │ │ ent_schedule_nuclear \n", + " capex_adjusted_htse │ 30,063,405.93 │ USD │ 1 │ finance_subgroup_hydrogen.capex_ad \n", + " │ │ │ │ justed_htse \n", + " opex_adjusted_htse │ 0. │ USD/year │ 1 │ finance_subgroup_hydrogen.opex_adj \n", + " │ │ │ │ usted_htse \n", + " varopex_adjusted_htse │ 0. │ USD/year │ 30 │ finance_subgroup_hydrogen.varopex_ \n", + " │ │ │ │ adjusted_htse \n", + " replacement_schedule_htse │ 0.1 │ unitless │ 30 │ finance_subgroup_hydrogen.replacem \n", + " │ │ │ │ ent_schedule_htse \n", + " h2_storage │ │ │ │ \n", + " LinedRockCavernStorageCostModel │ │ │ │ \n", + " max_charge_rate │ 679.3478 │ kg/h │ 1 │ h2_storage.max_charge_rate \n", + " storage_capacity │ 0. │ kg │ 1 │ h2_storage.storage_capacity \n", + " hydrogen_in │ 679.3478 │ kg/h │ 8760 │ h2_storage.hydrogen_in \n", + " SimpleStorageOpenLoopController │ │ │ │ \n", + " hydrogen_in │ 679.3478 │ kg/h │ 8760 │ h2_storage.hydrogen_in \n", + " StorageAutoSizingModel │ │ │ │ \n", + " hydrogen_in │ 679.3478 │ kg/h │ 8760 │ h2_storage.hydrogen_in \n", + " hydrogen_set_point │ 0. │ kg/h │ 8760 │ h2_storage.hydrogen_set_point \n", + " hydrogen_command_value │ 0. │ kg/h │ 8760 │ h2_storage.hydrogen_command_value \n", + " htse │ │ │ │ \n", + " HTSECostModel │ │ │ │ \n", + " total_hydrogen_produced │ 5,951,086.96 │ kg │ 1 │ htse.total_hydrogen_produced \n", + " electricity_in │ 999,043.48 │ kW │ 8760 │ htse.electricity_in \n", + " HTSEPerformanceModel │ │ │ │ \n", + " electricity_in │ 999,043.48 │ kW │ 8760 │ htse.electricity_in \n", + " electrolyzer_size_mw │ 25. │ MW │ 1 │ htse.electrolyzer_size_mw \n", + " n_clusters │ 25. │ unitless │ 1 │ htse.n_clusters \n", + " heat_in │ 4,347.8261 │ kW │ 8760 │ htse.heat_in \n", + " cluster_size │ 1. │ MW │ 1 │ htse.cluster_size \n", + " max_hydrogen_capacity │ 1,000. │ kg/h │ 1 │ htse.max_hydrogen_capacity \n", + " size_mode │ n/a │ n/a │ n/a │ htse.size_mode \n", + " controller │ │ │ │ \n", + " hydrogen_set_point │ 1,000,000,000. │ kg/h │ 8760 │ htse.hydrogen_set_point \n", + " htse_to_h2_storage_pipe │ │ │ │ \n", + " hydrogen_in │ 0.1887 │ kg/s │ 8760 │ htse_to_h2_storage_pipe.hydrogen_i \n", + " │ │ │ │ n \n", + " nuclear │ │ │ │ \n", + " SimpleThermalNuclearReactorCost │ │ │ │ \n", + " Model │ │ │ │ \n", + " rated_capacity │ 1,000,000. │ kW │ 1 │ nuclear.rated_capacity \n", + " SimpleThermalNuclearReactorPerf │ │ │ │ \n", + " ormanceModel │ │ │ │ \n", + " rated_capacity │ 1,000,000. │ kW │ 1 │ nuclear.rated_capacity \n", + " nuclear_reactor_upfront_cost │ 5,750. │ USD/kW │ 1 │ nuclear.nuclear_reactor_upfront_co \n", + " │ │ │ │ st \n", + " nuclear_reactor_fixed_om_cost │ 2.64 │ USD/kW/year │ 1 │ nuclear.nuclear_reactor_fixed_om_c \n", + " │ │ │ │ ost \n", + " nuclear_reactor_variable_om_c │ 0.0145 │ USD/kW/h │ 1 │ nuclear.nuclear_reactor_variable_o \n", + " ost │ │ │ │ m_cost \n", + " electricity_out │ 999,043.48 │ kW │ 8760 │ nuclear.electricity_out \n", + " electricity_command_value │ 500,000. │ kW │ 8760 │ nuclear.electricity_command_value \n", + " high_pressure_electrical_effi │ 0.12 │ unitless │ 1 │ nuclear.high_pressure_electrical_e \n", + " ciency │ │ │ │ fficiency \n", + " low_pressure_electrical_effic │ 0.22 │ unitless │ 1 │ nuclear.low_pressure_electrical_ef \n", + " iency │ │ │ │ ficiency \n", + " minimum_heat_extract │ 1,000. │ kW │ 1 │ nuclear.minimum_heat_extract \n", + " heat_command_value │ 4,347.8261 │ kW │ 8760 │ nuclear.heat_command_value \n", + " operating_mode │ n/a │ n/a │ n/a │ nuclear.operating_mode \n", + " nuclear_to_htse_cable │ │ │ │ \n", + " electricity_in │ 999,043.48 │ kW │ 8760 │ nuclear_to_htse_cable.electricity_ \n", + " │ │ │ │ in \n", + " ╵ ╵ ╵ ╵ \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n",
+       "96 explicit outputs:\n",
+       "
\n" + ], + "text/plain": [ + "\n", + "\u001b[1;36m96\u001b[0m explicit outputs:\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
                                     ╷                  ╷           ╷       ╷                                      \n",
+       " Variable                                         Mean  Units      Shape  Promoted name                        \n",
+       "╶────────────────────────────────────┼──────────────────┼───────────┼───────┼─────────────────────────────────────╴\n",
+       " plant                               │                  │           │       │                                      \n",
+       "   combiner                          │                  │           │       │                                      \n",
+       "     GenericCombinerPerformanceModel │                  │           │       │                                      \n",
+       "       hydrogen_out                  │               0. │ kg/h      │ 8760  │ combiner.hydrogen_out                \n",
+       "       capacity_factor               │               0. │ unitless  │ 30    │ combiner.capacity_factor             \n",
+       "       rated_hydrogen_production     │               0. │ kg/h      │ 1     │ combiner.rated_hydrogen_production   \n",
+       "   finance_subgroup_electricity      │                  │           │       │                                      \n",
+       "     adjusted_capex_opex_comp        │                  │           │       │                                      \n",
+       "       capex_adjusted_nuclear        │ 5,339,446,612.79 │ USD       │ 1     │ finance_subgroup_electricity.capex_a \n",
+       "                                     │                  │           │       │ djusted_nuclear                      \n",
+       "       opex_adjusted_nuclear         │     2,451,502.44 │ USD/year  │ 1     │ finance_subgroup_electricity.opex_ad \n",
+       "                                     │                  │           │       │ justed_nuclear                       \n",
+       "       varopex_adjusted_nuclear      │   117,837,874.77 │ USD/year  │ 30    │ finance_subgroup_electricity.varopex \n",
+       "                                     │                  │           │       │ _adjusted_nuclear                    \n",
+       "       total_capex_adjusted          │ 5,339,446,612.79 │ USD       │ 1     │ finance_subgroup_electricity.total_c \n",
+       "                                     │                  │           │       │ apex_adjusted                        \n",
+       "       total_opex_adjusted           │     2,451,502.44 │ USD/year  │ 1     │ finance_subgroup_electricity.total_o \n",
+       "                                     │                  │           │       │ pex_adjusted                         \n",
+       "       total_varopex_adjusted        │   117,837,874.77 │ USD/year  │ 30    │ finance_subgroup_electricity.total_v \n",
+       "                                     │                  │           │       │ aropex_adjusted                      \n",
+       "     electricity_finance_profast_mod │                  │           │       │                                      \n",
+       " el                                  │                  │           │       │                                      \n",
+       "       LCOE                          │           0.0791 │ USD/kW/h  │ 1     │ finance_subgroup_electricity.LCOE    \n",
+       "       wacc_electricity              │           0.0625 │ percent   │ 1     │ finance_subgroup_electricity.wacc_el \n",
+       "                                     │                  │           │       │ ectricity                            \n",
+       "       crf_electricity               │           0.0723 │ percent   │ 1     │ finance_subgroup_electricity.crf_ele \n",
+       "                                     │                  │           │       │ ctricity                             \n",
+       "       irr_electricity               │             0.09 │ percent   │ 1     │ finance_subgroup_electricity.irr_ele \n",
+       "                                     │                  │           │       │ ctricity                             \n",
+       "       profit_index_electricity      │           1.5696 │ unitless  │ 1     │ finance_subgroup_electricity.profit_ \n",
+       "                                     │                  │           │       │ index_electricity                    \n",
+       "       investor_payback_period_elect │                8 │ year      │ 1     │ finance_subgroup_electricity.investo \n",
+       " ricity                              │                  │           │       │ r_payback_period_electricity         \n",
+       "       price_electricity             │           0.0791 │ USD/kW/h  │ 1     │ finance_subgroup_electricity.price_e \n",
+       "                                     │                  │           │       │ lectricity                           \n",
+       "       LCOE_breakdown                │              n/a │ n/a       │ n/a   │ finance_subgroup_electricity.LCOE_br \n",
+       "                                     │                  │           │       │ eakdown                              \n",
+       "   finance_subgroup_hydrogen         │                  │           │       │                                      \n",
+       "     adjusted_capex_opex_comp        │                  │           │       │                                      \n",
+       "       capex_adjusted_nuclear        │ 5,339,446,612.79 │ USD       │ 1     │ finance_subgroup_hydrogen.capex_adju \n",
+       "                                     │                  │           │       │ sted_nuclear                         \n",
+       "       opex_adjusted_nuclear         │     2,451,502.44 │ USD/year  │ 1     │ finance_subgroup_hydrogen.opex_adjus \n",
+       "                                     │                  │           │       │ ted_nuclear                          \n",
+       "       varopex_adjusted_nuclear      │   117,837,874.77 │ USD/year  │ 30    │ finance_subgroup_hydrogen.varopex_ad \n",
+       "                                     │                  │           │       │ justed_nuclear                       \n",
+       "       capex_adjusted_htse           │    30,063,405.93 │ USD       │ 1     │ finance_subgroup_hydrogen.capex_adju \n",
+       "                                     │                  │           │       │ sted_htse                            \n",
+       "       opex_adjusted_htse            │               0. │ USD/year  │ 1     │ finance_subgroup_hydrogen.opex_adjus \n",
+       "                                     │                  │           │       │ ted_htse                             \n",
+       "       varopex_adjusted_htse         │               0. │ USD/year  │ 30    │ finance_subgroup_hydrogen.varopex_ad \n",
+       "                                     │                  │           │       │ justed_htse                          \n",
+       "       total_capex_adjusted          │ 5,369,510,018.72 │ USD       │ 1     │ finance_subgroup_hydrogen.total_cape \n",
+       "                                     │                  │           │       │ x_adjusted                           \n",
+       "       total_opex_adjusted           │     2,451,502.44 │ USD/year  │ 1     │ finance_subgroup_hydrogen.total_opex \n",
+       "                                     │                  │           │       │ _adjusted                            \n",
+       "       total_varopex_adjusted        │   117,837,874.77 │ USD/year  │ 30    │ finance_subgroup_hydrogen.total_varo \n",
+       "                                     │                  │           │       │ pex_adjusted                         \n",
+       "     hydrogen_finance_profast_model  │                  │           │       │                                      \n",
+       "       LCOH                          │         116.8301 │ USD/kg    │ 1     │ finance_subgroup_hydrogen.LCOH       \n",
+       "       wacc_hydrogen                 │           0.0625 │ percent   │ 1     │ finance_subgroup_hydrogen.wacc_hydro \n",
+       "                                     │                  │           │       │ gen                                  \n",
+       "       crf_hydrogen                  │           0.0723 │ percent   │ 1     │ finance_subgroup_hydrogen.crf_hydrog \n",
+       "                                     │                  │           │       │ en                                   \n",
+       "       irr_hydrogen                  │             0.09 │ percent   │ 1     │ finance_subgroup_hydrogen.irr_hydrog \n",
+       "                                     │                  │           │       │ en                                   \n",
+       "       profit_index_hydrogen         │           1.5695 │ unitless  │ 1     │ finance_subgroup_hydrogen.profit_ind \n",
+       "                                     │                  │           │       │ ex_hydrogen                          \n",
+       "       investor_payback_period_hydro │                8 │ year      │ 1     │ finance_subgroup_hydrogen.investor_p \n",
+       " gen                                 │                  │           │       │ ayback_period_hydrogen               \n",
+       "       price_hydrogen                │         116.8301 │ USD/kg    │ 1     │ finance_subgroup_hydrogen.price_hydr \n",
+       "                                     │                  │           │       │ ogen                                 \n",
+       "       LCOH_breakdown                │              n/a │ n/a       │ n/a   │ finance_subgroup_hydrogen.LCOH_break \n",
+       "                                     │                  │           │       │ down                                 \n",
+       "   h2_storage                        │                  │           │       │                                      \n",
+       "     LinedRockCavernStorageCostModel │                  │           │       │                                      \n",
+       "       CapEx                         │             nan. │ USD       │ 1     │ h2_storage.CapEx                     \n",
+       "       OpEx                          │             nan. │ USD/year  │ 1     │ h2_storage.OpEx                      \n",
+       "       VarOpEx                       │               0. │ USD/year  │ 30    │ h2_storage.VarOpEx                   \n",
+       "       marginal_cost                 │               0. │ USD/kg    │ 1     │ h2_storage.marginal_cost             \n",
+       "       cost_year                     │             2018 │ n/a       │ n/a   │ h2_storage.cost_year                 \n",
+       "     SimpleStorageOpenLoopController │                  │           │       │                                      \n",
+       "       hydrogen_command_value        │               0. │ kg/h      │ 8760  │ h2_storage.hydrogen_command_value    \n",
+       "     StorageAutoSizingModel          │                  │           │       │                                      \n",
+       "       hydrogen_out                  │               0. │ kg/h      │ 8760  │ h2_storage.hydrogen_out              \n",
+       "       total_hydrogen_produced       │               0. │ kg        │ 1     │ h2_storage.total_hydrogen_produced   \n",
+       "       annual_hydrogen_produced      │               0. │ kg/year   │ 30    │ h2_storage.annual_hydrogen_produced  \n",
+       "       replacement_schedule          │               0. │ unitless  │ 30    │ h2_storage.replacement_schedule      \n",
+       "       capacity_factor               │               0. │ unitless  │ 30    │ h2_storage.capacity_factor           \n",
+       "       rated_hydrogen_production     │         679.3478 │ kg/h      │ 1     │ h2_storage.rated_hydrogen_production \n",
+       "       operational_life              │               30 │ year      │ 1     │ h2_storage.operational_life          \n",
+       "       storage_duration              │               0. │ h         │ 1     │ h2_storage.storage_duration          \n",
+       "       SOC                           │             nan. │ percent   │ 8760  │ h2_storage.SOC                       \n",
+       "       storage_hydrogen_discharge    │               0. │ kg/h      │ 8760  │ h2_storage.storage_hydrogen_discharg \n",
+       "                                     │                  │           │       │ e                                    \n",
+       "       storage_hydrogen_charge       │               0. │ kg/h      │ 8760  │ h2_storage.storage_hydrogen_charge   \n",
+       "       standard_capacity_factor      │               0. │ unitless  │ 30    │ h2_storage.standard_capacity_factor  \n",
+       "       storage_capacity              │               0. │ kg        │ 1     │ h2_storage.storage_capacity          \n",
+       "       max_charge_rate               │         679.3478 │ kg/h      │ 1     │ h2_storage.max_charge_rate           \n",
+       "       max_discharge_rate            │         679.3478 │ kg/h      │ 1     │ h2_storage.max_discharge_rate        \n",
+       "   htse                              │                  │           │       │                                      \n",
+       "     HTSECostModel                   │                  │           │       │                                      \n",
+       "       CapEx                         │      32,375,000. │ USD       │ 1     │ htse.CapEx                           \n",
+       "       OpEx                          │               0. │ USD/year  │ 1     │ htse.OpEx                            \n",
+       "       VarOpEx                       │               0. │ USD/year  │ 30    │ htse.VarOpEx                         \n",
+       "       marginal_cost                 │               0. │ USD/kW/h  │ 1     │ htse.marginal_cost                   \n",
+       "       cost_year                     │             2025 │ n/a       │ n/a   │ htse.cost_year                       \n",
+       "     HTSEPerformanceModel            │                  │           │       │                                      \n",
+       "       hydrogen_out                  │         679.3478 │ kg/h      │ 8760  │ htse.hydrogen_out                    \n",
+       "       total_hydrogen_produced       │     5,951,086.96 │ kg        │ 1     │ htse.total_hydrogen_produced         \n",
+       "       annual_hydrogen_produced      │     5,951,086.96 │ kg/year   │ 30    │ htse.annual_hydrogen_produced        \n",
+       "       replacement_schedule          │              0.1 │ unitless  │ 30    │ htse.replacement_schedule            \n",
+       "       capacity_factor               │               1. │ unitless  │ 30    │ htse.capacity_factor                 \n",
+       "       rated_hydrogen_production     │         679.3478 │ kg/h      │ 1     │ htse.rated_hydrogen_production       \n",
+       "       operational_life              │               30 │ year      │ 1     │ htse.operational_life                \n",
+       "       efficiency                    │           0.0292 │ unitless  │ 1     │ htse.efficiency                      \n",
+       "       time_until_replacement        │          80,000. │ h         │ 1     │ htse.time_until_replacement          \n",
+       "       electrolyzer_size_mw          │              25. │ MW        │ 1     │ htse.electrolyzer_size_mw            \n",
+       "       water_demand                  │       6,070.6603 │ kg/h      │ 8760  │ htse.water_demand                    \n",
+       "       heat_demand                   │       4,347.8261 │ kW        │ 8760  │ htse.heat_demand                     \n",
+       "       electricity_demand            │          25,000. │ kW        │ 8760  │ htse.electricity_demand              \n",
+       "       electricity_consumed          │          25,000. │ kW        │ 8760  │ htse.electricity_consumed            \n",
+       "     controller                      │                  │           │       │                                      \n",
+       "       hydrogen_command_value        │   1,000,000,000. │ kg/h      │ 8760  │ htse.hydrogen_command_value          \n",
+       "   htse_to_h2_storage_pipe           │                  │           │       │                                      \n",
+       "     hydrogen_out                    │           0.1887 │ kg/s      │ 8760  │ htse_to_h2_storage_pipe.hydrogen_out \n",
+       "   nuclear                           │                  │           │       │                                      \n",
+       "     SimpleThermalNuclearReactorCost │                  │           │       │                                      \n",
+       " Model                               │                  │           │       │                                      \n",
+       "       CapEx                         │   5,750,000,000. │ USD       │ 1     │ nuclear.CapEx                        \n",
+       "       OpEx                          │       2,640,000. │ USD/year  │ 1     │ nuclear.OpEx                         \n",
+       "       VarOpEx                       │   126,898,502.61 │ USD/year  │ 30    │ nuclear.VarOpEx                      \n",
+       "       marginal_cost                 │               0. │ USD/kW/h  │ 1     │ nuclear.marginal_cost                \n",
+       "       cost_year                     │             2025 │ n/a       │ n/a   │ nuclear.cost_year                    \n",
+       "     SimpleThermalNuclearReactorPerf │                  │           │       │                                      \n",
+       " ormanceModel                        │                  │           │       │                                      \n",
+       "       electricity_out               │       999,043.48 │ kW        │ 8760  │ nuclear.electricity_out              \n",
+       "       total_electricity_produced    │ 8,751,620,869.57 │ kW*h      │ 1     │ nuclear.total_electricity_produced   \n",
+       "       annual_electricity_produced   │ 8,751,620,869.57 │ kW*h/year │ 30    │ nuclear.annual_electricity_produced  \n",
+       "       replacement_schedule          │               0. │ unitless  │ 30    │ nuclear.replacement_schedule         \n",
+       "       capacity_factor               │            0.999 │ unitless  │ 30    │ nuclear.capacity_factor              \n",
+       "       rated_electricity_production  │       1,000,000. │ kW        │ 1     │ nuclear.rated_electricity_production \n",
+       "       operational_life              │               30 │ year      │ 1     │ nuclear.operational_life             \n",
+       "       high_pressure_heat_demanded   │       4,347.8261 │ kW        │ 8760  │ nuclear.high_pressure_heat_demanded  \n",
+       "       high_pressure_heat            │     2,806,122.45 │ kW        │ 8760  │ nuclear.high_pressure_heat           \n",
+       "       low_pressure_heat             │     2,801,774.62 │ kW        │ 8760  │ nuclear.low_pressure_heat            \n",
+       "       heat_out                      │       4,347.8261 │ kW        │ 8760  │ nuclear.heat_out                     \n",
+       "   nuclear_to_htse_cable             │                  │           │       │                                      \n",
+       "     electricity_out                 │       999,043.48 │ kW        │ 8760  │ nuclear_to_htse_cable.electricity_ou \n",
+       "                                     │                  │           │       │ t                                    \n",
+       " site                                │                  │           │       │                                      \n",
+       "   site_component                    │                  │           │       │                                      \n",
+       "     latitude                        │          35.2019 │ deg       │ 1     │ site.latitude                        \n",
+       "     longitude                       │         -101.945 │ deg       │ 1     │ site.longitude                       \n",
+       "     elevation                       │               0. │ m         │ 1     │ site.elevation                       \n",
+       "                                     ╵                  ╵           ╵       ╵                                      \n",
+       "
\n" + ], + "text/plain": [ + " ╷ ╷ ╷ ╷ \n", + " \u001b[1mVariable \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1m Mean\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mUnits \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mShape\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mPromoted name \u001b[0m \n", + "╶────────────────────────────────────┼──────────────────┼───────────┼───────┼─────────────────────────────────────╴\n", + " plant │ │ │ │ \n", + " combiner │ │ │ │ \n", + " GenericCombinerPerformanceModel │ │ │ │ \n", + " hydrogen_out │ 0. │ kg/h │ 8760 │ combiner.hydrogen_out \n", + " capacity_factor │ 0. │ unitless │ 30 │ combiner.capacity_factor \n", + " rated_hydrogen_production │ 0. │ kg/h │ 1 │ combiner.rated_hydrogen_production \n", + " finance_subgroup_electricity │ │ │ │ \n", + " adjusted_capex_opex_comp │ │ │ │ \n", + " capex_adjusted_nuclear │ 5,339,446,612.79 │ USD │ 1 │ finance_subgroup_electricity.capex_a \n", + " │ │ │ │ djusted_nuclear \n", + " opex_adjusted_nuclear │ 2,451,502.44 │ USD/year │ 1 │ finance_subgroup_electricity.opex_ad \n", + " │ │ │ │ justed_nuclear \n", + " varopex_adjusted_nuclear │ 117,837,874.77 │ USD/year │ 30 │ finance_subgroup_electricity.varopex \n", + " │ │ │ │ _adjusted_nuclear \n", + " total_capex_adjusted │ 5,339,446,612.79 │ USD │ 1 │ finance_subgroup_electricity.total_c \n", + " │ │ │ │ apex_adjusted \n", + " total_opex_adjusted │ 2,451,502.44 │ USD/year │ 1 │ finance_subgroup_electricity.total_o \n", + " │ │ │ │ pex_adjusted \n", + " total_varopex_adjusted │ 117,837,874.77 │ USD/year │ 30 │ finance_subgroup_electricity.total_v \n", + " │ │ │ │ aropex_adjusted \n", + " electricity_finance_profast_mod │ │ │ │ \n", + " el │ │ │ │ \n", + " LCOE │ 0.0791 │ USD/kW/h │ 1 │ finance_subgroup_electricity.LCOE \n", + " wacc_electricity │ 0.0625 │ percent │ 1 │ finance_subgroup_electricity.wacc_el \n", + " │ │ │ │ ectricity \n", + " crf_electricity │ 0.0723 │ percent │ 1 │ finance_subgroup_electricity.crf_ele \n", + " │ │ │ │ ctricity \n", + " irr_electricity │ 0.09 │ percent │ 1 │ finance_subgroup_electricity.irr_ele \n", + " │ │ │ │ ctricity \n", + " profit_index_electricity │ 1.5696 │ unitless │ 1 │ finance_subgroup_electricity.profit_ \n", + " │ │ │ │ index_electricity \n", + " investor_payback_period_elect │ 8 │ year │ 1 │ finance_subgroup_electricity.investo \n", + " ricity │ │ │ │ r_payback_period_electricity \n", + " price_electricity │ 0.0791 │ USD/kW/h │ 1 │ finance_subgroup_electricity.price_e \n", + " │ │ │ │ lectricity \n", + " LCOE_breakdown │ n/a │ n/a │ n/a │ finance_subgroup_electricity.LCOE_br \n", + " │ │ │ │ eakdown \n", + " finance_subgroup_hydrogen │ │ │ │ \n", + " adjusted_capex_opex_comp │ │ │ │ \n", + " capex_adjusted_nuclear │ 5,339,446,612.79 │ USD │ 1 │ finance_subgroup_hydrogen.capex_adju \n", + " │ │ │ │ sted_nuclear \n", + " opex_adjusted_nuclear │ 2,451,502.44 │ USD/year │ 1 │ finance_subgroup_hydrogen.opex_adjus \n", + " │ │ │ │ ted_nuclear \n", + " varopex_adjusted_nuclear │ 117,837,874.77 │ USD/year │ 30 │ finance_subgroup_hydrogen.varopex_ad \n", + " │ │ │ │ justed_nuclear \n", + " capex_adjusted_htse │ 30,063,405.93 │ USD │ 1 │ finance_subgroup_hydrogen.capex_adju \n", + " │ │ │ │ sted_htse \n", + " opex_adjusted_htse │ 0. │ USD/year │ 1 │ finance_subgroup_hydrogen.opex_adjus \n", + " │ │ │ │ ted_htse \n", + " varopex_adjusted_htse │ 0. │ USD/year │ 30 │ finance_subgroup_hydrogen.varopex_ad \n", + " │ │ │ │ justed_htse \n", + " total_capex_adjusted │ 5,369,510,018.72 │ USD │ 1 │ finance_subgroup_hydrogen.total_cape \n", + " │ │ │ │ x_adjusted \n", + " total_opex_adjusted │ 2,451,502.44 │ USD/year │ 1 │ finance_subgroup_hydrogen.total_opex \n", + " │ │ │ │ _adjusted \n", + " total_varopex_adjusted │ 117,837,874.77 │ USD/year │ 30 │ finance_subgroup_hydrogen.total_varo \n", + " │ │ │ │ pex_adjusted \n", + " hydrogen_finance_profast_model │ │ │ │ \n", + " LCOH │ 116.8301 │ USD/kg │ 1 │ finance_subgroup_hydrogen.LCOH \n", + " wacc_hydrogen │ 0.0625 │ percent │ 1 │ finance_subgroup_hydrogen.wacc_hydro \n", + " │ │ │ │ gen \n", + " crf_hydrogen │ 0.0723 │ percent │ 1 │ finance_subgroup_hydrogen.crf_hydrog \n", + " │ │ │ │ en \n", + " irr_hydrogen │ 0.09 │ percent │ 1 │ finance_subgroup_hydrogen.irr_hydrog \n", + " │ │ │ │ en \n", + " profit_index_hydrogen │ 1.5695 │ unitless │ 1 │ finance_subgroup_hydrogen.profit_ind \n", + " │ │ │ │ ex_hydrogen \n", + " investor_payback_period_hydro │ 8 │ year │ 1 │ finance_subgroup_hydrogen.investor_p \n", + " gen │ │ │ │ ayback_period_hydrogen \n", + " price_hydrogen │ 116.8301 │ USD/kg │ 1 │ finance_subgroup_hydrogen.price_hydr \n", + " │ │ │ │ ogen \n", + " LCOH_breakdown │ n/a │ n/a │ n/a │ finance_subgroup_hydrogen.LCOH_break \n", + " │ │ │ │ down \n", + " h2_storage │ │ │ │ \n", + " LinedRockCavernStorageCostModel │ │ │ │ \n", + " CapEx │ nan. │ USD │ 1 │ h2_storage.CapEx \n", + " OpEx │ nan. │ USD/year │ 1 │ h2_storage.OpEx \n", + " VarOpEx │ 0. │ USD/year │ 30 │ h2_storage.VarOpEx \n", + " marginal_cost │ 0. │ USD/kg │ 1 │ h2_storage.marginal_cost \n", + " cost_year │ 2018 │ n/a │ n/a │ h2_storage.cost_year \n", + " SimpleStorageOpenLoopController │ │ │ │ \n", + " hydrogen_command_value │ 0. │ kg/h │ 8760 │ h2_storage.hydrogen_command_value \n", + " StorageAutoSizingModel │ │ │ │ \n", + " hydrogen_out │ 0. │ kg/h │ 8760 │ h2_storage.hydrogen_out \n", + " total_hydrogen_produced │ 0. │ kg │ 1 │ h2_storage.total_hydrogen_produced \n", + " annual_hydrogen_produced │ 0. │ kg/year │ 30 │ h2_storage.annual_hydrogen_produced \n", + " replacement_schedule │ 0. │ unitless │ 30 │ h2_storage.replacement_schedule \n", + " capacity_factor │ 0. │ unitless │ 30 │ h2_storage.capacity_factor \n", + " rated_hydrogen_production │ 679.3478 │ kg/h │ 1 │ h2_storage.rated_hydrogen_production \n", + " operational_life │ 30 │ year │ 1 │ h2_storage.operational_life \n", + " storage_duration │ 0. │ h │ 1 │ h2_storage.storage_duration \n", + " SOC │ nan. │ percent │ 8760 │ h2_storage.SOC \n", + " storage_hydrogen_discharge │ 0. │ kg/h │ 8760 │ h2_storage.storage_hydrogen_discharg \n", + " │ │ │ │ e \n", + " storage_hydrogen_charge │ 0. │ kg/h │ 8760 │ h2_storage.storage_hydrogen_charge \n", + " standard_capacity_factor │ 0. │ unitless │ 30 │ h2_storage.standard_capacity_factor \n", + " storage_capacity │ 0. │ kg │ 1 │ h2_storage.storage_capacity \n", + " max_charge_rate │ 679.3478 │ kg/h │ 1 │ h2_storage.max_charge_rate \n", + " max_discharge_rate │ 679.3478 │ kg/h │ 1 │ h2_storage.max_discharge_rate \n", + " htse │ │ │ │ \n", + " HTSECostModel │ │ │ │ \n", + " CapEx │ 32,375,000. │ USD │ 1 │ htse.CapEx \n", + " OpEx │ 0. │ USD/year │ 1 │ htse.OpEx \n", + " VarOpEx │ 0. │ USD/year │ 30 │ htse.VarOpEx \n", + " marginal_cost │ 0. │ USD/kW/h │ 1 │ htse.marginal_cost \n", + " cost_year │ 2025 │ n/a │ n/a │ htse.cost_year \n", + " HTSEPerformanceModel │ │ │ │ \n", + " hydrogen_out │ 679.3478 │ kg/h │ 8760 │ htse.hydrogen_out \n", + " total_hydrogen_produced │ 5,951,086.96 │ kg │ 1 │ htse.total_hydrogen_produced \n", + " annual_hydrogen_produced │ 5,951,086.96 │ kg/year │ 30 │ htse.annual_hydrogen_produced \n", + " replacement_schedule │ 0.1 │ unitless │ 30 │ htse.replacement_schedule \n", + " capacity_factor │ 1. │ unitless │ 30 │ htse.capacity_factor \n", + " rated_hydrogen_production │ 679.3478 │ kg/h │ 1 │ htse.rated_hydrogen_production \n", + " operational_life │ 30 │ year │ 1 │ htse.operational_life \n", + " efficiency │ 0.0292 │ unitless │ 1 │ htse.efficiency \n", + " time_until_replacement │ 80,000. │ h │ 1 │ htse.time_until_replacement \n", + " electrolyzer_size_mw │ 25. │ MW │ 1 │ htse.electrolyzer_size_mw \n", + " water_demand │ 6,070.6603 │ kg/h │ 8760 │ htse.water_demand \n", + " heat_demand │ 4,347.8261 │ kW │ 8760 │ htse.heat_demand \n", + " electricity_demand │ 25,000. │ kW │ 8760 │ htse.electricity_demand \n", + " electricity_consumed │ 25,000. │ kW │ 8760 │ htse.electricity_consumed \n", + " controller │ │ │ │ \n", + " hydrogen_command_value │ 1,000,000,000. │ kg/h │ 8760 │ htse.hydrogen_command_value \n", + " htse_to_h2_storage_pipe │ │ │ │ \n", + " hydrogen_out │ 0.1887 │ kg/s │ 8760 │ htse_to_h2_storage_pipe.hydrogen_out \n", + " nuclear │ │ │ │ \n", + " SimpleThermalNuclearReactorCost │ │ │ │ \n", + " Model │ │ │ │ \n", + " CapEx │ 5,750,000,000. │ USD │ 1 │ nuclear.CapEx \n", + " OpEx │ 2,640,000. │ USD/year │ 1 │ nuclear.OpEx \n", + " VarOpEx │ 126,898,502.61 │ USD/year │ 30 │ nuclear.VarOpEx \n", + " marginal_cost │ 0. │ USD/kW/h │ 1 │ nuclear.marginal_cost \n", + " cost_year │ 2025 │ n/a │ n/a │ nuclear.cost_year \n", + " SimpleThermalNuclearReactorPerf │ │ │ │ \n", + " ormanceModel │ │ │ │ \n", + " electricity_out │ 999,043.48 │ kW │ 8760 │ nuclear.electricity_out \n", + " total_electricity_produced │ 8,751,620,869.57 │ kW*h │ 1 │ nuclear.total_electricity_produced \n", + " annual_electricity_produced │ 8,751,620,869.57 │ kW*h/year │ 30 │ nuclear.annual_electricity_produced \n", + " replacement_schedule │ 0. │ unitless │ 30 │ nuclear.replacement_schedule \n", + " capacity_factor │ 0.999 │ unitless │ 30 │ nuclear.capacity_factor \n", + " rated_electricity_production │ 1,000,000. │ kW │ 1 │ nuclear.rated_electricity_production \n", + " operational_life │ 30 │ year │ 1 │ nuclear.operational_life \n", + " high_pressure_heat_demanded │ 4,347.8261 │ kW │ 8760 │ nuclear.high_pressure_heat_demanded \n", + " high_pressure_heat │ 2,806,122.45 │ kW │ 8760 │ nuclear.high_pressure_heat \n", + " low_pressure_heat │ 2,801,774.62 │ kW │ 8760 │ nuclear.low_pressure_heat \n", + " heat_out │ 4,347.8261 │ kW │ 8760 │ nuclear.heat_out \n", + " nuclear_to_htse_cable │ │ │ │ \n", + " electricity_out │ 999,043.48 │ kW │ 8760 │ nuclear_to_htse_cable.electricity_ou \n", + " │ │ │ │ t \n", + " site │ │ │ │ \n", + " site_component │ │ │ │ \n", + " latitude │ 35.2019 │ deg │ 1 │ site.latitude \n", + " longitude │ -101.945 │ deg │ 1 │ site.longitude \n", + " elevation │ 0. │ m │ 1 │ site.elevation \n", + " ╵ ╵ ╵ ╵ \n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Success!\n" + ] + } + ], + "source": [ + "from h2integrate.core.h2integrate_model import H2IntegrateModel\n", + "\n", + "h2i = H2IntegrateModel(\"nuclear_reactor_thermal_htse.yaml\")\n", + "\n", + "h2i.run()\n", + "\n", + "h2i.post_process()\n", + "\n", + "print(\"Success!\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bc4ecbe5-2172-40f8-9e56-f6ced211d57c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "f2d07504-867d-48c8-a6ae-357f8b4d1c85", + "metadata": {}, + "source": [ + "# from h2integrate.core.h2integrate_model import H2IntegrateModel\n", + "#from inl_h2integrate.h2integrate.core.h2integrate_model import H2IntegrateModel\n", + "from h2integrate.core.h2integrate_model import H2IntegrateModel\n", + "# Create a GreenHEART model\n", + "h2i = H2IntegrateModel(\"nuclear_reactor_thermal_htse.yaml\")\n", + "\n", + "# Run the model\n", + "h2i.run()\n", + "\n", + "h2i.post_process()\n", + "\n", + "print(\"Success!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "96647786-17e4-45c1-b68b-2d903979c0f8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([4347.82608696, 4347.82608696, 4347.82608696, 4347.82608696,\n", + " 4347.82608696])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nuclear_elec_out = h2i.prob.get_val(\"nuclear.heat_command_value\", units=\"kW\")[:5]\n", + "nuclear_elec_out" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e2547492-7844-4e03-9227-e684b8d6aeec", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([4347.82608696, 4347.82608696, 4347.82608696, 4347.82608696,\n", + " 4347.82608696])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nuclear_h2_out = h2i.prob.get_val(\"nuclear.heat_out\", units=\"kW\")[:5]\n", + "nuclear_h2_out" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "c817ab39-01b1-4cac-9f78-92b8c519cf84", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([679.34782609, 679.34782609, 679.34782609, 679.34782609,\n", + " 679.34782609])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nuclear_h2_out = h2i.prob.get_val(\"htse.hydrogen_out\", units=\"kg/h\")[:5]\n", + "nuclear_h2_out" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c59cae7a-5935-4bfb-bd22-1824997924b0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([679.34782609, 679.34782609, 679.34782609, 679.34782609,\n", + " 679.34782609])" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "electrolyzer_h2_out = h2i.prob.get_val(\"plant.h2_storage.hydrogen_in\", units=\"kg/h\")[:5]\n", + "electrolyzer_h2_out" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8bc87a6e-c780-481e-9418-93be85073ad2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([999043.47826087, 999043.47826087, 999043.47826087, 999043.47826087,\n", + " 999043.47826087])" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "htse_heat_in = h2i.prob.get_val(\"htse.electricity_in\", units=\"kW\")[:5]\n", + "htse_heat_in" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b2cadac1-c06d-45a5-8abf-2806ff1f56c4", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import plotly.graph_objects as go\n", + "from plotly.subplots import make_subplots\n", + "\n", + "# import kaleido\n", + "\n", + "\n", + "def plot_graph(\n", + " x_data,\n", + " y_data,\n", + " line_name,\n", + " title,\n", + " x_title,\n", + " y_title,\n", + " filename,\n", + " line_color,\n", + " y,\n", + " line_styles,\n", + " fig_show=False,\n", + "):\n", + " # Define the figure\n", + " fig = make_subplots(specs=[[{\"secondary_y\": True}]]) # fig = go.Figure()\n", + " # Add data to figure\n", + " for i in range(0, len(x_data), 1):\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=x_data[i],\n", + " y=y_data[i],\n", + " name=line_name[i],\n", + " yaxis=y[i],\n", + " line={\"color\": line_color[i], \"dash\": line_styles[i]},\n", + " )\n", + " )\n", + "\n", + " # Create Layout for the Html\n", + "\n", + " fig.update_layout(\n", + " title=go.layout.Title(text=title, xref=\"paper\", x=0.5),\n", + " xaxis=go.layout.XAxis(\n", + " title=go.layout.xaxis.Title(\n", + " text=x_title,\n", + " ),\n", + " rangeslider={\"visible\": True},\n", + " ),\n", + " )\n", + "\n", + " fig.update_layout(\n", + " xaxis={\"domain\": [0.05, 0.95]},\n", + " yaxis={\"title\": {\"text\": \"Power (kW)\"}},\n", + " yaxis2={\"title\": {\"text\": \"Hydrogen Produced (kg/h)\"}, \"overlaying\": \"y\", \"side\": \"right\"},\n", + " yaxis3={\n", + " \"title\": {\"text\": \"yaxis3 title\"},\n", + " \"anchor\": \"free\",\n", + " \"overlaying\": \"y\",\n", + " \"autoshift\": True,\n", + " },\n", + " yaxis4={\n", + " \"title\": {\"text\": \"yaxis4 title\"},\n", + " \"anchor\": \"free\",\n", + " \"overlaying\": \"y\",\n", + " \"autoshift\": True,\n", + " },\n", + " )\n", + "\n", + " fig.write_html((filename + \".html\"), include_mathjax=\"cdn\")\n", + " # fig.write_image(filename + '.svg')\n", + " # fig.write_image(filename + '.pdf')\n", + " if fig_show:\n", + " fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "bd506f44-1a94-41af-9589-4bd4b5325d16", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "line": { + "color": "deepskyblue", + "dash": "solid" + }, + "name": "Electricity Out", + "type": "scatter", + "x": { + "bdata": "AAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkAGUAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAcgBzAHQAdQB2AHcAeAB5AHoAewB8AH0AfgB/AIAAgQCCAIMAhACFAIYAhwCIAIkAigCLAIwAjQCOAI8AkACRAJIAkwCUAJUAlgCXAJgAmQCaAJsAnACdAJ4AnwCgAKEAogCjAKQApQCmAKcAqACpAKoAqwCsAK0ArgCvALAAsQCyALMAtAC1ALYAtwC4ALkAugC7ALwAvQC+AL8AwADBAMIAwwDEAMUAxgDHAMgAyQDKAMsAzADNAM4AzwDQANEA0gDTANQA1QDWANcA2ADZANoA2wDcAN0A3gDfAOAA4QDiAOMA5ADlAOYA5wDoAOkA6gDrAOwA7QDuAO8A8ADxAPIA8wD0APUA9gD3APgA+QD6APsA/AD9AP4A/wAAAQEBAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgEzATQBNQE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAccByAHJAcoBywHMAc0BzgHPAdAB0QHSAdMB1AHVAdYB1wHYAdkB2gHbAdwB3QHeAd8B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AQACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICEwIUAhUCFgIXAhgCGQIaAhsCHAIdAh4CHwIgAiECIgIjAiQCJQImAicCKAIpAioCKwIsAi0CLgIvAjACMQIyAjMCNAI1AjYCNwI4AjkCOgI7AjwCPQI+Aj8CQAJBAkICQwJEAkUCRgJHAkgCSQJKAksCTAJNAk4CTwJQAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJ0AnUCdgJ3AngCeQJ6AnsCfAJ9An4CfwKAAoECggKDAoQChQKGAocCiAKJAooCiwKMAo0CjgKPApACkQKSApMClAKVApYClwKYApkCmgKbApwCnQKeAp8CoAKhAqICowKkAqUCpgKnAqgCqQKqAqsCrAKtAq4CrwKwArECsgKzArQCtQK2ArcCuAK5AroCuwK8Ar0CvgK/AsACwQLCAsMCxALFAsYCxwLIAskCygLLAswCzQLOAs8C0ALRAtIC0wLUAtUC1gLXAtgC2QLaAtsC3ALdAt4C3wLgAuEC4gLjAuQC5QLmAucC6ALpAuoC6wLsAu0C7gLvAvAC8QLyAvMC9AL1AvYC9wL4AvkC+gL7AvwC/QL+Av8CAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRQNGA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSA1MDVANVA1YDVwNYA1kDWgNbA1wDXQNeA18DYANhA2IDYwNkA2UDZgNnA2gDaQNqA2sDbANtA24DbwNwA3EDcgNzA3QDdQN2A3cDeAN5A3oDewN8A30DfgN/A4ADgQOCA4MDhAOFA4YDhwOIA4kDigOLA4wDjQOOA48DkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwOgA6EDogOjA6QDpQOmA6cDqAOpA6oDqwOsA60DrgOvA7ADsQOyA7MDtAO1A7YDtwO4A7kDugO7A7wDvQO+A78DwAPBA8IDwwPEA8UDxgPHA8gDyQPKA8sDzAPNA84DzwPQA9ED0gPTA9QD1QPWA9cD2APZA9oD2wPcA90D3gPfA+AD4QPiA+MD5APlA+YD5wPoA+kD6gPrA+wD7QPuA+8D8APxA/ID8wP0A/UD9gP3A/gD+QP6A/sD/AP9A/4D/wMABAEEAgQDBAQEBQQGBAcECAQJBAoECwQMBA0EDgQPBBAEEQQSBBMEFAQVBBYEFwQYBBkEGgQbBBwEHQQeBB8EIAQhBCIEIwQkBCUEJgQnBCgEKQQqBCsELAQtBC4ELwQwBDEEMgQzBDQENQQ2BDcEOAQ5BDoEOwQ8BD0EPgQ/BEAEQQRCBEMERARFBEYERwRIBEkESgRLBEwETQROBE8EUARRBFIEUwRUBFUEVgRXBFgEWQRaBFsEXARdBF4EXwRgBGEEYgRjBGQEZQRmBGcEaARpBGoEawRsBG0EbgRvBHAEcQRyBHMEdAR1BHYEdwR4BHkEegR7BHwEfQR+BH8EgASBBIIEgwSEBIUEhgSHBIgEiQSKBIsEjASNBI4EjwSQBJEEkgSTBJQElQSWBJcEmASZBJoEmwScBJ0EngSfBKAEoQSiBKMEpASlBKYEpwSoBKkEqgSrBKwErQSuBK8EsASxBLIEswS0BLUEtgS3BLgEuQS6BLsEvAS9BL4EvwTABMEEwgTDBMQExQTGBMcEyATJBMoEywTMBM0EzgTPBNAE0QTSBNME1ATVBNYE1wTYBNkE2gTbBNwE3QTeBN8E4AThBOIE4wTkBOUE5gTnBOgE6QTqBOsE7ATtBO4E7wTwBPEE8gTzBPQE9QT2BPcE+AT5BPoE+wT8BP0E/gT/BAAFAQUCBQMFBAUFBQYFBwUIBQkFCgULBQwFDQUOBQ8FEAURBRIFEwUUBRUFFgUXBRgFGQUaBRsFHAUdBR4FHwUgBSEFIgUjBSQFJQUmBScFKAUpBSoFKwUsBS0FLgUvBTAFMQUyBTMFNAU1BTYFNwU4BTkFOgU7BTwFPQU+BT8FQAVBBUIFQwVEBUUFRgVHBUgFSQVKBUsFTAVNBU4FTwVQBVEFUgVTBVQFVQVWBVcFWAVZBVoFWwVcBV0FXgVfBWAFYQViBWMFZAVlBWYFZwVoBWkFagVrBWwFbQVuBW8FcAVxBXIFcwV0BXUFdgV3BXgFeQV6BXsFfAV9BX4FfwWABYEFggWDBYQFhQWGBYcFiAWJBYoFiwWMBY0FjgWPBZAFkQWSBZMFlAWVBZYFlwWYBZkFmgWbBZwFnQWeBZ8FoAWhBaIFowWkBaUFpgWnBagFqQWqBasFrAWtBa4FrwWwBbEFsgWzBbQFtQW2BbcFuAW5BboFuwW8Bb0FvgW/BcAFwQXCBcMFxAXFBcYFxwXIBckFygXLBcwFzQXOBc8F0AXRBdIF0wXUBdUF1gXXBdgF2QXaBdsF3AXdBd4F3wXgBeEF4gXjBeQF5QXmBecF6AXpBeoF6wXsBe0F7gXvBfAF8QXyBfMF9AX1BfYF9wX4BfkF+gX7BfwF/QX+Bf8FAAYBBgIGAwYEBgUGBgYHBggGCQYKBgsGDAYNBg4GDwYQBhEGEgYTBhQGFQYWBhcGGAYZBhoGGwYcBh0GHgYfBiAGIQYiBiMGJAYlBiYGJwYoBikGKgYrBiwGLQYuBi8GMAYxBjIGMwY0BjUGNgY3BjgGOQY6BjsGPAY9Bj4GPwZABkEGQgZDBkQGRQZGBkcGSAZJBkoGSwZMBk0GTgZPBlAGUQZSBlMGVAZVBlYGVwZYBlkGWgZbBlwGXQZeBl8GYAZhBmIGYwZkBmUGZgZnBmgGaQZqBmsGbAZtBm4GbwZwBnEGcgZzBnQGdQZ2BncGeAZ5BnoGewZ8Bn0GfgZ/BoAGgQaCBoMGhAaFBoYGhwaIBokGigaLBowGjQaOBo8GkAaRBpIGkwaUBpUGlgaXBpgGmQaaBpsGnAadBp4GnwagBqEGogajBqQGpQamBqcGqAapBqoGqwasBq0GrgavBrAGsQayBrMGtAa1BrYGtwa4BrkGuga7BrwGvQa+Br8GwAbBBsIGwwbEBsUGxgbHBsgGyQbKBssGzAbNBs4GzwbQBtEG0gbTBtQG1QbWBtcG2AbZBtoG2wbcBt0G3gbfBuAG4QbiBuMG5AblBuYG5wboBukG6gbrBuwG7QbuBu8G8AbxBvIG8wb0BvUG9gb3BvgG+Qb6BvsG/Ab9Bv4G/wYABwEHAgcDBwQHBQcGBwcHCAcJBwoHCwcMBw0HDgcPBxAHEQcSBxMHFAcVBxYHFwcYBxkHGgcbBxwHHQceBx8HIAchByIHIwckByUHJgcnBygHKQcqBysHLActBy4HLwcwBzEHMgczBzQHNQc2BzcHOAc5BzoHOwc8Bz0HPgc/B0AHQQdCB0MHRAdFB0YHRwdIB0kHSgdLB0wHTQdOB08HUAdRB1IHUwdUB1UHVgdXB1gHWQdaB1sHXAddB14HXwdgB2EHYgdjB2QHZQdmB2cHaAdpB2oHawdsB20HbgdvB3AHcQdyB3MHdAd1B3YHdwd4B3kHegd7B3wHfQd+B38HgAeBB4IHgweEB4UHhgeHB4gHiQeKB4sHjAeNB44HjweQB5EHkgeTB5QHlQeWB5cHmAeZB5oHmwecB50HngefB6AHoQeiB6MHpAelB6YHpweoB6kHqgerB6wHrQeuB68HsAexB7IHswe0B7UHtge3B7gHuQe6B7sHvAe9B74HvwfAB8EHwgfDB8QHxQfGB8cHyAfJB8oHywfMB80HzgfPB9AH0QfSB9MH1AfVB9YH1wfYB9kH2gfbB9wH3QfeB98H4AfhB+IH4wfkB+UH5gfnB+gH6QfqB+sH7AftB+4H7wfwB/EH8gfzB/QH9Qf2B/cH+Af5B/oH+wf8B/0H/gf/BwAIAQgCCAMIBAgFCAYIBwgICAkICggLCAwIDQgOCA8IEAgRCBIIEwgUCBUIFggXCBgIGQgaCBsIHAgdCB4IHwggCCEIIggjCCQIJQgmCCcIKAgpCCoIKwgsCC0ILggvCDAIMQgyCDMINAg1CDYINwg4CDkIOgg7CDwIPQg+CD8IQAhBCEIIQwhECEUIRghHCEgISQhKCEsITAhNCE4ITwhQCFEIUghTCFQIVQhWCFcIWAhZCFoIWwhcCF0IXghfCGAIYQhiCGMIZAhlCGYIZwhoCGkIaghrCGwIbQhuCG8IcAhxCHIIcwh0CHUIdgh3CHgIeQh6CHsIfAh9CH4IfwiACIEIggiDCIQIhQiGCIcIiAiJCIoIiwiMCI0IjgiPCJAIkQiSCJMIlAiVCJYIlwiYCJkImgibCJwInQieCJ8IoAihCKIIowikCKUIpginCKgIqQiqCKsIrAitCK4IrwiwCLEIsgizCLQItQi2CLcIuAi5CLoIuwi8CL0Ivgi/CMAIwQjCCMMIxAjFCMYIxwjICMkIygjLCMwIzQjOCM8I0AjRCNII0wjUCNUI1gjXCNgI2QjaCNsI3AjdCN4I3wjgCOEI4gjjCOQI5QjmCOcI6AjpCOoI6wjsCO0I7gjvCPAI8QjyCPMI9Aj1CPYI9wj4CPkI+gj7CPwI/Qj+CP8IAAkBCQIJAwkECQUJBgkHCQgJCQkKCQsJDAkNCQ4JDwkQCREJEgkTCRQJFQkWCRcJGAkZCRoJGwkcCR0JHgkfCSAJIQkiCSMJJAklCSYJJwkoCSkJKgkrCSwJLQkuCS8JMAkxCTIJMwk0CTUJNgk3CTgJOQk6CTsJPAk9CT4JPwlACUEJQglDCUQJRQlGCUcJSAlJCUoJSwlMCU0JTglPCVAJUQlSCVMJVAlVCVYJVwlYCVkJWglbCVwJXQleCV8JYAlhCWIJYwlkCWUJZglnCWgJaQlqCWsJbAltCW4JbwlwCXEJcglzCXQJdQl2CXcJeAl5CXoJewl8CX0Jfgl/CYAJgQmCCYMJhAmFCYYJhwmICYkJigmLCYwJjQmOCY8JkAmRCZIJkwmUCZUJlgmXCZgJmQmaCZsJnAmdCZ4JnwmgCaEJogmjCaQJpQmmCacJqAmpCaoJqwmsCa0JrgmvCbAJsQmyCbMJtAm1CbYJtwm4CbkJugm7CbwJvQm+Cb8JwAnBCcIJwwnECcUJxgnHCcgJyQnKCcsJzAnNCc4JzwnQCdEJ0gnTCdQJ1QnWCdcJ2AnZCdoJ2wncCd0J3gnfCeAJ4QniCeMJ5AnlCeYJ5wnoCekJ6gnrCewJ7QnuCe8J8AnxCfIJ8wn0CfUJ9gn3CfgJ+Qn6CfsJ/An9Cf4J/wkACgEKAgoDCgQKBQoGCgcKCAoJCgoKCwoMCg0KDgoPChAKEQoSChMKFAoVChYKFwoYChkKGgobChwKHQoeCh8KIAohCiIKIwokCiUKJgonCigKKQoqCisKLAotCi4KLwowCjEKMgozCjQKNQo2CjcKOAo5CjoKOwo8Cj0KPgo/CkAKQQpCCkMKRApFCkYKRwpICkkKSgpLCkwKTQpOCk8KUApRClIKUwpUClUKVgpXClgKWQpaClsKXApdCl4KXwpgCmEKYgpjCmQKZQpmCmcKaAppCmoKawpsCm0KbgpvCnAKcQpyCnMKdAp1CnYKdwp4CnkKegp7CnwKfQp+Cn8KgAqBCoIKgwqECoUKhgqHCogKiQqKCosKjAqNCo4KjwqQCpEKkgqTCpQKlQqWCpcKmAqZCpoKmwqcCp0KngqfCqAKoQqiCqMKpAqlCqYKpwqoCqkKqgqrCqwKrQquCq8KsAqxCrIKswq0CrUKtgq3CrgKuQq6CrsKvAq9Cr4KvwrACsEKwgrDCsQKxQrGCscKyArJCsoKywrMCs0KzgrPCtAK0QrSCtMK1ArVCtYK1wrYCtkK2grbCtwK3QreCt8K4ArhCuIK4wrkCuUK5grnCugK6QrqCusK7ArtCu4K7wrwCvEK8grzCvQK9Qr2CvcK+Ar5CvoK+wr8Cv0K/gr/CgALAQsCCwMLBAsFCwYLBwsICwkLCgsLCwwLDQsOCw8LEAsRCxILEwsUCxULFgsXCxgLGQsaCxsLHAsdCx4LHwsgCyELIgsjCyQLJQsmCycLKAspCyoLKwssCy0LLgsvCzALMQsyCzMLNAs1CzYLNws4CzkLOgs7CzwLPQs+Cz8LQAtBC0ILQwtEC0ULRgtHC0gLSQtKC0sLTAtNC04LTwtQC1ELUgtTC1QLVQtWC1cLWAtZC1oLWwtcC10LXgtfC2ALYQtiC2MLZAtlC2YLZwtoC2kLagtrC2wLbQtuC28LcAtxC3ILcwt0C3ULdgt3C3gLeQt6C3sLfAt9C34LfwuAC4ELgguDC4QLhQuGC4cLiAuJC4oLiwuMC40LjguPC5ALkQuSC5MLlAuVC5YLlwuYC5kLmgubC5wLnQueC58LoAuhC6ILowukC6ULpgunC6gLqQuqC6sLrAutC64LrwuwC7ELsguzC7QLtQu2C7cLuAu5C7oLuwu8C70Lvgu/C8ALwQvCC8MLxAvFC8YLxwvIC8kLygvLC8wLzQvOC88L0AvRC9IL0wvUC9UL1gvXC9gL2QvaC9sL3AvdC94L3wvgC+EL4gvjC+QL5QvmC+cL6AvpC+oL6wvsC+0L7gvvC/AL8QvyC/ML9Av1C/YL9wv4C/kL+gv7C/wL/Qv+C/8LAAwBDAIMAwwEDAUMBgwHDAgMCQwKDAsMDAwNDA4MDwwQDBEMEgwTDBQMFQwWDBcMGAwZDBoMGwwcDB0MHgwfDCAMIQwiDCMMJAwlDCYMJwwoDCkMKgwrDCwMLQwuDC8MMAwxDDIMMww0DDUMNgw3DDgMOQw6DDsMPAw9DD4MPwxADEEMQgxDDEQMRQxGDEcMSAxJDEoMSwxMDE0MTgxPDFAMUQxSDFMMVAxVDFYMVwxYDFkMWgxbDFwMXQxeDF8MYAxhDGIMYwxkDGUMZgxnDGgMaQxqDGsMbAxtDG4MbwxwDHEMcgxzDHQMdQx2DHcMeAx5DHoMewx8DH0Mfgx/DIAMgQyCDIMMhAyFDIYMhwyIDIkMigyLDIwMjQyODI8MkAyRDJIMkwyUDJUMlgyXDJgMmQyaDJsMnAydDJ4MnwygDKEMogyjDKQMpQymDKcMqAypDKoMqwysDK0MrgyvDLAMsQyyDLMMtAy1DLYMtwy4DLkMugy7DLwMvQy+DL8MwAzBDMIMwwzEDMUMxgzHDMgMyQzKDMsMzAzNDM4MzwzQDNEM0gzTDNQM1QzWDNcM2AzZDNoM2wzcDN0M3gzfDOAM4QziDOMM5AzlDOYM5wzoDOkM6gzrDOwM7QzuDO8M8AzxDPIM8wz0DPUM9gz3DPgM+Qz6DPsM/Az9DP4M/wwADQENAg0DDQQNBQ0GDQcNCA0JDQoNCw0MDQ0NDg0PDRANEQ0SDRMNFA0VDRYNFw0YDRkNGg0bDRwNHQ0eDR8NIA0hDSINIw0kDSUNJg0nDSgNKQ0qDSsNLA0tDS4NLw0wDTENMg0zDTQNNQ02DTcNOA05DToNOw08DT0NPg0/DUANQQ1CDUMNRA1FDUYNRw1IDUkNSg1LDUwNTQ1ODU8NUA1RDVINUw1UDVUNVg1XDVgNWQ1aDVsNXA1dDV4NXw1gDWENYg1jDWQNZQ1mDWcNaA1pDWoNaw1sDW0Nbg1vDXANcQ1yDXMNdA11DXYNdw14DXkNeg17DXwNfQ1+DX8NgA2BDYINgw2EDYUNhg2HDYgNiQ2KDYsNjA2NDY4Njw2QDZENkg2TDZQNlQ2WDZcNmA2ZDZoNmw2cDZ0Nng2fDaANoQ2iDaMNpA2lDaYNpw2oDakNqg2rDawNrQ2uDa8NsA2xDbINsw20DbUNtg23DbgNuQ26DbsNvA29Db4Nvw3ADcENwg3DDcQNxQ3GDccNyA3JDcoNyw3MDc0Nzg3PDdAN0Q3SDdMN1A3VDdYN1w3YDdkN2g3bDdwN3Q3eDd8N4A3hDeIN4w3kDeUN5g3nDegN6Q3qDesN7A3tDe4N7w3wDfEN8g3zDfQN9Q32DfcN+A35DfoN+w38Df0N/g3/DQAOAQ4CDgMOBA4FDgYOBw4IDgkOCg4LDgwODQ4ODg8OEA4RDhIOEw4UDhUOFg4XDhgOGQ4aDhsOHA4dDh4OHw4gDiEOIg4jDiQOJQ4mDicOKA4pDioOKw4sDi0OLg4vDjAOMQ4yDjMONA41DjYONw44DjkOOg47DjwOPQ4+Dj8OQA5BDkIOQw5EDkUORg5HDkgOSQ5KDksOTA5NDk4OTw5QDlEOUg5TDlQOVQ5WDlcOWA5ZDloOWw5cDl0OXg5fDmAOYQ5iDmMOZA5lDmYOZw5oDmkOag5rDmwObQ5uDm8OcA5xDnIOcw50DnUOdg53DngOeQ56DnsOfA59Dn4Ofw6ADoEOgg6DDoQOhQ6GDocOiA6JDooOiw6MDo0Ojg6PDpAOkQ6SDpMOlA6VDpYOlw6YDpkOmg6bDpwOnQ6eDp8OoA6hDqIOow6kDqUOpg6nDqgOqQ6qDqsOrA6tDq4Orw6wDrEOsg6zDrQOtQ62DrcOuA65DroOuw68Dr0Ovg6/DsAOwQ7CDsMOxA7FDsYOxw7IDskOyg7LDswOzQ7ODs8O0A7RDtIO0w7UDtUO1g7XDtgO2Q7aDtsO3A7dDt4O3w7gDuEO4g7jDuQO5Q7mDucO6A7pDuoO6w7sDu0O7g7vDvAO8Q7yDvMO9A71DvYO9w74DvkO+g77DvwO/Q7+Dv8OAA8BDwIPAw8EDwUPBg8HDwgPCQ8KDwsPDA8NDw4PDw8QDxEPEg8TDxQPFQ8WDxcPGA8ZDxoPGw8cDx0PHg8fDyAPIQ8iDyMPJA8lDyYPJw8oDykPKg8rDywPLQ8uDy8PMA8xDzIPMw80DzUPNg83DzgPOQ86DzsPPA89Dz4PPw9AD0EPQg9DD0QPRQ9GD0cPSA9JD0oPSw9MD00PTg9PD1APUQ9SD1MPVA9VD1YPVw9YD1kPWg9bD1wPXQ9eD18PYA9hD2IPYw9kD2UPZg9nD2gPaQ9qD2sPbA9tD24Pbw9wD3EPcg9zD3QPdQ92D3cPeA95D3oPew98D30Pfg9/D4APgQ+CD4MPhA+FD4YPhw+ID4kPig+LD4wPjQ+OD48PkA+RD5IPkw+UD5UPlg+XD5gPmQ+aD5sPnA+dD54Pnw+gD6EPog+jD6QPpQ+mD6cPqA+pD6oPqw+sD60Prg+vD7APsQ+yD7MPtA+1D7YPtw+4D7kPug+7D7wPvQ++D78PwA/BD8IPww/ED8UPxg/HD8gPyQ/KD8sPzA/ND84Pzw/QD9EP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VhNXE1gTWRNaE1sTXBNdE14TXxNgE2ETYhNjE2QTZRNmE2cTaBNpE2oTaxNsE20TbhNvE3ATcRNyE3MTdBN1E3YTdxN4E3kTehN7E3wTfRN+E38TgBOBE4ITgxOEE4UThhOHE4gTiROKE4sTjBONE44TjxOQE5ETkhOTE5QTlROWE5cTmBOZE5oTmxOcE50TnhOfE6AToROiE6MTpBOlE6YTpxOoE6kTqhOrE6wTrROuE68TsBOxE7ITsxO0E7UTthO3E7gTuRO6E7sTvBO9E74TvxPAE8ETwhPDE8QTxRPGE8cTyBPJE8oTyxPME80TzhPPE9AT0RPSE9MT1BPVE9YT1xPYE9kT2hPbE9wT3RPeE98T4BPhE+IT4xPkE+UT5hPnE+gT6RPqE+sT7BPtE+4T7xPwE/ET8hPzE/QT9RP2E/cT+BP5E/oT+xP8E/0T/hP/EwAUARQCFAMUBBQFFAYUBxQIFAkUChQLFAwUDRQOFA8UEBQRFBIUExQUFBUUFhQXFBgUGRQaFBsUHBQdFB4UHxQgFCEUIhQjFCQUJRQmFCcUKBQpFCoUKxQsFC0ULhQvFDAUMRQyFDMUNBQ1FDYUNxQ4FDkUOhQ7FDwUPRQ+FD8UQBRBFEIUQxREFEUURhRHFEgUSRRKFEsUTBRNFE4UTxRQFFEUUhRTFFQUVRRWFFcUWBRZFFoUWxRcFF0UXhRfFGAUYRRiFGMUZBRlFGYUZxRoFGkUahRrFGwUbRRuFG8UcBRxFHIUcxR0FHUUdhR3FHgUeRR6FHsUfBR9FH4UfxSAFIEUghSDFIQUhRSGFIcUiBSJFIoUixSMFI0UjhSPFJAUkRSSFJMUlBSVFJYUlxSYFJkUmhSbFJwUnRSeFJ8UoBShFKIUoxSkFKUUphSnFKgUqRSqFKsUrBStFK4UrxSwFLEUshSzFLQUtRS2FLcUuBS5FLoUuxS8FL0UvhS/FMAUwRTCFMMUxBTFFMYUxxTIFMkUyhTLFMwUzRTOFM8U0BTRFNIU0xTUFNUU1hTXFNgU2RTaFNsU3BTdFN4U3xTgFOEU4hTjFOQU5RTmFOcU6BTpFOoU6xTsFO0U7hTvFPAU8RTyFPMU9BT1FPYU9xT4FPkU+hT7FPwU/RT+FP8UABUBFQIVAxUEFQUVBhUHFQgVCRUKFQsVDBUNFQ4VDxUQFREVEhUTFRQVFRUWFRcVGBUZFRoVGxUcFR0VHhUfFSAVIRUiFSMVJBUlFSYVJxUoFSkVKhUrFSwVLRUuFS8VMBUxFTIVMxU0FTUVNhU3FTgVORU6FTsVPBU9FT4VPxVAFUEVQhVDFUQVRRVGFUcVSBVJFUoVSxVMFU0VThVPFVAVURVSFVMVVBVVFVYVVxVYFVkVWhVbFVwVXRVeFV8VYBVhFWIVYxVkFWUVZhVnFWgVaRVqFWsVbBVtFW4VbxVwFXEVchVzFXQVdRV2FXcVeBV5FXoVexV8FX0VfhV/FYAVgRWCFYMVhBWFFYYVhxWIFYkVihWLFYwVjRWOFY8VkBWRFZIVkxWUFZUVlhWXFZgVmRWaFZsVnBWdFZ4VnxWgFaEVohWjFaQVpRWmFacVqBWpFaoVqxWsFa0VrhWvFbAVsRWyFbMVtBW1FbYVtxW4FbkVuhW7FbwVvRW+Fb8VwBXBFcIVwxXEFcUVxhXHFcgVyRXKFcsVzBXNFc4VzxXQFdEV0hXTFdQV1RXWFdcV2BXZFdoV2xXcFd0V3hXfFeAV4RXiFeMV5BXlFeYV5xXoFekV6hXrFewV7RXuFe8V8BXxFfIV8xX0FfUV9hX3FfgV+RX6FfsV/BX9Ff4V/xUAFgEWAhYDFgQWBRYGFgcWCBYJFgoWCxYMFg0WDhYPFhAWERYSFhMWFBYVFhYWFxYYFhkWGhYbFhwWHRYeFh8WIBYhFiIWIxYkFiUWJhYnFigWKRYqFisWLBYtFi4WLxYwFjEWMhYzFjQWNRY2FjcWOBY5FjoWOxY8Fj0WPhY/FkAWQRZCFkMWRBZFFkYWRxZIFkkWShZLFkwWTRZOFk8WUBZRFlIWUxZUFlUWVhZXFlgWWRZaFlsWXBZdFl4WXxZgFmEWYhZjFmQWZRZmFmcWaBZpFmoWaxZsFm0WbhZvFnAWcRZyFnMWdBZ1FnYWdxZ4FnkWehZ7FnwWfRZ+Fn8WgBaBFoIWgxaEFoUWhhaHFogWiRaKFosWjBaNFo4WjxaQFpEWkhaTFpQWlRaWFpcWmBaZFpoWmxacFp0WnhafFqAWoRaiFqMWpBalFqYWpxaoFqkWqharFqwWrRauFq8WsBaxFrIWsxa0FrUWtha3FrgWuRa6FrsWvBa9Fr4WvxbAFsEWwhbDFsQWxRbGFscWyBbJFsoWyxbMFs0WzhbPFtAW0RbSFtMW1BbVFtYW1xbYFtkW2hbbFtwW3RbeFt8W4BbhFuIW4xbkFuUW5hbnFugW6RbqFusW7BbtFu4W7xbwFvEW8hbzFvQW9Rb2FvcW+Bb5FvoW+xb8Fv0W/hb/FgAXARcCFwMXBBcFFwYXBxcIFwkXChcLFwwXDRcOFw8XEBcRFxIXExcUFxUXFhcXFxgXGRcaFxsXHBcdFx4XHxcgFyEXIhcjFyQXJRcmFycXKBcpFyoXKxcsFy0XLhcvFzAXMRcyFzMXNBc1FzYXNxc4FzkXOhc7FzwXPRc+Fz8XQBdBF0IXQxdEF0UXRhdHF0gXSRdKF0sXTBdNF04XTxdQF1EXUhdTF1QXVRdWF1cXWBdZF1oXWxdcF10XXhdfF2AXYRdiF2MXZBdlF2YXZxdoF2kXahdrF2wXbRduF28XcBdxF3IXcxd0F3UXdhd3F3gXeRd6F3sXfBd9F34XfxeAF4EXgheDF4QXhReGF4cXiBeJF4oXixeMF40XjhePF5AXkReSF5MXlBeVF5YXlxeYF5kXmhebF5wXnReeF58XoBehF6IXoxekF6UXphenF6gXqReqF6sXrBetF64XrxewF7EXshezF7QXtRe2F7cXuBe5F7oXuxe8F70Xvhe/F8AXwRfCF8MXxBfFF8YXxxfIF8kXyhfLF8wXzRfOF88X0BfRF9IX0xfUF9UX1hfXF9gX2RfaF9sX3BfdF94X3xfgF+EX4hfjF+QX5RfmF+cX6BfpF+oX6xfsF+0X7hfvF/AX8RfyF/MX9Bf1F/YX9xf4F/kX+hf7F/wX/Rf+F/8XABgBGAIYAxgEGAUYBhgHGAgYCRgKGAsYDBgNGA4YDxgQGBEYEhgTGBQYFRgWGBcYGBgZGBoYGxgcGB0YHhgfGCAYIRgiGCMYJBglGCYYJxgoGCkYKhgrGCwYLRguGC8YMBgxGDIYMxg0GDUYNhg3GDgYORg6GDsYPBg9GD4YPxhAGEEYQhhDGEQYRRhGGEcYSBhJGEoYSxhMGE0YThhPGFAYURhSGFMYVBhVGFYYVxhYGFkYWhhbGFwYXRheGF8YYBhhGGIYYxhkGGUYZhhnGGgYaRhqGGsYbBhtGG4YbxhwGHEYchhzGHQYdRh2GHcYeBh5GHoYexh8GH0Yfhh/GIAYgRiCGIMYhBiFGIYYhxiIGIkYihiLGIwYjRiOGI8YkBiRGJIYkxiUGJUYlhiXGJgYmRiaGJsYnBidGJ4YnxigGKEYohijGKQYpRimGKcYqBipGKoYqxisGK0YrhivGLAYsRiyGLMYtBi1GLYYtxi4GLkYuhi7GLwYvRi+GL8YwBjBGMIYwxjEGMUYxhjHGMgYyRjKGMsYzBjNGM4YzxjQGNEY0hjTGNQY1RjWGNcY2BjZGNoY2xjcGN0Y3hjfGOAY4RjiGOMY5BjlGOYY5xjoGOkY6hjrGOwY7RjuGO8Y8BjxGPIY8xj0GPUY9hj3GPgY+Rj6GPsY/Bj9GP4Y/xgAGQEZAhkDGQQZBRkGGQcZCBkJGQoZCxkMGQ0ZDhkPGRAZERkSGRMZFBkVGRYZFxkYGRkZGhkbGRwZHRkeGR8ZIBkhGSIZIxkkGSUZJhknGSgZKRkqGSsZLBktGS4ZLxkwGTEZMhkzGTQZNRk2GTcZOBk5GToZOxk8GT0ZPhk/GUAZQRlCGUMZRBlFGUYZRxlIGUkZShlLGUwZTRlOGU8ZUBlRGVIZUxlUGVUZVhlXGVgZWRlaGVsZXBldGV4ZXxlgGWEZYhljGWQZZRlmGWcZaBlpGWoZaxlsGW0ZbhlvGXAZcRlyGXMZdBl1GXYZdxl4GXkZehl7GXwZfRl+GX8ZgBmBGYIZgxmEGYUZhhmHGYgZiRmKGYsZjBmNGY4ZjxmQGZEZkhmTGZQZlRmWGZcZmBmZGZoZmxmcGZ0ZnhmfGaAZoRmiGaMZpBmlGaYZpxmoGakZqhmrGawZrRmuGa8ZsBmxGbIZsxm0GbUZthm3GbgZuRm6GbsZvBm9Gb4ZvxnAGcEZwhnDGcQZxRnGGccZyBnJGcoZyxnMGc0ZzhnPGdAZ0RnSGdMZ1BnVGdYZ1xnYGdkZ2hnbGdwZ3RneGd8Z4BnhGeIZ4xnkGeUZ5hnnGegZ6RnqGesZ7BntGe4Z7xnwGfEZ8hnzGfQZ9Rn2GfcZ+Bn5GfoZ+xn8Gf0Z/hn/GQAaARoCGgMaBBoFGgYaBxoIGgkaChoLGgwaDRoOGg8aEBoRGhIaExoUGhUaFhoXGhgaGRoaGhsaHBodGh4aHxogGiEaIhojGiQaJRomGicaKBopGioaKxosGi0aLhovGjAaMRoyGjMaNBo1GjYaNxo4GjkaOho7GjwaPRo+Gj8aQBpBGkIaQxpEGkUaRhpHGkgaSRpKGksaTBpNGk4aTxpQGlEaUhpTGlQaVRpWGlcaWBpZGloaWxpcGl0aXhpfGmAaYRpiGmMaZBplGmYaZxpoGmkaahprGmwabRpuGm8acBpxGnIacxp0GnUadhp3GngaeRp6GnsafBp9Gn4afxqAGoEaghqDGoQahRqGGocaiBqJGooaixqMGo0ajhqPGpAakRqSGpMalBqVGpYalxqYGpkamhqbGpwanRqeGp8aoBqhGqIaoxqkGqUaphqnGqgaqRqqGqsarBqtGq4arxqwGrEashqzGrQatRq2GrcauBq5Groauxq8Gr0avhq/GsAawRrCGsMaxBrFGsYaxxrIGskayhrLGswazRrOGs8a0BrRGtIa0xrUGtUa1hrXGtga2RraGtsa3BrdGt4a3xrgGuEa4hrjGuQa5RrmGuca6BrpGuoa6xrsGu0a7hrvGvAa8RryGvMa9Br1GvYa9xr4Gvka+hr7Gvwa/Rr+Gv8aABsBGwIbAxsEGwUbBhsHGwgbCRsKGwsbDBsNGw4bDxsQGxEbEhsTGxQbFRsWGxcbGBsZGxobGxscGx0bHhsfGyAbIRsiGyMbJBslGyYbJxsoGykbKhsrGywbLRsuGy8bMBsxGzIbMxs0GzUbNhs3GzgbORs6GzsbPBs9Gz4bPxtAG0EbQhtDG0QbRRtGG0cbSBtJG0obSxtMG00bThtPG1AbURtSG1MbVBtVG1YbVxtYG1kbWhtbG1wbXRteG18bYBthG2IbYxtkG2UbZhtnG2gbaRtqG2sbbBttG24bbxtwG3EbchtzG3QbdRt2G3cbeBt5G3obext8G30bfht/G4AbgRuCG4MbhBuFG4YbhxuIG4kbihuLG4wbjRuOG48bkBuRG5IbkxuUG5UblhuXG5gbmRuaG5sbnBudG54bnxugG6EbohujG6QbpRumG6cbqBupG6obqxusG60brhuvG7AbsRuyG7MbtBu1G7Ybtxu4G7kbuhu7G7wbvRu+G78bwBvBG8IbwxvEG8UbxhvHG8gbyRvKG8sbzBvNG84bzxvQG9Eb0hvTG9Qb1RvWG9cb2BvZG9ob2xvcG90b3hvfG+Ab4RviG+Mb5BvlG+Yb5xvoG+kb6hvrG+wb7RvuG+8b8BvxG/Ib8xv0G/Ub9hv3G/gb+Rv6G/sb/Bv9G/4b/xsAHAEcAhwDHAQcBRwGHAccCBwJHAocCxwMHA0cDhwPHBAcERwSHBMcFBwVHBYcFxwYHBkcGhwbHBwcHRweHB8cIBwhHCIcIxwkHCUcJhwnHCgcKRwqHCscLBwtHC4cLxwwHDEcMhwzHDQcNRw2HDccOBw5HDocOxw8HD0cPhw/HEAcQRxCHEMcRBxFHEYcRxxIHEkcShxLHEwcTRxOHE8cUBxRHFIcUxxUHFUcVhxXHFgcWRxaHFscXBxdHF4cXxxgHGEcYhxjHGQcZRxmHGccaBxpHGocaxxsHG0cbhxvHHAccRxyHHMcdBx1HHYcdxx4HHkcehx7HHwcfRx+HH8cgByBHIIcgxyEHIUchhyHHIgciRyKHIscjByNHI4cjxyQHJEckhyTHJQclRyWHJccmByZHJocmxycHJ0cnhyfHKAcoRyiHKMcpBylHKYcpxyoHKkcqhyrHKwcrRyuHK8csByxHLIcsxy0HLUcthy3HLgcuRy6HLscvBy9HL4cvxzAHMEcwhzDHMQcxRzGHMccyBzJHMocyxzMHM0czhzPHNAc0RzSHNMc1BzVHNYc1xzYHNkc2hzbHNwc3RzeHN8c4BzhHOIc4xzkHOUc5hznHOgc6RzqHOsc7BztHO4c7xzwHPEc8hzzHPQc9Rz2HPcc+Bz5HPoc+xz8HP0c/hz/HAAdAR0CHQMdBB0FHQYdBx0IHQkdCh0LHQwdDR0OHQ8dEB0RHRIdEx0UHRUdFh0XHRgdGR0aHRsdHB0dHR4dHx0gHSEdIh0jHSQdJR0mHScdKB0pHSodKx0sHS0dLh0vHTAdMR0yHTMdNB01HTYdNx04HTkdOh07HTwdPR0+HT8dQB1BHUIdQx1EHUUdRh1HHUgdSR1KHUsdTB1NHU4dTx1QHVEdUh1THVQdVR1WHVcdWB1ZHVodWx1cHV0dXh1fHWAdYR1iHWMdZB1lHWYdZx1oHWkdah1rHWwdbR1uHW8dcB1xHXIdcx10HXUddh13HXgdeR16HXsdfB19HX4dfx2AHYEdgh2DHYQdhR2GHYcdiB2JHYodix2MHY0djh2PHZAdkR2SHZMdlB2VHZYdlx2YHZkdmh2bHZwdnR2eHZ8doB2hHaIdox2kHaUdph2nHagdqR2qHasdrB2tHa4drx2wHbEdsh2zHbQdtR22HbcduB25Hbodux28Hb0dvh2/HcAdwR3CHcMdxB3FHcYdxx3IHckdyh3LHcwdzR3OHc8d0B3RHdId0x3UHdUd1h3XHdgd2R3aHdsd3B3dHd4d3x3gHeEd4h3jHeQd5R3mHecd6B3pHeod6x3sHe0d7h3vHfAd8R3yHfMd9B31HfYd9x34Hfkd+h37Hfwd/R3+Hf8dAB4BHgIeAx4EHgUeBh4HHggeCR4KHgseDB4NHg4eDx4QHhEeEh4THhQeFR4WHhceGB4ZHhoeGx4cHh0eHh4fHiAeIR4iHiMeJB4lHiYeJx4oHikeKh4rHiweLR4uHi8eMB4xHjIeMx40HjUeNh43HjgeOR46HjsePB49Hj4ePx5AHkEeQh5DHkQeRR5GHkceSB5JHkoeSx5MHk0eTh5PHlAeUR5SHlMeVB5VHlYeVx5YHlkeWh5bHlweXR5eHl8eYB5hHmIeYx5kHmUeZh5nHmgeaR5qHmsebB5tHm4ebx5wHnEech5zHnQedR52HnceeB55Hnoeex58Hn0efh5/HoAegR6CHoMehB6FHoYehx6IHokeih6LHowejR6OHo8ekB6RHpIekx6UHpUelh6XHpgemR6aHpsenB6dHp4enx6gHqEeoh6jHqQepR6mHqceqB6pHqoeqx6sHq0erh6vHrAesR6yHrMetB61HrYetx64Hrkeuh67HrwevR6+Hr8ewB7BHsIewx7EHsUexh7HHsgeyR7KHssezB7NHs4ezx7QHtEe0h7THtQe1R7WHtce2B7ZHtoe2x7cHt0e3h7fHuAe4R7iHuMe5B7lHuYe5x7oHuke6h7rHuwe7R7uHu8e8B7xHvIe8x70HvUe9h73Hvge+R76Hvse/B79Hv4e/x4AHwEfAh8DHwQfBR8GHwcfCB8JHwofCx8MHw0fDh8PHxAfER8SHxMfFB8VHxYfFx8YHxkfGh8bHxwfHR8eHx8fIB8hHyIfIx8kHyUfJh8nHygfKR8qHysfLB8tHy4fLx8wHzEfMh8zHzQfNR82HzcfOB85HzofOx88Hz0fPh8/H0AfQR9CH0MfRB9FH0YfRx9IH0kfSh9LH0wfTR9OH08fUB9RH1IfUx9UH1UfVh9XH1gfWR9aH1sfXB9dH14fXx9gH2EfYh9jH2QfZR9mH2cfaB9pH2ofax9sH20fbh9vH3AfcR9yH3MfdB91H3Yfdx94H3kfeh97H3wffR9+H38fgB+BH4Ifgx+EH4Ufhh+HH4gfiR+KH4sfjB+NH44fjx+QH5Efkh+TH5QflR+WH5cfmB+ZH5ofmx+cH50fnh+fH6AfoR+iH6MfpB+lH6Yfpx+oH6kfqh+rH6wfrR+uH68fsB+xH7Ifsx+0H7Ufth+3H7gfuR+6H7sfvB+9H74fvx/AH8Efwh/DH8QfxR/GH8cfyB/JH8ofyx/MH80fzh/PH9Af0R/SH9Mf1B/VH9Yf1x/YH9kf2h/bH9wf3R/eH98f4B/hH+If4x/kH+Uf5h/nH+gf6R/qH+sf7B/tH+4f7x/wH/Ef8h/zH/Qf9R/2H/cf+B/5H/of+x/8H/0f/h//HwAgASACIAMgBCAFIAYgByAIIAkgCiALIAwgDSAOIA8gECARIBIgEyAUIBUgFiAXIBggGSAaIBsgHCAdIB4gHyAgICEgIiAjICQgJSAmICcgKCApICogKyAsIC0gLiAvIDAgMSAyIDMgNCA1IDYgNyA4IDkgOiA7IDwgPSA+ID8gQCBBIEIgQyBEIEUgRiBHIEggSSBKIEsgTCBNIE4gTyBQIFEgUiBTIFQgVSBWIFcgWCBZIFogWyBcIF0gXiBfIGAgYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuIG8gcCBxIHIgcyB0IHUgdiB3IHggeSB6IHsgfCB9IH4gfyCAIIEggiCDIIQghSCGIIcgiCCJIIogiyCMII0gjiCPIJAgkSCSIJMglCCVIJYglyCYIJkgmiCbIJwgnSCeIJ8goCChIKIgoyCkIKUgpiCnIKggqSCqIKsgrCCtIK4gryCwILEgsiCzILQgtSC2ILcguCC5ILoguyC8IL0gviC/IMAgwSDCIMMgxCDFIMYgxyDIIMkgyiDLIMwgzSDOIM8g0CDRINIg0yDUINUg1iDXINgg2SDaINsg3CDdIN4g3yDgIOEg4iDjIOQg5SDmIOcg6CDpIOog6yDsIO0g7iDvIPAg8SDyIPMg9CD1IPYg9yD4IPkg+iD7IPwg/SD+IP8gACEBIQIhAyEEIQUhBiEHIQghCSEKIQshDCENIQ4hDyEQIREhEiETIRQhFSEWIRchGCEZIRohGyEcIR0hHiEfISAhISEiISMhJCElISYhJyEoISkhKiErISwhLSEuIS8hMCExITIhMyE0ITUhNiE3ITghOSE6ITshPCE9IT4hPyFAIUEhQiFDIUQhRSFGIUchSCFJIUohSyFMIU0hTiFPIVAhUSFSIVMhVCFVIVYhVyFYIVkhWiFbIVwhXSFeIV8hYCFhIWIhYyFkIWUhZiFnIWghaSFqIWshbCFtIW4hbyFwIXEhciFzIXQhdSF2IXcheCF5IXoheyF8IX0hfiF/IYAhgSGCIYMhhCGFIYYhhyGIIYkhiiGLIYwhjSGOIY8hkCGRIZIhkyGUIZUhliGXIZghmSGaIZshnCGdIZ4hnyGgIaEhoiGjIaQhpSGmIachqCGpIaohqyGsIa0hriGvIbAhsSGyIbMhtCG1IbYhtyG4IbkhuiG7IbwhvSG+Ib8hwCHBIcIhwyHEIcUhxiHHIcghySHKIcshzCHNIc4hzyHQIdEh0iHTIdQh1SHWIdch2CHZIdoh2yHcId0h3iHfIeAh4SHiIeMh5CHlIeYh5yHoIekh6iHrIewh7SHuIe8h8CHxIfIh8yH0IfUh9iH3Ifgh+SH6Ifsh/CH9If4h/yEAIgEiAiIDIgQiBSIGIgciCCIJIgoiCyIMIg0iDiIPIhAiESISIhMiFCIVIhYiFyIYIhkiGiIbIhwiHSIeIh8iICIhIiIiIyIkIiUiJiInIigiKSIqIisiLCItIi4iLyIwIjEiMiIzIjQiNSI2Ijci", + "dtype": "i2" + }, + "y": { + "bdata": "GLKQhSxkEUAYspCFLGQRQBiykIUsZBFAGLKQhSxkEUAYspCFLGQRQA==", + "dtype": "f8" + }, + "yaxis": "y" + }, + { + "line": { + "color": "red", + "dash": "dash" + }, + "name": "Hydrogen Produced", + "type": "scatter", + "x": { + "bdata": "AAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkAGUAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAcgBzAHQAdQB2AHcAeAB5AHoAewB8AH0AfgB/AIAAgQCCAIMAhACFAIYAhwCIAIkAigCLAIwAjQCOAI8AkACRAJIAkwCUAJUAlgCXAJgAmQCaAJsAnACdAJ4AnwCgAKEAogCjAKQApQCmAKcAqACpAKoAqwCsAK0ArgCvALAAsQCyALMAtAC1ALYAtwC4ALkAugC7ALwAvQC+AL8AwADBAMIAwwDEAMUAxgDHAMgAyQDKAMsAzADNAM4AzwDQANEA0gDTANQA1QDWANcA2ADZANoA2wDcAN0A3gDfAOAA4QDiAOMA5ADlAOYA5wDoAOkA6gDrAOwA7QDuAO8A8ADxAPIA8wD0APUA9gD3APgA+QD6APsA/AD9AP4A/wAAAQEBAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAEhASIBIwEkASUBJgEnASgBKQEqASsBLAEtAS4BLwEwATEBMgEzATQBNQE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAccByAHJAcoBywHMAc0BzgHPAdAB0QHSAdMB1AHVAdYB1wHYAdkB2gHbAdwB3QHeAd8B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAfQB9QH2AfcB+AH5AfoB+wH8Af0B/gH/AQACAQICAgMCBAIFAgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhICEwIUAhUCFgIXAhgCGQIaAhsCHAIdAh4CHwIgAiECIgIjAiQCJQImAicCKAIpAioCKwIsAi0CLgIvAjACMQIyAjMCNAI1AjYCNwI4AjkCOgI7AjwCPQI+Aj8CQAJBAkICQwJEAkUCRgJHAkgCSQJKAksCTAJNAk4CTwJQAlECUgJTAlQCVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAnICcwJ0AnUCdgJ3AngCeQJ6AnsCfAJ9An4CfwKAAoECggKDAoQChQKGAocCiAKJAooCiwKMAo0CjgKPApACkQKSApMClAKVApYClwKYApkCmgKbApwCnQKeAp8CoAKhAqICowKkAqUCpgKnAqgCqQKqAqsCrAKtAq4CrwKwArECsgKzArQCtQK2ArcCuAK5AroCuwK8Ar0CvgK/AsACwQLCAsMCxALFAsYCxwLIAskCygLLAswCzQLOAs8C0ALRAtIC0wLUAtUC1gLXAtgC2QLaAtsC3ALdAt4C3wLgAuEC4gLjAuQC5QLmAucC6ALpAuoC6wLsAu0C7gLvAvAC8QLyAvMC9AL1AvYC9wL4AvkC+gL7AvwC/QL+Av8CAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRQNGA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSA1MDVANVA1YDVwNYA1kDWgNbA1wDXQNeA18DYANhA2IDYwNkA2UDZgNnA2gDaQNqA2sDbANtA24DbwNwA3EDcgNzA3QDdQN2A3cDeAN5A3oDewN8A30DfgN/A4ADgQOCA4MDhAOFA4YDhwOIA4kDigOLA4wDjQOOA48DkAORA5IDkwOUA5UDlgOXA5gDmQOaA5sDnAOdA54DnwOgA6EDogOjA6QDpQOmA6cDqAOpA6oDqwOsA60DrgOvA7ADsQOyA7MDtAO1A7YDtwO4A7kDugO7A7wDvQO+A78DwAPBA8IDwwPEA8UDxgPHA8gDyQPKA8sDzAPNA84DzwPQA9ED0gPTA9QD1QPWA9cD2APZA9oD2wPcA90D3gPfA+AD4QPiA+MD5APlA+YD5wPoA+kD6gPrA+wD7QPuA+8D8APxA/ID8wP0A/UD9gP3A/gD+QP6A/sD/AP9A/4D/wMABAEEAgQDBAQEBQQGBAcECAQJBAoECwQMBA0EDgQPBBAEEQQSBBMEFAQVBBYEFwQYBBkEGgQbBBwEHQQeBB8EIAQhBCIEIwQkBCUEJgQnBCgEKQQqBCsELAQtBC4ELwQwBDEEMgQzBDQENQQ2BDcEOAQ5BDoEOwQ8BD0EPgQ/BEAEQQRCBEMERARFBEYERwRIBEkESgRLBEwETQROBE8EUARRBFIEUwRUBFUEVgRXBFgEWQRaBFsEXARdBF4EXwRgBGEEYgRjBGQEZQRmBGcEaARpBGoEawRsBG0EbgRvBHAEcQRyBHMEdAR1BHYEdwR4BHkEegR7BHwEfQR+BH8EgASBBIIEgwSEBIUEhgSHBIgEiQSKBIsEjASNBI4EjwSQBJEEkgSTBJQElQSWBJcEmASZBJoEmwScBJ0EngSfBKAEoQSiBKMEpASlBKYEpwSoBKkEqgSrBKwErQSuBK8EsASxBLIEswS0BLUEtgS3BLgEuQS6BLsEvAS9BL4EvwTABMEEwgTDBMQExQTGBMcEyATJBMoEywTMBM0EzgTPBNAE0QTSBNME1ATVBNYE1wTYBNkE2gTbBNwE3QTeBN8E4AThBOIE4wTkBOUE5gTnBOgE6QTqBOsE7ATtBO4E7wTwBPEE8gTzBPQE9QT2BPcE+AT5BPoE+wT8BP0E/gT/BAAFAQUCBQMFBAUFBQYFBwUIBQkFCgULBQwFDQUOBQ8FEAURBRIFEwUUBRUFFgUXBRgFGQUaBRsFHAUdBR4FHwUgBSEFIgUjBSQFJQUmBScFKAUpBSoFKwUsBS0FLgUvBTAFMQUyBTMFNAU1BTYFNwU4BTkFOgU7BTwFPQU+BT8FQAVBBUIFQwVEBUUFRgVHBUgFSQVKBUsFTAVNBU4FTwVQBVEFUgVTBVQFVQVWBVcFWAVZBVoFWwVcBV0FXgVfBWAFYQViBWMFZAVlBWYFZwVoBWkFagVrBWwFbQVuBW8FcAVxBXIFcwV0BXUFdgV3BXgFeQV6BXsFfAV9BX4FfwWABYEFggWDBYQFhQWGBYcFiAWJBYoFiwWMBY0FjgWPBZAFkQWSBZMFlAWVBZYFlwWYBZkFmgWbBZwFnQWeBZ8FoAWhBaIFowWkBaUFpgWnBagFqQWqBasFrAWtBa4FrwWwBbEFsgWzBbQFtQW2BbcFuAW5BboFuwW8Bb0FvgW/BcAFwQXCBcMFxAXFBcYFxwXIBckFygXLBcwFzQXOBc8F0AXRBdIF0wXUBdUF1gXXBdgF2QXaBdsF3AXdBd4F3wXgBeEF4gXjBeQF5QXmBecF6AXpBeoF6wXsBe0F7gXvBfAF8QXyBfMF9AX1BfYF9wX4BfkF+gX7BfwF/QX+Bf8FAAYBBgIGAwYEBgUGBgYHBggGCQYKBgsGDAYNBg4GDwYQBhEGEgYTBhQGFQYWBhcGGAYZBhoGGwYcBh0GHgYfBiAGIQYiBiMGJAYlBiYGJwYoBikGKgYrBiwGLQYuBi8GMAYxBjIGMwY0BjUGNgY3BjgGOQY6BjsGPAY9Bj4GPwZABkEGQgZDBkQGRQZGBkcGSAZJBkoGSwZMBk0GTgZPBlAGUQZSBlMGVAZVBlYGVwZYBlkGWgZbBlwGXQZeBl8GYAZhBmIGYwZkBmUGZgZnBmgGaQZqBmsGbAZtBm4GbwZwBnEGcgZzBnQGdQZ2BncGeAZ5BnoGewZ8Bn0GfgZ/BoAGgQaCBoMGhAaFBoYGhwaIBokGigaLBowGjQaOBo8GkAaRBpIGkwaUBpUGlgaXBpgGmQaaBpsGnAadBp4GnwagBqEGogajBqQGpQamBqcGqAapBqoGqwasBq0GrgavBrAGsQayBrMGtAa1BrYGtwa4BrkGuga7BrwGvQa+Br8GwAbBBsIGwwbEBsUGxgbHBsgGyQbKBssGzAbNBs4GzwbQBtEG0gbTBtQG1QbWBtcG2AbZBtoG2wbcBt0G3gbfBuAG4QbiBuMG5AblBuYG5wboBukG6gbrBuwG7QbuBu8G8AbxBvIG8wb0BvUG9gb3BvgG+Qb6BvsG/Ab9Bv4G/wYABwEHAgcDBwQHBQcGBwcHCAcJBwoHCwcMBw0HDgcPBxAHEQcSBxMHFAcVBxYHFwcYBxkHGgcbBxwHHQceBx8HIAchByIHIwckByUHJgcnBygHKQcqBysHLActBy4HLwcwBzEHMgczBzQHNQc2BzcHOAc5BzoHOwc8Bz0HPgc/B0AHQQdCB0MHRAdFB0YHRwdIB0kHSgdLB0wHTQdOB08HUAdRB1IHUwdUB1UHVgdXB1gHWQdaB1sHXAddB14HXwdgB2EHYgdjB2QHZQdmB2cHaAdpB2oHawdsB20HbgdvB3AHcQdyB3MHdAd1B3YHdwd4B3kHegd7B3wHfQd+B38HgAeBB4IHgweEB4UHhgeHB4gHiQeKB4sHjAeNB44HjweQB5EHkgeTB5QHlQeWB5cHmAeZB5oHmwecB50HngefB6AHoQeiB6MHpAelB6YHpweoB6kHqgerB6wHrQeuB68HsAexB7IHswe0B7UHtge3B7gHuQe6B7sHvAe9B74HvwfAB8EHwgfDB8QHxQfGB8cHyAfJB8oHywfMB80HzgfPB9AH0QfSB9MH1AfVB9YH1wfYB9kH2gfbB9wH3QfeB98H4AfhB+IH4wfkB+UH5gfnB+gH6QfqB+sH7AftB+4H7wfwB/EH8gfzB/QH9Qf2B/cH+Af5B/oH+wf8B/0H/gf/BwAIAQgCCAMIBAgFCAYIBwgICAkICggLCAwIDQgOCA8IEAgRCBIIEwgUCBUIFggXCBgIGQgaCBsIHAgdCB4IHwggCCEIIggjCCQIJQgmCCcIKAgpCCoIKwgsCC0ILggvCDAIMQgyCDMINAg1CDYINwg4CDkIOgg7CDwIPQg+CD8IQAhBCEIIQwhECEUIRghHCEgISQhKCEsITAhNCE4ITwhQCFEIUghTCFQIVQhWCFcIWAhZCFoIWwhcCF0IXghfCGAIYQhiCGMIZAhlCGYIZwhoCGkIaghrCGwIbQhuCG8IcAhxCHIIcwh0CHUIdgh3CHgIeQh6CHsIfAh9CH4IfwiACIEIggiDCIQIhQiGCIcIiAiJCIoIiwiMCI0IjgiPCJAIkQiSCJMIlAiVCJYIlwiYCJkImgibCJwInQieCJ8IoAihCKIIowikCKUIpginCKgIqQiqCKsIrAitCK4IrwiwCLEIsgizCLQItQi2CLcIuAi5CLoIuwi8CL0Ivgi/CMAIwQjCCMMIxAjFCMYIxwjICMkIygjLCMwIzQjOCM8I0AjRCNII0wjUCNUI1gjXCNgI2QjaCNsI3AjdCN4I3wjgCOEI4gjjCOQI5QjmCOcI6AjpCOoI6wjsCO0I7gjvCPAI8QjyCPMI9Aj1CPYI9wj4CPkI+gj7CPwI/Qj+CP8IAAkBCQIJAwkECQUJBgkHCQgJCQkKCQsJDAkNCQ4JDwkQCREJEgkTCRQJFQkWCRcJGAkZCRoJGwkcCR0JHgkfCSAJIQkiCSMJJAklCSYJJwkoCSkJKgkrCSwJLQkuCS8JMAkxCTIJMwk0CTUJNgk3CTgJOQk6CTsJPAk9CT4JPwlACUEJQglDCUQJRQlGCUcJSAlJCUoJSwlMCU0JTglPCVAJUQlSCVMJVAlVCVYJVwlYCVkJWglbCVwJXQleCV8JYAlhCWIJYwlkCWUJZglnCWgJaQlqCWsJbAltCW4JbwlwCXEJcglzCXQJdQl2CXcJeAl5CXoJewl8CX0Jfgl/CYAJgQmCCYMJhAmFCYYJhwmICYkJigmLCYwJjQmOCY8JkAmRCZIJkwmUCZUJlgmXCZgJmQmaCZsJnAmdCZ4JnwmgCaEJogmjCaQJpQmmCacJqAmpCaoJqwmsCa0JrgmvCbAJsQmyCbMJtAm1CbYJtwm4CbkJugm7CbwJvQm+Cb8JwAnBCcIJwwnECcUJxgnHCcgJyQnKCcsJzAnNCc4JzwnQCdEJ0gnTCdQJ1QnWCdcJ2AnZCdoJ2wncCd0J3gnfCeAJ4QniCeMJ5AnlCeYJ5wnoCekJ6gnrCewJ7QnuCe8J8AnxCfIJ8wn0CfUJ9gn3CfgJ+Qn6CfsJ/An9Cf4J/wkACgEKAgoDCgQKBQoGCgcKCAoJCgoKCwoMCg0KDgoPChAKEQoSChMKFAoVChYKFwoYChkKGgobChwKHQoeCh8KIAohCiIKIwokCiUKJgonCigKKQoqCisKLAotCi4KLwowCjEKMgozCjQKNQo2CjcKOAo5CjoKOwo8Cj0KPgo/CkAKQQpCCkMKRApFCkYKRwpICkkKSgpLCkwKTQpOCk8KUApRClIKUwpUClUKVgpXClgKWQpaClsKXApdCl4KXwpgCmEKYgpjCmQKZQpmCmcKaAppCmoKawpsCm0KbgpvCnAKcQpyCnMKdAp1CnYKdwp4CnkKegp7CnwKfQp+Cn8KgAqBCoIKgwqECoUKhgqHCogKiQqKCosKjAqNCo4KjwqQCpEKkgqTCpQKlQqWCpcKmAqZCpoKmwqcCp0KngqfCqAKoQqiCqMKpAqlCqYKpwqoCqkKqgqrCqwKrQquCq8KsAqxCrIKswq0CrUKtgq3CrgKuQq6CrsKvAq9Cr4KvwrACsEKwgrDCsQKxQrGCscKyArJCsoKywrMCs0KzgrPCtAK0QrSCtMK1ArVCtYK1wrYCtkK2grbCtwK3QreCt8K4ArhCuIK4wrkCuUK5grnCugK6QrqCusK7ArtCu4K7wrwCvEK8grzCvQK9Qr2CvcK+Ar5CvoK+wr8Cv0K/gr/CgALAQsCCwMLBAsFCwYLBwsICwkLCgsLCwwLDQsOCw8LEAsRCxILEwsUCxULFgsXCxgLGQsaCxsLHAsdCx4LHwsgCyELIgsjCyQLJQsmCycLKAspCyoLKwssCy0LLgsvCzALMQsyCzMLNAs1CzYLNws4CzkLOgs7CzwLPQs+Cz8LQAtBC0ILQwtEC0ULRgtHC0gLSQtKC0sLTAtNC04LTwtQC1ELUgtTC1QLVQtWC1cLWAtZC1oLWwtcC10LXgtfC2ALYQtiC2MLZAtlC2YLZwtoC2kLagtrC2wLbQtuC28LcAtxC3ILcwt0C3ULdgt3C3gLeQt6C3sLfAt9C34LfwuAC4ELgguDC4QLhQuGC4cLiAuJC4oLiwuMC40LjguPC5ALkQuSC5MLlAuVC5YLlwuYC5kLmgubC5wLnQueC58LoAuhC6ILowukC6ULpgunC6gLqQuqC6sLrAutC64LrwuwC7ELsguzC7QLtQu2C7cLuAu5C7oLuwu8C70Lvgu/C8ALwQvCC8MLxAvFC8YLxwvIC8kLygvLC8wLzQvOC88L0AvRC9IL0wvUC9UL1gvXC9gL2QvaC9sL3AvdC94L3wvgC+EL4gvjC+QL5QvmC+cL6AvpC+oL6wvsC+0L7gvvC/AL8QvyC/ML9Av1C/YL9wv4C/kL+gv7C/wL/Qv+C/8LAAwBDAIMAwwEDAUMBgwHDAgMCQwKDAsMDAwNDA4MDwwQDBEMEgwTDBQMFQwWDBcMGAwZDBoMGwwcDB0MHgwfDCAMIQwiDCMMJAwlDCYMJwwoDCkMKgwrDCwMLQwuDC8MMAwxDDIMMww0DDUMNgw3DDgMOQw6DDsMPAw9DD4MPwxADEEMQgxDDEQMRQxGDEcMSAxJDEoMSwxMDE0MTgxPDFAMUQxSDFMMVAxVDFYMVwxYDFkMWgxbDFwMXQxeDF8MYAxhDGIMYwxkDGUMZgxnDGgMaQxqDGsMbAxtDG4MbwxwDHEMcgxzDHQMdQx2DHcMeAx5DHoMewx8DH0Mfgx/DIAMgQyCDIMMhAyFDIYMhwyIDIkMigyLDIwMjQyODI8MkAyRDJIMkwyUDJUMlgyXDJgMmQyaDJsMnAydDJ4MnwygDKEMogyjDKQMpQymDKcMqAypDKoMqwysDK0MrgyvDLAMsQyyDLMMtAy1DLYMtwy4DLkMugy7DLwMvQy+DL8MwAzBDMIMwwzEDMUMxgzHDMgMyQzKDMsMzAzNDM4MzwzQDNEM0gzTDNQM1QzWDNcM2AzZDNoM2wzcDN0M3gzfDOAM4QziDOMM5AzlDOYM5wzoDOkM6gzrDOwM7QzuDO8M8AzxDPIM8wz0DPUM9gz3DPgM+Qz6DPsM/Az9DP4M/wwADQENAg0DDQQNBQ0GDQcNCA0JDQoNCw0MDQ0NDg0PDRANEQ0SDRMNFA0VDRYNFw0YDRkNGg0bDRwNHQ0eDR8NIA0hDSINIw0kDSUNJg0nDSgNKQ0qDSsNLA0tDS4NLw0wDTENMg0zDTQNNQ02DTcNOA05DToNOw08DT0NPg0/DUANQQ1CDUMNRA1FDUYNRw1IDUkNSg1LDUwNTQ1ODU8NUA1RDVINUw1UDVUNVg1XDVgNWQ1aDVsNXA1dDV4NXw1gDWENYg1jDWQNZQ1mDWcNaA1pDWoNaw1sDW0Nbg1vDXANcQ1yDXMNdA11DXYNdw14DXkNeg17DXwNfQ1+DX8NgA2BDYINgw2EDYUNhg2HDYgNiQ2KDYsNjA2NDY4Njw2QDZENkg2TDZQNlQ2WDZcNmA2ZDZoNmw2cDZ0Nng2fDaANoQ2iDaMNpA2lDaYNpw2oDakNqg2rDawNrQ2uDa8NsA2xDbINsw20DbUNtg23DbgNuQ26DbsNvA29Db4Nvw3ADcENwg3DDcQNxQ3GDccNyA3JDcoNyw3MDc0Nzg3PDdAN0Q3SDdMN1A3VDdYN1w3YDdkN2g3bDdwN3Q3eDd8N4A3hDeIN4w3kDeUN5g3nDegN6Q3qDesN7A3tDe4N7w3wDfEN8g3zDfQN9Q32DfcN+A35DfoN+w38Df0N/g3/DQAOAQ4CDgMOBA4FDgYOBw4IDgkOCg4LDgwODQ4ODg8OEA4RDhIOEw4UDhUOFg4XDhgOGQ4aDhsOHA4dDh4OHw4gDiEOIg4jDiQOJQ4mDicOKA4pDioOKw4sDi0OLg4vDjAOMQ4yDjMONA41DjYONw44DjkOOg47DjwOPQ4+Dj8OQA5BDkIOQw5EDkUORg5HDkgOSQ5KDksOTA5NDk4OTw5QDlEOUg5TDlQOVQ5WDlcOWA5ZDloOWw5cDl0OXg5fDmAOYQ5iDmMOZA5lDmYOZw5oDmkOag5rDmwObQ5uDm8OcA5xDnIOcw50DnUOdg53DngOeQ56DnsOfA59Dn4Ofw6ADoEOgg6DDoQOhQ6GDocOiA6JDooOiw6MDo0Ojg6PDpAOkQ6SDpMOlA6VDpYOlw6YDpkOmg6bDpwOnQ6eDp8OoA6hDqIOow6kDqUOpg6nDqgOqQ6qDqsOrA6tDq4Orw6wDrEOsg6zDrQOtQ62DrcOuA65DroOuw68Dr0Ovg6/DsAOwQ7CDsMOxA7FDsYOxw7IDskOyg7LDswOzQ7ODs8O0A7RDtIO0w7UDtUO1g7XDtgO2Q7aDtsO3A7dDt4O3w7gDuEO4g7jDuQO5Q7mDucO6A7pDuoO6w7sDu0O7g7vDvAO8Q7yDvMO9A71DvYO9w74DvkO+g77DvwO/Q7+Dv8OAA8BDwIPAw8EDwUPBg8HDwgPCQ8KDwsPDA8NDw4PDw8QDxEPEg8TDxQPFQ8WDxcPGA8ZDxoPGw8cDx0PHg8fDyAPIQ8iDyMPJA8lDyYPJw8oDykPKg8rDywPLQ8uDy8PMA8xDzIPMw80DzUPNg83DzgPOQ86DzsPPA89Dz4PPw9AD0EPQg9DD0QPRQ9GD0cPSA9JD0oPSw9MD00PTg9PD1APUQ9SD1MPVA9VD1YPVw9YD1kPWg9bD1wPXQ9eD18PYA9hD2IPYw9kD2UPZg9nD2gPaQ9qD2sPbA9tD24Pbw9wD3EPcg9zD3QPdQ92D3cPeA95D3oPew98D30Pfg9/D4APgQ+CD4MPhA+FD4YPhw+ID4kPig+LD4wPjQ+OD48PkA+RD5IPkw+UD5UPlg+XD5gPmQ+aD5sPnA+dD54Pnw+gD6EPog+jD6QPpQ+mD6cPqA+pD6oPqw+sD60Prg+vD7APsQ+yD7MPtA+1D7YPtw+4D7kPug+7D7wPvQ++D78PwA/BD8IPww/ED8UPxg/HD8gPyQ/KD8sPzA/ND84Pzw/QD9EP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VhNXE1gTWRNaE1sTXBNdE14TXxNgE2ETYhNjE2QTZRNmE2cTaBNpE2oTaxNsE20TbhNvE3ATcRNyE3MTdBN1E3YTdxN4E3kTehN7E3wTfRN+E38TgBOBE4ITgxOEE4UThhOHE4gTiROKE4sTjBONE44TjxOQE5ETkhOTE5QTlROWE5cTmBOZE5oTmxOcE50TnhOfE6AToROiE6MTpBOlE6YTpxOoE6kTqhOrE6wTrROuE68TsBOxE7ITsxO0E7UTthO3E7gTuRO6E7sTvBO9E74TvxPAE8ETwhPDE8QTxRPGE8cTyBPJE8oTyxPME80TzhPPE9AT0RPSE9MT1BPVE9YT1xPYE9kT2hPbE9wT3RPeE98T4BPhE+IT4xPkE+UT5hPnE+gT6RPqE+sT7BPtE+4T7xPwE/ET8hPzE/QT9RP2E/cT+BP5E/oT+xP8E/0T/hP/EwAUARQCFAMUBBQFFAYUBxQIFAkUChQLFAwUDRQOFA8UEBQRFBIUExQUFBUUFhQXFBgUGRQaFBsUHBQdFB4UHxQgFCEUIhQjFCQUJRQmFCcUKBQpFCoUKxQsFC0ULhQvFDAUMRQyFDMUNBQ1FDYUNxQ4FDkUOhQ7FDwUPRQ+FD8UQBRBFEIUQxREFEUURhRHFEgUSRRKFEsUTBRNFE4UTxRQFFEUUhRTFFQUVRRWFFcUWBRZFFoUWxRcFF0UXhRfFGAUYRRiFGMUZBRlFGYUZxRoFGkUahRrFGwUbRRuFG8UcBRxFHIUcxR0FHUUdhR3FHgUeRR6FHsUfBR9FH4UfxSAFIEUghSDFIQUhRSGFIcUiBSJFIoUixSMFI0UjhSPFJAUkRSSFJMUlBSVFJYUlxSYFJkUmhSbFJwUnRSeFJ8UoBShFKIUoxSkFKUUphSnFKgUqRSqFKsUrBStFK4UrxSwFLEUshSzFLQUtRS2FLcUuBS5FLoUuxS8FL0UvhS/FMAUwRTCFMMUxBTFFMYUxxTIFMkUyhTLFMwUzRTOFM8U0BTRFNIU0xTUFNUU1hTXFNgU2RTaFNsU3BTdFN4U3xTgFOEU4hTjFOQU5RTmFOcU6BTpFOoU6xTsFO0U7hTvFPAU8RTyFPMU9BT1FPYU9xT4FPkU+hT7FPwU/RT+FP8UABUBFQIVAxUEFQUVBhUHFQgVCRUKFQsVDBUNFQ4VDxUQFREVEhUTFRQVFRUWFRcVGBUZFRoVGxUcFR0VHhUfFSAVIRUiFSMVJBUlFSYVJxUoFSkVKhUrFSwVLRUuFS8VMBUxFTIVMxU0FTUVNhU3FTgVORU6FTsVPBU9FT4VPxVAFUEVQhVDFUQVRRVGFUcVSBVJFUoVSxVMFU0VThVPFVAVURVSFVMVVBVVFVYVVxVYFVkVWhVbFVwVXRVeFV8VYBVhFWIVYxVkFWUVZhVnFWgVaRVqFWsVbBVtFW4VbxVwFXEVchVzFXQVdRV2FXcVeBV5FXoVexV8FX0VfhV/FYAVgRWCFYMVhBWFFYYVhxWIFYkVihWLFYwVjRWOFY8VkBWRFZIVkxWUFZUVlhWXFZgVmRWaFZsVnBWdFZ4VnxWgFaEVohWjFaQVpRWmFacVqBWpFaoVqxWsFa0VrhWvFbAVsRWyFbMVtBW1FbYVtxW4FbkVuhW7FbwVvRW+Fb8VwBXBFcIVwxXEFcUVxhXHFcgVyRXKFcsVzBXNFc4VzxXQFdEV0hXTFdQV1RXWFdcV2BXZFdoV2xXcFd0V3hXfFeAV4RXiFeMV5BXlFeYV5xXoFekV6hXrFewV7RXuFe8V8BXxFfIV8xX0FfUV9hX3FfgV+RX6FfsV/BX9Ff4V/xUAFgEWAhYDFgQWBRYGFgcWCBYJFgoWCxYMFg0WDhYPFhAWERYSFhMWFBYVFhYWFxYYFhkWGhYbFhwWHRYeFh8WIBYhFiIWIxYkFiUWJhYnFigWKRYqFisWLBYtFi4WLxYwFjEWMhYzFjQWNRY2FjcWOBY5FjoWOxY8Fj0WPhY/FkAWQRZCFkMWRBZFFkYWRxZIFkkWShZLFkwWTRZOFk8WUBZRFlIWUxZUFlUWVhZXFlgWWRZaFlsWXBZdFl4WXxZgFmEWYhZjFmQWZRZmFmcWaBZpFmoWaxZsFm0WbhZvFnAWcRZyFnMWdBZ1FnYWdxZ4FnkWehZ7FnwWfRZ+Fn8WgBaBFoIWgxaEFoUWhhaHFogWiRaKFosWjBaNFo4WjxaQFpEWkhaTFpQWlRaWFpcWmBaZFpoWmxacFp0WnhafFqAWoRaiFqMWpBalFqYWpxaoFqkWqharFqwWrRauFq8WsBaxFrIWsxa0FrUWtha3FrgWuRa6FrsWvBa9Fr4WvxbAFsEWwhbDFsQWxRbGFscWyBbJFsoWyxbMFs0WzhbPFtAW0RbSFtMW1BbVFtYW1xbYFtkW2hbbFtwW3RbeFt8W4BbhFuIW4xbkFuUW5hbnFugW6RbqFusW7BbtFu4W7xbwFvEW8hbzFvQW9Rb2FvcW+Bb5FvoW+xb8Fv0W/hb/FgAXARcCFwMXBBcFFwYXBxcIFwkXChcLFwwXDRcOFw8XEBcRFxIXExcUFxUXFhcXFxgXGRcaFxsXHBcdFx4XHxcgFyEXIhcjFyQXJRcmFycXKBcpFyoXKxcsFy0XLhcvFzAXMRcyFzMXNBc1FzYXNxc4FzkXOhc7FzwXPRc+Fz8XQBdBF0IXQxdEF0UXRhdHF0gXSRdKF0sXTBdNF04XTxdQF1EXUhdTF1QXVRdWF1cXWBdZF1oXWxdcF10XXhdfF2AXYRdiF2MXZBdlF2YXZxdoF2kXahdrF2wXbRduF28XcBdxF3IXcxd0F3UXdhd3F3gXeRd6F3sXfBd9F34XfxeAF4EXgheDF4QXhReGF4cXiBeJF4oXixeMF40XjhePF5AXkReSF5MXlBeVF5YXlxeYF5kXmhebF5wXnReeF58XoBehF6IXoxekF6UXphenF6gXqReqF6sXrBetF64XrxewF7EXshezF7QXtRe2F7cXuBe5F7oXuxe8F70Xvhe/F8AXwRfCF8MXxBfFF8YXxxfIF8kXyhfLF8wXzRfOF88X0BfRF9IX0xfUF9UX1hfXF9gX2RfaF9sX3BfdF94X3xfgF+EX4hfjF+QX5RfmF+cX6BfpF+oX6xfsF+0X7hfvF/AX8RfyF/MX9Bf1F/YX9xf4F/kX+hf7F/wX/Rf+F/8XABgBGAIYAxgEGAUYBhgHGAgYCRgKGAsYDBgNGA4YDxgQGBEYEhgTGBQYFRgWGBcYGBgZGBoYGxgcGB0YHhgfGCAYIRgiGCMYJBglGCYYJxgoGCkYKhgrGCwYLRguGC8YMBgxGDIYMxg0GDUYNhg3GDgYORg6GDsYPBg9GD4YPxhAGEEYQhhDGEQYRRhGGEcYSBhJGEoYSxhMGE0YThhPGFAYURhSGFMYVBhVGFYYVxhYGFkYWhhbGFwYXRheGF8YYBhhGGIYYxhkGGUYZhhnGGgYaRhqGGsYbBhtGG4YbxhwGHEYchhzGHQYdRh2GHcYeBh5GHoYexh8GH0Yfhh/GIAYgRiCGIMYhBiFGIYYhxiIGIkYihiLGIwYjRiOGI8YkBiRGJIYkxiUGJUYlhiXGJgYmRiaGJsYnBidGJ4YnxigGKEYohijGKQYpRimGKcYqBipGKoYqxisGK0YrhivGLAYsRiyGLMYtBi1GLYYtxi4GLkYuhi7GLwYvRi+GL8YwBjBGMIYwxjEGMUYxhjHGMgYyRjKGMsYzBjNGM4YzxjQGNEY0hjTGNQY1RjWGNcY2BjZGNoY2xjcGN0Y3hjfGOAY4RjiGOMY5BjlGOYY5xjoGOkY6hjrGOwY7RjuGO8Y8BjxGPIY8xj0GPUY9hj3GPgY+Rj6GPsY/Bj9GP4Y/xgAGQEZAhkDGQQZBRkGGQcZCBkJGQoZCxkMGQ0ZDhkPGRAZERkSGRMZFBkVGRYZFxkYGRkZGhkbGRwZHRkeGR8ZIBkhGSIZIxkkGSUZJhknGSgZKRkqGSsZLBktGS4ZLxkwGTEZMhkzGTQZNRk2GTcZOBk5GToZOxk8GT0ZPhk/GUAZQRlCGUMZRBlFGUYZRxlIGUkZShlLGUwZTRlOGU8ZUBlRGVIZUxlUGVUZVhlXGVgZWRlaGVsZXBldGV4ZXxlgGWEZYhljGWQZZRlmGWcZaBlpGWoZaxlsGW0ZbhlvGXAZcRlyGXMZdBl1GXYZdxl4GXkZehl7GXwZfRl+GX8ZgBmBGYIZgxmEGYUZhhmHGYgZiRmKGYsZjBmNGY4ZjxmQGZEZkhmTGZQZlRmWGZcZmBmZGZoZmxmcGZ0ZnhmfGaAZoRmiGaMZpBmlGaYZpxmoGakZqhmrGawZrRmuGa8ZsBmxGbIZsxm0GbUZthm3GbgZuRm6GbsZvBm9Gb4ZvxnAGcEZwhnDGcQZxRnGGccZyBnJGcoZyxnMGc0ZzhnPGdAZ0RnSGdMZ1BnVGdYZ1xnYGdkZ2hnbGdwZ3RneGd8Z4BnhGeIZ4xnkGeUZ5hnnGegZ6RnqGesZ7BntGe4Z7xnwGfEZ8hnzGfQZ9Rn2GfcZ+Bn5GfoZ+xn8Gf0Z/hn/GQAaARoCGgMaBBoFGgYaBxoIGgkaChoLGgwaDRoOGg8aEBoRGhIaExoUGhUaFhoXGhgaGRoaGhsaHBodGh4aHxogGiEaIhojGiQaJRomGicaKBopGioaKxosGi0aLhovGjAaMRoyGjMaNBo1GjYaNxo4GjkaOho7GjwaPRo+Gj8aQBpBGkIaQxpEGkUaRhpHGkgaSRpKGksaTBpNGk4aTxpQGlEaUhpTGlQaVRpWGlcaWBpZGloaWxpcGl0aXhpfGmAaYRpiGmMaZBplGmYaZxpoGmkaahprGmwabRpuGm8acBpxGnIacxp0GnUadhp3GngaeRp6GnsafBp9Gn4afxqAGoEaghqDGoQahRqGGocaiBqJGooaixqMGo0ajhqPGpAakRqSGpMalBqVGpYalxqYGpkamhqbGpwanRqeGp8aoBqhGqIaoxqkGqUaphqnGqgaqRqqGqsarBqtGq4arxqwGrEashqzGrQatRq2GrcauBq5Groauxq8Gr0avhq/GsAawRrCGsMaxBrFGsYaxxrIGskayhrLGswazRrOGs8a0BrRGtIa0xrUGtUa1hrXGtga2RraGtsa3BrdGt4a3xrgGuEa4hrjGuQa5RrmGuca6BrpGuoa6xrsGu0a7hrvGvAa8RryGvMa9Br1GvYa9xr4Gvka+hr7Gvwa/Rr+Gv8aABsBGwIbAxsEGwUbBhsHGwgbCRsKGwsbDBsNGw4bDxsQGxEbEhsTGxQbFRsWGxcbGBsZGxobGxscGx0bHhsfGyAbIRsiGyMbJBslGyYbJxsoGykbKhsrGywbLRsuGy8bMBsxGzIbMxs0GzUbNhs3GzgbORs6GzsbPBs9Gz4bPxtAG0EbQhtDG0QbRRtGG0cbSBtJG0obSxtMG00bThtPG1AbURtSG1MbVBtVG1YbVxtYG1kbWhtbG1wbXRteG18bYBthG2IbYxtkG2UbZhtnG2gbaRtqG2sbbBttG24bbxtwG3EbchtzG3QbdRt2G3cbeBt5G3obext8G30bfht/G4AbgRuCG4MbhBuFG4YbhxuIG4kbihuLG4wbjRuOG48bkBuRG5IbkxuUG5UblhuXG5gbmRuaG5sbnBudG54bnxugG6EbohujG6QbpRumG6cbqBupG6obqxusG60brhuvG7AbsRuyG7MbtBu1G7Ybtxu4G7kbuhu7G7wbvRu+G78bwBvBG8IbwxvEG8UbxhvHG8gbyRvKG8sbzBvNG84bzxvQG9Eb0hvTG9Qb1RvWG9cb2BvZG9ob2xvcG90b3hvfG+Ab4RviG+Mb5BvlG+Yb5xvoG+kb6hvrG+wb7RvuG+8b8BvxG/Ib8xv0G/Ub9hv3G/gb+Rv6G/sb/Bv9G/4b/xsAHAEcAhwDHAQcBRwGHAccCBwJHAocCxwMHA0cDhwPHBAcERwSHBMcFBwVHBYcFxwYHBkcGhwbHBwcHRweHB8cIBwhHCIcIxwkHCUcJhwnHCgcKRwqHCscLBwtHC4cLxwwHDEcMhwzHDQcNRw2HDccOBw5HDocOxw8HD0cPhw/HEAcQRxCHEMcRBxFHEYcRxxIHEkcShxLHEwcTRxOHE8cUBxRHFIcUxxUHFUcVhxXHFgcWRxaHFscXBxdHF4cXxxgHGEcYhxjHGQcZRxmHGccaBxpHGocaxxsHG0cbhxvHHAccRxyHHMcdBx1HHYcdxx4HHkcehx7HHwcfRx+HH8cgByBHIIcgxyEHIUchhyHHIgciRyKHIscjByNHI4cjxyQHJEckhyTHJQclRyWHJccmByZHJocmxycHJ0cnhyfHKAcoRyiHKMcpBylHKYcpxyoHKkcqhyrHKwcrRyuHK8csByxHLIcsxy0HLUcthy3HLgcuRy6HLscvBy9HL4cvxzAHMEcwhzDHMQcxRzGHMccyBzJHMocyxzMHM0czhzPHNAc0RzSHNMc1BzVHNYc1xzYHNkc2hzbHNwc3RzeHN8c4BzhHOIc4xzkHOUc5hznHOgc6RzqHOsc7BztHO4c7xzwHPEc8hzzHPQc9Rz2HPcc+Bz5HPoc+xz8HP0c/hz/HAAdAR0CHQMdBB0FHQYdBx0IHQkdCh0LHQwdDR0OHQ8dEB0RHRIdEx0UHRUdFh0XHRgdGR0aHRsdHB0dHR4dHx0gHSEdIh0jHSQdJR0mHScdKB0pHSodKx0sHS0dLh0vHTAdMR0yHTMdNB01HTYdNx04HTkdOh07HTwdPR0+HT8dQB1BHUIdQx1EHUUdRh1HHUgdSR1KHUsdTB1NHU4dTx1QHVEdUh1THVQdVR1WHVcdWB1ZHVodWx1cHV0dXh1fHWAdYR1iHWMdZB1lHWYdZx1oHWkdah1rHWwdbR1uHW8dcB1xHXIdcx10HXUddh13HXgdeR16HXsdfB19HX4dfx2AHYEdgh2DHYQdhR2GHYcdiB2JHYodix2MHY0djh2PHZAdkR2SHZMdlB2VHZYdlx2YHZkdmh2bHZwdnR2eHZ8doB2hHaIdox2kHaUdph2nHagdqR2qHasdrB2tHa4drx2wHbEdsh2zHbQdtR22HbcduB25Hbodux28Hb0dvh2/HcAdwR3CHcMdxB3FHcYdxx3IHckdyh3LHcwdzR3OHc8d0B3RHdId0x3UHdUd1h3XHdgd2R3aHdsd3B3dHd4d3x3gHeEd4h3jHeQd5R3mHecd6B3pHeod6x3sHe0d7h3vHfAd8R3yHfMd9B31HfYd9x34Hfkd+h37Hfwd/R3+Hf8dAB4BHgIeAx4EHgUeBh4HHggeCR4KHgseDB4NHg4eDx4QHhEeEh4THhQeFR4WHhceGB4ZHhoeGx4cHh0eHh4fHiAeIR4iHiMeJB4lHiYeJx4oHikeKh4rHiweLR4uHi8eMB4xHjIeMx40HjUeNh43HjgeOR46HjsePB49Hj4ePx5AHkEeQh5DHkQeRR5GHkceSB5JHkoeSx5MHk0eTh5PHlAeUR5SHlMeVB5VHlYeVx5YHlkeWh5bHlweXR5eHl8eYB5hHmIeYx5kHmUeZh5nHmgeaR5qHmsebB5tHm4ebx5wHnEech5zHnQedR52HnceeB55Hnoeex58Hn0efh5/HoAegR6CHoMehB6FHoYehx6IHokeih6LHowejR6OHo8ekB6RHpIekx6UHpUelh6XHpgemR6aHpsenB6dHp4enx6gHqEeoh6jHqQepR6mHqceqB6pHqoeqx6sHq0erh6vHrAesR6yHrMetB61HrYetx64Hrkeuh67HrwevR6+Hr8ewB7BHsIewx7EHsUexh7HHsgeyR7KHssezB7NHs4ezx7QHtEe0h7THtQe1R7WHtce2B7ZHtoe2x7cHt0e3h7fHuAe4R7iHuMe5B7lHuYe5x7oHuke6h7rHuwe7R7uHu8e8B7xHvIe8x70HvUe9h73Hvge+R76Hvse/B79Hv4e/x4AHwEfAh8DHwQfBR8GHwcfCB8JHwofCx8MHw0fDh8PHxAfER8SHxMfFB8VHxYfFx8YHxkfGh8bHxwfHR8eHx8fIB8hHyIfIx8kHyUfJh8nHygfKR8qHysfLB8tHy4fLx8wHzEfMh8zHzQfNR82HzcfOB85HzofOx88Hz0fPh8/H0AfQR9CH0MfRB9FH0YfRx9IH0kfSh9LH0wfTR9OH08fUB9RH1IfUx9UH1UfVh9XH1gfWR9aH1sfXB9dH14fXx9gH2EfYh9jH2QfZR9mH2cfaB9pH2ofax9sH20fbh9vH3AfcR9yH3MfdB91H3Yfdx94H3kfeh97H3wffR9+H38fgB+BH4Ifgx+EH4Ufhh+HH4gfiR+KH4sfjB+NH44fjx+QH5Efkh+TH5QflR+WH5cfmB+ZH5ofmx+cH50fnh+fH6AfoR+iH6MfpB+lH6Yfpx+oH6kfqh+rH6wfrR+uH68fsB+xH7Ifsx+0H7Ufth+3H7gfuR+6H7sfvB+9H74fvx/AH8Efwh/DH8QfxR/GH8cfyB/JH8ofyx/MH80fzh/PH9Af0R/SH9Mf1B/VH9Yf1x/YH9kf2h/bH9wf3R/eH98f4B/hH+If4x/kH+Uf5h/nH+gf6R/qH+sf7B/tH+4f7x/wH/Ef8h/zH/Qf9R/2H/cf+B/5H/of+x/8H/0f/h//HwAgASACIAMgBCAFIAYgByAIIAkgCiALIAwgDSAOIA8gECARIBIgEyAUIBUgFiAXIBggGSAaIBsgHCAdIB4gHyAgICEgIiAjICQgJSAmICcgKCApICogKyAsIC0gLiAvIDAgMSAyIDMgNCA1IDYgNyA4IDkgOiA7IDwgPSA+ID8gQCBBIEIgQyBEIEUgRiBHIEggSSBKIEsgTCBNIE4gTyBQIFEgUiBTIFQgVSBWIFcgWCBZIFogWyBcIF0gXiBfIGAgYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuIG8gcCBxIHIgcyB0IHUgdiB3IHggeSB6IHsgfCB9IH4gfyCAIIEggiCDIIQghSCGIIcgiCCJIIogiyCMII0gjiCPIJAgkSCSIJMglCCVIJYglyCYIJkgmiCbIJwgnSCeIJ8goCChIKIgoyCkIKUgpiCnIKggqSCqIKsgrCCtIK4gryCwILEgsiCzILQgtSC2ILcguCC5ILoguyC8IL0gviC/IMAgwSDCIMMgxCDFIMYgxyDIIMkgyiDLIMwgzSDOIM8g0CDRINIg0yDUINUg1iDXINgg2SDaINsg3CDdIN4g3yDgIOEg4iDjIOQg5SDmIOcg6CDpIOog6yDsIO0g7iDvIPAg8SDyIPMg9CD1IPYg9yD4IPkg+iD7IPwg/SD+IP8gACEBIQIhAyEEIQUhBiEHIQghCSEKIQshDCENIQ4hDyEQIREhEiETIRQhFSEWIRchGCEZIRohGyEcIR0hHiEfISAhISEiISMhJCElISYhJyEoISkhKiErISwhLSEuIS8hMCExITIhMyE0ITUhNiE3ITghOSE6ITshPCE9IT4hPyFAIUEhQiFDIUQhRSFGIUchSCFJIUohSyFMIU0hTiFPIVAhUSFSIVMhVCFVIVYhVyFYIVkhWiFbIVwhXSFeIV8hYCFhIWIhYyFkIWUhZiFnIWghaSFqIWshbCFtIW4hbyFwIXEhciFzIXQhdSF2IXcheCF5IXoheyF8IX0hfiF/IYAhgSGCIYMhhCGFIYYhhyGIIYkhiiGLIYwhjSGOIY8hkCGRIZIhkyGUIZUhliGXIZghmSGaIZshnCGdIZ4hnyGgIaEhoiGjIaQhpSGmIachqCGpIaohqyGsIa0hriGvIbAhsSGyIbMhtCG1IbYhtyG4IbkhuiG7IbwhvSG+Ib8hwCHBIcIhwyHEIcUhxiHHIcghySHKIcshzCHNIc4hzyHQIdEh0iHTIdQh1SHWIdch2CHZIdoh2yHcId0h3iHfIeAh4SHiIeMh5CHlIeYh5yHoIekh6iHrIewh7SHuIe8h8CHxIfIh8yH0IfUh9iH3Ifgh+SH6Ifsh/CH9If4h/yEAIgEiAiIDIgQiBSIGIgciCCIJIgoiCyIMIg0iDiIPIhAiESISIhMiFCIVIhYiFyIYIhkiGiIbIhwiHSIeIh8iICIhIiIiIyIkIiUiJiInIigiKSIqIisiLCItIi4iLyIwIjEiMiIzIjQiNSI2Ijci", + "dtype": "i2" + }, + "y": { + "bdata": "AAAAAACIY0AAAAAAAIhjQAAAAAAAiGNAAAAAAACIY0AAAAAAAIhjQA==", + "dtype": "f8" + }, + "yaxis": "y2" + } + ], + "layout": { + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Nuclear Reactor Optimization Output", + "x": 0.5, + "xref": "paper" + }, + "xaxis": { + "domain": [ + 0.05, + 0.95 + ], + "rangeslider": { + "visible": true + }, + "title": { + "text": "Time" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "Power (kW)" + } + }, + "yaxis2": { + "anchor": "x", + "overlaying": "y", + "side": "right", + "title": { + "text": "Hydrogen Produced (kg/h)" + } + }, + "yaxis3": { + "anchor": "free", + "autoshift": true, + "overlaying": "y", + "title": { + "text": "yaxis3 title" + } + }, + "yaxis4": { + "anchor": "free", + "autoshift": true, + "overlaying": "y", + "title": { + "text": "yaxis4 title" + } + } + } + }, + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# os.chdir(r\"C:\\Users\\MIKKDM\\Documents\\H2Integrate\\NucH2INtegrate\\examples\\99_nuclear_reactor_htse\")\n", + "\n", + "x_title = \"Time\"\n", + "y_title = [\"Power (MW)\", \"Hydrogen Produced (kg/h)\"]\n", + "line_name = [\"Electricity Out\", \"Hydrogen Produced\"]\n", + "line_color = [\"deepskyblue\", \"red\"]\n", + "line_styles = [\"solid\", \"dash\"]\n", + "x_data = [np.arange(8760)] * 2\n", + "y_data = [nuclear_elec_out, electrolyzer_h2_out]\n", + "title = \"Nuclear Reactor Optimization Output\"\n", + "filename = \"nuclear_example_output\"\n", + "y = [\"y1\", \"y2\"]\n", + "plot_graph(\n", + " x_data,\n", + " y_data,\n", + " line_name,\n", + " title,\n", + " x_title,\n", + " y_title,\n", + " filename,\n", + " line_color,\n", + " y,\n", + " line_styles,\n", + " fig_show=True,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8e1b070", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "h2integrate", + "language": "python", + "name": "h2integrate" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/99_nuclear_reactor_htse/nuclear_reactor_thermal_htse.yaml b/examples/99_nuclear_reactor_htse/nuclear_reactor_thermal_htse.yaml new file mode 100644 index 000000000..cd6adb8ab --- /dev/null +++ b/examples/99_nuclear_reactor_htse/nuclear_reactor_thermal_htse.yaml @@ -0,0 +1,7 @@ +name: "H2Integrate_config" + +system_summary: "This is an example plant with a nuclear plant capable of dispatching thermal and electrical energy to an HTSE system" + +driver_config: "driver_config.yaml" +technology_config: "tech_config.yaml" +plant_config: "plant_config.yaml" diff --git a/examples/99_nuclear_reactor_htse/plant_config.yaml b/examples/99_nuclear_reactor_htse/plant_config.yaml new file mode 100644 index 000000000..d57604605 --- /dev/null +++ b/examples/99_nuclear_reactor_htse/plant_config.yaml @@ -0,0 +1,61 @@ +name: plant_config +description: This plant is located in CO, USA... +sites: + site: + latitude: 35.2018863 + longitude: -101.945027 +plant: + plant_life: 30 +# 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 + +technology_interconnections: + - [nuclear, htse, electricity, cable] + - [nuclear, htse, [heat_out, heat_in]] + - [htse, h2_storage, hydrogen, pipe] + - [htse, nuclear, [heat_demand, heat_command_value]] + + # -["nuclear","network_heat","heat","pipe"] +tech_to_dispatch_connections: [] #[ + # ["htse", "hydrogen"], ["nuclear", "electricity"]] +resource_to_tech_connections: [] +finance_parameters: + finance_groups: + profast_model: + commodity: electricity + finance_model: ProFastLCO + model_inputs: + params: + analysis_start_year: 2032 + installation_time: 36 # months + inflation_rate: 0.0 # 0 for nominal analysis + discount_rate: 0.09 # nominal return based on 2024 ATB baseline workbook for land-based wind + debt_equity_ratio: 2.62 # 2024 ATB uses 72.4% debt for land-based wind + property_tax_and_insurance: 0.03 # percent of CAPEX estimated based on https://www.nrel.gov/docs/fy25osti/91775.pdf https://www.house.mn.gov/hrd/issinfo/clsrates.aspx + total_income_tax_rate: 0.257 # 0.257 tax rate in 2024 atb baseline workbook, value here is based on federal (21%) and state in MN (9.8) + capital_gains_tax_rate: 0.15 # H2FAST default + sales_tax_rate: 0.07375 # total state and local sales tax in St. Louis County https://taxmaps.state.mn.us/salestax/ + debt_interest_rate: 0.07 # based on 2024 ATB nominal interest rate for land-based wind + debt_type: Revolving debt # can be "Revolving debt" or "One time loan". Revolving debt is H2FAST default and leads to much lower LCOH + loan_period_if_used: 0 # H2FAST default, not used for revolving debt + cash_onhand_months: 1 # H2FAST default + admin_expense: 0.00 # percent of sales H2FAST default + capital_items: + depr_type: MACRS # can be "MACRS" or "Straight line" + depr_period: 5 # 5 years - for clean energy facilities as specified by the IRS MACRS schedule https://www.irs.gov/publications/p946#en_US_2020_publink1000107507 + refurb: [0.] + cost_adjustment_parameters: + cost_year_adjustment_inflation: 0.025 # used to adjust modeled costs to target_dollar_year + target_dollar_year: 2022 + finance_subgroups: + electricity: + commodity: electricity + finance_groups: [profast_model] + technologies: [nuclear] + hydrogen: + commodity: hydrogen + commodity_stream: htse + finance_groups: [profast_model] + technologies: [nuclear, htse] diff --git a/examples/99_nuclear_reactor_htse/run_nuclear_reactor_thermal.py b/examples/99_nuclear_reactor_htse/run_nuclear_reactor_thermal.py new file mode 100644 index 000000000..3292adbc4 --- /dev/null +++ b/examples/99_nuclear_reactor_htse/run_nuclear_reactor_thermal.py @@ -0,0 +1,19 @@ +import matplotlib.pyplot as plt + +from h2integrate.core.h2integrate_model import H2IntegrateModel + + +# Create a GreenHEART model +h2i = H2IntegrateModel("nuclear_reactor_thermal_htse.yaml") + +# Run the model +h2i.run() + +h2i.post_process() + +fig, ax = plt.subplots(3) +ax[0].plot(h2i.prob.get_val("nuclear.electricity_out", units="MW")) +ax[1].plot(h2i.prob.get_val("htse.hydrogen_out", units="kg/h")) +ax[2].plot(h2i.prob.get_val("h2_storage.SOC", units="percent")) + +plt.show() diff --git a/examples/99_nuclear_reactor_htse/tech_config.yaml b/examples/99_nuclear_reactor_htse/tech_config.yaml new file mode 100644 index 000000000..1a222323f --- /dev/null +++ b/examples/99_nuclear_reactor_htse/tech_config.yaml @@ -0,0 +1,66 @@ +name: technology_config +description: This is a nuclear plant generating electricity and can also provide heat +general: + folder_output: nuclear_htse +technologies: + nuclear: + performance_model: + model: SimpleThermalNuclearReactorPerformanceModel + cost_model: + model: SimpleThermalNuclearReactorCostModel + model_inputs: + performance_parameters: + operating_mode: heat + electricity_command_value: 500000 # kW + high_pressure_electrical_efficiency: 0.12 + low_pressure_electrical_efficiency: 0.22 + minimum_heat_extract: 1000 # kW + cost_parameters: + nuclear_reactor_rated_capacity: 5000000.0 + nuclear_reactor_upfront_cost: 5750.0 # $/kWe + nuclear_reactor_fixed_om_cost: 2.64 + nuclear_reactor_variable_om_cost: 0.0145 + # Values from Table 38, Meta-Analysis of Advanced Nuclear Reactor Cost Estimations, + # slightly adjusted away from 93% capacity factor + shared_parameters: + rated_capacity: 1000000.0 + htse: + performance_model: + model: HTSEPerformanceModel + cost_model: + model: HTSECostModel + model_inputs: + performance_parameters: + nominal_heat_required: 6.4 # kWh/kg + nominal_electricity_required: 36.8 # kWh/kg + #https://lwrs.inl.gov/content/uploads/11/2024/03/TechnicalEconomicAssessment-LWR-SupportedHydrogen.pdf #INL/RPT-23-75604 + cluster_rating_MW: 1 # Electric-only sizing component, so capacity = rating*clusters/nom_elec + n_clusters: 25 + turndown_ratio: 0.1 # minimum operating power + cost_parameters: + unit_capex: 1295 # $/kW + fixed_capex: null + h2_storage: + performance_model: + model: StorageAutoSizingModel + control_strategy: + model: SimpleStorageOpenLoopController + cost_model: + model: LinedRockCavernStorageCostModel + model_inputs: + shared_parameters: + commodity: hydrogen + commodity_rate_units: kg/h + max_soc_fraction: 0.9 + min_soc_fraction: 0.1 + set_demand_as_avg_commodity_in: true + round_trip_efficiency: 1.0 + cost_parameters: + sizing_mode: auto + combiner: + performance_model: + model: GenericCombinerPerformanceModel + model_inputs: + performance_parameters: + commodity: hydrogen + commodity_rate_units: kg/h diff --git a/examples/test/test_all_examples.py b/examples/test/test_all_examples.py index 3f8c73413..58978119b 100644 --- a/examples/test/test_all_examples.py +++ b/examples/test/test_all_examples.py @@ -3028,3 +3028,57 @@ def test_plm_optimized_dispatch_example(subtests, temp_copy_of_example): battery_charge = model.prob.get_val("battery.storage_electricity_charge", units="kW") total_energy_charged = battery_charge.sum() * (1 / 60) # kWh, 1 min timestep assert pytest.approx(total_energy_charged, rel=1e-3) == -2663.0 + + +@pytest.mark.integration +@pytest.mark.parametrize( + "example_folder,resource_example_folder", [("99_nuclear_reactor_htse", None)] +) +def test_nuclear_reactor_htse_example(subtests, temp_copy_of_example): + example_folder = temp_copy_of_example + + model = H2IntegrateModel(example_folder / "nuclear_reactor_thermal_htse.yaml") + model.run() + + annual_nuclear_electricity = model.prob.get_val( + "nuclear.annual_electricity_produced", units="TW*h/year" + )[0] + model.prob.get_val("htse.electricity_demand", units="TW*h/year")[0] + # annual_grid_sell = model.prob.get_val("grid_sell.annual_electricity_sold", + # units="TW*h/year")[0] + annual_hydrogen = model.prob.get_val("htse.annual_hydrogen_produced", units="kt/year")[0] + + with subtests.test("Nuclear annual electricity is positive"): + assert annual_nuclear_electricity == pytest.approx(8.75162086757) + + with subtests.test("HTSE annual hydrogen production is positive"): + assert annual_hydrogen == pytest.approx(5.951086956521741) + + # with subtests.test("Grid annual electricity sold is non-negative"): + # assert annual_grid_sell >= 0.0 + + # with subtests.test("Electricity balance between HTSE demand and grid sales"): + # assert pytest.approx(annual_nuclear_electricity, rel=1e-4) == ( + # annual_htse_electricity + annual_grid_sell + # ) + + high_pressure_heat = model.prob.get_val("nuclear.high_pressure_heat", units="MW") + low_pressure_heat = model.prob.get_val("nuclear.low_pressure_heat", units="MW") + extracted_heat = model.prob.get_val("nuclear.heat_out", units="MW") + + with subtests.test("Nuclear thermal split is conserved"): + assert np.allclose(high_pressure_heat, low_pressure_heat + extracted_heat, rtol=1e-6) + + rated_nuclear_output = model.prob.get_val("nuclear.rated_electricity_production", units="MW")[0] + nuclear_electricity_out = model.prob.get_val("nuclear.electricity_out", units="MW") + + with subtests.test("Nuclear electricity output is within rated limit"): + assert np.all(nuclear_electricity_out <= rated_nuclear_output + 1e-6) + + # unused_electricity = model.prob.get_val( + # "electrical_load_demand.unused_electricity_out", units="MW" + # ) + # grid_electricity_in = model.prob.get_val("grid_sell.electricity_in", units="MW") + + # with subtests.test("Unused electricity is routed to grid sell"): + # assert pytest.approx(unused_electricity.sum(), rel=1e-6) == grid_electricity_in.sum() diff --git a/h2integrate/converters/hydrogen/__init__.py b/h2integrate/converters/hydrogen/__init__.py index b39fb2556..0bf80327d 100644 --- a/h2integrate/converters/hydrogen/__init__.py +++ b/h2integrate/converters/hydrogen/__init__.py @@ -13,3 +13,7 @@ SteamMethaneReformerPerformanceModel, SteamMethaneReformerCostModel, ) +from h2integrate.converters.hydrogen.htse_electrolyzer import ( + HTSEPerformanceModel, + HTSECostModel, +) diff --git a/h2integrate/converters/hydrogen/htse_electrolyzer.py b/h2integrate/converters/hydrogen/htse_electrolyzer.py new file mode 100644 index 000000000..67158ecd4 --- /dev/null +++ b/h2integrate/converters/hydrogen/htse_electrolyzer.py @@ -0,0 +1,241 @@ +import math + +import numpy as np +from attrs import define, field + +from h2integrate.converters.hydrogen.electrolyzer_baseclass import ( + ElectrolyzerCostBaseClass, + ElectrolyzerPerformanceBaseClass, +) +from h2integrate.converters.hydrogen.utilities import size_electrolyzer_for_hydrogen_demand +from h2integrate.core.model_baseclasses import CostModelBaseConfig, ResizeablePerformanceModelBaseConfig +from h2integrate.core.utilities import merge_shared_inputs +from h2integrate.core.validators import contains, gt_zero + + +@define(kw_only=True) +class HTSEElectrolyzerPerformanceModelConfig(ResizeablePerformanceModelBaseConfig): + """Configuration for the HTSE performance model.""" + + n_clusters: int = field(validator=gt_zero) + nominal_heat_required: float = field(validator=gt_zero) + nominal_electricity_required: float = field(validator=gt_zero) + location: str = field(default="onshore", validator=contains(["onshore", "offshore"])) + cluster_rating_MW: float = field(validator=gt_zero) + eol_eff_percent_loss: float = field(default=10.0, validator=gt_zero) + uptime_hours_until_eol: int = field(default=80000, validator=gt_zero) + include_degradation_penalty: bool = field(default=False) + turndown_ratio: float = field(default=0.1, validator=gt_zero) + pressure_H2: float = field(default=1.0, validator=gt_zero) + + +class HTSEPerformanceModel(ElectrolyzerPerformanceBaseClass): + """A simplified HTSE model using electricity and heat inputs.""" + + def setup(self): + self.config = HTSEElectrolyzerPerformanceModelConfig.from_dict( + merge_shared_inputs(self.options["tech_config"]["model_inputs"], "performance"), + strict=False, + additional_cls_name=self.__class__.__name__, + ) + super().setup() + + self.add_output( + "efficiency", + val=0.0, + units="unitless", + desc="Average first-law efficiency based on utilized input energy", + ) + self.add_output( + "time_until_replacement", + val=float(self.config.uptime_hours_until_eol), + units="h", + desc="Operating hours until replacement", + ) + self.add_input( + "n_clusters", + val=self.config.n_clusters, + units="unitless", + desc="Number of HTSE clusters in the system", + ) + self.add_input( + "heat_in", + val=0.0, + shape=self.n_timesteps, + units="kW", + desc="Thermal energy supplied to the HTSE system", + ) + self.add_output( + "electrolyzer_size_mw", + val=0.0, + units="MW", + desc="Installed HTSE nameplate capacity", + ) + self.add_input("cluster_size", val=1.0, units="MW") + self.add_input("max_hydrogen_capacity", val=1000.0, units="kg/h") + + self.add_output( + "water_demand", + val=0.0, + shape=self.n_timesteps, + units="kg/h", + desc="Water consumption", + ) + self.add_output( + "heat_demand", + val=self.config.n_clusters*self.config.cluster_rating_MW + *1000*self.config.nominal_heat_required/self.config.nominal_electricity_required, + shape=self.n_timesteps, + units="kW", + desc="Thermal demanded by the HTSE system", + ) + self.add_output( + "electricity_demand", + val=0.0, + shape=self.n_timesteps, + units="kW", + desc="Electric demand by the HTSE system", + ) + self.add_output( + "electricity_consumed", + val=0.0, + shape=self.n_timesteps, + units="kW", + desc="Electricity consumed by the HTSE" + ) + + def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): + + + electrolyzer_size_mw = float(inputs["n_clusters"][0]) * self.config.cluster_rating_MW + + size_mode = discrete_inputs["size_mode"] + if size_mode != "normal": + size_flow = discrete_inputs["flow_used_for_sizing"] + if size_mode == "resize_by_max_feedstock": + feed_ratio = max(float(inputs["max_feedstock_ratio"][0]), 1.0e-6) + if size_flow == "electricity": + electrolyzer_size_mw = np.max(inputs["electricity_in"]) / 1000.0 * feed_ratio + else: + raise ValueError(f"Cannot resize for '{size_flow}' feedstock") + elif size_mode == "resize_by_max_commodity": + comm_ratio = max(float(inputs["max_commodity_ratio"][0]), 1.0e-6) + if size_flow == "hydrogen": + electrolyzer_size_mw = size_electrolyzer_for_hydrogen_demand( + float(inputs["max_hydrogen_capacity"][0]) * comm_ratio + ) + else: + raise ValueError(f"Cannot resize for '{size_flow}' commodity") + else: + raise NotImplementedError(f"Sizing mode '{size_mode}' not implemented") + + n_clusters = inputs["n_clusters"] + electrolyzer_size_mw = n_clusters * self.config.cluster_rating_MW + electrolyzer_size_kw = electrolyzer_size_mw * 1000.0 + + if "system_level_control" in self.options["plant_config"]: + hydrogen_demand = inputs["hydrogen_command_value"] #kg/hr? + else: + hydrogen_demand = electrolyzer_size_kw/ self.config.nominal_electricity_required #kW/(kWh/kg) = kg/hr + ratio_heat_elec_nom = self.config.nominal_heat_required/self.config.nominal_electricity_required + + heat_available_kw = inputs["heat_in"] + electricity_available_kw =inputs["electricity_in"] + #hydrogen_demand = inputs["hydrogen_command_value"] + total_specific_energy = ( + self.config.nominal_heat_required + self.config.nominal_electricity_required + ) + rated_hydrogen_production = electrolyzer_size_kw / self.config.nominal_electricity_required + #note here that the RATED production is based purely on the electrical requirement. The heat input is a bonus amount. Units here are kg/hr + heat_demand_kw = hydrogen_demand * self.config.nominal_heat_required + actual_heat_kw = np.minimum(heat_demand_kw, heat_available_kw) + electricity_demand_kw = total_specific_energy * hydrogen_demand - actual_heat_kw + ratio_in = heat_available_kw / electricity_available_kw + hydrogen_produced = np.where(electricity_available_kw < electricity_demand_kw, + np.where( ratio_in > ratio_heat_elec_nom, + electricity_available_kw/self.config.nominal_electricity_required, + (heat_available_kw + electricity_available_kw)/total_specific_energy), + (actual_heat_kw + electricity_demand_kw)/total_specific_energy) + + actual_electricity_kw = actual_heat_kw/ratio_heat_elec_nom + + #in this case, the electricity is insufficient compared to the heat, so we'll use + #actual_electricity_kw = np.minimum(electricity_demand_kw, electricity_available_kw) + min_turn_down = self.config.turndown_ratio * rated_hydrogen_production + hydrogen_produced = np.where(hydrogen_produced >= min_turn_down, hydrogen_produced, 0.0) + + #heat_demand_kw = hydrogen_out * self.config.nominal_heat_required + # electricity_demand_kw = hydrogen_out * total_specific_energy - actual_heat_kw + #electricity_demand_kw = np.minimum(electricity_demand_kw, electricity_available_kw) + outputs["electricity_consumed"] = electricity_demand_kw + outputs["hydrogen_out"] = hydrogen_produced + #outputs["heat_demand"] = np.minimum(rated_hydrogen_production, inputs["hydrogen_command_value"]) * self.config.nominal_heat_required + outputs["heat_demand"] = hydrogen_demand * self.config.nominal_heat_required + outputs["electricity_demand"] = electrolyzer_size_kw + outputs["water_demand"] = hydrogen_produced * 18.015 / 2.016 + outputs["rated_hydrogen_production"] = rated_hydrogen_production + outputs["electrolyzer_size_mw"] = electrolyzer_size_mw + + total_hydrogen_produced = np.sum(hydrogen_produced) * (self.dt / 3600.0) + outputs["total_hydrogen_produced"] = total_hydrogen_produced + annual_hydrogen = total_hydrogen_produced / self.fraction_of_year_simulated + outputs["annual_hydrogen_produced"] = np.full(self.plant_life, annual_hydrogen) + + max_production = rated_hydrogen_production * self.n_timesteps * (self.dt / 3600.0) + capacity_factor = total_hydrogen_produced / max_production if max_production > 0 else 0.0 + outputs["capacity_factor"] =np.full(self.plant_life, capacity_factor) + + utilized_input_kw = actual_heat_kw + electricity_demand_kw + available_input_kw = heat_available_kw + electricity_available_kw + with np.errstate(divide="ignore", invalid="ignore"): + timestep_efficiency = np.divide( + utilized_input_kw, + available_input_kw, + out=np.zeros_like(utilized_input_kw), + where=available_input_kw > 0, + ) + outputs["efficiency"] = float(np.mean(timestep_efficiency)) + + refurb_schedule = np.zeros(self.plant_life) + refurb_period = max(1, round(self.config.uptime_hours_until_eol / 8760)) + refurb_schedule[refurb_period : self.plant_life : refurb_period] = 1.0 + outputs["replacement_schedule"] = refurb_schedule + outputs["time_until_replacement"] = float(self.config.uptime_hours_until_eol) + + +@define(kw_only=True) +class HTSECostModelConfig(CostModelBaseConfig): + """Configuration for the HTSE cost model.""" + + unit_capex: float = field(validator=gt_zero) + fixed_opex: float | None = field(default=None) + fixed_capex: float | None = field(default=None) + cost_year: int = field(default=2025, converter=int) + + def __attrs_post_init__(self): + if self.fixed_opex is None: + self.fixed_opex = 0.0 if self.fixed_capex is None else float(self.fixed_capex) + + +class HTSECostModel(ElectrolyzerCostBaseClass): + """A simple size-based cost model for HTSE.""" + + def setup(self): + self.config = HTSECostModelConfig.from_dict( + merge_shared_inputs(self.options["tech_config"]["model_inputs"], "cost"), + strict=False, + additional_cls_name=self.__class__.__name__, + ) + super().setup() + + self.add_input( + "electrolyzer_size_mw", + val=0.0, + units="MW", + desc="Installed HTSE nameplate capacity", + ) + + def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): + electrolyzer_size_kw = float(inputs["electrolyzer_size_mw"][0]) * 1000.0 + outputs["CapEx"] = self.config.unit_capex * electrolyzer_size_kw + outputs["OpEx"] = self.config.fixed_opex * electrolyzer_size_kw diff --git a/h2integrate/converters/nuclear/__init__.py b/h2integrate/converters/nuclear/__init__.py index 3bab04d7e..409ebc15f 100644 --- a/h2integrate/converters/nuclear/__init__.py +++ b/h2integrate/converters/nuclear/__init__.py @@ -2,3 +2,7 @@ QuinnNuclearPerformanceModel, QuinnNuclearCostModel, ) +from h2integrate.converters.nuclear.nuclear_plant_thermal import ( + SimpleThermalNuclearReactorPerformanceModel, + SimpleThermalNuclearReactorCostModel, +) diff --git a/h2integrate/converters/nuclear/nuclear_plant_thermal.py b/h2integrate/converters/nuclear/nuclear_plant_thermal.py new file mode 100644 index 000000000..f9309cc5c --- /dev/null +++ b/h2integrate/converters/nuclear/nuclear_plant_thermal.py @@ -0,0 +1,209 @@ +import numpy as np +from attrs import field, define + +from h2integrate.core.utilities import BaseConfig, merge_shared_inputs +from h2integrate.core.validators import gt_zero, contains +from h2integrate.core.model_baseclasses import ( + CostModelBaseClass, + CostModelBaseConfig, + PerformanceModelBaseClass, +) + + +@define(kw_only=True) +class SimpleThermalNuclearReactorConfig(BaseConfig): + operating_mode: str = field(validator=contains(["heat", "electricity"])) + electricity_command_value: float = field(validator=gt_zero) + high_pressure_electrical_efficiency: float = field(validator=gt_zero) + low_pressure_electrical_efficiency: float = field(validator=gt_zero) + rated_capacity: float = field(validator=gt_zero) + minimum_heat_extract: float = field(default=0.0) + + +class SimpleThermalNuclearReactorPerformanceModel(PerformanceModelBaseClass): + """Simple thermal nuclear reactor model with heat and electricity outputs.""" + + _time_step_bounds = (3600, 3600) + + def initialize(self): + super().initialize() + self.commodity = "electricity" + self.commodity_rate_units = "kW" + self.commodity_amount_units = "kW*h" + + + def setup(self): + self.config = SimpleThermalNuclearReactorConfig.from_dict( + merge_shared_inputs(self.options["tech_config"]["model_inputs"], "performance"), + strict=False, + additional_cls_name=self.__class__.__name__, + ) + super().setup() + + self.add_discrete_input("operating_mode", val=self.config.operating_mode) + self.add_input( + f"{self.commodity}_command_value", + val=self.config.electricity_command_value, + shape=self.n_timesteps, + units=self.commodity_rate_units, + desc="Requested electric power setpoint", + ) + self.add_input( + "rated_capacity", + val=self.config.rated_capacity, + units=self.commodity_rate_units, + desc="Available reactor thermal capacity", + ) + self.add_input( + "high_pressure_electrical_efficiency", + val=self.config.high_pressure_electrical_efficiency, + units="unitless", + ) + self.add_input( + "low_pressure_electrical_efficiency", + val=self.config.low_pressure_electrical_efficiency, + units="unitless", + ) + self.add_input( + "minimum_heat_extract", + val=self.config.minimum_heat_extract, + units="kW", + desc="Minimum thermal output reserved for process heat extraction", + ) + self.add_input( + "heat_command_value", + val=6400, + shape=self.n_timesteps, + units="kW", + desc="Requested process heat demand from downstream technologies", + ) + + self.add_output("high_pressure_heat_demanded", val=0.0, shape=self.n_timesteps, units="kW") + self.add_output("high_pressure_heat", val=0.0, shape=self.n_timesteps, units="kW") + self.add_output("low_pressure_heat", val=0.0, shape=self.n_timesteps, units="kW") + self.add_output("heat_out", val=0.0, shape=self.n_timesteps, units="kW") + + def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): + operating_mode = discrete_inputs["operating_mode"] + hp_eff = float(inputs["high_pressure_electrical_efficiency"][0]) + lp_eff = float(inputs["low_pressure_electrical_efficiency"][0]) + electric_capacity_mw = float(inputs["rated_capacity"][0]) * 1e-3 # convert kW to MW + minimum_heat_extract_kw = np.maximum(inputs["minimum_heat_extract"], 0.0) #maintain kW rating + requested_power_mw = np.maximum(inputs["electricity_command_value"], 0.0) * 1e-3 #convert kW to MW, fix >0 + external_heat_demand_kw = np.maximum(inputs["heat_command_value"], 0.0) #maintaining kW rating + + combined_efficiency = hp_eff + (1.0 - hp_eff) * lp_eff + if combined_efficiency <= 0.0: + raise ValueError("Combined nuclear electric efficiency must be greater than zero") + if lp_eff <= 0.0: + raise ValueError("Low-pressure electrical efficiency must be greater than zero") + + thermal_capacity_mw = electric_capacity_mw / combined_efficiency + high_pressure_electricity_mw = thermal_capacity_mw * hp_eff + available_process_heat_mw = thermal_capacity_mw * (1.0 - hp_eff) + heat_demand_mw = np.maximum(external_heat_demand_kw, minimum_heat_extract_kw) * 1e-3 #convert to MW from kW + + if operating_mode == "heat": + heat_out_mw = np.minimum(heat_demand_mw, available_process_heat_mw) + electricity_out_mw = ( + high_pressure_electricity_mw + (available_process_heat_mw - heat_out_mw) * lp_eff + ) + elif operating_mode == "electricity": + electricity_out_mw = np.minimum(requested_power_mw, electric_capacity_mw) + heat_out_mw = ( + available_process_heat_mw + - (electricity_out_mw - high_pressure_electricity_mw) / lp_eff + ) + heat_out_mw = np.clip(heat_out_mw, 0.0, available_process_heat_mw) + else: + raise NotImplementedError( + "The nuclear operating_mode must be either 'heat' or 'electricity'" + ) + + electricity_out_mw = np.clip(electricity_out_mw, 0.0, electric_capacity_mw) + low_pressure_heat_remaining_mw = available_process_heat_mw - heat_out_mw + + high_pressure_heat_kw = np.full(self.n_timesteps, available_process_heat_mw * 1000.0) + low_pressure_heat_kw = low_pressure_heat_remaining_mw * 1000.0 + electricity_out_kw = electricity_out_mw * 1000.0 + heat_out_kw = heat_out_mw * 1000.0 + + outputs["high_pressure_heat_demanded"] = heat_demand_mw * 1000.0 + outputs["high_pressure_heat"] = high_pressure_heat_kw + outputs["low_pressure_heat"] = low_pressure_heat_kw + outputs["heat_out"] = heat_out_kw + outputs["electricity_out"] = electricity_out_kw + outputs["rated_electricity_production"] = electric_capacity_mw * 1000.0 + + total_electricity = np.sum(electricity_out_kw) * (self.dt / 3600.0) + outputs["total_electricity_produced"] = total_electricity + annual_electricity = total_electricity / self.fraction_of_year_simulated + outputs["annual_electricity_produced"] = np.full(self.plant_life, annual_electricity) + + avg_electricity_out_mw = float(np.mean(electricity_out_mw)) + capacity_factor = ( + avg_electricity_out_mw / electric_capacity_mw if electric_capacity_mw > 0.0 else 0.0 + ) + outputs["capacity_factor"] = np.full(self.plant_life, capacity_factor) + outputs["replacement_schedule"] = np.zeros(self.plant_life) + + +@define(kw_only=True) +class SimpleThermalNuclearReactorCostConfig(CostModelBaseConfig): + rated_capacity: float = field(validator=gt_zero) + nuclear_reactor_upfront_cost: float = field(validator=gt_zero) + nuclear_reactor_fixed_om_cost: float = field(validator=gt_zero) + nuclear_reactor_variable_om_cost: float = field(validator=gt_zero) + cost_year: int = field(default=2025, converter=int) + + +class SimpleThermalNuclearReactorCostModel(CostModelBaseClass): + """Simple cost model for the thermal nuclear reactor.""" + + _time_step_bounds = (3600, 3600) + + def setup(self): + self.dt = self.options["plant_config"]["plant"]["simulation"]["dt"] + self.plant_life = int(self.options["plant_config"]["plant"]["plant_life"]) + n_timesteps = int(self.options["plant_config"]["plant"]["simulation"]["n_timesteps"]) + self.config = SimpleThermalNuclearReactorCostConfig.from_dict( + merge_shared_inputs(self.options["tech_config"]["model_inputs"], "cost"), + strict=False, + additional_cls_name=self.__class__.__name__, + ) + super().setup() + + self.add_input( + "rated_capacity", + val=self.config.rated_capacity, + units="kW", + ) + self.add_input( + "nuclear_reactor_upfront_cost", + val=self.config.nuclear_reactor_upfront_cost, + units="USD/kW", + ) + self.add_input( + "nuclear_reactor_fixed_om_cost", + val=self.config.nuclear_reactor_fixed_om_cost, + units="USD/(kW*year)", + ) + self.add_input( + "nuclear_reactor_variable_om_cost", + val=self.config.nuclear_reactor_variable_om_cost, + units="USD/(kW*h)", + ) + self.add_input("electricity_out", val=0.0, shape=n_timesteps, units="kW") + + def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): + rated_capacity_kw = float(inputs["rated_capacity"][0]) + upfront_cost_per_kw = float(inputs["nuclear_reactor_upfront_cost"][0]) + fixed_om_per_kw_year = float(inputs["nuclear_reactor_fixed_om_cost"][0]) + variable_om_per_kwh = float(inputs["nuclear_reactor_variable_om_cost"][0]) + + outputs["CapEx"] = rated_capacity_kw * upfront_cost_per_kw + outputs["OpEx"] = fixed_om_per_kw_year * rated_capacity_kw + + delivered_electricity_kwh = np.sum(inputs["electricity_out"]) * (self.dt / 3600.0) + annual_variable_om = variable_om_per_kwh * delivered_electricity_kwh + outputs["VarOpEx"] = np.full(self.plant_life, annual_variable_om) diff --git a/h2integrate/core/supported_models.py b/h2integrate/core/supported_models.py index f9e43ce89..51fa624bd 100644 --- a/h2integrate/core/supported_models.py +++ b/h2integrate/core/supported_models.py @@ -75,6 +75,8 @@ def copy(self): "RunOfRiverHydroPerformanceModel": "converters.water_power:RunOfRiverHydroPerformanceModel", "RunOfRiverHydroCostModel": "converters.water_power:RunOfRiverHydroCostModel", "ECOElectrolyzerPerformanceModel": "converters.hydrogen:ECOElectrolyzerPerformanceModel", + "HTSEPerformanceModel": "converters.hydrogen:HTSEPerformanceModel", + "HTSECostModel": "converters.hydrogen:HTSECostModel", "SingliticoCostModel": "converters.hydrogen:SingliticoCostModel", "BasicElectrolyzerCostModel": "converters.hydrogen:BasicElectrolyzerCostModel", "CustomElectrolyzerCostModel": "converters.hydrogen:CustomElectrolyzerCostModel", @@ -128,6 +130,8 @@ def copy(self): "NaturalGasPerformanceModel": "converters.natural_gas:NaturalGasPerformanceModel", "QuinnNuclearPerformanceModel": "converters.nuclear:QuinnNuclearPerformanceModel", "QuinnNuclearCostModel": "converters.nuclear:QuinnNuclearCostModel", + "SimpleThermalNuclearReactorCostModel": "converters.nuclear:SimpleThermalNuclearReactorCostModel", + "SimpleThermalNuclearReactorPerformanceModel": "converters.nuclear:SimpleThermalNuclearReactorPerformanceModel", "NaturalGasCostModel": "converters.natural_gas:NaturalGasCostModel", # Transport "cable": "transporters:CablePerformanceModel", @@ -188,12 +192,10 @@ def copy(self): } ) - # This next section is to demarcate specific models that belong to certain categories that are # relevant for processing in the model stackup. Right now, these designations are # used in `h2integrate_model.py`. - # Model classes that do not contribute costs to the finance stackup because they are essentially # internal-only models that aren't categorized as a specific technology (e.g. a generic combiner # or splitter, or a model that is only used for performance modeling within another model and