Skip to content

Commit

Permalink
add ammonia sizing function
Browse files Browse the repository at this point in the history
  • Loading branch information
kbrunik committed Feb 28, 2024
1 parent 0c5c6ec commit 78170b1
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 2 deletions.
68 changes: 66 additions & 2 deletions greenheart/simulation/technologies/ammonia/ammonia.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@
- [1]
"""

from typing import Dict, Union
from typing import Dict, Union, Optional
import ProFAST

import pandas as pd
from attrs import define, Factory
from attrs import define, Factory, field


@define
Expand Down Expand Up @@ -156,6 +156,70 @@ def run_ammonia_model(

return ammonia_production_kgpy

@define
class AmmoniaSizeModelConfig:
"""
Configuration inputs for the ammonia sizing model, including plant capacity and
feedstock details.
Attributes:
hydrogen_amount_kg Optional (float): The amount of hydrogen available in kilograms to
make ammonia.
ammonia_plant_size_kg Optional (float): The amount of desired ammonia production in
kilograms.
plant_capcity_factor (float): The ammonia plant capacity factor.
feedstocks (Feedstocks): An instance of the `Feedstocks` class detailing the
costs and consumption rates of resources used in production.
"""
plant_capacity_factor: float
feedstock: Feedstocks
hydrogen_amount_kg: Optional[float] = field(default=None)
ammonia_plant_size_kg: Optional[float] = field(default=None)


def __attrs_post_init__(self):
if self.hydrogen_amount_kg is None and self.ammonia_plant_size_kg is None:
raise ValueError("`hydrogen_amount_kg` or `ammonia_plant_size_kg` is a required input.")

if self.hydrogen_amount_kg and self.ammonia_plant_size_kg:
raise ValueError("can only select one input: `hydrogen_amount_kg` or `ammonia_plant_size_kg`.")

@define
class AmmoniaSizeModelOutputs:
"""
Outputs from the ammonia size model.
Attributes:
ammonia_plant_size_kg (float): If amount of hydrogen in kilograms is input,
the size of the ammonia plant in kilograms is output.
hydrogen_amount_kg (float): If amount of ammonia production in kilograms is input,
the amount of necessary hydrogen feedstock in kilograms is output.
"""
ammonia_plant_size_kg: float
hydrogen_amount_kg: float

def run_size_ammonia_plant(config: AmmoniaSizeModelConfig) -> AmmoniaSizeModelOutputs:

if config.hydrogen_amount_kg:
ammonia_plant_size_kg = (config.hydrogen_amount_kg
/ config.feedstock.hydrogen_consumption
* config.plant_capacity_factor
)
hydrogen_amount_kg = config.hydrogen_amount_kg

if config.ammonia_plant_size_kg:
hydrogen_amount_kg = (config.ammonia_plant_size_kg
* config.feedstock.hydrogen_consumption
/ config.plant_capacity_factor
)
ammonia_plant_size_kg = (config.ammonia_plant_size_kg
/ config.plant_capacity_factor
)

return AmmoniaSizeModelOutputs(
ammonia_plant_size_kg=ammonia_plant_size_kg,
hydrogen_amount_kg=hydrogen_amount_kg
)

def run_ammonia_cost_model(config: AmmoniaCostModelConfig) -> AmmoniaCostModelOutputs:
"""
Expand Down
40 changes: 40 additions & 0 deletions tests/greenheart/test_ammonia.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,3 +110,43 @@ def test_ammonia_finance_model():
res: ammonia.AmmoniaFinanceModelOutputs = ammonia.run_ammonia_finance_model(config)

assert res.sol.get("price") == lcoa_expected

def test_ammonia_size_h2_input(subtests):
config = ammonia.AmmoniaSizeModelConfig(
hydrogen_amount_kg=73288888.8888889,
plant_capacity_factor=0.9,
feedstock=ammonia.Feedstocks(
electricity_cost=89.42320514456621,
hydrogen_cost=4.2986685034417045,
cooling_water_cost=0.00291,
iron_based_catalyst_cost=23.19977341,
oxygen_cost=0,
),
)

res: ammonia.AmmoniaSizeModelOutputs = ammonia.run_size_ammonia_plant(config)

with subtests.test("Ammonia plant size"):
assert res.ammonia_plant_size_kg == approx(334339658.8730839)
with subtests.test("hydrogen input"):
assert res.hydrogen_amount_kg == approx(73288888.8888889)

def test_ammonia_size_NH3_input(subtests):
config = ammonia.AmmoniaSizeModelConfig(
ammonia_plant_size_kg=334339658.8730839,
plant_capacity_factor=0.9,
feedstock=ammonia.Feedstocks(
electricity_cost=89.42320514456621,
hydrogen_cost=4.2986685034417045,
cooling_water_cost=0.00291,
iron_based_catalyst_cost=23.19977341,
oxygen_cost=0,
),
)

res: ammonia.AmmoniaSizeModelOutputs = ammonia.run_size_ammonia_plant(config)

with subtests.test("Ammonia plant size"):
assert res.ammonia_plant_size_kg == approx(371488509.8589821)
with subtests.test("hydrogen input"):
assert res.hydrogen_amount_kg == approx(73288888.8888889)

0 comments on commit 78170b1

Please sign in to comment.