Skip to content

Commit 4159ed1

Browse files
authored
Merge pull request #890 from EnergySystemsModellingLab/improve-asset-decommission-behaviour
Improve asset decommission to make more sense by enforcing decommission year == min(max decommission year, requested decommission year) Add a test for both cases where requested decommission year> max and requested decommission year < max
2 parents fe52b59 + dfebd67 commit 4159ed1

5 files changed

Lines changed: 49 additions & 26 deletions

File tree

src/asset.rs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ impl Asset {
453453
self.state = AssetState::Decommissioned {
454454
id,
455455
agent_id,
456-
decommission_year,
456+
decommission_year: decommission_year.min(self.max_decommission_year()),
457457
};
458458
}
459459

@@ -867,7 +867,7 @@ mod tests {
867867
assert_error, asset, commodity_id, process, process_parameter_map, region_id, time_slice,
868868
};
869869
use crate::process::{
870-
FlowType, Process, ProcessActivityLimitsMap, ProcessFlow, ProcessFlowsMap, ProcessID,
870+
FlowType, Process, ProcessActivityLimitsMap, ProcessFlow, ProcessFlowsMap,
871871
ProcessParameter, ProcessParameterMap,
872872
};
873873
use crate::region::RegionID;
@@ -1473,7 +1473,7 @@ mod tests {
14731473
}
14741474

14751475
#[rstest]
1476-
fn test_asset_state_transitions(process: Process) {
1476+
fn test_asset_commission(process: Process) {
14771477
// Test successful commissioning of Future asset
14781478
let process_rc = Rc::new(process);
14791479
let mut asset1 = Asset::new_future(
@@ -1500,11 +1500,34 @@ mod tests {
15001500
asset2.commission(AssetID(2), "");
15011501
assert!(asset2.is_commissioned());
15021502
assert_eq!(asset2.id(), Some(AssetID(2)));
1503+
}
1504+
1505+
#[rstest]
1506+
#[case::early_decommission_within_lifetime(2024, 2024)]
1507+
#[case::decommission_at_maximum_year(2026, 2025)]
1508+
fn test_asset_decommission(
1509+
#[case] requested_decommission_year: u32,
1510+
#[case] expected_decommission_year: u32,
1511+
process: Process,
1512+
) {
1513+
// Test successful commissioning of Future asset
1514+
let process_rc = Rc::new(process);
1515+
let mut asset = Asset::new_future(
1516+
"agent1".into(),
1517+
Rc::clone(&process_rc),
1518+
"GBR".into(),
1519+
Capacity(1.0),
1520+
2020,
1521+
)
1522+
.unwrap();
1523+
asset.commission(AssetID(1), "");
1524+
assert!(asset.is_commissioned());
1525+
assert_eq!(asset.id(), Some(AssetID(1)));
15031526

15041527
// Test successful decommissioning
1505-
asset1.decommission(2025, "");
1506-
assert!(!asset1.is_commissioned());
1507-
assert_eq!(asset1.decommission_year(), Some(2025));
1528+
asset.decommission(requested_decommission_year, "");
1529+
assert!(!asset.is_commissioned());
1530+
assert_eq!(asset.decommission_year(), Some(expected_decommission_year));
15081531
}
15091532

15101533
#[rstest]

src/fixture.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ pub fn process_parameter_map(region_ids: IndexSet<RegionID>) -> ProcessParameter
126126
capital_cost: MoneyPerCapacity(0.0),
127127
fixed_operating_cost: MoneyPerCapacityPerYear(0.0),
128128
variable_operating_cost: MoneyPerActivity(0.0),
129-
lifetime: 1,
129+
lifetime: 5,
130130
discount_rate: Dimensionless(1.0),
131131
});
132132

tests/data/missing_commodity/assets.csv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ asset_id,process_id,region_id,agent_id,commission_year,decommission_year,capacit
33
1,GASPRC,GBR,A0_GPR,2020,2040,3782.13
44
2,WNDFRM,GBR,A0_ELC,2020,2040,3.964844
55
3,GASCGT,GBR,A0_ELC,2020,2040,2.43
6-
4,RGASBR,GBR,A0_RES,2020,2040,2900.0
7-
5,RELCHP,GBR,A0_RES,2020,2040,399.98
6+
4,RGASBR,GBR,A0_RES,2020,2035,2900.0
7+
5,RELCHP,GBR,A0_RES,2020,2035,399.98
88
6,RBIOBL,GBR,A0_RES,2030,,355.83840587648046
99
7,BIOPLL,GBR,A0_BPL,2030,,449.480091633449
1010
8,BIOPRO,GBR,A0_BPD,2030,,448.35639140436535

tests/data/simple/assets.csv

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ asset_id,process_id,region_id,agent_id,commission_year,decommission_year,capacit
33
1,GASPRC,GBR,A0_GPR,2020,,3782.13
44
2,WNDFRM,GBR,A0_ELC,2020,2040,3.964844
55
3,GASCGT,GBR,A0_ELC,2020,2040,2.43
6-
4,RGASBR,GBR,A0_RES,2020,2040,2900.0
7-
5,RELCHP,GBR,A0_RES,2020,2040,399.98
6+
4,RGASBR,GBR,A0_RES,2020,2035,2900.0
7+
5,RELCHP,GBR,A0_RES,2020,2035,399.98
88
6,RGASBR,GBR,A0_RES,2030,,355.83840587648046
99
7,RGASBR,GBR,A0_RES,2040,,3655.8189696

tests/data/simple/debug_appraisal_results.csv

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,33 @@ milestone_year,run_description,asset_id,process_id,region_id,capacity,unmet_dema
44
2030,ironing out iteration 0; RSHEAT A0_RES round 0,,RGASBR,GBR,365.58184058764806,731.9814967499585,16.969542701647153
55
2030,ironing out iteration 0; RSHEAT A0_RES round 0,,RELCHP,GBR,365.58184058764806,731.9814967499585,32.7615162456679
66
2030,ironing out iteration 0; RSHEAT A0_RES round 1,4,RGASBR,GBR,2900.0,11.119950183640015,12.82090004166788
7-
2030,ironing out iteration 0; RSHEAT A0_RES round 1,,RGASBR,GBR,365.58184058764806,458.2122119206317,19.09314691763651
7+
2030,ironing out iteration 0; RSHEAT A0_RES round 1,,RGASBR,GBR,365.58184058764806,458.2122119206317,19.093146917636513
88
2030,ironing out iteration 0; RSHEAT A0_RES round 1,,RELCHP,GBR,365.58184058764806,458.2122119206317,38.32240163825729
9-
2030,ironing out iteration 0; RSHEAT A0_RES round 2,,RGASBR,GBR,355.83840587648046,0.0,292.9539943035967
9+
2030,ironing out iteration 0; RSHEAT A0_RES round 2,,RGASBR,GBR,355.83840587648046,0.0,292.9539943035968
1010
2030,ironing out iteration 0; RSHEAT A0_RES round 2,,RELCHP,GBR,355.83840587648046,0.0,720.5264354789919
1111
2030,ironing out iteration 0; ELCTRI A0_ELC round 0,2,WNDFRM,GBR,3.964844,9.122582406189563,7.95135326336099
1212
2030,ironing out iteration 0; ELCTRI A0_ELC round 0,3,GASCGT,GBR,2.43,8.533338146005143,11.116173242419679
13-
2030,ironing out iteration 0; ELCTRI A0_ELC round 0,,WNDFRM,GBR,0.8296341257939862,21.18388884708709,31.912566180263063
13+
2030,ironing out iteration 0; ELCTRI A0_ELC round 0,,WNDFRM,GBR,0.8296341257939862,21.18388884708709,31.91256618026307
1414
2030,ironing out iteration 0; ELCTRI A0_ELC round 0,,GASCGT,GBR,0.464994715704925,19.786860477508085,16.700042478191456
1515
2030,ironing out iteration 0; ELCTRI A0_ELC round 1,3,GASCGT,GBR,2.43,0.0,13.587119801355628
16-
2030,ironing out iteration 0; ELCTRI A0_ELC round 1,,WNDFRM,GBR,0.8296341257939862,6.934490527620455,53.54594746891633
16+
2030,ironing out iteration 0; ELCTRI A0_ELC round 1,,WNDFRM,GBR,0.8296341257939862,6.934490527620455,53.545947468916346
1717
2030,ironing out iteration 0; ELCTRI A0_ELC round 1,,GASCGT,GBR,0.464994715704925,7.0400656048469985,29.262425253778225
1818
2030,ironing out iteration 0; GASNAT A0_GPR round 0,1,GASPRC,GBR,3782.13,0.0,3.5946466245698283
1919
2030,ironing out iteration 0; GASNAT A0_GPR round 0,,GASPRC,GBR,1882.2106508775898,105.87434741787482,4.6491158129807735
2020
2030,ironing out iteration 0; GASPRD A0_GEX round 0,0,GASDRV,GBR,4002.26,0.0,3.4590637024393733
21-
2030,ironing out iteration 0; GASPRD A0_GEX round 0,,GASDRV,GBR,1782.3574244480762,100.25760352108253,5.120344950409316
21+
2030,ironing out iteration 0; GASPRD A0_GEX round 0,,GASDRV,GBR,1782.3574244480762,100.25760352108253,5.120344950409317
2222
2040,ironing out iteration 0; RSHEAT A0_RES round 0,6,RGASBR,GBR,355.83840587648046,837.2243916125647,7.910651988850701
2323
2040,ironing out iteration 0; RSHEAT A0_RES round 0,,RGASBR,GBR,401.16573754764806,803.2288927232066,16.96954270164715
2424
2040,ironing out iteration 0; RSHEAT A0_RES round 0,,RELCHP,GBR,401.16573754764806,803.2288927232066,32.7615162456679
2525
2040,ironing out iteration 0; RSHEAT A0_RES round 1,,RGASBR,GBR,401.16573754764806,553.002604410226,18.52936492459862
2626
2040,ironing out iteration 0; RSHEAT A0_RES round 1,,RELCHP,GBR,401.16573754764806,553.002604410226,36.93897594690447
2727
2040,ironing out iteration 0; RSHEAT A0_RES round 2,,RGASBR,GBR,401.16573754764806,344.439249133942,23.122931761022492
2828
2040,ironing out iteration 0; RSHEAT A0_RES round 2,,RELCHP,GBR,401.16573754764806,344.439249133942,48.2108123214798
29-
2040,ironing out iteration 0; RSHEAT A0_RES round 3,,RGASBR,GBR,401.16573754764806,231.4426548511842,37.717511126543194
29+
2040,ironing out iteration 0; RSHEAT A0_RES round 3,,RGASBR,GBR,401.16573754764806,231.4426548511842,37.7175111265432
3030
2040,ironing out iteration 0; RSHEAT A0_RES round 3,,RELCHP,GBR,401.16573754764806,231.4426548511842,84.02344255458496
31-
2040,ironing out iteration 0; RSHEAT A0_RES round 4,,RGASBR,GBR,401.16573754764806,135.33002996294968,43.31272689192322
31+
2040,ironing out iteration 0; RSHEAT A0_RES round 4,,RGASBR,GBR,401.16573754764806,135.33002996294968,43.312726891923226
3232
2040,ironing out iteration 0; RSHEAT A0_RES round 4,,RELCHP,GBR,401.16573754764806,135.33002996294968,97.75315605036315
33-
2040,ironing out iteration 0; RSHEAT A0_RES round 5,,RGASBR,GBR,401.16573754764806,63.522481615597556,55.98733471331223
33+
2040,ironing out iteration 0; RSHEAT A0_RES round 5,,RGASBR,GBR,401.16573754764806,63.522481615597556,55.98733471331224
3434
2040,ironing out iteration 0; RSHEAT A0_RES round 5,,RELCHP,GBR,401.16573754764806,63.522481615597556,128.8545007269613
3535
2040,ironing out iteration 0; RSHEAT A0_RES round 6,,RGASBR,GBR,401.16573754764806,39.02576700981601,152.78630430986536
3636
2040,ironing out iteration 0; RSHEAT A0_RES round 6,,RELCHP,GBR,401.16573754764806,39.02576700981601,370.4833534015565
@@ -40,24 +40,24 @@ milestone_year,run_description,asset_id,process_id,region_id,capacity,unmet_dema
4040
2040,ironing out iteration 0; RSHEAT A0_RES round 8,,RELCHP,GBR,401.16573754764806,13.952908413088004,720.5264354789919
4141
2040,ironing out iteration 0; RSHEAT A0_RES round 9,,RGASBR,GBR,401.16573754764806,1.4164791147240017,292.95399430359674
4242
2040,ironing out iteration 0; RSHEAT A0_RES round 9,,RELCHP,GBR,401.16573754764806,1.4164791147240017,720.5264354789919
43-
2040,ironing out iteration 0; RSHEAT A0_RES round 10,,RGASBR,GBR,45.327331671168054,0.0,292.95399430359674
43+
2040,ironing out iteration 0; RSHEAT A0_RES round 10,,RGASBR,GBR,45.327331671168054,0.0,292.9539943035968
4444
2040,ironing out iteration 0; RSHEAT A0_RES round 10,,RELCHP,GBR,45.327331671168054,0.0,720.5264354789919
4545
2040,ironing out iteration 0; GASNAT A0_GPR round 0,1,GASPRC,GBR,3782.13,0.0,3.5296209362039472
4646
2040,ironing out iteration 0; GASNAT A0_GPR round 0,,GASPRC,GBR,2210.5242056822512,124.34198458015484,4.767386617539143
4747
2040,ironing out iteration 0; GASPRD A0_GEX round 0,0,GASDRV,GBR,4002.26,0.0,3.086521021442066
48-
2040,ironing out iteration 0; GASPRD A0_GEX round 0,,GASDRV,GBR,2321.050415966363,130.55908380916256,4.847920882198776
48+
2040,ironing out iteration 0; GASPRD A0_GEX round 0,,GASDRV,GBR,2321.050415966363,130.55908380916256,4.8479208821987765
4949
2040,ironing out iteration 1; RSHEAT A0_RES round 0,6,RGASBR,GBR,355.83840587648046,837.2243916125647,7.910651988850701
5050
2040,ironing out iteration 1; RSHEAT A0_RES round 0,,RGASBR,GBR,401.16573754764806,803.2288927232066,16.96954270164715
5151
2040,ironing out iteration 1; RSHEAT A0_RES round 0,,RELCHP,GBR,401.16573754764806,803.2288927232066,28.05951450411788
5252
2040,ironing out iteration 1; RSHEAT A0_RES round 1,,RGASBR,GBR,401.16573754764806,553.002604410226,18.52936492459862
5353
2040,ironing out iteration 1; RSHEAT A0_RES round 1,,RELCHP,GBR,401.16573754764806,553.002604410226,31.95907006149655
5454
2040,ironing out iteration 1; RSHEAT A0_RES round 2,,RGASBR,GBR,401.16573754764806,344.439249133942,23.122931761022492
5555
2040,ironing out iteration 1; RSHEAT A0_RES round 2,,RELCHP,GBR,401.16573754764806,344.439249133942,43.44298715255623
56-
2040,ironing out iteration 1; RSHEAT A0_RES round 3,,RGASBR,GBR,401.16573754764806,231.4426548511842,37.717511126543194
56+
2040,ironing out iteration 1; RSHEAT A0_RES round 3,,RGASBR,GBR,401.16573754764806,231.4426548511842,37.7175111265432
5757
2040,ironing out iteration 1; RSHEAT A0_RES round 3,,RELCHP,GBR,401.16573754764806,231.4426548511842,79.929435566358
58-
2040,ironing out iteration 1; RSHEAT A0_RES round 4,,RGASBR,GBR,401.16573754764806,135.33002996294968,43.31272689192322
58+
2040,ironing out iteration 1; RSHEAT A0_RES round 4,,RGASBR,GBR,401.16573754764806,135.33002996294968,43.312726891923226
5959
2040,ironing out iteration 1; RSHEAT A0_RES round 4,,RELCHP,GBR,401.16573754764806,135.33002996294968,93.91747497980806
60-
2040,ironing out iteration 1; RSHEAT A0_RES round 5,,RGASBR,GBR,401.16573754764806,63.522481615597556,55.98733471331223
60+
2040,ironing out iteration 1; RSHEAT A0_RES round 5,,RGASBR,GBR,401.16573754764806,63.522481615597556,55.98733471331224
6161
2040,ironing out iteration 1; RSHEAT A0_RES round 5,,RELCHP,GBR,401.16573754764806,63.522481615597556,125.60399453328056
6262
2040,ironing out iteration 1; RSHEAT A0_RES round 6,,RGASBR,GBR,401.16573754764806,39.02576700981601,152.78630430986536
6363
2040,ironing out iteration 1; RSHEAT A0_RES round 6,,RELCHP,GBR,401.16573754764806,39.02576700981601,367.6014185246633
@@ -67,9 +67,9 @@ milestone_year,run_description,asset_id,process_id,region_id,capacity,unmet_dema
6767
2040,ironing out iteration 1; RSHEAT A0_RES round 8,,RELCHP,GBR,401.16573754764806,13.952908413088004,718.0206435089918
6868
2040,ironing out iteration 1; RSHEAT A0_RES round 9,,RGASBR,GBR,401.16573754764806,1.4164791147240017,292.95399430359674
6969
2040,ironing out iteration 1; RSHEAT A0_RES round 9,,RELCHP,GBR,401.16573754764806,1.4164791147240017,718.0206435089918
70-
2040,ironing out iteration 1; RSHEAT A0_RES round 10,,RGASBR,GBR,45.327331671168054,0.0,292.95399430359674
70+
2040,ironing out iteration 1; RSHEAT A0_RES round 10,,RGASBR,GBR,45.327331671168054,0.0,292.9539943035968
7171
2040,ironing out iteration 1; RSHEAT A0_RES round 10,,RELCHP,GBR,45.327331671168054,0.0,718.0206435089917
7272
2040,ironing out iteration 1; GASNAT A0_GPR round 0,1,GASPRC,GBR,3782.13,0.0,3.5296209362039472
7373
2040,ironing out iteration 1; GASNAT A0_GPR round 0,,GASPRC,GBR,2210.5242056822512,124.34198458015484,4.767386617539143
7474
2040,ironing out iteration 1; GASPRD A0_GEX round 0,0,GASDRV,GBR,4002.26,0.0,3.086521021442066
75-
2040,ironing out iteration 1; GASPRD A0_GEX round 0,,GASDRV,GBR,2321.050415966363,130.55908380916256,4.847920882198776
75+
2040,ironing out iteration 1; GASPRD A0_GEX round 0,,GASDRV,GBR,2321.050415966363,130.55908380916256,4.8479208821987765

0 commit comments

Comments
 (0)