OPEM

0

OPEM (Open Source PEM Fuel Cell Simulation Tool)

Miscellaneous

chemistry
pem
fuel-cell
opem

Table of Contents

Overview

Modeling and simulation of proton-exchange membrane fuel cells (PEMFC) may work as a powerful tool in the research & development of renewable energy sources. The Open-Source PEMFC Simulation Tool (OPEM) is a modeling tool for evaluating the performance of proton exchange membrane fuel cells. This package is a combination of models (static/dynamic) that predict the optimum operating parameters of PEMFC. OPEM contained generic models that will accept as input, not only values of the operating variables such as anode and cathode feed gas, pressure and compositions, cell temperature and current density, but also cell parameters including the active area and membrane thickness. In addition, some of the different models of PEMFC that have been proposed in the OPEM, just focus on one particular FC stack, and some others take into account a part or all auxiliaries such as reformers. OPEM is a platform for collaborative development of PEMFC models.

Fig1. OPEM Block Diagram

Open Hub
PyPI Counter
Github Stars
Branchmasterdevelop
CI
Code QualityCodeFactor

Usage

Executable

  • Open CMD (Windows) or Terminal (UNIX)
  • Run opem or python -m opem (or run OPEM.exe)
  • Enter PEM cell parameters (or run standard test vectors)
    1. Amphlett Static Model

      InputDescriptionUnit
      TCell operation temperatureK
      PH2Partial pressureatm
      PO2Partial pressureatm
      i-startCell operating current start pointA
      i-stepCell operating current stepA
      i-stopCell operating current end pointA
      AActive areacm^2
      lMembrane thicknesscm
      lambdaAn adjustable parameter with a min value of 14 and max value of 23--
      R(*Optional)R-Electronicohm
      JMaxMaximum current densityA/(cm^2)
      NNumber of single cells--
      * For more information about this model visit here
    2. Larminie-Dicks Static Model

      InputDescriptionUnit
      E0Fuel cell reversible no loss voltageV
      AThe slope of the Tafel lineV
      TCell operation temperatureK
      i-startCell operating current start pointA
      i-stepCell operating current stepA
      i-stopCell operating current end pointA
      i_nInternal currentA
      i_0Exchange current at which the overvoltage begins to move from zero A
      i_LLimiting currentA
      RMThe membrane and contact resistancesohm
      NNumber of single cells--
      * For more information about this model visit here
    3. Chamberline-Kim Static Model

      InputDescriptionUnit
      E0Open circuit voltageV
      bTafel's parameter for the oxygen reductionV
      RResistanceohm.cm^2
      i-startCell operating current start pointA
      i-stepCell operating current stepA
      i-stopCell operating current end pointA
      AActive areacm^2
      mDiffusion's parametersV
      nDiffusion's parameters(A^-1)(cm^2)
      NNumber of single cells--
      * For more information about this model visit here
    4. Padulles Dynamic Model I

      InputDescriptionUnit
      E0No load voltageV
      TFuel cell temperatureK
      KH2Hydrogen valve constantkmol.s^(-1).atm^(-1)
      KO2Oxygen valve constantkmol.s^(-1).atm^(-1)
      tH2Hydrogen time constants
      tO2Oxygen time constants
      BActivation voltage constantV
      CActivation constant parameterA^(-1)
      RintFuel cell internal resistanceohm
      rhoHydrogen-Oxygen flow ratio--
      qH2Molar flow of hydrogenkmol/s
      N0Number of cells--
      i-startCell operating current start pointA
      i-stepCell operating current stepA
      i-stopCell operating current end pointA
      * For more information about this model visit here
    5. Padulles Dynamic Model II

      InputDescriptionUnit
      E0No load voltageV
      TFuel cell temperatureK
      KH2Hydrogen valve constantkmol.s^(-1).atm^(-1)
      KH2OWater valve constantkmol.s^(-1).atm^(-1)
      KO2Oxygen valve constantkmol.s^(-1).atm^(-1)
      tH2Hydrogen time constants
      tH2OWater time constants
      tO2Oxygen time constants
      BActivation voltage constantV
      CActivation constant parameterA^(-1)
      RintFuel cell internal resistanceohm
      rhoHydrogen-Oxygen flow ratio--
      qH2Molar flow of hydrogenkmol/s
      N0Number of cells--
      i-startCell operating current start pointA
      i-stepCell operating current stepA
      i-stopCell operating current end pointA
      * For more information about this model visit here
    6. Padulles-Hauer Dynamic Model

      InputDescriptionUnit
      E0No load voltageV
      TFuel cell temperatureK
      KH2Hydrogen valve constantkmol.s^(-1).atm^(-1)
      KH2OWater valve constantkmol.s^(-1).atm^(-1)
      KO2Oxygen valve constantkmol.s^(-1).atm^(-1)
      tH2Hydrogen time constants
      tH2OWater time constants
      tO2Oxygen time constants
      t1Reformer time constants
      t2Reformer time constants
      BActivation voltage constantV
      CActivation constant parameterA^(-1)
      CVConversion factor--
      RintFuel cell internal resistanceohm
      rhoHydrogen-Oxygen flow ratio--
      qMethanolMolar flow of methanolkmol/s
      N0Number of cells--
      i-startCell operating current start pointA
      i-stepCell operating current stepA
      i-stopCell operating current end pointA
      * For more information about this model visit here
    7. Padulles-Amphlett Dynamic Model

      InputDescriptionUnit
      E0No load voltageV
      TFuel cell temperatureK
      KH2Hydrogen valve constantkmol.s^(-1).atm^(-1)
      KH2OWater valve constantkmol.s^(-1).atm^(-1)
      KO2Oxygen valve constantkmol.s^(-1).atm^(-1)
      tH2Hydrogen time constants
      tH2OWater time constants
      tO2Oxygen time constants
      t1Reformer time constants
      t2Reformer time constants
      AActive areacm^2
      lMembrane thicknesscm
      lambdaAn adjustable parameter with a min value of 14 and max value of 23--
      R(*Optional)R-Electronicohm
      JMaxMaximum current densityA/(cm^2)
      CVConversion factor--
      rhoHydrogen-Oxygen flow ratio--
      qMethanolMolar flow of methanolkmol/s
      N0Number of cells--
      i-startCell operating current start pointA
      i-stepCell operating current stepA
      i-stopCell operating current end pointA
      * For more information about this model visit here
    8. Chakraborty Dynamic Model

      InputDescriptionUnit
      E0No load voltageV
      TCell operation temperatureK
      KH2Hydrogen valve constantkmol.s^(-1).atm^(-1)
      KH2OWater valve constantkmol.s^(-1).atm^(-1)
      KO2Oxygen valve constantkmol.s^(-1).atm^(-1)
      rhoHydrogen-Oxygen flow ratio--
      RintFuel cell internal resistanceohm
      N0Number of cells--
      uFuel utilization ratio--
      i-startCell operating current start pointA
      i-stepCell operating current stepA
      i-stopCell operating current end pointA
      * For more information about this model visit here
    • Find your reports in Model_Name folder

    Screen Record

    Screen Record

Library

  1. Amphlett Static Model

    >>> from opem.Static.Amphlett import Static_Analysis
    >>> Test_Vector={"T": 343.15,"PH2": 1,"PO2": 1,"i-start": 0,"i-stop": 75,"i-step": 0.1,"A": 50.6,"l": 0.0178,"lambda": 23,"N": 1,"R": 0,"JMax": 1.5,"Name": "Amphlett_Test"}
    >>> data=Static_Analysis(InputMethod=Test_Vector,TestMode=True,PrintMode=False,ReportMode=False)
    
    KeyDescriptionType
    StatusSimulation statusBool
    PPowerList
    ICell operating currentList
    VFC voltageList
    EFFEfficiencyList
    PhThermal powerList
    V0Linear-Apx interceptFloat
    KLinear-Apx slopeFloat
    Eta_ActiveEta activationList
    Eta_ConcEta concentrationList
    Eta_OhmicEta ohmicList
    VEEstimated FC voltageList
    • For more information about this model visit here
  2. Larminie-Dicks Static Model

    >>> from opem.Static.Larminie_Dicks import Static_Analysis
    >>> Test_Vector = {"A": 0.06,"E0": 1.178,"T": 328.15,"RM": 0.0018,"i_0": 0.00654,"i_L": 100.0,"i_n": 0.23,"N": 23,"i-start": 0.1,"i-stop": 98,"i-step": 0.1,"Name": "Larminiee_Test"}
    >>> data=Static_Analysis(InputMethod=Test_Vector,TestMode=True,PrintMode=False,ReportMode=False)
    
    KeyDescriptionType
    StatusSimulation statusBool
    PPowerList
    ICell operating currentList
    VFC voltageList
    EFFEfficiencyList
    PhThermal powerList
    V0Linear-Apx interceptFloat
    KLinear-Apx slopeFloat
    VEEstimated FC voltageList
    • For more information about this model visit here
  3. Chamberline-Kim Static Model

    >>> from opem.Static.Chamberline_Kim import Static_Analysis
    >>> Test_Vector = {"A": 50.0,"E0": 0.982,"b": 0.0689,"R": 0.328,"m": 0.000125,"n": 9.45,"N": 1,"i-start": 1,"i-stop": 42.5,"i-step": 0.1,"Name": "Chamberline_Test"}
    >>> data=Static_Analysis(InputMethod=Test_Vector,TestMode=True,PrintMode=False,ReportMode=False)
    
    KeyDescriptionType
    StatusSimulation statusBool
    PPowerList
    ICell operating currentList
    VFC voltageList
    EFFEfficiencyList
    PhThermal powerList
    V0Linear-Apx interceptFloat
    KLinear-Apx slopeFloat
    VEEstimated FC voltageList
    • For more information about this model visit here
  4. Padulles Dynamic Model I

    >>> from opem.Dynamic.Padulles1 import Dynamic_Analysis
    >>> Test_Vector = {"T": 343,"E0": 0.6,"N0": 88,"KO2": 0.0000211,"KH2": 0.0000422,"tH2": 3.37,"tO2": 6.74,"B": 0.04777,"C": 0.0136,"Rint": 0.00303,"rho": 1.168,"qH2": 0.0004,"i-start": 0,"i-stop": 100,"i-step": 0.1,"Name": "PadullesI_Test"}
    >>> data=Dynamic_Analysis(InputMethod=Test_Vector,TestMode=True,PrintMode=False,ReportMode=False)
    
    KeyDescriptionType
    StatusSimulation statusBool
    PPowerList
    ICell operating currentList
    VFC voltageList
    EFFEfficiencyList
    PO2Partial pressureList
    PH2Partial pressureList
    PhThermal powerList
    V0Linear-Apx interceptFloat
    KLinear-Apx slopeFloat
    VEEstimated FC voltageList
    • For more information about this model visit here
  5. Padulles Dynamic Model II

    >>> from opem.Dynamic.Padulles2 import Dynamic_Analysis
    >>> Test_Vector = {"T": 343,"E0": 0.6,"N0": 5,"KO2": 0.0000211,"KH2": 0.0000422,"KH2O": 0.000007716,"tH2": 3.37,"tO2": 6.74,"tH2O": 18.418,"B": 0.04777,"C": 0.0136,"Rint": 0.00303,"rho": 1.168,"qH2": 0.0004,"i-start": 0.1,"i-stop": 100,"i-step": 0.1,"Name": "Padulles2_Test"}
    >>> data=Dynamic_Analysis(InputMethod=Test_Vector,TestMode=True,PrintMode=False,ReportMode=False)
    
    KeyDescriptionType
    StatusSimulation statusBool
    PPowerList
    ICell operating currentList
    VFC voltageList
    EFFEfficiencyList
    PO2Partial pressureList
    PH2Partial pressureList
    PH2OPartial pressureList
    PhThermal powerList
    V0Linear-Apx interceptFloat
    KLinear-Apx slopeFloat
    VEEstimated FC voltageList
    • For more information about this model visit here
  6. Padulles-Hauer Dynamic Model

    >>> from opem.Dynamic.Padulles_Hauer import Dynamic_Analysis
    >>> Test_Vector = {"T": 343,"E0": 0.6,"N0": 5,"KO2": 0.0000211,"KH2": 0.0000422,"KH2O": 0.000007716,"tH2": 3.37,"tO2": 6.74,"t1": 2,"t2": 2,"tH2O": 18.418,"B": 0.04777,"C": 0.0136,"Rint": 0.00303,"rho": 1.168,"qMethanol": 0.0002,"CV": 2,"i-start": 0.1,"i-stop": 100,"i-step": 0.1,"Name": "Padulles_Hauer_Test"}
    >>> data=Dynamic_Analysis(InputMethod=Test_Vector,TestMode=True,PrintMode=False,ReportMode=False)
    
    KeyDescriptionType
    StatusSimulation statusBool
    PPowerList
    ICell operating currentList
    VFC voltageList
    EFFEfficiencyList
    PO2Partial pressureList
    PH2Partial pressureList
    PH2OPartial pressureList
    PhThermal powerList
    V0Linear-Apx interceptFloat
    KLinear-Apx slopeFloat
    VEEstimated FC voltageList
    • For more information about this model visit here
  7. Padulles-Amphlett Dynamic Model

    >>> from opem.Dynamic.Padulles_Amphlett import Dynamic_Analysis
    >>> Test_Vector = {"A": 50.6,"l": 0.0178,"lambda": 23,"JMax": 1.5,"T": 343,"N0": 5,"KO2": 0.0000211,"KH2": 0.0000422,"KH2O": 0.000007716,"tH2": 3.37,"tO2": 6.74,"t1": 2,"t2": 2,"tH2O": 18.418,"rho": 1.168,"qMethanol": 0.0002,"CV": 2,"i-start": 0.1,"i-stop": 75,"i-step": 0.1,"Name": "Padulles_Amphlett_Test"}
    >>> data=Dynamic_Analysis(InputMethod=Test_Vector,TestMode=True,PrintMode=False,ReportMode=False)
    
    KeyDescriptionType
    StatusSimulation statusBool
    PPowerList
    ICell operating currentList
    VFC voltageList
    EFFEfficiencyList
    PO2Partial pressureList
    PH2Partial pressureList
    PH2OPartial pressureList
    PhThermal powerList
    V0Linear-Apx interceptFloat
    KLinear-Apx slopeFloat
    Eta_ActiveEta activationList
    Eta_ConcEta concentrationList
    Eta_OhmicEta ohmicList
    VEEstimated FC voltageList
    • For more information about this model visit here
  8. Chakraborty Dynamic Model

    >>> from opem.Dynamic.Chakraborty import Dynamic_Analysis
    >>> Test_Vector = {"T": 1273,"E0": 0.6,"u":0.8,"N0": 1,"R": 3.28125 * 10**(-3),"KH2O": 0.000281,"KH2": 0.000843,"KO2": 0.00252,"rho": 1.145,"i-start": 0.1,"i-stop": 300,"i-step": 0.1,"Name": "Chakraborty_Test"}
    >>> data=Dynamic_Analysis(InputMethod=Test_Vector,TestMode=True,PrintMode=False,ReportMode=False)
    
    KeyDescriptionType
    StatusSimulation statusBool
    PPowerList
    ICell operating currentList
    VFC voltageList
    EFFEfficiencyList
    PO2Partial pressureList
    PH2Partial pressureList
    PH2OPartial pressureList
    PhThermal powerList
    Nernst GainNernst GainList
    Ohmic LossOhmic LossList
    V0Linear-Apx interceptFloat
    KLinear-Apx slopeFloat
    VEEstimated FC voltageList
    • For more information about this model visit here

    Parameters

    1. TestMode : Active test mode and get/return data as dict, (Default : False)
    2. ReportMode : Generate reports(.csv,.opem,.html) and print result in console, (Default : True)
    3. PrintMode : Control printing in console, (Default : True)
    4. Folder : Reports folder, (Default : os.getcwd())

    Note

    • Return type : dict

Telegram Bot

  • Send /start command to OPEM BOT
  • Choose models from menu
  • Send your test vector according to the template
  • Download your results

Try OPEM in Your Browser!

OPEM can be used online in interactive Jupyter Notebooks via the Binder service! Try it out now! :

Binder

  • Check .ipynb files in Documents folder
  • Edit and execute each part of the notes, step by step from the top panel by run button
  • For executing a complete simulation, you can edit Test_Vector in Full Run section

Issues & Bug Reports

Just fill an issue and describe it. We'll check it ASAP! or send an email to opem@ecsim.site.

You can also join our discord server

Discord Channel

Outputs

  1. HTML
  2. CSV
  3. OPEM

Thanks

Reference

1- J. C. Amphlett, R. M. Baumert, R. F. Mann, B. A. Peppley, and P. R. Roberge. 1995. "Performance Modeling of the Ballard Mark IV Solid Polymer Electrolyte Fuel Cell." J. Electrochem. Soc. (The Electrochemical Society, Inc.) 142 (1): 9-15. doi: 10.1149/1.2043959.
2- Jeferson M. Correa, Felix A. Farret, Vladimir A. Popov, Marcelo G. Simoes. 2005. "Sensitivity Analysis of the Modeling Parameters Used in Simulation of Proton Exchange Membrane Fuel Cells." IEEE Transactions on Energy Conversion (IEEE) 20 (1): 211-218. doi:10.1109/TEC.2004.842382.
3- Junbom Kim, Seong-Min Lee, Supramaniam Srinivasan, Charles E. Chamberlin. 1995. "Modeling of Proton Exchange Membrane Fuel Cell Performance with an Empirical Equation." Journal of The Electrochemical Society (The Electrochemical Society) 142 (8): 2670-2674. doi:10.1149/1.2050072.
4- I. Sadli, P. Thounthong, J.-P. Martin, S. Rael, B. Davat. 2006. "Behaviour of a PEMFC supplying a low voltage static converter." Journal of Power Sources (Elsevier) 156: 119–125. doi:10.1016/j.jpowsour.2005.08.021.
5- J. Padulles, G.W. Ault, J.R. McDonald. 2000. "An integrated SOFC plant dynamic model for power systems simulation." Journal of Power Sources (Elsevier) 86 (1-2): 495-500. doi:10.1016/S0378-7753(99)00430-9.
6- Hauer, K.-H. 2001. "Analysis tool for fuel cell vehicle hardware and software (controls) with an application to fuel economy comparisons of alternative system designs." Ph.D. dissertation, Transportation Technology and Policy, University of California Davis.
7- A. Saadi, M. Becherif, A. Aboubou, M.Y. Ayad. 2013. "Comparison of proton exchange membrane fuel cell static models." Renewable Energy (Elsevier) 56: 64-71. doi:dx.doi.org/10.1016/j.renene.2012.10.012.
8- Diego Feroldi, Marta Basualdo. 2012. "Description of PEM Fuel Cells System." Green Energy and Technology (Springer) 49-72. doi:10.1007/978-1-84996-184-4_2
9- Gottesfeld, Shimshon. n.d. The Polymer Electrolyte Fuel Cell: Materials Issues in a Hydrogen Fueled Power Source. http://physics.oregonstate.edu/~hetheriw/energy/topics/doc/electrochemistry/fc/basic/The_Polymer_Electrolyte_Fuel_Cell.htm
10- Mohamed Becherif, Aïcha Saadi, Daniel Hissel, Abdennacer Aboubou, Mohamed Yacine Ayad. 2011. "Static and dynamic proton exchange membrane fuel cell models." Journal of Hydrocarbons Mines and Environmental Research 2 (1)
11- Larminie, J., Dicks, A., & McDonald, M. S. 2003. Fuel cell systems explained (Vol. 2, pp. 207-225). Chichester, UK: J. Wiley. doi: 10.1002/9781118706992.
12- Rho, Y. W., Srinivasan, S., & Kho, Y. T. 1994. ''Mass transport phenomena in proton exchange membrane fuel cells using o 2/he, o 2/ar, and o 2/n 2 mixtures ii. Theoretical analysis.'' Journal of the Electrochemical Society, 141(8), 2089-2096. doi: 10.1149/1.2055066.
13- U. Chakraborty, A New Model for Constant Fuel Utilization and Constant Fuel Flow in Fuel Cells, Appl. Sci. 9 (2019) 1066. https://doi.org/10.3390/app9061066.

Cite

If you use OPEM in your research , please cite this paper :


@article{Haghighi2018,
  doi = {10.21105/joss.00676},
  url = {https://doi.org/10.21105/joss.00676},
  year  = {2018},
  month = {jul},
  publisher = {The Open Journal},
  volume = {3},
  number = {27},
  pages = {676},
  author = {Sepand Haghighi and Kasra Askari and Sarmin Hamidi and Mohammad Mahdi Rahimi},
  title = {{OPEM} : Open Source {PEM} Cell Simulation Tool},
  journal = {Journal of Open Source Software}
}


Download OPEM.bib(BibTeX Format)

JOSSDOI badge
ZenodoDOI

Show Your Support

Star This Repo

Give a ⭐️ if this project helped you!

Donate to Our Project

If you do like our project and we hope that you do, can you please support us? Our project is not and is never going to be working for profit. We need the money just so we can continue doing what we do ;-) .

OPEM Donation