Solar - Parabolic Trough Collector

Model description

The model description is available in the PDF document.

Class description

class component.solar.parabolic_trough_collector.PTCollector[source]

Component: Parabolic Trough Collector

Model: Semi empirical

Description

This model determines the thermal power absorbed by a parabolic trough collector and its heat transfer fluid exhaust specific enthalpy .

Assumptions:
  • Heat losses to the ambiant are considered.

Connectors:

su (MassConnector): Mass connector for the suction side.

ex (MassConnector): Mass connector for the exhaust side.

Q_amb (HeatConnector): Heat connector to the ambiant.

Parameters:

coll_eff: Collector efficieny [-]

a [1..9]: semi empirical parameters

n_disc: number of discretisations in the lenght of the heat collection element. [-]

envel_tau: transmittance of the heat collection element envelop. [-]

alpha_r: Receiver absorptivity. [-]

refl_m: Mirror reflectivity. [-]

epsilon_r: Receiver emittance @ 400°C. [-]

eta_other: Other efficiency to be accounted for in the calculation of the overall optical efficiency, different than the transmittance and absorbtivity of the receiver and the mirror reflectivity. [-]

V_w_max_tr: maximum wind speed (stowed). [m/s]

V_w_max_st: minimum wind speed (stowed). [m/s]

Vdot_min: minimum recommended flowrate. [m^3/s]

Vdot_max: maximum recommended flowrate. [m^3/s]

T_f_min: Minimum operating fluid temperature. [K]

T_f_max: Maximum operating fluid temperature. [K]

Geometrical parameters:

L: length of the parabolic trough collector. [m]

W: Width of the parabolic trough collector. [m]

A: Area of the parabolic trough collector. [m^2]

A_r: Reflective area. [m^2]

m: Collector weight. [kg]

L_f: Focal Length. [m]

Tube_OD: Tube external diameter. [m]

Tube_V: Tube volume. [m^3]

Inputs:

fluid: Fluid at the suction of the PT collector. [-]

m_dot: Mass flow rate in the PT collector (at suction). [kg/s]

T_su: Temperature at the suction. [K]

P_su: Pressure at the suction. [Pa]

v_wind: Wind speed on the PT collector’s heat collection element. [m/s]

T_amb: Ambiant temperature. [K]

Theta: Incidence angle. [rad]

DNI: Direct Normal Irradiance. [W/m^2]

Ouputs:

h_ex: Exhaust side specific enthalpy. [J/kg]

Q_dot: Thermal Power absorbed by the PT collector. [W]

Example of use


import __init__
from CoolProp.CoolProp import PropsSI
import numpy as np
import matplotlib.pyplot as plt


from labothappy.toolbox.geometries.solar.parabolictrough_geometry import PT_Collector_Geom
from labothappy.component.solar.parabolic_trough_collector import PTCollector

PT_geom = PT_Collector_Geom()
PT_geom.set_parameters("Soponova_MicroCSP")

case = "plant_sizing"

if case == "study_disc":
    n_disc_vec = np.linspace(1,50,50)
    Q_dot_vec = np.zeros(len(n_disc_vec))

    for i in range(len(n_disc_vec)):

        PT = PTCollector()

        PT.set_parameters(coll_eff = PT_geom.coll_eff, L = 10*PT_geom.L, W = PT_geom.W, A = PT_geom.A, 
                            A_r = PT_geom.A_r, m = PT_geom.m, L_f = PT_geom.L_f,

                            Tube_OD = PT_geom.Tube_OD, Tube_V = PT_geom.Tube_V,

                            alpha_r = PT_geom.alpha_r, refl_m = PT_geom.refl_m, epsilon_r = PT_geom.epsilon_r, envel_tau = PT_geom.envel_tau, eta_other = PT_geom.eta_other,
                            
                            V_w_max_tr = PT_geom.V_w_max_tr, V_w_max_st = PT_geom.V_w_max_st, Vdot_min = PT_geom.Vdot_min,
                            Vdot_max = PT_geom.Vdot_max, T_f_min = PT_geom.T_f_min, T_f_max = PT_geom.T_f_max,

                            a = PT_geom.a, n_disc = int(n_disc_vec[i])
        )

        PT.set_inputs(fluid = 'Water',
                    m_dot = 0.6, # kg/s
                    P_su = 5*1e5, # Pa
                    T_su = 100 + 273.15, # K
                    T_amb = 25 + 273.15, # K
                    DNI = 900, # W/m^2
                    Theta = 10*np.pi/180, # rad
                    v_wind = 5  # m/s
                    )

        PT.solve()

        Q_dot_vec[i] = PT.Q_dot

    plt.plot(n_disc_vec, Q_dot_vec*1e-3)
    plt.grid()
    plt.xlabel("Discretizations")
    plt.ylabel("Absorbed Power [kW]")

if case == "plant_sizing":
    
    Q_dot_need = 14*1e6 # W
    DT_need = 10 # K
    p_circ = 5*1e5 # Pa
    fluid = "Water"

    DT_HX = 10 # K
    T_out_HX = 135 + 273.15 # K

    T_in_HX = T_out_HX + DT_HX # K

    h_in = PropsSI('H', 'T', T_in_HX, 'P', p_circ, fluid)
    h_out = PropsSI('H', 'T', T_out_HX, 'P', p_circ, fluid)

    m_dot_needed = Q_dot_need/(h_in - h_out)
    print(f"m_dot_needed : {m_dot_needed}")

    D_in = PropsSI('D', 'T', T_out_HX, 'P', p_circ, fluid)
    m_dot_max_coll = PT_geom.Vdot_max*D_in

    nb_coll_parallel = m_dot_needed/m_dot_max_coll

    print(f"nb_coll_parallel : {nb_coll_parallel}")

    T_ex = T_out_HX
    n_series = 0

    while T_ex < T_in_HX:
        
        PT = PTCollector()

        PT.set_parameters(coll_eff = PT_geom.coll_eff, L = 10*PT_geom.L, W = PT_geom.W, A = PT_geom.A, 
                            A_r = PT_geom.A_r, m = PT_geom.m, L_f = PT_geom.L_f,

                            Tube_OD = PT_geom.Tube_OD, Tube_V = PT_geom.Tube_V,

                            alpha_r = PT_geom.alpha_r, refl_m = PT_geom.refl_m, epsilon_r = PT_geom.epsilon_r, envel_tau = PT_geom.envel_tau, eta_other = PT_geom.eta_other,
                            
                            V_w_max_tr = PT_geom.V_w_max_tr, V_w_max_st = PT_geom.V_w_max_st, Vdot_min = PT_geom.Vdot_min,
                            Vdot_max = PT_geom.Vdot_max, T_f_min = PT_geom.T_f_min, T_f_max = PT_geom.T_f_max,

                            a = PT_geom.a, n_disc = 20
        )
        
        T_in_coll = T_ex
        n_series += 1
    
        PT.set_inputs(
                fluid = 'Water',
                m_dot = m_dot_max_coll, # kg/s
                P_su = p_circ, # Pa
                T_su = T_in_coll, # K
                T_amb = 20 + 273.15, # K
                DNI = 600, # W/m^2
                Theta = 10*np.pi/180, # rad
                v_wind = 5 # m/s
                )
    
        PT.solve()
        T_ex = PT.ex.T
        print(f"Q_dot {PT.Q_dot}")
        print(f"T_ex {T_ex}")

    print(f"n_series {n_series}")
    
    Filling_factor = 0.6
    A = np.ceil(nb_coll_parallel)*(np.ceil(n_series))*PT.params['W']*PT.params['L']/Filling_factor
    print(f"Required solar field : {A} [m^2]")
    print(f"Required solar field : {A*1e-6} [km^2]")


References

Semi-empirical correlation to model heat losses along solar parabolic trough collectors Rémi Dickes, Vincent Lemort and Sylvain Quoilin https://hdl.handle.net/2268/182680