Concentrating solar power

Module to calculate the usable heat of a parabolic trough collector


This module was developed to provide the heat of a parabolic trough collector based on temperatures and collectors location, tilt and azimuth for energy system optimizations with oemof.solph.

In you can find an example on how to use the modul to calculate a CSP power plant. A time series of pre-calculated heat flows can be used as input for a source (an oemof.solph component), and a transformer (an oemof.solph component) can be used to hold electrical power consumption and further thermal losses of the collector in an energy system optimization. In addition, you will find an example which compares this precalculation with a calculation using a constant efficiency.


The pre-calculations for the concentrating solar power calculate the heat of the solar collector based on the direct horizontal irradiance (DHI) or the direct normal irradiance (DNI) and information about the collector and its location. The losses can be calculated in 2 different ways.


Fig.1: The energy flows and losses at a parabolic trough collector.

The direct normal radiation (E_{dir}) is reduced by geometrical losses (\dot Q_{loss,geom}) so that only the collector radiation (E_{coll}^*) hits the collector. Before the thermal power is absorbed by the absorber tube, also optical losses (\dot Q_{loss,opt}), which can be reflection losses at the mirror, transmission losses at the cladding tube and absorption losses at the absorber tube, occur. The absorber finally loses a part of the absorbed heat output through thermal losses (\dot Q_{loss,therm}).

The processing of the irradiance data is done by the pvlib, which calculates the direct irradiance on the collector. This irradiance is reduced by dust and dirt on the collector with:

E_{coll} = E^*_{coll} \cdot X^{3/2}

The efficiency of the collector is calculated depending on the loss method with

method ‘Janotte’:

\eta_C = \eta_0 \cdot \kappa(\varTheta) - c_1 \cdot
\frac{\Delta T}{E_{coll}} - c_2 \cdot \frac{{\Delta T}^2}{E_{coll}}

method ‘Andasol’:

\eta_C = \eta_0 \cdot \kappa(\varTheta) - \frac{c_1}{E_{coll}}

with the incident angle modifier, which is calculated depending on the loss method:

method ‘Janotte’:

\kappa(\varTheta) = 1 - a_1 \cdot \vert\varTheta\vert- a_2
\cdot \vert\varTheta\vert^2

method ‘Andasol’:

\kappa(\varTheta) = 1 - a_1 \cdot \vert\varTheta\vert - a_2
\cdot \vert\varTheta\vert^2- a_3 \cdot \vert\varTheta\vert^3
- a_4 \cdot \vert\varTheta\vert^4 - a_5 \cdot \vert\varTheta\vert^5
- a_6 \cdot \vert\varTheta\vert^6

In the end, the irradiance on the collector is multiplied with the efficiency to get the collector’s heat.

\dot Q_{coll} = E_{coll} \cdot \eta_C

The three values \dot Q_{coll}, \eta_C and E_{coll} are returned. Losses which occur after the heat absorption in the collector (e.g. losses in pipes) have to be taken into account in a later step (see the example).

These arguments are used in the formulas of the function:

symbol argument explanation
E_{coll} collector_irradiance Irradiance on collector considering all losses including losses because of dirtiness
E^*_{coll} irradiance_on_collector Irradiance which hits collectors surface before losses because of dirtiness are considered
X cleanliness Cleanliness of the collector (between 0 and 1)
\kappa iam Incidence angle modifier
a_1 a_1 Parameter 1 for the incident angle modifier
a_2 a_2 Parameter 2 for the incident angle modifier
a_3 a_3 Parameter 3 for the incident angle modifier
a_4 a_4 Parameter 4 for the incident angle modifier
a_5 a_5 Parameter 5 for the incident angle modifier
a_6 a_6 Parameter 6 for the incident angle modifier
\varTheta aoi Angle of incidence
\eta_C eta_c Collector efficiency
c_1 c_1 Thermal loss parameter 1
c_2 c_2 Thermal loss parameter 2
\Delta T delta_t Temperature difference (collector to ambience)
\eta_0 eta_0 Optical efficiency of the collector
\dot Q_{coll} collector_heat Collector’s heat


It is possible to use the precalculation function as stand-alone function to calculate the collector values \dot Q_{coll}, \eta_C and E_{coll}. Or it is possible to use the ParabolicTroughCollector facade to model a collector with further losses (e.g. in pipes or pumps) and the electrical consumption of pipes within a single step. Please note: As the unit of the input irradiance is given as power per area, the outputs \dot Q_{coll} and E_{coll} are given in the same unit. If these values are used in an oemof source, the unit of the nominal value must be an area too.

Precalculation function

Please see the API documentation of the concentrating_solar_power module for all parameters which have to be provided, also the ones that are not part of the described formulas above. The data for ambient temperature and irradiance must have the same time index. Depending on the method, the irradiance must be the horizontal direct irradiance or the direct normal irradiance. Be aware of the correct time index regarding the time zone, as the utilized pvlib need the correct time stamp corresponding to the location (latitude and longitude).

data_precalc = csp_precalc(
    latitude, longitude,
    collector_tilt, collector_azimuth, cleanliness,
    eta_0, c_1, c_2,
    temp_collector_inlet, temp_collector_outlet, dataframe['t_amb'],
    a_1, a_2,

The following figure shows the heat provided by the collector calculated with this functions and the loss method “Janotte” in comparison to the heat calculated with a fix efficiency.


The results of this precalculation can be used in an oemof energy system model as output of a source component. To model the behaviour of a collector, it can be complemented with a transformer, which holds the electrical consumption of pumps and peripheral heat losses (see the the example

ParabolicTroughCollector facade

Instead of using the precalculation, it is possible to use the ParabolicTroughCollector facade, which will create an oemof component as a representative for the collector. It calculates the heat of the collector in the same way as the precalculation do. Additionally, it integrates the calculated heat as an input into a component, uses an electrical input for pumps and gives a heat output, which is reduced by the defined additional losses. As given in the example, further parameters are required in addition to the ones of the precalculation. Please see the API documentation of the ParabolicTroughCollector class of the facade module for all parameters which have to be provided.

See for an application example. It models the same system as the, but uses the ParabolicTroughCollector facade instead of separate source and transformer.

from oemof import solph
    >>> from oemof.thermal.facades import ParabolicTroughCollector
    >>> bth = solph.Bus(label='thermal_bus')
    >>> bel = solph.Bus(label='electrical_bus')
    >>> collector = ParabolicTroughCollector(
    ...     label='solar_collector',
    ...     heat_bus=bth,
    ...     electrical_bus=bel,
    ...     electrical_consumption=0.05,
    ...     additional_losses=0.2,
    ...     aperture_area=1000,
    ...     loss_method='Janotte',
    ...     irradiance_method='horizontal',
    ...     latitude=23.614328,
    ...     longitude=58.545284,
    ...     collector_tilt=10,
    ...     collector_azimuth=180,
    ...     x=0.9,
    ...     a_1=-0.00159,
    ...     a_2=0.0000977,
    ...     eta_0=0.816,
    ...     c_1=0.0622,
    ...     c_2=0.00023,
    ...     temp_collector_inlet=435,
    ...     temp_collector_outlet=500,
    ...     temp_amb=input_data['t_amb'],
    ...     irradiance=input_data['E_dir_hor']


[1] Janotte, N; et al: Dynamic performance evaluation of the HelioTrough collector demon-stration loop - towards a new benchmark in parabolic trough qualification, SolarPACES 2013

[2] William F. Holmgren, Clifford W. Hansen, and Mark A. Mikofski. “pvlib python: a python package for modeling solar energy systems.” Journal of Open Source Software, 3(29), 884, (2018).