diff --git a/src/model/formulations/Gar1962/status.jl b/src/model/formulations/Gar1962/status.jl index 7228e42..9e7f61a 100644 --- a/src/model/formulations/Gar1962/status.jl +++ b/src/model/formulations/Gar1962/status.jl @@ -12,7 +12,6 @@ function _add_status_vars!( model::JuMP.Model, g::Unit, formulation_status_vars::Gar1962.StatusVars, - ALWAYS_CREATE_VARS = false )::Nothing is_on = _init(model, :is_on) switch_on = _init(model, :switch_on) @@ -65,9 +64,17 @@ function _add_status_vars!( end end - if ALWAYS_CREATE_VARS - # If variables are created, use initial conditions to fix some values - if t == 1 + # Use initial conditions and whether a unit must run to fix variables + if FIX_VARS + # Fix variables using fix function + if g.must_run[t] + # If the generator _must_ run, then it is obviously on and cannot be switched off + # In the first time period, force unit to switch on if was off before + # Otherwise, unit is on, and will never turn off, so will never need to turn on + fix(is_on[g.name, t], 1.0; force = true) + fix(switch_on[g.name, t], (t == 1 ? 1.0 - _is_initially_on(g) : 0.0); force = true) + fix(switch_off[g.name, t], 0.0; force = true) + elseif t == 1 if _is_initially_on(g) # Generator was on (for g.initial_status time periods), # so cannot be more switched on until the period after the first time it can be turned off @@ -78,30 +85,20 @@ function _add_status_vars!( fix(switch_off[g.name, 1], 0.0; force = true) end end - - if g.must_run[t] - # If the generator _must_ run, then it is obviously on and cannot be switched off - # In the first time period, force unit to switch on if was off before - # Otherwise, unit is on, and will never turn off, so will never need to turn on - fix(is_on[g.name, t], 1.0; force = true) - fix(switch_on[g.name, t], (t == 1 ? 1.0 - _is_initially_on(g) : 0.0); force = true) - fix(switch_off[g.name, t], 0.0; force = true) - end else - # If vars are not created, then replace them by a constant - if t == 1 + # Add explicit constraint if !FIX_VARS + if g.must_run[t] + is_on[g.name, t] = 1.0 + switch_on[g.name, t] = (t == 1 ? 1.0 - _is_initially_on(g) : 0.0) + switch_off[g.name, t] = 0.0 + elseif t == 1 if _is_initially_on(g) switch_on[g.name, t] = 0.0 else switch_off[g.name, t] = 0.0 end end - if g.must_run[t] - is_on[g.name, t] = 1.0 - switch_on[g.name, t] = (t == 1 ? 1.0 - _is_initially_on(g) : 0.0) - switch_off[g.name, t] = 0.0 - end - end # check if ALWAYS_CREATE_VARS + end end return end diff --git a/src/model/formulations/base/system.jl b/src/model/formulations/base/system.jl index 46cbfa7..18a3e4b 100644 --- a/src/model/formulations/base/system.jl +++ b/src/model/formulations/base/system.jl @@ -70,7 +70,7 @@ function _add_reserve_eqs!(model::JuMP.Model)::Nothing eq_min_reserve = _init(model, :eq_min_reserve) instance = model[:instance] for t in 1:instance.time - # Equation (68) in Kneuven et al. (2020) + # Equation (68) in Knueven et al. (2020) # As in Morales-España et al. (2013a) # Akin to the alternative formulation with max_power_avail # from Carrión and Arroyo (2006) and Ostrowski et al. (2012) diff --git a/src/model/formulations/base/unit.jl b/src/model/formulations/base/unit.jl index 9015c9d..5eba3d9 100644 --- a/src/model/formulations/base/unit.jl +++ b/src/model/formulations/base/unit.jl @@ -247,6 +247,10 @@ Variables * `is_on` * `switch_off` * `switch_on` +<<<<<<< HEAD +======= + +>>>>>>> c8bf25f (Documented reserve shortfall, soved comments on variables/constraints to structs.jl files, simplified loops, removed extra comments, started replacement of constant-subsitution with @constraint (with option to use fix).) Constraints ---