diff --git a/dev/build/index.html b/dev/build/index.html index a3ba0ef..41c7fb0 100644 --- a/dev/build/index.html +++ b/dev/build/index.html @@ -24,4 +24,4 @@ silent, time_limit_sec, string_names -)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/build_and_run.jl:338.

source +)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/build_and_run.jl:338.

source diff --git a/dev/constraints/index.html b/dev/constraints/index.html index 5fb724b..3f5245f 100644 --- a/dev/constraints/index.html +++ b/dev/constraints/index.html @@ -8,13 +8,13 @@ model, binding_end, d_binding_max -)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:214.

source
NEMStorageUnderUncertainty._add_constraint_initial_soc!Method
_add_constraint_initial_soc!(
+)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:214.

source
NEMStorageUnderUncertainty._add_constraint_initial_soc!Method
_add_constraint_initial_soc!(
     model::JuMP.Model,
     storage::NEMStorageUnderUncertainty.StorageDevice,
     times::Vector{Dates.DateTime},
     τ::Float64
 ) -> JuMP.ConstraintRef{JuMP.Model}
-

Summary

Initial state of charge constraint that uses soc₀ from storage.

Adds the following constraint to model:

$e_1 - e_0 - \left( q_1\eta_{charge}\tau\right)+\frac{p_1\tau}{\eta_{discharge}} = 0$

where $e_0$ and $\eta$ are obtained from storage.

Arguments

  • model: JuMP model
  • storage: A StorageDevice
  • times: A Vector of DateTimes
  • tau: Interval length in hours

Methods

_add_constraint_initial_soc!(model, storage, times, τ)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:51.

source
NEMStorageUnderUncertainty._add_constraint_initial_throughput!Method
_add_constraint_initial_throughput!(
+

Summary

Initial state of charge constraint that uses soc₀ from storage.

Adds the following constraint to model:

$e_1 - e_0 - \left( q_1\eta_{charge}\tau\right)+\frac{p_1\tau}{\eta_{discharge}} = 0$

where $e_0$ and $\eta$ are obtained from storage.

Arguments

  • model: JuMP model
  • storage: A StorageDevice
  • times: A Vector of DateTimes
  • tau: Interval length in hours

Methods

_add_constraint_initial_soc!(model, storage, times, τ)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:51.

source
NEMStorageUnderUncertainty._add_constraint_initial_throughput!Method
_add_constraint_initial_throughput!(
     model::JuMP.Model,
     storage::NEMStorageUnderUncertainty.StorageDevice,
     times::Vector{Dates.DateTime},
@@ -25,25 +25,25 @@
     storage,
     times,
     τ
-)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:127.

source
NEMStorageUnderUncertainty._add_constraint_intertemporal_soc!Method
_add_constraint_intertemporal_soc!(
+)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:127.

source
NEMStorageUnderUncertainty._add_constraint_intertemporal_soc!Method
_add_constraint_intertemporal_soc!(
     model::JuMP.Model,
     storage::NEMStorageUnderUncertainty.StorageDevice,
     times::Vector{Dates.DateTime},
     τ::Float64
 ) -> JuMP.Containers.DenseAxisArray
-

Summary

Intertemporal state of charge constraints that describe state of charge evolution.

Adds the following constraint to model if times has length ≥ 2:

$e_t-e_{t-1}- \left( q_t\eta_{charge}\tau\right)+\frac{p_t\tau}{\eta_{discharge}} = 0$

$\eta$ are obtained from storage.

Arguments

  • model: JuMP model
  • storage: A StorageDevice
  • times: A Vector of DateTimes
  • tau: Interval length in hours

Methods

_add_constraint_intertemporal_soc!(model, storage, times, τ)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:86.

source
NEMStorageUnderUncertainty._add_constraint_intertemporal_throughput!Method
_add_constraint_intertemporal_throughput!(
+

Summary

Intertemporal state of charge constraints that describe state of charge evolution.

Adds the following constraint to model if times has length ≥ 2:

$e_t-e_{t-1}- \left( q_t\eta_{charge}\tau\right)+\frac{p_t\tau}{\eta_{discharge}} = 0$

$\eta$ are obtained from storage.

Arguments

  • model: JuMP model
  • storage: A StorageDevice
  • times: A Vector of DateTimes
  • tau: Interval length in hours

Methods

_add_constraint_intertemporal_soc!(model, storage, times, τ)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:86.

source
NEMStorageUnderUncertainty._add_constraint_intertemporal_throughput!Method
_add_constraint_intertemporal_throughput!(
     model::JuMP.Model,
     times::Vector{Dates.DateTime},
     τ::Float64
 ) -> JuMP.Containers.DenseAxisArray
-

Summary

Intertemporal throughput constraints that track throughput. See _add_variable_throughput!.

Adds the following constraint to model if times has length ≥ 2:

$d_t-d_{t-1} - p_t\tau = 0$

Arguments

  • model: JuMP model
  • times: A Vector of DateTimes
  • tau: Interval length in hours

Methods

_add_constraint_intertemporal_throughput!(model, times, τ)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:156.

source
NEMStorageUnderUncertainty._add_constraint_throughput_limit!Method
_add_constraint_throughput_limit!(
+

Summary

Intertemporal throughput constraints that track throughput. See _add_variable_throughput!.

Adds the following constraint to model if times has length ≥ 2:

$d_t-d_{t-1} - p_t\tau = 0$

Arguments

  • model: JuMP model
  • times: A Vector of DateTimes
  • tau: Interval length in hours

Methods

_add_constraint_intertemporal_throughput!(model, times, τ)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:156.

source
NEMStorageUnderUncertainty._add_constraint_throughput_limit!Method
_add_constraint_throughput_limit!(
     model::JuMP.Model,
     times::Vector{Dates.DateTime},
     d_max::Float64
 ) -> JuMP.ConstraintRef{JuMP.Model}
-

Summary

Adds a throughput limit constraint that applies to the final time period in a simulation.

Adds the following constraint to model:

$d_{end} ≤ d_{max}$

where $d_{max}$ is supplied

Arguments

  • model: JuMP model
  • times: A Vector of DateTimes
  • d_max: Throughput limit in MWh, applicable at the end of times

Methods

_add_constraint_throughput_limit!(model, times, d_max)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:191.

source
NEMStorageUnderUncertainty._add_constraints_charge_state!Method
_add_constraints_charge_state!(
+

Summary

Adds a throughput limit constraint that applies to the final time period in a simulation.

Adds the following constraint to model:

$d_{end} ≤ d_{max}$

where $d_{max}$ is supplied

Arguments

  • model: JuMP model
  • times: A Vector of DateTimes
  • d_max: Throughput limit in MWh, applicable at the end of times

Methods

_add_constraint_throughput_limit!(model, times, d_max)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:191.

source
NEMStorageUnderUncertainty._add_constraints_charge_state!Method
_add_constraints_charge_state!(
     model::JuMP.Model,
     storage::NEMStorageUnderUncertainty.StorageDevice,
     times::Vector{Dates.DateTime}
 ) -> Tuple{JuMP.Containers.DenseAxisArray, JuMP.Containers.DenseAxisArray}
-

Summary

Constraints that explicitly prevent simultaneous charging and discharging during a time interval $t$. Adds two constraints to model:

  • $p_t - \bar{p}\left(1-u_t\right) \leq 0$
  • $q_t - \bar{p}u_t \leq 0$

In the absence of these constraints, simultaneous charging and discharging was observed for a BESS device simulated for the following model formulations:

Arguments

  • model: JuMP model
  • storage: A StorageDevice
  • times: A Vector of DateTimes

Methods

_add_constraints_charge_state!(model, storage, times)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:18.

source
+

Summary

Constraints that explicitly prevent simultaneous charging and discharging during a time interval $t$. Adds two constraints to model:

In the absence of these constraints, simultaneous charging and discharging was observed for a BESS device simulated for the following model formulations:

Arguments

Methods

_add_constraints_charge_state!(model, storage, times)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/constraints.jl:18.

source diff --git a/dev/data/index.html b/dev/data/index.html index 28ed9ba..0580c6c 100644 --- a/dev/data/index.html +++ b/dev/data/index.html @@ -1,5 +1,5 @@ -Price Data Compilers · NEM Storage Under Uncertainty

Price Data Compilers

NEMStorageUnderUncertainty.ActualDataType
struct ActualData{T<:AbstractFloat} <: NEMStorageUnderUncertainty.NEMData
  • region::String

  • times::Vector{Dates.DateTime}

  • prices::Vector{T} where T<:AbstractFloat

  • τ::AbstractFloat

A data structure used to store actual price data and metadata

source
NEMStorageUnderUncertainty.ForecastDataType
struct ForecastData{T<:AbstractFloat} <: NEMStorageUnderUncertainty.NEMData
  • region::String

  • run_times::Vector{Dates.DateTime}

  • forecasted_times::Vector{Dates.DateTime}

  • prices::Vector{T} where T<:AbstractFloat

  • τ::AbstractFloat

  • run_time_aligned::Bool

A data structure used to store forecast price data and metadata

run_time_aligned indicates whether PD and P5MIN raw data used to construct a ForecastData instance were aligned along actual_run_time, i.e. same start and end actual_run_time.

source
NEMStorageUnderUncertainty.get_ActualDataFunction
get_ActualData(
+Price Data Compilers · NEM Storage Under Uncertainty

Price Data Compilers

NEMStorageUnderUncertainty.ActualDataType
struct ActualData{T<:AbstractFloat} <: NEMStorageUnderUncertainty.NEMData
  • region::String

  • times::Vector{Dates.DateTime}

  • prices::Vector{T} where T<:AbstractFloat

  • τ::AbstractFloat

A data structure used to store actual price data and metadata

source
NEMStorageUnderUncertainty.ForecastDataType
struct ForecastData{T<:AbstractFloat} <: NEMStorageUnderUncertainty.NEMData
  • region::String

  • run_times::Vector{Dates.DateTime}

  • forecasted_times::Vector{Dates.DateTime}

  • prices::Vector{T} where T<:AbstractFloat

  • τ::AbstractFloat

  • run_time_aligned::Bool

A data structure used to store forecast price data and metadata

run_time_aligned indicates whether PD and P5MIN raw data used to construct a ForecastData instance were aligned along actual_run_time, i.e. same start and end actual_run_time.

source
NEMStorageUnderUncertainty.get_ActualDataFunction
get_ActualData(
     actual_data::DataFrames.DataFrame,
     region::String
 ) -> NEMStorageUnderUncertainty.ActualData
@@ -9,7 +9,7 @@
     actual_time_window::Union{Nothing, Tuple{Dates.DateTime, Dates.DateTime}}
 ) -> NEMStorageUnderUncertainty.ActualData
 

Summary

Get an ActualData instance.

Arguments:

  • actual_data: DataFrame generated by get_all_actual_data
  • region: Market region in the NEM
  • actual_time_window: Tuple used to filter DataFrame

Returns:

An ActualData instance.

Methods

get_ActualData(actual_data, region)
-get_ActualData(actual_data, region, actual_time_window)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/data.jl:83.

source
NEMStorageUnderUncertainty.get_all_pd_and_p5_dataMethod
get_all_pd_and_p5_data(
     pd_path::String,
     p5_path::String
 ) -> Tuple{DataFrames.DataFrame, DataFrames.DataFrame}
-

Summary

Obtains and compiles all forecasted price data from parquet files located at the P5MIN path (p5_path) and the PREDISPATCH path (pd_path)

Note that Parquet.jl cannot parse Timestamps from .parquet, so we use unix2datetime.

Arguments

  • pd_path: Path to PREDISPATCH parquet partitions
  • p5_path: Path to P5MIN parquet partitions

Returns

Compiled forecast data with nominal run times, forecasted times, regions and their corresponding energy prices.

Methods

get_all_pd_and_p5_data(pd_path, p5_path)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/data.jl:130.

source
+

Summary

Obtains and compiles all forecasted price data from parquet files located at the P5MIN path (p5_path) and the PREDISPATCH path (pd_path)

Note that Parquet.jl cannot parse Timestamps from .parquet, so we use unix2datetime.

Arguments

  • pd_path: Path to PREDISPATCH parquet partitions
  • p5_path: Path to P5MIN parquet partitions

Returns

Compiled forecast data with nominal run times, forecasted times, regions and their corresponding energy prices.

Methods

get_all_pd_and_p5_data(pd_path, p5_path)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/data.jl:130.

source
diff --git a/dev/devices/index.html b/dev/devices/index.html index 822e861..9202b12 100644 --- a/dev/devices/index.html +++ b/dev/devices/index.html @@ -36,4 +36,4 @@ η_discharge, soc₀, throughput -)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/devices.jl:43.

source
NEMStorageUnderUncertainty.StorageDeviceType
abstract type StorageDevice
source
+)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/devices.jl:43.

source
NEMStorageUnderUncertainty.StorageDeviceType
abstract type StorageDevice
source
diff --git a/dev/formulations/index.html b/dev/formulations/index.html index da7efb6..e4a13f4 100644 --- a/dev/formulations/index.html +++ b/dev/formulations/index.html @@ -11,7 +11,7 @@ & e_1 - e_0 - \left( q_1\eta_{charge}\tau\right)+\frac{p_1\tau}{\eta_{discharge}} = 0\\ & d_t-d_{t-1} - p_t\tau = 0\\ & d_1 - d_0 - p_1\tau = 0\\ -\end{aligned}\]

Attributes

```

source
NEMStorageUnderUncertainty.ArbitrageDiscountedType
struct ArbitrageDiscounted <: NEMStorageUnderUncertainty.StorageModelFormulation
  • d_lifetime::Float64

  • c_capital::Float64

  • discount_function::Function

  • r::Float64

Summary

Maximises storage revenue subject to:

  1. Pro-rata penalisation of throughput/cycling
  2. Discounted future decisions (based on a discount function & discount rate)
  • Future periods are discounted by a discount factor
  • No cycling/throughput limits are imposed on the storage device
  • Revenue is defined by the (discounted) spot price for energy and is penalised based on throughput
    • The penalty is the proportion of the warrantied throughput lifetime of the storage device expended during the modelled period, multiplied by the cost of a new storage device
  • Intertemporal SoC constraints are applied, including from e₀ (initial SoC of storage device) to e₁ (first modelled SoC)

\[\begin{aligned} +\end{aligned}\]

Attributes

  • d_lifetime: Warrantied throughput lifetime of the storage device in MWh
  • c_capital: Capital cost of storage device in AUD/MWh
  • C: Quantity of capacity "contracted" under cap contract (MW)

```

source
NEMStorageUnderUncertainty.ArbitrageDiscountedType
struct ArbitrageDiscounted <: NEMStorageUnderUncertainty.StorageModelFormulation
  • d_lifetime::Float64

  • c_capital::Float64

  • discount_function::Function

  • r::Float64

Summary

Maximises storage revenue subject to:

  1. Pro-rata penalisation of throughput/cycling
  2. Discounted future decisions (based on a discount function & discount rate)
  • Future periods are discounted by a discount factor
  • No cycling/throughput limits are imposed on the storage device
  • Revenue is defined by the (discounted) spot price for energy and is penalised based on throughput
    • The penalty is the proportion of the warrantied throughput lifetime of the storage device expended during the modelled period, multiplied by the cost of a new storage device
  • Intertemporal SoC constraints are applied, including from e₀ (initial SoC of storage device) to e₁ (first modelled SoC)

\[\begin{aligned} \max \quad & \sum_{t \in T}\left(\tau(p_t - q_t) \times \lambda_t DF(r, t)\right) - \frac{d_T - d_0}{d_{lifetime}} e_{rated} c_{capital} \\ \textrm{s.t.} \quad & u_t \in \{0,1\} \\ & p_t \geq 0 \\ @@ -23,7 +23,7 @@ & e_1 - e_0 - \left( q_1\eta_{charge}\tau\right)+\frac{p_1\tau}{\eta_{discharge}} = 0\\ & d_t-d_{t-1} - p_t\tau = 0\\ & d_1 - d_0 - p_1\tau = 0\\ -\end{aligned}\]

Attributes

  • d_lifetime: Warrantied throughput lifetime of the storage device in MWh
  • c_capital: Capital cost of storage device in AUD/MWh
  • discount_function: Function that calculates discount factors. Should take a Vector of discount times (hours ahead) and the discount rate $r$ (per hour) as arguments.
  • r: Discount rate. Should have units $hr^{-1}$.

```

source
NEMStorageUnderUncertainty.ArbitrageThroughputPenaltyType
struct ArbitrageThroughputPenalty <: NEMStorageUnderUncertainty.StorageModelFormulation
  • d_lifetime::Float64

  • c_capital::Float64

Summary

Maximises storage revenue subject to pro-rata penalisation of throughput/cycling:

  • All periods are treated (weighted) equally
  • No cycling/throughput limits are imposed on the storage device
  • Revenue is defined by the spot price for energy and is penalised based on throughput
    • The penalty is the proportion of the warrantied throughput lifetime of the storage device expended during the modelled period, multiplied by the cost of a new storage device
  • Intertemporal SoC constraints are applied, including from e₀ (initial SoC of storage device) to e₁ (first modelled SoC)

\[\begin{aligned} +\end{aligned}\]

Attributes

  • d_lifetime: Warrantied throughput lifetime of the storage device in MWh
  • c_capital: Capital cost of storage device in AUD/MWh
  • discount_function: Function that calculates discount factors. Should take a Vector of discount times (hours ahead) and the discount rate $r$ (per hour) as arguments.
  • r: Discount rate. Should have units $hr^{-1}$.

```

source
NEMStorageUnderUncertainty.ArbitrageThroughputPenaltyType
struct ArbitrageThroughputPenalty <: NEMStorageUnderUncertainty.StorageModelFormulation
  • d_lifetime::Float64

  • c_capital::Float64

Summary

Maximises storage revenue subject to pro-rata penalisation of throughput/cycling:

  • All periods are treated (weighted) equally
  • No cycling/throughput limits are imposed on the storage device
  • Revenue is defined by the spot price for energy and is penalised based on throughput
    • The penalty is the proportion of the warrantied throughput lifetime of the storage device expended during the modelled period, multiplied by the cost of a new storage device
  • Intertemporal SoC constraints are applied, including from e₀ (initial SoC of storage device) to e₁ (first modelled SoC)

\[\begin{aligned} \max \quad & \sum_{t \in T}{\tau\lambda_t(p_t - q_t)} - \frac{d_T - d_0}{d_{lifetime}} e_{rated} c_{capital} \\ \textrm{s.t.} \quad & u_t \in \{0,1\} \\ & p_t \geq 0 \\ @@ -35,7 +35,7 @@ & e_1 - e_0 - \left( q_1\eta_{charge}\tau\right)+\frac{p_1\tau}{\eta_{discharge}} = 0\\ & d_t-d_{t-1} - p_t\tau = 0\\ & d_1 - d_0 - p_1\tau = 0\\ -\end{aligned}\]

Attributes

  • d_lifetime: Warrantied throughput lifetime of the storage device in MWh
  • c_capital: Capital cost of storage device in AUD/MWh

```

source
NEMStorageUnderUncertainty.DegradationModelType
abstract type DegradationModel <: NEMStorageUnderUncertainty.Formulation
source
NEMStorageUnderUncertainty.NoDegradationType
struct NoDegradation <: NEMStorageUnderUncertainty.DegradationModel

No storage degradation modelled in simulations.

source
NEMStorageUnderUncertainty.StandardArbitrageType
struct StandardArbitrage <: NEMStorageUnderUncertainty.StorageModelFormulation

Summary

Maximises storage revenue:

  • All periods are treated (weighted) equally
  • No cycling/throughput limits are modelled
  • Revenue is purely defined by the spot price for energy
  • Intertemporal SoC constraints are applied, including from e₀ (initial SoC of storage device) to e₁ (first modelled SoC)

\[\begin{aligned} +\end{aligned}\]

Attributes

  • d_lifetime: Warrantied throughput lifetime of the storage device in MWh
  • c_capital: Capital cost of storage device in AUD/MWh

```

source
NEMStorageUnderUncertainty.DegradationModelType
abstract type DegradationModel <: NEMStorageUnderUncertainty.Formulation
source
NEMStorageUnderUncertainty.NoDegradationType
struct NoDegradation <: NEMStorageUnderUncertainty.DegradationModel

No storage degradation modelled in simulations.

source
NEMStorageUnderUncertainty.StandardArbitrageType
struct StandardArbitrage <: NEMStorageUnderUncertainty.StorageModelFormulation

Summary

Maximises storage revenue:

  • All periods are treated (weighted) equally
  • No cycling/throughput limits are modelled
  • Revenue is purely defined by the spot price for energy
  • Intertemporal SoC constraints are applied, including from e₀ (initial SoC of storage device) to e₁ (first modelled SoC)

\[\begin{aligned} \max \quad & \sum_{t \in T}{\tau\lambda_t(p_t-q_t)}\\ \textrm{s.t.} \quad & u_t \in \{0,1\} \\ & p_t \geq 0 \\ @@ -45,7 +45,7 @@ & \underline{e} \leq e_t \leq \bar{e} \\ & e_t-e_{t-1}- \left( q_t\eta_{charge}\tau\right)+\frac{p_t\tau}{\eta_{discharge}} = 0\\ & e_1 - e_0 - \left( q_1\eta_{charge}\tau\right)+\frac{p_1\tau}{\eta_{discharge}} = 0\\ -\end{aligned}\]

source
NEMStorageUnderUncertainty.StandardArbitrageThroughputLimitType
struct StandardArbitrageThroughputLimit <: NEMStorageUnderUncertainty.StorageModelFormulation
  • throughput_mwh_per_year::Float64

Summary

Maximises storage revenue subject to pro-rata application of throughput limits:

  • All periods are treated (weighted) equally
  • A throughput limit is modelled, with an annual throughput limit (d_max) specified
    • Each simulation includes this limit applied on a pro rata basis (i.e. proportion of year in each model horizon)
      • d_max for a model period is given by (where d₀ is the initial storage device throughput): $d_{max} = d_0 + \frac{t_T - t_1 + 5}{60 \times 24 \times 365} \times d_{limit}$
      • d_binding_max applies a similar limit to the binding period
      • d_limit is the throughput limit in MWh/year
  • Revenue is purely defined by the spot price for energy
  • Intertemporal SoC constraints are applied, including from e₀ (initial SoC of storage device) to e₁ (first modelled SoC)

\[\begin{aligned} +\end{aligned}\]

source
NEMStorageUnderUncertainty.StandardArbitrageThroughputLimitType
struct StandardArbitrageThroughputLimit <: NEMStorageUnderUncertainty.StorageModelFormulation
  • throughput_mwh_per_year::Float64

Summary

Maximises storage revenue subject to pro-rata application of throughput limits:

  • All periods are treated (weighted) equally
  • A throughput limit is modelled, with an annual throughput limit (d_max) specified
    • Each simulation includes this limit applied on a pro rata basis (i.e. proportion of year in each model horizon)
      • d_max for a model period is given by (where d₀ is the initial storage device throughput): $d_{max} = d_0 + \frac{t_T - t_1 + 5}{60 \times 24 \times 365} \times d_{limit}$
      • d_binding_max applies a similar limit to the binding period
      • d_limit is the throughput limit in MWh/year
  • Revenue is purely defined by the spot price for energy
  • Intertemporal SoC constraints are applied, including from e₀ (initial SoC of storage device) to e₁ (first modelled SoC)

\[\begin{aligned} \max \quad & \sum_{t \in T}{\tau\lambda_t(p_t-q_t)}\\ \textrm{s.t.} \quad & u_t \in \{0,1\} \\ & p_t \geq 0 \\ @@ -59,4 +59,4 @@ & d_1 - d_0 - p_1\tau = 0\\ & d_{t_{binding, end}} ≤ d_{binding_{max}} \\ & d_T ≤ d_{max}\\ -\end{aligned}\]

source
NEMStorageUnderUncertainty.StorageModelFormulationType
abstract type StorageModelFormulation <: NEMStorageUnderUncertainty.Formulation
source
+\end{aligned}\]

source
NEMStorageUnderUncertainty.StorageModelFormulationType
abstract type StorageModelFormulation <: NEMStorageUnderUncertainty.Formulation
source
diff --git a/dev/index.html b/dev/index.html index 2d38243..56b1778 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,2 +1,2 @@ -Home · NEM Storage Under Uncertainty

NEMStorageUnderUncertainty Documentation

A modelling framework built to explore the impact of future market information (forecasts) on the operation of energy storage in the National Electricity Market (NEM).

Terminology used in this repo is outlined in Terminology

These pages document the source code used to run storage simulations:

  • Storage Devices contains the storage devices modelled
  • Price Data Compilers documents the functions that compile, clean and assemble actual and forecast price data for use in models/simulations
  • Model Formulations documents the mathematical optimisation problems formulated for each model horizon
  • Simulation Functions documents the code that is used to string model horizons together and simulate the rolling horizon/optimal control problem
  • Simulation Results Processing and Calculations documents simulation results compilers, and functions that calculate aggregate results (e.g. annual revenue, value of perfect information, value of perfect foresight)
+Home · NEM Storage Under Uncertainty

NEMStorageUnderUncertainty Documentation

A modelling framework built to explore the impact of future market information (forecasts) on the operation of energy storage in the National Electricity Market (NEM).

Terminology used in this repo is outlined in Terminology

These pages document the source code used to run storage simulations:

  • Storage Devices contains the storage devices modelled
  • Price Data Compilers documents the functions that compile, clean and assemble actual and forecast price data for use in models/simulations
  • Model Formulations documents the mathematical optimisation problems formulated for each model horizon
  • Simulation Functions documents the code that is used to string model horizons together and simulate the rolling horizon/optimal control problem
  • Simulation Results Processing and Calculations documents simulation results compilers, and functions that calculate aggregate results (e.g. annual revenue, value of perfect information, value of perfect foresight)
diff --git a/dev/objectives/index.html b/dev/objectives/index.html index 3b5e94d..a742cc2 100644 --- a/dev/objectives/index.html +++ b/dev/objectives/index.html @@ -22,7 +22,7 @@ e_rated, c_capital, C -)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/objectives.jl:116.

source
NEMStorageUnderUncertainty._add_objective_discounted!Method
_add_objective_discounted!(
+)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/objectives.jl:116.

source
NEMStorageUnderUncertainty._add_objective_discounted!Method
_add_objective_discounted!(
     model::JuMP.Model,
     prices::Vector{<:AbstractFloat},
     times::Vector{Dates.DateTime},
@@ -47,7 +47,7 @@
     c_capital,
     discount_function,
     r
-)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/objectives.jl:177.

source
NEMStorageUnderUncertainty._add_objective_standard!Method
_add_objective_standard!(
+)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/objectives.jl:177.

source
NEMStorageUnderUncertainty._add_objective_standard!Method
_add_objective_standard!(
     model::JuMP.Model,
     prices::Vector{<:AbstractFloat},
     times::Vector{Dates.DateTime},
@@ -55,7 +55,7 @@
 ) -> Any
 

Summary

Adds a standard revenue-maximising objective function:

\[\begin{aligned} \max \quad & \sum_{t \in T}{\tau\lambda_t(p_t - q_t)} -\end{aligned}\]

Arguments

  • model: JuMP model
  • prices: A Vector of prices in /MWh
  • times: A Vector of DateTimes
  • τ: Frequency of prices in hours

Methods

_add_objective_standard!(model, prices, times, τ)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/objectives.jl:17.

source
NEMStorageUnderUncertainty._add_objective_throughput_penalty!Method
_add_objective_throughput_penalty!(
+\end{aligned}\]

Arguments

  • model: JuMP model
  • prices: A Vector of prices in /MWh
  • times: A Vector of DateTimes
  • τ: Frequency of prices in hours

Methods

_add_objective_standard!(model, prices, times, τ)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/objectives.jl:17.

source
NEMStorageUnderUncertainty._add_objective_throughput_penalty!Method
_add_objective_throughput_penalty!(
     model::JuMP.Model,
     prices::Vector{<:AbstractFloat},
     times::Vector{Dates.DateTime},
@@ -76,4 +76,4 @@
     d_lifetime,
     e_rated,
     c_capital
-)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/objectives.jl:59.

source
+)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/objectives.jl:59.

source diff --git a/dev/results/index.html b/dev/results/index.html index a14793d..d3d2bc6 100644 --- a/dev/results/index.html +++ b/dev/results/index.html @@ -2,8 +2,8 @@ Results Processing · NEM Storage Under Uncertainty

Simulation Results Processing and Calculations

NEMStorageUnderUncertainty.calculate_summaries_and_vpl_vpi_across_scenariosMethod
calculate_summaries_and_vpl_vpi_across_scenarios(
     sim_folder::String
 )
-

Summary

Summarises results, revenues and VPL and VPI for each simulated formulation

For each state, this function cycles through each simulated formulation and:

  1. Calculates summary results (i.e. annual net revenue and mean relative gap)
  2. Calculates revenues (i.e. annual net revenue, annual negative revenue)
  3. Calculates the value of perfect lookahead and value of perfect information

A JLD2 file for each of these (with data for each simulated formulation) is released in the results folder

Arguments

  • sim_folder: Path containing simulations of different formulations and their results.

Returns

Nothing

lookahead.

Methods

calculate_summaries_and_vpl_vpi_across_scenarios(sim_folder)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/results.jl:257.

source
NEMStorageUnderUncertainty.calculate_vpl_vpiMethod
calculate_vpl_vpi(
+

Summary

Summarises results, revenues and VPL and VPI for each simulated formulation

For each state, this function cycles through each simulated formulation and:

  1. Calculates summary results (i.e. annual net revenue and mean relative gap)
  2. Calculates revenues (i.e. annual net revenue, annual negative revenue)
  3. Calculates the value of perfect lookahead and value of perfect information

A JLD2 file for each of these (with data for each simulated formulation) is released in the results folder

Arguments

  • sim_folder: Path containing simulations of different formulations and their results.

Returns

Nothing

lookahead.

Methods

calculate_summaries_and_vpl_vpi_across_scenarios(sim_folder)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/results.jl:257.

source
NEMStorageUnderUncertainty.calculate_vpl_vpiMethod
calculate_vpl_vpi(
     df::DataFrames.DataFrame
 ) -> DataFrames.DataFrame
-

Summary

Calculates values of perfect lookahead and information (as absolute values in AUD and as a percentage of perfect foresight revenue), and the detrimental decision metric

Value of perfect lookahead: What is the additional benefit (revenue) that a participant could gain if they were to know exactly what the market prices will be in the lookahead horizon.

  • $VPL = \textrm{Revenue}_\textrm{Actual Data Simulation} - \textrm{Revenue}_\textrm{Forecast Data Simulation}$

Value of perfect information: What is the additional benefit (revenue) that a participant could gain if they were to know exactly what the market prices will be over the entire year

  • $VPI = \textrm{Revenue}_\textrm{Perfect Foresight} - \textrm{Revenue}_\textrm{Forecast Data Simulation}$

Detrimental decision metric: What is the additional negative revenue (i.e. losses) incurred when using forecast market prices in the lookahead horizon as a percentage?

  • $DDM = \frac{\textrm{NegRev}_{\textrm{Actual Data Simulation}} -\textrm{NegRev}_{\textrm{Forecast Data Simulation}}}{\textrm{Revenue}_{\textrm{Actual Data Simulation}}-\textrm{Revenue}_{\textrm{Forecast Data Simulation}}}$

N.B. This function assumes that the input df only has data that corresponds to a device of a particular energy_capacity.

Arguments

  • df: DataFrame produced by _summarise_simulations

Returns

DataFrame with absolute values of perfect lookahead and information, and the same values as a percentage of perfect foresight revenue.

Methods

calculate_vpl_vpi(df)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/results.jl:137.

source
NEMStorageUnderUncertainty.calculate_vpl_vpi_across_scenariosMethod
calculate_vpl_vpi_across_scenarios(summary_folder::String)
-

Summary

Calculates values of perfect lookahead and information

For each state, this function cycles through each simulated formulation calculates the value of perfect lookahead and value of information

For a single state, the VPLs and VPIs across simulated formulations are then released in a JLD2 file in the results folder

Arguments

  • sim_folder: Path containing simulations of different formulations and their results.

Returns

Nothing

Methods

calculate_vpl_vpi_across_scenarios(summary_folder)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/results.jl:204.

source
+

Summary

Calculates values of perfect lookahead and information (as absolute values in AUD and as a percentage of perfect foresight revenue), and the detrimental decision metric

Value of perfect lookahead: What is the additional benefit (revenue) that a participant could gain if they were to know exactly what the market prices will be in the lookahead horizon.

Value of perfect information: What is the additional benefit (revenue) that a participant could gain if they were to know exactly what the market prices will be over the entire year

Detrimental decision metric: What is the additional negative revenue (i.e. losses) incurred when using forecast market prices in the lookahead horizon as a percentage?

N.B. This function assumes that the input df only has data that corresponds to a device of a particular energy_capacity.

Arguments

Returns

DataFrame with absolute values of perfect lookahead and information, and the same values as a percentage of perfect foresight revenue.

Methods

calculate_vpl_vpi(df)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/results.jl:137.

source
NEMStorageUnderUncertainty.calculate_vpl_vpi_across_scenariosMethod
calculate_vpl_vpi_across_scenarios(summary_folder::String)
+

Summary

Calculates values of perfect lookahead and information

For each state, this function cycles through each simulated formulation calculates the value of perfect lookahead and value of information

For a single state, the VPLs and VPIs across simulated formulations are then released in a JLD2 file in the results folder

Arguments

  • sim_folder: Path containing simulations of different formulations and their results.

Returns

Nothing

Methods

calculate_vpl_vpi_across_scenarios(summary_folder)

defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/results.jl:204.

source
diff --git a/dev/search/index.html b/dev/search/index.html index 938c955..2c04b5b 100644 --- a/dev/search/index.html +++ b/dev/search/index.html @@ -1,2 +1,2 @@ -Search · NEM Storage Under Uncertainty

Loading search...

    +Search · NEM Storage Under Uncertainty

    Loading search...

      diff --git a/dev/simulation_utils/index.html b/dev/simulation_utils/index.html index 727276a..c38361e 100644 --- a/dev/simulation_utils/index.html +++ b/dev/simulation_utils/index.html @@ -4,21 +4,21 @@ actual_price_data::DataFrames.DataFrame, τ::Float64 ) -> Any -

      Summary

      Calculates actual revenue and adds it as a column to sim_results.

      Arguments:

      (with SETTLEMENTDATE column and prices covering simulation period)

      Returns

      sim_results with revenue column.

      Methods

      calculate_actual_revenue(sim_results, actual_price_data, τ)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulation_utils.jl:18.

      source
      NEMStorageUnderUncertainty.exponential_discountingMethod
      exponential_discounting(
      +

      Summary

      Calculates actual revenue and adds it as a column to sim_results.

      • Revenue is calculated for binding decisions
      • non binding decisions have missing revenue

      Arguments:

      • sim_results: DataFrame of simulation results
      • actual_price_data: DataFrame with actual price data

      (with SETTLEMENTDATE column and prices covering simulation period)

      • tau: Interval length in hours

      Returns

      sim_results with revenue column.

      Methods

      calculate_actual_revenue(sim_results, actual_price_data, τ)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulation_utils.jl:18.

      source
      NEMStorageUnderUncertainty.exponential_discountingMethod
      exponential_discounting(
           times::Vector{Float64},
           r::Float64
       ) -> Vector{Float64}
      -

      Summary

      Exponential discounting

      \[DF(r, t) = e^{-rt}\]

      Arguments

      • times: Vector that describes ahead times in hours ahead
      • r: Discount rate

      Returns

      Discount factor vector

      Methods

      exponential_discounting(times, r)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulation_utils.jl:138.

      source
      NEMStorageUnderUncertainty.hyperbolic_discountingMethod
      hyperbolic_discounting(
      +

      Summary

      Exponential discounting

      \[DF(r, t) = e^{-rt}\]

      Arguments

      • times: Vector that describes ahead times in hours ahead
      • r: Discount rate

      Returns

      Discount factor vector

      Methods

      exponential_discounting(times, r)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulation_utils.jl:138.

      source
      NEMStorageUnderUncertainty.hyperbolic_discountingMethod
      hyperbolic_discounting(
           times::Vector{Float64},
           r::Float64
       ) -> Vector{Float64}
      -

      Summary

      Hyperbolic discounting

      \[DF(r, t) = \frac{1}{1+rt}\]

      Arguments

      • times: Vector that describes ahead times in hours ahead
      • r: Discount rate

      Returns

      Discount factor vector

      Methods

      hyperbolic_discounting(times, r)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulation_utils.jl:158.

      source
      NEMStorageUnderUncertainty.results_to_jld2Method
      results_to_jld2(
      +

      Summary

      Hyperbolic discounting

      \[DF(r, t) = \frac{1}{1+rt}\]

      Arguments

      • times: Vector that describes ahead times in hours ahead
      • r: Discount rate

      Returns

      Discount factor vector

      Methods

      hyperbolic_discounting(times, r)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulation_utils.jl:158.

      source
      NEMStorageUnderUncertainty.results_to_jld2Method
      results_to_jld2(
           results_file::String,
           group::String,
           key::String,
           data::DataFrames.DataFrame
       )
      -

      Summary

      Saves simulation results to a JLD2 (HDF5) data file

      Simulation results (data) are saved in results_file/group/key

      Arguments

      • results_file: Path to file, including .jld2 extension
      • group: Data group - actual or forecast
      • key: Dataset key - storage power capacity
      • data: Simulation results DataFrame

      Methods

      results_to_jld2(results_file, group, key, data)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulation_utils.jl:114.

      source
      NEMStorageUnderUncertainty.run_perfect_foresightMethod
      run_perfect_foresight(
      +

      Summary

      Saves simulation results to a JLD2 (HDF5) data file

      Simulation results (data) are saved in results_file/group/key

      Arguments

      • results_file: Path to file, including .jld2 extension
      • group: Data group - actual or forecast
      • key: Dataset key - storage power capacity
      • data: Simulation results DataFrame

      Methods

      results_to_jld2(results_file, group, key, data)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulation_utils.jl:114.

      source
      NEMStorageUnderUncertainty.run_perfect_foresightMethod
      run_perfect_foresight(
           optimizer::MathOptInterface.OptimizerWithAttributes,
           storage::NEMStorageUnderUncertainty.StorageDevice,
           actual_data::NEMStorageUnderUncertainty.ActualData,
      @@ -37,4 +37,4 @@
           silent,
           time_limit_sec,
           string_names
      -)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulation_utils.jl:68.

      source
      +)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulation_utils.jl:68.

      source diff --git a/dev/simulations/index.html b/dev/simulations/index.html index cd9a58b..a33928c 100644 --- a/dev/simulations/index.html +++ b/dev/simulations/index.html @@ -32,7 +32,7 @@ time_limit_sec, string_names, relative_gap_in_results -)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulations.jl:309.

      source
      NEMStorageUnderUncertainty.simulate_storage_operationMethod
      simulate_storage_operation(
      +)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulations.jl:309.

      source
      NEMStorageUnderUncertainty.simulate_storage_operationMethod
      simulate_storage_operation(
           optimizer::MathOptInterface.OptimizerWithAttributes,
           storage::NEMStorageUnderUncertainty.StorageDevice,
           data::NEMStorageUnderUncertainty.ForecastData,
      @@ -65,4 +65,4 @@
           time_limit_sec,
           string_names,
           relative_gap_in_results
      -)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulations.jl:420.

      source
      +)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/simulations.jl:420.

      source diff --git a/dev/terminology/index.html b/dev/terminology/index.html index 07625f8..5615bb7 100644 --- a/dev/terminology/index.html +++ b/dev/terminology/index.html @@ -1,2 +1,2 @@ -Terminology · NEM Storage Under Uncertainty

      Terminology

      Price Data

      All price data is in AUD/MW/hr.

      Forecast

      Forecast data refers to price data compiled from 30-minute pre-dispatch (PD, or PREDISPATCH) and 5-minute pre-dispatch (P5MIN or 5MPD) forecasts.

      30-minute pre-dispatch forecasts run half an hour and one hour prior to real-time (actual run time) are removed as they overlap with the P5MIN horizon.

      Actual

      Actual price data refers to cleared prices for a region as published by AEMO.

      Simulation Components and Periods

      Model

      The storage device operator has information available at decision time $t_0$ (i.e. end of an interval), and, based on an optimisation problem from end of the next interval ($t_1$) to $t_{1 + t_h}$ where $t_h$ is the lookahead horizon, makes decisions for future intervals.

      • One (i.e. $t_1$) or more of the decisions at the start of the model period can be binding. These decisions are fixed and cannot be updated by the next model period (i.e. the next model period is run with the last binding decision interval of the previous model period as the decision time)
      • Remaining decisions in the lookahead horizon are non binding. Decisions for these intervals can be updated by successive model periods in the simulation

      Models are characterised by:

      • StorageModelFormulation, which describe which variables, constraints and/or objective function is incorporated into the optimisation model
      • DegradationModel, which describes how degradation is modelled and simulated

      Simulation

      A simulation is a rolling horizon optimal control problem in which:

      1. At the decision time, initial storage state and price data are inputs into a model of the first lookahead horizon
      2. The model is solved, and certain decisions are considered binding
      3. The next decision time is the last binding interval. The storage state is updated, the lookahead horizon is rolled along, and another model is constructed and solved
      4. This is repeated until the entire simulation period has been simulated

      Simulations can be run with actual price data, or with forecast price data.

      Results from simulations can be compared to a perfect foresight model, in which all intervals are optimised simultaneously using actual price data.

      In the example below, simulations and a perfect foresight model are run from t to t+10. Each simulation consists of models with a lookahead horizon of 3 and a binding horizon of 1. The perfect foresight model optimises storage device operation over the entire data period.

      Example of simulation with a lookahead horizon of 3 and a binding horizon of 1

      +Terminology · NEM Storage Under Uncertainty

      Terminology

      Price Data

      All price data is in AUD/MW/hr.

      Forecast

      Forecast data refers to price data compiled from 30-minute pre-dispatch (PD, or PREDISPATCH) and 5-minute pre-dispatch (P5MIN or 5MPD) forecasts.

      30-minute pre-dispatch forecasts run half an hour and one hour prior to real-time (actual run time) are removed as they overlap with the P5MIN horizon.

      Actual

      Actual price data refers to cleared prices for a region as published by AEMO.

      Simulation Components and Periods

      Model

      The storage device operator has information available at decision time $t_0$ (i.e. end of an interval), and, based on an optimisation problem from end of the next interval ($t_1$) to $t_{1 + t_h}$ where $t_h$ is the lookahead horizon, makes decisions for future intervals.

      • One (i.e. $t_1$) or more of the decisions at the start of the model period can be binding. These decisions are fixed and cannot be updated by the next model period (i.e. the next model period is run with the last binding decision interval of the previous model period as the decision time)
      • Remaining decisions in the lookahead horizon are non binding. Decisions for these intervals can be updated by successive model periods in the simulation

      Models are characterised by:

      • StorageModelFormulation, which describe which variables, constraints and/or objective function is incorporated into the optimisation model
      • DegradationModel, which describes how degradation is modelled and simulated

      Simulation

      A simulation is a rolling horizon optimal control problem in which:

      1. At the decision time, initial storage state and price data are inputs into a model of the first lookahead horizon
      2. The model is solved, and certain decisions are considered binding
      3. The next decision time is the last binding interval. The storage state is updated, the lookahead horizon is rolled along, and another model is constructed and solved
      4. This is repeated until the entire simulation period has been simulated

      Simulations can be run with actual price data, or with forecast price data.

      Results from simulations can be compared to a perfect foresight model, in which all intervals are optimised simultaneously using actual price data.

      In the example below, simulations and a perfect foresight model are run from t to t+10. Each simulation consists of models with a lookahead horizon of 3 and a binding horizon of 1. The perfect foresight model optimises storage device operation over the entire data period.

      Example of simulation with a lookahead horizon of 3 and a binding horizon of 1

      diff --git a/dev/variables/index.html b/dev/variables/index.html index 36288d9..fe6bf92 100644 --- a/dev/variables/index.html +++ b/dev/variables/index.html @@ -3,19 +3,19 @@ model::JuMP.Model, times::Vector{Dates.DateTime} ) -> JuMP.Containers.DenseAxisArray{JuMP.VariableRef, 1, Tuple{Vector{Dates.DateTime}}, Tuple{JuMP.Containers._AxisLookup{Dict{Dates.DateTime, Int64}}}} -

      Summary

      Adds binary variable that indicates when the device is charging (i.e. $u_t=1$).

      Arguments

      Methods

      _add_variable_charge_state!(model, times)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/variables.jl:55.

      source
      NEMStorageUnderUncertainty._add_variable_soc!Method
      _add_variable_soc!(
      +

      Summary

      Adds binary variable that indicates when the device is charging (i.e. $u_t=1$).

      Arguments

      • model: JuMP model
      • times: A Vector of DateTimes

      Methods

      _add_variable_charge_state!(model, times)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/variables.jl:55.

      source
      NEMStorageUnderUncertainty._add_variable_soc!Method
      _add_variable_soc!(
           model::JuMP.Model,
           storage::NEMStorageUnderUncertainty.StorageDevice,
           times::Vector{Dates.DateTime}
       ) -> JuMP.Containers.DenseAxisArray
      -

      Summary

      Adds variable that tracks state-of-charge (SoC, $e_t$).

      The following variable bound is applied: $\underline{e} \leq e_t \leq \bar{e}$, where the limits represent the lower and upper SoC limits obtained from storage.

      Arguments

      • model: JuMP model
      • storage: A StorageDevice
      • times: A Vector of DateTimes

      Methods

      _add_variable_soc!(model, storage, times)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/variables.jl:39.

      source
      NEMStorageUnderUncertainty._add_variable_throughput!Method
      _add_variable_throughput!(
      +

      Summary

      Adds variable that tracks state-of-charge (SoC, $e_t$).

      The following variable bound is applied: $\underline{e} \leq e_t \leq \bar{e}$, where the limits represent the lower and upper SoC limits obtained from storage.

      Arguments

      • model: JuMP model
      • storage: A StorageDevice
      • times: A Vector of DateTimes

      Methods

      _add_variable_soc!(model, storage, times)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/variables.jl:39.

      source
      NEMStorageUnderUncertainty._add_variable_throughput!Method
      _add_variable_throughput!(
           model::JuMP.Model,
           storage::NEMStorageUnderUncertainty.StorageDevice,
           times::Vector{Dates.DateTime}
       ) -> JuMP.Containers.DenseAxisArray
      -

      Summary

      Adds variable that tracks throughput in MWh ($d_t$).

      Throughput is defined as the cumulative energy delivered (i.e. discharged) by the device.

      The following variable bound is applied: $d_0 \leq d_t$, where the limit represents the initial throughput obtained from storage.

      Arguments

      • model: JuMP model
      • storage: A StorageDevice
      • times: A Vector of DateTimes

      Methods

      _add_variable_throughput!(model, storage, times)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/variables.jl:73.

      source
      NEMStorageUnderUncertainty._add_variables_power!Method
      _add_variables_power!(
      +

      Summary

      Adds variable that tracks throughput in MWh ($d_t$).

      Throughput is defined as the cumulative energy delivered (i.e. discharged) by the device.

      The following variable bound is applied: $d_0 \leq d_t$, where the limit represents the initial throughput obtained from storage.

      Arguments

      • model: JuMP model
      • storage: A StorageDevice
      • times: A Vector of DateTimes

      Methods

      _add_variable_throughput!(model, storage, times)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/variables.jl:73.

      source
      NEMStorageUnderUncertainty._add_variables_power!Method
      _add_variables_power!(
           model::JuMP.Model,
           storage::NEMStorageUnderUncertainty.StorageDevice,
           times::Vector{Dates.DateTime}
       ) -> Tuple{JuMP.Containers.DenseAxisArray, JuMP.Containers.DenseAxisArray}
      -

      Summary

      Adds variables for charging in MW ($q_t$) and discharging in MW ($p_t$).

      The following variable bounds are applied:

      • $0 \leq p_t \leq \bar{p}$
      • $0 \leq q_t \leq \bar{p}$

      Arguments

      • model: JuMP model
      • storage: A StorageDevice
      • times: A Vector of DateTimes

      Methods

      _add_variables_power!(model, storage, times)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/variables.jl:14.

      source
      +

      Summary

      Adds variables for charging in MW ($q_t$) and discharging in MW ($p_t$).

      The following variable bounds are applied:

      Arguments

      Methods

      _add_variables_power!(model, storage, times)

      defined at /home/runner/work/NEMStorageUnderUncertainty/NEMStorageUnderUncertainty/src/model/variables.jl:14.

      source