3b_inputsLoop.gms 7.43 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ontext
This file is part of Backbone.

Backbone is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Backbone is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Backbone.  If not, see <http://www.gnu.org/licenses/>.
$offtext
17

18
* =============================================================================
19
* --- Update the Forecast Data ------------------------------------------------
20
* =============================================================================
21

22
put log 'ord tSolve: ';
23
put log ord(tSolve):0:0 /;
24
putclose log;
25

26
if (ord(tSolve) >= tForecastNext(mSolve),
27
28
29
30
31
32
33
34

    // Update ts_unit
    if (mTimeseries_loop_read(mSolve, 'ts_unit'),
        put_utility 'gdxin' / '%input_dir%/ts_unit/' tSolve.tl:0 '.gdx';
        execute_load ts_unit_update=ts_unit
        );

    // Update _ts_effUnit
35
    if (mTimeseries_loop_read(mSolve, 'ts_effUnit'),
36
        put_utility 'gdxin' / '%input_dir%/ts_effUnit/' tSolve.tl:0 '.gdx';
37
        execute_load ts_effUnit_update=ts_effUnit
38
        );
39
40

    // Update ts_effGroupUnit
41
    if (mTimeseries_loop_read(mSolve, 'ts_effGroupUnit'),
42
        put_utility 'gdxin' / '%input_dir%/ts_effGroupUnit/' tSolve.tl:0 '.gdx';
43
        execute_load ts_effGroupUnit_update=ts_effGroupUnit
44
        );
45
46

    // Update ts_influx
47
    if (mTimeseries_loop_read(mSolve, 'ts_influx'),
48
        put_utility 'gdxin' / '%input_dir%/ts_influx/' tSolve.tl:0 '.gdx';
49
        execute_load ts_influx_update=ts_influx
50
        );
51
52

    // Update ts_cf
53
    if (mTimeseries_loop_read(mSolve, 'ts_cf'),
54
        put_utility 'gdxin' / '%input_dir%/ts_cf/' tSolve.tl:0 '.gdx';
55
        execute_load ts_cf_update=ts_cf
56
        );
57
58

    // Update ts_reserveDemand
59
    if (mTimeseries_loop_read(mSolve, 'ts_reserveDemand'),
60
        put_utility 'gdxin' / '%input_dir%/ts_reserveDemand/' tSolve.tl:0 '.gdx';
61
        execute_load ts_reserveDemand_update=ts_reserveDemand
62
        );
63
64

    // Update ts_node
65
    if (mTimeseries_loop_read(mSolve, 'ts_node'),
66
        put_utility 'gdxin' / '%input_dir%/ts_node/' tSolve.tl:0 '.gdx';
67
        execute_load ts_node_update=ts_node
68
        );
69
70

    // Update ts_fuelPriceChange
71
    if (mTimeseries_loop_read(mSolve, 'ts_fuelPriceChange'),
72
        put_utility 'gdxin' / '%input_dir%/ts_fuelPriceChange/' tSolve.tl:0 '.gdx';
73
        execute_load ts_fuelPriceChange_update=ts_fuelPriceChange
74
        );
75
76

    // Update ts_unavailability
77
    if (mTimeseries_loop_read(mSolve, 'ts_unavailability'),
78
        put_utility 'gdxin' / '%input_dir%/ts_unavailability/' tSolve.tl:0 '.gdx';
79
        execute_load ts_unavailability_update=ts_unavailability
80
81
        );

82
    // Update the next forecast
83
    tForecastNext(mSolve)
84
        = tForecastNext(mSolve) + mSettings(mSolve, 't_forecastJump');
85
);
86

87
$ontext
88
89
90
    // Define t_latestForecast
    Option clear = t_latestForecast;
    t_latestForecast(tSolve) = yes;
91
92

    // Define updated time window
93
    Option clear = tt_forecast;
94
    tt_forecast(t_full(t))${    ord(t) >= ord(tSolve)
95
                                and ord(t) <= ord(tSolve) + mSettings(mSolve, 't_forecastLengthUnchanging') + mSettings(mSolve, 't_forecastJump')
96
                                }
97
        = yes;
98

99
100
101
    // Define temporary time displacement to reach t_latestForecast
    Option clear = ddt;
    ddt(tt_forecast(t)) = ord(tSolve) - ord(t);
102

103
104
* --- Update Forecast Data ----------------------------------------------------

105
106
107
108
    ts_cf(flowNode(flow, node), f_solve(f), tt_forecast(t))${   ts_forecast(flow, node, t+ddt(t), f, t) // Only update data for capacity factors with forecast. NOTE! This results in problems if the forecast has values of zero!
                                                                and mf(mSolve, f)
                                                                }
        = ts_forecast(flow, node, t+ddt(t), f, t);
109
110

* --- Read the Tertiary Reserve Requirements ----------------------------------
111

112
    put_utility 'gdxin' / '%input_dir%/tertiary/' tSolve.tl:0 '.gdx';
113
    execute_load ts_tertiary;
Topi Rasku's avatar
Topi Rasku committed
114
115
116
117
    ts_reserveDemand(restypeDirectionNode('tertiary', up_down, node), f_solve(f), tt_forecast(t))${ mf(mSolve, f)
                                                                                                    and not mf_realization(mSolve, f)
                                                                                                    and flowNode('wind', node)
                                                                                                    }
118
119
        = ts_tertiary('wind', node, t+ddt(t), up_down, t)
            * sum(flowUnit('wind', unit), p_gnu('elec', node, unit, 'maxGen'));
120

121
$offtext
122

123
124

* --- Improve forecasts -------------------------------------------------------
125
$ontext
126
// !!! TEMPORARY MEASURES !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
127

128
129
if(mSettings(mSolve, 'forecasts') > 0,

130
131
132
133
134
135
136
    // Define updated time window
    Option clear = tt_forecast;
    tt_forecast(t_full(t))${    ord(t) >= ord(tSolve)
                                and ord(t) <= ord(tSolve) + mSettings(mSolve, 't_forecastLengthUnchanging') + mSettings(mSolve, 't_forecastJump')
                                }
        = yes;

137
    // Define updated time window
138
    Option clear = tt;
Topi Rasku's avatar
Topi Rasku committed
139
    tt(tt_forecast(t))${    ord(t) > ord(tSolve)
140
141
                            and ord(t) <= ord(tSolve) + f_improve
                            }
142
        = yes;
143

144
145
146
147
148
149
150
151
152
153
    // Temporary forecast displacement to reach the central forecast
    Option clear = ddf;
    ddf(f_solve(f), tt(t))${ not mf_central(mSolve, f) }
        = sum(mf_central(mSolve, f_), ord(f_) - ord(f));

    // Temporary forecast displacement to reach the realized forecast
    Option clear = ddf_;
    ddf_(f_solve(f), tt(t))${ not mf_realization(mSolve, f) }
        = sum(mf_realization(mSolve, f_), ord(f_) - ord(f));

154
    // Calculate the upper and lower forecasts based on the original central forecast
155
156
157
158
159
    ts_cf(flowNode(flow, node), f_solve(f), tt(t))${    not mf_realization(mSolve, f)
                                                        and not mf_central(mSolve, f)
                                                        }
                = ts_cf(flow, node, f, t) - ts_cf(flow, node, f+ddf(f,t), t);

160
    // Improve forecasts during the dispatch
161
162
    // Improve central capacity factors, linear improvement towards fRealization
    ts_cf(flowNode(flow, node), f_solve(f), tt(t))${    not mf_realization(mSolve, f)
163
                                                        and mf_central(mSolve, f)
164
                                                        }
165
166
167
168
        = (
            (ord(t) - ord(tSolve)) * ts_cf(flow, node, f, t)
            + (f_improve + ord(tSolve) - ord(t)) * ts_cf(flow, node, f+ddf_(f,t), t)
            )
169
                / f_improve;
170
171
172
173
174
175
176

    // Update the upper and lower forecasts based on the improved central forecast
    ts_cf(flowNode(flow, node), f_solve(f), tt(t))${    not mf_realization(mSolve, f)
                                                        and not mf_central(mSolve, f)
                                                        }
        = min(max( ts_cf(flow, node, f, t) + ts_cf(flow, node, f+ddf(f,t), t), 0),1);

177
); // END IF forecasts
178
$offtext