Loading examples/Cumberland/cascade_config.yaml +22 −4 Original line number Diff line number Diff line # Cumberland River Basin Reservoir Cascade #=========================== # ~~~~~~ Reservoirs ~~~~~~~~ #=========================== # Wolf Creek reservoir Loading @@ -9,7 +10,16 @@ WolfCreek: initial_storage: 50.0 max_release: 10.0 min_release: 3.0 downstream_object: WolfCreek_CordellHull downstream_object: Celina # Dale Hollow reservoir DaleHollow: object_type: reservoir capacity: 100.0 initial_storage: 50.0 max_release: 10.0 min_release: 3.0 downstream_object: Celina # Cordell Hull reservoir CordellHull: Loading Loading @@ -38,10 +48,11 @@ OldHickory: min_release: 2.0 downstream_object: NA #=========================== # ~~~~~~~~ Rivers ~~~~~~~~~~ #=========================== # Wolf Creek to Cordell Hull WolfCreek_CordellHull: # Celina to Cordell Hull Celina_CordellHull: object_type: river downstream_object: CordellHull lag: 30 Loading @@ -57,3 +68,10 @@ CenterHill_OldHickory: object_type: river downstream_object: CenterHill lag: 15 #=========================== # ~~~~~~ Confluences ~~~~~~~ #=========================== Celina: object_type: confluence downstream_object: Celina_CordellHull No newline at end of file examples/Cumberland/script.qmd +22 −7 Original line number Diff line number Diff line Loading @@ -46,19 +46,28 @@ class RiverData: lag: int legacy_flows: list[float] @dataclass class ConfluenceData: object_type: str simulation_order: int downstream_object: str @dataclass class CascadeData: reservoirs: dict[str, ReservoirData] rivers: dict[str, RiverData] confluences: dict[str, ConfluenceData] simulation_orders = { "WolfCreek": 1, "WolfCreek_CordellHull": 2, "CordellHull": 3, "CordellHull_OldHickory" : 4, "CenterHill": 5, "CenterHill_OldHickory" : 6, "OldHickory": 7 "DaleHollow": 2, "Celina": 3, "Celina_CordellHull": 4, "CordellHull": 5, "CordellHull_OldHickory" : 6, "CenterHill": 7, "CenterHill_OldHickory" : 8, "OldHickory": 9 } # Read the reservoir configuration Loading @@ -68,6 +77,7 @@ with open('cascade_config.yaml', 'r') as file: # Initialize dictionaries for reservoirs and rivers reservoir_dict = {} river_dict = {} confluence_dict = {} for name, specs in config_dict.items(): specs['simulation_order'] = simulation_orders[name] # Add simulation order to specs Loading @@ -82,10 +92,15 @@ for name, specs in config_dict.items(): **specs, legacy_flows=pd.read_csv(f"time_series/{name}.csv")['legacy_flow'].tolist() ) elif specs['object_type'] == 'confluence': confluence_dict[name] = ConfluenceData( **specs, ) cascade_data = CascadeData( reservoirs=reservoir_dict, rivers=river_dict rivers=river_dict, confluences=confluence_dict ) ``` Loading examples/Cumberland/time_series/WolfCreek_CordellHull.csv→examples/Cumberland/time_series/Celina_CordellHull.csv +0 −0 File moved. View file examples/Cumberland/time_series/DaleHollow.csv 0 → 100644 +169 −0 Original line number Diff line number Diff line datetime,catchment_inflow,target_release 2007-07-01T00:00:00Z,8.416219997951998,5.308050825937269 2007-07-01T01:00:00Z,8.416219997951998,5.101331614130994 2007-07-01T02:00:00Z,8.416219997951998,6.406875581125612 2007-07-01T03:00:00Z,8.416219997951998,4.69492170871826 2007-07-01T04:00:00Z,8.416219997951998,7.706239199319716 2007-07-01T05:00:00Z,8.416219997951998,7.990713481248751 2007-07-01T06:00:00Z,8.416219997951998,6.5661771721100175 2007-07-01T07:00:00Z,8.416219997951998,9.935104640736169 2007-07-01T08:00:00Z,8.416219997951998,5.639826578089164 2007-07-01T09:00:00Z,8.416219997951998,12.563627525443023 2007-07-01T10:00:00Z,8.416219997951998,11.584503491140607 2007-07-01T11:00:00Z,8.416219997951998,6.077601571866892 2007-07-01T12:00:00Z,8.416219997951998,11.737633073185977 2007-07-01T13:00:00Z,8.416219997951998,8.38507969393619 2007-07-01T14:00:00Z,8.416219997951998,7.619851998289994 2007-07-01T15:00:00Z,8.416219997951998,12.434177345803144 2007-07-01T16:00:00Z,8.416219997951998,11.008058928101974 2007-07-01T17:00:00Z,8.416219997951998,8.357046750588287 2007-07-01T18:00:00Z,8.416219997951998,7.405026674311733 2007-07-01T19:00:00Z,8.416219997951998,5.387243195547386 2007-07-01T20:00:00Z,8.416219997951998,6.852892272530108 2007-07-01T21:00:00Z,8.416219997951998,10.553381927405157 2007-07-01T22:00:00Z,8.416219997951998,10.02883979860741 2007-07-01T23:00:00Z,8.416219997951998,6.868997854030686 2007-07-02T00:00:00Z,11.401042206527999,14.054787807022644 2007-07-02T01:00:00Z,11.401042206527999,5.902827103261581 2007-07-02T02:00:00Z,11.401042206527999,14.003312776612573 2007-07-02T03:00:00Z,11.401042206527999,10.94137548175276 2007-07-02T04:00:00Z,11.401042206527999,12.895656096416177 2007-07-02T05:00:00Z,11.401042206527999,9.136423608521048 2007-07-02T06:00:00Z,11.401042206527999,10.739237591999839 2007-07-02T07:00:00Z,11.401042206527999,10.797371343642494 2007-07-02T08:00:00Z,11.401042206527999,9.862119505029126 2007-07-02T09:00:00Z,11.401042206527999,13.723634491758803 2007-07-02T10:00:00Z,11.401042206527999,16.945001527530458 2007-07-02T11:00:00Z,11.401042206527999,5.875427320699803 2007-07-02T12:00:00Z,11.401042206527999,10.132310890516774 2007-07-02T13:00:00Z,11.401042206527999,8.177132004921228 2007-07-02T14:00:00Z,11.401042206527999,9.34136653171742 2007-07-02T15:00:00Z,11.401042206527999,7.5673836474405975 2007-07-02T16:00:00Z,11.401042206527999,12.813150635716573 2007-07-02T17:00:00Z,11.401042206527999,15.340632217692422 2007-07-02T18:00:00Z,11.401042206527999,12.016126802056146 2007-07-02T19:00:00Z,11.401042206527999,14.55522651409827 2007-07-02T20:00:00Z,11.401042206527999,9.968457206276415 2007-07-02T21:00:00Z,11.401042206527999,14.453030369193442 2007-07-02T22:00:00Z,11.401042206527999,7.330188586663013 2007-07-02T23:00:00Z,11.401042206527999,11.309488390425475 2007-07-03T00:00:00Z,11.547836741375999,7.422719276247288 2007-07-03T01:00:00Z,11.547836741375999,8.234758831802045 2007-07-03T02:00:00Z,11.547836741375999,12.632208893855806 2007-07-03T03:00:00Z,11.547836741375999,7.983690914077474 2007-07-03T04:00:00Z,11.547836741375999,6.33869304796781 2007-07-03T05:00:00Z,11.547836741375999,9.034371699225565 2007-07-03T06:00:00Z,11.547836741375999,7.993384938418182 2007-07-03T07:00:00Z,11.547836741375999,15.559806979147687 2007-07-03T08:00:00Z,11.547836741375999,11.781531205701594 2007-07-03T09:00:00Z,11.547836741375999,5.999557392622285 2007-07-03T10:00:00Z,11.547836741375999,8.832920936111671 2007-07-03T11:00:00Z,11.547836741375999,9.6497887529109 2007-07-03T12:00:00Z,11.547836741375999,8.251524928891824 2007-07-03T13:00:00Z,11.547836741375999,17.156341060796755 2007-07-03T14:00:00Z,11.547836741375999,8.05256349503374 2007-07-03T15:00:00Z,11.547836741375999,15.889597594082352 2007-07-03T16:00:00Z,11.547836741375999,17.281486396368674 2007-07-03T17:00:00Z,11.547836741375999,8.85589766303425 2007-07-03T18:00:00Z,11.547836741375999,8.517858232415993 2007-07-03T19:00:00Z,11.547836741375999,9.513993864743691 2007-07-03T20:00:00Z,11.547836741375999,13.633153020177176 2007-07-03T21:00:00Z,11.547836741375999,13.603812617794745 2007-07-03T22:00:00Z,11.547836741375999,11.323390188525575 2007-07-03T23:00:00Z,11.547836741375999,10.34184746292146 2007-07-04T00:00:00Z,7.046137672703999,10.239888389463848 2007-07-04T01:00:00Z,7.046137672703999,5.8784575587597905 2007-07-04T02:00:00Z,7.046137672703999,6.699313828046055 2007-07-04T03:00:00Z,7.046137672703999,3.8763640212433454 2007-07-04T04:00:00Z,7.046137672703999,10.270730097154722 2007-07-04T05:00:00Z,7.046137672703999,6.884325747504043 2007-07-04T06:00:00Z,7.046137672703999,8.024286796074879 2007-07-04T07:00:00Z,7.046137672703999,4.246655323410585 2007-07-04T08:00:00Z,7.046137672703999,5.3747206751583025 2007-07-04T09:00:00Z,7.046137672703999,4.638618646274563 2007-07-04T10:00:00Z,7.046137672703999,5.599888592896644 2007-07-04T11:00:00Z,7.046137672703999,6.305863373281562 2007-07-04T12:00:00Z,7.046137672703999,6.752502973655714 2007-07-04T13:00:00Z,7.046137672703999,9.998363613800459 2007-07-04T14:00:00Z,7.046137672703999,4.381925489429517 2007-07-04T15:00:00Z,7.046137672703999,5.151558428301431 2007-07-04T16:00:00Z,7.046137672703999,6.694808550732034 2007-07-04T17:00:00Z,7.046137672703999,6.296073846207062 2007-07-04T18:00:00Z,7.046137672703999,5.722975234610012 2007-07-04T19:00:00Z,7.046137672703999,8.050572370832432 2007-07-04T20:00:00Z,7.046137672703999,4.807977690404024 2007-07-04T21:00:00Z,7.046137672703999,4.420120502313691 2007-07-04T22:00:00Z,7.046137672703999,9.777711686211843 2007-07-04T23:00:00Z,7.046137672703999,4.889619945545822 2007-07-05T00:00:00Z,3.4007400573119995,1.8042197759638163 2007-07-05T01:00:00Z,3.4007400573119995,1.8729954761869594 2007-07-05T02:00:00Z,3.4007400573119995,4.683962726142156 2007-07-05T03:00:00Z,3.4007400573119995,2.3090915499655638 2007-07-05T04:00:00Z,3.4007400573119995,3.664052614057873 2007-07-05T05:00:00Z,3.4007400573119995,4.7638146023022205 2007-07-05T06:00:00Z,3.4007400573119995,3.7189444350938747 2007-07-05T07:00:00Z,3.4007400573119995,4.425378938807732 2007-07-05T08:00:00Z,3.4007400573119995,2.29067517900868 2007-07-05T09:00:00Z,3.4007400573119995,2.2316398758216387 2007-07-05T10:00:00Z,3.4007400573119995,1.7564834911278588 2007-07-05T11:00:00Z,3.4007400573119995,4.895290940962358 2007-07-05T12:00:00Z,3.4007400573119995,1.8450568093307163 2007-07-05T13:00:00Z,3.4007400573119995,4.60778050527373 2007-07-05T14:00:00Z,3.4007400573119995,4.172667259981488 2007-07-05T15:00:00Z,3.4007400573119995,2.923381973983738 2007-07-05T16:00:00Z,3.4007400573119995,4.953433195092381 2007-07-05T17:00:00Z,3.4007400573119995,2.789986372082994 2007-07-05T18:00:00Z,3.4007400573119995,3.6987611773813462 2007-07-05T19:00:00Z,3.4007400573119995,2.233252789038789 2007-07-05T20:00:00Z,3.4007400573119995,5.063621725470027 2007-07-05T21:00:00Z,3.4007400573119995,3.4400249866408794 2007-07-05T22:00:00Z,3.4007400573119995,4.311490701294223 2007-07-05T23:00:00Z,3.4007400573119995,3.293195344937536 2007-07-06T00:00:00Z,2.3976440691839995,1.223197735488137 2007-07-06T01:00:00Z,2.3976440691839995,3.329055776361745 2007-07-06T02:00:00Z,2.3976440691839995,2.0571508386883943 2007-07-06T03:00:00Z,2.3976440691839995,3.4169549252081364 2007-07-06T04:00:00Z,2.3976440691839995,3.1156904699136327 2007-07-06T05:00:00Z,2.3976440691839995,1.9960102249601634 2007-07-06T06:00:00Z,2.3976440691839995,3.011091877064751 2007-07-06T07:00:00Z,2.3976440691839995,2.325782490073682 2007-07-06T08:00:00Z,2.3976440691839995,1.5331152592156267 2007-07-06T09:00:00Z,2.3976440691839995,3.2747248585864432 2007-07-06T10:00:00Z,2.3976440691839995,1.3373158058680792 2007-07-06T11:00:00Z,2.3976440691839995,3.3380054331123583 2007-07-06T12:00:00Z,2.3976440691839995,2.217973057253805 2007-07-06T13:00:00Z,2.3976440691839995,2.796016510394889 2007-07-06T14:00:00Z,2.3976440691839995,2.693261548493505 2007-07-06T15:00:00Z,2.3976440691839995,1.974522532619386 2007-07-06T16:00:00Z,2.3976440691839995,3.0257938818958254 2007-07-06T17:00:00Z,2.3976440691839995,3.1182110695144227 2007-07-06T18:00:00Z,2.3976440691839995,1.8129309932536324 2007-07-06T19:00:00Z,2.3976440691839995,3.2347684417158304 2007-07-06T20:00:00Z,2.3976440691839995,2.5260321358859166 2007-07-06T21:00:00Z,2.3976440691839995,3.2102582043300747 2007-07-06T22:00:00Z,2.3976440691839995,3.3220542562578332 2007-07-06T23:00:00Z,2.3976440691839995,2.7016829854402014 2007-07-07T00:00:00Z,1.9572604646400003,1.3679207225444083 2007-07-07T01:00:00Z,1.9572604646400003,1.7825000996164175 2007-07-07T02:00:00Z,1.9572604646400003,1.4507102542160224 2007-07-07T03:00:00Z,1.9572604646400003,2.21589206380837 2007-07-07T04:00:00Z,1.9572604646400003,1.5733548376999111 2007-07-07T05:00:00Z,1.9572604646400003,1.4081392447218022 2007-07-07T06:00:00Z,1.9572604646400003,2.6673300964136697 2007-07-07T07:00:00Z,1.9572604646400003,2.708883822174827 2007-07-07T08:00:00Z,1.9572604646400003,2.4303522434156126 2007-07-07T09:00:00Z,1.9572604646400003,1.5086885229908662 2007-07-07T10:00:00Z,1.9572604646400003,2.8095854616853457 2007-07-07T11:00:00Z,1.9572604646400003,1.0948007280936083 2007-07-07T12:00:00Z,1.9572604646400003,1.0324641803572616 2007-07-07T13:00:00Z,1.9572604646400003,1.1169703696699251 2007-07-07T14:00:00Z,1.9572604646400003,2.9055189118084868 2007-07-07T15:00:00Z,1.9572604646400003,1.1909804977900813 2007-07-07T16:00:00Z,1.9572604646400003,2.2305085045466684 2007-07-07T17:00:00Z,1.9572604646400003,2.0787625662123737 2007-07-07T18:00:00Z,1.9572604646400003,2.503711672491426 2007-07-07T19:00:00Z,1.9572604646400003,2.533236773585508 2007-07-07T20:00:00Z,1.9572604646400003,2.4168857623377273 2007-07-07T21:00:00Z,1.9572604646400003,2.4045215973288245 2007-07-07T22:00:00Z,1.9572604646400003,2.8805597467947033 2007-07-07T23:00:00Z,1.9572604646400003,2.501509904036444 src/lib.rs +40 −1 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ use std::str::FromStr; enum ObjectType { Reservoir, River, Confluence } impl FromStr for ObjectType { Loading @@ -16,6 +17,7 @@ impl FromStr for ObjectType { match s.to_lowercase().as_str() { "reservoir" => Ok(ObjectType::Reservoir), "river" => Ok(ObjectType::River), "confluence" => Ok(ObjectType::Confluence), _ => Err(format!("Invalid object type: {}", s)), } } Loading Loading @@ -43,10 +45,18 @@ struct RiverData { legacy_flows: Vec<f64> } #[derive(FromPyObject)] struct ConfluenceData { object_type: String, simulation_order: i32, downstream_object: String, } #[derive(FromPyObject)] struct CascadeData { reservoirs: HashMap<String, ReservoirData>, rivers: HashMap<String, RiverData> rivers: HashMap<String, RiverData>, confluences: HashMap<String, ConfluenceData> } struct ReservoirState { Loading @@ -72,10 +82,17 @@ struct RiverResults { outflow: Vec<f64>, } #[derive(FromPyObject, IntoPyObject)] struct ConfluenceResults { inflow: Vec<f64>, outflow: Vec<f64>, } #[derive(IntoPyObject)] enum CascadeResults { Reservoir(ReservoirResults), River(RiverResults), Confluence(ConfluenceResults), } fn simulate_timestep( Loading Loading @@ -130,6 +147,11 @@ fn simulate_cascade( .map_err(|e| PyValueError::new_err(e))?; ordered_objects.push((name, obj.simulation_order, obj_type)); } for (name, obj) in &cascade_data.confluences { let obj_type = obj.object_type.parse::<ObjectType>() .map_err(|e| PyValueError::new_err(e))?; ordered_objects.push((name, obj.simulation_order, obj_type)); } ordered_objects.sort_by_key(|&(_, order, _)| order); for (name, _, obj_type) in &ordered_objects { Loading Loading @@ -164,6 +186,13 @@ fn simulate_cascade( outflow, // legacy flows already in place for t < lag })); }, ObjectType::Confluence => { // For confluences, simply initialize inflow and outflow with zeros. results.insert((*name).to_string(), CascadeResults::Confluence(ConfluenceResults { inflow: vec![0.0; n], outflow: vec![0.0; n], })); }, } } Loading @@ -176,6 +205,8 @@ fn simulate_cascade( .unwrap().downstream_object, ObjectType::River => &cascade_data.rivers.get(*upstream_name) .unwrap().downstream_object, ObjectType::Confluence => &cascade_data.confluences.get(*upstream_name) .unwrap().downstream_object, }; upstream_map.entry(downstream_name.clone()) .or_default() Loading @@ -190,6 +221,7 @@ fn simulate_cascade( match &results[upstream_name] { CascadeResults::Reservoir(res) => res.release[t] + res.spill[t], CascadeResults::River(riv) => riv.outflow[t], CascadeResults::Confluence(conf) => conf.outflow[t], } }) .sum::<f64>() Loading Loading @@ -234,6 +266,13 @@ fn simulate_cascade( // For t < lag, the outflow remains as initially set by legacy_flows. } }, ObjectType::Confluence => { if let CascadeResults::Confluence(current_results) = results.get_mut(*name).unwrap() { current_results.inflow[t] = upstream_inflow; // For confluences, no lagging: set outflow equal to inflow. current_results.outflow[t] = current_results.inflow[t]; } }, } } } Loading Loading
examples/Cumberland/cascade_config.yaml +22 −4 Original line number Diff line number Diff line # Cumberland River Basin Reservoir Cascade #=========================== # ~~~~~~ Reservoirs ~~~~~~~~ #=========================== # Wolf Creek reservoir Loading @@ -9,7 +10,16 @@ WolfCreek: initial_storage: 50.0 max_release: 10.0 min_release: 3.0 downstream_object: WolfCreek_CordellHull downstream_object: Celina # Dale Hollow reservoir DaleHollow: object_type: reservoir capacity: 100.0 initial_storage: 50.0 max_release: 10.0 min_release: 3.0 downstream_object: Celina # Cordell Hull reservoir CordellHull: Loading Loading @@ -38,10 +48,11 @@ OldHickory: min_release: 2.0 downstream_object: NA #=========================== # ~~~~~~~~ Rivers ~~~~~~~~~~ #=========================== # Wolf Creek to Cordell Hull WolfCreek_CordellHull: # Celina to Cordell Hull Celina_CordellHull: object_type: river downstream_object: CordellHull lag: 30 Loading @@ -57,3 +68,10 @@ CenterHill_OldHickory: object_type: river downstream_object: CenterHill lag: 15 #=========================== # ~~~~~~ Confluences ~~~~~~~ #=========================== Celina: object_type: confluence downstream_object: Celina_CordellHull No newline at end of file
examples/Cumberland/script.qmd +22 −7 Original line number Diff line number Diff line Loading @@ -46,19 +46,28 @@ class RiverData: lag: int legacy_flows: list[float] @dataclass class ConfluenceData: object_type: str simulation_order: int downstream_object: str @dataclass class CascadeData: reservoirs: dict[str, ReservoirData] rivers: dict[str, RiverData] confluences: dict[str, ConfluenceData] simulation_orders = { "WolfCreek": 1, "WolfCreek_CordellHull": 2, "CordellHull": 3, "CordellHull_OldHickory" : 4, "CenterHill": 5, "CenterHill_OldHickory" : 6, "OldHickory": 7 "DaleHollow": 2, "Celina": 3, "Celina_CordellHull": 4, "CordellHull": 5, "CordellHull_OldHickory" : 6, "CenterHill": 7, "CenterHill_OldHickory" : 8, "OldHickory": 9 } # Read the reservoir configuration Loading @@ -68,6 +77,7 @@ with open('cascade_config.yaml', 'r') as file: # Initialize dictionaries for reservoirs and rivers reservoir_dict = {} river_dict = {} confluence_dict = {} for name, specs in config_dict.items(): specs['simulation_order'] = simulation_orders[name] # Add simulation order to specs Loading @@ -82,10 +92,15 @@ for name, specs in config_dict.items(): **specs, legacy_flows=pd.read_csv(f"time_series/{name}.csv")['legacy_flow'].tolist() ) elif specs['object_type'] == 'confluence': confluence_dict[name] = ConfluenceData( **specs, ) cascade_data = CascadeData( reservoirs=reservoir_dict, rivers=river_dict rivers=river_dict, confluences=confluence_dict ) ``` Loading
examples/Cumberland/time_series/WolfCreek_CordellHull.csv→examples/Cumberland/time_series/Celina_CordellHull.csv +0 −0 File moved. View file
examples/Cumberland/time_series/DaleHollow.csv 0 → 100644 +169 −0 Original line number Diff line number Diff line datetime,catchment_inflow,target_release 2007-07-01T00:00:00Z,8.416219997951998,5.308050825937269 2007-07-01T01:00:00Z,8.416219997951998,5.101331614130994 2007-07-01T02:00:00Z,8.416219997951998,6.406875581125612 2007-07-01T03:00:00Z,8.416219997951998,4.69492170871826 2007-07-01T04:00:00Z,8.416219997951998,7.706239199319716 2007-07-01T05:00:00Z,8.416219997951998,7.990713481248751 2007-07-01T06:00:00Z,8.416219997951998,6.5661771721100175 2007-07-01T07:00:00Z,8.416219997951998,9.935104640736169 2007-07-01T08:00:00Z,8.416219997951998,5.639826578089164 2007-07-01T09:00:00Z,8.416219997951998,12.563627525443023 2007-07-01T10:00:00Z,8.416219997951998,11.584503491140607 2007-07-01T11:00:00Z,8.416219997951998,6.077601571866892 2007-07-01T12:00:00Z,8.416219997951998,11.737633073185977 2007-07-01T13:00:00Z,8.416219997951998,8.38507969393619 2007-07-01T14:00:00Z,8.416219997951998,7.619851998289994 2007-07-01T15:00:00Z,8.416219997951998,12.434177345803144 2007-07-01T16:00:00Z,8.416219997951998,11.008058928101974 2007-07-01T17:00:00Z,8.416219997951998,8.357046750588287 2007-07-01T18:00:00Z,8.416219997951998,7.405026674311733 2007-07-01T19:00:00Z,8.416219997951998,5.387243195547386 2007-07-01T20:00:00Z,8.416219997951998,6.852892272530108 2007-07-01T21:00:00Z,8.416219997951998,10.553381927405157 2007-07-01T22:00:00Z,8.416219997951998,10.02883979860741 2007-07-01T23:00:00Z,8.416219997951998,6.868997854030686 2007-07-02T00:00:00Z,11.401042206527999,14.054787807022644 2007-07-02T01:00:00Z,11.401042206527999,5.902827103261581 2007-07-02T02:00:00Z,11.401042206527999,14.003312776612573 2007-07-02T03:00:00Z,11.401042206527999,10.94137548175276 2007-07-02T04:00:00Z,11.401042206527999,12.895656096416177 2007-07-02T05:00:00Z,11.401042206527999,9.136423608521048 2007-07-02T06:00:00Z,11.401042206527999,10.739237591999839 2007-07-02T07:00:00Z,11.401042206527999,10.797371343642494 2007-07-02T08:00:00Z,11.401042206527999,9.862119505029126 2007-07-02T09:00:00Z,11.401042206527999,13.723634491758803 2007-07-02T10:00:00Z,11.401042206527999,16.945001527530458 2007-07-02T11:00:00Z,11.401042206527999,5.875427320699803 2007-07-02T12:00:00Z,11.401042206527999,10.132310890516774 2007-07-02T13:00:00Z,11.401042206527999,8.177132004921228 2007-07-02T14:00:00Z,11.401042206527999,9.34136653171742 2007-07-02T15:00:00Z,11.401042206527999,7.5673836474405975 2007-07-02T16:00:00Z,11.401042206527999,12.813150635716573 2007-07-02T17:00:00Z,11.401042206527999,15.340632217692422 2007-07-02T18:00:00Z,11.401042206527999,12.016126802056146 2007-07-02T19:00:00Z,11.401042206527999,14.55522651409827 2007-07-02T20:00:00Z,11.401042206527999,9.968457206276415 2007-07-02T21:00:00Z,11.401042206527999,14.453030369193442 2007-07-02T22:00:00Z,11.401042206527999,7.330188586663013 2007-07-02T23:00:00Z,11.401042206527999,11.309488390425475 2007-07-03T00:00:00Z,11.547836741375999,7.422719276247288 2007-07-03T01:00:00Z,11.547836741375999,8.234758831802045 2007-07-03T02:00:00Z,11.547836741375999,12.632208893855806 2007-07-03T03:00:00Z,11.547836741375999,7.983690914077474 2007-07-03T04:00:00Z,11.547836741375999,6.33869304796781 2007-07-03T05:00:00Z,11.547836741375999,9.034371699225565 2007-07-03T06:00:00Z,11.547836741375999,7.993384938418182 2007-07-03T07:00:00Z,11.547836741375999,15.559806979147687 2007-07-03T08:00:00Z,11.547836741375999,11.781531205701594 2007-07-03T09:00:00Z,11.547836741375999,5.999557392622285 2007-07-03T10:00:00Z,11.547836741375999,8.832920936111671 2007-07-03T11:00:00Z,11.547836741375999,9.6497887529109 2007-07-03T12:00:00Z,11.547836741375999,8.251524928891824 2007-07-03T13:00:00Z,11.547836741375999,17.156341060796755 2007-07-03T14:00:00Z,11.547836741375999,8.05256349503374 2007-07-03T15:00:00Z,11.547836741375999,15.889597594082352 2007-07-03T16:00:00Z,11.547836741375999,17.281486396368674 2007-07-03T17:00:00Z,11.547836741375999,8.85589766303425 2007-07-03T18:00:00Z,11.547836741375999,8.517858232415993 2007-07-03T19:00:00Z,11.547836741375999,9.513993864743691 2007-07-03T20:00:00Z,11.547836741375999,13.633153020177176 2007-07-03T21:00:00Z,11.547836741375999,13.603812617794745 2007-07-03T22:00:00Z,11.547836741375999,11.323390188525575 2007-07-03T23:00:00Z,11.547836741375999,10.34184746292146 2007-07-04T00:00:00Z,7.046137672703999,10.239888389463848 2007-07-04T01:00:00Z,7.046137672703999,5.8784575587597905 2007-07-04T02:00:00Z,7.046137672703999,6.699313828046055 2007-07-04T03:00:00Z,7.046137672703999,3.8763640212433454 2007-07-04T04:00:00Z,7.046137672703999,10.270730097154722 2007-07-04T05:00:00Z,7.046137672703999,6.884325747504043 2007-07-04T06:00:00Z,7.046137672703999,8.024286796074879 2007-07-04T07:00:00Z,7.046137672703999,4.246655323410585 2007-07-04T08:00:00Z,7.046137672703999,5.3747206751583025 2007-07-04T09:00:00Z,7.046137672703999,4.638618646274563 2007-07-04T10:00:00Z,7.046137672703999,5.599888592896644 2007-07-04T11:00:00Z,7.046137672703999,6.305863373281562 2007-07-04T12:00:00Z,7.046137672703999,6.752502973655714 2007-07-04T13:00:00Z,7.046137672703999,9.998363613800459 2007-07-04T14:00:00Z,7.046137672703999,4.381925489429517 2007-07-04T15:00:00Z,7.046137672703999,5.151558428301431 2007-07-04T16:00:00Z,7.046137672703999,6.694808550732034 2007-07-04T17:00:00Z,7.046137672703999,6.296073846207062 2007-07-04T18:00:00Z,7.046137672703999,5.722975234610012 2007-07-04T19:00:00Z,7.046137672703999,8.050572370832432 2007-07-04T20:00:00Z,7.046137672703999,4.807977690404024 2007-07-04T21:00:00Z,7.046137672703999,4.420120502313691 2007-07-04T22:00:00Z,7.046137672703999,9.777711686211843 2007-07-04T23:00:00Z,7.046137672703999,4.889619945545822 2007-07-05T00:00:00Z,3.4007400573119995,1.8042197759638163 2007-07-05T01:00:00Z,3.4007400573119995,1.8729954761869594 2007-07-05T02:00:00Z,3.4007400573119995,4.683962726142156 2007-07-05T03:00:00Z,3.4007400573119995,2.3090915499655638 2007-07-05T04:00:00Z,3.4007400573119995,3.664052614057873 2007-07-05T05:00:00Z,3.4007400573119995,4.7638146023022205 2007-07-05T06:00:00Z,3.4007400573119995,3.7189444350938747 2007-07-05T07:00:00Z,3.4007400573119995,4.425378938807732 2007-07-05T08:00:00Z,3.4007400573119995,2.29067517900868 2007-07-05T09:00:00Z,3.4007400573119995,2.2316398758216387 2007-07-05T10:00:00Z,3.4007400573119995,1.7564834911278588 2007-07-05T11:00:00Z,3.4007400573119995,4.895290940962358 2007-07-05T12:00:00Z,3.4007400573119995,1.8450568093307163 2007-07-05T13:00:00Z,3.4007400573119995,4.60778050527373 2007-07-05T14:00:00Z,3.4007400573119995,4.172667259981488 2007-07-05T15:00:00Z,3.4007400573119995,2.923381973983738 2007-07-05T16:00:00Z,3.4007400573119995,4.953433195092381 2007-07-05T17:00:00Z,3.4007400573119995,2.789986372082994 2007-07-05T18:00:00Z,3.4007400573119995,3.6987611773813462 2007-07-05T19:00:00Z,3.4007400573119995,2.233252789038789 2007-07-05T20:00:00Z,3.4007400573119995,5.063621725470027 2007-07-05T21:00:00Z,3.4007400573119995,3.4400249866408794 2007-07-05T22:00:00Z,3.4007400573119995,4.311490701294223 2007-07-05T23:00:00Z,3.4007400573119995,3.293195344937536 2007-07-06T00:00:00Z,2.3976440691839995,1.223197735488137 2007-07-06T01:00:00Z,2.3976440691839995,3.329055776361745 2007-07-06T02:00:00Z,2.3976440691839995,2.0571508386883943 2007-07-06T03:00:00Z,2.3976440691839995,3.4169549252081364 2007-07-06T04:00:00Z,2.3976440691839995,3.1156904699136327 2007-07-06T05:00:00Z,2.3976440691839995,1.9960102249601634 2007-07-06T06:00:00Z,2.3976440691839995,3.011091877064751 2007-07-06T07:00:00Z,2.3976440691839995,2.325782490073682 2007-07-06T08:00:00Z,2.3976440691839995,1.5331152592156267 2007-07-06T09:00:00Z,2.3976440691839995,3.2747248585864432 2007-07-06T10:00:00Z,2.3976440691839995,1.3373158058680792 2007-07-06T11:00:00Z,2.3976440691839995,3.3380054331123583 2007-07-06T12:00:00Z,2.3976440691839995,2.217973057253805 2007-07-06T13:00:00Z,2.3976440691839995,2.796016510394889 2007-07-06T14:00:00Z,2.3976440691839995,2.693261548493505 2007-07-06T15:00:00Z,2.3976440691839995,1.974522532619386 2007-07-06T16:00:00Z,2.3976440691839995,3.0257938818958254 2007-07-06T17:00:00Z,2.3976440691839995,3.1182110695144227 2007-07-06T18:00:00Z,2.3976440691839995,1.8129309932536324 2007-07-06T19:00:00Z,2.3976440691839995,3.2347684417158304 2007-07-06T20:00:00Z,2.3976440691839995,2.5260321358859166 2007-07-06T21:00:00Z,2.3976440691839995,3.2102582043300747 2007-07-06T22:00:00Z,2.3976440691839995,3.3220542562578332 2007-07-06T23:00:00Z,2.3976440691839995,2.7016829854402014 2007-07-07T00:00:00Z,1.9572604646400003,1.3679207225444083 2007-07-07T01:00:00Z,1.9572604646400003,1.7825000996164175 2007-07-07T02:00:00Z,1.9572604646400003,1.4507102542160224 2007-07-07T03:00:00Z,1.9572604646400003,2.21589206380837 2007-07-07T04:00:00Z,1.9572604646400003,1.5733548376999111 2007-07-07T05:00:00Z,1.9572604646400003,1.4081392447218022 2007-07-07T06:00:00Z,1.9572604646400003,2.6673300964136697 2007-07-07T07:00:00Z,1.9572604646400003,2.708883822174827 2007-07-07T08:00:00Z,1.9572604646400003,2.4303522434156126 2007-07-07T09:00:00Z,1.9572604646400003,1.5086885229908662 2007-07-07T10:00:00Z,1.9572604646400003,2.8095854616853457 2007-07-07T11:00:00Z,1.9572604646400003,1.0948007280936083 2007-07-07T12:00:00Z,1.9572604646400003,1.0324641803572616 2007-07-07T13:00:00Z,1.9572604646400003,1.1169703696699251 2007-07-07T14:00:00Z,1.9572604646400003,2.9055189118084868 2007-07-07T15:00:00Z,1.9572604646400003,1.1909804977900813 2007-07-07T16:00:00Z,1.9572604646400003,2.2305085045466684 2007-07-07T17:00:00Z,1.9572604646400003,2.0787625662123737 2007-07-07T18:00:00Z,1.9572604646400003,2.503711672491426 2007-07-07T19:00:00Z,1.9572604646400003,2.533236773585508 2007-07-07T20:00:00Z,1.9572604646400003,2.4168857623377273 2007-07-07T21:00:00Z,1.9572604646400003,2.4045215973288245 2007-07-07T22:00:00Z,1.9572604646400003,2.8805597467947033 2007-07-07T23:00:00Z,1.9572604646400003,2.501509904036444
src/lib.rs +40 −1 Original line number Diff line number Diff line Loading @@ -8,6 +8,7 @@ use std::str::FromStr; enum ObjectType { Reservoir, River, Confluence } impl FromStr for ObjectType { Loading @@ -16,6 +17,7 @@ impl FromStr for ObjectType { match s.to_lowercase().as_str() { "reservoir" => Ok(ObjectType::Reservoir), "river" => Ok(ObjectType::River), "confluence" => Ok(ObjectType::Confluence), _ => Err(format!("Invalid object type: {}", s)), } } Loading Loading @@ -43,10 +45,18 @@ struct RiverData { legacy_flows: Vec<f64> } #[derive(FromPyObject)] struct ConfluenceData { object_type: String, simulation_order: i32, downstream_object: String, } #[derive(FromPyObject)] struct CascadeData { reservoirs: HashMap<String, ReservoirData>, rivers: HashMap<String, RiverData> rivers: HashMap<String, RiverData>, confluences: HashMap<String, ConfluenceData> } struct ReservoirState { Loading @@ -72,10 +82,17 @@ struct RiverResults { outflow: Vec<f64>, } #[derive(FromPyObject, IntoPyObject)] struct ConfluenceResults { inflow: Vec<f64>, outflow: Vec<f64>, } #[derive(IntoPyObject)] enum CascadeResults { Reservoir(ReservoirResults), River(RiverResults), Confluence(ConfluenceResults), } fn simulate_timestep( Loading Loading @@ -130,6 +147,11 @@ fn simulate_cascade( .map_err(|e| PyValueError::new_err(e))?; ordered_objects.push((name, obj.simulation_order, obj_type)); } for (name, obj) in &cascade_data.confluences { let obj_type = obj.object_type.parse::<ObjectType>() .map_err(|e| PyValueError::new_err(e))?; ordered_objects.push((name, obj.simulation_order, obj_type)); } ordered_objects.sort_by_key(|&(_, order, _)| order); for (name, _, obj_type) in &ordered_objects { Loading Loading @@ -164,6 +186,13 @@ fn simulate_cascade( outflow, // legacy flows already in place for t < lag })); }, ObjectType::Confluence => { // For confluences, simply initialize inflow and outflow with zeros. results.insert((*name).to_string(), CascadeResults::Confluence(ConfluenceResults { inflow: vec![0.0; n], outflow: vec![0.0; n], })); }, } } Loading @@ -176,6 +205,8 @@ fn simulate_cascade( .unwrap().downstream_object, ObjectType::River => &cascade_data.rivers.get(*upstream_name) .unwrap().downstream_object, ObjectType::Confluence => &cascade_data.confluences.get(*upstream_name) .unwrap().downstream_object, }; upstream_map.entry(downstream_name.clone()) .or_default() Loading @@ -190,6 +221,7 @@ fn simulate_cascade( match &results[upstream_name] { CascadeResults::Reservoir(res) => res.release[t] + res.spill[t], CascadeResults::River(riv) => riv.outflow[t], CascadeResults::Confluence(conf) => conf.outflow[t], } }) .sum::<f64>() Loading Loading @@ -234,6 +266,13 @@ fn simulate_cascade( // For t < lag, the outflow remains as initially set by legacy_flows. } }, ObjectType::Confluence => { if let CascadeResults::Confluence(current_results) = results.get_mut(*name).unwrap() { current_results.inflow[t] = upstream_inflow; // For confluences, no lagging: set outflow equal to inflow. current_results.outflow[t] = current_results.inflow[t]; } }, } } } Loading