@@ -277,10 +277,13 @@ fn validate_svd_commodity(
277277 // We're only interested in processes which produce this commodity
278278 continue ;
279279 } ;
280- if flow. coeff <= 0.0 {
281- // Check if it's a producer
282- continue ;
283- }
280+ ensure ! (
281+ flow. coeff > 0.0 ,
282+ "SVD commodity {} is consumed by process {}. \
283+ SVD commodities can only be produced, not consumed.",
284+ commodity. id,
285+ process_id
286+ ) ;
284287
285288 // If the process has availability >0 in any time slice for this selection, we accept it
286289 let availabilities = availabilities. get ( process_id) . unwrap ( ) ;
@@ -313,6 +316,7 @@ mod tests {
313316 use crate :: time_slice:: { TimeSliceID , TimeSliceLevel } ;
314317 use indexmap:: indexmap;
315318 use rstest:: { fixture, rstest} ;
319+ use std:: iter;
316320
317321 #[ fixture]
318322 fn commodity_sed ( ) -> Commodity {
@@ -562,4 +566,46 @@ mod tests {
562566 "Commodity commodity_other is neither produced or consumed."
563567 ) ;
564568 }
569+
570+ #[ rstest]
571+ fn test_validate_svd_commodity_invalid_consumed (
572+ commodity_svd : Commodity ,
573+ time_slice_info : TimeSliceInfo ,
574+ time_slice : TimeSliceID ,
575+ ) {
576+ let commodity_svd = Rc :: new ( commodity_svd) ;
577+ let region_id = RegionID ( "GBR" . into ( ) ) ;
578+ let availabilities = HashMap :: from_iter ( [ (
579+ "process1" . into ( ) ,
580+ ProcessActivityLimitsMap :: from_iter ( [ (
581+ ( region_id. clone ( ) , 2010 , time_slice. clone ( ) ) ,
582+ 0.1 ..=0.9 ,
583+ ) ] ) ,
584+ ) ] ) ;
585+ let flows = HashMap :: from_iter ( iter:: once ( (
586+ "process1" . into ( ) ,
587+ ProcessFlowsMap :: from_iter ( [ (
588+ ( region_id. clone ( ) , 2010 ) ,
589+ indexmap ! { commodity_svd. id. clone( ) => ProcessFlow {
590+ commodity: Rc :: clone( & commodity_svd) ,
591+ coeff: -10.0 ,
592+ kind: FlowType :: Fixed ,
593+ cost: 1.0
594+ } } ,
595+ ) ] ) ,
596+ ) ) ) ;
597+ assert_error ! (
598+ validate_svd_commodity(
599+ & time_slice_info,
600+ & commodity_svd,
601+ & flows,
602+ & availabilities,
603+ & region_id,
604+ 2010 ,
605+ & time_slice. into( )
606+ ) ,
607+ "SVD commodity commodity_svd is consumed by process process1. \
608+ SVD commodities can only be produced, not consumed."
609+ ) ;
610+ }
565611}
0 commit comments