diff --git a/src/asset.rs b/src/asset.rs index 3129c77a..f5208381 100644 --- a/src/asset.rs +++ b/src/asset.rs @@ -831,11 +831,42 @@ impl Asset { *mothballed_year } + /// Get the unit size for this asset's process (if any) + pub fn unit_size(&self) -> Option { + self.process.unit_size + } + /// Checks if the asset corresponds to a process that has a `unit_size` and is therefore divisible. pub fn is_divisible(&self) -> bool { self.process.unit_size.is_some() } + /// Convert a capacity to number of units for a divisible asset. + /// + /// Divides the given capacity by the process unit size and rounds up. In other words, this is + /// the minimum number of units required to achieve at least the given capacity. + /// + /// Panics if the asset is not divisible. + pub fn capacity_to_units(&self, capacity: Capacity) -> u32 { + let unit_size = self.unit_size().expect("Asset must be divisible"); + #[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)] + { + (capacity / unit_size).value().ceil() as u32 + } + } + + /// Round a capacity up to the nearest multiple of the unit size. + /// + /// For a divisible asset, returns the minimum capacity (as a multiple of `unit_size`) + /// that is at least as large as the given capacity. + /// + /// Panics if the asset is not divisible. + pub fn round_capacity_to_unit_size(&self, capacity: Capacity) -> Capacity { + let unit_size = self.unit_size().expect("Asset must be divisible"); + let n_units = self.capacity_to_units(capacity); + Capacity(unit_size.value() * n_units as f64) + } + /// Divides an asset if it is divisible and returns a vector of children /// /// The child assets are identical to the parent (including state) but with a capacity @@ -860,10 +891,7 @@ impl Asset { ); // Calculate the number of units corresponding to the asset's capacity - // Safe because capacity and unit_size are both positive finite numbers, so their ratio - // must also be positive and finite. - #[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss)] - let n_units = (self.capacity / unit_size).value().ceil() as usize; + let n_units = self.capacity_to_units(self.capacity) as usize; // Divide the asset into `n_units` children of size `unit_size` let child_asset = Self { diff --git a/src/simulation/investment.rs b/src/simulation/investment.rs index afc8dc36..8c2fd0dc 100644 --- a/src/simulation/investment.rs +++ b/src/simulation/investment.rs @@ -617,12 +617,16 @@ fn get_candidate_assets<'a>( let mut asset = Asset::new_candidate(process.clone(), region_id.clone(), Capacity(0.0), year) .unwrap(); - asset.set_capacity(get_demand_limiting_capacity( - time_slice_info, - &asset, - commodity, - demand, - )); + + // Set capacity based on demand + // This will serve as the upper limit when appraising the asset + // If the asset is divisible, round capacity to the nearest multiple of the unit size + let mut capacity = + get_demand_limiting_capacity(time_slice_info, &asset, commodity, demand); + if asset.is_divisible() { + capacity = asset.round_capacity_to_unit_size(capacity); + } + asset.set_capacity(capacity); asset.into() }) @@ -708,7 +712,13 @@ fn select_best_assets( let mut outputs_for_opts = Vec::new(); for asset in &opt_assets { let max_capacity = (!asset.is_commissioned()).then(|| { - let max_capacity = model.parameters.capacity_limit_factor * asset.capacity(); + let mut max_capacity = model.parameters.capacity_limit_factor * asset.capacity(); + + // For divisible assets, round up to the nearest multiple of the process unit size + if asset.is_divisible() { + max_capacity = asset.round_capacity_to_unit_size(max_capacity); + } + let remaining_capacity = remaining_candidate_capacity[asset]; max_capacity.min(remaining_capacity) }); diff --git a/src/simulation/investment/appraisal/constraints.rs b/src/simulation/investment/appraisal/constraints.rs index 881820ce..b981793a 100644 --- a/src/simulation/investment/appraisal/constraints.rs +++ b/src/simulation/investment/appraisal/constraints.rs @@ -5,6 +5,7 @@ use crate::asset::{AssetRef, AssetState}; use crate::commodity::Commodity; use crate::time_slice::{TimeSliceID, TimeSliceInfo}; use crate::units::{Capacity, Flow}; +use float_cmp::approx_eq; use highs::RowProblem as Problem; use indexmap::IndexMap; @@ -19,15 +20,26 @@ pub fn add_capacity_constraint( max_capacity: Option, capacity_var: Variable, ) { - let capacity = max_capacity.unwrap_or(asset.capacity()); + let mut capacity_limit = max_capacity.unwrap_or(asset.capacity()).value(); + + // If asset is divisible, capacity_var represents number of units, so we must divide the + // capacity bounds by the unit size. + if let Some(unit_size) = asset.unit_size() { + capacity_limit /= unit_size.value(); + + // Sanity check: capacity_limit should be a whole number of units (i.e pre-adjusted + // capacity limit was a multiple of unit size) + assert!(approx_eq!(f64, capacity_limit, capacity_limit.round())); + } + let bounds = match asset.state() { AssetState::Commissioned { .. } => { // Fixed capacity for commissioned assets - capacity.value()..=capacity.value() + capacity_limit..=capacity_limit } AssetState::Candidate => { // Variable capacity between 0 and max for candidate assets - 0.0..=capacity.value() + 0.0..=capacity_limit } _ => panic!( "add_capacity_constraint should only be called with Commissioned or Candidate assets" @@ -100,8 +112,15 @@ fn add_activity_constraints_for_candidate( time_slice_info: &TimeSliceInfo, ) { for (ts_selection, limits) in asset.iter_activity_per_capacity_limits() { - let upper_limit = limits.end().value(); - let lower_limit = limits.start().value(); + let mut upper_limit = limits.end().value(); + let mut lower_limit = limits.start().value(); + + // If the asset is divisible, the capacity variable represents number of units, + // so we need to multiply the per-capacity limits by the unit size. + if let Some(unit_size) = asset.unit_size() { + upper_limit *= unit_size.value(); + lower_limit *= unit_size.value(); + } // Collect capacity and activity terms // We have a single capacity term, and activity terms for all time slices in the selection diff --git a/src/simulation/investment/appraisal/optimisation.rs b/src/simulation/investment/appraisal/optimisation.rs index 94b9ae75..104ecc51 100644 --- a/src/simulation/investment/appraisal/optimisation.rs +++ b/src/simulation/investment/appraisal/optimisation.rs @@ -21,7 +21,8 @@ pub type Variable = highs::Col; /// Map storing variables for the optimisation problem struct VariableMap { - /// Capacity variable + /// Capacity variable (represents absolute capacity for indivisible assets, number of units for + /// divisible assets) capacity_var: Variable, /// Activity variables in each time slice activity_vars: IndexMap, @@ -38,10 +39,23 @@ impl VariableMap { /// /// # Returns /// A new `VariableMap` containing all created decision variables - fn add_to_problem(problem: &mut Problem, cost_coefficients: &ObjectiveCoefficients) -> Self { + fn add_to_problem( + problem: &mut Problem, + cost_coefficients: &ObjectiveCoefficients, + capacity_unit_size: Option, + ) -> Self { // Create capacity variable with its associated cost - let capacity_var = - problem.add_column(cost_coefficients.capacity_coefficient.value(), 0.0..); + let capacity_coefficient = cost_coefficients.capacity_coefficient.value(); + let capacity_var = match capacity_unit_size { + Some(unit_size) => { + // Divisible asset: capacity variable represents number of units + problem.add_integer_column(capacity_coefficient * unit_size.value(), 0.0..) + } + None => { + // Indivisible asset: capacity variable represents total capacity + problem.add_column(capacity_coefficient, 0.0..) + } + }; // Create activity variables for each time slice let mut activity_vars = IndexMap::new(); @@ -118,7 +132,7 @@ pub fn perform_optimisation( ) -> Result { // Create problem and add variables let mut problem = Problem::default(); - let variables = VariableMap::add_to_problem(&mut problem, coefficients); + let variables = VariableMap::add_to_problem(&mut problem, coefficients, asset.unit_size()); // Add constraints add_constraints( @@ -135,7 +149,12 @@ pub fn perform_optimisation( let solution = solve_optimal(problem.optimise(sense))?.get_solution(); let solution_values = solution.columns(); Ok(ResultsMap { - capacity: Capacity::new(solution_values[0]), + // If the asset is divisible, the capacity variable represents number of units, so convert + // to total capacity + capacity: match asset.unit_size() { + Some(unit_size) => Capacity::new(solution_values[0] * unit_size.value()), + None => Capacity::new(solution_values[0]), + }, // The mapping below assumes the column ordering documented on `VariableMap::add_to_problem`: // index 0 = capacity, next `n` entries = activities (in the same key order as // `cost_coefficients.activity_coefficients`), remaining entries = unmet demand. diff --git a/tests/data/simple_divisible/assets.csv b/tests/data/simple_divisible/assets.csv index 5be4861d..f9a2cd0c 100644 --- a/tests/data/simple_divisible/assets.csv +++ b/tests/data/simple_divisible/assets.csv @@ -1,15 +1,15 @@ asset_id,process_id,region_id,agent_id,group_id,commission_year,decommission_year,capacity 0,GASDRV,GBR,A0_GEX,,2020,,4002.26 1,GASPRC,GBR,A0_GPR,,2020,,3782.13 -2,WNDFRM,GBR,A0_ELC,,2020,2040,3.964844 -3,GASCGT,GBR,A0_ELC,,2020,2040,2.43 +2,WNDFRM,GBR,A0_ELC,,2020,,3.964844 +3,GASCGT,GBR,A0_ELC,,2020,,2.43 4,RGASBR,GBR,A0_RES,,2020,2035,1000.0 5,RGASBR,GBR,A0_RES,,2020,2035,1000.0 6,RGASBR,GBR,A0_RES,,2020,2035,1000.0 7,RELCHP,GBR,A0_RES,,2020,2035,399.98 -8,RGASBR,GBR,A0_RES,1,2030,,1000.0 -9,GASCGT,GBR,A0_ELC,,2030,2040,0.44245235762867363 -10,RGASBR,GBR,A0_RES,2,2040,,1000.0 -11,RGASBR,GBR,A0_RES,2,2040,,1000.0 -12,RGASBR,GBR,A0_RES,2,2040,,1000.0 -13,RGASBR,GBR,A0_RES,2,2040,,1000.0 +8,RELCHP,GBR,A0_RES,,2030,,255.83840587648046 +9,GASCGT,GBR,A0_ELC,,2030,2040,3.1192651014219064 +10,RGASBR,GBR,A0_RES,1,2040,,1000.0 +11,RGASBR,GBR,A0_RES,1,2040,,1000.0 +12,RGASBR,GBR,A0_RES,1,2040,,1000.0 +13,RGASBR,GBR,A0_RES,1,2040,,1000.0 diff --git a/tests/data/simple_divisible/commodity_flows.csv b/tests/data/simple_divisible/commodity_flows.csv index 0c290708..ac1117a1 100644 --- a/tests/data/simple_divisible/commodity_flows.csv +++ b/tests/data/simple_divisible/commodity_flows.csv @@ -321,8 +321,8 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2020,7,RSHEAT,autumn.evening,15.437192051273913 2030,0,GASPRD,winter.night,0.0 2030,0,CO2EMT,winter.night,0.0 -2030,0,GASPRD,winter.day,209.0073635849431 -2030,0,CO2EMT,winter.day,1068.6546500098143 +2030,0,GASPRD,winter.day,165.01914749860276 +2030,0,CO2EMT,winter.day,843.742901160356 2030,0,GASPRD,winter.peak,125.070625 2030,0,CO2EMT,winter.peak,639.486105625 2030,0,GASPRD,winter.evening,166.76083466742 @@ -331,8 +331,8 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2030,0,CO2EMT,peak.night,0.0 2030,0,GASPRD,peak.day,0.0 2030,0,CO2EMT,peak.day,0.0 -2030,0,GASPRD,peak.peak,88.83225416513676 -2030,0,CO2EMT,peak.peak,454.1993155463443 +2030,0,GASPRD,peak.peak,44.963829236405275 +2030,0,CO2EMT,peak.peak,229.90005888574018 2030,0,GASPRD,peak.evening,166.76083466742 2030,0,CO2EMT,peak.evening,852.6481476545185 2030,0,GASPRD,summer.night,0.0 @@ -347,16 +347,16 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2030,0,CO2EMT,autumn.night,0.0 2030,0,GASPRD,autumn.day,0.0 2030,0,CO2EMT,autumn.day,0.0 -2030,0,GASPRD,autumn.peak,20.534211026060348 -2030,0,CO2EMT,autumn.peak,104.99142097624657 -2030,0,GASPRD,autumn.evening,166.76083466742 -2030,0,CO2EMT,autumn.evening,852.6481476545185 +2030,0,GASPRD,autumn.peak,0.0 +2030,0,CO2EMT,autumn.peak,0.0 +2030,0,GASPRD,autumn.evening,149.8615049192033 +2030,0,CO2EMT,autumn.evening,766.2418746518865 2030,1,GASPRD,winter.night,-0.0 2030,1,GASNAT,winter.night,0.0 2030,1,CO2EMT,winter.night,0.0 -2030,1,GASPRD,winter.day,-211.2694938036176 -2030,1,GASNAT,winter.day,201.20904171773103 -2030,1,CO2EMT,winter.day,514.3909151513794 +2030,1,GASPRD,winter.day,-167.28127771727728 +2030,1,GASNAT,winter.day,159.31550258788312 +2030,1,CO2EMT,winter.day,407.29008236592324 2030,1,GASPRD,winter.peak,-124.10114062500001 2030,1,GASNAT,winter.peak,118.1915625 2030,1,CO2EMT,winter.peak,302.15672953125005 @@ -369,9 +369,9 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2030,1,GASPRD,peak.day,-0.0 2030,1,GASNAT,peak.day,0.0 2030,1,CO2EMT,peak.day,0.0 -2030,1,GASPRD,peak.peak,-90.12490000881128 -2030,1,GASNAT,peak.peak,85.83323810362978 -2030,1,CO2EMT,peak.peak,219.43267321192957 +2030,1,GASPRD,peak.peak,-46.25647508007977 +2030,1,GASNAT,peak.peak,44.053785790552155 +2030,1,CO2EMT,peak.peak,112.6235033735466 2030,1,GASPRD,peak.evening,-165.4681888237455 2030,1,GASNAT,peak.evening,157.58875126070998 2030,1,CO2EMT,peak.evening,402.87564259800513 @@ -393,12 +393,12 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2030,1,GASPRD,autumn.day,-0.0 2030,1,GASNAT,autumn.day,0.0 2030,1,CO2EMT,autumn.day,0.0 -2030,1,GASPRD,autumn.peak,-21.826856869734865 -2030,1,GASNAT,autumn.peak,20.78748273308082 -2030,1,CO2EMT,autumn.peak,53.143199607121126 -2030,1,GASPRD,autumn.evening,-165.4681888237455 -2030,1,GASNAT,autumn.evening,157.58875126070998 -2030,1,CO2EMT,autumn.evening,402.87564259800513 +2030,1,GASPRD,autumn.peak,-0.0 +2030,1,GASNAT,autumn.peak,0.0 +2030,1,CO2EMT,autumn.peak,0.0 +2030,1,GASPRD,autumn.evening,-149.8615049192033 +2030,1,GASNAT,autumn.evening,142.7252427801936 +2030,1,CO2EMT,autumn.evening,364.877083167565 2030,2,ELCTRI,winter.night,4.435312795545212 2030,2,ELCTRI,winter.day,7.075379933645912 2030,2,ELCTRI,winter.peak,1.9712501261051125 @@ -415,33 +415,33 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2030,2,ELCTRI,autumn.day,6.001752635595889 2030,2,ELCTRI,autumn.peak,1.5488393825638174 2030,2,ELCTRI,autumn.evening,1.9008483513729915 -2030,3,GASNAT,winter.night,-7.783808997678887 -2030,3,ELCTRI,winter.night,5.189205998452591 -2030,3,CO2EMT,winter.night,397.9861540513214 -2030,3,GASNAT,winter.day,-10.010898915527838 -2030,3,ELCTRI,winter.day,6.6739326103518914 -2030,3,CO2EMT,winter.day,511.8572615509383 -2030,3,GASNAT,winter.peak,-2.5761772783606895 -2030,3,ELCTRI,winter.peak,1.7174515189071262 -2030,3,CO2EMT,winter.peak,131.71994424258205 -2030,3,GASNAT,winter.evening,-3.5229053092829044 -2030,3,ELCTRI,winter.evening,2.3486035395219362 -2030,3,CO2EMT,winter.evening,180.12614846363488 +2030,3,GASNAT,winter.night,-6.257486623244247 +2030,3,ELCTRI,winter.night,4.171657748829499 +2030,3,CO2EMT,winter.night,319.94529104647836 +2030,3,GASNAT,winter.day,-11.975343788321101 +2030,3,ELCTRI,winter.day,7.9835625255474 +2030,3,CO2EMT,winter.day,612.2993278968578 +2030,3,GASNAT,winter.peak,-3.592603125 +2030,3,ELCTRI,winter.peak,2.39506875 +2030,3,CO2EMT,winter.peak,183.68979778124998 +2030,3,GASNAT,winter.evening,-4.790137538321099 +2030,3,ELCTRI,winter.evening,3.1934250255473997 +2030,3,CO2EMT,winter.evening,244.9197323343578 2030,3,GASNAT,peak.night,-8.382740663321101 2030,3,ELCTRI,peak.night,5.5884937755474 2030,3,CO2EMT,peak.night,428.6095301156078 -2030,3,GASNAT,peak.day,-8.886465236074457 -2030,3,ELCTRI,peak.day,5.924310157382971 -2030,3,CO2EMT,peak.day,454.3649675204869 -2030,3,GASNAT,peak.peak,-3.520722822271213 -2030,3,ELCTRI,peak.peak,2.3471485481808085 -2030,3,CO2EMT,peak.peak,180.0145579027271 +2030,3,GASNAT,peak.day,-11.975343788321101 +2030,3,ELCTRI,peak.day,7.9835625255474 +2030,3,CO2EMT,peak.day,612.2993278968578 +2030,3,GASNAT,peak.peak,-3.592603125 +2030,3,ELCTRI,peak.peak,2.39506875 +2030,3,CO2EMT,peak.peak,183.68979778124998 2030,3,GASNAT,peak.evening,-4.790137538321099 2030,3,ELCTRI,peak.evening,3.1934250255473997 2030,3,CO2EMT,peak.evening,244.9197323343578 -2030,3,GASNAT,summer.night,-0.0 -2030,3,ELCTRI,summer.night,0.0 -2030,3,CO2EMT,summer.night,0.0 +2030,3,GASNAT,summer.night,-0.44265925791417715 +2030,3,ELCTRI,summer.night,0.29510617194278477 +2030,3,CO2EMT,summer.night,22.633167857151875 2030,3,GASNAT,summer.day,-0.0 2030,3,ELCTRI,summer.day,0.0 2030,3,CO2EMT,summer.day,0.0 @@ -451,27 +451,27 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2030,3,GASNAT,summer.evening,-0.0 2030,3,ELCTRI,summer.evening,0.0 2030,3,CO2EMT,summer.evening,0.0 -2030,3,GASNAT,autumn.night,-8.105533617588788 -2030,3,ELCTRI,autumn.night,5.403689078392525 -2030,3,CO2EMT,autumn.night,414.4359338673147 -2030,3,GASNAT,autumn.day,-11.621339862602872 -2030,3,ELCTRI,autumn.day,7.747559908401914 -2030,3,CO2EMT,autumn.day,594.1991071748848 -2030,3,GASNAT,autumn.peak,-3.592603125 -2030,3,ELCTRI,autumn.peak,2.39506875 -2030,3,CO2EMT,autumn.peak,183.68979778124998 -2030,3,GASNAT,autumn.evening,-4.526130821984218 -2030,3,ELCTRI,autumn.evening,3.0174205479894782 -2030,3,CO2EMT,autumn.evening,231.42106892805302 +2030,3,GASNAT,autumn.night,-3.3878829022543346 +2030,3,ELCTRI,autumn.night,2.2585886015028898 +2030,3,CO2EMT,autumn.night,173.2224527922641 +2030,3,GASNAT,autumn.day,-11.975343788321101 +2030,3,ELCTRI,autumn.day,7.9835625255474 +2030,3,CO2EMT,autumn.day,612.2993278968578 +2030,3,GASNAT,autumn.peak,-3.2097933936726317 +2030,3,ELCTRI,autumn.peak,2.139862262448421 +2030,3,CO2EMT,autumn.peak,164.11673621848163 +2030,3,GASNAT,autumn.evening,-4.790137538321099 +2030,3,ELCTRI,autumn.evening,3.1934250255473997 +2030,3,CO2EMT,autumn.evening,244.9197323343578 2030,4,GASNAT,winter.night,-0.0 2030,4,RSHEAT,winter.night,0.0 2030,4,CO2EMT,winter.night,0.0 2030,4,GASNAT,winter.day,-0.0 2030,4,RSHEAT,winter.day,0.0 2030,4,CO2EMT,winter.day,0.0 -2030,4,GASNAT,winter.peak,-9.194192711186016 -2030,4,RSHEAT,winter.peak,7.9949501836400145 -2030,4,CO2EMT,winter.peak,470.099073322941 +2030,4,GASNAT,winter.peak,-35.9375 +2030,4,RSHEAT,winter.peak,31.25 +2030,4,CO2EMT,winter.peak,1837.484375 2030,4,GASNAT,winter.evening,-0.0 2030,4,RSHEAT,winter.evening,0.0 2030,4,CO2EMT,winter.evening,0.0 @@ -514,24 +514,24 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2030,5,GASNAT,winter.night,-0.0 2030,5,RSHEAT,winter.night,0.0 2030,5,CO2EMT,winter.night,0.0 -2030,5,GASNAT,winter.day,-0.0 -2030,5,RSHEAT,winter.day,0.0 -2030,5,CO2EMT,winter.day,0.0 +2030,5,GASNAT,winter.day,-68.83778950822192 +2030,5,RSHEAT,winter.day,59.85894739845385 +2030,5,CO2EMT,winter.day,3519.6761775553873 2030,5,GASNAT,winter.peak,-35.9375 2030,5,RSHEAT,winter.peak,31.25 2030,5,CO2EMT,winter.peak,1837.484375 -2030,5,GASNAT,winter.evening,-0.0 -2030,5,RSHEAT,winter.evening,0.0 -2030,5,CO2EMT,winter.evening,0.0 +2030,5,GASNAT,winter.evening,-11.265044856693935 +2030,5,RSHEAT,winter.evening,9.795691179733858 +2030,5,CO2EMT,winter.evening,575.981743522761 2030,5,GASNAT,peak.night,-0.0 2030,5,RSHEAT,peak.night,0.0 2030,5,CO2EMT,peak.night,0.0 2030,5,GASNAT,peak.day,-0.0 2030,5,RSHEAT,peak.day,0.0 2030,5,CO2EMT,peak.day,0.0 -2030,5,GASNAT,peak.peak,-0.0 -2030,5,RSHEAT,peak.peak,0.0 -2030,5,CO2EMT,peak.peak,0.0 +2030,5,GASNAT,peak.peak,-20.995160275120003 +2030,5,RSHEAT,peak.peak,18.256661108800003 +2030,5,CO2EMT,peak.peak,1073.4825448668857 2030,5,GASNAT,peak.evening,-0.0 2030,5,RSHEAT,peak.evening,0.0 2030,5,CO2EMT,peak.evening,0.0 @@ -553,36 +553,36 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2030,5,GASNAT,autumn.day,-0.0 2030,5,RSHEAT,autumn.day,0.0 2030,5,CO2EMT,autumn.day,0.0 -2030,5,GASNAT,autumn.peak,-0.0 -2030,5,RSHEAT,autumn.peak,0.0 -2030,5,CO2EMT,autumn.peak,0.0 +2030,5,GASNAT,autumn.peak,-4.8857398049169865 +2030,5,RSHEAT,autumn.peak,4.248469395579988 +2030,5,CO2EMT,autumn.peak,249.80787622540552 2030,5,GASNAT,autumn.evening,-0.0 2030,5,RSHEAT,autumn.evening,0.0 2030,5,CO2EMT,autumn.evening,0.0 -2030,6,GASNAT,winter.night,-0.0 -2030,6,RSHEAT,winter.night,0.0 -2030,6,CO2EMT,winter.night,0.0 -2030,6,GASNAT,winter.day,-99.48509864357999 -2030,6,RSHEAT,winter.day,86.5087814292 -2030,6,CO2EMT,winter.day,5086.673093646245 +2030,6,GASNAT,winter.night,-22.392032154537905 +2030,6,RSHEAT,winter.night,19.47133230829383 +2030,6,CO2EMT,winter.night,1144.9046040615233 +2030,6,GASNAT,winter.day,-119.79166705 +2030,6,RSHEAT,winter.day,104.166667 +2030,6,CO2EMT,winter.day,6124.947936266501 2030,6,GASNAT,winter.peak,-35.9375 2030,6,RSHEAT,winter.peak,31.25 2030,6,CO2EMT,winter.peak,1837.484375 -2030,6,GASNAT,winter.evening,-23.523968569680008 -2030,6,RSHEAT,winter.evening,20.45562484320001 -2030,6,CO2EMT,winter.evening,1202.780512967739 +2030,6,GASNAT,winter.evening,-47.916667049999994 +2030,6,RSHEAT,winter.evening,41.666667 +2030,6,CO2EMT,winter.evening,2449.9791862664997 2030,6,GASNAT,peak.night,-0.0 2030,6,RSHEAT,peak.night,0.0 2030,6,CO2EMT,peak.night,0.0 -2030,6,GASNAT,peak.day,-0.0 -2030,6,RSHEAT,peak.day,0.0 -2030,6,CO2EMT,peak.day,0.0 -2030,6,GASNAT,peak.peak,-30.18935298630602 -2030,6,RSHEAT,peak.peak,26.251611292440018 -2030,6,CO2EMT,peak.peak,1543.581618189827 -2030,6,GASNAT,peak.evening,-0.0 -2030,6,RSHEAT,peak.evening,0.0 -2030,6,CO2EMT,peak.evening,0.0 +2030,6,GASNAT,peak.day,-65.56548235539387 +2030,6,RSHEAT,peak.day,57.013462917733804 +2030,6,CO2EMT,peak.day,3352.363112831289 +2030,6,GASNAT,peak.peak,-35.9375 +2030,6,RSHEAT,peak.peak,31.25 +2030,6,CO2EMT,peak.peak,1837.484375 +2030,6,GASNAT,peak.evening,-17.411576464977927 +2030,6,RSHEAT,peak.evening,15.14050127389385 +2030,6,CO2EMT,peak.evening,890.2539046543214 2030,6,GASNAT,summer.night,-0.0 2030,6,RSHEAT,summer.night,0.0 2030,6,CO2EMT,summer.night,0.0 @@ -598,15 +598,15 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2030,6,GASNAT,autumn.night,-0.0 2030,6,RSHEAT,autumn.night,0.0 2030,6,CO2EMT,autumn.night,0.0 -2030,6,GASNAT,autumn.day,-0.0 -2030,6,RSHEAT,autumn.day,0.0 -2030,6,CO2EMT,autumn.day,0.0 -2030,6,GASNAT,autumn.peak,-14.079932516103002 -2030,6,RSHEAT,autumn.peak,12.243419579220003 -2030,6,CO2EMT,autumn.peak,719.9069495483466 -2030,6,GASNAT,autumn.evening,-0.0 -2030,6,RSHEAT,autumn.evening,0.0 -2030,6,CO2EMT,autumn.evening,0.0 +2030,6,GASNAT,autumn.day,-37.32691752467789 +2030,6,RSHEAT,autumn.day,32.45818915189382 +2030,6,CO2EMT,autumn.day,1908.5252930367808 +2030,6,GASNAT,autumn.peak,-35.9375 +2030,6,RSHEAT,autumn.peak,31.25 +2030,6,CO2EMT,autumn.peak,1837.484375 +2030,6,GASNAT,autumn.evening,-7.117290867360921 +2030,6,RSHEAT,autumn.evening,6.188948580313845 +2030,6,CO2EMT,autumn.evening,363.90708204816394 2030,7,ELCTRI,winter.night,-9.624518793997803 2030,7,RSHEAT,winter.night,29.165208466660005 2030,7,ELCTRI,winter.day,-13.749312543997803 @@ -615,105 +615,89 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2030,7,RSHEAT,winter.peak,12.499375 2030,7,ELCTRI,winter.evening,-5.499725043997801 2030,7,RSHEAT,winter.evening,16.66583346666 -2030,7,ELCTRI,peak.night,-9.457314542454188 -2030,7,RSHEAT,peak.night,28.658528916527843 +2030,7,ELCTRI,peak.night,-9.399835688203567 +2030,7,RSHEAT,peak.night,28.484350570313836 2030,7,ELCTRI,peak.day,-13.749312543997803 2030,7,RSHEAT,peak.day,41.664583466660005 2030,7,ELCTRI,peak.peak,-4.12479375 2030,7,RSHEAT,peak.peak,12.499375 2030,7,ELCTRI,peak.evening,-5.499725043997801 2030,7,RSHEAT,peak.evening,16.66583346666 -2030,7,ELCTRI,summer.night,-1.9319477961564002 -2030,7,RSHEAT,summer.night,5.85438726108 -2030,7,ELCTRI,summer.day,-3.2188600626534005 -2030,7,RSHEAT,summer.day,9.75412140198 -2030,7,ELCTRI,summer.peak,-1.0599640039494003 -2030,7,RSHEAT,summer.peak,3.2120121331800005 -2030,7,ELCTRI,summer.evening,-0.7892279633502001 -2030,7,RSHEAT,summer.evening,2.39159988894 -2030,7,ELCTRI,autumn.night,-9.624518793997803 -2030,7,RSHEAT,autumn.night,29.165208466660005 +2030,7,ELCTRI,summer.night,-0.0 +2030,7,RSHEAT,summer.night,0.0 +2030,7,ELCTRI,summer.day,-0.0 +2030,7,RSHEAT,summer.day,0.0 +2030,7,ELCTRI,summer.peak,-0.0 +2030,7,RSHEAT,summer.peak,0.0 +2030,7,ELCTRI,summer.evening,-0.0 +2030,7,RSHEAT,summer.evening,0.0 +2030,7,ELCTRI,autumn.night,-6.479418317108167 +2030,7,RSHEAT,autumn.night,19.634600960933838 2030,7,ELCTRI,autumn.day,-13.749312543997803 2030,7,RSHEAT,autumn.day,41.664583466660005 2030,7,ELCTRI,autumn.peak,-4.12479375 2030,7,RSHEAT,autumn.peak,12.499375 2030,7,ELCTRI,autumn.evening,-5.499725043997801 2030,7,RSHEAT,autumn.evening,16.66583346666 -2030,8,GASNAT,winter.night,-43.845148578709995 -2030,8,RSHEAT,winter.night,38.1262161554 -2030,8,CO2EMT,winter.night,2241.8024468294425 -2030,8,GASNAT,winter.day,-119.79166705 -2030,8,RSHEAT,winter.day,104.166667 -2030,8,CO2EMT,winter.day,6124.947936266501 -2030,8,GASNAT,winter.peak,-35.9375 -2030,8,RSHEAT,winter.peak,31.25 -2030,8,CO2EMT,winter.peak,1837.484375 -2030,8,GASNAT,winter.evening,-47.916667049999994 -2030,8,RSHEAT,winter.evening,41.666667 -2030,8,CO2EMT,winter.evening,2449.9791862664997 -2030,8,GASNAT,peak.night,-21.252811326025988 -2030,8,RSHEAT,peak.night,18.480705500892164 -2030,8,CO2EMT,peak.night,1086.6562430997087 -2030,8,GASNAT,peak.day,-96.21279149075198 -2030,8,RSHEAT,peak.day,83.66329694848 -2030,8,CO2EMT,peak.day,4919.3600289221495 -2030,8,GASNAT,peak.peak,-35.9375 -2030,8,RSHEAT,peak.peak,31.25 -2030,8,CO2EMT,peak.peak,1837.484375 -2030,8,GASNAT,peak.evening,-29.670500177964005 -2030,8,RSHEAT,peak.evening,25.800434937360006 -2030,8,CO2EMT,peak.evening,1517.0526740992998 -2030,8,GASNAT,summer.night,-0.0 -2030,8,RSHEAT,summer.night,0.0 -2030,8,CO2EMT,summer.night,0.0 -2030,8,GASNAT,summer.day,-0.0 -2030,8,RSHEAT,summer.day,0.0 -2030,8,CO2EMT,summer.day,0.0 -2030,8,GASNAT,summer.peak,-0.0 -2030,8,RSHEAT,summer.peak,0.0 -2030,8,CO2EMT,summer.peak,0.0 -2030,8,GASNAT,summer.evening,-0.0 -2030,8,RSHEAT,summer.evening,0.0 -2030,8,CO2EMT,summer.evening,0.0 -2030,8,GASNAT,autumn.night,-10.492917792587003 -2030,8,RSHEAT,autumn.night,9.124276341380003 -2030,8,CO2EMT,autumn.night,536.5028867349736 -2030,8,GASNAT,autumn.day,-67.97422666003601 -2030,8,RSHEAT,autumn.day,59.10802318264001 -2030,8,CO2EMT,autumn.day,3475.5222091276414 -2030,8,GASNAT,autumn.peak,-35.9375 -2030,8,RSHEAT,autumn.peak,31.25 -2030,8,CO2EMT,autumn.peak,1837.484375 -2030,8,GASNAT,autumn.evening,-19.376214580347 -2030,8,RSHEAT,autumn.evening,16.84888224378 -2030,8,CO2EMT,autumn.evening,990.7058514931422 -2030,9,GASNAT,winter.night,-0.0 -2030,9,ELCTRI,winter.night,0.0 -2030,9,CO2EMT,winter.night,0.0 -2030,9,GASNAT,winter.day,-0.0 -2030,9,ELCTRI,winter.day,0.0 -2030,9,CO2EMT,winter.day,0.0 -2030,9,GASNAT,winter.peak,-0.6541381574816421 -2030,9,ELCTRI,winter.peak,0.4360921049877614 -2030,9,CO2EMT,winter.peak,33.44608399203636 -2030,9,GASNAT,winter.evening,-0.8721842169529965 -2030,9,ELCTRI,winter.evening,0.581456144635331 -2030,9,CO2EMT,winter.evening,44.59477901280671 -2030,9,GASNAT,peak.night,-1.5263223744346388 -2030,9,ELCTRI,peak.night,1.0175482496230925 -2030,9,CO2EMT,peak.night,78.04086300484308 -2030,9,GASNAT,peak.day,-2.180460531916281 -2030,9,ELCTRI,peak.day,1.4536403546108538 -2030,9,CO2EMT,peak.day,111.48694699687942 -2030,9,GASNAT,peak.peak,-0.0 -2030,9,ELCTRI,peak.peak,0.0 -2030,9,CO2EMT,peak.peak,0.0 -2030,9,GASNAT,peak.evening,-0.8721842169529959 -2030,9,ELCTRI,peak.evening,0.5814561446353306 -2030,9,CO2EMT,peak.evening,44.594779012806676 -2030,9,GASNAT,summer.night,-0.44265925791417715 -2030,9,ELCTRI,summer.night,0.29510617194278477 -2030,9,CO2EMT,summer.night,22.633167857151875 +2030,8,ELCTRI,winter.night,-6.156111669545036 +2030,8,RSHEAT,winter.night,18.65488384710617 +2030,8,ELCTRI,winter.day,-8.794445230146241 +2030,8,RSHEAT,winter.day,26.649834030746185 +2030,8,ELCTRI,winter.peak,-2.638333560601205 +2030,8,RSHEAT,winter.peak,7.9949501836400145 +2030,8,ELCTRI,winter.evening,-3.5177781089438307 +2030,8,RSHEAT,winter.evening,10.659933663466154 +2030,8,ELCTRI,peak.night,-6.156111669545036 +2030,8,RSHEAT,peak.night,18.65488384710617 +2030,8,ELCTRI,peak.day,-8.794445230146241 +2030,8,RSHEAT,peak.day,26.649834030746185 +2030,8,ELCTRI,peak.peak,-2.638333560601205 +2030,8,RSHEAT,peak.peak,7.9949501836400145 +2030,8,ELCTRI,peak.evening,-3.5177781089438307 +2030,8,RSHEAT,peak.evening,10.659933663466154 +2030,8,ELCTRI,summer.night,-1.9319477961564002 +2030,8,RSHEAT,summer.night,5.85438726108 +2030,8,ELCTRI,summer.day,-3.2188600626534005 +2030,8,RSHEAT,summer.day,9.75412140198 +2030,8,ELCTRI,summer.peak,-1.0599640039494003 +2030,8,RSHEAT,summer.peak,3.2120121331800005 +2030,8,ELCTRI,summer.evening,-0.7892279633502001 +2030,8,RSHEAT,summer.evening,2.39159988894 +2030,8,ELCTRI,autumn.night,-6.156111669545036 +2030,8,RSHEAT,autumn.night,18.65488384710617 +2030,8,ELCTRI,autumn.day,-8.794445230146241 +2030,8,RSHEAT,autumn.day,26.649834030746185 +2030,8,ELCTRI,autumn.peak,-2.638333560601205 +2030,8,RSHEAT,autumn.peak,7.9949501836400145 +2030,8,ELCTRI,autumn.evening,-3.5177781089438307 +2030,8,RSHEAT,autumn.evening,10.659933663466154 +2030,9,GASNAT,winter.night,-10.760489878752193 +2030,9,ELCTRI,winter.night,7.173659919168129 +2030,9,CO2EMT,winter.night,550.1838475005997 +2030,9,GASNAT,winter.day,-11.2272229724261 +2030,9,ELCTRI,winter.day,7.484815314950733 +2030,9,CO2EMT,winter.day,574.0479105801464 +2030,9,GASNAT,winter.peak,-3.5952126517441387 +2030,9,ELCTRI,winter.peak,2.3968084344960925 +2030,9,CO2EMT,winter.peak,183.8232228836778 +2030,9,GASNAT,winter.evening,-4.881619151330547 +2030,9,ELCTRI,winter.evening,3.2544127675536982 +2030,9,CO2EMT,winter.evening,249.59718720753085 +2030,9,GASNAT,peak.night,-10.67427159737626 +2030,9,ELCTRI,peak.night,7.116181064917506 +2030,9,CO2EMT,peak.night,545.7755067738481 +2030,9,GASNAT,peak.day,-12.283249824889 +2030,9,ELCTRI,peak.day,8.188833216592666 +2030,9,CO2EMT,peak.day,628.0425635465745 +2030,9,GASNAT,peak.peak,-3.8856200381730193 +2030,9,ELCTRI,peak.peak,2.590413358782013 +2030,9,CO2EMT,peak.peak,198.67175255178645 +2030,9,GASNAT,peak.evening,-6.1488513803687415 +2030,9,ELCTRI,peak.evening,4.099234253579161 +2030,9,CO2EMT,peak.evening,314.39077107825375 +2030,9,GASNAT,summer.night,-0.0 +2030,9,ELCTRI,summer.night,0.0 +2030,9,CO2EMT,summer.night,0.0 2030,9,GASNAT,summer.day,-0.0 2030,9,ELCTRI,summer.day,0.0 2030,9,CO2EMT,summer.day,0.0 @@ -723,30 +707,30 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2030,9,GASNAT,summer.evening,-0.0 2030,9,ELCTRI,summer.evening,0.0 2030,9,CO2EMT,summer.evening,0.0 -2030,9,GASNAT,autumn.night,-1.5263223744346388 -2030,9,ELCTRI,autumn.night,1.0175482496230925 -2030,9,CO2EMT,autumn.night,78.04086300484308 -2030,9,GASNAT,autumn.day,-0.0 -2030,9,ELCTRI,autumn.day,0.0 -2030,9,CO2EMT,autumn.day,0.0 -2030,9,GASNAT,autumn.peak,-0.27132842615427455 -2030,9,ELCTRI,autumn.peak,0.18088561743618303 -2030,9,CO2EMT,autumn.peak,13.873022429268056 -2030,9,GASNAT,autumn.evening,-0.8721842169529965 -2030,9,ELCTRI,autumn.evening,0.581456144635331 -2030,9,CO2EMT,autumn.evening,44.59477901280671 +2030,9,GASNAT,autumn.night,-10.760489878752193 +2030,9,ELCTRI,autumn.night,7.173659919168129 +2030,9,CO2EMT,autumn.night,550.1838475005997 +2030,9,GASNAT,autumn.day,-12.837663919501132 +2030,9,ELCTRI,autumn.day,8.558442613000755 +2030,9,CO2EMT,autumn.day,656.3897562040929 +2030,9,GASNAT,autumn.peak,-4.611638498383449 +2030,9,ELCTRI,autumn.peak,3.0744256655889663 +2030,9,CO2EMT,autumn.peak,235.79307642234576 +2030,9,GASNAT,autumn.evening,-5.88484466403186 +2030,9,ELCTRI,autumn.evening,3.9232297760212402 +2030,9,CO2EMT,autumn.evening,300.892107671949 2040,0,GASPRD,winter.night,0.0 2040,0,CO2EMT,winter.night,0.0 -2040,0,GASPRD,winter.day,360.96396982311984 -2040,0,CO2EMT,winter.day,1845.6087777056118 +2040,0,GASPRD,winter.day,291.6944707979391 +2040,0,CO2EMT,winter.day,1491.4338291898628 2040,0,GASPRD,winter.peak,125.070625 2040,0,CO2EMT,winter.peak,639.486105625 2040,0,GASPRD,winter.evening,166.76083466742 2040,0,CO2EMT,winter.evening,852.6481476545185 2040,0,GASPRD,peak.night,0.0 2040,0,CO2EMT,peak.night,0.0 -2040,0,GASPRD,peak.day,85.71569060312169 -2040,0,CO2EMT,peak.day,438.26432605376124 +2040,0,GASPRD,peak.day,21.68540480752938 +2040,0,CO2EMT,peak.day,110.87747478089773 2040,0,GASPRD,peak.peak,125.070625 2040,0,CO2EMT,peak.peak,639.486105625 2040,0,GASPRD,peak.evening,166.76083466742 @@ -757,22 +741,22 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2040,0,CO2EMT,summer.day,0.0 2040,0,GASPRD,summer.peak,0.0 2040,0,CO2EMT,summer.peak,0.0 -2040,0,GASPRD,summer.evening,28.106738155604855 -2040,0,CO2EMT,summer.evening,143.70975218960763 +2040,0,GASPRD,summer.evening,0.760964793659886 +2040,0,CO2EMT,summer.evening,3.8908129899829973 2040,0,GASPRD,autumn.night,0.0 2040,0,CO2EMT,autumn.night,0.0 -2040,0,GASPRD,autumn.day,11.030571054582538 -2040,0,CO2EMT,autumn.day,56.39930980208052 -2040,0,GASPRD,autumn.peak,125.070625 -2040,0,CO2EMT,autumn.peak,639.486105625 +2040,0,GASPRD,autumn.day,0.0 +2040,0,CO2EMT,autumn.day,0.0 +2040,0,GASPRD,autumn.peak,72.18179307730634 +2040,0,CO2EMT,autumn.peak,369.0655080042673 2040,0,GASPRD,autumn.evening,166.76083466742 2040,0,CO2EMT,autumn.evening,852.6481476545185 2040,1,GASPRD,winter.night,-0.0 2040,1,GASNAT,winter.night,0.0 2040,1,CO2EMT,winter.night,0.0 -2040,1,GASPRD,winter.day,-363.2261000417943 -2040,1,GASNAT,winter.day,345.92961908742313 -2040,1,CO2EMT,winter.day,884.3690711969973 +2040,1,GASPRD,winter.day,-293.95660101661366 +2040,1,GASNAT,winter.day,279.95866763487015 +2040,1,CO2EMT,winter.day,715.7143338085456 2040,1,GASPRD,winter.peak,-124.10114062500001 2040,1,GASNAT,winter.peak,118.1915625 2040,1,CO2EMT,winter.peak,302.15672953125005 @@ -782,9 +766,9 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2040,1,GASPRD,peak.night,-0.0 2040,1,GASNAT,peak.night,0.0 2040,1,CO2EMT,peak.night,0.0 -2040,1,GASPRD,peak.day,-87.97782082179617 -2040,1,GASNAT,peak.day,83.78840078266302 -2040,1,CO2EMT,peak.day,214.20504660087803 +2040,1,GASPRD,peak.day,-23.947535026203877 +2040,1,GASNAT,peak.day,22.807176215432264 +2040,1,CO2EMT,peak.day,58.30654599475259 2040,1,GASPRD,peak.peak,-124.10114062500001 2040,1,GASNAT,peak.peak,118.1915625 2040,1,CO2EMT,peak.peak,302.15672953125005 @@ -800,78 +784,126 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2040,1,GASPRD,summer.peak,-0.0 2040,1,GASNAT,summer.peak,0.0 2040,1,CO2EMT,summer.peak,0.0 -2040,1,GASPRD,summer.evening,-28.106738155604855 -2040,1,GASNAT,summer.evening,26.768322052957004 -2040,1,CO2EMT,summer.evening,68.43321532838459 +2040,1,GASPRD,summer.evening,-0.760964793659886 +2040,1,GASNAT,summer.evening,0.7247283749141771 +2040,1,CO2EMT,summer.evening,1.8527680904680939 2040,1,GASPRD,autumn.night,-0.0 2040,1,GASNAT,autumn.night,0.0 2040,1,CO2EMT,autumn.night,0.0 -2040,1,GASPRD,autumn.day,-13.292701273257007 -2040,1,GASNAT,autumn.day,12.659715498340006 -2040,1,CO2EMT,autumn.day,32.36456267150623 -2040,1,GASPRD,autumn.peak,-124.10114062500001 -2040,1,GASNAT,autumn.peak,118.1915625 -2040,1,CO2EMT,autumn.peak,302.15672953125005 +2040,1,GASPRD,autumn.day,-0.0 +2040,1,GASNAT,autumn.day,0.0 +2040,1,CO2EMT,autumn.day,0.0 +2040,1,GASPRD,autumn.peak,-73.47443892098083 +2040,1,GASNAT,autumn.peak,69.97565611521983 +2040,1,CO2EMT,autumn.peak,178.89276485855953 2040,1,GASPRD,autumn.evening,-165.4681888237455 2040,1,GASNAT,autumn.evening,157.58875126070998 2040,1,CO2EMT,autumn.evening,402.87564259800513 -2040,8,GASNAT,winter.night,-0.0 -2040,8,RSHEAT,winter.night,0.0 -2040,8,CO2EMT,winter.night,0.0 -2040,8,GASNAT,winter.day,-0.0 -2040,8,RSHEAT,winter.day,0.0 -2040,8,CO2EMT,winter.day,0.0 -2040,8,GASNAT,winter.peak,-0.4189369311860147 -2040,8,RSHEAT,winter.peak,0.36429298364001284 -2040,8,CO2EMT,winter.peak,21.420245291540937 -2040,8,GASNAT,winter.evening,-0.0 -2040,8,RSHEAT,winter.evening,0.0 -2040,8,CO2EMT,winter.evening,0.0 -2040,8,GASNAT,peak.night,-0.0 -2040,8,RSHEAT,peak.night,0.0 -2040,8,CO2EMT,peak.night,0.0 -2040,8,GASNAT,peak.day,-0.0 -2040,8,RSHEAT,peak.day,0.0 -2040,8,CO2EMT,peak.day,0.0 -2040,8,GASNAT,peak.peak,-0.0 -2040,8,RSHEAT,peak.peak,0.0 -2040,8,CO2EMT,peak.peak,0.0 -2040,8,GASNAT,peak.evening,-0.0 -2040,8,RSHEAT,peak.evening,0.0 -2040,8,CO2EMT,peak.evening,0.0 -2040,8,GASNAT,summer.night,-0.0 -2040,8,RSHEAT,summer.night,0.0 -2040,8,CO2EMT,summer.night,0.0 -2040,8,GASNAT,summer.day,-0.0 -2040,8,RSHEAT,summer.day,0.0 -2040,8,CO2EMT,summer.day,0.0 -2040,8,GASNAT,summer.peak,-0.0 -2040,8,RSHEAT,summer.peak,0.0 -2040,8,CO2EMT,summer.peak,0.0 -2040,8,GASNAT,summer.evening,-0.0 -2040,8,RSHEAT,summer.evening,0.0 -2040,8,CO2EMT,summer.evening,0.0 -2040,8,GASNAT,autumn.night,-0.0 -2040,8,RSHEAT,autumn.night,0.0 -2040,8,CO2EMT,autumn.night,0.0 -2040,8,GASNAT,autumn.day,-0.0 -2040,8,RSHEAT,autumn.day,0.0 -2040,8,CO2EMT,autumn.day,0.0 -2040,8,GASNAT,autumn.peak,-0.0 -2040,8,RSHEAT,autumn.peak,0.0 -2040,8,CO2EMT,autumn.peak,0.0 -2040,8,GASNAT,autumn.evening,-0.0 -2040,8,RSHEAT,autumn.evening,0.0 -2040,8,CO2EMT,autumn.evening,0.0 +2040,2,ELCTRI,winter.night,4.435312795545212 +2040,2,ELCTRI,winter.day,7.075379933645912 +2040,2,ELCTRI,winter.peak,1.9712501261051125 +2040,2,ELCTRI,winter.evening,2.5696653598405335 +2040,2,ELCTRI,peak.night,2.851272517283696 +2040,2,ELCTRI,peak.day,6.3713620320039785 +2040,2,ELCTRI,peak.peak,1.7776452018191917 +2040,2,ELCTRI,peak.evening,1.72484387381507 +2040,2,ELCTRI,summer.night,1.6368416242136155 +2040,2,ELCTRI,summer.day,3.5321677056534004 +2040,2,ELCTRI,summer.peak,1.1631355669494001 +2040,2,ELCTRI,summer.evening,0.8660474423502 +2040,2,ELCTRI,autumn.night,3.203281465982185 +2040,2,ELCTRI,autumn.day,6.001752635595889 +2040,2,ELCTRI,autumn.peak,1.5488393825638174 +2040,2,ELCTRI,autumn.evening,1.9008483513729915 +2040,3,GASNAT,winter.night,-2.581198310999737 +2040,3,ELCTRI,winter.night,1.7207988739998248 +2040,3,CO2EMT,winter.night,131.97666964141655 +2040,3,GASNAT,winter.day,-2.5785979447504945 +2040,3,ELCTRI,winter.day,1.7190652965003297 +2040,3,CO2EMT,winter.day,131.84371291509277 +2040,3,GASNAT,winter.peak,-1.0006251517441385 +2040,3,ELCTRI,winter.peak,0.6670834344960923 +2040,3,CO2EMT,winter.peak,51.16196400867779 +2040,3,GASNAT,winter.evening,-1.4221691236549459 +2040,3,ELCTRI,winter.evening,0.9481127491032972 +2040,3,CO2EMT,winter.evening,72.71550729247737 +2040,3,GASNAT,peak.night,-4.95725872839201 +2040,3,ELCTRI,peak.night,3.3048391522613403 +2040,3,CO2EMT,peak.night,253.46463878268347 +2040,3,GASNAT,peak.day,-3.634624797213394 +2040,3,ELCTRI,peak.day,2.4230831981422627 +2040,3,CO2EMT,peak.day,185.83836588152082 +2040,3,GASNAT,peak.peak,-1.2910325381730197 +2040,3,ELCTRI,peak.peak,0.8606883587820131 +2040,3,CO2EMT,peak.peak,66.0104936767865 +2040,3,GASNAT,peak.evening,-2.689401352693141 +2040,3,ELCTRI,peak.evening,1.7929342351287607 +2040,3,CO2EMT,peak.evening,137.50909116320028 +2040,3,GASNAT,summer.night,-0.7247283749141771 +2040,3,ELCTRI,summer.night,0.4831522499427847 +2040,3,CO2EMT,summer.night,37.05536180936187 +2040,3,GASNAT,summer.day,-0.0 +2040,3,ELCTRI,summer.day,0.0 +2040,3,CO2EMT,summer.day,0.0 +2040,3,GASNAT,summer.peak,-0.0 +2040,3,ELCTRI,summer.peak,0.0 +2040,3,CO2EMT,summer.peak,0.0 +2040,3,GASNAT,summer.evening,-0.0 +2040,3,ELCTRI,summer.evening,0.0 +2040,3,CO2EMT,summer.evening,0.0 +2040,3,GASNAT,autumn.night,-4.429245305344278 +2040,3,ELCTRI,autumn.night,2.9528302035628515 +2040,3,CO2EMT,autumn.night,226.4673124622529 +2040,3,GASNAT,autumn.day,-4.189038891825529 +2040,3,ELCTRI,autumn.day,2.7926925945503527 +2040,3,CO2EMT,autumn.day,214.18555853903928 +2040,3,GASNAT,autumn.peak,-1.634241267056081 +2040,3,ELCTRI,autumn.peak,1.0894941780373875 +2040,3,CO2EMT,autumn.peak,83.55875598457743 +2040,3,GASNAT,autumn.evening,-2.425394636356259 +2040,3,ELCTRI,autumn.evening,1.6169297575708392 +2040,3,CO2EMT,autumn.evening,124.01042775689551 +2040,8,ELCTRI,winter.night,-6.156111669545036 +2040,8,RSHEAT,winter.night,18.65488384710617 +2040,8,ELCTRI,winter.day,-8.794445230146241 +2040,8,RSHEAT,winter.day,26.649834030746185 +2040,8,ELCTRI,winter.peak,-2.638333560601205 +2040,8,RSHEAT,winter.peak,7.9949501836400145 +2040,8,ELCTRI,winter.evening,-3.5177781089438307 +2040,8,RSHEAT,winter.evening,10.659933663466154 +2040,8,ELCTRI,peak.night,-6.156111669545036 +2040,8,RSHEAT,peak.night,18.65488384710617 +2040,8,ELCTRI,peak.day,-8.794445230146241 +2040,8,RSHEAT,peak.day,26.649834030746185 +2040,8,ELCTRI,peak.peak,-2.638333560601205 +2040,8,RSHEAT,peak.peak,7.9949501836400145 +2040,8,ELCTRI,peak.evening,-3.5177781089438307 +2040,8,RSHEAT,peak.evening,10.659933663466154 +2040,8,ELCTRI,summer.night,-2.1199938741564 +2040,8,RSHEAT,summer.night,6.424223861080001 +2040,8,ELCTRI,summer.day,-3.5321677056534004 +2040,8,RSHEAT,summer.day,10.70353850198 +2040,8,ELCTRI,summer.peak,-1.1631355669494001 +2040,8,RSHEAT,summer.peak,3.5246532331800005 +2040,8,ELCTRI,summer.evening,-0.8660474423502 +2040,8,RSHEAT,summer.evening,2.62438618894 +2040,8,ELCTRI,autumn.night,-6.156111669545036 +2040,8,RSHEAT,autumn.night,18.65488384710617 +2040,8,ELCTRI,autumn.day,-8.794445230146241 +2040,8,RSHEAT,autumn.day,26.649834030746185 +2040,8,ELCTRI,autumn.peak,-2.638333560601205 +2040,8,RSHEAT,autumn.peak,7.9949501836400145 +2040,8,ELCTRI,autumn.evening,-3.5177781089438307 +2040,8,RSHEAT,autumn.evening,10.659933663466154 2040,10,GASNAT,winter.night,-0.0 2040,10,RSHEAT,winter.night,0.0 2040,10,CO2EMT,winter.night,0.0 2040,10,GASNAT,winter.day,-0.0 2040,10,RSHEAT,winter.day,0.0 2040,10,CO2EMT,winter.day,0.0 -2040,10,GASNAT,winter.peak,-35.9375 -2040,10,RSHEAT,winter.peak,31.25 -2040,10,CO2EMT,winter.peak,1837.484375 +2040,10,GASNAT,winter.peak,-27.162244219999994 +2040,10,RSHEAT,winter.peak,23.6193428 +2040,10,CO2EMT,winter.peak,1388.8055469685999 2040,10,GASNAT,winter.evening,-0.0 2040,10,RSHEAT,winter.evening,0.0 2040,10,CO2EMT,winter.evening,0.0 @@ -914,24 +946,24 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2040,11,GASNAT,winter.night,-0.0 2040,11,RSHEAT,winter.night,0.0 2040,11,CO2EMT,winter.night,0.0 -2040,11,GASNAT,winter.day,-53.61473373523902 -2040,11,RSHEAT,winter.day,46.621507595860024 -2040,11,CO2EMT,winter.day,2741.3213358827716 +2040,11,GASNAT,winter.day,-22.967424599880907 +2040,11,RSHEAT,winter.day,19.971673565113832 +2040,11,CO2EMT,winter.day,1174.3244197919107 2040,11,GASNAT,winter.peak,-35.9375 2040,11,RSHEAT,winter.peak,31.25 2040,11,CO2EMT,winter.peak,1837.484375 -2040,11,GASNAT,winter.evening,-3.5921756613390228 -2040,11,RSHEAT,winter.evening,3.12363100986002 -2040,11,CO2EMT,winter.evening,183.66794156426425 +2040,11,GASNAT,winter.evening,-0.0 +2040,11,RSHEAT,winter.evening,0.0 +2040,11,CO2EMT,winter.evening,0.0 2040,11,GASNAT,peak.night,-0.0 2040,11,RSHEAT,peak.night,0.0 2040,11,CO2EMT,peak.night,0.0 2040,11,GASNAT,peak.day,-0.0 2040,11,RSHEAT,peak.day,0.0 2040,11,CO2EMT,peak.day,0.0 -2040,11,GASNAT,peak.peak,-16.46170960630601 -2040,11,RSHEAT,peak.peak,14.314530092440009 -2040,11,CO2EMT,peak.peak,841.6872121704263 +2040,11,GASNAT,peak.peak,-7.267516895119993 +2040,11,RSHEAT,peak.peak,6.319579908799994 +2040,11,CO2EMT,peak.peak,371.5881388474853 2040,11,GASNAT,peak.evening,-0.0 2040,11,RSHEAT,peak.evening,0.0 2040,11,CO2EMT,peak.evening,0.0 @@ -959,30 +991,30 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2040,11,GASNAT,autumn.evening,-0.0 2040,11,RSHEAT,autumn.evening,0.0 2040,11,CO2EMT,autumn.evening,0.0 -2040,12,GASNAT,winter.night,-1.0632512703690025 -2040,12,RSHEAT,winter.night,0.9245663220600022 -2040,12,CO2EMT,winter.night,54.3640374539671 +2040,12,GASNAT,winter.night,-0.0 +2040,12,RSHEAT,winter.night,0.0 +2040,12,CO2EMT,winter.night,0.0 2040,12,GASNAT,winter.day,-119.79166705 2040,12,RSHEAT,winter.day,104.166667 2040,12,CO2EMT,winter.day,6124.947936266501 2040,12,GASNAT,winter.peak,-35.9375 2040,12,RSHEAT,winter.peak,31.25 2040,12,CO2EMT,winter.peak,1837.484375 -2040,12,GASNAT,winter.evening,-47.916667049999994 -2040,12,RSHEAT,winter.evening,41.666667 -2040,12,CO2EMT,winter.evening,2449.9791862664997 +2040,12,GASNAT,winter.evening,-39.249918998352946 +2040,12,RSHEAT,winter.evening,34.13036434639387 +2040,12,CO2EMT,winter.evening,2006.8483583857862 2040,12,GASNAT,peak.night,-0.0 2040,12,RSHEAT,peak.night,0.0 2040,12,CO2EMT,peak.night,0.0 -2040,12,GASNAT,peak.day,-38.36399852241101 -2040,12,RSHEAT,peak.day,33.35999871514001 -2040,12,CO2EMT,peak.day,1961.551244450875 +2040,12,GASNAT,peak.day,-7.716689387052905 +2040,12,RSHEAT,peak.day,6.710164684393831 +2040,12,CO2EMT,peak.day,394.55432836001506 2040,12,GASNAT,peak.peak,-35.9375 2040,12,RSHEAT,peak.peak,31.25 2040,12,CO2EMT,peak.peak,1837.484375 -2040,12,GASNAT,peak.evening,-5.6730124496230125 -2040,12,RSHEAT,peak.evening,4.933054304020011 -2040,12,CO2EMT,peak.evening,290.06112654922464 +2040,12,GASNAT,peak.evening,-0.0 +2040,12,RSHEAT,peak.evening,0.0 +2040,12,CO2EMT,peak.evening,0.0 2040,12,GASNAT,summer.night,-0.0 2040,12,RSHEAT,summer.night,0.0 2040,12,CO2EMT,summer.night,0.0 @@ -998,18 +1030,18 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2040,12,GASNAT,autumn.night,-0.0 2040,12,RSHEAT,autumn.night,0.0 2040,12,CO2EMT,autumn.night,0.0 -2040,12,GASNAT,autumn.day,-7.376833871695004 -2040,12,RSHEAT,autumn.day,6.4146381493000035 -2040,12,CO2EMT,autumn.day,377.17751585976555 -2040,12,GASNAT,autumn.peak,-34.721779201103004 -2040,12,RSHEAT,autumn.peak,30.192851479220003 -2040,12,CO2EMT,autumn.peak,1775.3245705523966 +2040,12,GASNAT,autumn.day,-0.0 +2040,12,RSHEAT,autumn.day,0.0 +2040,12,CO2EMT,autumn.day,0.0 +2040,12,GASNAT,autumn.peak,-25.527586489916985 +2040,12,RSHEAT,autumn.peak,22.19790129557999 +2040,12,CO2EMT,autumn.peak,1305.2254972294556 2040,12,GASNAT,autumn.evening,-0.0 2040,12,RSHEAT,autumn.evening,0.0 2040,12,CO2EMT,autumn.evening,0.0 -2040,13,GASNAT,winter.night,-83.85416705 -2040,13,RSHEAT,winter.night,72.916667 -2040,13,CO2EMT,winter.night,4287.463561266501 +2040,13,GASNAT,winter.night,-63.46430189619691 +2040,13,RSHEAT,winter.night,55.186349474953836 +2040,13,CO2EMT,winter.night,3244.929755952548 2040,13,GASNAT,winter.day,-119.79166705 2040,13,RSHEAT,winter.day,104.166667 2040,13,CO2EMT,winter.day,6124.947936266501 @@ -1019,39 +1051,39 @@ milestone_year,asset_id,commodity_id,time_slice,flow 2040,13,GASNAT,winter.evening,-47.916667049999994 2040,13,RSHEAT,winter.evening,41.666667 2040,13,CO2EMT,winter.evening,2449.9791862664997 -2040,13,GASNAT,peak.night,-59.486659865033 -2040,13,RSHEAT,peak.night,51.727530317420005 -2040,13,CO2EMT,peak.night,3041.5529188991377 +2040,13,GASNAT,peak.night,-38.03354344086091 +2040,13,RSHEAT,peak.night,33.072646470313835 +2040,13,CO2EMT,peak.night,1944.6550761312185 2040,13,GASNAT,peak.day,-119.79166705 2040,13,RSHEAT,peak.day,104.166667 2040,13,CO2EMT,peak.day,6124.947936266501 2040,13,GASNAT,peak.peak,-35.9375 2040,13,RSHEAT,peak.peak,31.25 2040,13,CO2EMT,peak.peak,1837.484375 -2040,13,GASNAT,peak.evening,-47.916667049999994 -2040,13,RSHEAT,peak.evening,41.666667 -2040,13,CO2EMT,peak.evening,2449.9791862664997 -2040,13,GASNAT,summer.night,-7.3878574402420005 -2040,13,RSHEAT,summer.night,6.424223861080001 -2040,13,CO2EMT,summer.night,377.7411509195735 -2040,13,GASNAT,summer.day,-12.309069277277 -2040,13,RSHEAT,summer.day,10.70353850198 -2040,13,CO2EMT,summer.day,629.362712147173 -2040,13,GASNAT,summer.peak,-4.053351218157 -2040,13,RSHEAT,summer.peak,3.5246532331800005 -2040,13,CO2EMT,summer.peak,207.24784778436745 -2040,13,GASNAT,summer.evening,-3.0180441172809997 -2040,13,RSHEAT,summer.evening,2.62438618894 -2040,13,CO2EMT,summer.evening,154.31259571657753 -2040,13,GASNAT,autumn.night,-48.318849199246 -2040,13,RSHEAT,autumn.night,42.016390608040005 -2040,13,CO2EMT,autumn.night,2470.5427595574483 -2040,13,GASNAT,autumn.day,-119.79166705 -2040,13,RSHEAT,autumn.day,104.166667 -2040,13,CO2EMT,autumn.day,6124.947936266501 +2040,13,GASNAT,peak.evening,-41.33075578663693 +2040,13,RSHEAT,peak.evening,35.93978764055385 +2040,13,CO2EMT,peak.evening,2113.2415433707465 +2040,13,GASNAT,summer.night,-0.0 +2040,13,RSHEAT,summer.night,0.0 +2040,13,CO2EMT,summer.night,0.0 +2040,13,GASNAT,summer.day,-0.0 +2040,13,RSHEAT,summer.day,0.0 +2040,13,CO2EMT,summer.day,0.0 +2040,13,GASNAT,summer.peak,-0.0 +2040,13,RSHEAT,summer.peak,0.0 +2040,13,CO2EMT,summer.peak,0.0 +2040,13,GASNAT,summer.evening,-0.0 +2040,13,RSHEAT,summer.evening,0.0 +2040,13,CO2EMT,summer.evening,0.0 +2040,13,GASNAT,autumn.night,-26.86573277507391 +2040,13,RSHEAT,autumn.night,23.361506760933835 +2040,13,CO2EMT,autumn.night,1373.6449167895291 +2040,13,GASNAT,autumn.day,-96.52119178633689 +2040,13,RSHEAT,autumn.day,83.93147111855382 +2040,13,CO2EMT,autumn.day,4935.128536035405 2040,13,GASNAT,autumn.peak,-35.9375 2040,13,RSHEAT,autumn.peak,31.25 2040,13,CO2EMT,autumn.peak,1837.484375 -2040,13,GASNAT,autumn.evening,-42.293399937006 -2040,13,RSHEAT,autumn.evening,36.77686951044 -2040,13,CO2EMT,autumn.evening,2162.461538779117 +2040,13,GASNAT,autumn.evening,-30.03447622401992 +2040,13,RSHEAT,autumn.evening,26.116935846973846 +2040,13,CO2EMT,autumn.evening,1535.6627693341386 diff --git a/tests/data/simple_divisible/commodity_prices.csv b/tests/data/simple_divisible/commodity_prices.csv index 6f51160f..7591c16c 100644 --- a/tests/data/simple_divisible/commodity_prices.csv +++ b/tests/data/simple_divisible/commodity_prices.csv @@ -99,7 +99,7 @@ milestone_year,commodity_id,region_id,time_slice,price 2030,ELCTRI,GBR,winter.day,7.993308999999999 2030,ELCTRI,GBR,winter.peak,7.993308999999999 2030,ELCTRI,GBR,winter.evening,7.993308999999999 -2030,ELCTRI,GBR,peak.night,17.26223303030303 +2030,ELCTRI,GBR,peak.night,7.993308999999999 2030,ELCTRI,GBR,peak.day,7.993308999999999 2030,ELCTRI,GBR,peak.peak,7.993308999999999 2030,ELCTRI,GBR,peak.evening,7.993308999999999 @@ -115,7 +115,7 @@ milestone_year,commodity_id,region_id,time_slice,price 2030,RSHEAT,GBR,winter.day,5.8665369 2030,RSHEAT,GBR,winter.peak,5.8665369 2030,RSHEAT,GBR,winter.evening,5.8665369 -2030,RSHEAT,GBR,peak.night,5.8665369 +2030,RSHEAT,GBR,peak.night,2.80779197 2030,RSHEAT,GBR,peak.day,5.8665369 2030,RSHEAT,GBR,peak.peak,5.8665369 2030,RSHEAT,GBR,peak.evening,5.8665369 @@ -123,7 +123,7 @@ milestone_year,commodity_id,region_id,time_slice,price 2030,RSHEAT,GBR,summer.day,0.30200000000000005 2030,RSHEAT,GBR,summer.peak,0.30200000000000005 2030,RSHEAT,GBR,summer.evening,0.30200000000000005 -2030,RSHEAT,GBR,autumn.night,5.8665369 +2030,RSHEAT,GBR,autumn.night,2.80779197 2030,RSHEAT,GBR,autumn.day,5.8665369 2030,RSHEAT,GBR,autumn.peak,5.8665369 2030,RSHEAT,GBR,autumn.evening,5.8665369 @@ -159,6 +159,22 @@ milestone_year,commodity_id,region_id,time_slice,price 2040,GASNAT,GBR,autumn.day,2.9170059999999998 2040,GASNAT,GBR,autumn.peak,2.9170059999999998 2040,GASNAT,GBR,autumn.evening,2.9170059999999998 +2040,ELCTRI,GBR,winter.night,7.993308999999999 +2040,ELCTRI,GBR,winter.day,7.993308999999999 +2040,ELCTRI,GBR,winter.peak,7.993308999999999 +2040,ELCTRI,GBR,winter.evening,7.993308999999999 +2040,ELCTRI,GBR,peak.night,7.993308999999999 +2040,ELCTRI,GBR,peak.day,7.993308999999999 +2040,ELCTRI,GBR,peak.peak,7.993308999999999 +2040,ELCTRI,GBR,peak.evening,7.993308999999999 +2040,ELCTRI,GBR,summer.night,7.993308999999999 +2040,ELCTRI,GBR,summer.day,0.4 +2040,ELCTRI,GBR,summer.peak,0.4 +2040,ELCTRI,GBR,summer.evening,0.4 +2040,ELCTRI,GBR,autumn.night,7.993308999999999 +2040,ELCTRI,GBR,autumn.day,7.993308999999999 +2040,ELCTRI,GBR,autumn.peak,7.993308999999999 +2040,ELCTRI,GBR,autumn.evening,7.993308999999999 2040,RSHEAT,GBR,winter.night,5.8665369 2040,RSHEAT,GBR,winter.day,5.8665369 2040,RSHEAT,GBR,winter.peak,5.8665369 @@ -167,10 +183,10 @@ milestone_year,commodity_id,region_id,time_slice,price 2040,RSHEAT,GBR,peak.day,5.8665369 2040,RSHEAT,GBR,peak.peak,5.8665369 2040,RSHEAT,GBR,peak.evening,5.8665369 -2040,RSHEAT,GBR,summer.night,5.8665369 -2040,RSHEAT,GBR,summer.day,5.8665369 -2040,RSHEAT,GBR,summer.peak,5.8665369 -2040,RSHEAT,GBR,summer.evening,5.8665369 +2040,RSHEAT,GBR,summer.night,2.80779197 +2040,RSHEAT,GBR,summer.day,0.30200000000000005 +2040,RSHEAT,GBR,summer.peak,0.30200000000000005 +2040,RSHEAT,GBR,summer.evening,0.30200000000000005 2040,RSHEAT,GBR,autumn.night,5.8665369 2040,RSHEAT,GBR,autumn.day,5.8665369 2040,RSHEAT,GBR,autumn.peak,5.8665369