PV power source node
PV (photovoltaic) power sources generate electricity from solar energy. The implementation of the node is identical to that of NonDisRES and is here used to enable a specialized constructor that samples the PVGIS service for solar generation profiles.
Introduced type and its field
The PV is a subtype of AbstractNonDisRES (the same is the case for NonDisRES) and is thus implemented as equivalent to a RefSource. Hence, it utilizes the same functions declared in EnergyModelsBase.
Standard fields
The standard fields (of a AbstractNonDisRES) are given as:
id:
The fieldidis only used for providing a name to the node. This is similar to the approach utilized inEnergyModelsBase.cap::TimeProfile:
The installed capacity corresponds to the nominal capacity of the node.
If the node should contain investments through the application ofEnergyModelsInvestments, it is important to note that you can only useFixedProfileorStrategicProfilefor the capacity, but notRepresentativeProfileorOperationalProfile. In addition, all values have to be non-negative.profile::TimeProfile:
The profile is used as a multiplier to the installed capacity to represent the maximum actual capacity in each operational period. The profile should be provided asOperationalProfileor at least asRepresentativeProfile. In addition, all values should be in the range $[0, 1]$.opex_var::TimeProfile:
The variable operating expenses are based on the capacity utilization through the variable:cap_use. Hence, it is directly related to the specifiedoutputratios. The variable operating expenses can be provided asOperationalProfileas well.opex_fixed::TimeProfile:
The fixed operating expenses are relative to the installed capacity (through the fieldcap) and the chosen duration of a strategic period as outlined on UtilizeTimeStruct.
It is important to note that you can only useFixedProfileorStrategicProfilefor the fixed OPEX, but notRepresentativeProfileorOperationalProfile. In addition, all values have to be non-negative.output::Dict{<:Resource, <:Real}:
The fieldoutputincludesResources with their corresponding conversion factors as dictionaries. In the case of a non-dispatchable renewable energy source,outputshould always include your electricity resource. In practice, you should use a value of 1.
All values have to be non-negative.data::Vector{Data}:
An entry for providing additional data to the model. In the current version, it is only relevant for additional investment data whenEnergyModelsInvestmentsis used.
Additional fields
PV adds no additional fields to that of AbstractNonDisRES.
Constructor for sampling
The specialized PV node provides a constructor that automatically samples solar generation profiles from the PVGIS service using user-specified parameters.
The additional inputs to this constructor are:
time_start::DateTime: The start of the time range for which PV output data is requested.time_end::DateTime: The end of the time range for which PV output data is requested.params::PVParameters: A structure specifying the PV system and site parameters. SeePVParametersfor details.
Additional keyword arguments for the constructor:
data::Vector{<:Data}: Additional data (e.g., for investments). Optional.data_path::String="pvgis_cache": Directory for caching downloaded PVGIS data.filename_hint::String="": Optional string to include in the cache file name for identification.
The constructor will automatically retrieve and cache the PV production profile for the specified location and configuration, and use it as the node's operational profile.
Mathematical description
In the following mathematical equations, we use the name for variables and functions used in the model. Variables are in general represented as
$\texttt{var\_example}[index_1, index_2]$
with square brackets, while functions are represented as
$func\_example(index_1, index_2)$
with parentheses.
Variables
Standard variables
The PV power source node types utilize all standard variables from the AbstractNonDisRES node type. The variables include:
- $\texttt{opex\_var}$
- $\texttt{opex\_fixed}$
- $\texttt{cap\_use}$
- $\texttt{cap\_inst}$
- $\texttt{flow\_out}$
- $\texttt{emissions\_node}$ if
EmissionsDatais added to the fielddata. - $\texttt{curtailment}[n, t]$: Curtailed energy of source $n$ in operational period $t$ with a typical unit of MW.
The curtailed electricity specifies the unused generation (as rate) of the PV source. It is currently only used in the calculation, but not with a cost.
Non-dispatchable renewable energy source nodes are not compatible with CaptureData. Hence, you can only provide EmissionsProcess to the node. It is our aim to include the potential for construction emissions in a later stage.
Additional variables
PV adds no additional variables to that of AbstractNonDisRES.
Constraints
The following sections omit the direct inclusion of the vector of PV nodes. Instead, it is implicitly assumed that the constraints are valid $\forall n ∈ N^{\text{PV}\_source}$ for all PV types if not stated differently. In addition, all constraints are valid $\forall t \in T$ (that is in all operational periods) or $\forall t_{inv} \in T^{Inv}$ (that is in all strategic periods).
Standard constraints
PV power source nodes utilize in general the standard constraints described on Constraint functions. These standard constraints are:
constraints_capacity_installed:\[\texttt{cap\_inst}[n, t] = capacity(n, t)\]
Using investments The function
constraints_capacity_installedis also used inEnergyModelsInvestmentsto incorporate the potential for investment. Nodes with investments are then no longer constrained by the parameter capacity.constraints_flow_out:\[\texttt{flow\_out}[n, t, p] = outputs(n, p) \times \texttt{cap\_use}[n, t] \qquad \forall p \in outputs(n) \setminus \{\text{CO}_2\}\]
constraints_opex_fixed:\[\texttt{opex\_fixed}[n, t_{inv}] = opex\_fixed(n, t_{inv}) \times \texttt{cap\_inst}[n, first(t_{inv})]\]
Why do we use `first()` The variables $\texttt{cap\_inst}$ are declared over all operational periods (see the section on Capacity variables for further explanations). Hence, we use the function $first(t_{inv})$ to retrieve the installed capacities in the first operational period of a given strategic period $t_{inv}$ in the function
constraints_opex_fixed.constraints_opex_var:\[\texttt{opex\_var}[n, t_{inv}] = \sum_{t \in t_{inv}} opex\_var(n, t) \times \texttt{cap\_use}[n, t] \times scale\_op\_sp(t_{inv}, t)\]
The function `scale_op_sp` The function $scale\_op\_sp(t_{inv}, t)$ calculates the scaling factor between operational and strategic periods. It also takes into account potential operational scenarios and their probability as well as representative periods.
constraints_data:
This function is only called for specified data of the non-dispatchable renewable energy source, see above.
The function constraints_capacity is extended by AbstractNonDisRES with a method for non-dispatchable renewable energy source nodes to allow the inclusion of the production profile and the variable $\texttt{curtailment}[n, t]$. It includes two individual constraints:
\[\texttt{cap\_use}[n, t] \leq \texttt{cap\_inst}[n, t]\]
and
\[\texttt{cap\_use}[n, t] + \texttt{curtailment}[n, t] = profile(n, t) \times \texttt{cap\_inst}[n, t]\]
This function still calls the subfunction constraints_capacity_installed to limit the variable $\texttt{cap\_inst}[n, t]$ or provide capacity investment options.
Additional constraints
PV nodes do not add additional constraints.