backbone issueshttps://gitlab.vtt.fi/backbone/backbone/-/issues2023-09-19T08:13:28Zhttps://gitlab.vtt.fi/backbone/backbone/-/issues/220multiple input excels2023-09-19T08:13:28ZTomi J. Lindroosmultiple input excelsCurrently the easiest way to add second input file is to manually import it in changes.inc.
Would there be a smoother way? Maybe add a command line prompt for this?Currently the easiest way to add second input file is to manually import it in changes.inc.
Would there be a smoother way? Maybe add a command line prompt for this?https://gitlab.vtt.fi/backbone/backbone/-/issues/219useTimeSeries terminology unclear2023-09-11T09:14:31ZTomi J. LindroosuseTimeSeries terminology unclear`param_gnn('useTimeseriesAvailability') "A flag to use time series form input for availability (empty or 1)"`
`param_unit('useTimeseriesAvailability') "A flag to use availability time series form input for unit parameters whenever possi...`param_gnn('useTimeseriesAvailability') "A flag to use time series form input for availability (empty or 1)"`
`param_unit('useTimeseriesAvailability') "A flag to use availability time series form input for unit parameters whenever possible (empty or 1)" `
`param_unit('useTimeseries') "A flag to use efficiency time series form input for unit parameters whenever possible (empty or 1)" `
The last should be useTimeSeriesEfficiency? Or user would just give 'useTimeSeries' and the model would decide based on input what data is given?v4.0https://gitlab.vtt.fi/backbone/backbone/-/issues/218max starts/stops per year2023-09-11T07:49:35ZTomi J. Lindroosmax starts/stops per yearhttps://gitlab.vtt.fi/backbone/backbone/-/issues/210Add sample dimension to result tables2023-10-25T10:06:05ZTomi J. LindroosAdd sample dimension to result tablesv4.0https://gitlab.vtt.fi/backbone/backbone/-/issues/207Add rate-of-change-of-frequency to results2023-08-10T09:46:00ZNiina HelistöAdd rate-of-change-of-frequency to resultsIt would be nice to store in the results the RoCoF due to a critical unit or connection failure.It would be nice to store in the results the RoCoF due to a critical unit or connection failure.SarahSarahhttps://gitlab.vtt.fi/backbone/backbone/-/issues/206Rolling of samples2023-06-27T10:50:32ZNiina HelistöRolling of samplesPotential bug to be checked and fixed: It seems that in 3b_periodicLoop.gms, samples sometimes move with the rolling horizon and sometimes they don't. In 3b_periodicLoop.gms, sft is determined as follows:
```
// Loop over defined sample...Potential bug to be checked and fixed: It seems that in 3b_periodicLoop.gms, samples sometimes move with the rolling horizon and sometimes they don't. In 3b_periodicLoop.gms, sft is determined as follows:
```
// Loop over defined samples
loop(msf(mSolve, s, f)$msStart(mSolve, s),
sft(s, ft(f, t))${ord(t) > msStart(mSolve, s)
and ord(t) <= msEnd(mSolve, s)
} = yes;
);
```
whereas mst_start and mst_end are determined as follows:
```
// Sample start and end intervals
mst_start(mst(mSolve, s, t))$[ord(t) - t_solveFirst = msStart(mSolve, s)] = yes;
loop(ms(mSolve, s),
loop(t_active(t)$[ord(t) - t_solveFirst = msEnd(mSolve, s)],
mst_end(mSolve, s, t + dt(t)) = yes;
);
);
// If the last interval of a sample is in mft_lastSteps, the method above does not work
mst_end(mst(mSolve, s, t))${sum(f_solve, mft_lastSteps(mSolve, f_solve, t))} = yes;
```
There can also be problems when using multi-sample models with a rolling horizon (#200).https://gitlab.vtt.fi/backbone/backbone/-/issues/194transfer links as separately modelled link domain2022-12-01T13:21:05ZTomi J. Lindroostransfer links as separately modelled link domainCurrent backbone can have only one transferlink between nodes. This should be updated for improved modelling of transfer links. Maybe the best solution would be to add new `link` domain similarly to units?
Related to issues
* https://gi...Current backbone can have only one transferlink between nodes. This should be updated for improved modelling of transfer links. Maybe the best solution would be to add new `link` domain similarly to units?
Related to issues
* https://gitlab.vtt.fi/backbone/backbone/-/issues/190
* https://gitlab.vtt.fi/backbone/backbone/-/issues/83
* https://gitlab.vtt.fi/backbone/backbone/-/issues/111
* https://gitlab.vtt.fi/backbone/backbone/-/issues/149Wishlisthttps://gitlab.vtt.fi/backbone/backbone/-/issues/192emissioncap for units, energymax for nodes2022-12-01T13:13:25ZTomi J. Lindroosemissioncap for units, energymax for nodesThe current emissioncap is written for nodes, and the version for units is missing
The current energymax is written for units, and the version for nodes is missingThe current emissioncap is written for nodes, and the version for units is missing
The current energymax is written for units, and the version for nodes is missingv4.0https://gitlab.vtt.fi/backbone/backbone/-/issues/190Transfer link parameters and their names2022-12-01T13:21:48ZTomi J. LindroosTransfer link parameters and their namesCertain transfer link parameters and their should be aligned with unit parameter names for clarity reasons
* variableTransCost vs vomCosts
* transfer links do not have fom cost
* invCost vs invCost**s**
* availabilityCapacityMargin missi...Certain transfer link parameters and their should be aligned with unit parameter names for clarity reasons
* variableTransCost vs vomCosts
* transfer links do not have fom cost
* invCost vs invCost**s**
* availabilityCapacityMargin missing from transfer linksv4.0https://gitlab.vtt.fi/backbone/backbone/-/issues/181time series looping ts_gnn_ seems to work differently than other looped time ...2022-08-25T05:04:03ZTomi J. Lindroostime series looping ts_gnn_ seems to work differently than other looped time seriests_gnn_ contains values for all historical hours, e.g. below a screenshout from day 7 solve in
ts_gnn_
![image](/uploads/1b1579697b28fbd304ce1943b92452da/image.png)
and ts_cf_
![image](/uploads/5bd15e2436e2ccd5892376533bc61a84/image.p...ts_gnn_ contains values for all historical hours, e.g. below a screenshout from day 7 solve in
ts_gnn_
![image](/uploads/1b1579697b28fbd304ce1943b92452da/image.png)
and ts_cf_
![image](/uploads/5bd15e2436e2ccd5892376533bc61a84/image.png)
ts_gnn_ also remembers calculated future values
![image](/uploads/dee3f09c1d850782abf3eff7da354265/image.png)
whereas ts_cf_ contains only values in current tt_aggregate
![image](/uploads/6869e80053fe4ea0fb1c2b0d47f7f671/image.png)
All this can be fixed by clearing ts_gnn_ in periodic looping, but that did alter the value of objective function and I reverted that fix.https://gitlab.vtt.fi/backbone/backbone/-/issues/180read all files from backbone.gms2022-12-01T13:23:59ZTomi J. Lindroosread all files from backbone.gmsCurrently some files are read under other files, e.g. 1e_inputs calls scenChanges.gms and changes.inc
All files that are read by default should be called by backbone.gms to make the model easier to read and checkCurrently some files are read under other files, e.g. 1e_inputs calls scenChanges.gms and changes.inc
All files that are read by default should be called by backbone.gms to make the model easier to read and checkv4.0https://gitlab.vtt.fi/backbone/backbone/-/issues/174Possible mistake in calculating variable costs in the result outputs2023-12-14T08:49:43ZJuha KiviluomaPossible mistake in calculating variable costs in the result outputsErkka has had trouble getting expected results in his hydro power simulations. Based on those results, the problem could be in the variable costs. So, I tried to run through the numbers and it appears that there is a mistake in the way t...Erkka has had trouble getting expected results in his hydro power simulations. Based on those results, the problem could be in the variable costs. So, I tried to run through the numbers and it appears that there is a mistake in the way the variable costs are calculated for unit inputs. The code is from tag v2.0 that Erkka is using.
First, here are the assumptions
```
vomCost = 1
p_price = 10
p_unitEmissionCost = 100
p_stepLength = 1
case a) v_gen for input node = 1
case b) v_gen for input node = -1
```
Then how objective function calculates - including pre-processing
```
From 3c_inputsLoop.gms:
// Node price time series
ts_vomCost_(gnu(grid, node, unit), tt_interval(t))
= + p_gnu(grid, node, unit, 'vomCosts')
// input node cost
+ (
+ p_price(node, 'price')$p_price(node, 'useConstant')
+ sum(tt_aggcircular(t, t_), ts_price(node, t_))$p_price(node, 'useTimeSeries')
/ mInterval(mSolve, 'stepsPerInterval', counter)
)$gnu_input(grid, node, unit)
// output node cost (if price > 0 --> ts_vomCost_ < 0, i.e. considered as revenue)
- (
+ p_price(node, 'price')$p_price(node, 'useConstant')
+ sum(tt_aggcircular(t, t_), ts_price(node, t_))$p_price(node, 'useTimeSeries')
/ mInterval(mSolve, 'stepsPerInterval', counter)
)$gnu_output(grid, node, unit)
// emission cost
+ sum(emission$p_unitEmissionCost(unit, node, emission), // Emission taxes
+ p_unitEmissionCost(unit, node, emission)
); // END sum(emission)
With my example data:
a & b)
= 1 + 10 + 100
= 111
From 2c_objective.gms:
+ p_msft_probability(m, s, f, t)
* p_s_discountFactor(s) // Discount costs
* [
// Time step length dependent costs
+ p_stepLength(m, f, t)
* [
// Variable O&M costs for inputs
- sum(gnuft(grid, node, unit, f, t)$gnu_input(grid, node, unit),
+ v_gen(grid, node, unit, s, f, t)
* ts_vomCost_(grid, node, unit, t)
) // END sum(gnuft)
// Variable O&M costs
+ sum(gnuft(grid, node, unit, f, t)$gnu_output(grid, node, unit),
+ v_gen(grid, node, unit, s, f, t)
* ts_vomCost_(grid, node, unit, t)
) // END sum(gnuft)
With my example data:
a)
= p_msft_probability (assume 1)
* p_s_discountFactor (assume 1) (SIDE NOTE: THIS IS NOT IN THE OUTPUT VARIABLE COST CALCULATIONS!)
* 1 (p_stepLength)
* - 1 (v_gen for input)
* 111
= -111
b)
= 1 (p_msft_probability)
* 1 (p_s_discountFactor)
* 1 (p_stepLength)
* - -1 (v_gen for input)
* 111
= +111
```
Then based on the result calculations:
```
// Unit generation and consumption
r_gen(gnuft(grid, node, unit, f, startp(t)))$sft_realized(s, f, t)
= v_gen.l(grid, node, unit, s, f, t)
;
a) 1
b) -1
// for performance, get rid of any zeros in r_gen and r_reserve. Many zero values missing anyway.
r_gen(gnu, f, t)$((r_gen(gnu, f, t)=0)$r_gen(gnu, f, t))=0;
// Variable O&M costs
r_gnuVOMCost(gnu(grid, node, unit), ft_realizedNoReset(f,startp(t)))
= 1e-6 // Scaling to MEUR
* p_stepLengthNoReset(m, f, t)
* abs(r_gen(grid, node, unit, f, t))
* p_gnu(grid, node, unit, 'vomCosts');
a & b)
= 1 * 1 * 1
= 1
// Fuel and emission costs during normal operation
// Note that this result calculation uses ts_price directly while the
// objective function uses ts_price average over the interval. There can
// be differences if realized intervals contain several time steps.
r_uFuelEmissionCost(gnu(grid, node, unit), ft_realizedNoReset(f,startp(t)))
= 1e-6 // Scaling to MEUR
* p_stepLengthNoReset(m, f, t)
* abs(r_gen(grid, node, unit, f, t))
* [ + p_price(node, 'price')${p_price(node, 'useConstant') and gnu_input(grid, node, unit)}
+ ts_price(node, t)${p_price(node, 'useTimeSeries') and gnu_input(grid, node, unit)}
- p_price(node, 'price')${p_price(node, 'useConstant') and gnu_output(grid, node, unit)}
- ts_price(node, t)${p_price(node, 'useTimeSeries') and gnu_output(grid, node, unit)}
// Emission costs
+ sum(emission, p_unitEmissionCost(unit, node, emission))
];
a & b)
= 1 * 1 * (10 + 100)
= 111
vom + fuel/emission = 111
```
So, in the outputs, the result is always 111, but in objective function positive v_gen leads to -111 while negative v_gen leads to +111. I hope Erkka can check my calculations. The same problem is probably also on the output side - negative v_gen becomes positive in results.https://gitlab.vtt.fi/backbone/backbone/-/issues/168Improving naming and definition of sets/parameters2022-12-01T13:26:58ZTomi J. LindroosImproving naming and definition of sets/parametersThe naming logic of sets/parameters is a bit ambiguous or illogical in some cases.
* ~~suft(effSelector, unit, f, t) and sft(s, f, t)~~
<details><summary>effGroup(effSelector) is not a group as defined in 'group' set. Typically sets...The naming logic of sets/parameters is a bit ambiguous or illogical in some cases.
* ~~suft(effSelector, unit, f, t) and sft(s, f, t)~~
<details><summary>effGroup(effSelector) is not a group as defined in 'group' set. Typically sets named e.g. sGroup(s, group)</summary>
* effGroupSelector(effSelector, effSelector)
* effLevelGroupUnit(effLevel, effSelector, unit)
* p_effGroupUnit(effGroup, unit, param_eff)
* ts_effUnit(effSelector, unit, effSelector, param_eff, f, t)
* ts_effGroupUnit(effSelector, unit, param_eff, f, t)
</details>
* up_down(param_policy) / up, down /; as a subset leads to unintuitive definition of reserve capabilities and requirementshttps://gitlab.vtt.fi/backbone/backbone/-/issues/164Integration with pyam-iamc2021-12-07T08:25:42ZJuha KiviluomaIntegration with pyam-iamcpyam-iamc provides a web-interface for browsing results. This can be especially useful for policy related work where there is an audience for the results that would like to explore the results themselves. It should be quite straightforwa...pyam-iamc provides a web-interface for browsing results. This can be especially useful for policy related work where there is an audience for the results that would like to explore the results themselves. It should be quite straightforward to make an exporter in Spine Toolbox for this purpose when someone has the need for it. More info at: https://pyam-iamc.readthedocs.io/en/stable/Wishlisthttps://gitlab.vtt.fi/backbone/backbone/-/issues/150Custom increment for the z index2022-12-01T12:32:58Zjussi ikäheimoCustom increment for the z indexImplement a custom increment for the z (candidate period) index so that it is not necessarily ordered in time according to natural numbers. Thus there would be a parameter dz, which tells the increment, similarly to dt.Implement a custom increment for the z (candidate period) index so that it is not necessarily ordered in time according to natural numbers. Thus there would be a parameter dz, which tells the increment, similarly to dt.Wishlistjussi ikäheimojussi ikäheimohttps://gitlab.vtt.fi/backbone/backbone/-/issues/149Add results table for N-1 reserves from transfer links2022-12-01T13:20:36ZTomi J. LindroosAdd results table for N-1 reserves from transfer linksr_resDemandLargestInfeedTransfer missing from the results filer_resDemandLargestInfeedTransfer missing from the results filev4.0https://gitlab.vtt.fi/backbone/backbone/-/issues/143Bi-directional diffusion co-efficient2022-12-01T12:32:09ZJuha KiviluomaBi-directional diffusion co-efficientCurrently there is only one co-efficient for a diffusion between two nodes. However, this co-efficient can be different in the two different directions in some applications. @danakirchem has implemented this in her wastewater branch.Currently there is only one co-efficient for a diffusion between two nodes. However, this co-efficient can be different in the two different directions in some applications. @danakirchem has implemented this in her wastewater branch.WishlistJuha KiviluomaJuha Kiviluomahttps://gitlab.vtt.fi/backbone/backbone/-/issues/142Storage units providing reserve during several time steps2023-11-06T09:56:34ZNiina HelistöStorage units providing reserve during several time stepsShould more time intervals of reserve provision be considered in the state constraints? For example, should a unit with storage be able to provide upward reserve for three (or 12 or 8760) consecutive hours without getting empty?Should more time intervals of reserve provision be considered in the state constraints? For example, should a unit with storage be able to provide upward reserve for three (or 12 or 8760) consecutive hours without getting empty?Wishlisthttps://gitlab.vtt.fi/backbone/backbone/-/issues/128Get rid of p_gnReserves2022-12-01T13:22:42ZJuha KiviluomaGet rid of p_gnReservesReserves are nowadays based on p_groupReserves. However, we are still using p_gnReserves in the code for convenience. It is obfuscating to have p_gnReserves in the debug.gdx and in the code - we should replace all cases of p_gnReserves w...Reserves are nowadays based on p_groupReserves. However, we are still using p_gnReserves in the code for convenience. It is obfuscating to have p_gnReserves in the debug.gdx and in the code - we should replace all cases of p_gnReserves with something more transparent (might be enough to check if the unit can provide reserve).v4.0Juha KiviluomaJuha Kiviluomahttps://gitlab.vtt.fi/backbone/backbone/-/issues/126Different values for boundStart and boundEnd not possible2022-12-01T12:35:00ZDana KirchemDifferent values for boundStart and boundEnd not possibleIf flags are selected in p_gn (e.g. boundStart, boundEnd, boundAll,...), values can only be assigned uniformly via 'reference' in p_gnBoundaryPropertiesForStates. It should be possible to assign different reference values.If flags are selected in p_gn (e.g. boundStart, boundEnd, boundAll,...), values can only be assigned uniformly via 'reference' in p_gnBoundaryPropertiesForStates. It should be possible to assign different reference values.v4.0Dana KirchemDana Kirchem