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.
-
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)
| Key |
Description |
Type |
| Status |
Simulation status |
Bool |
| P |
Power |
List |
| I |
Cell operating current |
List |
| V |
FC voltage |
List |
| EFF |
Efficiency |
List |
| Ph |
Thermal power |
List |
| V0 |
Linear-Apx intercept |
Float |
| K |
Linear-Apx slope |
Float |
| Eta_Active |
Eta activation |
List |
| Eta_Conc |
Eta concentration |
List |
| Eta_Ohmic |
Eta ohmic |
List |
| VE |
Estimated FC voltage |
List |
- For more information about this model visit here
-
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)
| Key |
Description |
Type |
| Status |
Simulation status |
Bool |
| P |
Power |
List |
| I |
Cell operating current |
List |
| V |
FC voltage |
List |
| EFF |
Efficiency |
List |
| Ph |
Thermal power |
List |
| V0 |
Linear-Apx intercept |
Float |
| K |
Linear-Apx slope |
Float |
| VE |
Estimated FC voltage |
List |
- For more information about this model visit here
-
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)
| Key |
Description |
Type |
| Status |
Simulation status |
Bool |
| P |
Power |
List |
| I |
Cell operating current |
List |
| V |
FC voltage |
List |
| EFF |
Efficiency |
List |
| Ph |
Thermal power |
List |
| V0 |
Linear-Apx intercept |
Float |
| K |
Linear-Apx slope |
Float |
| VE |
Estimated FC voltage |
List |
- For more information about this model visit here
-
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)
| Key |
Description |
Type |
| Status |
Simulation status |
Bool |
| P |
Power |
List |
| I |
Cell operating current |
List |
| V |
FC voltage |
List |
| EFF |
Efficiency |
List |
| PO2 |
Partial pressure |
List |
| PH2 |
Partial pressure |
List |
| Ph |
Thermal power |
List |
| V0 |
Linear-Apx intercept |
Float |
| K |
Linear-Apx slope |
Float |
| VE |
Estimated FC voltage |
List |
- For more information about this model visit here
-
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)
| Key |
Description |
Type |
| Status |
Simulation status |
Bool |
| P |
Power |
List |
| I |
Cell operating current |
List |
| V |
FC voltage |
List |
| EFF |
Efficiency |
List |
| PO2 |
Partial pressure |
List |
| PH2 |
Partial pressure |
List |
| PH2O |
Partial pressure |
List |
| Ph |
Thermal power |
List |
| V0 |
Linear-Apx intercept |
Float |
| K |
Linear-Apx slope |
Float |
| VE |
Estimated FC voltage |
List |
- For more information about this model visit here
-
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)
| Key |
Description |
Type |
| Status |
Simulation status |
Bool |
| P |
Power |
List |
| I |
Cell operating current |
List |
| V |
FC voltage |
List |
| EFF |
Efficiency |
List |
| PO2 |
Partial pressure |
List |
| PH2 |
Partial pressure |
List |
| PH2O |
Partial pressure |
List |
| Ph |
Thermal power |
List |
| V0 |
Linear-Apx intercept |
Float |
| K |
Linear-Apx slope |
Float |
| VE |
Estimated FC voltage |
List |
- For more information about this model visit here
-
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)
| Key |
Description |
Type |
| Status |
Simulation status |
Bool |
| P |
Power |
List |
| I |
Cell operating current |
List |
| V |
FC voltage |
List |
| EFF |
Efficiency |
List |
| PO2 |
Partial pressure |
List |
| PH2 |
Partial pressure |
List |
| PH2O |
Partial pressure |
List |
| Ph |
Thermal power |
List |
| V0 |
Linear-Apx intercept |
Float |
| K |
Linear-Apx slope |
Float |
| Eta_Active |
Eta activation |
List |
| Eta_Conc |
Eta concentration |
List |
| Eta_Ohmic |
Eta ohmic |
List |
| VE |
Estimated FC voltage |
List |
- For more information about this model visit here
-
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)
| Key |
Description |
Type |
| Status |
Simulation status |
Bool |
| P |
Power |
List |
| I |
Cell operating current |
List |
| V |
FC voltage |
List |
| EFF |
Efficiency |
List |
| PO2 |
Partial pressure |
List |
| PH2 |
Partial pressure |
List |
| PH2O |
Partial pressure |
List |
| Ph |
Thermal power |
List |
| Nernst Gain |
Nernst Gain |
List |
| Ohmic Loss |
Ohmic Loss |
List |
| V0 |
Linear-Apx intercept |
Float |
| K |
Linear-Apx slope |
Float |
| VE |
Estimated FC voltage |
List |
- For more information about this model visit here
Parameters
TestMode : Active test mode and get/return data as dict, (Default : False)
ReportMode : Generate reports(.csv,.opem,.html) and print result in console, (Default : True)
PrintMode : Control printing in console, (Default : True)
Folder : Reports folder, (Default : os.getcwd())
Note
OPEM can be used online in interactive Jupyter Notebooks via the Binder service! Try it out now! :
Just fill an issue and describe it. We’ll check it ASAP!
or send an email to [email protected].
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 ;-) .
评论