Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
b7a2ed8
reformatted
elenya-grant Jan 26, 2024
a7e3778
updated PEM schema and removed LCOH tests temporarily
elenya-grant Jan 30, 2024
43808e1
updated alkaline modeling schema and alkaline Urev0 calc
elenya-grant Jan 30, 2024
aae1054
update lcoh glue_code test regression values
bayc Feb 1, 2024
ff5a447
added hydrogen loss from degradation and input toggle to choose that …
elenya-grant Jun 21, 2024
6e9935c
added LCA functions to stack.py
elenya-grant Jun 21, 2024
bacfbc6
added eol_eff_percent_loss as degradation input for stack
elenya-grant Jun 21, 2024
c758104
added run_LCA functionto run_electrolyzer script
elenya-grant Jun 21, 2024
663700a
added more tracking variables to stack
elenya-grant Jun 21, 2024
2705327
updated all py file import paths
elenya-grant Feb 3, 2025
27606ee
updated jupyter notebook import paths
elenya-grant Feb 3, 2025
c3b8665
added validators and minor fix in stack for cell type
elenya-grant Feb 3, 2025
53f8c8a
added skeleton for cluster and cell classes
elenya-grant Feb 3, 2025
81e60a8
added generic base class
elenya-grant Feb 3, 2025
12d25a0
added example skeleton for simulation config
elenya-grant Feb 3, 2025
86b219c
added file for power-curve function templates
elenya-grant Feb 3, 2025
c9c8813
Merge remote-tracking branch 'origin/BERT/schema_update' into old_for…
elenya-grant Feb 3, 2025
43e4bf7
updated inputs for Stack in test_stack
elenya-grant Feb 3, 2025
2e07166
fixed merge conflicts in stack.py
elenya-grant Feb 3, 2025
a65c78d
added import to fix tests to stack.py
elenya-grant Feb 3, 2025
3b687ad
removed empty PEM cell test
elenya-grant Feb 3, 2025
3582018
renamed test_cell to test_PEM_cell
elenya-grant Feb 3, 2025
366a2bb
merged develop into feature/bert_basic
elenya-grant Feb 26, 2025
2522fc0
updated validator format
elenya-grant Feb 26, 2025
47e0920
removed files unrelated to primary feature-adds
elenya-grant Feb 26, 2025
c30b051
reformatted bert.py
elenya-grant Feb 26, 2025
6216c44
added back-in placeholder files
elenya-grant Feb 26, 2025
4aa7019
removed alkaline sources in alkaline model into md file
elenya-grant Feb 26, 2025
f7c9884
Merge remote-tracking branch 'upstream/develop' into feature/bert_basic
elenya-grant Aug 7, 2025
b6a5c57
Typographical changes
johnjasa Sep 3, 2025
348e559
minor cleanups to alkaline cell and stack
elenya-grant Sep 3, 2025
a39b015
removed commented out code and added docstrings
elenya-grant Sep 3, 2025
98efbd1
merged stack
elenya-grant Sep 3, 2025
1a4afbf
fixed aep datadrame in bert.py
elenya-grant Sep 3, 2025
85f7847
added more docstrings to stack.py
elenya-grant Sep 3, 2025
6231d3a
added comments to pem.py for faradaic coefficients
elenya-grant Sep 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions docs/alkaline_ref.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
1. [Oystein Ulleberg, 2003](https://www.sciencedirect.com/science/article/pii/S0360319902000332?via%3Dihub)
"Modeling of advanced alkaline electrolyzers: a system simulation approach"


2. [Gambou, Guilbert,et al 2022](https://www.mdpi.com/1996-1073/15/9/3452)
"A Comprehensive Survey of Alkaline Electrolyzer Modeling: Electrical
Domain and Specific Electrolyte Conductivity"


3. [Haug ,Kreitz, 2017](https://www.sciencedirect.com/science/article/pii/S0360319917318633)
"Process modelling of an alkaline water electrolyzer"


4. [Henou, Agbossou, 2014](https://www.sciencedirect.com/science/article/pii/S0378775313017527)
- "Simulation tool based on a physics model and an electrical
analogy for an alkaline electrolyser"
- Notes:
- cited by [Gambou, Guilbert,et al 2022]
- HAS ALL THE VALUES FOR VARIABLES USED IN [Gambou, Guilbert,et al 2022]

5. [Hammoudi,Henao, 2012](https://www.sciencedirect.com/science/article/pii/S036031991201590X)
- "New multi-physics approach for modelling andn design of
alkaline electrolyzers"
- Notes:
- Referenced by [Henou, Agbossou, 2014] for theta calculation
(electrode coverage)
- Eqn 44 for bubble stuff
- j_lim=300 kA/m^2
- includes other efficiency losses
- cites: https://www.sciencedirect.com/science/article/pii/S0360128509000598

6. [Brauns,2021](https://iopscience.iop.org/article/10.1149/1945-7111/abda57/pdf)
- bibtex label:
- "Evaluation of Diaphragms and Membranes as Separators for Alkaline Water Electrolysis" by Jorn Brauns et all 2021. J. Electrochem Soc 168 014510
- Notes:
- good numbers
- electrolyte flow rate of 350 mL/min
- total electrolyte volume of 10L
- has supplementary material (need to checkout)
- in "material stability" it mentions stuff about DEGRADATION

7. [NEL Report](https://www.energy.gov/sites/default/files/2022-02/2-Intro-Liquid%20Alkaline%20Workshop.pdf)
- bibtex label:


8. [Brauns, Turek 2020](https://www.mdpi.com/2227-9717/8/2/248)
- bibtex label:
- "Alkaline Water Electrolysis Powered by Renewable Energy: A Review"


9. [Eigeldinger, Vogt 2000](https://www.sciencedirect.com/science/article/pii/S0013468600005132)
- bibtex label: Eigeldinger_2000
- "The bubble coverage of gas evolving electrodes in a flowing electrolyte"
- Notes:
- Ref 15 of Henou 2014 for current density and theta stuff
- has current density equation with theta included

10. [Haug, Koj, Turek 2017](https://www.sciencedirect.com/science/article/pii/S0360319916336588)
"Influence of process conditions on gas purity in alkaline water electrolysis"
by Phillip Haug, Motthias Koj, Thomas Turek [2017]


11. [Niroula, Chaudhary, Subedi, Thapa 2003](https://iopscience.iop.org/article/10.1088/1757-899X/1279/1/012005/pdf)

"Parametric Modelling and Optimization of Alkaline Electrolyzer for the Production
of Green Hydrogen" by S. Niroula, C Chaudhary, A Subedi, and B S Thapa
[2003] doi:10.1088/1757-899X/1279/1/012005


12. [Vogt,Balzer 2005](https://www.sciencedirect.com/science/article/pii/S001346860400948X?via%3Dihub)
"The bubble coverage of gas-evolving electrodes in stagnant electrolytes"
by H. Vogt and R.J. Balzer
Volume 50, Issue 10, 15 March 2005, Pages 2073-2079
34 changes: 34 additions & 0 deletions electrolyzer/simulation/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from typing import Any, Dict

import attrs

from electrolyzer.tools.type_dec import FromDictMixin


class BaseClass(FromDictMixin):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see this class is added in this PR but not used anywhere yet. Is that intended?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes. It will be updated in a following PR to function as a general base-class for the classes.

"""
BaseClass object class. This class does the logging and MixIn class inheritance.
"""

@classmethod
def get_model_defaults(cls) -> Dict[str, Any]:
"""Produces a dictionary of the keyword arguments and their defaults.
Returns
-------
Dict[str, Any]
Dictionary of keyword argument: default.
"""
return {el.name: el.default for el in attrs.fields(cls)}

def _get_model_dict(self) -> dict:
"""Convenience method that wraps the `attrs.asdict` method. Returns the object's
parameters as a dictionary.
Returns
-------
dict
The provided or default, if no input provided,
model settings as a dictionary.
"""
return attrs.asdict(self)
49 changes: 49 additions & 0 deletions electrolyzer/simulation/bert.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,55 @@ def _run_electrolyzer_opt(modeling_options, power_signal):
return tot_kg, max_curr_density


def run_LCA(elec_sys, plant_life_years: int):
sys_refurb = pd.DataFrame()
sys_aep = pd.DataFrame()
sys_ah2 = pd.DataFrame()
years = list(np.arange(0, plant_life_years, 1))
for i, stack in enumerate(elec_sys.stacks):
id = i + 1
refturb_schedule, ahp_kg, aep_kWh = stack.estimate_life_performance_from_year(
plant_life_years
)
sys_aep = pd.concat(
[
sys_aep,
pd.DataFrame(
dict(zip(["Stack {}".format(id)], [aep_kWh])), index=years
),
]
)
sys_ah2 = pd.concat(
[
sys_ah2,
pd.DataFrame(dict(zip(["Stack {}".format(id)], [ahp_kg])), index=years),
]
)
sys_refurb = pd.concat(
[
sys_refurb,
pd.DataFrame(
dict(zip(["Stack {}".format(id)], [refturb_schedule])), index=years
),
]
)
# df_index = [
# [f"stack {id}"]*plant_life_years,
# list(np.arange(0,plant_life_years,1))
# ]
# temp_df = pd.DataFrame(dict(zip(
# ["AEP [kWh/year]","Refurb Schedule","AHP [kg/year]"],
# [aep_kWh,ahp_kg,refturb_schedule])),
# index=df_index
# )
# stack_LCA = pd.concat([stack_LCA,temp_df])
return {
"Refurb Schedule": sys_refurb,
"AEP [kWh/year]": sys_aep,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is AEP here the input power to the electrolyzer system?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see now that it is, maybe we can call it power_used? I'm open to discussion on this!

"AHP [kg/year]": sys_ah2,
}


def run_electrolyzer(input_modeling, power_signal, optimize=False):
"""
Runs an electrolyzer simulation based on a YAML configuration file and power
Expand Down
1 change: 0 additions & 1 deletion electrolyzer/simulation/cell.py

This file was deleted.

Loading