15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137 | def flows_int_values(sv, operating_inputs, parameters):
"""This functions calculates intermediate values for the flows calculation.
Parameters
----------
sv : dict
Variables calculated by the solver. They correspond to the fuel cell internal states.
sv is a contraction of solver_variables for enhanced readability.
operating_inputs : dict
Operating inputs of the fuel cell.
parameters : dict
Parameters of the fuel cell model.
Returns
-------
Pagc : float
Global pressure in the anode gas channel (Pa).
Pcgc : float
Global pressure in the cathode gas channel (Pa).
lambda_acl_mem : float
Water content in the ACL and the membrane (kg/kg).
"""
# Extraction of the variables
C_v_agc, C_v_ampl, C_v_acl = sv['C_v_agc'], sv['C_v_ampl'], sv['C_v_acl']
C_v_ccl, C_v_cmpl, C_v_cgc = sv['C_v_ccl'], sv['C_v_cmpl'], sv['C_v_cgc']
s_ampl, s_acl, s_ccl, s_cmpl = sv['s_ampl'], sv['s_acl'], sv['s_ccl'], sv['s_cmpl']
lambda_acl, lambda_mem, lambda_ccl = sv['lambda_acl'], sv['lambda_mem'], sv['lambda_ccl']
C_H2_agc, C_H2_ampl, C_H2_acl = sv['C_H2_agc'], sv['C_H2_ampl'], sv['C_H2_acl']
C_O2_ccl, C_O2_cmpl, C_O2_cgc = sv['C_O2_ccl'], sv['C_O2_cmpl'], sv['C_O2_cgc']
C_N2 = sv['C_N2']
T_agc, T_ampl, T_acl, T_mem = sv['T_agc'], sv['T_ampl'], sv['T_acl'], sv['T_mem']
T_ccl, T_cmpl, T_cgc = sv['T_ccl'], sv['T_cmpl'], sv['T_cgc']
# Extraction of the operating inputs and the parameters
epsilon_gdl, epsilon_cl = parameters['epsilon_gdl'], parameters['epsilon_cl']
epsilon_mpl, epsilon_c = parameters['epsilon_mpl'], parameters['epsilon_c']
e, Hacl, Hccl, Hmem = parameters['e'], parameters['Hacl'], parameters['Hccl'], parameters['Hmem']
Hgdl, Hmpl, Wagc, Wcgc = parameters['Hgdl'], parameters['Hmpl'], parameters['Wagc'], parameters['Wcgc']
Hagc, Hcgc, n_gdl = parameters['Hagc'], parameters['Hcgc'], parameters['n_gdl']
# Transitory parameter
H_gdl_node = Hgdl / n_gdl
# Pressures in the stack
Pagc = (C_v_agc + C_H2_agc) * R * T_agc
Pagdl = [None] + [(sv[f'C_v_agdl_{i}'] + sv[f'C_H2_agdl_{i}']) * R * sv[f'T_agdl_{i}'] for i in range(1, n_gdl + 1)]
Pampl = (C_v_ampl + C_H2_ampl) * R * T_ampl
Pacl = (C_v_acl + C_H2_acl) * R * T_acl
Pccl = (C_v_ccl + C_O2_ccl + C_N2) * R * T_ccl
Pcmpl = (C_v_cmpl + C_O2_cmpl + C_N2) * R * T_cmpl
Pcgdl = [None] + [(sv[f'C_v_cgdl_{i}'] + sv[f'C_O2_cgdl_{i}'] + C_N2) * R * sv[f'T_cgdl_{i}'] for i in range(1, n_gdl + 1)]
Pcgc = (C_v_cgc + C_O2_cgc + C_N2) * R * T_cgc
# Weighted mean values ...
# ... of the water content
lambda_acl_mem = average([lambda_acl, lambda_mem], weights = [Hacl / (Hacl + Hmem), Hmem / (Hacl + Hmem)])
lambda_mem_ccl = average([lambda_mem, lambda_ccl], weights = [Hmem / (Hmem + Hccl), Hccl / (Hmem + Hccl)])
# ... of the diffusion coefficient of water in the membrane
D_acl_mem = average([D(lambda_acl), D(lambda_mem)], weights = [Hacl / (Hacl + Hmem), Hmem / (Hacl + Hmem)])
D_mem_ccl = average([D(lambda_mem), D(lambda_ccl)], weights = [Hmem / (Hmem + Hccl), Hccl / (Hmem + Hccl)])
# ... of the capillary coefficient
D_cap_agdl_agdl = [None] + [average([Dcap('gdl', sv[f's_agdl_{i}'], sv[f'T_agdl_{i}'], epsilon_gdl, e,
epsilon_c=epsilon_c),
Dcap('gdl', sv[f's_agdl_{i+1}'], sv[f'T_agdl_{i+1}'], epsilon_gdl, e,
epsilon_c=epsilon_c)]) for i in range(1, n_gdl)]
D_cap_agdl_ampl = average([Dcap('gdl', sv[f's_agdl_{n_gdl}'], sv[f'T_agdl_{n_gdl}'], epsilon_gdl, e,
epsilon_c=epsilon_c),
Dcap('mpl', s_ampl, T_ampl, epsilon_mpl, e)],
weights=[H_gdl_node / (H_gdl_node + Hmpl), Hmpl / (H_gdl_node + Hmpl)])
D_cap_ampl_acl = average([Dcap('mpl', s_ampl, T_ampl, epsilon_mpl, e),
Dcap('cl', s_acl, T_acl, epsilon_cl, e)],
weights=[Hmpl / (Hmpl + Hacl), Hacl / (Hmpl + Hacl)])
D_cap_cgdl_cgdl = [None] + [average([Dcap('gdl', sv[f's_cgdl_{i}'], sv[f'T_cgdl_{i}'], epsilon_gdl, e,
epsilon_c=epsilon_c),
Dcap('gdl', sv[f's_cgdl_{i+1}'], sv[f'T_cgdl_{i+1}'], epsilon_gdl, e,
epsilon_c=epsilon_c)]) for i in range(1, n_gdl)]
D_cap_cmpl_cgdl = average([Dcap('mpl', s_cmpl, T_cmpl, epsilon_mpl, e),
Dcap('gdl', sv['s_cgdl_1'], sv['T_cgdl_1'], epsilon_gdl, e,
epsilon_c=epsilon_c)],
weights = [Hmpl / (H_gdl_node + Hmpl), H_gdl_node / (H_gdl_node + Hmpl)])
D_cap_ccl_cmpl = average([Dcap('cl', s_ccl, T_ccl, epsilon_cl, e),
Dcap('mpl', s_cmpl, T_cmpl, epsilon_mpl, e)],
weights=[Hccl / (Hmpl + Hccl), Hmpl / (Hmpl + Hccl)])
# ... of the effective diffusion coefficient between the gas channel and the gas diffusion layer
ha_Da_eff_agc_agdl = average([h_a(Pagc, T_agc, Wagc, Hagc) * Hagc,
Da_eff('gdl', sv['s_agdl_1'], sv['T_agdl_1'], Pagdl[1], epsilon_gdl,
epsilon_c = epsilon_c)],
weights = [Hagc / (Hagc + H_gdl_node), H_gdl_node / (Hagc + H_gdl_node)])
hc_Dc_eff_cgdl_cgc = average([h_c(Pcgc, T_cgc, Wcgc, Hcgc) * Hcgc,
Dc_eff('gdl', sv[f's_cgdl_{n_gdl}'], sv[f'T_cgdl_{n_gdl}'], Pcgdl[n_gdl],
epsilon_gdl, epsilon_c = epsilon_c)],
weights = [Hcgc / (Hcgc + H_gdl_node), H_gdl_node / (Hcgc + H_gdl_node)])
# ... of the effective diffusion coefficient
Da_eff_agdl_agdl = [None] + [average([Da_eff('gdl', sv[f's_agdl_{i}'], sv[f'T_agdl_{i}'], Pagdl[i],
epsilon_gdl, epsilon_c = epsilon_c),
Da_eff('gdl', sv[f's_agdl_{i+1}'], sv[f'T_agdl_{i+1}'], Pagdl[i+1],
epsilon_gdl, epsilon_c = epsilon_c)]) for i in range(1, n_gdl)]
Da_eff_agdl_ampl = average([Da_eff('gdl', sv[f's_agdl_{n_gdl}'], sv[f'T_agdl_{n_gdl}'], Pagdl[n_gdl],
epsilon_gdl, epsilon_c = epsilon_c),
Da_eff('mpl', s_ampl, T_ampl, Pampl, epsilon_mpl)],
weights = [H_gdl_node / (H_gdl_node + Hmpl), Hmpl / (H_gdl_node + Hmpl)])
Da_eff_ampl_acl = average([Da_eff('mpl', s_ampl, T_ampl, Pampl, epsilon_mpl),
Da_eff('cl', s_acl, T_acl, Pacl, epsilon_cl)],
weights=[Hmpl / (Hmpl + Hacl), Hacl / (Hmpl + Hacl)])
Dc_eff_cgdl_cgdl = [None] + [average([Dc_eff('gdl', sv[f's_cgdl_{i}'], sv[f'T_cgdl_{i}'], Pcgdl[i],
epsilon_gdl, epsilon_c = epsilon_c),
Dc_eff('gdl', sv[f's_cgdl_{i+1}'], sv[f'T_cgdl_{i+1}'], Pcgdl[i+1],
epsilon_gdl, epsilon_c = epsilon_c)]) for i in range(1, n_gdl)]
Dc_eff_cmpl_cgdl = average([Dc_eff('mpl', s_cmpl, T_cmpl, Pcmpl, epsilon_mpl),
Dc_eff('gdl', sv['s_cgdl_1'], sv['T_cgdl_1'], Pcgdl[1],
epsilon_gdl, epsilon_c = epsilon_c)],
weights = [Hmpl / (H_gdl_node + Hmpl), H_gdl_node / (H_gdl_node + Hmpl)])
Dc_eff_ccl_cmpl = average([Dc_eff('cl', s_ccl, T_ccl, Pccl, epsilon_cl),
Dc_eff('mpl', s_cmpl, T_cmpl, Pcmpl, epsilon_mpl)],
weights=[Hccl / (Hmpl + Hccl), Hmpl / (Hmpl + Hccl)])
# ... of the temperature
T_acl_mem_ccl = average([T_acl, T_mem, T_ccl],
weights=[Hacl / (Hacl + Hmem + Hccl), Hmem / (Hacl + Hmem + Hccl), Hccl / (Hacl + Hmem + Hccl)])
return (H_gdl_node, Pagc, Pcgc, lambda_acl_mem, lambda_mem_ccl, D_acl_mem, D_mem_ccl, D_cap_agdl_agdl,
D_cap_agdl_ampl, D_cap_ampl_acl, D_cap_cgdl_cgdl, D_cap_cmpl_cgdl, D_cap_ccl_cmpl, ha_Da_eff_agc_agdl,
hc_Dc_eff_cgdl_cgc, Da_eff_agdl_agdl, Da_eff_agdl_ampl, Da_eff_ampl_acl, Dc_eff_cgdl_cgdl, Dc_eff_cmpl_cgdl,
Dc_eff_ccl_cmpl, T_acl_mem_ccl)
|