Examples
To use REopt you will need to have a solver installed. REopt.jl has been tested with Xpress, Cbc, and CPLEX solvers, but it should work with other Linear Progam solvers (for PV and Storage scenarios) or Mixed Integer Linear Program solvers (for scenarios with outages and/or Generators).
Basic
A REopt optimization can be run with three lines:
using REopt, JuMP, Cbc
m = Model(Cbc.Optimizer)
results = run_reopt(m, "test/scenarios/pv_storage.json")
The scenario.json
contains a Dict
of inputs. For more on the scenario.json
see the REopt Inputs section and find examples at test/scenarios. For more examples of how to run REopt, see test_with_cplex.jl
and test_with_xpress.jl
To compare the optimized case to a "Business-as-usual" case (with existing techs or no techs), you can run the BAUScenario scenario in parallel by providing two JuMP.Model
s like so:
m1 = Model(Cbc.Optimizer)
m2 = Model(Cbc.Optimizer)
results = run_reopt([m1,m2], "./scenarios/pv_storage.json")
When the BAUScenario is included as shown above, the outputs will include comparative results such as the net present value and emissions reductions of the optimal system as compared to the BAU Scenario.
Note that while two JuMP models are needed to run the BAU
and optimized cases in parallel, only a single input dict is used. The BAUScenario will be automatically created based on the input dict.
Advanced
Modifying the mathematical model
Using the build_reopt!
method and JuMP
methods one can modify the REopt model before optimizing. In the following example we add a cost for curtailed PV power.
using Xpress
using JuMP
using REopt
m = JuMP.Model(Xpress.Optimizer)
p = REoptInputs("scenarios/pv_storage.json");
build_reopt!(m, p)
#=
replace the original objective, which is to Min the Costs,
with the Costs + 100 * (total curtailed PV power)
=#
JuMP.@objective(m, Min, m[:Costs] + 100 * sum(m[:dvCurtail]["PV", ts] for ts in p.time_steps));
JuMP.optimize!(m) # normally this command is called in run_reopt
results = reopt_results(m, p)
One can also add variables and constraints to the model before optimizing using the JuMP commands.
The JuMP.
prefixes are not necessary. We include them in the example to show which commands come from JuMP.