Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Specify domain of decommission variables #833

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
278 changes: 206 additions & 72 deletions src/create-model.jl
Original file line number Diff line number Diff line change
Expand Up @@ -668,27 +668,6 @@ function create_model(
] |> unique for y in V_all
)

# Create sets of tuples for decommission variables/accumulated capacity of compact method
decommission_set_using_compact_method = [
(a, y, v) for a in decommissionable_assets_using_compact_method for y in Y for
v in V_all if starting_year_using_compact_method[y, a] ≤ v < y && ((
(v in V_non_milestone && a in existing_assets_by_year_using_compact_method[v]) || (v in Y)
))
]

accumulated_set_using_compact_method = [
(a, y, v) for a in decommissionable_assets_using_compact_method for y in Y for
v in V_all if starting_year_using_compact_method[y, a] ≤ v ≤ y && ((
(v in V_non_milestone && a in existing_assets_by_year_using_compact_method[v]) || (v in Y)
))
]

# Create a lookup set for compact method
accumulated_set_using_compact_method_lookup = Dict(
(a, y, v) => idx for
(idx, (a, y, v)) in enumerate(accumulated_set_using_compact_method)
)

# Create subsets of storage assets
Ase = Dict(y => As ∩ filter_graph(graph, A, true, :storage_method_energy, y) for y in Y)
Asb = Dict(
Expand Down Expand Up @@ -744,27 +723,27 @@ function create_model(

### Investment variables
@variable(model, 0 ≤ assets_investment[y in Y, a in Ai[y]]) #number of installed asset units [N]
@variable(
model,
0 ≤ assets_decommission_simple_method[
y in Y,
a in decommissionable_assets_using_simple_method,
]
) #number of decommission asset units [N]
@variable(
model,
0 <=
assets_decommission_compact_method[(a, y, v) in decommission_set_using_compact_method]
) #number of decommission asset units [N]
# @variable(
# model,
# 0 ≤ assets_decommission_simple_method[
# y in Y,
# a in decommissionable_assets_using_simple_method,
# ]
# ) #number of decommission asset units [N]
# @variable(
# model,
# 0 <=
# assets_decommission_compact_method[(a, y, v) in decommission_set_using_compact_method]
# ) #number of decommission asset units [N]

@variable(model, 0 ≤ assets_investment_energy[y in Y, a in Ase[y]∩Ai[y]]) #number of installed asset units for storage energy [N]
@variable(
model,
0 ≤ assets_decommission_energy_simple_method[
y in Y,
a in Ase[y]∩decommissionable_assets_using_simple_method,
]
) #number of decommission asset energy units [N]
# @variable(
# model,
# 0 ≤ assets_decommission_energy_simple_method[
# y in Y,
# a in Ase[y]∩decommissionable_assets_using_simple_method,
# ]
# ) #number of decommission asset energy units [N]

### Unit commitment variables
units_on =
Expand Down Expand Up @@ -812,19 +791,19 @@ function create_model(
end
end

for y in Y, a in decommissionable_assets_using_simple_method
if graph[a].investment_integer[y]
JuMP.set_integer(assets_decommission_simple_method[y, a])
end
end
# for y in Y, a in decommissionable_assets_using_simple_method
# if graph[a].investment_integer[y]
# JuMP.set_integer(assets_decommission_simple_method[y, a])
# end
# end

for (a, y, v) in decommission_set_using_compact_method
# We don't do anything with existing units (because it can be integers or non-integers)
if !(v in V_non_milestone && a in existing_assets_by_year_using_compact_method[y]) &&
graph[a].investment_integer[y]
JuMP.set_integer(assets_decommission_compact_method[(a, y, v)])
end
end
# for (a, y, v) in decommission_set_using_compact_method
# # We don't do anything with existing units (because it can be integers or non-integers)
# if !(v in V_non_milestone && a in existing_assets_by_year_using_compact_method[y]) &&
# graph[a].investment_integer[y]
# JuMP.set_integer(assets_decommission_compact_method[(a, y, v)])
# end
# end

for y in Y, (u, v) in Fi[y]
if graph[u, v].investment_integer[y]
Expand All @@ -838,11 +817,11 @@ function create_model(
end
end

for y in Y, a in Ase[y] ∩ decommissionable_assets_using_simple_method
if graph[a].investment_integer_storage_energy[y]
JuMP.set_integer(assets_decommission_energy_simple_method[y, a])
end
end
# for y in Y, a in Ase[y] ∩ decommissionable_assets_using_simple_method
# if graph[a].investment_integer_storage_energy[y]
# JuMP.set_integer(assets_decommission_energy_simple_method[y, a])
# end
# end

### Binary Charging Variables
df_is_charging.use_binary_storage_method = [
Expand Down Expand Up @@ -1032,14 +1011,39 @@ function create_model(
starting_year_using_simple_method[(y, a)] ≤ yy ≤ y
)
)

# Definitions for decommission simple method
condition_domain_assets_decommission_simple_method(a, y) =
accumulated_initial_units[a, y] != 0 ||
!isempty(accumulated_investment_units_using_simple_method[a, y])
domain_assets_decommission_simple_method = [
(y, a) for y in Y for a in decommissionable_assets_using_simple_method if
condition_domain_assets_decommission_simple_method(a, y)
]

@variable(
model,
0 ≤
assets_decommission_simple_method[(y, a) in domain_assets_decommission_simple_method]
)
for (y, a) in domain_assets_decommission_simple_method
if graph[a].investment_integer[y]
JuMP.set_integer(assets_decommission_simple_method[(y, a)])
end
end

domain_accumulated_decommission_units_using_simple_method = [
(a, y) for y in Y for a in decommissionable_assets_using_simple_method if
(y, a) in domain_assets_decommission_simple_method
]
@expression(
model,
accumulated_decommission_units_using_simple_method[
a ∈ decommissionable_assets_using_simple_method,
y in Y,
],
accumulated_decommission_units_using_simple_method[(
a,
y,
) in domain_accumulated_decommission_units_using_simple_method],
sum(
assets_decommission_simple_method[yy, a] for
assets_decommission_simple_method[(yy, a)] for
yy in Y if starting_year_using_simple_method[(y, a)] ≤ yy ≤ y
)
)
Expand All @@ -1048,10 +1052,94 @@ function create_model(
accumulated_units_simple_method[a ∈ decommissionable_assets_using_simple_method, y ∈ Y],
accumulated_initial_units[a, y] +
accumulated_investment_units_using_simple_method[a, y] -
accumulated_decommission_units_using_simple_method[a, y]
if condition_domain_assets_decommission_simple_method(a, y)
accumulated_decommission_units_using_simple_method[(a, y)]
else
0.0
end
)
# for y in Y, a in decommissionable_assets_using_simple_method
# @show y, a
# @show condition_domain_assets_decommission_simple_method(a, y)
# if condition_domain_assets_decommission_simple_method(a, y)
# @variable(model, 0 ≤ assets_decommission_simple_method[y, a])
# @show model[:assets_decommission_simple_method]
# if graph[a].investment_integer[y]
# JuMP.set_integer(assets_decommission_simple_method[y, a])
# end
# @expression(
# model,
# accumulated_decommission_units_using_simple_method[a, y],
# sum(
# assets_decommission_simple_method[yy, a] for
# yy in Y if starting_year_using_simple_method[(y, a)] ≤ yy ≤ y
# )
# )
# @expression(
# model,
# accumulated_units_simple_method[a, y],
# accumulated_initial_units[a, y] +
# accumulated_investment_units_using_simple_method[a, y] -
# accumulated_decommission_units_using_simple_method[a, y]
# )
# else
# @expression(
# model,
# accumulated_units_simple_method[a, y],
# accumulated_initial_units[a, y] +
# accumulated_investment_units_using_simple_method[a, y]
# )
# end
# end

### Expressions for multi-year investment compact method

# Definitions for decommission compact method

cond1(a, y, v) = a in existing_assets_by_year_using_compact_method[v]
cond2(a, y, v) = v in Y && a in investable_assets_using_compact_method[v]

# This extra conditions ensures decommission only exists when there is either initial capacity or investments
condition_domain_assets_decommission_compact_method(a, y, v) =
!cond1(a, y, v) || !cond2(a, y, v)

# Create sets of tuples for decommission variables/accumulated capacity of compact method
decommission_set_using_compact_method = [
(a, y, v) for a in decommissionable_assets_using_compact_method for y in Y for
v in V_all if starting_year_using_compact_method[y, a] ≤ v < y &&
((
(v in V_non_milestone && a in existing_assets_by_year_using_compact_method[v]) || (v in Y)
)) &&
condition_domain_assets_decommission_compact_method(a, y, v)
]

accumulated_set_using_compact_method = [
(a, y, v) for a in decommissionable_assets_using_compact_method for y in Y for
v in V_all if starting_year_using_compact_method[y, a] ≤ v ≤ y && ((
(v in V_non_milestone && a in existing_assets_by_year_using_compact_method[v]) || (v in Y)
))
]

# Create a lookup set for compact method
accumulated_set_using_compact_method_lookup = Dict(
(a, y, v) => idx for
(idx, (a, y, v)) in enumerate(accumulated_set_using_compact_method)
)

@variable(
model,
0 <=
assets_decommission_compact_method[(a, y, v) in decommission_set_using_compact_method]
)

for (a, y, v) in decommission_set_using_compact_method
# We don't do anything with existing units (because it can be integers or non-integers)
if !(v in V_non_milestone && a in existing_assets_by_year_using_compact_method[y]) &&
graph[a].investment_integer[y]
JuMP.set_integer(assets_decommission_compact_method[(a, y, v)])
end
end

@expression(
model,
accumulated_decommission_units_using_compact_method[(
Expand All @@ -1064,8 +1152,7 @@ function create_model(
yy in Y if v ≤ yy ≤ y && (a, yy, v) in decommission_set_using_compact_method
)
)
cond1(a, y, v) = a in existing_assets_by_year_using_compact_method[v]
cond2(a, y, v) = v in Y && a in investable_assets_using_compact_method[v]

accumulated_units_compact_method =
model[:accumulated_units_compact_method] = JuMP.AffExpr[
if cond1(a, y, v) && cond2(a, y, v)
Expand Down Expand Up @@ -1119,19 +1206,62 @@ function create_model(

## Expressions for storage assets
@timeit to "add_expressions_for_storage" begin
@expression(
accumulated_initial_storage_units = @expression(
model,
accumulated_energy_units_simple_method[
accumulated_initial_storage_units[
y ∈ Y,
a ∈ Ase[y]∩decommissionable_assets_using_simple_method,
],
sum(values(graph[a].initial_storage_units[y])) + sum(
sum(values(graph[a].initial_storage_units[y]))
)

### Expressions for multi-year investment simple method
accumulated_investment_storage_units_using_simple_method = @expression(
model,
accumulated_investment_storage_units_using_simple_method[
y ∈ Y,
a ∈ Ase[y]∩decommissionable_assets_using_simple_method,
],
sum(
assets_investment_energy[yy, a] for
yy in Y if a ∈ (Ase[yy] ∩ investable_assets_using_simple_method[yy]) &&
starting_year_using_simple_method[(y, a)] ≤ yy ≤ y
) - sum(
assets_decommission_energy_simple_method[yy, a] for
yy in Y if a ∈ Ase[yy] && starting_year_using_simple_method[(y, a)] ≤ yy ≤ y
)
)

# Definitions for decommission energy simple method
condition_domain_storage_decommission_simple_method(a, y) =
accumulated_initial_storage_units[y, a] != 0 ||
!isempty(accumulated_investment_storage_units_using_simple_method[y, a])
domain_storage_decommission_simple_method = [
(y, a) for y in Y for a in Ase[y] ∩ decommissionable_assets_using_simple_method if
condition_domain_storage_decommission_simple_method(a, y)
]
@variable(
model,
0 ≤ assets_decommission_energy_simple_method[(
y,
a,
) in domain_storage_decommission_simple_method]
)

for (y, a) in domain_storage_decommission_simple_method
if graph[a].investment_integer_storage_energy[y]
JuMP.set_integer(assets_decommission_energy_simple_method[(y, a)])
end
end

@expression(
model,
accumulated_energy_units_simple_method[
y ∈ Y,
a ∈ Ase[y]∩decommissionable_assets_using_simple_method,
],
accumulated_initial_storage_units[y, a] +
accumulated_investment_units_using_simple_method[a, y] - sum(
assets_decommission_energy_simple_method[(yy, a)] for
yy in Y if (yy, a) in domain_storage_decommission_simple_method &&
starting_year_using_simple_method[(y, a)] ≤ yy ≤ y
)
)
@expression(
Expand All @@ -1149,7 +1279,11 @@ function create_model(
graph[a].capacity *
(
accumulated_investment_units_using_simple_method[a, y] -
accumulated_decommission_units_using_simple_method[a, y]
if (y, a) in domain_assets_decommission_simple_method
accumulated_decommission_units_using_simple_method[(a, y)]
else
0.0
end
)
else
0.0
Expand Down
Loading
Loading