From be04a6172f565203d42d58c186b2f3b98000213d Mon Sep 17 00:00:00 2001 From: Douglas Greenshields Date: Fri, 5 Apr 2024 16:10:49 +0100 Subject: [PATCH] implement heat_cool_cop function for corpus --- src/corpus.rs | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/corpus.rs b/src/corpus.rs index 8a8366e..df5b2b6 100644 --- a/src/corpus.rs +++ b/src/corpus.rs @@ -1343,8 +1343,39 @@ impl Corpus { results_end_user: &HashMap>>, energy_supply_conn_name_for_space_hc_system: HashMap>, ) -> HashMap { - // TODO implement when energy supplies are available - Default::default() + let mut hc_output_overall: HashMap = Default::default(); + let mut hc_input_overall: HashMap = Default::default(); + let mut cop_dict: HashMap = Default::default(); + for (hc_name, hc_output) in energy_provided { + hc_output_overall.insert(*hc_name, hc_output.iter().sum::().abs()); + hc_input_overall.insert(*hc_name, 0.); + let energy_supply_conn_names = + energy_supply_conn_name_for_space_hc_system[hc_name.as_str()].clone(); + for (fuel_name, fuel_summary) in results_end_user { + if fuel_name == "_unmet_demand" { + continue; + } + for (conn_name, energy_cons) in fuel_summary { + if energy_supply_conn_names.contains(conn_name) { + *hc_input_overall.get_mut(hc_name).unwrap() += + energy_cons.iter().sum::(); + } + } + } + + cop_dict.insert( + *hc_name, + if hc_input_overall[hc_name] > 0. { + NumberOrDivisionByZero::Number( + hc_output_overall[hc_name] / hc_input_overall[hc_name], + ) + } else { + NumberOrDivisionByZero::DivisionByZero + }, + ); + } + + cop_dict } /// Calculate space heating and cooling demand for each zone and sum.