Flows modules

This module is used to calculate intermediate values for the flows calculation.

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).

Source code in modules/flows_modules.py
 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)