From 5d42ce160309214e513d3c0fa355b6bab747e76d Mon Sep 17 00:00:00 2001 From: kflemin Date: Mon, 22 Nov 2021 12:47:58 -0700 Subject: [PATCH 01/62] updating dependencies for OpenStudio 3.3 --- CHANGELOG.md | 6 ++++++ Gemfile | 4 ++++ lib/urbanopt/rnm/version.rb | 2 +- urbanopt-rnm-us-gem.gemspec | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 099063c..e9255a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Version 0.2.0 + +Date Range 11/09/21 - 11/22/21 + +- Updated dependencies for OpenStudio 3.3 + ## Version 0.1.3 Date Range 11/02/21 - 11/08/21 diff --git a/Gemfile b/Gemfile index 2edcf6a..88ee2de 100644 --- a/Gemfile +++ b/Gemfile @@ -8,3 +8,7 @@ allow_local = ENV['FAVOR_LOCAL_GEMS'] # Below is an example of how to configure the gemfile for developing with local gems # modify as appropriate + +# temporary +gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'OS_3.3' +gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'OS_3.3' \ No newline at end of file diff --git a/lib/urbanopt/rnm/version.rb b/lib/urbanopt/rnm/version.rb index ea2fcc7..9753d96 100644 --- a/lib/urbanopt/rnm/version.rb +++ b/lib/urbanopt/rnm/version.rb @@ -40,6 +40,6 @@ module URBANopt module RNM - VERSION = '0.1.3'.freeze + VERSION = '0.2.0'.freeze end end diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index 5d117a7..642a72f 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -26,7 +26,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'faraday', '~> 1.0.1' spec.add_dependency 'geoutm', '~> 1.0.2' spec.add_dependency 'rubyzip', '~> 2.3.2' - spec.add_dependency 'urbanopt-geojson', '~> 0.6.6' + spec.add_dependency 'urbanopt-geojson', '~> 0.7.0' spec.add_development_dependency 'bundler', '~> 2.1' spec.add_development_dependency 'rake', '~> 13.0' From 2238a0e92036fcd9f1308633dd91a3451f47fdb9 Mon Sep 17 00:00:00 2001 From: kflemin Date: Mon, 29 Nov 2021 10:10:49 -0700 Subject: [PATCH 02/62] cleanup gemfile --- Gemfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Gemfile b/Gemfile index 88ee2de..2edcf6a 100644 --- a/Gemfile +++ b/Gemfile @@ -8,7 +8,3 @@ allow_local = ENV['FAVOR_LOCAL_GEMS'] # Below is an example of how to configure the gemfile for developing with local gems # modify as appropriate - -# temporary -gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'OS_3.3' -gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'OS_3.3' \ No newline at end of file From 3ebaf63fee52618d30972de2528f91672077aebc Mon Sep 17 00:00:00 2001 From: kflemin Date: Mon, 29 Nov 2021 21:52:28 -0700 Subject: [PATCH 03/62] add certtified gem --- urbanopt-rnm-us-gem.gemspec | 1 + 1 file changed, 1 insertion(+) diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index 642a72f..fb21945 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -23,6 +23,7 @@ Gem::Specification.new do |spec| spec.require_paths = ['lib', 'catalogs'] spec.required_ruby_version = '~> 2.7.0' + spec.add_dependency 'certified', '~> 1' spec.add_dependency 'faraday', '~> 1.0.1' spec.add_dependency 'geoutm', '~> 1.0.2' spec.add_dependency 'rubyzip', '~> 2.3.2' From f4cc288187087adcb94957088b4fcb8acca62d04 Mon Sep 17 00:00:00 2001 From: kflemin Date: Mon, 6 Dec 2021 15:59:01 -0700 Subject: [PATCH 04/62] fix field in test json file --- .../example_project_with_network_and_streets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/files/example_project/example_project_with_network_and_streets.json b/spec/files/example_project/example_project_with_network_and_streets.json index 3b5d66f..b62c5b1 100644 --- a/spec/files/example_project/example_project_with_network_and_streets.json +++ b/spec/files/example_project/example_project_with_network_and_streets.json @@ -13,7 +13,7 @@ "end_date": "2017-12-31T07:00:00.000Z", "timesteps_per_hour": 1, "default_template": "90.1-2013", - "underground_cables_ratio": "0.9", + "underground_cables_ratio": 0.9, "only_lv_consumers": false, "max_number_of_lv_nodes_per_building": 1 }, From 1868d8b001c002cc75ee2be433fa22565f95a507 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Wed, 30 Mar 2022 09:53:01 -0600 Subject: [PATCH 05/62] update copyright date --- LICENSE.md | 4 ++-- Rakefile | 2 +- lib/urbanopt-rnm.rb | 2 +- lib/urbanopt/rnm.rb | 2 +- lib/urbanopt/rnm/api_client.rb | 4 ++-- lib/urbanopt/rnm/capacitor_opendss.rb | 2 +- lib/urbanopt/rnm/carson_eq.rb | 2 +- lib/urbanopt/rnm/consumers.rb | 2 +- lib/urbanopt/rnm/conversion_to_opendss.rb | 2 +- lib/urbanopt/rnm/geojson_input.rb | 2 +- lib/urbanopt/rnm/input_files.rb | 2 +- lib/urbanopt/rnm/logger.rb | 2 +- lib/urbanopt/rnm/oh_ug_rate.rb | 2 +- lib/urbanopt/rnm/post_processor.rb | 18 +++++++-------- lib/urbanopt/rnm/processor_opendss_catalog.rb | 2 +- lib/urbanopt/rnm/prosumers.rb | 22 +++++++++---------- lib/urbanopt/rnm/rnm_us_catalog_conversion.rb | 2 +- lib/urbanopt/rnm/runner.rb | 2 +- lib/urbanopt/rnm/scenario_report.rb | 2 +- lib/urbanopt/rnm/substation_location.rb | 2 +- lib/urbanopt/rnm/transformer_opendss.rb | 2 +- lib/urbanopt/rnm/version.rb | 2 +- lib/urbanopt/rnm/wires_class.rb | 2 +- lib/urbanopt/rnm/wires_opendss.rb | 2 +- spec/spec_helper.rb | 2 +- spec/urbanopt/urbanopt_rnm_spec.rb | 2 +- 26 files changed, 46 insertions(+), 46 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index 8ddd036..1104f2e 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -35,4 +35,4 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -********************************************************************************* \ No newline at end of file +********************************************************************************* diff --git a/Rakefile b/Rakefile index f7240a3..d5eec86 100644 --- a/Rakefile +++ b/Rakefile @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt-rnm.rb b/lib/urbanopt-rnm.rb index 4639138..9664b18 100644 --- a/lib/urbanopt-rnm.rb +++ b/lib/urbanopt-rnm.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm.rb b/lib/urbanopt/rnm.rb index b3b1d6f..478091e 100644 --- a/lib/urbanopt/rnm.rb +++ b/lib/urbanopt/rnm.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/api_client.rb b/lib/urbanopt/rnm/api_client.rb index f5511e6..cc5e008 100644 --- a/lib/urbanopt/rnm/api_client.rb +++ b/lib/urbanopt/rnm/api_client.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, @@ -268,7 +268,7 @@ def download_results(sim_id = nil) File.open(file_path, 'wb') { |f| f.write streamed.join } puts "RNM-US results.zip downloaded to #{@rnm_dir}" - + # unzip Zip::File.open(file_path) do |zip_file| zip_file.each do |f| diff --git a/lib/urbanopt/rnm/capacitor_opendss.rb b/lib/urbanopt/rnm/capacitor_opendss.rb index 83368d3..4efe8af 100644 --- a/lib/urbanopt/rnm/capacitor_opendss.rb +++ b/lib/urbanopt/rnm/capacitor_opendss.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/carson_eq.rb b/lib/urbanopt/rnm/carson_eq.rb index 649ce1c..b4bd600 100644 --- a/lib/urbanopt/rnm/carson_eq.rb +++ b/lib/urbanopt/rnm/carson_eq.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/consumers.rb b/lib/urbanopt/rnm/consumers.rb index 621ae6a..33852ff 100644 --- a/lib/urbanopt/rnm/consumers.rb +++ b/lib/urbanopt/rnm/consumers.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/conversion_to_opendss.rb b/lib/urbanopt/rnm/conversion_to_opendss.rb index 6c11b58..6c280e5 100644 --- a/lib/urbanopt/rnm/conversion_to_opendss.rb +++ b/lib/urbanopt/rnm/conversion_to_opendss.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/geojson_input.rb b/lib/urbanopt/rnm/geojson_input.rb index fbb5bc1..70877c8 100644 --- a/lib/urbanopt/rnm/geojson_input.rb +++ b/lib/urbanopt/rnm/geojson_input.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/input_files.rb b/lib/urbanopt/rnm/input_files.rb index fea7068..3ff18ac 100644 --- a/lib/urbanopt/rnm/input_files.rb +++ b/lib/urbanopt/rnm/input_files.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/logger.rb b/lib/urbanopt/rnm/logger.rb index 258d5a0..d20e84d 100644 --- a/lib/urbanopt/rnm/logger.rb +++ b/lib/urbanopt/rnm/logger.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/oh_ug_rate.rb b/lib/urbanopt/rnm/oh_ug_rate.rb index 1e647d2..ab12c66 100644 --- a/lib/urbanopt/rnm/oh_ug_rate.rb +++ b/lib/urbanopt/rnm/oh_ug_rate.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/post_processor.rb b/lib/urbanopt/rnm/post_processor.rb index 1eed056..be287ac 100644 --- a/lib/urbanopt/rnm/post_processor.rb +++ b/lib/urbanopt/rnm/post_processor.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, @@ -59,7 +59,7 @@ def initialize(results, scenario_dir, feature_file, reopt: false) @reopt = reopt end - ## + ## # Post Process report and feature file ## def post_process @@ -68,7 +68,7 @@ def post_process puts "RNM results were added to scenario report and feature file. New files can be found in #{@results_dir}" end - ## + ## # Generate Scenario report ## def generate_report @@ -80,9 +80,9 @@ def generate_report scenario = get_scenario # merge stats with scenario report (before feature_reports section) - + scenario['scenario_report']['rnm_results'] = rnm_stats - + # save back to scenario directory as scenario_report_rnm.json File.open(File.join(@scenario_dir, @report_filename), "w") do |f| f.write(JSON.pretty_generate(scenario)) @@ -90,7 +90,7 @@ def generate_report end - ## + ## # Load Scenario Report ## def get_scenario @@ -98,12 +98,12 @@ def get_scenario # get reopt scenario report return JSON.parse(File.read(File.join(@scenario_dir, 'feature_optimization.json'))) else - # get default scenario report + # get default scenario report return JSON.parse(File.read(File.join(@scenario_dir, 'default_scenario_report.json'))) end end - ## + ## # Generate new GeoJSON file ## def generate_feature_file @@ -155,7 +155,7 @@ def calculate_stats # lines LV and MV stats['electrical_lines_length'] = {} - km_to_mi = 0.621371 + km_to_mi = 0.621371 @results['Length of overhead and underground electrical lines'].each do |item| case item['Voltage level'] when 'Lines LV' diff --git a/lib/urbanopt/rnm/processor_opendss_catalog.rb b/lib/urbanopt/rnm/processor_opendss_catalog.rb index 46a5dec..c81109c 100644 --- a/lib/urbanopt/rnm/processor_opendss_catalog.rb +++ b/lib/urbanopt/rnm/processor_opendss_catalog.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/prosumers.rb b/lib/urbanopt/rnm/prosumers.rb index d258609..2d76282 100644 --- a/lib/urbanopt/rnm/prosumers.rb +++ b/lib/urbanopt/rnm/prosumers.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, @@ -103,7 +103,7 @@ def construct_prosumer_general(profiles, profiles_planning, single_values, build @profile_customer_p.push([id, 48, profiles_planning[:planning_profile_cust_active]]) @profile_customer_p_ext.push([id, 8760, profiles[:yearly_profile_cust_active]]) @profile_customer_q_ext.push([id, 8760, profiles[:yearly_profile_cust_reactive]]) - + if der_capacity[:storage] != nil && der_capacity[:storage] > 0 @customers.push([building_map, id_batt, voltage_default, single_values[:peak_active_power_storage],single_values[:peak_reactive_power_storage], phases]) @customers_ext.push([building_map, id_batt, voltage_default, single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], phases, area, height, (single_values[:energy]).round(2), single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], users]) @@ -138,7 +138,7 @@ def construct_prosumer_lv(nodes_per_bldg = 0, profiles, profiles_planning, singl cont = 1 cont_reverse = 1 nodes_consumers = nodes_per_bldg - 1 - + for i in 1..nodes_per_bldg coordinates = building_map node = closest_node + cont # to set the new nodes with enough distance among each others @@ -146,10 +146,10 @@ def construct_prosumer_lv(nodes_per_bldg = 0, profiles, profiles_planning, singl if i > 1 && node <= building_nodes.length - 2 coordinates = building_nodes[node] # take the closest building node index to the street and pass the nodes after it cont += 1 - elsif i > 1 + elsif i > 1 coordinates = building_nodes[node_reverse] cont_reverse += 1 - end + end # this condition is used to firstly place the building consumption nodes and then the last node # to be placed is the one referred to DG and battery for the building if i < nodes_per_bldg # considering the consumers nodes @@ -159,11 +159,11 @@ def construct_prosumer_lv(nodes_per_bldg = 0, profiles, profiles_planning, singl peak_reactive_power_cons = (single_values[:peak_reactive_power_cons] / nodes_consumers).round(2) voltage_default, phases = voltage_values(peak_active_power_cons / @power_factor) for k in 0..profiles_planning[:planning_profile_cust_active].length - 1 - planning_profile_node_active[k] = (profiles_planning[:planning_profile_cust_active][k] / nodes_consumers).round(2) - planning_profile_node_reactive[k] = (profiles_planning[:planning_profile_cust_reactive][k] / nodes_consumers).round(2) + planning_profile_node_active[k] = (profiles_planning[:planning_profile_cust_active][k] / nodes_consumers).round(2) + planning_profile_node_reactive[k] = (profiles_planning[:planning_profile_cust_reactive][k] / nodes_consumers).round(2) end for k in 0..profiles[:yearly_profile_cust_active].length - 1 - yearly_profile_node_active[k] = (profiles[:yearly_profile_cust_active][k] / nodes_consumers).round(2) + yearly_profile_node_active[k] = (profiles[:yearly_profile_cust_active][k] / nodes_consumers).round(2) yearly_profile_node_reactive[k] = (profiles[:yearly_profile_cust_reactive][k] / nodes_consumers).round(2) end @customers.push([coordinates, id, voltage_default, peak_active_power_cons, peak_reactive_power_cons, phases]) @@ -278,8 +278,8 @@ def av_peak_cons_per_building_type(feature_file) nodes_per_bldg = 1 @medium_voltage = true end - - nodes_per_bldg += 1 # tacking into account the extra node for distributed generation and the battery + + nodes_per_bldg += 1 # tacking into account the extra node for distributed generation and the battery return nodes_per_bldg, area end @@ -374,7 +374,7 @@ def prosumer_files_load(csv_feature_report, json_feature_report, building_map, b area = json_feature_report['program'].has_key?('floor_area') ? (json_feature_report['program']['floor_area']).round(2) : (json_feature_report['program']['floor_area_sqft']).round(2) # associating 2 nodes (consumers & DG and battery in the same node) per building considering the consumer, the battery and DG self.construct_prosumer_general(profiles, profiles_planning, single_values, building_map, area, height, users, der_capacity) - end + end end end end diff --git a/lib/urbanopt/rnm/rnm_us_catalog_conversion.rb b/lib/urbanopt/rnm/rnm_us_catalog_conversion.rb index ac59b30..7783684 100644 --- a/lib/urbanopt/rnm/rnm_us_catalog_conversion.rb +++ b/lib/urbanopt/rnm/rnm_us_catalog_conversion.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/runner.rb b/lib/urbanopt/rnm/runner.rb index d63a6c2..f7c7277 100644 --- a/lib/urbanopt/rnm/runner.rb +++ b/lib/urbanopt/rnm/runner.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/scenario_report.rb b/lib/urbanopt/rnm/scenario_report.rb index deef1ad..8d8bc46 100644 --- a/lib/urbanopt/rnm/scenario_report.rb +++ b/lib/urbanopt/rnm/scenario_report.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/substation_location.rb b/lib/urbanopt/rnm/substation_location.rb index 7002eaa..6f6ad54 100644 --- a/lib/urbanopt/rnm/substation_location.rb +++ b/lib/urbanopt/rnm/substation_location.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/transformer_opendss.rb b/lib/urbanopt/rnm/transformer_opendss.rb index af14ef2..d518e6d 100644 --- a/lib/urbanopt/rnm/transformer_opendss.rb +++ b/lib/urbanopt/rnm/transformer_opendss.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/version.rb b/lib/urbanopt/rnm/version.rb index 9753d96..8e1cc7a 100644 --- a/lib/urbanopt/rnm/version.rb +++ b/lib/urbanopt/rnm/version.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/wires_class.rb b/lib/urbanopt/rnm/wires_class.rb index 0a27500..1070491 100644 --- a/lib/urbanopt/rnm/wires_class.rb +++ b/lib/urbanopt/rnm/wires_class.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/wires_opendss.rb b/lib/urbanopt/rnm/wires_opendss.rb index ba0915f..968dae3 100644 --- a/lib/urbanopt/rnm/wires_opendss.rb +++ b/lib/urbanopt/rnm/wires_opendss.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 1c3e2bd..26631c5 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, diff --git a/spec/urbanopt/urbanopt_rnm_spec.rb b/spec/urbanopt/urbanopt_rnm_spec.rb index 8091fa9..0069525 100644 --- a/spec/urbanopt/urbanopt_rnm_spec.rb +++ b/spec/urbanopt/urbanopt_rnm_spec.rb @@ -1,5 +1,5 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other # contributors. All rights reserved. # Redistribution and use in source and binary forms, with or without modification, From 9b1b6e141f7511b7cecba32943fee78a4708e8f6 Mon Sep 17 00:00:00 2001 From: kflemin Date: Mon, 9 May 2022 11:12:28 -0600 Subject: [PATCH 06/62] update changelog and run rubocop --- CHANGELOG.md | 5 ++ Rakefile | 2 +- lib/urbanopt/rnm/api_client.rb | 14 ++-- lib/urbanopt/rnm/consumers.rb | 10 +-- lib/urbanopt/rnm/geojson_input.rb | 4 +- lib/urbanopt/rnm/post_processor.rb | 11 +-- lib/urbanopt/rnm/prosumers.rb | 84 +++++++++---------- lib/urbanopt/rnm/rnm_us_catalog_conversion.rb | 2 +- lib/urbanopt/rnm/runner.rb | 3 +- lib/urbanopt/rnm/scenario_report.rb | 1 + lib/urbanopt/rnm/wires_opendss.rb | 14 ++-- 11 files changed, 76 insertions(+), 74 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9255a1..60a3b49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## Version 0.3.0 +Date Range 11/23/21 - 05/10/22 + +- Update copyrights + ## Version 0.2.0 Date Range 11/09/21 - 11/22/21 diff --git a/Rakefile b/Rakefile index d5eec86..25cbafc 100644 --- a/Rakefile +++ b/Rakefile @@ -94,7 +94,7 @@ end desc 'Create input files with defaults' task :create_inputs_default, [:scenario_csv_path, :feature_file_path] do |t, args| puts 'Creating input files with defaulted settings' - # if no path passed in, use default: + # if no path passed in, use default: scenario_csv_path = args[:scenario_csv_path] || 'spec/test/example_project/baseline_scenario.csv' root_dir, scenario_file_name = File.split(File.expand_path(scenario_csv_path)) scenario_name = File.basename(scenario_file_name, File.extname(scenario_file_name)) diff --git a/lib/urbanopt/rnm/api_client.rb b/lib/urbanopt/rnm/api_client.rb index cc5e008..01fe70f 100644 --- a/lib/urbanopt/rnm/api_client.rb +++ b/lib/urbanopt/rnm/api_client.rb @@ -197,21 +197,21 @@ def get_results else # edge case, check for results if data['results'].nil? - puts "got a 200 but results are null...trying again" + puts 'got a 200 but results are null...trying again' tries += 1 sleep(3) else # get results @results = data['results'] || [] - puts "downloading results" + puts 'downloading results' # download results download_results return @results end end else - puts "no status yet...trying again" + puts 'no status yet...trying again' tries += 1 sleep(3) end @@ -231,10 +231,10 @@ def get_results sleep(3) end end - rescue => error + rescue StandardError => e @@logger.error("Error retrieving simulation #{@sim_id}.") - @@logger.error(error.message) - raise error.message + @@logger.error(e.message) + raise e.message end end if !done @@ -277,7 +277,7 @@ def download_results(sim_id = nil) zip_file.extract(f, f_path) unless File.exist?(f_path) end end - puts "results.zip extracted" + puts 'results.zip extracted' # delete zip File.delete(file_path) diff --git a/lib/urbanopt/rnm/consumers.rb b/lib/urbanopt/rnm/consumers.rb index 33852ff..091b08d 100644 --- a/lib/urbanopt/rnm/consumers.rb +++ b/lib/urbanopt/rnm/consumers.rb @@ -79,7 +79,7 @@ def construct_consumer(profiles, single_values, building_map, building_nodes, he yearly_profile_node_reactive = [] nodes_per_bldg, area, medium_voltage = av_peak_cons_per_building_type(folder['building_types']) # the default variables are defined (i.e. type and rurality type) - puts "consumers 82" + puts 'consumers 82' closest_node = building_map[3].split('_')[1].to_i # refers to the node, found in the class above node = closest_node cont = 1 @@ -176,7 +176,7 @@ def av_peak_cons_per_building_type(feature_file) conservative_factor = 0.8 # considered as a reasonable assumption, but this value could be changed average_peak_folder = JSON.parse(File.read(@average_building_peak_catalog_path)) for i in 0..feature_file.length - 1 - area = feature_file[i].has_key?('floor_area') ? (feature_file[i]['floor_area']).round(2) : feature_file[i]['floor_area_sqft'].round(2) + area = feature_file[i].key?('floor_area') ? (feature_file[i]['floor_area']).round(2) : feature_file[i]['floor_area_sqft'].round(2) building_type = feature_file[i]['building_type'] # it specifies the type of building, sometimes it is directly the sub-type counter = 0 # counter to find number of buildings type belonging to same "category" average_peak_folder.each do |building_class| @@ -215,10 +215,10 @@ def av_peak_cons_per_building_type(feature_file) # the method passes as arguments the urbanopt json and csv output file for each feature and the building coordinates previously calculated # and the "extreme" hour used to plan the network def customer_files_load(csv_feature_report, json_feature_report, building_map, building_nodes, hour) - n_timestep_per_hour = json_feature_report["timesteps_per_hour"].to_i + n_timestep_per_hour = json_feature_report['timesteps_per_hour'].to_i profiles = Hash.new { |h, k| h[k] = [] } single_values = Hash.new(0) - hours = 24 * n_timestep_per_hour -1 + hours = 24 * n_timestep_per_hour - 1 feature_type = json_feature_report['program']['building_types'][0]['building_type'] residential_building_types = ['Single-Family Detached', 'Single-Family Attached', 'Multifamily', 'Single-Family', 'Multifamily Detached (2 to 4 units)', 'Multifamily Detached (5 or more units)'] @@ -232,7 +232,7 @@ def customer_files_load(csv_feature_report, json_feature_report, building_map, b i = 0 # to represent the 24 hours of a day # content = CSV.foreach(csv_feature_report, headers: true) do |power| CSV.foreach(csv_feature_report, headers: true) do |power| - @power_factor = power['Electricity:Facility Power(kW)'].to_f / power['Electricity:Facility Apparent Power(kVA)'].to_f + @power_factor = power['Electricity:Facility Power(kW)'].to_f / power['Electricity:Facility Apparent Power(kVA)'] profiles[:yearly_profile_cust_active].push(power['Electricity:Facility Power(kW)'].to_f) profiles[:yearly_profile_cust_reactive].push(profiles[:yearly_profile_cust_active][k] * Math.tan(Math.acos(@power_factor))) single_values[:energy] += power['REopt:Electricity:Load:Total(kw)'].to_f # calculating the yearly energy consumed by each feature diff --git a/lib/urbanopt/rnm/geojson_input.rb b/lib/urbanopt/rnm/geojson_input.rb index 70877c8..395a341 100644 --- a/lib/urbanopt/rnm/geojson_input.rb +++ b/lib/urbanopt/rnm/geojson_input.rb @@ -143,7 +143,7 @@ def sub_coordinates(points_coord, id) # creating a method passing the GeoJSON file from URBANopt as the argument to define options that can be modified by the user # streets and building and primary substation coordinates # and returning the street coordinates array, the building coordinates array and the tot number of buildings in the project - def coordinates_feature_hash(geojson_hash,scenario_features=[]) + def coordinates_feature_hash(geojson_hash, scenario_features = []) i = 0 # index representing the number of street_nodes building_number = 0 # variable created to keep track the number of buildings in the project street_number = 0 # variable created to keep track the number of streets in the project @@ -209,7 +209,7 @@ def coordinates_feature_hash(geojson_hash,scenario_features=[]) end street_coordinates[street_number] = each_street street_number += 1 - elsif street['geometry']['type'] == 'Polygon' && street['properties']['type'] == 'Building' and scenario_features.include? street['properties']['id'] + elsif street['geometry']['type'] == 'Polygon' && street['properties']['type'] == 'Building' && scenario_features.include?(street['properties']['id']) for k in 0..street['geometry']['coordinates'].length - 1 h = 0 # index representing number of nodes for each single building building = [] # array containing every building node coordinates and id of 1 building diff --git a/lib/urbanopt/rnm/post_processor.rb b/lib/urbanopt/rnm/post_processor.rb index be287ac..e156edd 100644 --- a/lib/urbanopt/rnm/post_processor.rb +++ b/lib/urbanopt/rnm/post_processor.rb @@ -72,7 +72,6 @@ def post_process # Generate Scenario report ## def generate_report - # calculate rnm statistics rnm_stats = calculate_stats @@ -84,10 +83,9 @@ def generate_report scenario['scenario_report']['rnm_results'] = rnm_stats # save back to scenario directory as scenario_report_rnm.json - File.open(File.join(@scenario_dir, @report_filename), "w") do |f| + File.open(File.join(@scenario_dir, @report_filename), 'w') do |f| f.write(JSON.pretty_generate(scenario)) end - end ## @@ -107,7 +105,6 @@ def get_scenario # Generate new GeoJSON file ## def generate_feature_file - # get results GeoJSON file and read in results = JSON.parse(File.read(File.join(@results_dir, 'GeoJSON', 'Distribution_system.json'))) @@ -117,7 +114,7 @@ def generate_feature_file end # save back to scenario directory as features_and_rnm.json - File.open(File.join(@scenario_dir, @geojson_filename), "w") do |f| + File.open(File.join(@scenario_dir, @geojson_filename), 'w') do |f| f.write(JSON.pretty_generate(@feature_file)) end end @@ -181,8 +178,8 @@ def calculate_stats @results['Summary'].each do |item| case item['Level'] when 'LV' - stats['costs']['investment']['low_voltage_network'] = item['Investment cost'] - stats['costs']['yearly_maintenance']['low_voltage_network'] = item['Preventive maintenance (yearly)'] + stats['costs']['investment']['low_voltage_network'] = item['Investment cost'] + stats['costs']['yearly_maintenance']['low_voltage_network'] = item['Preventive maintenance (yearly)'] when 'MV' stats['costs']['investment']['medium_voltage_network'] = item['Investment cost'] stats['costs']['yearly_maintenance']['medium_voltage_network'] = item['Preventive maintenance (yearly)'] diff --git a/lib/urbanopt/rnm/prosumers.rb b/lib/urbanopt/rnm/prosumers.rb index 2d76282..aad7052 100644 --- a/lib/urbanopt/rnm/prosumers.rb +++ b/lib/urbanopt/rnm/prosumers.rb @@ -84,8 +84,8 @@ def construct_prosumer_general(profiles, profiles_planning, single_values, build # in the hour with generation max peak # in the hour with storage max peak - for i in 0..profiles_planning[:planning_profile_cust_active].length-1 - hourly_app_power = ((profiles_planning[:planning_profile_cust_active][i] + profiles_planning[:planning_profile_storage_active][i] - profiles_planning[:planning_profile_dg_active][i])/@power_factor).abs + for i in 0..profiles_planning[:planning_profile_cust_active].length - 1 + hourly_app_power = ((profiles_planning[:planning_profile_cust_active][i] + profiles_planning[:planning_profile_storage_active][i] - profiles_planning[:planning_profile_dg_active][i]) / @power_factor).abs if hourly_app_power > peak_app_power_node peak_app_power_node = hourly_app_power end @@ -104,8 +104,8 @@ def construct_prosumer_general(profiles, profiles_planning, single_values, build @profile_customer_p_ext.push([id, 8760, profiles[:yearly_profile_cust_active]]) @profile_customer_q_ext.push([id, 8760, profiles[:yearly_profile_cust_reactive]]) - if der_capacity[:storage] != nil && der_capacity[:storage] > 0 - @customers.push([building_map, id_batt, voltage_default, single_values[:peak_active_power_storage],single_values[:peak_reactive_power_storage], phases]) + if !der_capacity[:storage].nil? && der_capacity[:storage] > 0 + @customers.push([building_map, id_batt, voltage_default, single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], phases]) @customers_ext.push([building_map, id_batt, voltage_default, single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], phases, area, height, (single_values[:energy]).round(2), single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], users]) @profile_customer_q.push([id_batt, 48, profiles_planning[:planning_profile_storage_reactive]]) @profile_customer_p.push([id_batt, 48, profiles_planning[:planning_profile_storage_active]]) @@ -159,8 +159,8 @@ def construct_prosumer_lv(nodes_per_bldg = 0, profiles, profiles_planning, singl peak_reactive_power_cons = (single_values[:peak_reactive_power_cons] / nodes_consumers).round(2) voltage_default, phases = voltage_values(peak_active_power_cons / @power_factor) for k in 0..profiles_planning[:planning_profile_cust_active].length - 1 - planning_profile_node_active[k] = (profiles_planning[:planning_profile_cust_active][k] / nodes_consumers).round(2) - planning_profile_node_reactive[k] = (profiles_planning[:planning_profile_cust_reactive][k] / nodes_consumers).round(2) + planning_profile_node_active[k] = (profiles_planning[:planning_profile_cust_active][k] / nodes_consumers).round(2) + planning_profile_node_reactive[k] = (profiles_planning[:planning_profile_cust_reactive][k] / nodes_consumers).round(2) end for k in 0..profiles[:yearly_profile_cust_active].length - 1 yearly_profile_node_active[k] = (profiles[:yearly_profile_cust_active][k] / nodes_consumers).round(2) @@ -174,7 +174,7 @@ def construct_prosumer_lv(nodes_per_bldg = 0, profiles, profiles_planning, singl @profile_customer_q_ext.push([id, 8760, yearly_profile_node_reactive]) else # considering the DG and battery - voltage_default, phases = voltage_values(der_capacity[:dg]) #assuming that the pv capacity is always higher than battery capacity + voltage_default, phases = voltage_values(der_capacity[:dg]) # assuming that the pv capacity is always higher than battery capacity id_dg = "#{coordinates[3]}_DG" id_batt = "#{coordinates[3]}_battery" coordinates.pop @@ -183,7 +183,7 @@ def construct_prosumer_lv(nodes_per_bldg = 0, profiles, profiles_planning, singl @dg_profile_q.push([id_dg, 48, profiles_planning[:planning_profile_dg_reactive]]) @profile_dg_p_extended.push([id_dg, 8760, profiles[:yearly_profile_dg_active]]) @profile_dg_q_extended.push([id_dg, 8760, profiles[:yearly_profile_dg_reactive]]) - if der_capacity[:storage] != nil && der_capacity[:storage] > 0 + if !der_capacity[:storage].nil? && der_capacity[:storage] > 0 @customers.push([coordinates, id_batt, voltage_default, single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], phases]) @customers_ext.push([coordinates, id_batt, voltage_default, single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], phases, area, height, (single_values[:energy]).round(2), single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], users]) @profile_customer_q.push([id_batt, 48, profiles_planning[:planning_profile_storage_reactive]]) @@ -249,15 +249,15 @@ def av_peak_cons_per_building_type(feature_file) average_peak_folder = JSON.parse(File.read(@average_building_peak_catalog_path)) for i in 0..feature_file.length - 1 area = feature_file[i].key?('floor_area') ? (feature_file[i]['floor_area']).round(2) : (feature_file[i]['floor_area_sqft']).round(2) - building_type = feature_file[i]['building_type'] #it specifies the type of building, sometimes it is directly the sub-type + building_type = feature_file[i]['building_type'] # it specifies the type of building, sometimes it is directly the sub-type counter = 0 # counter to find number of buildings type belonging to same "category" average_peak_folder.each do |building_class| - if (building_type == building_class["building type"] || building_type == building_class["sub-type"]) + if building_type == building_class['building type'] || building_type == building_class['sub-type'] average_peak = (building_class['average peak demand (kW/ft2)'].to_f * area).to_f.round(4) # finding the average peak considering the floor area of the bilding under consideration average_peak_by_size[counter] = average_peak floor_area[counter] = (building_class['floor_area (ft2)'] - area).abs # minimum difference among area and area from the prototypes defined by DOE counter += 1 - # in this way I don t consider residential and I assume it s average_peak = 0, it is ok because we assume always 1 node per RES consumers, single-detached family houses + # in this way I don t consider residential and I assume it s average_peak = 0, it is ok because we assume always 1 node per RES consumers, single-detached family houses end end if counter > 1 @@ -273,21 +273,21 @@ def av_peak_cons_per_building_type(feature_file) average_peak = mixed_use_av_peak # average peak per mixed use considering the building types which are in this building area = area_mixed_use end - nodes_per_bldg = ((average_peak / (@lv_limit[:three_phase] * @power_factor * conservative_factor)).to_f).ceil # computing number of nodes per building - if nodes_per_bldg > @max_num_lv_nodes #that it is equal to how it was before + nodes_per_bldg = (average_peak / (@lv_limit[:three_phase] * @power_factor * conservative_factor)).to_f.ceil # computing number of nodes per building + if nodes_per_bldg > @max_num_lv_nodes # that it is equal to how it was before nodes_per_bldg = 1 @medium_voltage = true end - nodes_per_bldg += 1 # tacking into account the extra node for distributed generation and the battery + nodes_per_bldg += 1 # tacking into account the extra node for distributed generation and the battery return nodes_per_bldg, area end # method to order profiles consistently def profiles_planning_creation(profiles_planning, power, single_values, i, hours, power_factor) - profiles_planning[:planning_profile_cust_active][i] = power["REopt:Electricity:Load:Total(kw)"].to_f + profiles_planning[:planning_profile_cust_active][i] = power['REopt:Electricity:Load:Total(kw)'].to_f profiles_planning[:planning_profile_storage_active][i] = power['REopt:Electricity:Grid:ToBattery(kw)'].to_f + power['REopt:ElectricityProduced:Generator:ToBattery(kw)'].to_f + power['REopt:ElectricityProduced:PV:ToBattery(kw)'].to_f + power['REopt:ElectricityProduced:Wind:ToBattery(kw)'].to_f - power['REopt:Electricity:Storage:ToLoad(kw)'].to_f - power['REopt:Electricity:Storage:ToGrid(kw)'].to_f - profiles_planning[:planning_profile_dg_active][i] = power["REopt:ElectricityProduced:Total(kw)"].to_f + profiles_planning[:planning_profile_dg_active][i] = power['REopt:ElectricityProduced:Total(kw)'].to_f profiles_planning[:planning_profile_cust_reactive][i] = profiles_planning[:planning_profile_cust_active][i] * Math.tan(Math.acos(power_factor)) profiles_planning[:planning_profile_storage_reactive][i] = profiles_planning[:planning_profile_storage_active][i] * Math.tan(Math.acos(power_factor)) profiles_planning[:planning_profile_dg_reactive][i] = profiles_planning[:planning_profile_dg_active][i] * Math.tan(Math.acos(power_factor)) @@ -301,7 +301,7 @@ def profiles_planning_creation(profiles_planning, power, single_values, i, hours end if profiles_planning[:planning_profile_dg_active][i] > single_values[:peak_active_power_dg] single_values[:peak_active_power_dg] = profiles_planning[:planning_profile_dg_active][i] - single_values[:peak_reactive_power_dg] = single_values[:peak_active_power_dg] * (Math.tan(Math.acos(power_factor))) + single_values[:peak_reactive_power_dg] = single_values[:peak_active_power_dg] * Math.tan(Math.acos(power_factor)) end return profiles_planning, single_values end @@ -313,13 +313,13 @@ def profiles_planning_creation(profiles_planning, power, single_values, i, hours # and the "extreme" hours used to plan the network def prosumer_files_load(csv_feature_report, json_feature_report, building_map, building_nodes, hour) # add variable to include how many timestep per hour, so the profiles become 48 * n_timestep_per_hour - n_timestep_per_hour = json_feature_report["timesteps_per_hour"].to_i - profiles_planning = Hash.new{|h, k| h[k] = Array.new(48*n_timestep_per_hour, 0)} # initializing each profile hash to 0 for the number of intervals considered for the planning of the network - profiles = Hash.new{|h, k| h[k] = []} + n_timestep_per_hour = json_feature_report['timesteps_per_hour'].to_i + profiles_planning = Hash.new { |h, k| h[k] = Array.new(48 * n_timestep_per_hour, 0) } # initializing each profile hash to 0 for the number of intervals considered for the planning of the network + profiles = Hash.new { |h, k| h[k] = [] } single_values = Hash.new(0) @medium_voltage = false - hours = 24 * n_timestep_per_hour -1 # change name, maybe to intervals - feature_type = json_feature_report['program']['building_types'][0]["building_type"] + hours = 24 * n_timestep_per_hour - 1 # change name, maybe to intervals + feature_type = json_feature_report['program']['building_types'][0]['building_type'] residential_building_types = ['Single-Family Detached', 'Single-Family Attached', 'Multifamily', 'Single-Family', 'Multifamily Detached (2 to 4 units)', 'Multifamily Detached (5 or more units)'] # finding the index where to start computing and saving the info, from the value of the "worst-case hour" for the max peak consumption of the district @@ -332,48 +332,48 @@ def prosumer_files_load(csv_feature_report, json_feature_report, building_map, b profile_start_min = hour.hour_index_min_comm - ((hour.peak_hour_min_comm.split(':')[0].to_i + (hour.peak_hour_min_comm.split(':')[1].to_i / 60)) * n_timestep_per_hour) end # finding the index where to start computing and saving the info, from the value of the "most extreme hours" for the max peak consumption of the district - k = 0 # index for each hour of the year represented in the csv file - i = hours +1 # to represent the 24 hours in case of max_net_generation day + k = 0 # index for each hour of the year represented in the csv file + i = hours + 1 # to represent the 24 hours in case of max_net_generation day j = 0 # to represent the 24 hours in case of peak_demand_day h_cons_batt = 0 h_dg_max = 0 # hour with max DG generation h_stor_max = 0 # hour with max storage absorption max_peak = 0 CSV.foreach(csv_feature_report, headers: true) do |power| - @power_factor = power["Electricity:Facility Power(kW)"].to_f / power["Electricity:Facility Apparent Power(kVA)"].to_f - profiles[:yearly_profile_cust_active].push(power["REopt:Electricity:Load:Total(kw)"].to_f) + @power_factor = power['Electricity:Facility Power(kW)'].to_f / power['Electricity:Facility Apparent Power(kVA)'] + profiles[:yearly_profile_cust_active].push(power['REopt:Electricity:Load:Total(kw)'].to_f) profiles[:yearly_profile_cust_reactive].push(profiles[:yearly_profile_cust_active][k] * Math.tan(Math.acos(@power_factor))) - profiles[:yearly_profile_dg_active].push(power["REopt:ElectricityProduced:Total(kw)"].to_f) + profiles[:yearly_profile_dg_active].push(power['REopt:ElectricityProduced:Total(kw)'].to_f) profiles[:yearly_profile_dg_reactive].push(profiles[:yearly_profile_dg_active][k] * Math.tan(Math.acos(@power_factor))) profiles[:yearly_profile_storage_active].push(power['REopt:Electricity:Grid:ToBattery(kw)'].to_f + power['REopt:ElectricityProduced:Generator:ToBattery(kw)'].to_f + power['REopt:ElectricityProduced:PV:ToBattery(kw)'].to_f + power['REopt:ElectricityProduced:Wind:ToBattery(kw)'].to_f - power['REopt:Electricity:Storage:ToLoad(kw)'].to_f - power['REopt:Electricity:Storage:ToGrid(kw)'].to_f) profiles[:yearly_profile_storage_reactive].push(profiles[:yearly_profile_storage_active][k] * Math.tan(Math.acos(@power_factor))) - single_values[:energy] += power["REopt:Electricity:Load:Total(kw)"].to_f # calculating the yearly energy consumed by each feature - single_values[:energy_dg] += power["REopt:ElectricityProduced:Total(kw)"].to_f + single_values[:energy] += power['REopt:Electricity:Load:Total(kw)'].to_f # calculating the yearly energy consumed by each feature + single_values[:energy_dg] += power['REopt:ElectricityProduced:Total(kw)'].to_f single_values[:energy_storage] += power['REopt:Electricity:Grid:ToBattery(kw)'].to_f + power['REopt:ElectricityProduced:Generator:ToBattery(kw)'].to_f + power['REopt:ElectricityProduced:PV:ToBattery(kw)'].to_f + power['REopt:ElectricityProduced:Wind:ToBattery(kw)'].to_f - power['REopt:Electricity:Storage:ToLoad(kw)'].to_f - power['REopt:Electricity:Storage:ToGrid(kw)'].to_f case k - when profile_start_min..profile_start_min + (hours) - profiles_planning, single_values = self.profiles_planning_creation(profiles_planning, power, single_values, i, hours, power_factor) - i+=1 - when profile_start_max..profile_start_max + (hours) - profiles_planning, single_values = self.profiles_planning_creation(profiles_planning, power, single_values, j, hours, power_factor) - j+=1 + when profile_start_min..profile_start_min + hours + profiles_planning, single_values = profiles_planning_creation(profiles_planning, power, single_values, i, hours, power_factor) + i += 1 + when profile_start_max..profile_start_max + hours + profiles_planning, single_values = profiles_planning_creation(profiles_planning, power, single_values, j, hours, power_factor) + j += 1 end - k+=1 + k += 1 end height = (json_feature_report['program']['maximum_roof_height_ft']).round(2) users = json_feature_report['program']['number_of_residential_units'] - der_capacity = self.sum_dg(json_feature_report['distributed_generation']) + der_capacity = sum_dg(json_feature_report['distributed_generation']) if @only_lv_consumers - nodes_per_bldg, area = self.av_peak_cons_per_building_type(json_feature_report['program']['building_types']) + nodes_per_bldg, area = av_peak_cons_per_building_type(json_feature_report['program']['building_types']) if @max_num_nodes == 1 - self.construct_prosumer_general(profiles, profiles_planning, single_values, building_map, area, height, users, der_capacity) + construct_prosumer_general(profiles, profiles_planning, single_values, building_map, area, height, users, der_capacity) else - self.construct_prosumer_lv(nodes_per_bldg, profiles, profiles_planning, single_values, building_map, building_nodes, area, height, users, der_capacity) + construct_prosumer_lv(nodes_per_bldg, profiles, profiles_planning, single_values, building_map, building_nodes, area, height, users, der_capacity) end else - area = json_feature_report['program'].has_key?('floor_area') ? (json_feature_report['program']['floor_area']).round(2) : (json_feature_report['program']['floor_area_sqft']).round(2) + area = json_feature_report['program'].key?('floor_area') ? (json_feature_report['program']['floor_area']).round(2) : (json_feature_report['program']['floor_area_sqft']).round(2) # associating 2 nodes (consumers & DG and battery in the same node) per building considering the consumer, the battery and DG - self.construct_prosumer_general(profiles, profiles_planning, single_values, building_map, area, height, users, der_capacity) + construct_prosumer_general(profiles, profiles_planning, single_values, building_map, area, height, users, der_capacity) end end end diff --git a/lib/urbanopt/rnm/rnm_us_catalog_conversion.rb b/lib/urbanopt/rnm/rnm_us_catalog_conversion.rb index 7783684..6719780 100644 --- a/lib/urbanopt/rnm/rnm_us_catalog_conversion.rb +++ b/lib/urbanopt/rnm/rnm_us_catalog_conversion.rb @@ -105,7 +105,7 @@ def processing_data(utm_zone) csv << ["<#{key}>"] if ext_catalog[key].is_a?(Hash) # defining the section under consideration is an Hash or an Array if key == 'OTHERS' - ext_catalog[key]["UTM Zone"] = utm_zone.to_s + ext_catalog[key]['UTM Zone'] = utm_zone.to_s end ext_catalog[key].each do |k, v| row = [] diff --git a/lib/urbanopt/rnm/runner.rb b/lib/urbanopt/rnm/runner.rb index f7c7277..4745182 100644 --- a/lib/urbanopt/rnm/runner.rb +++ b/lib/urbanopt/rnm/runner.rb @@ -126,8 +126,7 @@ def initialize(name, run_dir, scenario_csv_path, feature_file_path, extended_cat def get_scenario_features @num_header_rows = 1 features = [] - CSV.foreach(@scenario_csv_path, :headers => true) do |row| - + CSV.foreach(@scenario_csv_path, headers: true) do |row| break if row[0].nil? # gets +feature_id+ and append to list diff --git a/lib/urbanopt/rnm/scenario_report.rb b/lib/urbanopt/rnm/scenario_report.rb index 8d8bc46..b1df54a 100644 --- a/lib/urbanopt/rnm/scenario_report.rb +++ b/lib/urbanopt/rnm/scenario_report.rb @@ -109,6 +109,7 @@ def scenario_report_results end end end + def aggregate_consumption(file_csv, file_json, n_feature) feature_type = file_json['program']['building_types'][0]['building_type'] # residential_building_types = "Single-Family Detached" #add the other types diff --git a/lib/urbanopt/rnm/wires_opendss.rb b/lib/urbanopt/rnm/wires_opendss.rb index 968dae3..d250e27 100644 --- a/lib/urbanopt/rnm/wires_opendss.rb +++ b/lib/urbanopt/rnm/wires_opendss.rb @@ -54,23 +54,23 @@ def create(line_geometry, conductor) conductor.each do |k, v| if k.include? '(mm)' # new_key = "#{k.sub('(mm)', '')}(ft)" - new_key = "#{k.sub(' (mm)', '').gsub(' ','_')}" + new_key = k.sub(' (mm)', '').gsub(' ', '_').to_s hash[new_key] = v elsif k.include? '(A)' - new_key = "#{k.sub(' (A)', '').gsub(' ','_')}" + new_key = k.sub(' (A)', '').gsub(' ', '_').to_s hash[new_key] = v elsif k.include? '#' - new_key = "#{k.sub('#', 'num').gsub(' ', '_')}" + new_key = k.sub('#', 'num').gsub(' ', '_').to_s hash[new_key] = v elsif k.include? '(ohm/km)' # new_key = "#{k.sub('(ohm/km)', '')}(ohm/mi)" - new_key = "#{k.sub(' (ohm/km)', '').gsub(' ','_')}" + new_key = k.sub(' (ohm/km)', '').gsub(' ', '_').to_s hash[new_key] = v elsif k != 'voltage level' && k != 'type' - new_key = "#{k.gsub(' ', '_')}" + new_key = k.gsub(' ', '_').to_s hash[new_key] = v else - new_key = "#{k.gsub(' ', '_')}" + new_key = k.gsub(' ', '_').to_s hash[new_key] = v end end @@ -82,7 +82,7 @@ def create(line_geometry, conductor) elsif k.include? '(m)' hash.delete(k) k = k.split(' ')[0] - new_key = "#{k.sub(' ', '_')}" + new_key = k.sub(' ', '_').to_s hash[new_key] = v end end From 47d556bfe61d4375fc60f44dfc3922a0b9d24f4b Mon Sep 17 00:00:00 2001 From: kflemin Date: Mon, 9 May 2022 21:49:41 -0600 Subject: [PATCH 07/62] fix tests --- Gemfile | 2 ++ lib/urbanopt/rnm/consumers.rb | 2 +- lib/urbanopt/rnm/post_processor.rb | 1 + lib/urbanopt/rnm/prosumers.rb | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 2edcf6a..1046be7 100644 --- a/Gemfile +++ b/Gemfile @@ -8,3 +8,5 @@ allow_local = ENV['FAVOR_LOCAL_GEMS'] # Below is an example of how to configure the gemfile for developing with local gems # modify as appropriate + +gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'develop' \ No newline at end of file diff --git a/lib/urbanopt/rnm/consumers.rb b/lib/urbanopt/rnm/consumers.rb index 091b08d..3e5a00a 100644 --- a/lib/urbanopt/rnm/consumers.rb +++ b/lib/urbanopt/rnm/consumers.rb @@ -232,7 +232,7 @@ def customer_files_load(csv_feature_report, json_feature_report, building_map, b i = 0 # to represent the 24 hours of a day # content = CSV.foreach(csv_feature_report, headers: true) do |power| CSV.foreach(csv_feature_report, headers: true) do |power| - @power_factor = power['Electricity:Facility Power(kW)'].to_f / power['Electricity:Facility Apparent Power(kVA)'] + @power_factor = power['Electricity:Facility Power(kW)'].to_f / power['Electricity:Facility Apparent Power(kVA)'].to_f profiles[:yearly_profile_cust_active].push(power['Electricity:Facility Power(kW)'].to_f) profiles[:yearly_profile_cust_reactive].push(profiles[:yearly_profile_cust_active][k] * Math.tan(Math.acos(@power_factor))) single_values[:energy] += power['REopt:Electricity:Load:Total(kw)'].to_f # calculating the yearly energy consumed by each feature diff --git a/lib/urbanopt/rnm/post_processor.rb b/lib/urbanopt/rnm/post_processor.rb index e156edd..b3babc2 100644 --- a/lib/urbanopt/rnm/post_processor.rb +++ b/lib/urbanopt/rnm/post_processor.rb @@ -129,6 +129,7 @@ def calculate_stats stats['demand_generation_planning'] = [] @results['Demand/generation and number of consumers/distributed generators'].each do |item| rec = {} + puts "ITEM VOLTAGE LEVEL: #{item['Voltage level']}, item type: #{item['Type'].strip}" case item['Voltage level'] when 'LV' rec['type'] = "Low Voltage (LV) #{item['Type'].strip}" diff --git a/lib/urbanopt/rnm/prosumers.rb b/lib/urbanopt/rnm/prosumers.rb index aad7052..36be751 100644 --- a/lib/urbanopt/rnm/prosumers.rb +++ b/lib/urbanopt/rnm/prosumers.rb @@ -340,7 +340,7 @@ def prosumer_files_load(csv_feature_report, json_feature_report, building_map, b h_stor_max = 0 # hour with max storage absorption max_peak = 0 CSV.foreach(csv_feature_report, headers: true) do |power| - @power_factor = power['Electricity:Facility Power(kW)'].to_f / power['Electricity:Facility Apparent Power(kVA)'] + @power_factor = power['Electricity:Facility Power(kW)'].to_f / power['Electricity:Facility Apparent Power(kVA)'].to_f profiles[:yearly_profile_cust_active].push(power['REopt:Electricity:Load:Total(kw)'].to_f) profiles[:yearly_profile_cust_reactive].push(profiles[:yearly_profile_cust_active][k] * Math.tan(Math.acos(@power_factor))) profiles[:yearly_profile_dg_active].push(power['REopt:ElectricityProduced:Total(kw)'].to_f) From 089e0f046cfab14ebef1171dfca31c02b35c7940 Mon Sep 17 00:00:00 2001 From: kflemin Date: Fri, 13 May 2022 15:53:05 -0600 Subject: [PATCH 08/62] prep0.3.0 --- Gemfile | 6 +++++- lib/urbanopt/rnm/version.rb | 2 +- urbanopt-rnm-us-gem.gemspec | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 1046be7..a499375 100644 --- a/Gemfile +++ b/Gemfile @@ -9,4 +9,8 @@ allow_local = ENV['FAVOR_LOCAL_GEMS'] # Below is an example of how to configure the gemfile for developing with local gems # modify as appropriate -gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'develop' \ No newline at end of file +if allow_local && File.exists?('../urbanopt-geojson-gem') + gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem' +elsif allow_local + gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'develop' +end \ No newline at end of file diff --git a/lib/urbanopt/rnm/version.rb b/lib/urbanopt/rnm/version.rb index 8e1cc7a..998ef1e 100644 --- a/lib/urbanopt/rnm/version.rb +++ b/lib/urbanopt/rnm/version.rb @@ -40,6 +40,6 @@ module URBANopt module RNM - VERSION = '0.2.0'.freeze + VERSION = '0.3.0'.freeze end end diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index fb21945..c87f90f 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -27,7 +27,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'faraday', '~> 1.0.1' spec.add_dependency 'geoutm', '~> 1.0.2' spec.add_dependency 'rubyzip', '~> 2.3.2' - spec.add_dependency 'urbanopt-geojson', '~> 0.7.0' + spec.add_dependency 'urbanopt-geojson', '~> 0.8.0' spec.add_development_dependency 'bundler', '~> 2.1' spec.add_development_dependency 'rake', '~> 13.0' From 24966b86c5912a6079c06cb1030fba5134626ddf Mon Sep 17 00:00:00 2001 From: cmateo Date: Thu, 22 Sep 2022 16:50:14 +0200 Subject: [PATCH 09/62] first version URBANopt RNM-US validation module --- Rakefile | 31 + catalogs/extended_catalog.json | 3724 +++++++++-------- lib/urbanopt/rnm.rb | 1 + lib/urbanopt/rnm/runner.rb | 10 + lib/urbanopt/rnm/transformer_opendss.rb | 6 +- lib/urbanopt/rnm/validation.rb | 76 + .../rnm/validation/main_validation.py | 51 + .../rnm/validation/opendss_interface.py | 234 ++ lib/urbanopt/rnm/validation/plot_lib.py | 222 + opendss_catalog.json | 2216 ++++++++++ .../baseline_scenario/opendss_catalog.json | 2216 ++++++++++ .../run/reopt_scenario/opendss_catalog.json | 2216 ++++++++++ 12 files changed, 9202 insertions(+), 1801 deletions(-) create mode 100644 lib/urbanopt/rnm/validation.rb create mode 100644 lib/urbanopt/rnm/validation/main_validation.py create mode 100644 lib/urbanopt/rnm/validation/opendss_interface.py create mode 100644 lib/urbanopt/rnm/validation/plot_lib.py create mode 100644 opendss_catalog.json create mode 100644 spec/files/example_project/run/baseline_scenario/opendss_catalog.json create mode 100644 spec/files/example_project/run/reopt_scenario/opendss_catalog.json diff --git a/Rakefile b/Rakefile index 25cbafc..0ddcd91 100644 --- a/Rakefile +++ b/Rakefile @@ -164,3 +164,34 @@ task :create_opendss_catalog, [:save_path] do |t, args| puts "Catalog saved to #{save_path}" puts '....done!' end + + +# run validation +# pass in the path to the scenario csv +desc 'Run Validation' +task :run_validation, [:scenario_csv_path, :reopt, :use_localhost] do |t, args| + #Exammple to run validation + #bundle exec rake run_validation[D:/.../urbanopt-rnm-us-gem/spec/files/example_project/baseline_scenario.csv] + puts 'Running OpenDSS validation' + # if no path passed in, use default: + scenario_csv = args[:scenario_csv_path] || 'spec/test/example_project/run/baseline_scenario' + root_dir, scenario_file_name = File.split(File.expand_path(scenario_csv)) + scenario_name = File.basename(scenario_file_name, File.extname(scenario_file_name)) + run_dir = File.join(root_dir, 'run', scenario_name.downcase) + + rnm_dir = File.join(run_dir, 'rnm-us') + + + + + if !File.exist?(rnm_dir) + puts rnm_dir + raise 'No rnm-us directory found for this scenario...run the create_inputs rake task first.' + end + + puts "run dir path: #{run_dir}" + validation = URBANopt::RNM::Validation.new(rnm_dir) + validation.run_validation() + + puts '...done!' +end diff --git a/catalogs/extended_catalog.json b/catalogs/extended_catalog.json index a9d6b96..9a1f2e9 100644 --- a/catalogs/extended_catalog.json +++ b/catalogs/extended_catalog.json @@ -8,7 +8,7 @@ "Base Power(kVA):": "100", "Factor to translate power in pu to kVA:": "0.01", "Factor to translate power in pu to MVA:": "0.00001", - "Factor to translate 'x' dolars in Mdolars:": "0.000001", + "Factor to translate 'x' dollars in Mdollars:": "0.000001", "W.A.C.C:": "5", "Rate of Demand Growth(%): ": "0.001", "Rate of Vegetative Growth(%): ": "0", @@ -79,11 +79,11 @@ "Analyze valley scenario (YES / NO)": "NO" }, "POWER FLOW": { - "Number of voltages:": "3", - "Mismatch voltages S (kV):": "0.416,12.47,69", - "Mismatches convergence S (kVA):": "0.01,1,80", - "Minimum allowable voltages (pu):": "0.95, 0.95, 0.95", - "Maximum allowable voltages (pu):": "1.05, 1.05, 1.05", + "Number of voltages:": "4", + "Mismatch voltages S (kV):": "0.120,0.480,12.47,69", + "Mismatches convergence S (kVA):": "0.01, 0.01,1,80", + "Minimum allowable voltages (pu):": "0.95, 0.95, 0.95, 0.95", + "Maximum allowable voltages (pu):": "1.05, 1.05, 1.05, 1.05", "Voltage Mismatch pu:": "0.0001", "Maximum number of iterations for Gauss-Seidel:": "5000", "Minimal transformation relation:": "0.9", @@ -216,17 +216,17 @@ { "#Interurban Zone A:": [ { - "Name": "1P_OH_AL_4_Periwinkle_0_416_0", + "Name": "1P_OH_AL_4_Periwinkle_0_120_0", "Type": "IA", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "7044.866667", - "Preventive maintenance cost (dolars/km)": "73.05526733", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "7044.866667", + "Preventive maintenance cost (dollars/km)": "73.05526733", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -254,17 +254,17 @@ ] }, { - "Name": "1P_OH_AL_1/0_Neritina_0_416_0", + "Name": "1P_OH_AL_1/0_Neritina_0_120_0", "Type": "IA", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "8731.433333", - "Preventive maintenance cost (dolars/km)": "90.54496367", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "8731.433333", + "Preventive maintenance cost (dollars/km)": "90.54496367", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -292,17 +292,17 @@ ] }, { - "Name": "1P_OH_AL_2/0_Rucina_0_416_0", + "Name": "1P_OH_AL_2/0_Rucina_0_120_0", "Type": "IA", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "9530.333333", - "Preventive maintenance cost (dolars/km)": "98.82955667", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "9530.333333", + "Preventive maintenance cost (dollars/km)": "98.82955667", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -330,17 +330,17 @@ ] }, { - "Name": "1P_OH_AL_4/0_Zuzara_0_416_0", + "Name": "1P_OH_AL_4/0_Zuzara_0_120_0", "Type": "IA", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11039.36667", - "Preventive maintenance cost (dolars/km)": "114.4782323", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11039.36667", + "Preventive maintenance cost (dollars/km)": "114.4782323", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -368,17 +368,17 @@ ] }, { - "Name": "3P_UG_AL_4/0_15_0_416_0", + "Name": "3P_UG_AL_4/0_15_0_480_0", "Type": "IA", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "10936.75", - "Preventive maintenance cost (dolars/km)": "113.4140975", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "10936.75", + "Preventive maintenance cost (dollars/km)": "113.4140975", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -406,17 +406,17 @@ ] }, { - "Name": "3P_UG_AL_4/0_25_0_416_0", + "Name": "3P_UG_AL_4/0_25_0_480_0", "Type": "IA", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11059.85", - "Preventive maintenance cost (dolars/km)": "114.6906445", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11059.85", + "Preventive maintenance cost (dollars/km)": "114.6906445", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -444,17 +444,17 @@ ] }, { - "Name": "3P_UG_AL_350kcmil_15_0_416_0", + "Name": "3P_UG_AL_350kcmil_15_0_480_0", "Type": "IA", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11983.1", - "Preventive maintenance cost (dolars/km)": "124.264747", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11983.1", + "Preventive maintenance cost (dollars/km)": "124.264747", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -482,17 +482,17 @@ ] }, { - "Name": "3P_UG_AL_350kcmil_25_0_416_0", + "Name": "3P_UG_AL_350kcmil_25_0_480_0", "Type": "IA", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "12229.3", - "Preventive maintenance cost (dolars/km)": "126.817841", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "12229.3", + "Preventive maintenance cost (dollars/km)": "126.817841", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -520,17 +520,17 @@ ] }, { - "Name": "3P_UG_AL_750kcmil_15_0_416_0", + "Name": "3P_UG_AL_750kcmil_15_0_480_0", "Type": "IA", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "13891.15", - "Preventive maintenance cost (dolars/km)": "144.0512255", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "13891.15", + "Preventive maintenance cost (dollars/km)": "144.0512255", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -558,17 +558,17 @@ ] }, { - "Name": "3P_UG_AL_750kcmil_25_0_416_0", + "Name": "3P_UG_AL_750kcmil_25_0_480_0", "Type": "IA", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "14198.9", - "Preventive maintenance cost (dolars/km)": "147.242593", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "14198.9", + "Preventive maintenance cost (dollars/km)": "147.242593", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -604,9 +604,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "68923.05", - "Preventive maintenance cost (dolars/km)": "714.7320285", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "68923.05", + "Preventive maintenance cost (dollars/km)": "714.7320285", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -636,9 +636,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74315.06667", - "Preventive maintenance cost (dolars/km)": "770.6472413", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74315.06667", + "Preventive maintenance cost (dollars/km)": "770.6472413", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -668,9 +668,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "84608.91667", - "Preventive maintenance cost (dolars/km)": "877.3944658", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "84608.91667", + "Preventive maintenance cost (dollars/km)": "877.3944658", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -700,9 +700,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "99314.41667", - "Preventive maintenance cost (dolars/km)": "1029.890501", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "99314.41667", + "Preventive maintenance cost (dollars/km)": "1029.890501", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -732,9 +732,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "111078.8167", - "Preventive maintenance cost (dolars/km)": "1151.887329", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "111078.8167", + "Preventive maintenance cost (dollars/km)": "1151.887329", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -764,9 +764,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "116470.8333", - "Preventive maintenance cost (dolars/km)": "1207.802542", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "116470.8333", + "Preventive maintenance cost (dollars/km)": "1207.802542", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -802,9 +802,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "145881.8333", - "Preventive maintenance cost (dolars/km)": "1512.794612", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "145881.8333", + "Preventive maintenance cost (dollars/km)": "1512.794612", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -840,9 +840,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "148332.75", - "Preventive maintenance cost (dolars/km)": "1538.210617", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "148332.75", + "Preventive maintenance cost (dollars/km)": "1538.210617", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -884,9 +884,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "192449.25", - "Preventive maintenance cost (dolars/km)": "1995.698722", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "192449.25", + "Preventive maintenance cost (dollars/km)": "1995.698722", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -928,9 +928,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "227742.45", - "Preventive maintenance cost (dolars/km)": "2361.689206", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "227742.45", + "Preventive maintenance cost (dollars/km)": "2361.689206", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -972,9 +972,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1016,9 +1016,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "68923.05", - "Preventive maintenance cost (dolars/km)": "714.7320285", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "68923.05", + "Preventive maintenance cost (dollars/km)": "714.7320285", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1048,9 +1048,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74315.06667", - "Preventive maintenance cost (dolars/km)": "770.6472413", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74315.06667", + "Preventive maintenance cost (dollars/km)": "770.6472413", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1080,9 +1080,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "84608.91667", - "Preventive maintenance cost (dolars/km)": "877.3944658", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "84608.91667", + "Preventive maintenance cost (dollars/km)": "877.3944658", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1112,9 +1112,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "99314.41667", - "Preventive maintenance cost (dolars/km)": "1029.890501", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "99314.41667", + "Preventive maintenance cost (dollars/km)": "1029.890501", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1144,9 +1144,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "111078.8167", - "Preventive maintenance cost (dolars/km)": "1151.887329", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "111078.8167", + "Preventive maintenance cost (dollars/km)": "1151.887329", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1176,9 +1176,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "116470.8333", - "Preventive maintenance cost (dolars/km)": "1207.802542", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "116470.8333", + "Preventive maintenance cost (dollars/km)": "1207.802542", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1214,9 +1214,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "145881.8333", - "Preventive maintenance cost (dolars/km)": "1512.794612", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "145881.8333", + "Preventive maintenance cost (dollars/km)": "1512.794612", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1252,9 +1252,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "148332.75", - "Preventive maintenance cost (dolars/km)": "1538.210617", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "148332.75", + "Preventive maintenance cost (dollars/km)": "1538.210617", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1296,9 +1296,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "192449.25", - "Preventive maintenance cost (dolars/km)": "1995.698722", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "192449.25", + "Preventive maintenance cost (dollars/km)": "1995.698722", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1340,9 +1340,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "227742.45", - "Preventive maintenance cost (dolars/km)": "2361.689206", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "227742.45", + "Preventive maintenance cost (dollars/km)": "2361.689206", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1384,9 +1384,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1428,9 +1428,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "68923.05", - "Preventive maintenance cost (dolars/km)": "714.7320285", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "68923.05", + "Preventive maintenance cost (dollars/km)": "714.7320285", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1460,9 +1460,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74315.06667", - "Preventive maintenance cost (dolars/km)": "770.6472413", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74315.06667", + "Preventive maintenance cost (dollars/km)": "770.6472413", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1492,9 +1492,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "84608.91667", - "Preventive maintenance cost (dolars/km)": "877.3944658", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "84608.91667", + "Preventive maintenance cost (dollars/km)": "877.3944658", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1524,9 +1524,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "99314.41667", - "Preventive maintenance cost (dolars/km)": "1029.890501", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "99314.41667", + "Preventive maintenance cost (dollars/km)": "1029.890501", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1556,9 +1556,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "111078.8167", - "Preventive maintenance cost (dolars/km)": "1151.887329", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "111078.8167", + "Preventive maintenance cost (dollars/km)": "1151.887329", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1588,9 +1588,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "116470.8333", - "Preventive maintenance cost (dolars/km)": "1207.802542", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "116470.8333", + "Preventive maintenance cost (dollars/km)": "1207.802542", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1626,9 +1626,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "145881.8333", - "Preventive maintenance cost (dolars/km)": "1512.794612", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "145881.8333", + "Preventive maintenance cost (dollars/km)": "1512.794612", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1664,9 +1664,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "148332.75", - "Preventive maintenance cost (dolars/km)": "1538.210617", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "148332.75", + "Preventive maintenance cost (dollars/km)": "1538.210617", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1708,9 +1708,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "192449.25", - "Preventive maintenance cost (dolars/km)": "1995.698722", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "192449.25", + "Preventive maintenance cost (dollars/km)": "1995.698722", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1752,9 +1752,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "227742.45", - "Preventive maintenance cost (dolars/km)": "2361.689206", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "227742.45", + "Preventive maintenance cost (dollars/km)": "2361.689206", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1796,9 +1796,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1840,9 +1840,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "69413.23333", - "Preventive maintenance cost (dolars/km)": "719.8152297", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "69413.23333", + "Preventive maintenance cost (dollars/km)": "719.8152297", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1872,9 +1872,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74805.25", - "Preventive maintenance cost (dolars/km)": "775.7304425", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74805.25", + "Preventive maintenance cost (dollars/km)": "775.7304425", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1904,9 +1904,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "87059.83333", - "Preventive maintenance cost (dolars/km)": "902.8104717", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "87059.83333", + "Preventive maintenance cost (dollars/km)": "902.8104717", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1936,9 +1936,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "98824.23333", - "Preventive maintenance cost (dolars/km)": "1024.8073", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "98824.23333", + "Preventive maintenance cost (dollars/km)": "1024.8073", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -1968,9 +1968,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "110098.45", - "Preventive maintenance cost (dolars/km)": "1141.720926", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "110098.45", + "Preventive maintenance cost (dollars/km)": "1141.720926", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2000,9 +2000,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "121372.6667", - "Preventive maintenance cost (dolars/km)": "1258.634553", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "121372.6667", + "Preventive maintenance cost (dollars/km)": "1258.634553", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2038,9 +2038,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "144901.4667", - "Preventive maintenance cost (dolars/km)": "1502.628209", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "144901.4667", + "Preventive maintenance cost (dollars/km)": "1502.628209", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2076,9 +2076,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "155685.5", - "Preventive maintenance cost (dolars/km)": "1614.458635", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "155685.5", + "Preventive maintenance cost (dollars/km)": "1614.458635", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2120,9 +2120,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "190978.7", - "Preventive maintenance cost (dolars/km)": "1980.449119", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "190978.7", + "Preventive maintenance cost (dollars/km)": "1980.449119", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2164,9 +2164,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "224801.35", - "Preventive maintenance cost (dolars/km)": "2331.189999", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "224801.35", + "Preventive maintenance cost (dollars/km)": "2331.189999", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2208,9 +2208,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "288035", - "Preventive maintenance cost (dolars/km)": "2986.92295", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "288035", + "Preventive maintenance cost (dollars/km)": "2986.92295", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2252,9 +2252,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2292,17 +2292,17 @@ { "#Interurban Zone B:": [ { - "Name": "1P_OH_AL_4_Periwinkle_0_416_0", + "Name": "1P_OH_AL_4_Periwinkle_0_120_0", "Type": "IB", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "7044.866667", - "Preventive maintenance cost (dolars/km)": "73.05526733", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "7044.866667", + "Preventive maintenance cost (dollars/km)": "73.05526733", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2330,17 +2330,17 @@ ] }, { - "Name": "1P_OH_AL_1/0_Neritina_0_416_0", + "Name": "1P_OH_AL_1/0_Neritina_0_120_0", "Type": "IB", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "8731.433333", - "Preventive maintenance cost (dolars/km)": "90.54496367", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "8731.433333", + "Preventive maintenance cost (dollars/km)": "90.54496367", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2368,17 +2368,17 @@ ] }, { - "Name": "1P_OH_AL_2/0_Rucina_0_416_0", + "Name": "1P_OH_AL_2/0_Rucina_0_120_0", "Type": "IB", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "9530.333333", - "Preventive maintenance cost (dolars/km)": "98.82955667", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "9530.333333", + "Preventive maintenance cost (dollars/km)": "98.82955667", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2406,17 +2406,17 @@ ] }, { - "Name": "1P_OH_AL_4/0_Zuzara_0_416_0", + "Name": "1P_OH_AL_4/0_Zuzara_0_120_0", "Type": "IB", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11039.36667", - "Preventive maintenance cost (dolars/km)": "114.4782323", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11039.36667", + "Preventive maintenance cost (dollars/km)": "114.4782323", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2444,17 +2444,17 @@ ] }, { - "Name": "3P_UG_AL_4/0_15_0_416_0", + "Name": "3P_UG_AL_4/0_15_0_480_0", "Type": "IB", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "10936.75", - "Preventive maintenance cost (dolars/km)": "113.4140975", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "10936.75", + "Preventive maintenance cost (dollars/km)": "113.4140975", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -2482,17 +2482,17 @@ ] }, { - "Name": "3P_UG_AL_4/0_25_0_416_0", + "Name": "3P_UG_AL_4/0_25_0_480_0", "Type": "IB", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11059.85", - "Preventive maintenance cost (dolars/km)": "114.6906445", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11059.85", + "Preventive maintenance cost (dollars/km)": "114.6906445", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -2520,17 +2520,17 @@ ] }, { - "Name": "3P_UG_AL_350kcmil_15_0_416_0", + "Name": "3P_UG_AL_350kcmil_15_0_480_0", "Type": "IB", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11983.1", - "Preventive maintenance cost (dolars/km)": "124.264747", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11983.1", + "Preventive maintenance cost (dollars/km)": "124.264747", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -2558,17 +2558,17 @@ ] }, { - "Name": "3P_UG_AL_350kcmil_25_0_416_0", + "Name": "3P_UG_AL_350kcmil_25_0_480_0", "Type": "IB", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "12229.3", - "Preventive maintenance cost (dolars/km)": "126.817841", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "12229.3", + "Preventive maintenance cost (dollars/km)": "126.817841", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -2596,17 +2596,17 @@ ] }, { - "Name": "3P_UG_AL_750kcmil_15_0_416_0", + "Name": "3P_UG_AL_750kcmil_15_0_480_0", "Type": "IB", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "13891.15", - "Preventive maintenance cost (dolars/km)": "144.0512255", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "13891.15", + "Preventive maintenance cost (dollars/km)": "144.0512255", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -2634,17 +2634,17 @@ ] }, { - "Name": "3P_UG_AL_750kcmil_25_0_416_0", + "Name": "3P_UG_AL_750kcmil_25_0_480_0", "Type": "IB", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "14198.9", - "Preventive maintenance cost (dolars/km)": "147.242593", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "14198.9", + "Preventive maintenance cost (dollars/km)": "147.242593", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -2680,9 +2680,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "68923.05", - "Preventive maintenance cost (dolars/km)": "714.7320285", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "68923.05", + "Preventive maintenance cost (dollars/km)": "714.7320285", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2712,9 +2712,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74315.06667", - "Preventive maintenance cost (dolars/km)": "770.6472413", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74315.06667", + "Preventive maintenance cost (dollars/km)": "770.6472413", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2744,9 +2744,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "84608.91667", - "Preventive maintenance cost (dolars/km)": "877.3944658", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "84608.91667", + "Preventive maintenance cost (dollars/km)": "877.3944658", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2776,9 +2776,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "99314.41667", - "Preventive maintenance cost (dolars/km)": "1029.890501", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "99314.41667", + "Preventive maintenance cost (dollars/km)": "1029.890501", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2808,9 +2808,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "111078.8167", - "Preventive maintenance cost (dolars/km)": "1151.887329", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "111078.8167", + "Preventive maintenance cost (dollars/km)": "1151.887329", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2840,9 +2840,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "116470.8333", - "Preventive maintenance cost (dolars/km)": "1207.802542", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "116470.8333", + "Preventive maintenance cost (dollars/km)": "1207.802542", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2878,9 +2878,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "145881.8333", - "Preventive maintenance cost (dolars/km)": "1512.794612", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "145881.8333", + "Preventive maintenance cost (dollars/km)": "1512.794612", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2916,9 +2916,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "148332.75", - "Preventive maintenance cost (dolars/km)": "1538.210617", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "148332.75", + "Preventive maintenance cost (dollars/km)": "1538.210617", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -2960,9 +2960,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "192449.25", - "Preventive maintenance cost (dolars/km)": "1995.698722", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "192449.25", + "Preventive maintenance cost (dollars/km)": "1995.698722", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3004,9 +3004,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "227742.45", - "Preventive maintenance cost (dolars/km)": "2361.689206", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "227742.45", + "Preventive maintenance cost (dollars/km)": "2361.689206", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3048,9 +3048,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3092,9 +3092,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "68923.05", - "Preventive maintenance cost (dolars/km)": "714.7320285", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "68923.05", + "Preventive maintenance cost (dollars/km)": "714.7320285", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3124,9 +3124,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74315.06667", - "Preventive maintenance cost (dolars/km)": "770.6472413", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74315.06667", + "Preventive maintenance cost (dollars/km)": "770.6472413", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3156,9 +3156,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "84608.91667", - "Preventive maintenance cost (dolars/km)": "877.3944658", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "84608.91667", + "Preventive maintenance cost (dollars/km)": "877.3944658", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3188,9 +3188,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "99314.41667", - "Preventive maintenance cost (dolars/km)": "1029.890501", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "99314.41667", + "Preventive maintenance cost (dollars/km)": "1029.890501", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3220,9 +3220,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "111078.8167", - "Preventive maintenance cost (dolars/km)": "1151.887329", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "111078.8167", + "Preventive maintenance cost (dollars/km)": "1151.887329", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3252,9 +3252,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "116470.8333", - "Preventive maintenance cost (dolars/km)": "1207.802542", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "116470.8333", + "Preventive maintenance cost (dollars/km)": "1207.802542", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3290,9 +3290,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "145881.8333", - "Preventive maintenance cost (dolars/km)": "1512.794612", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "145881.8333", + "Preventive maintenance cost (dollars/km)": "1512.794612", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3328,9 +3328,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "148332.75", - "Preventive maintenance cost (dolars/km)": "1538.210617", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "148332.75", + "Preventive maintenance cost (dollars/km)": "1538.210617", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3372,9 +3372,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "192449.25", - "Preventive maintenance cost (dolars/km)": "1995.698722", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "192449.25", + "Preventive maintenance cost (dollars/km)": "1995.698722", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3416,9 +3416,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "227742.45", - "Preventive maintenance cost (dolars/km)": "2361.689206", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "227742.45", + "Preventive maintenance cost (dollars/km)": "2361.689206", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3460,9 +3460,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3504,9 +3504,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "68923.05", - "Preventive maintenance cost (dolars/km)": "714.7320285", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "68923.05", + "Preventive maintenance cost (dollars/km)": "714.7320285", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3536,9 +3536,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74315.06667", - "Preventive maintenance cost (dolars/km)": "770.6472413", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74315.06667", + "Preventive maintenance cost (dollars/km)": "770.6472413", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3568,9 +3568,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "84608.91667", - "Preventive maintenance cost (dolars/km)": "877.3944658", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "84608.91667", + "Preventive maintenance cost (dollars/km)": "877.3944658", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3600,9 +3600,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "99314.41667", - "Preventive maintenance cost (dolars/km)": "1029.890501", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "99314.41667", + "Preventive maintenance cost (dollars/km)": "1029.890501", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3632,9 +3632,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "111078.8167", - "Preventive maintenance cost (dolars/km)": "1151.887329", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "111078.8167", + "Preventive maintenance cost (dollars/km)": "1151.887329", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3664,9 +3664,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "116470.8333", - "Preventive maintenance cost (dolars/km)": "1207.802542", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "116470.8333", + "Preventive maintenance cost (dollars/km)": "1207.802542", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3702,9 +3702,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "145881.8333", - "Preventive maintenance cost (dolars/km)": "1512.794612", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "145881.8333", + "Preventive maintenance cost (dollars/km)": "1512.794612", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3740,9 +3740,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "148332.75", - "Preventive maintenance cost (dolars/km)": "1538.210617", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "148332.75", + "Preventive maintenance cost (dollars/km)": "1538.210617", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3784,9 +3784,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "192449.25", - "Preventive maintenance cost (dolars/km)": "1995.698722", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "192449.25", + "Preventive maintenance cost (dollars/km)": "1995.698722", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3828,9 +3828,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "227742.45", - "Preventive maintenance cost (dolars/km)": "2361.689206", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "227742.45", + "Preventive maintenance cost (dollars/km)": "2361.689206", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3872,9 +3872,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3916,9 +3916,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "69413.23333", - "Preventive maintenance cost (dolars/km)": "719.8152297", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "69413.23333", + "Preventive maintenance cost (dollars/km)": "719.8152297", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3948,9 +3948,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74805.25", - "Preventive maintenance cost (dolars/km)": "775.7304425", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74805.25", + "Preventive maintenance cost (dollars/km)": "775.7304425", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -3980,9 +3980,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "87059.83333", - "Preventive maintenance cost (dolars/km)": "902.8104717", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "87059.83333", + "Preventive maintenance cost (dollars/km)": "902.8104717", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4012,9 +4012,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "98824.23333", - "Preventive maintenance cost (dolars/km)": "1024.8073", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "98824.23333", + "Preventive maintenance cost (dollars/km)": "1024.8073", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4044,9 +4044,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "110098.45", - "Preventive maintenance cost (dolars/km)": "1141.720926", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "110098.45", + "Preventive maintenance cost (dollars/km)": "1141.720926", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4076,9 +4076,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "121372.6667", - "Preventive maintenance cost (dolars/km)": "1258.634553", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "121372.6667", + "Preventive maintenance cost (dollars/km)": "1258.634553", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4114,9 +4114,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "144901.4667", - "Preventive maintenance cost (dolars/km)": "1502.628209", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "144901.4667", + "Preventive maintenance cost (dollars/km)": "1502.628209", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4152,9 +4152,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "155685.5", - "Preventive maintenance cost (dolars/km)": "1614.458635", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "155685.5", + "Preventive maintenance cost (dollars/km)": "1614.458635", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4196,9 +4196,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "190978.7", - "Preventive maintenance cost (dolars/km)": "1980.449119", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "190978.7", + "Preventive maintenance cost (dollars/km)": "1980.449119", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4240,9 +4240,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "224801.35", - "Preventive maintenance cost (dolars/km)": "2331.189999", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "224801.35", + "Preventive maintenance cost (dollars/km)": "2331.189999", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4284,9 +4284,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "288035", - "Preventive maintenance cost (dolars/km)": "2986.92295", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "288035", + "Preventive maintenance cost (dollars/km)": "2986.92295", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4328,9 +4328,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4368,17 +4368,17 @@ { "#Interurban Zone C:": [ { - "Name": "1P_OH_AL_4_Periwinkle_0_416_0", + "Name": "1P_OH_AL_4_Periwinkle_0_120_0", "Type": "IC", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "7044.866667", - "Preventive maintenance cost (dolars/km)": "73.05526733", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "7044.866667", + "Preventive maintenance cost (dollars/km)": "73.05526733", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4406,17 +4406,17 @@ ] }, { - "Name": "1P_OH_AL_1/0_Neritina_0_416_0", + "Name": "1P_OH_AL_1/0_Neritina_0_120_0", "Type": "IC", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "8731.433333", - "Preventive maintenance cost (dolars/km)": "90.54496367", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "8731.433333", + "Preventive maintenance cost (dollars/km)": "90.54496367", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4444,17 +4444,17 @@ ] }, { - "Name": "1P_OH_AL_2/0_Rucina_0_416_0", + "Name": "1P_OH_AL_2/0_Rucina_0_120_0", "Type": "IC", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "9530.333333", - "Preventive maintenance cost (dolars/km)": "98.82955667", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "9530.333333", + "Preventive maintenance cost (dollars/km)": "98.82955667", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4482,17 +4482,17 @@ ] }, { - "Name": "1P_OH_AL_4/0_Zuzara_0_416_0", + "Name": "1P_OH_AL_4/0_Zuzara_0_120_0", "Type": "IC", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11039.36667", - "Preventive maintenance cost (dolars/km)": "114.4782323", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11039.36667", + "Preventive maintenance cost (dollars/km)": "114.4782323", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4520,17 +4520,17 @@ ] }, { - "Name": "3P_UG_AL_4/0_15_0_416_0", + "Name": "3P_UG_AL_4/0_15_0_480_0", "Type": "IC", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "10936.75", - "Preventive maintenance cost (dolars/km)": "113.4140975", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "10936.75", + "Preventive maintenance cost (dollars/km)": "113.4140975", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -4558,17 +4558,17 @@ ] }, { - "Name": "3P_UG_AL_4/0_25_0_416_0", + "Name": "3P_UG_AL_4/0_25_0_480_0", "Type": "IC", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11059.85", - "Preventive maintenance cost (dolars/km)": "114.6906445", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11059.85", + "Preventive maintenance cost (dollars/km)": "114.6906445", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -4596,17 +4596,17 @@ ] }, { - "Name": "3P_UG_AL_350kcmil_15_0_416_0", + "Name": "3P_UG_AL_350kcmil_15_0_480_0", "Type": "IC", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11983.1", - "Preventive maintenance cost (dolars/km)": "124.264747", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11983.1", + "Preventive maintenance cost (dollars/km)": "124.264747", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -4634,17 +4634,17 @@ ] }, { - "Name": "3P_UG_AL_350kcmil_25_0_416_0", + "Name": "3P_UG_AL_350kcmil_25_0_480_0", "Type": "IC", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "12229.3", - "Preventive maintenance cost (dolars/km)": "126.817841", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "12229.3", + "Preventive maintenance cost (dollars/km)": "126.817841", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -4672,17 +4672,17 @@ ] }, { - "Name": "3P_UG_AL_750kcmil_15_0_416_0", + "Name": "3P_UG_AL_750kcmil_15_0_480_0", "Type": "IC", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "13891.15", - "Preventive maintenance cost (dolars/km)": "144.0512255", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "13891.15", + "Preventive maintenance cost (dollars/km)": "144.0512255", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -4710,17 +4710,17 @@ ] }, { - "Name": "3P_UG_AL_750kcmil_25_0_416_0", + "Name": "3P_UG_AL_750kcmil_25_0_480_0", "Type": "IC", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "14198.9", - "Preventive maintenance cost (dolars/km)": "147.242593", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "14198.9", + "Preventive maintenance cost (dollars/km)": "147.242593", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -4756,9 +4756,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "68923.05", - "Preventive maintenance cost (dolars/km)": "714.7320285", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "68923.05", + "Preventive maintenance cost (dollars/km)": "714.7320285", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4788,9 +4788,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74315.06667", - "Preventive maintenance cost (dolars/km)": "770.6472413", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74315.06667", + "Preventive maintenance cost (dollars/km)": "770.6472413", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4820,9 +4820,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "84608.91667", - "Preventive maintenance cost (dolars/km)": "877.3944658", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "84608.91667", + "Preventive maintenance cost (dollars/km)": "877.3944658", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4852,9 +4852,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "99314.41667", - "Preventive maintenance cost (dolars/km)": "1029.890501", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "99314.41667", + "Preventive maintenance cost (dollars/km)": "1029.890501", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4884,9 +4884,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "111078.8167", - "Preventive maintenance cost (dolars/km)": "1151.887329", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "111078.8167", + "Preventive maintenance cost (dollars/km)": "1151.887329", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4916,9 +4916,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "116470.8333", - "Preventive maintenance cost (dolars/km)": "1207.802542", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "116470.8333", + "Preventive maintenance cost (dollars/km)": "1207.802542", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4954,9 +4954,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "145881.8333", - "Preventive maintenance cost (dolars/km)": "1512.794612", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "145881.8333", + "Preventive maintenance cost (dollars/km)": "1512.794612", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -4992,9 +4992,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "148332.75", - "Preventive maintenance cost (dolars/km)": "1538.210617", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "148332.75", + "Preventive maintenance cost (dollars/km)": "1538.210617", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5036,9 +5036,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "192449.25", - "Preventive maintenance cost (dolars/km)": "1995.698722", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "192449.25", + "Preventive maintenance cost (dollars/km)": "1995.698722", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5080,9 +5080,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "227742.45", - "Preventive maintenance cost (dolars/km)": "2361.689206", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "227742.45", + "Preventive maintenance cost (dollars/km)": "2361.689206", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5124,9 +5124,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5168,9 +5168,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "68923.05", - "Preventive maintenance cost (dolars/km)": "714.7320285", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "68923.05", + "Preventive maintenance cost (dollars/km)": "714.7320285", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5200,9 +5200,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74315.06667", - "Preventive maintenance cost (dolars/km)": "770.6472413", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74315.06667", + "Preventive maintenance cost (dollars/km)": "770.6472413", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5232,9 +5232,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "84608.91667", - "Preventive maintenance cost (dolars/km)": "877.3944658", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "84608.91667", + "Preventive maintenance cost (dollars/km)": "877.3944658", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5264,9 +5264,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "99314.41667", - "Preventive maintenance cost (dolars/km)": "1029.890501", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "99314.41667", + "Preventive maintenance cost (dollars/km)": "1029.890501", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5296,9 +5296,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "111078.8167", - "Preventive maintenance cost (dolars/km)": "1151.887329", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "111078.8167", + "Preventive maintenance cost (dollars/km)": "1151.887329", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5328,9 +5328,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "116470.8333", - "Preventive maintenance cost (dolars/km)": "1207.802542", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "116470.8333", + "Preventive maintenance cost (dollars/km)": "1207.802542", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5366,9 +5366,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "145881.8333", - "Preventive maintenance cost (dolars/km)": "1512.794612", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "145881.8333", + "Preventive maintenance cost (dollars/km)": "1512.794612", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5404,9 +5404,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "148332.75", - "Preventive maintenance cost (dolars/km)": "1538.210617", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "148332.75", + "Preventive maintenance cost (dollars/km)": "1538.210617", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5448,9 +5448,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "192449.25", - "Preventive maintenance cost (dolars/km)": "1995.698722", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "192449.25", + "Preventive maintenance cost (dollars/km)": "1995.698722", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5492,9 +5492,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "227742.45", - "Preventive maintenance cost (dolars/km)": "2361.689206", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "227742.45", + "Preventive maintenance cost (dollars/km)": "2361.689206", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5536,9 +5536,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5580,9 +5580,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "68923.05", - "Preventive maintenance cost (dolars/km)": "714.7320285", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "68923.05", + "Preventive maintenance cost (dollars/km)": "714.7320285", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5612,9 +5612,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74315.06667", - "Preventive maintenance cost (dolars/km)": "770.6472413", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74315.06667", + "Preventive maintenance cost (dollars/km)": "770.6472413", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5644,9 +5644,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "84608.91667", - "Preventive maintenance cost (dolars/km)": "877.3944658", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "84608.91667", + "Preventive maintenance cost (dollars/km)": "877.3944658", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5676,9 +5676,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "99314.41667", - "Preventive maintenance cost (dolars/km)": "1029.890501", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "99314.41667", + "Preventive maintenance cost (dollars/km)": "1029.890501", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5708,9 +5708,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "111078.8167", - "Preventive maintenance cost (dolars/km)": "1151.887329", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "111078.8167", + "Preventive maintenance cost (dollars/km)": "1151.887329", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5740,9 +5740,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "116470.8333", - "Preventive maintenance cost (dolars/km)": "1207.802542", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "116470.8333", + "Preventive maintenance cost (dollars/km)": "1207.802542", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5778,9 +5778,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "145881.8333", - "Preventive maintenance cost (dolars/km)": "1512.794612", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "145881.8333", + "Preventive maintenance cost (dollars/km)": "1512.794612", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5816,9 +5816,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "148332.75", - "Preventive maintenance cost (dolars/km)": "1538.210617", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "148332.75", + "Preventive maintenance cost (dollars/km)": "1538.210617", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5860,9 +5860,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "192449.25", - "Preventive maintenance cost (dolars/km)": "1995.698722", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "192449.25", + "Preventive maintenance cost (dollars/km)": "1995.698722", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5904,9 +5904,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "227742.45", - "Preventive maintenance cost (dolars/km)": "2361.689206", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "227742.45", + "Preventive maintenance cost (dollars/km)": "2361.689206", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5948,9 +5948,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -5992,9 +5992,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "69413.23333", - "Preventive maintenance cost (dolars/km)": "719.8152297", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "69413.23333", + "Preventive maintenance cost (dollars/km)": "719.8152297", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6024,9 +6024,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74805.25", - "Preventive maintenance cost (dolars/km)": "775.7304425", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74805.25", + "Preventive maintenance cost (dollars/km)": "775.7304425", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6056,9 +6056,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "87059.83333", - "Preventive maintenance cost (dolars/km)": "902.8104717", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "87059.83333", + "Preventive maintenance cost (dollars/km)": "902.8104717", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6088,9 +6088,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "98824.23333", - "Preventive maintenance cost (dolars/km)": "1024.8073", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "98824.23333", + "Preventive maintenance cost (dollars/km)": "1024.8073", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6120,9 +6120,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "110098.45", - "Preventive maintenance cost (dolars/km)": "1141.720926", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "110098.45", + "Preventive maintenance cost (dollars/km)": "1141.720926", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6152,9 +6152,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "121372.6667", - "Preventive maintenance cost (dolars/km)": "1258.634553", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "121372.6667", + "Preventive maintenance cost (dollars/km)": "1258.634553", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6190,9 +6190,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "144901.4667", - "Preventive maintenance cost (dolars/km)": "1502.628209", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "144901.4667", + "Preventive maintenance cost (dollars/km)": "1502.628209", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6228,9 +6228,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "155685.5", - "Preventive maintenance cost (dolars/km)": "1614.458635", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "155685.5", + "Preventive maintenance cost (dollars/km)": "1614.458635", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6272,9 +6272,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "190978.7", - "Preventive maintenance cost (dolars/km)": "1980.449119", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "190978.7", + "Preventive maintenance cost (dollars/km)": "1980.449119", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6316,9 +6316,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "224801.35", - "Preventive maintenance cost (dolars/km)": "2331.189999", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "224801.35", + "Preventive maintenance cost (dollars/km)": "2331.189999", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6360,9 +6360,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "288035", - "Preventive maintenance cost (dolars/km)": "2986.92295", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "288035", + "Preventive maintenance cost (dollars/km)": "2986.92295", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6404,9 +6404,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6444,17 +6444,17 @@ { "#Urban-Overhead": [ { - "Name": "1P_OH_AL_4_Periwinkle_0_416_0", + "Name": "1P_OH_AL_4_Periwinkle_0_120_0", "Type": "UA", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "7044.866667", - "Preventive maintenance cost (dolars/km)": "73.05526733", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "7044.866667", + "Preventive maintenance cost (dollars/km)": "73.05526733", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6482,17 +6482,17 @@ ] }, { - "Name": "1P_OH_AL_1/0_Neritina_0_416_0", + "Name": "1P_OH_AL_1/0_Neritina_0_120_0", "Type": "UA", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "8731.433333", - "Preventive maintenance cost (dolars/km)": "90.54496367", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "8731.433333", + "Preventive maintenance cost (dollars/km)": "90.54496367", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6520,17 +6520,17 @@ ] }, { - "Name": "1P_OH_AL_2/0_Rucina_0_416_0", + "Name": "1P_OH_AL_2/0_Rucina_0_120_0", "Type": "UA", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "9530.333333", - "Preventive maintenance cost (dolars/km)": "98.82955667", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "9530.333333", + "Preventive maintenance cost (dollars/km)": "98.82955667", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6558,17 +6558,17 @@ ] }, { - "Name": "1P_OH_AL_4/0_Zuzara_0_416_0", + "Name": "1P_OH_AL_4/0_Zuzara_0_120_0", "Type": "UA", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11039.36667", - "Preventive maintenance cost (dolars/km)": "114.4782323", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11039.36667", + "Preventive maintenance cost (dollars/km)": "114.4782323", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6596,17 +6596,17 @@ ] }, { - "Name": "3P_UG_AL_4/0_15_0_416_0", + "Name": "3P_UG_AL_4/0_15_0_480_0", "Type": "UA", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "10936.75", - "Preventive maintenance cost (dolars/km)": "113.4140975", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "10936.75", + "Preventive maintenance cost (dollars/km)": "113.4140975", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -6634,17 +6634,17 @@ ] }, { - "Name": "3P_UG_AL_4/0_25_0_416_0", + "Name": "3P_UG_AL_4/0_25_0_480_0", "Type": "UA", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11059.85", - "Preventive maintenance cost (dolars/km)": "114.6906445", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11059.85", + "Preventive maintenance cost (dollars/km)": "114.6906445", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -6672,17 +6672,17 @@ ] }, { - "Name": "3P_UG_AL_350kcmil_15_0_416_0", + "Name": "3P_UG_AL_350kcmil_15_0_480_0", "Type": "UA", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11983.1", - "Preventive maintenance cost (dolars/km)": "124.264747", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11983.1", + "Preventive maintenance cost (dollars/km)": "124.264747", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -6710,17 +6710,17 @@ ] }, { - "Name": "3P_UG_AL_350kcmil_25_0_416_0", + "Name": "3P_UG_AL_350kcmil_25_0_480_0", "Type": "UA", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "12229.3", - "Preventive maintenance cost (dolars/km)": "126.817841", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "12229.3", + "Preventive maintenance cost (dollars/km)": "126.817841", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -6748,17 +6748,17 @@ ] }, { - "Name": "3P_UG_AL_750kcmil_15_0_416_0", + "Name": "3P_UG_AL_750kcmil_15_0_480_0", "Type": "UA", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "13891.15", - "Preventive maintenance cost (dolars/km)": "144.0512255", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "13891.15", + "Preventive maintenance cost (dollars/km)": "144.0512255", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -6786,17 +6786,17 @@ ] }, { - "Name": "3P_UG_AL_750kcmil_25_0_416_0", + "Name": "3P_UG_AL_750kcmil_25_0_480_0", "Type": "UA", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "14198.9", - "Preventive maintenance cost (dolars/km)": "147.242593", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "14198.9", + "Preventive maintenance cost (dollars/km)": "147.242593", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -6832,9 +6832,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "68923.05", - "Preventive maintenance cost (dolars/km)": "714.7320285", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "68923.05", + "Preventive maintenance cost (dollars/km)": "714.7320285", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6864,9 +6864,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74315.06667", - "Preventive maintenance cost (dolars/km)": "770.6472413", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74315.06667", + "Preventive maintenance cost (dollars/km)": "770.6472413", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6896,9 +6896,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "84608.91667", - "Preventive maintenance cost (dolars/km)": "877.3944658", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "84608.91667", + "Preventive maintenance cost (dollars/km)": "877.3944658", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6928,9 +6928,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "99314.41667", - "Preventive maintenance cost (dolars/km)": "1029.890501", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "99314.41667", + "Preventive maintenance cost (dollars/km)": "1029.890501", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6960,9 +6960,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "111078.8167", - "Preventive maintenance cost (dolars/km)": "1151.887329", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "111078.8167", + "Preventive maintenance cost (dollars/km)": "1151.887329", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -6992,9 +6992,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "116470.8333", - "Preventive maintenance cost (dolars/km)": "1207.802542", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "116470.8333", + "Preventive maintenance cost (dollars/km)": "1207.802542", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7030,9 +7030,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "145881.8333", - "Preventive maintenance cost (dolars/km)": "1512.794612", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "145881.8333", + "Preventive maintenance cost (dollars/km)": "1512.794612", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7068,9 +7068,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "148332.75", - "Preventive maintenance cost (dolars/km)": "1538.210617", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "148332.75", + "Preventive maintenance cost (dollars/km)": "1538.210617", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7112,9 +7112,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "192449.25", - "Preventive maintenance cost (dolars/km)": "1995.698722", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "192449.25", + "Preventive maintenance cost (dollars/km)": "1995.698722", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7156,9 +7156,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "227742.45", - "Preventive maintenance cost (dolars/km)": "2361.689206", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "227742.45", + "Preventive maintenance cost (dollars/km)": "2361.689206", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7200,9 +7200,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7244,9 +7244,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "68923.05", - "Preventive maintenance cost (dolars/km)": "714.7320285", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "68923.05", + "Preventive maintenance cost (dollars/km)": "714.7320285", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7276,9 +7276,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74315.06667", - "Preventive maintenance cost (dolars/km)": "770.6472413", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74315.06667", + "Preventive maintenance cost (dollars/km)": "770.6472413", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7308,9 +7308,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "84608.91667", - "Preventive maintenance cost (dolars/km)": "877.3944658", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "84608.91667", + "Preventive maintenance cost (dollars/km)": "877.3944658", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7340,9 +7340,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "99314.41667", - "Preventive maintenance cost (dolars/km)": "1029.890501", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "99314.41667", + "Preventive maintenance cost (dollars/km)": "1029.890501", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7372,9 +7372,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "111078.8167", - "Preventive maintenance cost (dolars/km)": "1151.887329", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "111078.8167", + "Preventive maintenance cost (dollars/km)": "1151.887329", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7404,9 +7404,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "116470.8333", - "Preventive maintenance cost (dolars/km)": "1207.802542", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "116470.8333", + "Preventive maintenance cost (dollars/km)": "1207.802542", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7442,9 +7442,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "145881.8333", - "Preventive maintenance cost (dolars/km)": "1512.794612", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "145881.8333", + "Preventive maintenance cost (dollars/km)": "1512.794612", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7480,9 +7480,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "148332.75", - "Preventive maintenance cost (dolars/km)": "1538.210617", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "148332.75", + "Preventive maintenance cost (dollars/km)": "1538.210617", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7524,9 +7524,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "192449.25", - "Preventive maintenance cost (dolars/km)": "1995.698722", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "192449.25", + "Preventive maintenance cost (dollars/km)": "1995.698722", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7568,9 +7568,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "227742.45", - "Preventive maintenance cost (dolars/km)": "2361.689206", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "227742.45", + "Preventive maintenance cost (dollars/km)": "2361.689206", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7612,9 +7612,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7656,9 +7656,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "68923.05", - "Preventive maintenance cost (dolars/km)": "714.7320285", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "68923.05", + "Preventive maintenance cost (dollars/km)": "714.7320285", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7688,9 +7688,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74315.06667", - "Preventive maintenance cost (dolars/km)": "770.6472413", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74315.06667", + "Preventive maintenance cost (dollars/km)": "770.6472413", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7720,9 +7720,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "84608.91667", - "Preventive maintenance cost (dolars/km)": "877.3944658", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "84608.91667", + "Preventive maintenance cost (dollars/km)": "877.3944658", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7752,9 +7752,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "99314.41667", - "Preventive maintenance cost (dolars/km)": "1029.890501", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "99314.41667", + "Preventive maintenance cost (dollars/km)": "1029.890501", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7784,9 +7784,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "111078.8167", - "Preventive maintenance cost (dolars/km)": "1151.887329", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "111078.8167", + "Preventive maintenance cost (dollars/km)": "1151.887329", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7816,9 +7816,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "116470.8333", - "Preventive maintenance cost (dolars/km)": "1207.802542", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "116470.8333", + "Preventive maintenance cost (dollars/km)": "1207.802542", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7854,9 +7854,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "145881.8333", - "Preventive maintenance cost (dolars/km)": "1512.794612", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "145881.8333", + "Preventive maintenance cost (dollars/km)": "1512.794612", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7892,9 +7892,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "148332.75", - "Preventive maintenance cost (dolars/km)": "1538.210617", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "148332.75", + "Preventive maintenance cost (dollars/km)": "1538.210617", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7936,9 +7936,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "192449.25", - "Preventive maintenance cost (dolars/km)": "1995.698722", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "192449.25", + "Preventive maintenance cost (dollars/km)": "1995.698722", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -7980,9 +7980,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "227742.45", - "Preventive maintenance cost (dolars/km)": "2361.689206", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "227742.45", + "Preventive maintenance cost (dollars/km)": "2361.689206", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8024,9 +8024,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8068,9 +8068,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "69413.23333", - "Preventive maintenance cost (dolars/km)": "719.8152297", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "69413.23333", + "Preventive maintenance cost (dollars/km)": "719.8152297", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8100,9 +8100,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "74805.25", - "Preventive maintenance cost (dolars/km)": "775.7304425", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "74805.25", + "Preventive maintenance cost (dollars/km)": "775.7304425", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8132,9 +8132,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "87059.83333", - "Preventive maintenance cost (dolars/km)": "902.8104717", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "87059.83333", + "Preventive maintenance cost (dollars/km)": "902.8104717", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8164,9 +8164,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "98824.23333", - "Preventive maintenance cost (dolars/km)": "1024.8073", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "98824.23333", + "Preventive maintenance cost (dollars/km)": "1024.8073", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8196,9 +8196,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "110098.45", - "Preventive maintenance cost (dolars/km)": "1141.720926", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "110098.45", + "Preventive maintenance cost (dollars/km)": "1141.720926", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8228,9 +8228,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "121372.6667", - "Preventive maintenance cost (dolars/km)": "1258.634553", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "121372.6667", + "Preventive maintenance cost (dollars/km)": "1258.634553", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8266,9 +8266,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "144901.4667", - "Preventive maintenance cost (dolars/km)": "1502.628209", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "144901.4667", + "Preventive maintenance cost (dollars/km)": "1502.628209", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8304,9 +8304,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "155685.5", - "Preventive maintenance cost (dolars/km)": "1614.458635", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "155685.5", + "Preventive maintenance cost (dollars/km)": "1614.458635", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8348,9 +8348,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "190978.7", - "Preventive maintenance cost (dolars/km)": "1980.449119", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "190978.7", + "Preventive maintenance cost (dollars/km)": "1980.449119", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8392,9 +8392,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "224801.35", - "Preventive maintenance cost (dolars/km)": "2331.189999", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "224801.35", + "Preventive maintenance cost (dollars/km)": "2331.189999", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8436,9 +8436,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "288035", - "Preventive maintenance cost (dolars/km)": "2986.92295", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "288035", + "Preventive maintenance cost (dollars/km)": "2986.92295", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8480,9 +8480,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "335092.6", - "Preventive maintenance cost (dolars/km)": "3474.910261", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "335092.6", + "Preventive maintenance cost (dollars/km)": "3474.910261", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -8520,17 +8520,17 @@ { "#Urban-Underground": [ { - "Name": "1P_UG_AL_1/0_Brenau_0_416_0", + "Name": "1P_UG_AL_1/0_Brenau_0_120_0", "Type": "US", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "8269.583333", - "Preventive maintenance cost (dolars/km)": "85.75557917", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "8269.583333", + "Preventive maintenance cost (dollars/km)": "85.75557917", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8558,17 +8558,17 @@ ] }, { - "Name": "1P_UG_AL_2/0_Converse_0_416_0", + "Name": "1P_UG_AL_2/0_Converse_0_120_0", "Type": "US", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "8384.476667", - "Preventive maintenance cost (dolars/km)": "86.94702303", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "8384.476667", + "Preventive maintenance cost (dollars/km)": "86.94702303", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8596,17 +8596,17 @@ ] }, { - "Name": "1P_UG_AL_4/0_Sweetbriar_0_416_0", + "Name": "1P_UG_AL_4/0_Sweetbriar_0_120_0", "Type": "US", "Nphases": "1", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.12", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "8663.503333", - "Preventive maintenance cost (dolars/km)": "89.84052957", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "8663.503333", + "Preventive maintenance cost (dollars/km)": "89.84052957", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8634,17 +8634,17 @@ ] }, { - "Name": "3P_UG_AL_4/0_15_0_416_0", + "Name": "3P_UG_AL_4/0_15_0_480_0", "Type": "US", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "10936.75", - "Preventive maintenance cost (dolars/km)": "113.4140975", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "10936.75", + "Preventive maintenance cost (dollars/km)": "113.4140975", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8672,17 +8672,17 @@ ] }, { - "Name": "3P_UG_AL_4/0_25_0_416_0", + "Name": "3P_UG_AL_4/0_25_0_480_0", "Type": "US", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11059.85", - "Preventive maintenance cost (dolars/km)": "114.6906445", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11059.85", + "Preventive maintenance cost (dollars/km)": "114.6906445", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8710,17 +8710,17 @@ ] }, { - "Name": "3P_UG_AL_350kcmil_15_0_416_0", + "Name": "3P_UG_AL_350kcmil_15_0_480_0", "Type": "US", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "11983.1", - "Preventive maintenance cost (dolars/km)": "124.264747", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "11983.1", + "Preventive maintenance cost (dollars/km)": "124.264747", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8748,17 +8748,17 @@ ] }, { - "Name": "3P_UG_AL_350kcmil_25_0_416_0", + "Name": "3P_UG_AL_350kcmil_25_0_480_0", "Type": "US", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "12229.3", - "Preventive maintenance cost (dolars/km)": "126.817841", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "12229.3", + "Preventive maintenance cost (dollars/km)": "126.817841", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8786,17 +8786,17 @@ ] }, { - "Name": "3P_UG_AL_750kcmil_15_0_416_0", + "Name": "3P_UG_AL_750kcmil_15_0_480_0", "Type": "US", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "13891.15", - "Preventive maintenance cost (dolars/km)": "144.0512255", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "13891.15", + "Preventive maintenance cost (dollars/km)": "144.0512255", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8824,17 +8824,17 @@ ] }, { - "Name": "3P_UG_AL_750kcmil_25_0_416_0", + "Name": "3P_UG_AL_750kcmil_25_0_480_0", "Type": "US", "Nphases": "3", "Overload(pu) ": "1.1", - "Voltage(kV)": "0.416", + "Voltage(kV)": "0.48", " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "14198.9", - "Preventive maintenance cost (dolars/km)": "147.242593", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "14198.9", + "Preventive maintenance cost (dollars/km)": "147.242593", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8870,9 +8870,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "40290.16667", - "Preventive maintenance cost (dolars/km)": "417.8090283", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "40290.16667", + "Preventive maintenance cost (dollars/km)": "417.8090283", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8896,9 +8896,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "61021.5", - "Preventive maintenance cost (dolars/km)": "632.792955", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "61021.5", + "Preventive maintenance cost (dollars/km)": "632.792955", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8922,9 +8922,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "65733.16667", - "Preventive maintenance cost (dolars/km)": "681.6529383", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "65733.16667", + "Preventive maintenance cost (dollars/km)": "681.6529383", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8948,9 +8948,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "103426.5", - "Preventive maintenance cost (dolars/km)": "1072.532805", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "103426.5", + "Preventive maintenance cost (dollars/km)": "1072.532805", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -8974,9 +8974,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "108138.1667", - "Preventive maintenance cost (dolars/km)": "1121.392788", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "108138.1667", + "Preventive maintenance cost (dollars/km)": "1121.392788", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9000,9 +9000,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "183601.5556", - "Preventive maintenance cost (dolars/km)": "1903.948131", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "183601.5556", + "Preventive maintenance cost (dollars/km)": "1903.948131", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9038,9 +9038,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "247994.3333", - "Preventive maintenance cost (dolars/km)": "2571.701237", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "247994.3333", + "Preventive maintenance cost (dollars/km)": "2571.701237", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9076,9 +9076,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "257417.6667", - "Preventive maintenance cost (dolars/km)": "2669.421203", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "257417.6667", + "Preventive maintenance cost (dollars/km)": "2669.421203", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9114,9 +9114,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "328092.6667", - "Preventive maintenance cost (dolars/km)": "3402.320953", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "328092.6667", + "Preventive maintenance cost (dollars/km)": "3402.320953", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9152,9 +9152,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "346939.3333", - "Preventive maintenance cost (dolars/km)": "3597.760887", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "346939.3333", + "Preventive maintenance cost (dollars/km)": "3597.760887", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9190,9 +9190,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "398767.6667", - "Preventive maintenance cost (dolars/km)": "4135.220703", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "398767.6667", + "Preventive maintenance cost (dollars/km)": "4135.220703", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9228,9 +9228,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "417614.3333", - "Preventive maintenance cost (dolars/km)": "4330.660637", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "417614.3333", + "Preventive maintenance cost (dollars/km)": "4330.660637", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9266,9 +9266,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "474154.3333", - "Preventive maintenance cost (dolars/km)": "4916.980437", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "474154.3333", + "Preventive maintenance cost (dollars/km)": "4916.980437", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9304,9 +9304,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "497712.6667", - "Preventive maintenance cost (dolars/km)": "5161.280353", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "497712.6667", + "Preventive maintenance cost (dollars/km)": "5161.280353", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9342,9 +9342,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "521271", - "Preventive maintenance cost (dolars/km)": "5405.58027", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "521271", + "Preventive maintenance cost (dollars/km)": "5405.58027", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9380,9 +9380,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "554252.6667", - "Preventive maintenance cost (dolars/km)": "5747.600153", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "554252.6667", + "Preventive maintenance cost (dollars/km)": "5747.600153", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9418,9 +9418,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "884065.46", - "Preventive maintenance cost (dolars/km)": "8840.6546", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "884065.46", + "Preventive maintenance cost (dollars/km)": "8840.6546", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -9462,9 +9462,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "40290.16667", - "Preventive maintenance cost (dolars/km)": "417.8090283", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "40290.16667", + "Preventive maintenance cost (dollars/km)": "417.8090283", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9488,9 +9488,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "61021.5", - "Preventive maintenance cost (dolars/km)": "632.792955", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "61021.5", + "Preventive maintenance cost (dollars/km)": "632.792955", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9514,9 +9514,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "65733.16667", - "Preventive maintenance cost (dolars/km)": "681.6529383", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "65733.16667", + "Preventive maintenance cost (dollars/km)": "681.6529383", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9540,9 +9540,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "103426.5", - "Preventive maintenance cost (dolars/km)": "1072.532805", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "103426.5", + "Preventive maintenance cost (dollars/km)": "1072.532805", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9566,9 +9566,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "108138.1667", - "Preventive maintenance cost (dolars/km)": "1121.392788", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "108138.1667", + "Preventive maintenance cost (dollars/km)": "1121.392788", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9592,9 +9592,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "183601.5556", - "Preventive maintenance cost (dolars/km)": "1903.948131", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "183601.5556", + "Preventive maintenance cost (dollars/km)": "1903.948131", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9630,9 +9630,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "257417.6667", - "Preventive maintenance cost (dolars/km)": "2669.421203", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "257417.6667", + "Preventive maintenance cost (dollars/km)": "2669.421203", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9668,9 +9668,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "328092.6667", - "Preventive maintenance cost (dolars/km)": "3402.320953", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "328092.6667", + "Preventive maintenance cost (dollars/km)": "3402.320953", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9706,9 +9706,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "346939.3333", - "Preventive maintenance cost (dolars/km)": "3597.760887", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "346939.3333", + "Preventive maintenance cost (dollars/km)": "3597.760887", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9744,9 +9744,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "398767.6667", - "Preventive maintenance cost (dolars/km)": "4135.220703", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "398767.6667", + "Preventive maintenance cost (dollars/km)": "4135.220703", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9782,9 +9782,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "417614.3333", - "Preventive maintenance cost (dolars/km)": "4330.660637", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "417614.3333", + "Preventive maintenance cost (dollars/km)": "4330.660637", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9820,9 +9820,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "474154.3333", - "Preventive maintenance cost (dolars/km)": "4916.980437", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "474154.3333", + "Preventive maintenance cost (dollars/km)": "4916.980437", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9858,9 +9858,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "497712.6667", - "Preventive maintenance cost (dolars/km)": "5161.280353", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "497712.6667", + "Preventive maintenance cost (dollars/km)": "5161.280353", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9896,9 +9896,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "521271", - "Preventive maintenance cost (dolars/km)": "5405.58027", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "521271", + "Preventive maintenance cost (dollars/km)": "5405.58027", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9934,9 +9934,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "554252.6667", - "Preventive maintenance cost (dolars/km)": "5747.600153", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "554252.6667", + "Preventive maintenance cost (dollars/km)": "5747.600153", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -9972,9 +9972,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "884065.46", - "Preventive maintenance cost (dolars/km)": "8840.6546", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "884065.46", + "Preventive maintenance cost (dollars/km)": "8840.6546", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -10016,9 +10016,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "40290.16667", - "Preventive maintenance cost (dolars/km)": "417.8090283", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "40290.16667", + "Preventive maintenance cost (dollars/km)": "417.8090283", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10042,9 +10042,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "61021.5", - "Preventive maintenance cost (dolars/km)": "632.792955", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "61021.5", + "Preventive maintenance cost (dollars/km)": "632.792955", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10068,9 +10068,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "65733.16667", - "Preventive maintenance cost (dolars/km)": "681.6529383", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "65733.16667", + "Preventive maintenance cost (dollars/km)": "681.6529383", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10094,9 +10094,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "103426.5", - "Preventive maintenance cost (dolars/km)": "1072.532805", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "103426.5", + "Preventive maintenance cost (dollars/km)": "1072.532805", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10120,9 +10120,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "108138.1667", - "Preventive maintenance cost (dolars/km)": "1121.392788", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "108138.1667", + "Preventive maintenance cost (dollars/km)": "1121.392788", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10146,9 +10146,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "183601.5556", - "Preventive maintenance cost (dolars/km)": "1903.948131", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "183601.5556", + "Preventive maintenance cost (dollars/km)": "1903.948131", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10184,9 +10184,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "247994.3333", - "Preventive maintenance cost (dolars/km)": "2571.701237", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "247994.3333", + "Preventive maintenance cost (dollars/km)": "2571.701237", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10222,9 +10222,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "257417.6667", - "Preventive maintenance cost (dolars/km)": "2669.421203", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "257417.6667", + "Preventive maintenance cost (dollars/km)": "2669.421203", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10260,9 +10260,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "328092.6667", - "Preventive maintenance cost (dolars/km)": "3402.320953", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "328092.6667", + "Preventive maintenance cost (dollars/km)": "3402.320953", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10298,9 +10298,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "346939.3333", - "Preventive maintenance cost (dolars/km)": "3597.760887", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "346939.3333", + "Preventive maintenance cost (dollars/km)": "3597.760887", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10336,9 +10336,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "398767.6667", - "Preventive maintenance cost (dolars/km)": "4135.220703", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "398767.6667", + "Preventive maintenance cost (dollars/km)": "4135.220703", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10374,9 +10374,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "417614.3333", - "Preventive maintenance cost (dolars/km)": "4330.660637", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "417614.3333", + "Preventive maintenance cost (dollars/km)": "4330.660637", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10412,9 +10412,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "474154.3333", - "Preventive maintenance cost (dolars/km)": "4916.980437", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "474154.3333", + "Preventive maintenance cost (dollars/km)": "4916.980437", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10450,9 +10450,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "497712.6667", - "Preventive maintenance cost (dolars/km)": "5161.280353", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "497712.6667", + "Preventive maintenance cost (dollars/km)": "5161.280353", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10488,9 +10488,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "521271", - "Preventive maintenance cost (dolars/km)": "5405.58027", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "521271", + "Preventive maintenance cost (dollars/km)": "5405.58027", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10526,9 +10526,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "554252.6667", - "Preventive maintenance cost (dolars/km)": "5747.600153", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "554252.6667", + "Preventive maintenance cost (dollars/km)": "5747.600153", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10564,9 +10564,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "884065.46", - "Preventive maintenance cost (dolars/km)": "8840.6546", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "884065.46", + "Preventive maintenance cost (dollars/km)": "8840.6546", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -10608,9 +10608,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "65733.16667", - "Preventive maintenance cost (dolars/km)": "681.6529383", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "65733.16667", + "Preventive maintenance cost (dollars/km)": "681.6529383", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10634,9 +10634,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "108138.1667", - "Preventive maintenance cost (dolars/km)": "1121.392788", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "108138.1667", + "Preventive maintenance cost (dollars/km)": "1121.392788", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10660,9 +10660,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "183601.5556", - "Preventive maintenance cost (dolars/km)": "1903.948131", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "183601.5556", + "Preventive maintenance cost (dollars/km)": "1903.948131", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10698,9 +10698,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "257417.6667", - "Preventive maintenance cost (dolars/km)": "2669.421203", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "257417.6667", + "Preventive maintenance cost (dollars/km)": "2669.421203", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10736,9 +10736,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "346939.3333", - "Preventive maintenance cost (dolars/km)": "3597.760887", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "346939.3333", + "Preventive maintenance cost (dollars/km)": "3597.760887", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10774,9 +10774,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "417614.3333", - "Preventive maintenance cost (dolars/km)": "4330.660637", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "417614.3333", + "Preventive maintenance cost (dollars/km)": "4330.660637", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10812,9 +10812,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "497712.6667", - "Preventive maintenance cost (dolars/km)": "5161.280353", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "497712.6667", + "Preventive maintenance cost (dollars/km)": "5161.280353", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10850,9 +10850,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "554252.6667", - "Preventive maintenance cost (dolars/km)": "5747.600153", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "554252.6667", + "Preventive maintenance cost (dollars/km)": "5747.600153", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "1", "Repair time minimum (hours)": "20", "Repair time medium (hours)": "30", @@ -10888,9 +10888,9 @@ " Failure rate minimum[failures / km year]": "0.1", " Failure rate medium[failures / km year]": "0.1", " Failure rate maximum[failures / km year]": "0.1", - "Investment Cost (dolars/km)": "884065.46", - "Preventive maintenance cost (dolars/km)": "8840.6546", - "Corrective maintenance cost (dolars/km)": "0", + "Investment Cost (dollars/km)": "884065.46", + "Preventive maintenance cost (dollars/km)": "8840.6546", + "Corrective maintenance cost (dollars/km)": "0", "Preventive maintenance time (hours)": "6", "Repair time minimum (hours)": "2", "Repair time medium (hours)": "5", @@ -10942,20 +10942,21 @@ "No load losses(kW)": "115.5803571", "Low-voltage-side short-circuit resistance (ohms)": "0.056161504", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "729000", + "Investment cost per output (dollars)": "729000", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "6953904", - "Preventive maintenance cost (dolars)": "186364.6272", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "6953904", + "Preventive maintenance cost (dollars)": "186364.6272", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "MAT_2I_230_69", @@ -10970,20 +10971,21 @@ "No load losses(kW)": "308.2142857", "Low-voltage-side short-circuit resistance (ohms)": "0.021060564", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "729000", + "Investment cost per output (dollars)": "729000", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "14133744", - "Preventive maintenance cost (dolars)": "378784.3392", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "14133744", + "Preventive maintenance cost (dollars)": "378784.3392", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "MAT_3I_230_69", @@ -10998,20 +11000,21 @@ "No load losses(kW)": "500.8482143", "Low-voltage-side short-circuit resistance (ohms)": "0.012960347", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "729000", + "Investment cost per output (dollars)": "729000", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "23203584", - "Preventive maintenance cost (dolars)": "621856.0512", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "23203584", + "Preventive maintenance cost (dollars)": "621856.0512", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "100", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false } ] }, @@ -11030,20 +11033,21 @@ "No load losses(kW)": "115.5803571", "Low-voltage-side short-circuit resistance (ohms)": "0.056161504", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "729000", + "Investment cost per output (dollars)": "729000", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "6953904", - "Preventive maintenance cost (dolars)": "186364.6272", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "6953904", + "Preventive maintenance cost (dollars)": "186364.6272", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "MAT_2U_230_69", @@ -11058,20 +11062,21 @@ "No load losses(kW)": "308.2142857", "Low-voltage-side short-circuit resistance (ohms)": "0.021060564", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "729000", + "Investment cost per output (dollars)": "729000", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "14133744", - "Preventive maintenance cost (dolars)": "378784.3392", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "14133744", + "Preventive maintenance cost (dollars)": "378784.3392", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "MAT_3U_230_69", @@ -11086,20 +11091,21 @@ "No load losses(kW)": "500.8482143", "Low-voltage-side short-circuit resistance (ohms)": "0.012960347", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "729000", + "Investment cost per output (dollars)": "729000", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "23203584", - "Preventive maintenance cost (dolars)": "621856.0512", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "23203584", + "Preventive maintenance cost (dollars)": "621856.0512", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "100", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false } ] }, @@ -11118,20 +11124,21 @@ "No load losses(kW)": "6.451", "Low-voltage-side short-circuit resistance (ohms)": "0.019428571", "Maximum number of outputs": "4", - "Investment cost per output (dolars)": "204749.4631", + "Investment cost per output (dollars)": "204749.4631", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "1020087.091", - "Preventive maintenance cost (dolars)": "27338.33404", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "1020087.091", + "Preventive maintenance cost (dollars)": "27338.33404", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_0_69_4", @@ -11146,20 +11153,21 @@ "No load losses(kW)": "12.902", "Low-voltage-side short-circuit resistance (ohms)": "0.0068", "Maximum number of outputs": "4", - "Investment cost per output (dolars)": "383905.2434", + "Investment cost per output (dollars)": "383905.2434", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "1912663.296", - "Preventive maintenance cost (dolars)": "51259.37633", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "1912663.296", + "Preventive maintenance cost (dollars)": "51259.37633", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_69_4", @@ -11174,20 +11182,21 @@ "No load losses(kW)": "24.75", "Low-voltage-side short-circuit resistance (ohms)": "0.00352", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "719822.3314", + "Investment cost per output (dollars)": "719822.3314", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3586243.68", - "Preventive maintenance cost (dolars)": "96111.33062", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3586243.68", + "Preventive maintenance cost (dollars)": "96111.33062", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "100", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_0_69_12_47", @@ -11202,20 +11211,21 @@ "No load losses(kW)": "12.902", "Low-voltage-side short-circuit resistance (ohms)": "0.066087883", "Maximum number of outputs": "4", - "Investment cost per output (dolars)": "383905.2434", + "Investment cost per output (dollars)": "383905.2434", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "1912663.296", - "Preventive maintenance cost (dolars)": "51259.37633", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "1912663.296", + "Preventive maintenance cost (dollars)": "51259.37633", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_69_12_47", @@ -11230,20 +11240,21 @@ "No load losses(kW)": "24.75", "Low-voltage-side short-circuit resistance (ohms)": "0.034210198", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "719822.3314", + "Investment cost per output (dollars)": "719822.3314", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3586243.68", - "Preventive maintenance cost (dolars)": "96111.33062", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3586243.68", + "Preventive maintenance cost (dollars)": "96111.33062", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_2_69_12_47", @@ -11258,20 +11269,21 @@ "No load losses(kW)": "33", "Low-voltage-side short-circuit resistance (ohms)": "0.02410264", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "959763.1085", + "Investment cost per output (dollars)": "959763.1085", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4781658.24", - "Preventive maintenance cost (dolars)": "128148.4408", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4781658.24", + "Preventive maintenance cost (dollars)": "128148.4408", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_3_69_12_47", @@ -11286,20 +11298,21 @@ "No load losses(kW)": "41.25", "Low-voltage-side short-circuit resistance (ohms)": "0.018660108", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1199703.886", + "Investment cost per output (dollars)": "1199703.886", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "5977072.8", - "Preventive maintenance cost (dolars)": "160185.551", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "5977072.8", + "Preventive maintenance cost (dollars)": "160185.551", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_2x_69_12_47", @@ -11314,20 +11327,21 @@ "No load losses(kW)": "49.5", "Low-voltage-side short-circuit resistance (ohms)": "0.015031754", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1439644.663", + "Investment cost per output (dollars)": "1439644.663", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "7172487.36", - "Preventive maintenance cost (dolars)": "192222.6612", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "7172487.36", + "Preventive maintenance cost (dollars)": "192222.6612", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_2_2x_69_12_47", @@ -11342,20 +11356,21 @@ "No load losses(kW)": "66", "Low-voltage-side short-circuit resistance (ohms)": "0.010885063", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1919526.217", + "Investment cost per output (dollars)": "1919526.217", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "9563316.48", - "Preventive maintenance cost (dolars)": "256296.8817", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "9563316.48", + "Preventive maintenance cost (dollars)": "256296.8817", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "100", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_0_69_13_2", @@ -11370,20 +11385,21 @@ "No load losses(kW)": "12.902", "Low-voltage-side short-circuit resistance (ohms)": "0.074052001", "Maximum number of outputs": "4", - "Investment cost per output (dolars)": "383905.2434", + "Investment cost per output (dollars)": "383905.2434", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "1912663.296", - "Preventive maintenance cost (dolars)": "51259.37633", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "1912663.296", + "Preventive maintenance cost (dollars)": "51259.37633", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_69_13_2", @@ -11398,20 +11414,21 @@ "No load losses(kW)": "24.75", "Low-voltage-side short-circuit resistance (ohms)": "0.0383328", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "719822.3314", + "Investment cost per output (dollars)": "719822.3314", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3586243.68", - "Preventive maintenance cost (dolars)": "96111.33062", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3586243.68", + "Preventive maintenance cost (dollars)": "96111.33062", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_2_69_13_2", @@ -11426,20 +11443,21 @@ "No load losses(kW)": "33", "Low-voltage-side short-circuit resistance (ohms)": "0.027007201", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "959763.1085", + "Investment cost per output (dollars)": "959763.1085", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4781658.24", - "Preventive maintenance cost (dolars)": "128148.4408", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4781658.24", + "Preventive maintenance cost (dollars)": "128148.4408", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_3_69_13_2", @@ -11454,20 +11472,21 @@ "No load losses(kW)": "41.25", "Low-voltage-side short-circuit resistance (ohms)": "0.0209088", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1199703.886", + "Investment cost per output (dollars)": "1199703.886", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "5977072.8", - "Preventive maintenance cost (dolars)": "160185.551", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "5977072.8", + "Preventive maintenance cost (dollars)": "160185.551", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_2x_69_13_2", @@ -11482,20 +11501,21 @@ "No load losses(kW)": "49.5", "Low-voltage-side short-circuit resistance (ohms)": "0.0168432", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1439644.663", + "Investment cost per output (dollars)": "1439644.663", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "7172487.36", - "Preventive maintenance cost (dolars)": "192222.6612", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "7172487.36", + "Preventive maintenance cost (dollars)": "192222.6612", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_2_2x_69_13_2", @@ -11510,20 +11530,21 @@ "No load losses(kW)": "66", "Low-voltage-side short-circuit resistance (ohms)": "0.0121968", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1919526.217", + "Investment cost per output (dollars)": "1919526.217", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "9563316.48", - "Preventive maintenance cost (dolars)": "256296.8817", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "9563316.48", + "Preventive maintenance cost (dollars)": "256296.8817", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "100", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_0_69_25", @@ -11538,20 +11559,21 @@ "No load losses(kW)": "12.902", "Low-voltage-side short-circuit resistance (ohms)": "0.265625002", "Maximum number of outputs": "4", - "Investment cost per output (dolars)": "383905.2434", + "Investment cost per output (dollars)": "383905.2434", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "1912663.296", - "Preventive maintenance cost (dolars)": "51259.37633", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "1912663.296", + "Preventive maintenance cost (dollars)": "51259.37633", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_69_25", @@ -11566,20 +11588,21 @@ "No load losses(kW)": "24.75", "Low-voltage-side short-circuit resistance (ohms)": "0.1375", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "719822.3314", + "Investment cost per output (dollars)": "719822.3314", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3586243.68", - "Preventive maintenance cost (dolars)": "96111.33062", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3586243.68", + "Preventive maintenance cost (dollars)": "96111.33062", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_2_69_25", @@ -11594,20 +11617,21 @@ "No load losses(kW)": "33", "Low-voltage-side short-circuit resistance (ohms)": "0.096875002", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "959763.1085", + "Investment cost per output (dollars)": "959763.1085", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4781658.24", - "Preventive maintenance cost (dolars)": "128148.4408", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4781658.24", + "Preventive maintenance cost (dollars)": "128148.4408", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_3_69_25", @@ -11622,20 +11646,21 @@ "No load losses(kW)": "41.25", "Low-voltage-side short-circuit resistance (ohms)": "0.075", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1199703.886", + "Investment cost per output (dollars)": "1199703.886", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "5977072.8", - "Preventive maintenance cost (dolars)": "160185.551", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "5977072.8", + "Preventive maintenance cost (dollars)": "160185.551", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_2x_69_25", @@ -11650,20 +11675,21 @@ "No load losses(kW)": "49.5", "Low-voltage-side short-circuit resistance (ohms)": "0.060416668", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1439644.663", + "Investment cost per output (dollars)": "1439644.663", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "7172487.36", - "Preventive maintenance cost (dolars)": "192222.6612", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "7172487.36", + "Preventive maintenance cost (dollars)": "192222.6612", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_2_2x_69_25", @@ -11678,20 +11704,21 @@ "No load losses(kW)": "66", "Low-voltage-side short-circuit resistance (ohms)": "0.04375", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1919526.217", + "Investment cost per output (dollars)": "1919526.217", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "9563316.48", - "Preventive maintenance cost (dolars)": "256296.8817", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "9563316.48", + "Preventive maintenance cost (dollars)": "256296.8817", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "100", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false } ] }, @@ -11710,20 +11737,21 @@ "No load losses(kW)": "6.451", "Low-voltage-side short-circuit resistance (ohms)": "0.019428571", "Maximum number of outputs": "4", - "Investment cost per output (dolars)": "204749.4631", + "Investment cost per output (dollars)": "204749.4631", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "1020087.091", - "Preventive maintenance cost (dolars)": "27338.33404", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "1020087.091", + "Preventive maintenance cost (dollars)": "27338.33404", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_0_69_4", @@ -11738,20 +11766,21 @@ "No load losses(kW)": "12.902", "Low-voltage-side short-circuit resistance (ohms)": "0.0066", "Maximum number of outputs": "4", - "Investment cost per output (dolars)": "383905.2434", + "Investment cost per output (dollars)": "383905.2434", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "1912663.296", - "Preventive maintenance cost (dolars)": "51259.37633", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "1912663.296", + "Preventive maintenance cost (dollars)": "51259.37633", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_69_4", @@ -11766,20 +11795,21 @@ "No load losses(kW)": "24.75", "Low-voltage-side short-circuit resistance (ohms)": "0.003413333", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "719822.3314", + "Investment cost per output (dollars)": "719822.3314", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3586243.68", - "Preventive maintenance cost (dolars)": "96111.33062", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3586243.68", + "Preventive maintenance cost (dollars)": "96111.33062", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "100", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_0_69_12_47", @@ -11794,20 +11824,21 @@ "No load losses(kW)": "12.902", "Low-voltage-side short-circuit resistance (ohms)": "0.064144121", "Maximum number of outputs": "4", - "Investment cost per output (dolars)": "383905.2434", + "Investment cost per output (dollars)": "383905.2434", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "1912663.296", - "Preventive maintenance cost (dolars)": "51259.37633", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "1912663.296", + "Preventive maintenance cost (dollars)": "51259.37633", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_69_12_47", @@ -11822,20 +11853,21 @@ "No load losses(kW)": "24.75", "Low-voltage-side short-circuit resistance (ohms)": "0.033173525", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "719822.3314", + "Investment cost per output (dollars)": "719822.3314", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3586243.68", - "Preventive maintenance cost (dolars)": "96111.33062", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3586243.68", + "Preventive maintenance cost (dollars)": "96111.33062", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_2_69_12_47", @@ -11850,20 +11882,21 @@ "No load losses(kW)": "33", "Low-voltage-side short-circuit resistance (ohms)": "0.02410264", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "959763.1085", + "Investment cost per output (dollars)": "959763.1085", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4781658.24", - "Preventive maintenance cost (dolars)": "128148.4408", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4781658.24", + "Preventive maintenance cost (dollars)": "128148.4408", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_3_69_12_47", @@ -11878,20 +11911,21 @@ "No load losses(kW)": "41.25", "Low-voltage-side short-circuit resistance (ohms)": "0.018660108", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1199703.886", + "Investment cost per output (dollars)": "1199703.886", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "5977072.8", - "Preventive maintenance cost (dolars)": "160185.551", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "5977072.8", + "Preventive maintenance cost (dollars)": "160185.551", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_2x_69_12_47", @@ -11906,20 +11940,21 @@ "No load losses(kW)": "49.5", "Low-voltage-side short-circuit resistance (ohms)": "0.015031754", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1439644.663", + "Investment cost per output (dollars)": "1439644.663", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "7172487.36", - "Preventive maintenance cost (dolars)": "192222.6612", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "7172487.36", + "Preventive maintenance cost (dollars)": "192222.6612", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_2_2x_69_12_47", @@ -11934,20 +11969,21 @@ "No load losses(kW)": "66", "Low-voltage-side short-circuit resistance (ohms)": "0.010885063", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1919526.217", + "Investment cost per output (dollars)": "1919526.217", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "9563316.48", - "Preventive maintenance cost (dolars)": "256296.8817", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "9563316.48", + "Preventive maintenance cost (dollars)": "256296.8817", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "100", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_0_69_13_2", @@ -11962,20 +11998,21 @@ "No load losses(kW)": "12.902", "Low-voltage-side short-circuit resistance (ohms)": "0.071874", "Maximum number of outputs": "4", - "Investment cost per output (dolars)": "383905.2434", + "Investment cost per output (dollars)": "383905.2434", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "1912663.296", - "Preventive maintenance cost (dolars)": "51259.37633", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "1912663.296", + "Preventive maintenance cost (dollars)": "51259.37633", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_69_13_2", @@ -11990,20 +12027,21 @@ "No load losses(kW)": "24.75", "Low-voltage-side short-circuit resistance (ohms)": "0.0371712", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "719822.3314", + "Investment cost per output (dollars)": "719822.3314", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3586243.68", - "Preventive maintenance cost (dolars)": "96111.33062", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3586243.68", + "Preventive maintenance cost (dollars)": "96111.33062", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_2_69_13_2", @@ -12018,20 +12056,21 @@ "No load losses(kW)": "33", "Low-voltage-side short-circuit resistance (ohms)": "0.027007201", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "959763.1085", + "Investment cost per output (dollars)": "959763.1085", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4781658.24", - "Preventive maintenance cost (dolars)": "128148.4408", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4781658.24", + "Preventive maintenance cost (dollars)": "128148.4408", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_3_69_13_2", @@ -12046,20 +12085,21 @@ "No load losses(kW)": "41.25", "Low-voltage-side short-circuit resistance (ohms)": "0.0209088", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1199703.886", + "Investment cost per output (dollars)": "1199703.886", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "5977072.8", - "Preventive maintenance cost (dolars)": "160185.551", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "5977072.8", + "Preventive maintenance cost (dollars)": "160185.551", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_2x_69_13_2", @@ -12074,20 +12114,21 @@ "No load losses(kW)": "49.5", "Low-voltage-side short-circuit resistance (ohms)": "0.0168432", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1439644.663", + "Investment cost per output (dollars)": "1439644.663", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "7172487.36", - "Preventive maintenance cost (dolars)": "192222.6612", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "7172487.36", + "Preventive maintenance cost (dollars)": "192222.6612", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_2_2x_69_13_2", @@ -12102,20 +12143,21 @@ "No load losses(kW)": "66", "Low-voltage-side short-circuit resistance (ohms)": "0.0121968", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1919526.217", + "Investment cost per output (dollars)": "1919526.217", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "9563316.48", - "Preventive maintenance cost (dolars)": "256296.8817", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "9563316.48", + "Preventive maintenance cost (dollars)": "256296.8817", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "100", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_0_69_25", @@ -12130,20 +12172,21 @@ "No load losses(kW)": "12.902", "Low-voltage-side short-circuit resistance (ohms)": "0.257812499", "Maximum number of outputs": "4", - "Investment cost per output (dolars)": "383905.2434", + "Investment cost per output (dollars)": "383905.2434", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "1912663.296", - "Preventive maintenance cost (dolars)": "51259.37633", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "1912663.296", + "Preventive maintenance cost (dollars)": "51259.37633", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_69_25", @@ -12158,20 +12201,21 @@ "No load losses(kW)": "24.75", "Low-voltage-side short-circuit resistance (ohms)": "0.133333332", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "719822.3314", + "Investment cost per output (dollars)": "719822.3314", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3586243.68", - "Preventive maintenance cost (dolars)": "96111.33062", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3586243.68", + "Preventive maintenance cost (dollars)": "96111.33062", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_2_69_25", @@ -12186,20 +12230,21 @@ "No load losses(kW)": "33", "Low-voltage-side short-circuit resistance (ohms)": "0.096875002", "Maximum number of outputs": "8", - "Investment cost per output (dolars)": "959763.1085", + "Investment cost per output (dollars)": "959763.1085", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4781658.24", - "Preventive maintenance cost (dolars)": "128148.4408", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4781658.24", + "Preventive maintenance cost (dollars)": "128148.4408", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_3_69_25", @@ -12214,20 +12259,21 @@ "No load losses(kW)": "41.25", "Low-voltage-side short-circuit resistance (ohms)": "0.075", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1199703.886", + "Investment cost per output (dollars)": "1199703.886", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "5977072.8", - "Preventive maintenance cost (dolars)": "160185.551", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "5977072.8", + "Preventive maintenance cost (dollars)": "160185.551", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_1_2x_69_25", @@ -12242,20 +12288,21 @@ "No load losses(kW)": "49.5", "Low-voltage-side short-circuit resistance (ohms)": "0.060416668", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1439644.663", + "Investment cost per output (dollars)": "1439644.663", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "7172487.36", - "Preventive maintenance cost (dolars)": "192222.6612", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "7172487.36", + "Preventive maintenance cost (dollars)": "192222.6612", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { "Name": "SUB_2_2x_69_25", @@ -12270,2380 +12317,2465 @@ "No load losses(kW)": "66", "Low-voltage-side short-circuit resistance (ohms)": "0.04375", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "1919526.217", + "Investment cost per output (dollars)": "1919526.217", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "9563316.48", - "Preventive maintenance cost (dolars)": "256296.8817", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "9563316.48", + "Preventive maintenance cost (dollars)": "256296.8817", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "100", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false } ] }, { "#Interurban:": [ { - "Name": "OH1_1_4_0_416", + "Name": "OH1_1_4_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "10", "Guaranteed Power(kVA)": "10", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.009", "No load losses(kW)": "0.068", "Low-voltage-side short-circuit resistance (ohms)": "0.144", "Maximum number of outputs": "5", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "2400", - "Preventive maintenance cost (dolars)": "64.32", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "2400", + "Preventive maintenance cost (dollars)": "64.32", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "21", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_2_4_0_416", + "Name": "OH1_2_4_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "25", "Guaranteed Power(kVA)": "25", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.118", "Low-voltage-side short-circuit resistance (ohms)": "0.036864", "Maximum number of outputs": "10", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3075", - "Preventive maintenance cost (dolars)": "82.41", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3075", + "Preventive maintenance cost (dollars)": "82.41", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "21", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_3_4_0_416", + "Name": "OH1_3_4_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "50", "Guaranteed Power(kVA)": "50", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.185", "Low-voltage-side short-circuit resistance (ohms)": "0.013824", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4500", - "Preventive maintenance cost (dolars)": "120.6", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4500", + "Preventive maintenance cost (dollars)": "120.6", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "54", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_4_4_0_416", + "Name": "OH1_4_4_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.285", "Low-voltage-side short-circuit resistance (ohms)": "0.00768", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "6900", - "Preventive maintenance cost (dolars)": "184.92", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "6900", + "Preventive maintenance cost (dollars)": "184.92", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "4", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "PM3_1_4_0_416", + "Name": "PM3_1_4_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0324", "No load losses(kW)": "0.45", "Low-voltage-side short-circuit resistance (ohms)": "0.0402432", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "35175", - "Preventive maintenance cost (dolars)": "942.69", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "35175", + "Preventive maintenance cost (dollars)": "942.69", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "15", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_2_4_0_416", + "Name": "PM3_2_4_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "100", "Guaranteed Power(kVA)": "100", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0329", "No load losses(kW)": "0.62", "Low-voltage-side short-circuit resistance (ohms)": "0.0278784", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "36975", - "Preventive maintenance cost (dolars)": "990.93", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "36975", + "Preventive maintenance cost (dollars)": "990.93", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "36", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_3_4_0_416", + "Name": "PM3_3_4_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "150", "Guaranteed Power(kVA)": "150", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0339", "No load losses(kW)": "0.775", "Low-voltage-side short-circuit resistance (ohms)": "0.0248832", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "38625", - "Preventive maintenance cost (dolars)": "1035.15", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "38625", + "Preventive maintenance cost (dollars)": "1035.15", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "36", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_4_4_0_416", + "Name": "PM3_4_4_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "300", "Guaranteed Power(kVA)": "300", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0376", "No load losses(kW)": "0.975", "Low-voltage-side short-circuit resistance (ohms)": "0.0105216", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "47100", - "Preventive maintenance cost (dolars)": "1262.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "47100", + "Preventive maintenance cost (dollars)": "1262.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "6", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_5_4_0_416", + "Name": "PM3_5_4_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "500", "Guaranteed Power(kVA)": "500", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0436", "No load losses(kW)": "1.33", "Low-voltage-side short-circuit resistance (ohms)": "0.0050688", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "55875", - "Preventive maintenance cost (dolars)": "1497.45", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "55875", + "Preventive maintenance cost (dollars)": "1497.45", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "7", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_4_0_416", + "Name": "PM3_6_4_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1000", "Guaranteed Power(kVA)": "1000", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0562", "No load losses(kW)": "2", "Low-voltage-side short-circuit resistance (ohms)": "0.0027648", "Maximum number of outputs": "2", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "69600", - "Preventive maintenance cost (dolars)": "1865.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "69600", + "Preventive maintenance cost (dollars)": "1865.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_4_0_416", + "Name": "PM3_6_4_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1500", "Guaranteed Power(kVA)": "1500", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0565", "No load losses(kW)": "2.88", "Low-voltage-side short-circuit resistance (ohms)": "0.0016128", "Maximum number of outputs": "1", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "95000", - "Preventive maintenance cost (dolars)": "2546", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "95000", + "Preventive maintenance cost (dollars)": "2546", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "OH1_1_12_47_0_416", + "Name": "OH1_1_12_47_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "10", "Guaranteed Power(kVA)": "10", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.009", "No load losses(kW)": "0.068", "Low-voltage-side short-circuit resistance (ohms)": "0.144", "Maximum number of outputs": "5", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "2400", - "Preventive maintenance cost (dolars)": "64.32", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "2400", + "Preventive maintenance cost (dollars)": "64.32", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "21", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_2_12_47_0_416", + "Name": "OH1_2_12_47_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "25", "Guaranteed Power(kVA)": "25", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.118", "Low-voltage-side short-circuit resistance (ohms)": "0.036864", "Maximum number of outputs": "10", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3075", - "Preventive maintenance cost (dolars)": "82.41", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3075", + "Preventive maintenance cost (dollars)": "82.41", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "21", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_3_12_47_0_416", + "Name": "OH1_3_12_47_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "50", "Guaranteed Power(kVA)": "50", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.185", "Low-voltage-side short-circuit resistance (ohms)": "0.013824", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4500", - "Preventive maintenance cost (dolars)": "120.6", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4500", + "Preventive maintenance cost (dollars)": "120.6", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "54", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_4_12_47_0_416", + "Name": "OH1_4_12_47_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.285", "Low-voltage-side short-circuit resistance (ohms)": "0.00768", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "6900", - "Preventive maintenance cost (dolars)": "184.92", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "6900", + "Preventive maintenance cost (dollars)": "184.92", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "4", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "PM3_1_12_47_0_416", + "Name": "PM3_1_12_47_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0324", "No load losses(kW)": "0.45", "Low-voltage-side short-circuit resistance (ohms)": "0.0402432", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "35175", - "Preventive maintenance cost (dolars)": "942.69", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "35175", + "Preventive maintenance cost (dollars)": "942.69", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "15", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_2_12_47_0_416", + "Name": "PM3_2_12_47_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "100", "Guaranteed Power(kVA)": "100", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0329", "No load losses(kW)": "0.62", "Low-voltage-side short-circuit resistance (ohms)": "0.0278784", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "36975", - "Preventive maintenance cost (dolars)": "990.93", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "36975", + "Preventive maintenance cost (dollars)": "990.93", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "36", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_3_12_47_0_416", + "Name": "PM3_3_12_47_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "150", "Guaranteed Power(kVA)": "150", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0339", "No load losses(kW)": "0.775", "Low-voltage-side short-circuit resistance (ohms)": "0.0248832", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "38625", - "Preventive maintenance cost (dolars)": "1035.15", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "38625", + "Preventive maintenance cost (dollars)": "1035.15", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "36", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_4_12_47_0_416", + "Name": "PM3_4_12_47_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "300", "Guaranteed Power(kVA)": "300", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0376", "No load losses(kW)": "0.975", "Low-voltage-side short-circuit resistance (ohms)": "0.0105216", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "47100", - "Preventive maintenance cost (dolars)": "1262.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "47100", + "Preventive maintenance cost (dollars)": "1262.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "6", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_5_12_47_0_416", + "Name": "PM3_5_12_47_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "500", "Guaranteed Power(kVA)": "500", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0436", "No load losses(kW)": "1.33", "Low-voltage-side short-circuit resistance (ohms)": "0.0050688", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "55875", - "Preventive maintenance cost (dolars)": "1497.45", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "55875", + "Preventive maintenance cost (dollars)": "1497.45", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "7", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_12_47_0_416", + "Name": "PM3_6_12_47_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1000", "Guaranteed Power(kVA)": "1000", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0562", "No load losses(kW)": "2", "Low-voltage-side short-circuit resistance (ohms)": "0.0027648", "Maximum number of outputs": "2", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "69600", - "Preventive maintenance cost (dolars)": "1865.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "69600", + "Preventive maintenance cost (dollars)": "1865.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_12_47_0_416", + "Name": "PM3_6_12_47_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1500", "Guaranteed Power(kVA)": "1500", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0565", "No load losses(kW)": "2.88", "Low-voltage-side short-circuit resistance (ohms)": "0.0016128", "Maximum number of outputs": "1", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "95000", - "Preventive maintenance cost (dolars)": "2546", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "95000", + "Preventive maintenance cost (dollars)": "2546", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "OH1_1_13_2_0_416", + "Name": "OH1_1_13_2_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "10", "Guaranteed Power(kVA)": "10", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.009", "No load losses(kW)": "0.068", "Low-voltage-side short-circuit resistance (ohms)": "0.144", "Maximum number of outputs": "5", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "2400", - "Preventive maintenance cost (dolars)": "64.32", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "2400", + "Preventive maintenance cost (dollars)": "64.32", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "21", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_2_13_2_0_416", + "Name": "OH1_2_13_2_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "25", "Guaranteed Power(kVA)": "25", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.118", "Low-voltage-side short-circuit resistance (ohms)": "0.036864", "Maximum number of outputs": "10", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3075", - "Preventive maintenance cost (dolars)": "82.41", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3075", + "Preventive maintenance cost (dollars)": "82.41", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "21", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_3_13_2_0_416", + "Name": "OH1_3_13_2_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "50", "Guaranteed Power(kVA)": "50", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.185", "Low-voltage-side short-circuit resistance (ohms)": "0.013824", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4500", - "Preventive maintenance cost (dolars)": "120.6", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4500", + "Preventive maintenance cost (dollars)": "120.6", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "54", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_4_13_2_0_416", + "Name": "OH1_4_13_2_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.285", "Low-voltage-side short-circuit resistance (ohms)": "0.00768", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "6900", - "Preventive maintenance cost (dolars)": "184.92", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "6900", + "Preventive maintenance cost (dollars)": "184.92", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "4", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "PM3_1_13_2_0_416", + "Name": "PM3_1_13_2_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0324", "No load losses(kW)": "0.45", "Low-voltage-side short-circuit resistance (ohms)": "0.0402432", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "35175", - "Preventive maintenance cost (dolars)": "942.69", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "35175", + "Preventive maintenance cost (dollars)": "942.69", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "15", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_2_13_2_0_416", + "Name": "PM3_2_13_2_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "100", "Guaranteed Power(kVA)": "100", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0329", "No load losses(kW)": "0.62", "Low-voltage-side short-circuit resistance (ohms)": "0.0278784", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "36975", - "Preventive maintenance cost (dolars)": "990.93", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "36975", + "Preventive maintenance cost (dollars)": "990.93", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "36", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_3_13_2_0_416", + "Name": "PM3_3_13_2_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "150", "Guaranteed Power(kVA)": "150", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0339", "No load losses(kW)": "0.775", "Low-voltage-side short-circuit resistance (ohms)": "0.0248832", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "38625", - "Preventive maintenance cost (dolars)": "1035.15", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "38625", + "Preventive maintenance cost (dollars)": "1035.15", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "36", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_4_13_2_0_416", + "Name": "PM3_4_13_2_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "300", "Guaranteed Power(kVA)": "300", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0376", "No load losses(kW)": "0.975", "Low-voltage-side short-circuit resistance (ohms)": "0.0105216", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "47100", - "Preventive maintenance cost (dolars)": "1262.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "47100", + "Preventive maintenance cost (dollars)": "1262.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "6", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_5_13_2_0_416", + "Name": "PM3_5_13_2_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "500", "Guaranteed Power(kVA)": "500", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0436", "No load losses(kW)": "1.33", "Low-voltage-side short-circuit resistance (ohms)": "0.0050688", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "55875", - "Preventive maintenance cost (dolars)": "1497.45", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "55875", + "Preventive maintenance cost (dollars)": "1497.45", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "7", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_13_2_0_416", + "Name": "PM3_6_13_2_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1000", "Guaranteed Power(kVA)": "1000", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0562", "No load losses(kW)": "2", "Low-voltage-side short-circuit resistance (ohms)": "0.0027648", "Maximum number of outputs": "2", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "69600", - "Preventive maintenance cost (dolars)": "1865.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "69600", + "Preventive maintenance cost (dollars)": "1865.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_13_2_0_416", + "Name": "PM3_6_13_2_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1500", "Guaranteed Power(kVA)": "1500", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0565", "No load losses(kW)": "2.88", "Low-voltage-side short-circuit resistance (ohms)": "0.0016128", "Maximum number of outputs": "1", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "95000", - "Preventive maintenance cost (dolars)": "2546", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "95000", + "Preventive maintenance cost (dollars)": "2546", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "OH1_1_25_0_416", + "Name": "OH1_1_25_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "10", "Guaranteed Power(kVA)": "10", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.009", "No load losses(kW)": "0.068", "Low-voltage-side short-circuit resistance (ohms)": "0.144", "Maximum number of outputs": "5", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "2400", - "Preventive maintenance cost (dolars)": "64.32", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "2400", + "Preventive maintenance cost (dollars)": "64.32", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "21", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_2_25_0_416", + "Name": "OH1_2_25_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "25", "Guaranteed Power(kVA)": "25", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.118", "Low-voltage-side short-circuit resistance (ohms)": "0.036864", "Maximum number of outputs": "10", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3075", - "Preventive maintenance cost (dolars)": "82.41", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3075", + "Preventive maintenance cost (dollars)": "82.41", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "21", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_3_25_0_416", + "Name": "OH1_3_25_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "50", "Guaranteed Power(kVA)": "50", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.185", "Low-voltage-side short-circuit resistance (ohms)": "0.013824", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4500", - "Preventive maintenance cost (dolars)": "120.6", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4500", + "Preventive maintenance cost (dollars)": "120.6", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "54", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_4_25_0_416", + "Name": "OH1_4_25_0_120", "Type": "I", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.285", "Low-voltage-side short-circuit resistance (ohms)": "0.00768", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "6900", - "Preventive maintenance cost (dolars)": "184.92", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "6900", + "Preventive maintenance cost (dollars)": "184.92", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "4", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "PM3_1_25_0_416", + "Name": "PM3_1_25_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0324", "No load losses(kW)": "0.45", "Low-voltage-side short-circuit resistance (ohms)": "0.0402432", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "35175", - "Preventive maintenance cost (dolars)": "942.69", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "35175", + "Preventive maintenance cost (dollars)": "942.69", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "15", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_2_25_0_416", + "Name": "PM3_2_25_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "100", "Guaranteed Power(kVA)": "100", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0329", "No load losses(kW)": "0.62", "Low-voltage-side short-circuit resistance (ohms)": "0.0278784", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "36975", - "Preventive maintenance cost (dolars)": "990.93", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "36975", + "Preventive maintenance cost (dollars)": "990.93", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "36", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_3_25_0_416", + "Name": "PM3_3_25_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "150", "Guaranteed Power(kVA)": "150", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0339", "No load losses(kW)": "0.775", "Low-voltage-side short-circuit resistance (ohms)": "0.0248832", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "38625", - "Preventive maintenance cost (dolars)": "1035.15", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "38625", + "Preventive maintenance cost (dollars)": "1035.15", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "36", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_4_25_0_416", + "Name": "PM3_4_25_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "300", "Guaranteed Power(kVA)": "300", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0376", "No load losses(kW)": "0.975", "Low-voltage-side short-circuit resistance (ohms)": "0.0105216", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "47100", - "Preventive maintenance cost (dolars)": "1262.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "47100", + "Preventive maintenance cost (dollars)": "1262.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "6", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_5_25_0_416", + "Name": "PM3_5_25_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "500", "Guaranteed Power(kVA)": "500", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0436", "No load losses(kW)": "1.33", "Low-voltage-side short-circuit resistance (ohms)": "0.0050688", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "55875", - "Preventive maintenance cost (dolars)": "1497.45", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "55875", + "Preventive maintenance cost (dollars)": "1497.45", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "7", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_25_0_416", + "Name": "PM3_6_25_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1000", "Guaranteed Power(kVA)": "1000", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0562", "No load losses(kW)": "2", "Low-voltage-side short-circuit resistance (ohms)": "0.0027648", "Maximum number of outputs": "2", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "69600", - "Preventive maintenance cost (dolars)": "1865.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "69600", + "Preventive maintenance cost (dollars)": "1865.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_25_0_416", + "Name": "PM3_6_25_0_480", "Type": "I", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1500", "Guaranteed Power(kVA)": "1500", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0565", "No load losses(kW)": "2.88", "Low-voltage-side short-circuit resistance (ohms)": "0.0016128", "Maximum number of outputs": "1", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "95000", - "Preventive maintenance cost (dolars)": "2546", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "95000", + "Preventive maintenance cost (dollars)": "2546", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "0", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false } ] }, { "#Urban:": [ { - "Name": "OH1_2_4_0_416", + "Name": "OH1_2_4_0_120", "Type": "U", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "25", "Guaranteed Power(kVA)": "25", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.118", "Low-voltage-side short-circuit resistance (ohms)": "0.036864", "Maximum number of outputs": "10", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3075", - "Preventive maintenance cost (dolars)": "82.41", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3075", + "Preventive maintenance cost (dollars)": "82.41", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "12", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_3_4_0_416", + "Name": "OH1_3_4_0_120", "Type": "U", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "50", "Guaranteed Power(kVA)": "50", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.185", "Low-voltage-side short-circuit resistance (ohms)": "0.018432", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4500", - "Preventive maintenance cost (dolars)": "120.6", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4500", + "Preventive maintenance cost (dollars)": "120.6", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "53", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_4_4_0_416", + "Name": "OH1_4_4_0_120", "Type": "U", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.285", "Low-voltage-side short-circuit resistance (ohms)": "0.00768", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "6900", - "Preventive maintenance cost (dolars)": "184.92", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "6900", + "Preventive maintenance cost (dollars)": "184.92", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "35", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "PM3_1_4_0_416", + "Name": "PM3_1_4_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0324", "No load losses(kW)": "0.45", "Low-voltage-side short-circuit resistance (ohms)": "0.0402432", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "35175", - "Preventive maintenance cost (dolars)": "942.69", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "35175", + "Preventive maintenance cost (dollars)": "942.69", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "6", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_2_4_0_416", + "Name": "PM3_2_4_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "100", "Guaranteed Power(kVA)": "100", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0329", "No load losses(kW)": "0.62", "Low-voltage-side short-circuit resistance (ohms)": "0.0278784", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "36975", - "Preventive maintenance cost (dolars)": "990.93", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "36975", + "Preventive maintenance cost (dollars)": "990.93", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "14", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_3_4_0_416", + "Name": "PM3_3_4_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "150", "Guaranteed Power(kVA)": "150", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0339", "No load losses(kW)": "0.775", "Low-voltage-side short-circuit resistance (ohms)": "0.0248832", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "38625", - "Preventive maintenance cost (dolars)": "1035.15", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "38625", + "Preventive maintenance cost (dollars)": "1035.15", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "14", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_4_4_0_416", + "Name": "PM3_4_4_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "300", "Guaranteed Power(kVA)": "300", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0376", "No load losses(kW)": "0.975", "Low-voltage-side short-circuit resistance (ohms)": "0.0105216", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "47100", - "Preventive maintenance cost (dolars)": "1262.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "47100", + "Preventive maintenance cost (dollars)": "1262.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "28", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_5_4_0_416", + "Name": "PM3_5_4_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "500", "Guaranteed Power(kVA)": "500", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0436", "No load losses(kW)": "1.33", "Low-voltage-side short-circuit resistance (ohms)": "0.0050688", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "55875", - "Preventive maintenance cost (dolars)": "1497.45", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "55875", + "Preventive maintenance cost (dollars)": "1497.45", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "24", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_4_0_416", + "Name": "PM3_6_4_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1000", "Guaranteed Power(kVA)": "1000", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0562", "No load losses(kW)": "2", "Low-voltage-side short-circuit resistance (ohms)": "0.0027648", "Maximum number of outputs": "2", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "69600", - "Preventive maintenance cost (dolars)": "1865.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "69600", + "Preventive maintenance cost (dollars)": "1865.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "10", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_4_0_416", + "Name": "PM3_6_4_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1500", "Guaranteed Power(kVA)": "1500", "Primary Voltage (kV)": "4", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0565", "No load losses(kW)": "2.88", "Low-voltage-side short-circuit resistance (ohms)": "0.0016128", "Maximum number of outputs": "1", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "95000", - "Preventive maintenance cost (dolars)": "2546", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "95000", + "Preventive maintenance cost (dollars)": "2546", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "4", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "OH1_2_12_47_0_416", + "Name": "OH1_2_12_47_0_120", "Type": "U", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "25", "Guaranteed Power(kVA)": "25", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.118", "Low-voltage-side short-circuit resistance (ohms)": "0.036864", "Maximum number of outputs": "10", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3075", - "Preventive maintenance cost (dolars)": "82.41", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3075", + "Preventive maintenance cost (dollars)": "82.41", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "12", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_3_12_47_0_416", + "Name": "OH1_3_12_47_0_120", "Type": "U", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "50", "Guaranteed Power(kVA)": "50", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.185", "Low-voltage-side short-circuit resistance (ohms)": "0.018432", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4500", - "Preventive maintenance cost (dolars)": "120.6", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4500", + "Preventive maintenance cost (dollars)": "120.6", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "53", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_4_12_47_0_416", + "Name": "OH1_4_12_47_0_120", "Type": "U", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.285", "Low-voltage-side short-circuit resistance (ohms)": "0.00768", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "6900", - "Preventive maintenance cost (dolars)": "184.92", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "6900", + "Preventive maintenance cost (dollars)": "184.92", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "35", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "PM3_1_12_47_0_416", + "Name": "PM3_1_12_47_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0324", "No load losses(kW)": "0.45", "Low-voltage-side short-circuit resistance (ohms)": "0.0402432", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "35175", - "Preventive maintenance cost (dolars)": "942.69", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "35175", + "Preventive maintenance cost (dollars)": "942.69", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "6", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_2_12_47_0_416", + "Name": "PM3_2_12_47_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "100", "Guaranteed Power(kVA)": "100", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0329", "No load losses(kW)": "0.62", "Low-voltage-side short-circuit resistance (ohms)": "0.0278784", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "36975", - "Preventive maintenance cost (dolars)": "990.93", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "36975", + "Preventive maintenance cost (dollars)": "990.93", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "14", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_3_12_47_0_416", + "Name": "PM3_3_12_47_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "150", "Guaranteed Power(kVA)": "150", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0339", "No load losses(kW)": "0.775", "Low-voltage-side short-circuit resistance (ohms)": "0.0248832", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "38625", - "Preventive maintenance cost (dolars)": "1035.15", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "38625", + "Preventive maintenance cost (dollars)": "1035.15", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "14", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_4_12_47_0_416", + "Name": "PM3_4_12_47_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "300", "Guaranteed Power(kVA)": "300", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0376", "No load losses(kW)": "0.975", "Low-voltage-side short-circuit resistance (ohms)": "0.0105216", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "47100", - "Preventive maintenance cost (dolars)": "1262.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "47100", + "Preventive maintenance cost (dollars)": "1262.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "28", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_5_12_47_0_416", + "Name": "PM3_5_12_47_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "500", "Guaranteed Power(kVA)": "500", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0436", "No load losses(kW)": "1.33", "Low-voltage-side short-circuit resistance (ohms)": "0.0050688", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "55875", - "Preventive maintenance cost (dolars)": "1497.45", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "55875", + "Preventive maintenance cost (dollars)": "1497.45", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "24", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_12_47_0_416", + "Name": "PM3_6_12_47_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1000", "Guaranteed Power(kVA)": "1000", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0562", "No load losses(kW)": "2", "Low-voltage-side short-circuit resistance (ohms)": "0.0027648", "Maximum number of outputs": "2", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "69600", - "Preventive maintenance cost (dolars)": "1865.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "69600", + "Preventive maintenance cost (dollars)": "1865.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "10", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_12_47_0_416", + "Name": "PM3_6_12_47_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1500", "Guaranteed Power(kVA)": "1500", "Primary Voltage (kV)": "12.47", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0565", "No load losses(kW)": "2.88", "Low-voltage-side short-circuit resistance (ohms)": "0.0016128", "Maximum number of outputs": "1", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "95000", - "Preventive maintenance cost (dolars)": "2546", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "95000", + "Preventive maintenance cost (dollars)": "2546", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "4", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "OH1_2_13_2_0_416", + "Name": "OH1_2_13_2_0_120", "Type": "U", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "25", "Guaranteed Power(kVA)": "25", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.118", "Low-voltage-side short-circuit resistance (ohms)": "0.036864", "Maximum number of outputs": "10", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3075", - "Preventive maintenance cost (dolars)": "82.41", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3075", + "Preventive maintenance cost (dollars)": "82.41", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "12", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_3_13_2_0_416", + "Name": "OH1_3_13_2_0_120", "Type": "U", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "50", "Guaranteed Power(kVA)": "50", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.185", "Low-voltage-side short-circuit resistance (ohms)": "0.018432", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4500", - "Preventive maintenance cost (dolars)": "120.6", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4500", + "Preventive maintenance cost (dollars)": "120.6", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "53", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_4_13_2_0_416", + "Name": "OH1_4_13_2_0_120", "Type": "U", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.285", "Low-voltage-side short-circuit resistance (ohms)": "0.00768", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "6900", - "Preventive maintenance cost (dolars)": "184.92", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "6900", + "Preventive maintenance cost (dollars)": "184.92", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "35", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "PM3_1_13_2_0_416", + "Name": "PM3_1_13_2_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0324", "No load losses(kW)": "0.45", "Low-voltage-side short-circuit resistance (ohms)": "0.0402432", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "35175", - "Preventive maintenance cost (dolars)": "942.69", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "35175", + "Preventive maintenance cost (dollars)": "942.69", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "6", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_2_13_2_0_416", + "Name": "PM3_2_13_2_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "100", "Guaranteed Power(kVA)": "100", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0329", "No load losses(kW)": "0.62", "Low-voltage-side short-circuit resistance (ohms)": "0.0278784", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "36975", - "Preventive maintenance cost (dolars)": "990.93", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "36975", + "Preventive maintenance cost (dollars)": "990.93", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "14", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_3_13_2_0_416", + "Name": "PM3_3_13_2_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "150", "Guaranteed Power(kVA)": "150", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0339", "No load losses(kW)": "0.775", "Low-voltage-side short-circuit resistance (ohms)": "0.0248832", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "38625", - "Preventive maintenance cost (dolars)": "1035.15", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "38625", + "Preventive maintenance cost (dollars)": "1035.15", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "14", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_4_13_2_0_416", + "Name": "PM3_4_13_2_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "300", "Guaranteed Power(kVA)": "300", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0376", "No load losses(kW)": "0.975", "Low-voltage-side short-circuit resistance (ohms)": "0.0105216", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "47100", - "Preventive maintenance cost (dolars)": "1262.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "47100", + "Preventive maintenance cost (dollars)": "1262.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "28", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_5_13_2_0_416", + "Name": "PM3_5_13_2_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "500", "Guaranteed Power(kVA)": "500", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0436", "No load losses(kW)": "1.33", "Low-voltage-side short-circuit resistance (ohms)": "0.0050688", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "55875", - "Preventive maintenance cost (dolars)": "1497.45", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "55875", + "Preventive maintenance cost (dollars)": "1497.45", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "24", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_13_2_0_416", + "Name": "PM3_6_13_2_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1000", "Guaranteed Power(kVA)": "1000", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0562", "No load losses(kW)": "2", "Low-voltage-side short-circuit resistance (ohms)": "0.0027648", "Maximum number of outputs": "2", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "69600", - "Preventive maintenance cost (dolars)": "1865.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "69600", + "Preventive maintenance cost (dollars)": "1865.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "10", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_13_2_0_416", + "Name": "PM3_6_13_2_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1500", "Guaranteed Power(kVA)": "1500", "Primary Voltage (kV)": "13.2", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0565", "No load losses(kW)": "2.88", "Low-voltage-side short-circuit resistance (ohms)": "0.0016128", "Maximum number of outputs": "1", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "95000", - "Preventive maintenance cost (dolars)": "2546", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "95000", + "Preventive maintenance cost (dollars)": "2546", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "4", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "OH1_2_25_0_416", + "Name": "OH1_2_25_0_120", "Type": "U", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "25", "Guaranteed Power(kVA)": "25", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.118", "Low-voltage-side short-circuit resistance (ohms)": "0.036864", "Maximum number of outputs": "10", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "3075", - "Preventive maintenance cost (dolars)": "82.41", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "3075", + "Preventive maintenance cost (dollars)": "82.41", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "12", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_3_25_0_416", + "Name": "OH1_3_25_0_120", "Type": "U", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "50", "Guaranteed Power(kVA)": "50", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.185", "Low-voltage-side short-circuit resistance (ohms)": "0.018432", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "4500", - "Preventive maintenance cost (dolars)": "120.6", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "4500", + "Preventive maintenance cost (dollars)": "120.6", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "53", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "OH1_4_25_0_416", + "Name": "OH1_4_25_0_120", "Type": "U", "Voltage level": "MV-LV", "Nphases": "1", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.120", "Reactance (p.u. transf)": "0.02", "No load losses(kW)": "0.285", "Low-voltage-side short-circuit resistance (ohms)": "0.00768", "Maximum number of outputs": "12", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "6900", - "Preventive maintenance cost (dolars)": "184.92", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "6900", + "Preventive maintenance cost (dollars)": "184.92", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "35", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": true }, { - "Name": "PM3_1_25_0_416", + "Name": "PM3_1_25_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "75", "Guaranteed Power(kVA)": "75", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0324", "No load losses(kW)": "0.45", "Low-voltage-side short-circuit resistance (ohms)": "0.0402432", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "35175", - "Preventive maintenance cost (dolars)": "942.69", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "35175", + "Preventive maintenance cost (dollars)": "942.69", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "6", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_2_25_0_416", + "Name": "PM3_2_25_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "100", "Guaranteed Power(kVA)": "100", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0329", "No load losses(kW)": "0.62", "Low-voltage-side short-circuit resistance (ohms)": "0.0278784", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "36975", - "Preventive maintenance cost (dolars)": "990.93", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "36975", + "Preventive maintenance cost (dollars)": "990.93", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "14", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_3_25_0_416", + "Name": "PM3_3_25_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "150", "Guaranteed Power(kVA)": "150", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0339", "No load losses(kW)": "0.775", "Low-voltage-side short-circuit resistance (ohms)": "0.0248832", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "38625", - "Preventive maintenance cost (dolars)": "1035.15", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "38625", + "Preventive maintenance cost (dollars)": "1035.15", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "14", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_4_25_0_416", + "Name": "PM3_4_25_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "300", "Guaranteed Power(kVA)": "300", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0376", "No load losses(kW)": "0.975", "Low-voltage-side short-circuit resistance (ohms)": "0.0105216", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "47100", - "Preventive maintenance cost (dolars)": "1262.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "47100", + "Preventive maintenance cost (dollars)": "1262.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "28", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_5_25_0_416", + "Name": "PM3_5_25_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "500", "Guaranteed Power(kVA)": "500", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0436", "No load losses(kW)": "1.33", "Low-voltage-side short-circuit resistance (ohms)": "0.0050688", "Maximum number of outputs": "6", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "55875", - "Preventive maintenance cost (dolars)": "1497.45", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "55875", + "Preventive maintenance cost (dollars)": "1497.45", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "24", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_25_0_416", + "Name": "PM3_6_25_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1000", "Guaranteed Power(kVA)": "1000", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0562", "No load losses(kW)": "2", "Low-voltage-side short-circuit resistance (ohms)": "0.0027648", "Maximum number of outputs": "2", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "69600", - "Preventive maintenance cost (dolars)": "1865.28", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "69600", + "Preventive maintenance cost (dollars)": "1865.28", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "10", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false }, { - "Name": "PM3_6_25_0_416", + "Name": "PM3_6_25_0_480", "Type": "U", "Voltage level": "MV-LV", "Nphases": "3", "Installed Power(kVA)": "1500", "Guaranteed Power(kVA)": "1500", "Primary Voltage (kV)": "25", - "Secondary Voltage (kV)": "0.416", + "Secondary Voltage (kV)": "0.480", "Reactance (p.u. transf)": "0.0565", "No load losses(kW)": "2.88", "Low-voltage-side short-circuit resistance (ohms)": "0.0016128", "Maximum number of outputs": "1", - "Investment cost per output (dolars)": "0", + "Investment cost per output (dollars)": "0", " Failure rate minimum[failures / year]": "0.005", " Failure rate medium[failures / year]": "0.005", " Failure rate maximum[failures / year]": "0.005", - "Investment Cost (dolars)": "95000", - "Preventive maintenance cost (dolars)": "2546", - "Corrective maintenance cost (dolars)": "0", + "Investment Cost (dollars)": "95000", + "Preventive maintenance cost (dollars)": "2546", + "Corrective maintenance cost (dollars)": "0", "GIS Ratio": "0.1", "Preventive maintenance time (hours)": "230", "Repair time minimum (hours)": "14", "Repair time medium (hours)": "30", "Repair time maximum (hours)": "44", "Probability": "4", - "connection": "Wye-Wye" + "connection": "Wye-Wye", + "Centertap": false } ] } diff --git a/lib/urbanopt/rnm.rb b/lib/urbanopt/rnm.rb index 478091e..68908f9 100644 --- a/lib/urbanopt/rnm.rb +++ b/lib/urbanopt/rnm.rb @@ -57,3 +57,4 @@ require 'urbanopt/rnm/runner' require 'urbanopt/rnm/api_client' require 'urbanopt/rnm/post_processor' +require 'urbanopt/rnm/validation' diff --git a/lib/urbanopt/rnm/runner.rb b/lib/urbanopt/rnm/runner.rb index 4745182..36a221b 100644 --- a/lib/urbanopt/rnm/runner.rb +++ b/lib/urbanopt/rnm/runner.rb @@ -171,6 +171,16 @@ def post_process @rnm_pp = URBANopt::RNM::PostProcessor.new(@results, @run_dir, @feature_file) @rnm_pp.post_process end + + + ## + # Run OpenDSS validation + ## + def run_validation + # generate RNM-US input files + validation = URBANopt::RNM::Validation.new(@run_dir) + validation.run_validation + end end end end diff --git a/lib/urbanopt/rnm/transformer_opendss.rb b/lib/urbanopt/rnm/transformer_opendss.rb index d518e6d..24d56e7 100644 --- a/lib/urbanopt/rnm/transformer_opendss.rb +++ b/lib/urbanopt/rnm/transformer_opendss.rb @@ -52,11 +52,7 @@ def create(trafo) hash[:resistance] = trafo['Low-voltage-side short-circuit resistance (ohms)'].to_f.round(2) hash[:reactance] = trafo['Reactance (p.u. transf)'].to_f.round(2) hash[:phases] = trafo['Nphases'] - if trafo['Nphases'] == '3' - hash[:is_center_tap] = false - else - hash[:is_center_tap] = true - end + hash[:Centertap] = trafo['Centertap'] hash[:high_voltage] = trafo['Primary Voltage (kV)'] hash[:low_voltage] = trafo['Secondary Voltage (kV)'] hash[:connection] = trafo['connection'] diff --git a/lib/urbanopt/rnm/validation.rb b/lib/urbanopt/rnm/validation.rb new file mode 100644 index 0000000..dae9ab0 --- /dev/null +++ b/lib/urbanopt/rnm/validation.rb @@ -0,0 +1,76 @@ +# ********************************************************************************* +# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other +# contributors. All rights reserved. + +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: + +# Redistributions of source code must retain the above copyright notice, this list +# of conditions and the following disclaimer. + +# Redistributions in binary form must reproduce the above copyright notice, this +# list of conditions and the following disclaimer in the documentation and/or other +# materials provided with the distribution. + +# Neither the name of the copyright holder nor the names of its contributors may be +# used to endorse or promote products derived from this software without specific +# prior written permission. + +# Redistribution of this software, without modification, must refer to the software +# by the same designation. Redistribution of a modified version of this software +# (i) may not refer to the modified version by the same designation, or by any +# confusingly similar designation, and (ii) must refer to the underlying software +# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, +# the term "URBANopt", or any confusingly similar designation may not be used to +# refer to any modified version of this software or any modified version of the +# underlying software originally provided by Alliance without the prior written +# consent of Alliance. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +# OF THE POSSIBILITY OF SUCH DAMAGE. +# ********************************************************************************* + +require 'urbanopt/rnm/logger' + +module URBANopt + module RNM + # Class for OpenDSS validation (runs python script) + class Validation + ## + # Initialize attributes: ++run directory+ + ## + # [parameters:] + # * +rnm_dirname+ - _String_ - name of RNM-US directory that will contain the input files (within the scenario directory) + def initialize(rnm_full_path) + # absolute path + @rnm_full_path = rnm_full_path + @opendss_full_path=File.join(@rnm_full_path,'results/OpenDSS') + if !Dir.exist?(@opendss_full_path) + puts 'Error: folder does not exist'+@rnm_full_path + end + end + + + ## + # Run validation + ## + def run_validation() + puts "Initating OpenDSS validation in folder" + puts @opendss_full_path + puts "This can take some minutes" + #puts `python ./lib/urbanopt/rnm/validation/main_validation.py #{@rnm_full_path}` + log=`python ./lib/urbanopt/rnm/validation/main_validation.py #{@opendss_full_path}` + puts log + end + + end +end +end \ No newline at end of file diff --git a/lib/urbanopt/rnm/validation/main_validation.py b/lib/urbanopt/rnm/validation/main_validation.py new file mode 100644 index 0000000..a20667b --- /dev/null +++ b/lib/urbanopt/rnm/validation/main_validation.py @@ -0,0 +1,51 @@ +import opendssdirect as dss +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np +import sys as sys +import math +import networkx as nx +import opendss_interface +import plot_lib + +class Validation: + def __init__(self, folder): + self.folder = folder + + def main_validation(self): + master_file_full_path = folder + '/dss_files/' + 'Master.dss' + start_index = 0 + num_periods=12 + end_index = 8760 + v_range_voltage=(0.9, 1.1) + v_limits_voltage=[0.95,1.05] + v_range_loading=(0,1.3) + v_limits_loading=[1] + v_range_show_all=(0,0) + + #For tests + #end_index = 24 + #v_range_voltage=(0.975, 1.025) + + myopendss_io=opendss_interface.OpenDSS_Interface(folder) + v_dict_voltage,v_voltage_yearly,v_voltage_period,v_power_yearly,v_power_period,v_dict_loading,v_loading_yearly,v_loading_period,v_dict_losses,v_subs_losses_yearly,v_line_losses_yearly,dict_buses_element=myopendss_io.solve_powerflow_iteratively(num_periods,start_index,end_index,master_file_full_path,v_range_voltage,v_range_loading) + myopendss_io.write_dict(v_dict_voltage,v_range_show_all,'Voltages (p.u.)','Buses') + myopendss_io.write_dict(v_dict_voltage,v_range_voltage,'Voltage Violations (p.u.)','Buses') + myopendss_io.write_dict(v_dict_loading,v_range_show_all,'Loading (p.u.)','Branches') + myopendss_io.write_dict(v_dict_loading,v_range_loading,'Loading Violations (p.u.)','Branches') + myopendss_io.write_dict(v_dict_losses,v_range_show_all,'Losses','Branches') + edges=myopendss_io.get_edges() + myplot_lib=plot_lib.Plot_Lib(folder) + myplot_lib.plot_hist('Voltage',v_voltage_yearly,v_voltage_period,v_range_voltage,40,num_periods,v_limits_voltage) + myplot_lib.plot_hist('Loading',v_loading_yearly,v_loading_period,v_range_loading,80,num_periods,v_limits_loading) + myplot_lib.plot_losses(v_subs_losses_yearly,v_line_losses_yearly) + myplot_lib.plot_graph(edges,v_dict_voltage,v_range_voltage,v_dict_loading,v_range_loading,dict_buses_element) + + + +if __name__ == "__main__": + #Example to run it in command window + #python main_validation.py files + folder = sys.argv[1] + valid=Validation(folder) + valid.main_validation() diff --git a/lib/urbanopt/rnm/validation/opendss_interface.py b/lib/urbanopt/rnm/validation/opendss_interface.py new file mode 100644 index 0000000..215548c --- /dev/null +++ b/lib/urbanopt/rnm/validation/opendss_interface.py @@ -0,0 +1,234 @@ +import opendssdirect as dss +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np +import sys as sys +import math +import networkx as nx + +class OpenDSS_Interface: + def __init__(self, folder): + self.folder = folder + + def remove_terminal(self,bus): + if isinstance(bus,str): + return bus.split('.')[0] + else: + return bus + + + def extract_period(self,v_value_i,v_value_period,i,end_index,num_periods): + for j in range(num_periods): + if (i<=end_index*j/num_periods): + v_value_period[j].extend(v_value_i) + break + return v_value_period + + def add_to_dictionary(self,v_dict_voltage,dict_voltage_i): + for idx,name in enumerate(dict_voltage_i): + if name in v_dict_voltage: #if not empty + v_dict_voltage[name].append(dict_voltage_i[name]) + else: + v_dict_voltage[name]=[dict_voltage_i[name]] + + def dss_run_command(self,command): + output=dss.run_command(command) + if (len(output)>0): + print(output) + + + def get_all_voltage(self): + """Computes over and under voltages for all buses""" + bus_names = dss.Circuit.AllBusNames() + dict_voltage = {} + v_voltage = [0 for _ in range(len(bus_names))] + for idx,b in enumerate(bus_names): + dss.Circuit.SetActiveBus(b) + vang = dss.Bus.puVmagAngle() + if len(vang[::2]) > 0: + vmag = sum(vang[::2])/(len(vang)/2) + else: + vmag = 0 + dict_voltage[b] = vmag + v_voltage[idx]=vmag + + return dict_voltage,v_voltage + + def get_all_power(self): + """Computes power in all circuits""" + circuit_names = dss.Circuit.AllElementNames() + dict_power = {} + v_power = [0 for _ in range(len(circuit_names))] + for idx,b in enumerate(circuit_names): + dss.Circuit.SetActiveElement(b) + power = dss.CktElement.Powers() + if len(power[::2]) > 0: + poweravg = sum(power[::2])/(len(power)/2) + else: + poweravg = 0 + dict_power[b] = poweravg + v_power[idx]=poweravg + + return dict_power,v_power + + + def get_all_loading(self): + """Computes loading in all circuits""" + circuit_names = dss.Circuit.AllElementNames() + dict_loading = {} + dict_buses_element={} #Associate the element to the buses (this has the inconvenient that only associates one element to each pair of buses) + v_loading = [0 for _ in range(len(circuit_names))] + for idx,element in enumerate(circuit_names): + dss.Circuit.SetActiveElement(element) + #only if it is a branch (two buses) + buses = dss.CktElement.BusNames() + if (len(buses)>=2): + current = dss.CktElement.CurrentsMagAng() + num_terminals=dss.CktElement.NumTerminals() + if len(current[::2]) > 0: + #currentmag = sum(current[::2])/len(current[::2]) + #Take only the average of 1 terminal (discarding phases so every 2) + lenc=len(current[::2]) + stop=round(2*lenc/num_terminals) + #print(current[:stop:2]) + currentmag = sum(current[:stop:2])/lenc + else: + currentmag = 0 + currentmag = current[0] + nominal_current = dss.CktElement.NormalAmps() + #Transformers have applied a 1.1 factor in the calculation of NormalAmps + #See library that OpenDSSdirect uses in https://github.com/dss-extensions/dss_capi/blob/master/src/PDElements/Transformer.pas + #in particular line code AmpRatings[i] := 1.1 * kVARatings[i] / Fnphases / Vfactor; + if (element.startswith("Transformer")): + nominal_current=nominal_current/1.1 + if (nominal_current>0): + dict_loading[element] = currentmag/nominal_current + v_loading[idx]=currentmag/nominal_current + bus1to2=self.remove_terminal(buses[0])+'-->'+self.remove_terminal(buses[1]) + dict_buses_element[bus1to2]=element + + return dict_loading,v_loading,dict_buses_element + + def get_all_losses(self): + """Computes losses in all circuits""" + circuit_names = dss.Circuit.AllElementNames() + dict_losses = {} + v_losses = [0 for _ in range(len(circuit_names))] + total_losses=0 + for idx,element in enumerate(circuit_names): + dss.Circuit.SetActiveElement(element) + #only if it is a branch (two buses) + buses = dss.CktElement.BusNames() + if (len(buses)>=2): + #next if check discards vsources + nominal_current = dss.CktElement.NormalAmps() + if (nominal_current>0): + losses = dss.CktElement.Losses() + if len(losses) ==2: + lossesavg = (losses[0]) #Verify this is correct, if not abs() they range from + to -, [0] to take active losses + else: + print("error - not correctly reading losses") + lossesavg=0 + #Convert to kW. This function is the exeption that return losses in W + lossesavg=lossesavg/1000 + dict_losses[element] = lossesavg + v_losses[idx]=lossesavg + + return dict_losses,total_losses + + def get_total_subs_losses(self): + """Computes total substation losses""" + return dss.Circuit.SubstationLosses()[0] #Real part + + def get_total_line_losses(self): + """Computes total line losses""" + return dss.Circuit.LineLosses()[0] #Real part + + def get_edges(self): + edges=[] + circuit_names = dss.Circuit.AllElementNames() + for idx,element in enumerate(circuit_names): + dss.Circuit.SetActiveElement(element) + buses = dss.CktElement.BusNames() + #Only if it is a branch + if (len(buses)>=2): #There can be 3 buses in single-phase center-tap transformer, in this case the two last ones are equals (different terminals only) and we can take just the 2 first ones + #remove terminal from the bus name (everything to the right of point) + edges.append([(self.remove_terminal(buses[0]),self.remove_terminal(buses[1]))]) + return edges + + def write_dict(self,v_dict,v_range,type,component): + output_file_full_path = self.folder + '/' + type + '_' + component + '.csv' + # Write directly as a CSV file with headers on first line + with open(output_file_full_path, 'w') as fp: + #Header: ID, hours (consider adding day, month in future) + for idx,name in enumerate(v_dict): + fp.write('Hour,'+','.join(str(idx2) for idx2,value in enumerate(v_dict[name])) + '\n') + break + #Write matrix + for idx,name in enumerate(v_dict): + #Truncate list to limits + truncated_values=[] + for idx2,value in enumerate(v_dict[name]): + if value=v_range[1]: + truncated_values.append(str(value)) + else: + truncated_values.append("") + fp.write(name+','+','.join(truncated_values)+'\n') + #truncated_values=[i for i, lower, upper in zip(v_dict_voltage[name], [v_range_voltage[1]]*len(v_dict_voltage[name]), [v_range_voltage[1]]*len(v_dict_voltage[name])) if i upper] + #fp.write(name+','+','.join(map(str,v_dict_voltage[name]))+'\n') + + + def solve_powerflow_iteratively(self,num_periods,start_index,end_index,location,v_range_voltage,v_range_loading): + #Por flow solving mode + self.dss_run_command("Clear") + self.dss_run_command('Redirect '+location) + self.dss_run_command("solve mode = snap") + self.dss_run_command("Set mode=yearly stepsize=1h number=1") + #Init vectors + v_voltage_yearly=[] + v_voltage_period=[[] for _ in range(num_periods)] + v_power_yearly=[] + v_power_period=[[] for _ in range(num_periods)] + v_loading_yearly=[] + v_loading_period=[[] for _ in range(num_periods)] + v_subs_losses_yearly=[] + v_line_losses_yearly=[] + v_dict_voltage={} + v_dict_loading={} + v_dict_losses={} + #Additional initializations + my_range=range(start_index,end_index,1) + old_percentage_str="" #Variable for tracking progress + for i in my_range: + #Solve power flow + self.dss_run_command("Solve") + #Get voltages + dict_voltage_i, v_voltage_i = self.get_all_voltage() + self.add_to_dictionary(v_dict_voltage,dict_voltage_i) + v_voltage_yearly.extend(v_voltage_i) + self.extract_period(v_voltage_i,v_voltage_period,i,end_index,num_periods) + #Get power + dict_power_i, v_power_i = self.get_all_power() + v_power_yearly.extend(v_power_i) + v_power_period=self.extract_period(v_power_i,v_power_period,i,end_index,num_periods) + #Get loading + dict_loading_i, v_loading_i,dict_buses_element = self.get_all_loading() + self.add_to_dictionary(v_dict_loading,dict_loading_i) + v_loading_yearly.extend(v_loading_i) + v_loading_period=self.extract_period(v_loading_i,v_loading_period,i,end_index,num_periods) + #Get dict losses + dict_losses_i, v_losses_i = self.get_all_losses() + self.add_to_dictionary(v_dict_losses,dict_losses_i) + #Get losses + subs_losses_i = self.get_total_subs_losses() + v_subs_losses_yearly.append(subs_losses_i) + line_losses_i = self.get_total_line_losses() + v_line_losses_yearly.append(line_losses_i) + #Print progress + #percentage_str="{:.0f}".format(100*i/end_index)+"%" + #if (percentage_str!=old_percentage_str): + # print(percentage_str) + #old_percentage_str=percentage_str + return v_dict_voltage,v_voltage_yearly,v_voltage_period,v_power_yearly,v_power_period,v_dict_loading,v_loading_yearly,v_loading_period,v_dict_losses,v_subs_losses_yearly,v_line_losses_yearly,dict_buses_element + + diff --git a/lib/urbanopt/rnm/validation/plot_lib.py b/lib/urbanopt/rnm/validation/plot_lib.py new file mode 100644 index 0000000..b50bbdb --- /dev/null +++ b/lib/urbanopt/rnm/validation/plot_lib.py @@ -0,0 +1,222 @@ +import opendssdirect as dss +import pandas as pd +import matplotlib.pyplot as plt +import numpy as np +import sys as sys +import math +import networkx as nx +import opendss_interface + +class Plot_Lib: + def __init__(self, folder): + self.folder = folder + + def remove_terminal(self,bus): + myopendss_io=opendss_interface.OpenDSS_Interface(self.folder) + bus=myopendss_io.remove_terminal(bus) + return bus + + + def plot_hist(self,type,v_value,v_value_period,v_range,num_bins,num_periods,v_limits): + output_file_full_path_fig = self.folder + '/' + type + ' Histogram (p.u.).png' + output_file_full_path_csv = self.folder + '/' + type + ' Histogram (p.u.).csv' + plt.figure + plt.grid(True) + v_legend=["" for _ in range(num_periods+2)] + matrix=np.empty((num_bins,num_periods+2)) #Matrix for writting to file (index+periods+yearly) + for j in range(num_periods): + plt.xlim(v_range) + v_weights = np.ones_like(v_value_period[j]) / len(v_value_period[j]) + counts, bins = np.histogram(v_value_period[j], range=v_range, bins=num_bins, weights=v_weights) + if j==0: + v_legend[0]=type + matrix[:,0]=bins[:num_bins:] + matrix[:,j+1]=counts + v_legend[j+1]= "M"+str(j+1) + plt.plot(bins[:-1]+(bins[1]-bins[0])*0.5, counts) + + v_weights = np.ones_like(v_value) / len(v_value) + counts, bins = np.histogram(v_value, range=v_range, bins=num_bins, weights=v_weights) + matrix[:,num_periods+1]=counts + v_legend[num_periods+1]='Yearly' + plt.hist(bins[:-1], bins, weights=counts) + plt.legend(v_legend[1:num_periods+2:]) + #Write line with the limits + for j in range(len(v_limits)): + h = plt.axvline(v_limits[j], color='r', linestyle='--') + #plt.text(0.76, 120000, '1,596 buses out of limits ', fontsize = 10) + plt.xlabel(type+' (p.u.)') + plt.ylabel('Frequency (p.u.)') + plt.savefig(output_file_full_path_fig, dpi=300) + plt.show() + #Save to file + # Write directly as a CSV file with headers on first line + with open(output_file_full_path_csv, 'w') as fp: + fp.write(','.join(v_legend) + '\n') + np.savetxt(fp, matrix, '%s', ',') + #Deprecated with dataframes + #pd_values = pd.DataFrame(matrix,index=bins) + #pd_values.to_csv(output_file_full_path) + + + def plot_losses(self,v_subs_losses_yearly,v_line_losses_yearly): + output_file_full_path_fig = self.folder + '/' + 'Losses' + '.png' + plt.figure + plt.plot(sorted(v_subs_losses_yearly,reverse=True)) + plt.plot(sorted(v_line_losses_yearly,reverse=True)) + plt.plot(sorted(np.add(v_subs_losses_yearly,v_line_losses_yearly),reverse=True)) + plt.legend(['Substation losses','Line losses','Total losses']) + plt.xlabel('Hour (h)') + plt.ylabel('Losses (kWh)') + plt.savefig(output_file_full_path_fig) + plt.show() + + + def get_graph(self,edges): + graph=nx.Graph() + for idx,element in enumerate(edges): + graph.add_edges_from(element) + return graph + + def get_locations(self,graph,bus,locations=[],x_locations_levels={},parent=None,level=0,visited_buses=[]): + #Add to the list of visited buses + if visited_buses: + visited_buses.append(bus) + else: + visited_buses=[bus] + #Obtain the buses connected to this one + connected_buses = list(graph.neighbors(bus)) + #Explore downstream levels + x_downstream_locations=[] + for downstream_bus in connected_buses: + #Remove the terminal from the bus nmae + downstream_bus=self.remove_terminal(downstream_bus) + #If the bus was already visited, remove from graph (if activated this would remove loops) + #if downstream_bus!=parent and downstream_bus in visited_buses and graph.has_edge(bus,downstream_bus) and b_remove_loops: + #Remove self loops (possible to happen because of terminals in buses) + if downstream_bus==bus: + graph.remove_edge(bus,downstream_bus) + else: + #Explore downstream the graph (recursive search) + if downstream_bus!=parent and not downstream_bus in visited_buses: + x_loc,locations=self.get_locations(graph,downstream_bus,locations,x_locations_levels,bus,level+1,visited_buses) + x_downstream_locations.append(x_loc) + #For the upper levels, it takes the average of the downstream buses + if x_downstream_locations: + loc=(sum(x_downstream_locations)/len(x_downstream_locations),-level); + else: + if x_locations_levels: + #Pick up location from this level or the previous ones + #It is neccesary to sort it, to pick in the above for lev loop the x_next_location from the more downstream level + for lev in sorted(x_locations_levels): + if lev<=level: + x_next_location=x_locations_levels[lev]+1 + #Assign location x, y + loc=(x_next_location,-level) + else: + #Default position for first bus + loc=(1,-level) + #Assign x location of this level + x_locations_levels[level]=loc[0] + #update locations + if locations: + locations[bus]=loc + else: + locations={bus:loc} + #Return x location of this bus (all locations are provided in locations argument) + return loc[0],locations + + + + + def plot_graph(self,edges,v_dict_voltage,v_range,v_dict_loading,v_range_loading,dict_buses_element): + output_file_full_path_fig = self.folder + '/' + 'Network Violations' + '.png' + #output_file_full_path_fig = folder + '/' + type + '.png' + #Example + graph=nx.Graph() + #graph.add_edges_from([(1,2), (1,3), (1,4), (1,5), (1,2), (2,6), (6,7), (7,1)]) + #discard,locations=self.get_locations(graph,1) + graph=self.get_graph(edges) + discard,locations=self.get_locations(graph,'st_mat') + #Obtain number of violations of each node + cmap = plt.cm.get_cmap('jet') + dic_num_violations_v={} + for node in graph: + #Truncate list to limits + dic_num_violations_v[node]=0 + for idx2,value in enumerate(v_dict_voltage[node]): + if value=v_range[1]: + dic_num_violations_v[node]=dic_num_violations_v[node]+1 + #Make colormap + color_map_v=[] + max_violations_v=max(dic_num_violations_v.values()) + for node in graph: + if max_violations_v==0: + intensity=0 + else: + intensity=dic_num_violations_v[node]/max_violations_v + #color_map_v.append(cmap_nodes(intensity)) + color_map_v.append(intensity) + #Obtain number of violations of each branch + dic_num_violations_l={} + for edge in graph.edges(): + #Truncate list to limits + dic_num_violations_l[edge]=0 + #bus1to2=self.remove_terminal(edge[0])+'-->'+self.remove_terminal(edge[1]) + #bus2to1=self.remove_terminal(edge[1])+'-->'+self.remove_terminal(edge[0]) + bus1to2=self.remove_terminal(edge[0])+'-->'+self.remove_terminal(edge[1]) + bus2to1=self.remove_terminal(edge[1])+'-->'+self.remove_terminal(edge[0]) + if bus1to2 in dict_buses_element: + element=dict_buses_element[bus1to2] + else: + element=dict_buses_element[bus2to1] + for idx2,value in enumerate(v_dict_loading[element]): + if value=v_range_loading[1]: + dic_num_violations_l[edge]=dic_num_violations_l[edge]+1 + #Make colormap + color_map_l=[] + max_violations_l=max(dic_num_violations_l.values()) + for edge in graph.edges(): + if max_violations_l==0: + intensity=0 + else: + intensity=dic_num_violations_l[edge]/max_violations_l + #color_map_v.append(cmap_nodes(intensity)) + color_map_l.append(intensity) + #Obtain min and max of x locations + max_x=0 + max_y=0 + for idx,name in enumerate(locations): + if (max_x Date: Fri, 23 Sep 2022 10:56:13 -0600 Subject: [PATCH 10/62] small changes for new RNM-US v2 API --- lib/urbanopt/rnm/consumers.rb | 5 +++-- lib/urbanopt/rnm/input_files.rb | 2 +- lib/urbanopt/rnm/prosumers.rb | 4 ++-- lib/urbanopt/rnm/validation.rb | 3 +-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/urbanopt/rnm/consumers.rb b/lib/urbanopt/rnm/consumers.rb index 3e5a00a..f8b82c4 100644 --- a/lib/urbanopt/rnm/consumers.rb +++ b/lib/urbanopt/rnm/consumers.rb @@ -144,10 +144,10 @@ def voltage_values(peak_apparent_power) case peak_apparent_power when 0..@lv_limit[:single_phase] # set by the catalog limits phases = 1 - voltage_default = 0.416 + voltage_default = 0.12 when @lv_limit[:single_phase]..@lv_limit[:three_phase] # defined from the catalog (from the wires) phases = 3 - voltage_default = 0.416 + voltage_default = 0.48 # MV and 3 phases untill 16 MVA, defined by the SMART-DS project when @lv_limit[:three_phase]..16000 phases = 3 @@ -201,6 +201,7 @@ def av_peak_cons_per_building_type(feature_file) average_peak = mixed_use_av_peak # average peak per mixed use considering the building types which are in this building area = area_mixed_use end + nodes_per_bldg = (average_peak / (@lv_limit[:three_phase] * @power_factor * conservative_factor)).to_f.ceil # computing number of nodes per building if nodes_per_bldg > @max_num_lv_nodes # to define this as an input in the geojson file nodes_per_bldg = 1 diff --git a/lib/urbanopt/rnm/input_files.rb b/lib/urbanopt/rnm/input_files.rb index 3ff18ac..349e444 100644 --- a/lib/urbanopt/rnm/input_files.rb +++ b/lib/urbanopt/rnm/input_files.rb @@ -87,7 +87,7 @@ def catalog_limits # lines with the highest capacity catalog['LINES'][1].each do |key, v| (0..catalog['LINES'][1][key].length - 1).each do |ii| - if catalog['LINES'][1][key][ii]['Voltage(kV)'] == '0.416' + if catalog['LINES'][1][key][ii]['Voltage(kV)'] == '0.48' or catalog['LINES'][1][key][ii]['Voltage(kV)'] == '0.12' if catalog['LINES'][1][key][ii]['Line geometry'][0]['phase'] != 'N' wire = catalog['LINES'][1][key][ii]['Line geometry'][0]['wire'] else diff --git a/lib/urbanopt/rnm/prosumers.rb b/lib/urbanopt/rnm/prosumers.rb index 36be751..07f1ad0 100644 --- a/lib/urbanopt/rnm/prosumers.rb +++ b/lib/urbanopt/rnm/prosumers.rb @@ -201,10 +201,10 @@ def voltage_values(peak_apparent_power) case peak_apparent_power when -10000..@lv_limit[:single_phase] # set by the catalog limits phases = 1 - voltage_default = 0.416 + voltage_default = 0.12 when @lv_limit[:single_phase]..@lv_limit[:three_phase] # defined from the catalog (from the wires) phases = 3 - voltage_default = 0.416 + voltage_default = 0.48 # MV and 3 phases untill 16 MVA defined by SMART-DS project when @lv_limit[:three_phase]..16000 phases = 3 diff --git a/lib/urbanopt/rnm/validation.rb b/lib/urbanopt/rnm/validation.rb index dae9ab0..9d2df2a 100644 --- a/lib/urbanopt/rnm/validation.rb +++ b/lib/urbanopt/rnm/validation.rb @@ -70,7 +70,6 @@ def run_validation() log=`python ./lib/urbanopt/rnm/validation/main_validation.py #{@opendss_full_path}` puts log end - end + end end -end \ No newline at end of file From bf5518c5bb6220f77e098c6bc409db324a991570 Mon Sep 17 00:00:00 2001 From: cmateo Date: Wed, 28 Sep 2022 11:12:29 +0200 Subject: [PATCH 11/62] (most) small changes accepted and tested with new RNM-US version --- lib/urbanopt/rnm/input_files.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/urbanopt/rnm/input_files.rb b/lib/urbanopt/rnm/input_files.rb index 349e444..1f9c8e7 100644 --- a/lib/urbanopt/rnm/input_files.rb +++ b/lib/urbanopt/rnm/input_files.rb @@ -87,7 +87,7 @@ def catalog_limits # lines with the highest capacity catalog['LINES'][1].each do |key, v| (0..catalog['LINES'][1][key].length - 1).each do |ii| - if catalog['LINES'][1][key][ii]['Voltage(kV)'] == '0.48' or catalog['LINES'][1][key][ii]['Voltage(kV)'] == '0.12' + if Float(catalog['LINES'][1][key][ii]['Voltage(kV)'])<1 if catalog['LINES'][1][key][ii]['Line geometry'][0]['phase'] != 'N' wire = catalog['LINES'][1][key][ii]['Line geometry'][0]['wire'] else From fe9b4833e70e9bc932e1b233e8627769924f888e Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Wed, 28 Sep 2022 22:52:33 -0600 Subject: [PATCH 12/62] v2 changes --- CHANGELOG.md | 6 ++++++ README.md | 7 +++++++ lib/urbanopt/rnm/api_client.rb | 4 ++-- lib/urbanopt/rnm/input_files.rb | 2 +- lib/urbanopt/rnm/version.rb | 2 +- spec/urbanopt/urbanopt_rnm_spec.rb | 5 +++-- 6 files changed, 20 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60a3b49..5194d9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Version 0.4.0 +Date Range 05/10/22 - present + +- Breaking changes to electrical catalog used and compatible RNM-US executable. +- Update API to version 2. API v1 still working for older URBANopt SDK releases but no longer working for future versions. + ## Version 0.3.0 Date Range 11/23/21 - 05/10/22 diff --git a/README.md b/README.md index 5d20303..de17dbd 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,13 @@ An OpenDSS-formatted catalog can be generated from the extended catalog with the bundle exec rake create_opendss_catalog[/desired/path/to/opendss_catalog.json] ``` +## RNM-US API compatibility + +| API Version | RNM-US Gem Version | RNM-US exe Version | +| ----------- | ----------- | ---------------- | +| v1 | 0.3.0 and earlier | RNM-US_20220819 | +| v2 | 0.4.0 | RNM-US_20220927 | + ## Testing ```bash diff --git a/lib/urbanopt/rnm/api_client.rb b/lib/urbanopt/rnm/api_client.rb index 01fe70f..efb39fd 100644 --- a/lib/urbanopt/rnm/api_client.rb +++ b/lib/urbanopt/rnm/api_client.rb @@ -61,9 +61,9 @@ def initialize(name, rnm_dir, use_localhost = false, reopt = false) @use_localhost = use_localhost if @use_localhost - @base_api = 'http://0.0.0.0:8080/api/v1/' + @base_api = 'http://0.0.0.0:8080/api/v2/' else - @base_api = 'https://rnm.urbanopt.net/api/v1/' + @base_api = 'https://rnm.urbanopt.net/api/v2/' end puts "Running RNM-US at #{@base_api}" diff --git a/lib/urbanopt/rnm/input_files.rb b/lib/urbanopt/rnm/input_files.rb index 1f9c8e7..c3b8857 100644 --- a/lib/urbanopt/rnm/input_files.rb +++ b/lib/urbanopt/rnm/input_files.rb @@ -87,7 +87,7 @@ def catalog_limits # lines with the highest capacity catalog['LINES'][1].each do |key, v| (0..catalog['LINES'][1][key].length - 1).each do |ii| - if Float(catalog['LINES'][1][key][ii]['Voltage(kV)'])<1 + if Float(catalog['LINES'][1][key][ii]['Voltage(kV)']) < 1 if catalog['LINES'][1][key][ii]['Line geometry'][0]['phase'] != 'N' wire = catalog['LINES'][1][key][ii]['Line geometry'][0]['wire'] else diff --git a/lib/urbanopt/rnm/version.rb b/lib/urbanopt/rnm/version.rb index 998ef1e..ecbf965 100644 --- a/lib/urbanopt/rnm/version.rb +++ b/lib/urbanopt/rnm/version.rb @@ -40,6 +40,6 @@ module URBANopt module RNM - VERSION = '0.3.0'.freeze + VERSION = '0.4.0'.freeze end end diff --git a/spec/urbanopt/urbanopt_rnm_spec.rb b/spec/urbanopt/urbanopt_rnm_spec.rb index 0069525..7f390c4 100644 --- a/spec/urbanopt/urbanopt_rnm_spec.rb +++ b/spec/urbanopt/urbanopt_rnm_spec.rb @@ -174,7 +174,7 @@ expect(File.exist?(File.join(@run_dir, 'rnm-us', 'ficheros_entrada_inc.txt'))).to be true # check that opendss catalog was not created - expect(File.exist?(File.join(@run_dir, 'opendss_catalog.json'))).to be false + # expect(File.exist?(File.join(@run_dir, 'opendss_catalog.json'))).to be false end it 'zips inputs, runs simulation and gets results' do @@ -196,6 +196,7 @@ it 'saves the opendss catalog' do @extended_catalog_path = File.join(File.dirname(__FILE__), '..', '..', 'catalogs', 'extended_catalog.json') @save_path = File.join(File.dirname(__FILE__), '..', 'test_opendss_catalog.json') + $stdout.puts "SAVE PATH: #{@save_path}" if File.exist?(@save_path) FileUtils.rm_r(@save_path) @@ -204,7 +205,7 @@ # create catalog and save to specified path @opendss_catalog = URBANopt::RNM::ConversionToOpendssCatalog.new(@extended_catalog_path) @opendss_catalog.create_catalog(@save_path) - + $stdout.puts "HI HI" expect(File.exist?(@save_path)).to be true end end From bf80a9e7cb5a3750339d4e98a687e739becd6f05 Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Thu, 29 Sep 2022 11:47:36 -0600 Subject: [PATCH 13/62] remove puts --- spec/urbanopt/urbanopt_rnm_spec.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/spec/urbanopt/urbanopt_rnm_spec.rb b/spec/urbanopt/urbanopt_rnm_spec.rb index 7f390c4..24de79d 100644 --- a/spec/urbanopt/urbanopt_rnm_spec.rb +++ b/spec/urbanopt/urbanopt_rnm_spec.rb @@ -196,7 +196,6 @@ it 'saves the opendss catalog' do @extended_catalog_path = File.join(File.dirname(__FILE__), '..', '..', 'catalogs', 'extended_catalog.json') @save_path = File.join(File.dirname(__FILE__), '..', 'test_opendss_catalog.json') - $stdout.puts "SAVE PATH: #{@save_path}" if File.exist?(@save_path) FileUtils.rm_r(@save_path) @@ -205,7 +204,6 @@ # create catalog and save to specified path @opendss_catalog = URBANopt::RNM::ConversionToOpendssCatalog.new(@extended_catalog_path) @opendss_catalog.create_catalog(@save_path) - $stdout.puts "HI HI" expect(File.exist?(@save_path)).to be true end end From 8d9f08300711122120df7161a37f4e2f3ebaef6f Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Fri, 30 Sep 2022 13:40:43 -0600 Subject: [PATCH 14/62] update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5194d9a..2c8755e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Changelog ## Version 0.4.0 -Date Range 05/10/22 - present +Date Range 05/10/22 - 9/30/22 - Breaking changes to electrical catalog used and compatible RNM-US executable. - Update API to version 2. API v1 still working for older URBANopt SDK releases but no longer working for future versions. From d7921741317677534493b492335eb7746769c370 Mon Sep 17 00:00:00 2001 From: cmateo Date: Tue, 18 Oct 2022 15:50:46 +0200 Subject: [PATCH 15/62] validation module complete functionality D6.13 --- lib/urbanopt/rnm/api_client.rb | 4 +- .../rnm/validation/main_validation.py | 162 ++++-- .../rnm/validation/opendss_interface.py | 488 +++++++++++++++--- lib/urbanopt/rnm/validation/plot_lib.py | 456 ++++++++++++---- 4 files changed, 915 insertions(+), 195 deletions(-) diff --git a/lib/urbanopt/rnm/api_client.rb b/lib/urbanopt/rnm/api_client.rb index 01fe70f..efb39fd 100644 --- a/lib/urbanopt/rnm/api_client.rb +++ b/lib/urbanopt/rnm/api_client.rb @@ -61,9 +61,9 @@ def initialize(name, rnm_dir, use_localhost = false, reopt = false) @use_localhost = use_localhost if @use_localhost - @base_api = 'http://0.0.0.0:8080/api/v1/' + @base_api = 'http://0.0.0.0:8080/api/v2/' else - @base_api = 'https://rnm.urbanopt.net/api/v1/' + @base_api = 'https://rnm.urbanopt.net/api/v2/' end puts "Running RNM-US at #{@base_api}" diff --git a/lib/urbanopt/rnm/validation/main_validation.py b/lib/urbanopt/rnm/validation/main_validation.py index a20667b..da47500 100644 --- a/lib/urbanopt/rnm/validation/main_validation.py +++ b/lib/urbanopt/rnm/validation/main_validation.py @@ -7,45 +7,141 @@ import networkx as nx import opendss_interface import plot_lib +import report +import os class Validation: - def __init__(self, folder): - self.folder = folder - + def __init__(self, folder,b_numeric_ids): + """Initialices the folder variables""" + self.main_folder = folder #Main uppper level folder (needed to search for OpenDSS files) + self.folder=folder+'/Validation' #Folder where the Validation results are saved + self.b_numeric_ids=b_numeric_ids + self.mkdir(self.folder) #It creates the validation folder if it does not exist + + def mkdir(self,directory): + """Checkes whether the folder exists, if not it creates it""" + if (not os.path.exists(directory)): + os.mkdir(directory) + + def make_dirs(self): + """Creates all the subfolder, it they don't exist""" + path=self.folder+'/' + self.mkdir(path+'Voltage') + self.mkdir(path+'Voltage/CSV') + self.mkdir(path+'Voltage/Figures') + self.mkdir(path+'Unbalance') + self.mkdir(path+'Unbalance/CSV') + self.mkdir(path+'Unbalance/Figures') + self.mkdir(path+'Loading') + self.mkdir(path+'Loading/CSV') + self.mkdir(path+'Loading/Figures') + self.mkdir(path+'Losses') + self.mkdir(path+'Losses/CSV') + self.mkdir(path+'Losses/Figures') + self.mkdir(path+'Loads') + self.mkdir(path+'Loads/Figures') + self.mkdir(path+'Equipment') + self.mkdir(path+'Equipment/Figures') + self.mkdir(path+'Network') + self.mkdir(path+'Network/Figures') + self.mkdir(path+'Summary') + + def define_ranges(self): + """Defines the allowed ranges (to determine violations), the limits (to plot the lines in the plots), and the display ranges (for the axis in the figures)""" + #Voltages + v_range_voltage={} + v_range_voltage['allowed_range']=(0.95, 1.05) + v_range_voltage['limits']=[0.95, 1.05] + v_range_voltage['display_range']=(0.85, 1.15) + #Lodaing + v_range_loading={} + v_range_loading['allowed_range']=(0, 1) + v_range_loading['limits']=[1] + v_range_loading['display_range']=(0, 1.3) + #Unbalance + v_range_unbalance={} + v_range_unbalance['allowed_range']=(0,0.02) + v_range_unbalance['limits']=[0.02] + v_range_unbalance['display_range']=(0,0.021) + #Show all variables option + v_range_show_all={} + v_range_show_all['allowed_range']=() + v_range_show_all['limits']=[] + v_range_show_all['display_range']=() + + return v_range_voltage,v_range_loading,v_range_unbalance,v_range_show_all + + def main_validation(self): - master_file_full_path = folder + '/dss_files/' + 'Master.dss' - start_index = 0 - num_periods=12 - end_index = 8760 - v_range_voltage=(0.9, 1.1) - v_limits_voltage=[0.95,1.05] - v_range_loading=(0,1.3) - v_limits_loading=[1] - v_range_show_all=(0,0) + """Carries out the whole validation of the distribution system""" + #Path and file name + master_file_full_path = self.main_folder + '/dss_files/' + 'Master.dss' #Path for the Master file + start_index = 0 #Default initial index (needed to run OpenDSS) + num_periods=12 #Number of periods (12 month) + end_index = 8760 #Default final index, 1 year, 8760h (needed to run OpenDSS) - #For tests - #end_index = 24 - #v_range_voltage=(0.975, 1.025) + #Create sub-folders + self.make_dirs() + #Define the ranges of voltage, loading, unbalance and a default range to show all the values + v_range_voltage,v_range_loading,v_range_unbalance,v_range_show_all=self.define_ranges() - myopendss_io=opendss_interface.OpenDSS_Interface(folder) - v_dict_voltage,v_voltage_yearly,v_voltage_period,v_power_yearly,v_power_period,v_dict_loading,v_loading_yearly,v_loading_period,v_dict_losses,v_subs_losses_yearly,v_line_losses_yearly,dict_buses_element=myopendss_io.solve_powerflow_iteratively(num_periods,start_index,end_index,master_file_full_path,v_range_voltage,v_range_loading) - myopendss_io.write_dict(v_dict_voltage,v_range_show_all,'Voltages (p.u.)','Buses') - myopendss_io.write_dict(v_dict_voltage,v_range_voltage,'Voltage Violations (p.u.)','Buses') - myopendss_io.write_dict(v_dict_loading,v_range_show_all,'Loading (p.u.)','Branches') - myopendss_io.write_dict(v_dict_loading,v_range_loading,'Loading Violations (p.u.)','Branches') - myopendss_io.write_dict(v_dict_losses,v_range_show_all,'Losses','Branches') - edges=myopendss_io.get_edges() - myplot_lib=plot_lib.Plot_Lib(folder) - myplot_lib.plot_hist('Voltage',v_voltage_yearly,v_voltage_period,v_range_voltage,40,num_periods,v_limits_voltage) - myplot_lib.plot_hist('Loading',v_loading_yearly,v_loading_period,v_range_loading,80,num_periods,v_limits_loading) - myplot_lib.plot_losses(v_subs_losses_yearly,v_line_losses_yearly) - myplot_lib.plot_graph(edges,v_dict_voltage,v_range_voltage,v_dict_loading,v_range_loading,dict_buses_element) + #For tests + #end_index = 24 #Simulate few hours (still broken down in 12 periods) + #v_range_voltage['allowed_range']=(0.975, 1.025) #More stringent limmits than the standard ones to show violations + #v_range_loading['allowed_range']=(0,0.3) + #v_range_unbalance['allowed_range']=(0, 4e-5) + #v_range_unbalance['allowed_range']=(0, 2.1e-5) + #Run power flow iteratively and obtain the results + myopendss_io=opendss_interface.OpenDSS_Interface(folder,self.b_numeric_ids) + v_dict_buses_ids,v_dict_ids_buses,v_dict_voltage,v_voltage_yearly,v_voltage_period,v_power_yearly,v_power_period,v_dict_loading,v_loading_yearly,v_loading_period,v_dict_losses,v_subs_losses_yearly,v_line_losses_yearly,dict_buses_element,v_dict_loads,v_loads_kw_yearly,v_loads_kw_period,v_loads_kvar_yearly,v_loads_kvar_period,v_total_load_kw_yearly,v_total_load_kvar_yearly, v_loads_kw, v_loads_kvar, v_dict_unbalance,v_unbalance_yearly,v_unbalance_period,dict_lines,v_lines_norm_amps,dict_transformers,v_transformers_kva=myopendss_io.solve_powerflow_iteratively(num_periods,start_index,end_index,master_file_full_path,v_range_voltage,v_range_loading,v_range_unbalance) + #Save voltage, unbalance, loading and losses results in CSV files + myopendss_io.write_dict('Voltage/CSV',v_dict_voltage,v_range_show_all,'Voltages (p.u.)','Buses',v_dict_buses_ids) + myopendss_io.write_dict('Voltage/CSV',v_dict_voltage,v_range_voltage,'Voltage Violations (p.u.)','Buses',v_dict_buses_ids) + myopendss_io.write_dict('Unbalance/CSV',v_dict_unbalance,v_range_show_all,'Unbalance (p.u.)','Buses',v_dict_buses_ids) + myopendss_io.write_dict('Unbalance/CSV',v_dict_unbalance,v_range_unbalance,'Unbalance Violations (p.u.)','Buses',v_dict_buses_ids) + myopendss_io.write_dict('Loading/CSV',v_dict_loading,v_range_show_all,'Loading (p.u.)','Branches',None) + myopendss_io.write_dict('Loading/CSV',v_dict_loading,v_range_loading,'Loading Violations (p.u.)','Branches',None) + myopendss_io.write_dict('losses/CSV',v_dict_losses,v_range_show_all,'Losses','Branches',None) + if self.b_numeric_ids: + myopendss_io.write_id_dict('Network/Figures','IDs_Buses',v_dict_buses_ids) + #Get the edges of the network (for later making a hierarchical representation of the network) + closed_edges,open_edges=myopendss_io.get_edges(v_dict_buses_ids) + #Plot all the figures + myplot_lib=plot_lib.Plot_Lib(folder,self.b_numeric_ids) + #Voltage + myplot_lib.plot_hist('Voltage','Voltage (p.u.)',v_voltage_yearly,v_voltage_period,v_range_voltage,num_periods,40) + myplot_lib.plot_violin_monthly('Voltage/Figures','Voltage (p.u.)',v_voltage_yearly,v_voltage_period,v_range_voltage,num_periods) + #Unbalance + myplot_lib.plot_hist('Unbalance','Unbalance (p.u.)',v_unbalance_yearly,v_unbalance_period,v_range_unbalance,num_periods,40) + myplot_lib.plot_violin_monthly('Unbalance/Figures','Unbalance (p.u.)',v_unbalance_yearly,v_unbalance_period,v_range_unbalance,num_periods) + #Loading + myplot_lib.plot_hist('Loading','Loading (p.u.)',v_loading_yearly,v_loading_period,v_range_loading,num_periods,80) + myplot_lib.plot_violin_monthly('Loading/Figures','Loading (p.u.)',v_loading_yearly,v_loading_period,v_range_loading,num_periods) + #Loads and load shpaes + myplot_lib.plot_duration_curve('Loads/Figures',v_total_load_kw_yearly,v_total_load_kvar_yearly,False) + myplot_lib.plot_violin_monthly_two_vars('Loads/Figures','Loads',v_loads_kw_yearly,v_loads_kw_period,v_loads_kvar_yearly,v_loads_kvar_period,v_range_show_all,num_periods) + myplot_lib.plot_violin('Loads/Figures','Loads Peak (kW)',v_loads_kw,v_range_show_all) + #Losses + myplot_lib.plot_duration_curve('Losses/Figures',v_subs_losses_yearly,v_line_losses_yearly,True) + #Equipment parameters + myplot_lib.plot_violin('Equipment/Figures','Power Line - Normal Amps (A)',v_lines_norm_amps,v_range_show_all) + myplot_lib.plot_violin('Equipment/Figures','Transformer (kVA)',v_transformers_kva,v_range_show_all) + #Hierarchical representation of the network + myplot_lib.plot_graph('Network/Figures',closed_edges,open_edges,v_dict_voltage,v_range_voltage,v_dict_loading,v_range_loading,dict_buses_element,v_dict_buses_ids,v_dict_ids_buses) + #Summary operational report + myreport=report.Report(folder,self.b_numeric_ids) + myreport.write_summary_operational_report('Summary',v_dict_voltage,v_range_voltage,v_dict_unbalance,v_range_unbalance,v_dict_loading,v_range_loading,v_dict_loads) + +#def main_validation(folder): #Example: uncomment to make the script run from a function + #folder = './files/' if __name__ == "__main__": - #Example to run it in command window - #python main_validation.py files - folder = sys.argv[1] - valid=Validation(folder) - valid.main_validation() + """Runs direclty as a script if called from the command window""" + #Example of use: python main_validation.py files + folder = sys.argv[1] #Use the folder specified in the arguments + b_numeric_ids=True + valid=Validation(folder,b_numeric_ids) + valid.main_validation() #Call the main validation function + diff --git a/lib/urbanopt/rnm/validation/opendss_interface.py b/lib/urbanopt/rnm/validation/opendss_interface.py index 215548c..ba5009e 100644 --- a/lib/urbanopt/rnm/validation/opendss_interface.py +++ b/lib/urbanopt/rnm/validation/opendss_interface.py @@ -7,65 +7,290 @@ import networkx as nx class OpenDSS_Interface: - def __init__(self, folder): - self.folder = folder + def __init__(self, folder,b_numeric_ids): + """Initialices the folder variables""" + self.main_folder = folder + self.folder=folder+'/Validation' + self.b_numeric_ids=b_numeric_ids def remove_terminal(self,bus): + """Removes the terminal from the bus name""" if isinstance(bus,str): - return bus.split('.')[0] + return bus.split('.')[0] #(everything to the right of point ".") else: return bus + def is_to_be_analyzed(self,name): + """Determines if an element has to be analyzed""" + b_analyzed=False + if name.startswith('Line.padswitch'): #RNM specific #We only condider power lines and tarnsformers as branches + b_analyzed=False + elif name.startswith('Line.breaker'): #RNM specific + b_analyzed=False + elif name.startswith('Line.fuse'): #RNM specific + b_analyzed=False + elif name.startswith('Capacitor'): + b_analyzed=False + elif name.startswith('Line.l'): #RNM specific + b_analyzed=True + elif name.startswith('Transformer'): + b_analyzed=True + else: + print("Component type was not explicitly consiered in the validation module. It is not analyzed.") + print(name) + return b_analyzed + + def extract_period(self,v_value_i,v_value_period,i,end_index,num_periods): + """Extracts period "i" out of "num_periods" from the whole gieve series (v_value_i)""" + #It is assumes all the periods have the same length for j in range(num_periods): - if (i<=end_index*j/num_periods): + if (i<=end_index*(j+1)/num_periods): v_value_period[j].extend(v_value_i) break return v_value_period - def add_to_dictionary(self,v_dict_voltage,dict_voltage_i): - for idx,name in enumerate(dict_voltage_i): - if name in v_dict_voltage: #if not empty - v_dict_voltage[name].append(dict_voltage_i[name]) + def add_to_dictionary(self,dict_all,dict_i): + """Adds dict_i to the dictonary dict_all""" + for idx,name in enumerate(dict_i): + if name in dict_all: #if not empty + dict_all[name].append(dict_i[name]) else: - v_dict_voltage[name]=[dict_voltage_i[name]] + dict_all[name]=[dict_i[name]] def dss_run_command(self,command): + """Runs an OpenDSS Direct command""" + #Run command output=dss.run_command(command) + #If it has any output, print it if (len(output)>0): print(output) def get_all_voltage(self): """Computes over and under voltages for all buses""" + #Get bus names bus_names = dss.Circuit.AllBusNames() + #Init variables dict_voltage = {} v_voltage = [0 for _ in range(len(bus_names))] + #For each bus for idx,b in enumerate(bus_names): + #Set it as active bus dss.Circuit.SetActiveBus(b) + #Get voltage and angle vang = dss.Bus.puVmagAngle() + #Get voltage magnitude if len(vang[::2]) > 0: - vmag = sum(vang[::2])/(len(vang)/2) + #Average of the voltages in all the phases, discarding the angles + vmag = sum(vang[::2])/(len(vang)/2) else: vmag = 0 + #Add voltage magnitude to dictionary and to list of voltages dict_voltage[b] = vmag v_voltage[idx]=vmag return dict_voltage,v_voltage + + def get_all_unbalance(self): + """Computes voltage unbalance for all buses""" + # Based on IEEE standard 141-1993 https://www.sciencedirect.com/science/article/pii/S0378779620304594 + #Get bus names + bus_names = dss.Circuit.AllBusNames() + #Init variables + dict_voltage = {} + v_voltage = [0 for _ in range(len(bus_names))] + #For each bus + for idx,b in enumerate(bus_names): + dss.Circuit.SetActiveBus(b) + #Set it as active bus + #Get voltage and angle + vang = dss.Bus.puVmagAngle() + #Evaluate the unbalance + if len(vang[::2]) ==3: #if three-phase + vmedio = sum(vang[::2])/(len(vang)/2) #Average of the voltages in all the phases, discarding the angles + va=vang[0] #Phase A + vb=vang[2] #Phase B + vc=vang[4] #Phase C + vmax=max(abs(va-vmedio),abs(vb-vmedio),abs(vc-vmedio)) #Phase Voltage Unbalance Rate (PVUR) (based on IEEE) + elif len(vang[::2]) ==2: #If two phase + vmedio = sum(vang[::2])/(len(vang)/2) #Average of the voltages in all the phases, discarding the angles + va=vang[0] #Phase A + vb=vang[2] #Phase B + vmax=max(abs(va-vmedio),abs(vb-vmedio)) #Phase Voltage Unbalance Rate (PVUR) + elif len(vang[::2]) ==1: #If single-phase + vmax = 0 #No unblance + else: #Not other cases are considered + print("Value: "+str(vang)+"Lend: "+str(len(vang))) + raise Exception("Voltage is not single-, two- or three-phase") + #Add unbalance to dictionary and to list of unbalances + dict_voltage[b] = vmax + v_voltage[idx]=vmax + return dict_voltage,v_voltage + + + def get_all_loads(self): + """Get all loads peak kW and kVAr""" + #Init variables + dict_loads = {} + myrange=range(0,dss.Loads.Count()) + v_loads_kw = [0 for _ in myrange] + v_loads_kvar = [0 for _ in myrange] + #For each load + for idx in myrange: + #Set load index + dss.Loads.Idx(idx+1) + #Get kW of the load + kw = dss.Loads.kW() + #Get kVAr of the load + kvar = dss.Loads.kvar() + #Get load name + name = 'LOAD.'+dss.Loads.Name() + #Add load to dictionary and to list of load kW/kVAr + dict_loads[name] = kw + v_loads_kw[idx]=kw + v_loads_kvar[idx]=kvar + return dict_loads,v_loads_kw,v_loads_kvar + + def get_all_loadshapes(self,i): + """Get all loadshapes""" + dict_loads = {} + #Init variables + myrange=range(0,dss.LoadShape.Count()) + v_loads_kw = [0 for _ in myrange] + v_loads_kvar = [0 for _ in myrange] + #For each loadshape + for idx in myrange: + #Set loadshape index + dss.LoadShape.Idx(idx+1) + #Get hourly kW + kw = dss.LoadShape.PMult() + #Get hourly kVAr + kvar = dss.LoadShape.QMult() + #Get load name + name = 'LOAD.'+dss.LoadShape.Name() + #If not default load (discard it) + if not(name=='LOAD.default'): + if len(kw)>1: + #Add load to dictionary and to list of load kW + dict_loads[name] = kw[i] + v_loads_kw[idx]=kw[i] + if len(kvar)>1: + #Add to list of load kW + v_loads_kvar[idx]=kvar[i] + + return dict_loads,v_loads_kw,v_loads_kvar + + + def get_all_buses_loads(self,i): + """Get the load of all the buses""" + #Get data from load shapes + dict_loads,v_loads_kw,v_loads_kvar=self.get_all_loadshapes(i) + #Get all bus names + bus_names = dss.Circuit.AllBusNames() + #Init dict + dict_buses_loads = {} + #For each bus + for idx,b in enumerate(bus_names): + #Set it to the active bus + dss.Circuit.SetActiveBus(b) + #Get its loads + loads = dss.Bus.LoadList() + #Init its load to zero + load_bus=0 + #For each load in the bus + for l in loads: + #Assign it the load in the loadshape + load_bus=load_bus+dict_loads[l+"_profile"] #RNM-US specific (the load shapes names are the name of the laods + "_profile") + #Add to dictionary + dict_buses_loads[b] = load_bus + return dict_buses_loads,v_loads_kw,v_loads_kvar + + + def get_all_buses_ids(self): + """Get the load of all the buses""" + #Get all bus names + bus_names = dss.Circuit.AllBusNames() + #Init dict + dict_buses_ids = {} + dict_ids_buses = {} + #Init numeric identifier + num_id=1 + #For each bus + for idx,b in enumerate(bus_names): + if b=='st_mat': #RNM-US specific (st_mat is the slack bus) + dict_buses_ids[b] = str(0) + dict_ids_buses[str(0)] = b + else: + dict_buses_ids[b] = str(num_id) + dict_ids_buses[str(num_id)] = b + num_id=num_id+1 + return dict_buses_ids,dict_ids_buses + + def get_all_lines(self): + """Gets the normal ampacity of power lines""" + #Init variables + dict_lines = {} + myrange=range(0,dss.Lines.Count()) + v_lines_norm_amps = [] + #For each power line + for idx in myrange: + #Set power line index + dss.Lines.Idx(idx+1) + #Get the normal amapcity + normal_amps = dss.Lines.NormAmps() + #Get the power line name + name = 'Line.'+dss.Lines.Name() + #If it is a power line + if name.startswith("Line.l("): #RNM-US specific (all power lines start with "Line.l("). This discards for example fuses, switches, .... + #Add to dictionary and to list + dict_lines[name] = normal_amps + v_lines_norm_amps.append(normal_amps) + + return dict_lines,v_lines_norm_amps + + def get_all_transformers(self): + """Gets the size of transformers""" + #Init variables + dict_transformers = {} + myrange=range(0,dss.Transformers.Count()) + v_transformers_kva = [] + #For each transformer + for idx in myrange: + #Set the transformer index + dss.Transformers.Idx(idx+1) + #Get the transformer size in kVA + kva = dss.Transformers.kVA() + #Get the transformer size + name = 'Transformer.'+dss.Transformers.Name() + #If it is a distribution transformer + if name.startswith("Transformer.tr("): #Distribution transformer, RNM-US specific (all distribution transformers start with "Transformer.tr("). This discards for example transformers in primary substations + #Add to dictionary and to list + dict_transformers[name] = kva + v_transformers_kva.append(kva) + return dict_transformers,v_transformers_kva + + def get_all_power(self): - """Computes power in all circuits""" + """Computes power in all circuits (not used, loading is measured instead)""" + #Get all element names circuit_names = dss.Circuit.AllElementNames() + #Init variables dict_power = {} v_power = [0 for _ in range(len(circuit_names))] + #For each circuit for idx,b in enumerate(circuit_names): + #Set the active element dss.Circuit.SetActiveElement(b) + #Calculates the power through the circuit power = dss.CktElement.Powers() if len(power[::2]) > 0: poweravg = sum(power[::2])/(len(power)/2) else: poweravg = 0 + #Add to dictionary and to list dict_power[b] = poweravg v_power[idx]=poweravg @@ -74,66 +299,77 @@ def get_all_power(self): def get_all_loading(self): """Computes loading in all circuits""" + #Get all element names circuit_names = dss.Circuit.AllElementNames() + #Init variables dict_loading = {} dict_buses_element={} #Associate the element to the buses (this has the inconvenient that only associates one element to each pair of buses) v_loading = [0 for _ in range(len(circuit_names))] + #For each circuit for idx,element in enumerate(circuit_names): + #Set the active element dss.Circuit.SetActiveElement(element) - #only if it is a branch (two buses) + #Get the buses in the elment buses = dss.CktElement.BusNames() + #Evaluate only if it is a branch (two buses) if (len(buses)>=2): + #Obtain the current through the element current = dss.CktElement.CurrentsMagAng() + #Obtain the number of terminals num_terminals=dss.CktElement.NumTerminals() - if len(current[::2]) > 0: - #currentmag = sum(current[::2])/len(current[::2]) - #Take only the average of 1 terminal (discarding phases so every 2) - lenc=len(current[::2]) - stop=round(2*lenc/num_terminals) - #print(current[:stop:2]) - currentmag = sum(current[:stop:2])/lenc - else: - currentmag = 0 + #Obtain the current magnitude (first terminal only, because in transformers NormalAmps gives the normal ampacity of the first winding) (to compare the same magnitudes) currentmag = current[0] + #Obtain the normal amapcity nominal_current = dss.CktElement.NormalAmps() #Transformers have applied a 1.1 factor in the calculation of NormalAmps #See library that OpenDSSdirect uses in https://github.com/dss-extensions/dss_capi/blob/master/src/PDElements/Transformer.pas - #in particular line code AmpRatings[i] := 1.1 * kVARatings[i] / Fnphases / Vfactor; + #in particular line code: AmpRatings[i] := 1.1 * kVARatings[i] / Fnphases / Vfactor; + #Remove (do not use) the 1.1 margin set in the library to the nominal current if (element.startswith("Transformer")): - nominal_current=nominal_current/1.1 - if (nominal_current>0): + nominal_current=nominal_current/1.1 + #If the element is to be analyzed and has a nominal current (this discards vsources) + if (nominal_current>0 and self.is_to_be_analyzed(element)): + #Add to dictionaries and to vector dict_loading[element] = currentmag/nominal_current v_loading[idx]=currentmag/nominal_current bus1to2=self.remove_terminal(buses[0])+'-->'+self.remove_terminal(buses[1]) dict_buses_element[bus1to2]=element - return dict_loading,v_loading,dict_buses_element def get_all_losses(self): """Computes losses in all circuits""" + #Get all element names circuit_names = dss.Circuit.AllElementNames() + #Init variables dict_losses = {} v_losses = [0 for _ in range(len(circuit_names))] total_losses=0 + #For each element for idx,element in enumerate(circuit_names): + #Set it as active element dss.Circuit.SetActiveElement(element) - #only if it is a branch (two buses) + #Get buses names in element buses = dss.CktElement.BusNames() + #only if it is a branch (two buses) if (len(buses)>=2): - #next if check discards vsources + #Get nominal current nominal_current = dss.CktElement.NormalAmps() + #If it has nominal current (this discards vsources) if (nominal_current>0): + #Get hte losses losses = dss.CktElement.Losses() if len(losses) ==2: - lossesavg = (losses[0]) #Verify this is correct, if not abs() they range from + to -, [0] to take active losses + lossesavg = (losses[0]) #[0] to take active losses else: - print("error - not correctly reading losses") + print("Error - not correctly reading losses") lossesavg=0 - #Convert to kW. This function is the exeption that return losses in W + #Convert to kW (becase CktElement.Losses is the exeption that return losses in W) lossesavg=lossesavg/1000 - dict_losses[element] = lossesavg - v_losses[idx]=lossesavg - + #If element is to be analized + if self.is_to_be_analyzed(element): + #Add to dictionary an to list + dict_losses[element] = lossesavg + v_losses[idx]=lossesavg return dict_losses,total_losses def get_total_subs_losses(self): @@ -141,72 +377,168 @@ def get_total_subs_losses(self): return dss.Circuit.SubstationLosses()[0] #Real part def get_total_line_losses(self): - """Computes total line losses""" + """Computes total power line losses""" return dss.Circuit.LineLosses()[0] #Real part - def get_edges(self): - edges=[] + def get_edges(self,v_dict_buses_ids): + """Gets the edges of the distribution system (to obtain the graph of the network)""" + #Get all element names circuit_names = dss.Circuit.AllElementNames() + #Init variable + closed_edges=[] + open_edges=[] + #For all elements for idx,element in enumerate(circuit_names): + #Set it as active element dss.Circuit.SetActiveElement(element) + #Get the bus names buses = dss.CktElement.BusNames() #Only if it is a branch if (len(buses)>=2): #There can be 3 buses in single-phase center-tap transformer, in this case the two last ones are equals (different terminals only) and we can take just the 2 first ones - #remove terminal from the bus name (everything to the right of point) - edges.append([(self.remove_terminal(buses[0]),self.remove_terminal(buses[1]))]) - return edges + #Avoid cases bus1=bus2 (after removing terminals) + if (self.remove_terminal(buses[0])!=self.remove_terminal(buses[1])): + #Identify if enabled #RNM-US specific (open loops are modelled with enabled=n) + b_enabled=dss.CktElement.Enabled() + #if Enabled (i.e. it it is closed) + if (b_enabled): + #Add to edges + #remove terminal from the bus name (everything to the right of point) + #closed_edges.append([(self.remove_terminal(buses[0]),self.remove_terminal(buses[1]))]) + if (self.b_numeric_ids): + closed_edges.append((v_dict_buses_ids[self.remove_terminal(buses[0])],v_dict_buses_ids[self.remove_terminal(buses[1])])) + else: + closed_edges.append((self.remove_terminal(buses[0]),self.remove_terminal(buses[1]))) + elif (not b_enabled): #if not Enabled (i.e. it it is open) + #open_edges.append([(self.remove_terminal(buses[0]),self.remove_terminal(buses[1]))]) + if (self.b_numeric_ids): + open_edges.append((v_dict_buses_ids[self.remove_terminal(buses[0])],v_dict_buses_ids[self.remove_terminal(buses[1])])) + else: + open_edges.append((self.remove_terminal(buses[0]),self.remove_terminal(buses[1]))) + return closed_edges,open_edges + + - def write_dict(self,v_dict,v_range,type,component): - output_file_full_path = self.folder + '/' + type + '_' + component + '.csv' + def is_violation(self,value,v_range): + """Obtain number of violations (hours) of a bus""" + #Init to zero + num=0 + #If out of range + if value=v_range['allowed_range'][1]: + num=1 #Number of violations=1 + else: #Else + num=0 #Number of violations=0 + return num + + + + def get_num_violations(self,v_value,v_range,name,dict_loads): + """"Obtain number of violations (hours) of a bus""" + #Init to zero + num_violations=0 + #For each value + for idx2,value in enumerate(v_value): + #If no dict of loads, add 1 if there is a violation in that value (if it is outside of the allowed range) + if (dict_loads is None): + num_violations=num_violations+self.is_violation(value,v_range) + #If there is a dict of loads + elif (name in dict_loads): + if (dict_loads[name][idx2]>0): #only compute if there is load + #If there is a vioaltion, add the load (to compute the energy delivered with violations) + num_violations=num_violations+self.is_violation(value,v_range)*dict_loads[name][idx2] + return num_violations + + + def write_dict(self,subfolder,v_dict,v_range,type,component,v_dict_buses_ids): + """Writes the dictionary to a file""" + #Path and file name + output_file_full_path = self.folder + '/' + subfolder + '/' + type + '_' + component + '.csv' # Write directly as a CSV file with headers on first line with open(output_file_full_path, 'w') as fp: - #Header: ID, hours (consider adding day, month in future) + #Header: ID, hours for idx,name in enumerate(v_dict): - fp.write('Hour,'+','.join(str(idx2) for idx2,value in enumerate(v_dict[name])) + '\n') + if (self.b_numeric_ids): + fp.write('Num. ID,bus/'+'Hour,'+','.join(str(idx2) for idx2,value in enumerate(v_dict[name])) + '\n') + else: + fp.write('Hour,'+','.join(str(idx2) for idx2,value in enumerate(v_dict[name])) + '\n') break #Write matrix for idx,name in enumerate(v_dict): - #Truncate list to limits + #Init list truncated_values=[] - for idx2,value in enumerate(v_dict[name]): - if value=v_range[1]: - truncated_values.append(str(value)) - else: - truncated_values.append("") - fp.write(name+','+','.join(truncated_values)+'\n') - #truncated_values=[i for i, lower, upper in zip(v_dict_voltage[name], [v_range_voltage[1]]*len(v_dict_voltage[name]), [v_range_voltage[1]]*len(v_dict_voltage[name])) if i upper] - #fp.write(name+','+','.join(map(str,v_dict_voltage[name]))+'\n') + #For each one + for idx2,value in enumerate(v_dict[name]): + #if it is outsie of the allowed range + if not(v_range['allowed_range']) or value=v_range['allowed_range'][1]: + truncated_values.append("{:.7f}".format(value)) #Add the value + else: #else + truncated_values.append("") #Fill with an empty variable + #Write to file + if v_dict_buses_ids is None or not self.b_numeric_ids: + fp.write(name+','+','.join(truncated_values)+'\n') + else: + fp.write(str(v_dict_buses_ids[name])+','+name+','+','.join(truncated_values)+'\n') + + + def write_id_dict(self,subfolder,type,v_dict_buses_ids): + """Writes the dictionary to a file""" + #Path and file name + output_file_full_path = self.folder + '/' + subfolder + '/' + type + '.csv' + # Write directly as a CSV file with headers on first line + with open(output_file_full_path, 'w') as fp: + #Header: ID, bus + fp.write('Num. ID,bus' + '\n') + for idx,name in enumerate(v_dict_buses_ids): + fp.write(str(v_dict_buses_ids[name])+','+name+'\n') - def solve_powerflow_iteratively(self,num_periods,start_index,end_index,location,v_range_voltage,v_range_loading): - #Por flow solving mode + def solve_powerflow_iteratively(self,num_periods,start_index,end_index,location,v_range_voltage,v_range_loading,v_range_unbalance): + """Solves the power flow iteratively""" + #Por flow solving mode (hourly) self.dss_run_command("Clear") self.dss_run_command('Redirect '+location) self.dss_run_command("solve mode = snap") self.dss_run_command("Set mode=yearly stepsize=1h number=1") #Init vectors - v_voltage_yearly=[] - v_voltage_period=[[] for _ in range(num_periods)] - v_power_yearly=[] - v_power_period=[[] for _ in range(num_periods)] - v_loading_yearly=[] - v_loading_period=[[] for _ in range(num_periods)] - v_subs_losses_yearly=[] - v_line_losses_yearly=[] - v_dict_voltage={} - v_dict_loading={} - v_dict_losses={} + v_voltage_yearly=[] #Yearly votlage + v_voltage_period=[[] for _ in range(num_periods)] #Montly voltage + v_unbalance_yearly=[] #Yearly unbalance + v_unbalance_period=[[] for _ in range(num_periods)] #Monthly unbalance + v_power_yearly=[] #Yearly power + v_power_period=[[] for _ in range(num_periods)] #Montly pwoer + v_loading_yearly=[] #Yearly loading + v_loading_period=[[] for _ in range(num_periods)] #Montly loading + v_subs_losses_yearly=[] #Yearly substation losses + v_line_losses_yearly=[] #Yearly power line losses + v_loads_kw_yearly=[] #Yearly kW of loads (for violing plots) + v_loads_kw_period=[[] for _ in range(num_periods)] #Montly kW of loads (for violing plots) + v_loads_kvar_yearly=[] #Yearly kVAr of loads (for violing plots) + v_loads_kvar_period=[[] for _ in range(num_periods)]#Montly kVAr of loads (for violing plots) + v_total_load_kw_yearly=[] #Yearly total kW of loads (for duration curve) + v_total_load_kvar_yearly=[] #Yearly total kVAr of loads (for duration curve) + v_dict_voltage={} #Dict of voltages + v_dict_unbalance={} #Dict of unbalances + v_dict_loading={} #Dict of loading + v_dict_losses={} #Dict of losses + v_dict_loads={} #Dict of loads #Additional initializations - my_range=range(start_index,end_index,1) + my_range=range(start_index,end_index,1) #Full year old_percentage_str="" #Variable for tracking progress + #Get buses ids + v_dict_buses_ids,v_dict_ids_buses=self.get_all_buses_ids() + #For each hour for i in my_range: - #Solve power flow + #Solve power flow in that hour self.dss_run_command("Solve") #Get voltages dict_voltage_i, v_voltage_i = self.get_all_voltage() self.add_to_dictionary(v_dict_voltage,dict_voltage_i) v_voltage_yearly.extend(v_voltage_i) - self.extract_period(v_voltage_i,v_voltage_period,i,end_index,num_periods) + v_voltage_period=self.extract_period(v_voltage_i,v_voltage_period,i,end_index,num_periods) + #Get voltage unbalance + dict_unbalance_i, v_unbalance_i = self.get_all_unbalance() + self.add_to_dictionary(v_dict_unbalance,dict_unbalance_i) + v_unbalance_yearly.extend(v_unbalance_i) + v_unbalance_period=self.extract_period(v_unbalance_i,v_unbalance_period,i,end_index,num_periods) #Get power dict_power_i, v_power_i = self.get_all_power() v_power_yearly.extend(v_power_i) @@ -224,11 +556,27 @@ def solve_powerflow_iteratively(self,num_periods,start_index,end_index,location, v_subs_losses_yearly.append(subs_losses_i) line_losses_i = self.get_total_line_losses() v_line_losses_yearly.append(line_losses_i) - #Print progress + #Get loads shapes + dict_loads_i, v_loads_kw_i, v_loads_kvar_i= self.get_all_buses_loads(i) + self.add_to_dictionary(v_dict_loads,dict_loads_i) + v_loads_kw_yearly.extend(v_loads_kw_i) + v_loads_kw_period=self.extract_period(v_loads_kw_i,v_loads_kw_period,i,end_index,num_periods) + v_loads_kvar_yearly.extend(v_loads_kvar_i) + v_loads_kvar_period=self.extract_period(v_loads_kvar_i,v_loads_kvar_period,i,end_index,num_periods) + #Get total peak load + v_total_load_kw_yearly.append(sum(v_loads_kw_i)) + v_total_load_kvar_yearly.append(sum(v_loads_kvar_i)) + #Print progress (disabled because the Ruby gem does not output the print messages) #percentage_str="{:.0f}".format(100*i/end_index)+"%" #if (percentage_str!=old_percentage_str): # print(percentage_str) #old_percentage_str=percentage_str - return v_dict_voltage,v_voltage_yearly,v_voltage_period,v_power_yearly,v_power_period,v_dict_loading,v_loading_yearly,v_loading_period,v_dict_losses,v_subs_losses_yearly,v_line_losses_yearly,dict_buses_element + #Get loads shapes + dict_loads, v_loads_kw, v_loads_kvar= self.get_all_buses_loads(i) + #Get lines normal amps + dict_lines,v_lines_norm_amps=self.get_all_lines() + #Get transformers size + dict_transformers,v_transformers_kva=self.get_all_transformers() + return v_dict_buses_ids,v_dict_ids_buses,v_dict_voltage,v_voltage_yearly,v_voltage_period,v_power_yearly,v_power_period,v_dict_loading,v_loading_yearly,v_loading_period,v_dict_losses,v_subs_losses_yearly,v_line_losses_yearly,dict_buses_element,v_dict_loads,v_loads_kw_yearly,v_loads_kw_period,v_loads_kvar_yearly,v_loads_kvar_period,v_total_load_kw_yearly,v_total_load_kvar_yearly, v_loads_kw, v_loads_kvar,v_dict_unbalance,v_unbalance_yearly,v_unbalance_period,dict_lines,v_lines_norm_amps,dict_transformers,v_transformers_kva diff --git a/lib/urbanopt/rnm/validation/plot_lib.py b/lib/urbanopt/rnm/validation/plot_lib.py index b50bbdb..8660da1 100644 --- a/lib/urbanopt/rnm/validation/plot_lib.py +++ b/lib/urbanopt/rnm/validation/plot_lib.py @@ -1,84 +1,284 @@ import opendssdirect as dss import pandas as pd +#import matplotlib import matplotlib.pyplot as plt import numpy as np import sys as sys import math import networkx as nx import opendss_interface +import seaborn as sns +import plotly.graph_objects as go +from shapely.geometry import LineString +from shapely.geometry import Point +import geopandas as gpd + class Plot_Lib: - def __init__(self, folder): - self.folder = folder + def __init__(self, folder,b_numeric_ids): + """Initialices the folder variables""" + self.main_folder = folder + self.folder=folder+'/Validation' + self.b_numeric_ids=b_numeric_ids def remove_terminal(self,bus): - myopendss_io=opendss_interface.OpenDSS_Interface(self.folder) + """Removes the terminal from the bus name""" + myopendss_io=opendss_interface.OpenDSS_Interface(self.folder,self.b_numeric_ids) bus=myopendss_io.remove_terminal(bus) return bus - def plot_hist(self,type,v_value,v_value_period,v_range,num_bins,num_periods,v_limits): - output_file_full_path_fig = self.folder + '/' + type + ' Histogram (p.u.).png' - output_file_full_path_csv = self.folder + '/' + type + ' Histogram (p.u.).csv' - plt.figure + def plot_hist(self,subfolder,type,v_value,v_value_period,v_range,num_periods,num_bins): + """Plots an histogram""" + #Path and file name + output_file_full_path_fig = self.folder + '/' + subfolder + '/Figures/' + type + ' Histogram (p.u.).png' + output_file_full_path_csv = self.folder + '/' + subfolder + '/CSV/' + type + ' Histogram (p.u.).csv' + #New figure + #plt.figure + plt.clf() + #Activate figure grid plt.grid(True) + #Init variables v_legend=["" for _ in range(num_periods+2)] matrix=np.empty((num_bins,num_periods+2)) #Matrix for writting to file (index+periods+yearly) + #For each month for j in range(num_periods): - plt.xlim(v_range) + #Set xlim + if v_range['display_range']: + plt.xlim(v_range['display_range']) + #Set the weight variable v_weights = np.ones_like(v_value_period[j]) / len(v_value_period[j]) - counts, bins = np.histogram(v_value_period[j], range=v_range, bins=num_bins, weights=v_weights) + #Calculate the histogram of each month + counts, bins = np.histogram(v_value_period[j], range=v_range['display_range'], bins=num_bins, weights=v_weights) + #Update matrix and legend + #If first iteration if j==0: - v_legend[0]=type matrix[:,0]=bins[:num_bins:] + v_legend[0]=type + #In subsequent iterations matrix[:,j+1]=counts v_legend[j+1]= "M"+str(j+1) + #Plot the month plt.plot(bins[:-1]+(bins[1]-bins[0])*0.5, counts) - + #Set the weight variable v_weights = np.ones_like(v_value) / len(v_value) - counts, bins = np.histogram(v_value, range=v_range, bins=num_bins, weights=v_weights) + #Calculate the yearly histogram + counts, bins = np.histogram(v_value, range=v_range['display_range'], bins=num_bins, weights=v_weights) + #Update matrix and legend matrix[:,num_periods+1]=counts v_legend[num_periods+1]='Yearly' + #Plot histogram plt.hist(bins[:-1], bins, weights=counts) + #Plot legend plt.legend(v_legend[1:num_periods+2:]) #Write line with the limits - for j in range(len(v_limits)): - h = plt.axvline(v_limits[j], color='r', linestyle='--') - #plt.text(0.76, 120000, '1,596 buses out of limits ', fontsize = 10) - plt.xlabel(type+' (p.u.)') + for j in range(len(v_range['limits'])): + h = plt.axvline(v_range['limits'][j], color='r', linestyle='--') + #x,y lables + plt.xlabel(type) plt.ylabel('Frequency (p.u.)') - plt.savefig(output_file_full_path_fig, dpi=300) - plt.show() #Save to file + plt.savefig(output_file_full_path_fig, dpi=300) + #Display + #plt.show() + #Save data to file # Write directly as a CSV file with headers on first line with open(output_file_full_path_csv, 'w') as fp: fp.write(','.join(v_legend) + '\n') - np.savetxt(fp, matrix, '%s', ',') - #Deprecated with dataframes - #pd_values = pd.DataFrame(matrix,index=bins) - #pd_values.to_csv(output_file_full_path) - - - def plot_losses(self,v_subs_losses_yearly,v_line_losses_yearly): - output_file_full_path_fig = self.folder + '/' + 'Losses' + '.png' - plt.figure - plt.plot(sorted(v_subs_losses_yearly,reverse=True)) - plt.plot(sorted(v_line_losses_yearly,reverse=True)) - plt.plot(sorted(np.add(v_subs_losses_yearly,v_line_losses_yearly),reverse=True)) - plt.legend(['Substation losses','Line losses','Total losses']) + np.savetxt(fp, matrix, '%.7f', ',') + + def plot_violin(self,subfolder,type,v_value,v_range): + """Make a figure with a violin plot""" + #Path and file name + output_file_full_path_fig = self.folder + '/' + subfolder + '/' + type + ' Violin Plot.png' + #New figure + #plt.figure + plt.clf() + #Write line with the limits + for j in range(len(v_range['limits'])): + h = plt.axhline(v_range['limits'][j], color='r', linestyle='--') + #Plot violtin + sns.violinplot(y=v_value, cut=0, color='orange') + #Strip plot (display points) + sns.stripplot(y=v_value, color='blue') + #y label + plt.ylabel(type) + #y limit + if v_range['display_range']: + plt.ylim(v_range['display_range']) + #Save figure to file + plt.savefig(output_file_full_path_fig, dpi=300) + #Display + #plt.show() + + def plot_violin_two_vars(self,subfolder, type,v_value1,v_value2,v_range): + """Make a figure with a violin plot of two variables (kW/kVAr)""" + #Path and file name + output_file_full_path_fig = self.folder + '/' + subfolder + '/' + type + ' Violin Plot.png' + #New figure + #plt.figure + plt.clf() + #Init variables + v_data=[] + v_type=[] + #Write line with the limits + for j in range(len(v_range['limits'])): + h = plt.axhline(v_range['limits'][j], color='r', linestyle='--') + #Extend lists for yearly var1 + l_type=['kW' for _ in v_value1] + v_data.extend(v_value1) + v_type.extend(l_type) + #Extend lists for yearly var2 + l_type=['kVAr' for _ in v_value2] + v_data.extend(v_value2) + v_type.extend(l_type) + #Display violin plot + sns.violinplot(y=v_data, hue=v_type, cut=0, split=True, palette = {'kW':'blue','kVAr':'orange'}) + #Set y label + plt.ylabel(type) + #Set y limit + if v_range['display_range']: + plt.ylim(v_range['display_range']) + #Save figure to file + plt.savefig(output_file_full_path_fig, dpi=300) + #Display + #plt.show() + + + def plot_violin_monthly(self,subfolder, type,v_value,v_value_period,v_range,num_periods): + """Make a violin plot with the monthly variation""" + #Path and file name + output_file_full_path_fig = self.folder + '/' + subfolder + '/' + type + ' Violin Plot.png' + #New figure + #plt.figure + plt.clf() + #Init variables + v_data=[] + v_month=[] + v_yearly=[] + #Write line with the limits + for j in range(len(v_range['limits'])): + h = plt.axhline(v_range['limits'][j], color='r', linestyle='--') + #For each month + for j in range(num_periods): + #Extend lists for monthly + l_month=["M"+str(j+1) for _ in v_value_period[j]] + l_yearly=['Monthly' for _ in v_value_period[j]] + v_data.extend(v_value_period[j]) + v_month.extend(l_month) + v_yearly.extend(l_yearly) + #Extend lists for yearly + l_month=["M"+str(j+1) for _ in v_value] + l_yearly=['Yearly' for _ in v_value] + v_data.extend(v_value) + v_month.extend(l_month) + v_yearly.extend(l_yearly) + #Display violin plot + sns.violinplot(x=v_month, y=v_data, hue=v_yearly, cut=0, split=True) + #Set y label + plt.ylabel(type) + #Set y limit + if v_range['display_range']: + plt.ylim(v_range['display_range']) + #Save figure to file + plt.savefig(output_file_full_path_fig, dpi=300) + #Display + #plt.show() + + def plot_violin_monthly_two_vars(self,subfolder, type,v_value1,v_value1_period,v_value2,v_value2_period,v_range,num_periods): + """Make a violin plot for two variables (kW/kVAr) with the monthly variation""" + #Path and file name + output_file_full_path_fig = self.folder + '/' + subfolder + '/' + type + ' Violin Plot.png' + #New figure + #plt.figure + plt.clf() + #Init variables + v_data=[] + v_month=[] + v_type=[] + for j in range(num_periods): + #Extend lists for monthly var1 + l_month=["M"+str(j+1) for _ in v_value1_period[j]] + l_type=['kW' for _ in v_value1_period[j]] + v_data.extend(v_value1_period[j]) + v_month.extend(l_month) + v_type.extend(l_type) + #Extend lists for monthly var2 + l_month=["M"+str(j+1) for _ in v_value2_period[j]] + l_type=['kVAr' for _ in v_value2_period[j]] + v_data.extend(v_value2_period[j]) + v_month.extend(l_month) + v_type.extend(l_type) + #Extend lists for yearly var1 + l_month=['Yearly' for _ in v_value1] + l_type=['kW' for _ in v_value1] + v_data.extend(v_value1) + v_month.extend(l_month) + v_type.extend(l_type) + #Extend lists for yearly var2 + l_month=['Yearly' for _ in v_value2] + l_type=['kVAr' for _ in v_value2] + v_data.extend(v_value2) + v_month.extend(l_month) + v_type.extend(l_type) + #Show violin plot + sns.violinplot(x=v_month, y=v_data, hue=v_type, cut=0, split=True) + #Show stripplot (points) (disabled because there are too many points) + #sns.stripplot(x=v_month, y=v_data, hue=v_type, color="k", alpha=0.8) + #Set x,y lables + plt.xlabel('Month') + plt.ylabel(type) + #Set y limit + if v_range['display_range']: + plt.ylim(v_range['display_range']) + #Save figure to file + plt.savefig(output_file_full_path_fig, dpi=300) + #Display + #plt.show() + + def plot_duration_curve(self,subfolder, v1_yearly,v2_yearly,b_losses): + """Make a figure with the duration curve (yearly losses or load)""" + #New figure + #plt.figure + plt.clf() + #Display variable 1 + plt.plot(sorted(v1_yearly,reverse=True)) + #Display variable 1 + plt.plot(sorted(v2_yearly,reverse=True)) + #If displaying losses + if b_losses: + #Plot the added curve (lines + transformers) + plt.plot(sorted(np.add(v1_yearly,v2_yearly),reverse=True)) + #Set file path + name + output_file_full_path_fig = self.folder + '/' + subfolder + '/' + 'Losses' + '.png' + #Set legend + plt.legend(['Substation losses','Line losses','Total losses']) + #Set y label + plt.ylabel('Losses (kWh)') + else: #If displaying load + #Set file path + name + output_file_full_path_fig = self.folder + '/' + subfolder + '/' + 'Load' + '.png' + #Set legend + plt.legend(['kW','kVAr']) + #Set y label + plt.ylabel('Load') + #Set x label plt.xlabel('Hour (h)') - plt.ylabel('Losses (kWh)') + #Save figure to file plt.savefig(output_file_full_path_fig) - plt.show() + #Display + #plt.show() - def get_graph(self,edges): - graph=nx.Graph() + def add_edges(self,graph,edges): + """Add edges to the graph""" + #Populate it with the edges for idx,element in enumerate(edges): - graph.add_edges_from(element) + graph.add_edges_from([(element[0],element[1])]) return graph - def get_locations(self,graph,bus,locations=[],x_locations_levels={},parent=None,level=0,visited_buses=[]): + def get_locations(self,graph,bus,locations=[],x_location_max_prev=0,parent=None,level=0,visited_buses=[]): + """Get the locations of the buses in the graph""" #Add to the list of visited buses if visited_buses: visited_buses.append(bus) @@ -89,7 +289,7 @@ def get_locations(self,graph,bus,locations=[],x_locations_levels={},parent=None, #Explore downstream levels x_downstream_locations=[] for downstream_bus in connected_buses: - #Remove the terminal from the bus nmae + #Remove the terminal from the bus name downstream_bus=self.remove_terminal(downstream_bus) #If the bus was already visited, remove from graph (if activated this would remove loops) #if downstream_bus!=parent and downstream_bus in visited_buses and graph.has_edge(bus,downstream_bus) and b_remove_loops: @@ -99,90 +299,150 @@ def get_locations(self,graph,bus,locations=[],x_locations_levels={},parent=None, else: #Explore downstream the graph (recursive search) if downstream_bus!=parent and not downstream_bus in visited_buses: - x_loc,locations=self.get_locations(graph,downstream_bus,locations,x_locations_levels,bus,level+1,visited_buses) + x_loc,locations,x_location_max_prev=self.get_locations(graph,downstream_bus,locations,x_location_max_prev,bus,level+1,visited_buses) x_downstream_locations.append(x_loc) #For the upper levels, it takes the average of the downstream buses if x_downstream_locations: loc=(sum(x_downstream_locations)/len(x_downstream_locations),-level); else: - if x_locations_levels: + if x_location_max_prev: #Pick up location from this level or the previous ones #It is neccesary to sort it, to pick in the above for lev loop the x_next_location from the more downstream level - for lev in sorted(x_locations_levels): - if lev<=level: - x_next_location=x_locations_levels[lev]+1 + x_next_location=x_location_max_prev+1 #Assign location x, y loc=(x_next_location,-level) else: #Default position for first bus loc=(1,-level) #Assign x location of this level - x_locations_levels[level]=loc[0] + if x_location_max_prev=v_range[1]: - dic_num_violations_v[node]=dic_num_violations_v[node]+1 - #Make colormap - color_map_v=[] - max_violations_v=max(dic_num_violations_v.values()) - for node in graph: - if max_violations_v==0: - intensity=0 + #Get dict of violations + if (self.b_numeric_ids): + dic_num_violations_v[node]=myopendss_io.get_num_violations(v_dict_voltage[v_dict_ids_buses[node]],v_range,node,None) else: - intensity=dic_num_violations_v[node]/max_violations_v - #color_map_v.append(cmap_nodes(intensity)) - color_map_v.append(intensity) - #Obtain number of violations of each branch + dic_num_violations_v[node]=myopendss_io.get_num_violations(v_dict_voltage[node],v_range,node,None) + return dic_num_violations_v + + + def get_dict_num_violations_l(self,graph,dict_buses_element,v_dict_loading,v_range_loading): + """It obtains number (hours) of violations of each branch""" + #Obtain number of violations (hours) of each branch + myopendss_io=opendss_interface.OpenDSS_Interface(self.folder,self.b_numeric_ids) + #Init dict dic_num_violations_l={} + #For each granch for edge in graph.edges(): - #Truncate list to limits - dic_num_violations_l[edge]=0 - #bus1to2=self.remove_terminal(edge[0])+'-->'+self.remove_terminal(edge[1]) - #bus2to1=self.remove_terminal(edge[1])+'-->'+self.remove_terminal(edge[0]) + #Obtain name from bus1 to bus2 bus1to2=self.remove_terminal(edge[0])+'-->'+self.remove_terminal(edge[1]) + #Obtain name from bus2 to bus1 bus2to1=self.remove_terminal(edge[1])+'-->'+self.remove_terminal(edge[0]) + #If bus1 to bus2 is the one that exists in the dictionary if bus1to2 in dict_buses_element: + #Set element name element=dict_buses_element[bus1to2] - else: + #Evaluate number of violations + dic_num_violations_l[edge]=myopendss_io.get_num_violations(v_dict_loading[element],v_range_loading,element,None) + elif bus2to1 in dict_buses_element: #If bus2 to bus1 is the one that exists in the dictionary + #Set element name element=dict_buses_element[bus2to1] - for idx2,value in enumerate(v_dict_loading[element]): - if value=v_range_loading[1]: - dic_num_violations_l[edge]=dic_num_violations_l[edge]+1 - #Make colormap - color_map_l=[] + #Evaluate number of violations + dic_num_violations_l[edge]=myopendss_io.get_num_violations(v_dict_loading[element],v_range_loading,element,None) + else: #If the element does not exist in the dictionary, set number of violations to zero + dic_num_violations_l[edge]=0 + return dic_num_violations_l + + + + def plot_graph(self,subfolder,my_closed_edges,my_open_edges,v_dict_voltage,v_range,v_dict_loading,v_range_loading,dict_buses_element,v_dict_buses_ids,v_dict_ids_buses): + """Plot a graph with the hierarchical representation of the network""" + #Path and file name + output_file_full_path_fig = self.folder + '/' + subfolder + '/' + 'Network Violations' + '.png' + #New figure + #plt.figure + plt.clf() + #Close the previous fig + plt.close() + #Create empty graph + mygraph=nx.Graph() + #Commented graph example + #mygraph.add_edges_from([(1,2), (1,3), (1,4), (1,5), (1,2), (2,6), (6,7), (7,1)]) + #discard,locations=self.get_locations(mygraph,1) + #Populate the graph with the closed edges + mygraph=self.add_edges(mygraph,my_closed_edges) + mygraph_only_closed_edges=mygraph.copy() + #Populate the graph with the open edges + mygraph=self.add_edges(mygraph,my_open_edges) + #Get the locations of the buses + #WARNING: Locations are extracter from closed edges. This requires that there are no disconnected buses (e.g. two open switches in series) + if self.b_numeric_ids: + discard,locations,x_location_max_prev=self.get_locations(mygraph_only_closed_edges,str(0)) #function get_all_buses_ids sets slack bus to str(0) + else: + discard,locations,x_location_max_prev=self.get_locations(mygraph_only_closed_edges,'st_mat') #RNM-US specific (the slack bus of the distribution system is always "st_mat") + #Create colormap + cmap = plt.cm.get_cmap('jet') + #Take subset of colormap to avoid dark colors (with overlap with text) + cmap = cmap.from_list('trunc({n},{a:.3f},{b:.3f})'.format(n=cmap.name, a=0.15, b=0.75),cmap(np.linspace(0.25, 0.75, 120))) + #Init colormap variable + color_map_v=[] + #Get number of voltage valiations + dic_num_violations_v=self.get_dict_num_violations_v(mygraph,v_dict_voltage,v_range,v_dict_ids_buses) + #Obtain the maximum number of voltage violations in a bus + max_violations_v=max(dic_num_violations_v.values()) + #if no violations, use only one color in the colormap + if max_violations_v==0: + cmap_v = cmap.from_list('trunc({n},{a:.3f},{b:.3f})'.format(n=cmap.name, a=0, b=0),cmap(np.linspace(0, 0, 2))) + else: + cmap_v = cmap + #Creater a colormap (color_map_v) o colour the buses according to their number of violations + for node in mygraph: + #If there are no violations, set all intensities to zero + if max_violations_v==0: + intensity=0 + else: + intensity=dic_num_violations_v[node]/max_violations_v + #Add the intensity of the bus to the colormap + color_map_v.append(intensity) + #Init colormap variables + color_map_l_closed=[] + color_map_l_open=[] + #Get number of loading valiations + dic_num_violations_l=self.get_dict_num_violations_l(mygraph,dict_buses_element,v_dict_loading,v_range_loading) + #Obtain the maximum number of loading violations in a branch max_violations_l=max(dic_num_violations_l.values()) - for edge in graph.edges(): + #if no violations, use only one color in the colormap + if max_violations_l==0: + cmap_l = cmap.from_list('trunc({n},{a:.3f},{b:.3f})'.format(n=cmap.name, a=0, b=0.01),cmap(np.linspace(0, 0.01, 2))) + else: + cmap_l = cmap + #Creater a colormap (color_map_l) o colour the closed branches according to their number of violations + for edge in mygraph.edges(): + #If there are no violations, set all intensities to zero if max_violations_l==0: intensity=0 else: intensity=dic_num_violations_l[edge]/max_violations_l - #color_map_v.append(cmap_nodes(intensity)) - color_map_l.append(intensity) + #Add the intensity of the branch to the colormap + if edge in mygraph_only_closed_edges.edges(): + color_map_l_closed.append(intensity) + else: + color_map_l_open.append(0) #Obtain min and max of x locations max_x=0 max_y=0 @@ -191,14 +451,23 @@ def plot_graph(self,edges,v_dict_voltage,v_range,v_dict_loading,v_range_loading, max_x=locations[name][0] if (max_y<-locations[name][1]): max_y=-locations[name][1] - #plt.figure(figsize=(max_x,max_y)) + #Define the size of the figure unitary_size=0.5 ratio=16/9 maximum=max(max_x,max_y)*unitary_size + if (maximum>40): + maximum=40 plt.figure(figsize=(maximum*ratio,maximum)) - nodes = nx.draw_networkx_nodes(graph, pos=locations, node_color=color_map_v, cmap=cmap) - edges=nx.draw_networkx_edges(graph,pos=locations, edge_color=color_map_l,width=4,edge_cmap=cmap) - nx.draw_networkx_labels(graph, pos=locations) + #Set transparency parameter + myalpha=0.6 + #Draw the nodes + nodes = nx.draw_networkx_nodes(mygraph, pos=locations, node_color=color_map_v, cmap=cmap_v,alpha=myalpha) + #Draw the closed edges (solid lines) + edges=nx.draw_networkx_edges(mygraph,edgelist=my_closed_edges,pos=locations, edge_color=color_map_l_closed,width=4,edge_cmap=cmap_l,alpha=myalpha) + #Show the buses names + #nx.draw_networkx_labels(mygraph, pos=locations) + nx.draw_networkx_labels(mygraph, pos=locations,font_size=8) + #Make the ticks, lables, and colorbar num_ticks_v=5 ticks_v = np.linspace(0, 1, num_ticks_v) labels_v = np.linspace(0, max_violations_v, num_ticks_v) @@ -213,10 +482,17 @@ def plot_graph(self,edges,v_dict_voltage,v_range,v_dict_loading,v_range_loading, cbar.ax.set_yticklabels(["{:4.2f}".format(i) for i in labels_l]) # add the labels cbar.set_label("Thermal limit violations (h)", fontsize=10, y=0.5, rotation=90) cbar.ax.yaxis.set_label_position('left') + #Draw the open edges (dashed lines) + edges=nx.draw_networkx_edges(mygraph,edgelist=my_open_edges,pos=locations, edge_color=color_map_l_open,width=4,edge_cmap=cmap_l,style='--',alpha=myalpha) + #Don't display the axis in the figure plt.axis('off') + #Maximize figure wm = plt.get_current_fig_manager() wm.window.state('zoomed') + #Save the figure to file plt.savefig(output_file_full_path_fig, dpi=300) + #Display plt.show() + From 164e970fc9526f7058e0234b6292cb9be5c99e82 Mon Sep 17 00:00:00 2001 From: cmateo Date: Tue, 18 Oct 2022 18:16:59 +0200 Subject: [PATCH 16/62] complete version bug fixes numerical IDs D6.13 --- Rakefile | 14 +- lib/urbanopt/rnm/validation.rb | 8 +- .../rnm/validation/main_validation.py | 10 +- lib/urbanopt/rnm/validation/plot_lib.py | 28 +- lib/urbanopt/rnm/validation/report.py | 370 ++++++++++++++++++ 5 files changed, 406 insertions(+), 24 deletions(-) create mode 100644 lib/urbanopt/rnm/validation/report.py diff --git a/Rakefile b/Rakefile index 0ddcd91..b6a764a 100644 --- a/Rakefile +++ b/Rakefile @@ -169,20 +169,22 @@ end # run validation # pass in the path to the scenario csv desc 'Run Validation' -task :run_validation, [:scenario_csv_path, :reopt, :use_localhost] do |t, args| +task :run_validation, [:scenario_csv_path, :use_numeric_ids] do |t, args| #Exammple to run validation - #bundle exec rake run_validation[D:/.../urbanopt-rnm-us-gem/spec/files/example_project/baseline_scenario.csv] + #bundle exec rake run_validation[D:/.../urbanopt-rnm-us-gem/spec/files/example_project/baseline_scenario.csv,true] + puts 'Running OpenDSS validation' + # if no path passed in, use default: scenario_csv = args[:scenario_csv_path] || 'spec/test/example_project/run/baseline_scenario' root_dir, scenario_file_name = File.split(File.expand_path(scenario_csv)) scenario_name = File.basename(scenario_file_name, File.extname(scenario_file_name)) run_dir = File.join(root_dir, 'run', scenario_name.downcase) - rnm_dir = File.join(run_dir, 'rnm-us') - - + #Use numeric ids (for the hierarchical plot of the network) + use_numeric_ids = args[:use_numeric_ids] || false + use_numeric_ids = use_numeric_ids == 'true' if !File.exist?(rnm_dir) puts rnm_dir @@ -190,7 +192,7 @@ task :run_validation, [:scenario_csv_path, :reopt, :use_localhost] do |t, args| end puts "run dir path: #{run_dir}" - validation = URBANopt::RNM::Validation.new(rnm_dir) + validation = URBANopt::RNM::Validation.new(rnm_dir,use_numeric_ids) validation.run_validation() puts '...done!' diff --git a/lib/urbanopt/rnm/validation.rb b/lib/urbanopt/rnm/validation.rb index 9d2df2a..49eda3b 100644 --- a/lib/urbanopt/rnm/validation.rb +++ b/lib/urbanopt/rnm/validation.rb @@ -49,12 +49,14 @@ class Validation ## # [parameters:] # * +rnm_dirname+ - _String_ - name of RNM-US directory that will contain the input files (within the scenario directory) - def initialize(rnm_full_path) + def initialize(rnm_full_path,b_numeric_ids) # absolute path @rnm_full_path = rnm_full_path @opendss_full_path=File.join(@rnm_full_path,'results/OpenDSS') + @b_numeric_ids=b_numeric_ids if !Dir.exist?(@opendss_full_path) - puts 'Error: folder does not exist'+@rnm_full_path + puts 'Error: folder does not exist'+@opendss_full_path + raise 'No OpenDSS directory found for this scenario...run run_validation first.' end end @@ -67,7 +69,7 @@ def run_validation() puts @opendss_full_path puts "This can take some minutes" #puts `python ./lib/urbanopt/rnm/validation/main_validation.py #{@rnm_full_path}` - log=`python ./lib/urbanopt/rnm/validation/main_validation.py #{@opendss_full_path}` + log=`python ./lib/urbanopt/rnm/validation/main_validation.py #{@opendss_full_path} #{@b_numeric_ids}` puts log end end diff --git a/lib/urbanopt/rnm/validation/main_validation.py b/lib/urbanopt/rnm/validation/main_validation.py index da47500..1520f6a 100644 --- a/lib/urbanopt/rnm/validation/main_validation.py +++ b/lib/urbanopt/rnm/validation/main_validation.py @@ -11,11 +11,11 @@ import os class Validation: - def __init__(self, folder,b_numeric_ids): + def __init__(self, folder,sb_numeric_ids): """Initialices the folder variables""" self.main_folder = folder #Main uppper level folder (needed to search for OpenDSS files) self.folder=folder+'/Validation' #Folder where the Validation results are saved - self.b_numeric_ids=b_numeric_ids + self.b_numeric_ids=sb_numeric_ids.lower()=='true' #Use numeric IDs in the hierarchical plot of the network self.mkdir(self.folder) #It creates the validation folder if it does not exist def mkdir(self,directory): @@ -77,7 +77,7 @@ def main_validation(self): #Path and file name master_file_full_path = self.main_folder + '/dss_files/' + 'Master.dss' #Path for the Master file start_index = 0 #Default initial index (needed to run OpenDSS) - num_periods=12 #Number of periods (12 month) + num_periods=12 #Number of periods (12 months) end_index = 8760 #Default final index, 1 year, 8760h (needed to run OpenDSS) #Create sub-folders @@ -141,7 +141,7 @@ def main_validation(self): """Runs direclty as a script if called from the command window""" #Example of use: python main_validation.py files folder = sys.argv[1] #Use the folder specified in the arguments - b_numeric_ids=True - valid=Validation(folder,b_numeric_ids) + sb_numeric_ids = sys.argv[2] #Use numeric IDs in the hierarchical plot of the network + valid=Validation(folder,sb_numeric_ids) valid.main_validation() #Call the main validation function diff --git a/lib/urbanopt/rnm/validation/plot_lib.py b/lib/urbanopt/rnm/validation/plot_lib.py index 8660da1..69a7cb6 100644 --- a/lib/urbanopt/rnm/validation/plot_lib.py +++ b/lib/urbanopt/rnm/validation/plot_lib.py @@ -341,7 +341,7 @@ def get_dict_num_violations_v(self,graph,v_dict_voltage,v_range,v_dict_ids_buses return dic_num_violations_v - def get_dict_num_violations_l(self,graph,dict_buses_element,v_dict_loading,v_range_loading): + def get_dict_num_violations_l(self,graph,dict_buses_element,v_dict_loading,v_range_loading,v_dict_ids_buses): """It obtains number (hours) of violations of each branch""" #Obtain number of violations (hours) of each branch myopendss_io=opendss_interface.OpenDSS_Interface(self.folder,self.b_numeric_ids) @@ -350,9 +350,15 @@ def get_dict_num_violations_l(self,graph,dict_buses_element,v_dict_loading,v_ran #For each granch for edge in graph.edges(): #Obtain name from bus1 to bus2 - bus1to2=self.remove_terminal(edge[0])+'-->'+self.remove_terminal(edge[1]) + if not self.b_numeric_ids: + bus1to2=self.remove_terminal(edge[0])+'-->'+self.remove_terminal(edge[1]) + else: + bus1to2=self.remove_terminal(v_dict_ids_buses[edge[0]])+'-->'+self.remove_terminal(v_dict_ids_buses[edge[1]]) #Obtain name from bus2 to bus1 - bus2to1=self.remove_terminal(edge[1])+'-->'+self.remove_terminal(edge[0]) + if not self.b_numeric_ids: + bus2to1=self.remove_terminal(edge[1])+'-->'+self.remove_terminal(edge[0]) + else: + bus2to1=self.remove_terminal(v_dict_ids_buses[edge[1]])+'-->'+self.remove_terminal(v_dict_ids_buses[edge[0]]) #If bus1 to bus2 is the one that exists in the dictionary if bus1to2 in dict_buses_element: #Set element name @@ -423,7 +429,7 @@ def plot_graph(self,subfolder,my_closed_edges,my_open_edges,v_dict_voltage,v_ran color_map_l_closed=[] color_map_l_open=[] #Get number of loading valiations - dic_num_violations_l=self.get_dict_num_violations_l(mygraph,dict_buses_element,v_dict_loading,v_range_loading) + dic_num_violations_l=self.get_dict_num_violations_l(mygraph,dict_buses_element,v_dict_loading,v_range_loading,v_dict_ids_buses) #Obtain the maximum number of loading violations in a branch max_violations_l=max(dic_num_violations_l.values()) #if no violations, use only one color in the colormap @@ -432,17 +438,19 @@ def plot_graph(self,subfolder,my_closed_edges,my_open_edges,v_dict_voltage,v_ran else: cmap_l = cmap #Creater a colormap (color_map_l) o colour the closed branches according to their number of violations - for edge in mygraph.edges(): + for edge in mygraph_only_closed_edges.edges(): #If there are no violations, set all intensities to zero if max_violations_l==0: intensity=0 else: intensity=dic_num_violations_l[edge]/max_violations_l #Add the intensity of the branch to the colormap - if edge in mygraph_only_closed_edges.edges(): - color_map_l_closed.append(intensity) - else: - color_map_l_open.append(0) + color_map_l_closed.append(intensity) + #Creater a colormap for the open branches + for edge in mygraph.edges(): + #Add the intensity of the branch to the colormap + if not edge in mygraph_only_closed_edges.edges(): + color_map_l_open.append(0) #As it is a different graph, order may be different, but it does not matter because they are all zero #Obtain min and max of x locations max_x=0 max_y=0 @@ -463,7 +471,7 @@ def plot_graph(self,subfolder,my_closed_edges,my_open_edges,v_dict_voltage,v_ran #Draw the nodes nodes = nx.draw_networkx_nodes(mygraph, pos=locations, node_color=color_map_v, cmap=cmap_v,alpha=myalpha) #Draw the closed edges (solid lines) - edges=nx.draw_networkx_edges(mygraph,edgelist=my_closed_edges,pos=locations, edge_color=color_map_l_closed,width=4,edge_cmap=cmap_l,alpha=myalpha) + edges=nx.draw_networkx_edges(mygraph_only_closed_edges,pos=locations, edge_color=color_map_l_closed,width=4,edge_cmap=cmap_l,alpha=myalpha) #Show the buses names #nx.draw_networkx_labels(mygraph, pos=locations) nx.draw_networkx_labels(mygraph, pos=locations,font_size=8) diff --git a/lib/urbanopt/rnm/validation/report.py b/lib/urbanopt/rnm/validation/report.py new file mode 100644 index 0000000..72c79b1 --- /dev/null +++ b/lib/urbanopt/rnm/validation/report.py @@ -0,0 +1,370 @@ +import opendss_interface +import numpy as np + +class Report: + def __init__(self, folder,b_numeric_ids): + """Initialices the folder variables""" + self.main_folder = folder + self.folder=folder+'/Validation' + self.num_top_violations=5 + self.b_numeric_ids=b_numeric_ids + + def is_to_be_analyzed(self,name,label_type): + """Determines if a network component has to be analyzed in the report""" + b_analyzed=False + if label_type=='All': + b_analyzed=True + elif not isinstance(name, str): + b_analyzed=True + elif name.startswith('Line.padswitch'): #RNM-US specific nomenclature #We only condider power lines and tarnsformers as branches + b_analyzed=False + elif name.startswith('Line.breaker'): #RNM-US specific nomenclature + b_analyzed=False + elif name.startswith('Line.fuse'): #RNM-US specific nomenclature + b_analyzed=False + elif name.startswith('Capacitor'): + b_analyzed=False + elif label_type=="LineTransformer": + if (name.startswith("Line.l") or name.startswith("Transformer")): #RNM-US specific nomenclature + b_analyzed=True + elif label_type=="Line" and name.startswith('Line.l'): #RNM-US specific nomenclature + b_analyzed=True + elif label_type=="Transformer" and name.startswith('Transformer'): + b_analyzed=True + elif name.startswith(label_type): + b_analyzed=True + return b_analyzed + + def get_dict_num_violations(self,v_dict_voltage,v_range,label_type,dict_loads): + """Obtains the number of violations (hours) of each bus""" + myopendss_io=opendss_interface.OpenDSS_Interface(self.folder,self.b_numeric_ids) + dic_num_violations_v={} + for name in v_dict_voltage: + if self.is_to_be_analyzed(name,label_type): + dic_num_violations_v[name]=myopendss_io.get_num_violations(v_dict_voltage[name],v_range,name,dict_loads) + return dic_num_violations_v + + def transpose_dic(self,v_dict,label_type): + """Transpose (t) the dict""" + #e.g. Instead of buses in rows and hours in columns, it puts hours in rows and buses in columns + keys = v_dict.keys() + matrix = [v_dict[i] for i in keys if self.is_to_be_analyzed(i,label_type)] + matrix_t={idx:list(i) for idx,i in enumerate(zip(*matrix))} + return matrix_t + + def len(self,v_dict,label_type,dict_loads): + """Obtains the number of elements in a dict vector (used to compute percentages)""" + #Init to zero + num=0 + #For each key + for i in v_dict.keys(): + #If element t is to be analyzed + if self.is_to_be_analyzed(i,label_type): + #If there is no dictionary of loads, or if the load is in the dictionary + if (dict_loads is None or i in dict_loads): + num=num+1 #Add 1 + return num + + def size(self,v_dict,label_type,dict_loads): + """Obtains the number of elements in a dict matrix (used to compute percentages)""" + #Init to zero + num=0 + #For each key + for i in v_dict.keys(): + #If element t is to be analyzed + if self.is_to_be_analyzed(i,label_type): + #For each hour + for idx,j in enumerate(v_dict[i]): + if (dict_loads is None): #If there is no dictionary of loads + num=num+1 #Add 1 + elif (i in dict_loads): #if the load is in the dictionary (there is a dictionary of loads when the energy is being evaluated) + num=num+dict_loads[i][idx] #Add the energy in that hour + return num + + + def count_nonzero(self,dict,label_type,dict_loads): + """Counts non zero elements (to identify number of violations)""" + #Init to zero + num=0 + #For each key + for i in dict: + #If it is not zero + if dict[i]!=0: + #If the element is to be analyzed + if self.is_to_be_analyzed(i,label_type): + #If there is no dictionary of loads, or if the load is in the dictionary + if (dict_loads is None or i in dict_loads): + num=num+1 #Add 1 + return num + + def sum(self,dict,label_type,dict_loads): + """It sums all the values in the dict of the elements to be analyzed""" + #Init to zero + num=0 + #For each key + for i in dict: + #If the element is to be analyzed + if self.is_to_be_analyzed(i,label_type): + #If there is no dictionary of loads, or if the load is in the dictionary + if (dict_loads is None or i in dict_loads): + num=num+dict[i] #Add the value in the dict + return num + + def get_top_violations(self,v_dict,label_type): + """Get the top violations (the elements that have the highest number of violations)""" + #Sort the vioations + sorted_violations=dict(sorted(v_dict.items(), key=lambda item: item[1],reverse=True)) + #Init the variables + top_violations={} + num=0 + #For each violation + for name in sorted_violations: + #Only the num_elements top, and only if they have violations + if (num<=self.num_top_violations and sorted_violations[name]>0): + #If the element is to be analyzed + if self.is_to_be_analyzed(name,label_type): + top_violations[name]=sorted_violations[name] + num=num+1 + return top_violations + + def get_stats(self,v_dict,v_range,label_type,dict_loads): + """Obtains all the stats required to calculate a given metric""" + #Get dict of violations in each element + violations=self.get_dict_num_violations(v_dict,v_range,label_type,dict_loads) + #Top violations + top_violations=self.get_top_violations(violations,label_type) + #Number of elements with some violations + num_violations=self.count_nonzero(violations,label_type,dict_loads) + #Number of elements + pc_violations=num_violations/self.len(violations,label_type,dict_loads) + #Number of elements x hour with a violation + sum_violations=self.sum(violations,label_type,dict_loads) + #Number of elements x hour + pc_sum_violations=sum_violations/self.size(v_dict,label_type,dict_loads) + return num_violations,pc_violations,sum_violations,pc_sum_violations,top_violations + + + def assess_metric(self,v_dict,v_range,dict_metrics,label_component,label_violation,label_type,b_hours,dict_loads): + """Obtains an individual metric""" + #Get required stats to calculate the metric + num_violations,pc_violations,sum_violations,pc_sum_violations,top_violations=self.get_stats(v_dict,v_range,label_type,dict_loads) + #Check that dict is not empty + if dict_loads is None: + #Assign labels + #For the function calculating the metrics it is needed to specify that it is only lines and transformers, but for label we can call it just "All" + if (label_type)=="LineTransformer": + label_type="All" + if not b_hours: + label=label_component+'_'+label_violation + else: + label='Hours'+'_'+label_violation + if label_violation=='Loading': + mylabel1='Num_'+label+'_Violations_'+label_type #e.g. number of buses with voltage violations + mylabel2='Percentage_'+label+'_Violations_'+label_type+'(%)' + else: + mylabel1='Num_'+label+'_Violations' #e.g. number of buses with voltage violations + mylabel2='Percentage_'+label+'_Violations(%)' + #Evaluate number and percentage of violations of the element + dict_metrics[mylabel1]=num_violations + dict_metrics[mylabel2]=pc_violations*100 + #Optionally print them in the console + #print(mylabel1+': '+str(num_violations)) + #print(mylabel2+': '+'{:.1f}'.format(pc_violations*100)) + #If we are not evluating hours (for hours we do not evaluate the number of element x hour violations, because we have already calculated it for the elements) + if not b_hours: + #Assign labels + if dict_loads is None: + label='('+label_component+'_x_Hours)_'+label_violation + else: + label='Energy_kWh_'+label_violation + if label_violation=='Loading': + mylabel3='Num_'+label+'_Violations_'+label_type #e.g. number of buses*hours with voltage violations (it is the same calculated with hours and with buses) + mylabel4='Percentage_'+label+'_Violations_'+label_type+'(%)' + else: + mylabel3='Num_'+label+'_Violations' #e.g. number of buses*hours with voltage violations (it is the same calculated with hours and with buses) + mylabel4='Percentage_'+label+'_Violations(%)' + #Evalute number and percentage of violations of elements x hours + dict_metrics[mylabel3]=sum_violations + dict_metrics[mylabel4]=pc_sum_violations*100 + #Optionally print them in the console + #print(mylabel3+': '+str(sum_violations)) + #print(mylabel4+': '+'{:.1f}'.format(pc_sum_violations*100)) + return dict_metrics,top_violations + + def assess_metrics(self,v_dict,v_range,dict_metrics,label_component,label_violation,label_type,dict_loads): + """Asseses all the metrics (elements (bus/branch), hours, or elements x hour) of a given type (voltage, unbalance or loading)""" + #Evaluate the metric of the element + dict_metrics,top_violations=self.assess_metric(v_dict,v_range,dict_metrics,label_component,label_violation,label_type,False,None) + #Evaluete the energy delivered with violations (only for voltages) + if ('voltage' in label_violation.lower() or 'unbalance' in label_violation.lower()): + dict_metrics,discard=self.assess_metric(v_dict,v_range,dict_metrics,label_component,label_violation,label_type,False,dict_loads) + #We transpose it to analyze hours instead of buses + v_dic_hours_violations=self.transpose_dic(v_dict,label_type) + #We evaluate the metric again, now for the hours + dict_metrics,discard=self.assess_metric(v_dic_hours_violations,v_range,dict_metrics,label_component,label_violation,label_type,True,None) + return dict_metrics,top_violations + + def get_metrics(self,v_dict_voltage,v_range_voltage,v_dict_unbalance,v_range_unbalance,v_dict_loading,v_range_loading,dict_loads): + """Calculates all the metrics""" + dict_metrics={} + #Voltage + dict_metrics,top_buses_voltage=self.assess_metrics(v_dict_voltage,v_range_voltage,dict_metrics,'Buses','Voltage','All',dict_loads) + #Under-Voltage + v_range_voltage_under=dict(v_range_voltage) + v_range_voltage_under['allowed_range']=(v_range_voltage['allowed_range'][0],float('inf')) + dict_metrics,top_buses_under=self.assess_metrics(v_dict_voltage,v_range_voltage_under,dict_metrics,'Buses','Under-voltage','All',dict_loads) + #Over-Voltage + v_range_voltage_over=dict(v_range_voltage) + v_range_voltage_over['allowed_range']=(0,v_range_voltage['allowed_range'][1]) + dict_metrics,top_buses_over=self.assess_metrics(v_dict_voltage,v_range_voltage_over,dict_metrics,'Buses','Over-voltage','All',dict_loads) + #Unbalance + dict_metrics,top_buses_unbalance=self.assess_metrics(v_dict_unbalance,v_range_unbalance,dict_metrics,'Buses','Unbalance','All',dict_loads) + #Loading + dict_metrics,top_branches_violations=self.assess_metrics(v_dict_loading,v_range_loading,dict_metrics,'Branches','Loading','LineTransformer',None) + dict_metrics,top_lines_violations=self.assess_metrics(v_dict_loading,v_range_loading,dict_metrics,'Branches','Loading','Line',None) + dict_metrics,top_transformers_violations=self.assess_metrics(v_dict_loading,v_range_loading,dict_metrics,'Branches','Loading','Transformer',None) + return dict_metrics,top_buses_under,top_buses_over,top_buses_unbalance,top_lines_violations,top_transformers_violations + + + def write_raw_metrics(self,dict_metrics,top_buses_under,top_buses_over,top_buses_unbalance,top_lines_violations,top_transformers_violations): + """Writes a raw file with all the metrics""" + #Path and file name + output_file_full_path = self.folder + '/Summary/' + 'Raw_Metrics' + '.csv' + #Open + with open(output_file_full_path, 'w') as fp: + #Write raw metrics + for idx,name in enumerate(dict_metrics): + fp.write(name+','+'{:.0f}'.format(dict_metrics[name])+'\n') + #Top under-voltage violations + fp.write('Top Under-Voltage Violations, ') + for idx,name in enumerate(top_buses_under): + fp.write(name+'('+'{:.0f}'.format(top_buses_under[name])+'h)') + if idx != len(top_buses_under)-1: + fp.write(', ') + fp.write('\n') + #Top over-voltage violations + fp.write('Top Over-Voltage Violations, ') + for idx,name in enumerate(top_buses_over): + fp.write(name+'('+'{:.0f}'.format(top_buses_over[name])+'h)') + if idx != len(top_buses_over)-1: + fp.write(', ') + + fp.write('\n') + #Top unbalance violations + fp.write('Top Voltage Unbalance Violations, ') + for idx,name in enumerate(top_buses_unbalance): + fp.write(name+'('+'{:.0f}'.format(top_buses_unbalance[name])+'h)') + if idx != len(top_buses_unbalance)-1: + fp.write(', ') + fp.write('\n') + #Top power line thermal limit violations + fp.write('Top Power Line Thermal limit Violations, ') + for idx,name in enumerate(top_lines_violations): + fp.write(name+'('+'{:.0f}'.format(top_lines_violations[name])+'h)') + if idx != len(top_lines_violations)-1: + fp.write(', ') + fp.write('\n') + #Top transformer thermal limit violations + fp.write('Top Transformer Thermal limit Violations, ') + for idx,name in enumerate(top_transformers_violations): + fp.write(name+'('+'{:.0f}'.format(top_transformers_violations[name])+'h)') + if idx != len(top_transformers_violations)-1: + fp.write(', ') + fp.write('\n') + + def write_formatted_metrics(self,dict_metrics,top_buses_under,top_buses_over,top_buses_unbalance,top_lines_violations,top_transformers_violations): + """Write formatted summary operational report, presenting all the metrics in an organized way""" + #Path and file name + output_file_full_path = self.folder + '/Summary/' + 'Summary_Operational_Report' + '.csv' + #Open + with open(output_file_full_path, 'w') as fp: + #Voltage violations + fp.write('Voltage violations\n') + fp.write('Buses: ') + fp.write(' Total '+'{:.0f}'.format(dict_metrics['Num_Buses_Voltage_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Buses_Voltage_Violations(%)'])+'%)') + fp.write(' Under '+'{:.0f}'.format(dict_metrics['Num_Buses_Under-voltage_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Buses_Under-voltage_Violations(%)'])+'%)') + fp.write(' Over '+'{:.0f}'.format(dict_metrics['Num_Buses_Over-voltage_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Buses_Over-voltage_Violations(%)'])+'%)') + fp.write('\n') + fp.write('Hours: ') + fp.write(' Total '+'{:.0f}'.format(dict_metrics['Num_Hours_Voltage_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Hours_Voltage_Violations(%)'])+'%)') + fp.write(' Under '+'{:.0f}'.format(dict_metrics['Num_Hours_Under-voltage_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Hours_Under-voltage_Violations(%)'])+'%)') + fp.write(' Over '+'{:.0f}'.format(dict_metrics['Num_Hours_Over-voltage_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Hours_Over-voltage_Violations(%)'])+'%)') + fp.write('\n') + fp.write('(Buses x Hours): ') + fp.write(' Total '+'{:.0f}'.format(dict_metrics['Num_(Buses_x_Hours)_Voltage_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_(Buses_x_Hours)_Voltage_Violations(%)'])+'%)') + fp.write(' Under '+'{:.0f}'.format(dict_metrics['Num_(Buses_x_Hours)_Under-voltage_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_(Buses_x_Hours)_Under-voltage_Violations(%)'])+'%)') + fp.write(' Over '+'{:.0f}'.format(dict_metrics['Num_(Buses_x_Hours)_Over-voltage_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_(Buses_x_Hours)_Over-voltage_Violations(%)'])+'%)') + fp.write('\n') + fp.write('Energy_kWh: ') + fp.write(' Total '+'{:.0f}'.format(dict_metrics['Num_Energy_kWh_Voltage_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Energy_kWh_Voltage_Violations(%)'])+'%)') + fp.write(' Under '+'{:.0f}'.format(dict_metrics['Num_Energy_kWh_Under-voltage_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Energy_kWh_Under-voltage_Violations(%)'])+'%)') + fp.write(' Over '+'{:.0f}'.format(dict_metrics['Num_Energy_kWh_Over-voltage_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Energy_kWh_Over-voltage_Violations(%)'])+'%)') + fp.write('\n') + fp.write('\n') + #Unbalance violations + fp.write('Voltage unbalance violations\n') + fp.write('Buses: ') + fp.write(' Total '+'{:.0f}'.format(dict_metrics['Num_Buses_Unbalance_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Buses_Unbalance_Violations(%)'])+'%)') + fp.write('\n') + fp.write('Hours: ') + fp.write(' Total '+'{:.0f}'.format(dict_metrics['Num_Hours_Unbalance_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Hours_Unbalance_Violations(%)'])+'%)') + fp.write('\n') + fp.write('(Buses x Hours): ') + fp.write(' Total '+'{:.0f}'.format(dict_metrics['Num_(Buses_x_Hours)_Unbalance_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_(Buses_x_Hours)_Unbalance_Violations(%)'])+'%)') + fp.write('\n') + fp.write('Energy_kWh: ') + fp.write(' Total '+'{:.0f}'.format(dict_metrics['Num_Energy_kWh_Unbalance_Violations'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Energy_kWh_Unbalance_Violations(%)'])+'%)') + fp.write('\n') + fp.write('\n') + #Thermal limit violations + fp.write('Thermal limit violations\n') + fp.write('Branches: ') + fp.write(' Total '+'{:.0f}'.format(dict_metrics['Num_Branches_Loading_Violations_All'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Branches_Loading_Violations_All(%)'])+'%)') + fp.write(' Lines '+'{:.0f}'.format(dict_metrics['Num_Branches_Loading_Violations_Line'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Branches_Loading_Violations_Line(%)'])+'%)') + fp.write(' Transformers '+'{:.0f}'.format(dict_metrics['Num_Branches_Loading_Violations_Transformer'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Branches_Loading_Violations_Transformer(%)'])+'%)') + fp.write('\n') + fp.write('Hours: ') + fp.write(' Total '+'{:.0f}'.format(dict_metrics['Num_Hours_Loading_Violations_All'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Hours_Loading_Violations_All(%)'])+'%)') + fp.write(' Lines '+'{:.0f}'.format(dict_metrics['Num_Hours_Loading_Violations_Line'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Hours_Loading_Violations_Line(%)'])+'%)') + fp.write(' Transformers '+'{:.0f}'.format(dict_metrics['Num_Hours_Loading_Violations_Transformer'])+'('+'{:.0f}'.format(dict_metrics['Percentage_Hours_Loading_Violations_Transformer(%)'])+'%)') + fp.write('\n') + fp.write('(Branches x Hours): ') + fp.write(' Total '+'{:.0f}'.format(dict_metrics['Num_(Branches_x_Hours)_Loading_Violations_All'])+'('+'{:.0f}'.format(dict_metrics['Percentage_(Branches_x_Hours)_Loading_Violations_All(%)'])+'%)') + fp.write(' Lines '+'{:.0f}'.format(dict_metrics['Num_(Branches_x_Hours)_Loading_Violations_Line'])+'('+'{:.0f}'.format(dict_metrics['Percentage_(Branches_x_Hours)_Loading_Violations_Line(%)'])+'%)') + fp.write(' Transformers '+'{:.0f}'.format(dict_metrics['Num_(Branches_x_Hours)_Loading_Violations_Transformer'])+'('+'{:.0f}'.format(dict_metrics['Percentage_(Branches_x_Hours)_Loading_Violations_Transformer(%)'])+'%)') + fp.write('\n') + fp.write('\n') + #Top violations + fp.write('Top Under-Voltage Violations\n') + for idx,name in enumerate(top_buses_under): + fp.write(name+'('+'{:.0f}'.format(top_buses_under[name])+'h)') + fp.write('\n') + fp.write('\n') + fp.write('Top Over-Voltage Violations\n') + for idx,name in enumerate(top_buses_over): + fp.write(name+'('+'{:.0f}'.format(top_buses_over[name])+'h)') + fp.write('\n') + fp.write('\n') + fp.write('Top Unbalance Violations\n') + for idx,name in enumerate(top_buses_unbalance): + fp.write(name+'('+'{:.0f}'.format(top_buses_unbalance[name])+'h)') + fp.write('\n') + fp.write('\n') + fp.write('Top Power Line Thermal limit Violations\n') + for idx,name in enumerate(top_lines_violations): + fp.write(name+'('+'{:.0f}'.format(top_lines_violations[name])+'h)') + fp.write('\n') + fp.write('\n') + fp.write('Top Transformer Thermal limit Violations\n') + for idx,name in enumerate(top_transformers_violations): + fp.write(name+'('+'{:.0f}'.format(top_transformers_violations[name])+'h)') + fp.write('\n') + + def write_summary_operational_report(self,subfolder,v_dict_voltage,v_range_voltage,v_dict_unbalance,v_range_unbalance,v_dict_loading,v_range_loading,v_dict_loads): + """Calculate and write all the metrics and the summary operational report""" + #Calculate all the metrics + dict_metrics,top_buses_under,top_buses_over,top_buses_unbalance,top_lines_violations,top_transformers_violations=self.get_metrics(v_dict_voltage,v_range_voltage,v_dict_unbalance,v_range_unbalance,v_dict_loading,v_range_loading,v_dict_loads) + #Write a file with the raw metrics + self.write_raw_metrics(dict_metrics,top_buses_under,top_buses_over,top_buses_unbalance,top_lines_violations,top_transformers_violations) + #Write a file with summary operational report + self.write_formatted_metrics(dict_metrics,top_buses_under,top_buses_over,top_buses_unbalance,top_lines_violations,top_transformers_violations) From 11d9ed09c0cd813d0ee11fd7f2ab8ac9b2247ebd Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Wed, 19 Oct 2022 15:30:15 -0600 Subject: [PATCH 17/62] cleanup and comment out error-causing calls on mac --- .gitignore | 4 +- README.md | 16 +- lib/urbanopt/rnm/validation.rb | 8 +- lib/urbanopt/rnm/validation/plot_lib.py | 345 ++++++++++++------------ requirements.txt | 9 + 5 files changed, 203 insertions(+), 179 deletions(-) create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore index 85a0ee6..39ffed8 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,6 @@ runner.conf # ignore template files for now /template_inputs/* test_opendss_catalog.json -*.sql \ No newline at end of file +*.sql + +*__pycache__ \ No newline at end of file diff --git a/README.md b/README.md index de17dbd..4e5ae62 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,21 @@ bundle exec rake create_opendss_catalog[/desired/path/to/opendss_catalog.json] | API Version | RNM-US Gem Version | RNM-US exe Version | | ----------- | ----------- | ---------------- | | v1 | 0.3.0 and earlier | RNM-US_20220819 | -| v2 | 0.4.0 | RNM-US_20220927 | +| v2 | 0.4.0 | RNM-US_20221018 | + + +## Validation Functionality + +The validation and results visualization functionality is written in python. Follow these steps if you would like to use it. + +1. Install python (3.10) if you do not already have it installed +1. Clone the repo to your computer +1. cd into the repo directory +1. run `bundle install` to install the required ruby dependencies +1. run `pip install -r requirements.txt` to install the required python dependencies for the validation module +1. create input files and run the simulation as usual +1. run `bundle exec rake run_validation[/path/to/scenario/csv]` to run the validation + ## Testing diff --git a/lib/urbanopt/rnm/validation.rb b/lib/urbanopt/rnm/validation.rb index 49eda3b..eebd2bc 100644 --- a/lib/urbanopt/rnm/validation.rb +++ b/lib/urbanopt/rnm/validation.rb @@ -56,7 +56,7 @@ def initialize(rnm_full_path,b_numeric_ids) @b_numeric_ids=b_numeric_ids if !Dir.exist?(@opendss_full_path) puts 'Error: folder does not exist'+@opendss_full_path - raise 'No OpenDSS directory found for this scenario...run run_validation first.' + raise 'No OpenDSS directory found for this scenario...run simulation first.' end end @@ -65,10 +65,10 @@ def initialize(rnm_full_path,b_numeric_ids) # Run validation ## def run_validation() - puts "Initating OpenDSS validation in folder" + puts "Initiating OpenDSS validation in folder" puts @opendss_full_path - puts "This can take some minutes" - #puts `python ./lib/urbanopt/rnm/validation/main_validation.py #{@rnm_full_path}` + puts "This can take several minutes" + # puts `python ./lib/urbanopt/rnm/validation/main_validation.py #{@rnm_full_path}` log=`python ./lib/urbanopt/rnm/validation/main_validation.py #{@opendss_full_path} #{@b_numeric_ids}` puts log end diff --git a/lib/urbanopt/rnm/validation/plot_lib.py b/lib/urbanopt/rnm/validation/plot_lib.py index 69a7cb6..a95cead 100644 --- a/lib/urbanopt/rnm/validation/plot_lib.py +++ b/lib/urbanopt/rnm/validation/plot_lib.py @@ -30,58 +30,58 @@ def remove_terminal(self,bus): def plot_hist(self,subfolder,type,v_value,v_value_period,v_range,num_periods,num_bins): """Plots an histogram""" - #Path and file name + # Path and file name output_file_full_path_fig = self.folder + '/' + subfolder + '/Figures/' + type + ' Histogram (p.u.).png' output_file_full_path_csv = self.folder + '/' + subfolder + '/CSV/' + type + ' Histogram (p.u.).csv' - #New figure - #plt.figure + # New figure + # plt.figure plt.clf() - #Activate figure grid + # Activate figure grid plt.grid(True) - #Init variables + # Init variables v_legend=["" for _ in range(num_periods+2)] matrix=np.empty((num_bins,num_periods+2)) #Matrix for writting to file (index+periods+yearly) - #For each month + # For each month for j in range(num_periods): - #Set xlim + # Set xlim if v_range['display_range']: plt.xlim(v_range['display_range']) - #Set the weight variable + # Set the weight variable v_weights = np.ones_like(v_value_period[j]) / len(v_value_period[j]) - #Calculate the histogram of each month + # Calculate the histogram of each month counts, bins = np.histogram(v_value_period[j], range=v_range['display_range'], bins=num_bins, weights=v_weights) - #Update matrix and legend - #If first iteration + # Update matrix and legend + # If first iteration if j==0: matrix[:,0]=bins[:num_bins:] v_legend[0]=type - #In subsequent iterations + # In subsequent iterations matrix[:,j+1]=counts v_legend[j+1]= "M"+str(j+1) - #Plot the month + # Plot the month plt.plot(bins[:-1]+(bins[1]-bins[0])*0.5, counts) - #Set the weight variable + # Set the weight variable v_weights = np.ones_like(v_value) / len(v_value) - #Calculate the yearly histogram + # Calculate the yearly histogram counts, bins = np.histogram(v_value, range=v_range['display_range'], bins=num_bins, weights=v_weights) - #Update matrix and legend + # Update matrix and legend matrix[:,num_periods+1]=counts v_legend[num_periods+1]='Yearly' - #Plot histogram + # Plot histogram plt.hist(bins[:-1], bins, weights=counts) - #Plot legend + # Plot legend plt.legend(v_legend[1:num_periods+2:]) - #Write line with the limits + # Write line with the limits for j in range(len(v_range['limits'])): h = plt.axvline(v_range['limits'][j], color='r', linestyle='--') - #x,y lables + # x,y lables plt.xlabel(type) plt.ylabel('Frequency (p.u.)') - #Save to file + # Save to file plt.savefig(output_file_full_path_fig, dpi=300) - #Display - #plt.show() - #Save data to file + # Display + # plt.show() + # Save data to file # Write directly as a CSV file with headers on first line with open(output_file_full_path_csv, 'w') as fp: fp.write(','.join(v_legend) + '\n') @@ -89,251 +89,251 @@ def plot_hist(self,subfolder,type,v_value,v_value_period,v_range,num_periods,num def plot_violin(self,subfolder,type,v_value,v_range): """Make a figure with a violin plot""" - #Path and file name + # Path and file name output_file_full_path_fig = self.folder + '/' + subfolder + '/' + type + ' Violin Plot.png' - #New figure - #plt.figure + # New figure + # plt.figure plt.clf() - #Write line with the limits + # Write line with the limits for j in range(len(v_range['limits'])): h = plt.axhline(v_range['limits'][j], color='r', linestyle='--') - #Plot violtin + # Plot violtin sns.violinplot(y=v_value, cut=0, color='orange') - #Strip plot (display points) + # Strip plot (display points) sns.stripplot(y=v_value, color='blue') - #y label + # y label plt.ylabel(type) - #y limit + # y limit if v_range['display_range']: plt.ylim(v_range['display_range']) - #Save figure to file + # Save figure to file plt.savefig(output_file_full_path_fig, dpi=300) - #Display - #plt.show() + # Display + # plt.show() def plot_violin_two_vars(self,subfolder, type,v_value1,v_value2,v_range): """Make a figure with a violin plot of two variables (kW/kVAr)""" - #Path and file name + # Path and file name output_file_full_path_fig = self.folder + '/' + subfolder + '/' + type + ' Violin Plot.png' - #New figure - #plt.figure + # New figure + # plt.figure plt.clf() - #Init variables + # Init variables v_data=[] v_type=[] - #Write line with the limits + # Write line with the limits for j in range(len(v_range['limits'])): h = plt.axhline(v_range['limits'][j], color='r', linestyle='--') - #Extend lists for yearly var1 + # Extend lists for yearly var1 l_type=['kW' for _ in v_value1] v_data.extend(v_value1) v_type.extend(l_type) - #Extend lists for yearly var2 + # Extend lists for yearly var2 l_type=['kVAr' for _ in v_value2] v_data.extend(v_value2) v_type.extend(l_type) - #Display violin plot + # Display violin plot sns.violinplot(y=v_data, hue=v_type, cut=0, split=True, palette = {'kW':'blue','kVAr':'orange'}) - #Set y label + # Set y label plt.ylabel(type) - #Set y limit + # Set y limit if v_range['display_range']: plt.ylim(v_range['display_range']) - #Save figure to file + # Save figure to file plt.savefig(output_file_full_path_fig, dpi=300) - #Display - #plt.show() + # Display + # plt.show() def plot_violin_monthly(self,subfolder, type,v_value,v_value_period,v_range,num_periods): """Make a violin plot with the monthly variation""" - #Path and file name + # Path and file name output_file_full_path_fig = self.folder + '/' + subfolder + '/' + type + ' Violin Plot.png' - #New figure - #plt.figure + # New figure + # plt.figure plt.clf() - #Init variables + # Init variables v_data=[] v_month=[] v_yearly=[] - #Write line with the limits + # Write line with the limits for j in range(len(v_range['limits'])): h = plt.axhline(v_range['limits'][j], color='r', linestyle='--') - #For each month + # For each month for j in range(num_periods): - #Extend lists for monthly + # Extend lists for monthly l_month=["M"+str(j+1) for _ in v_value_period[j]] l_yearly=['Monthly' for _ in v_value_period[j]] v_data.extend(v_value_period[j]) v_month.extend(l_month) v_yearly.extend(l_yearly) - #Extend lists for yearly + # Extend lists for yearly l_month=["M"+str(j+1) for _ in v_value] l_yearly=['Yearly' for _ in v_value] v_data.extend(v_value) v_month.extend(l_month) v_yearly.extend(l_yearly) - #Display violin plot + # Display violin plot sns.violinplot(x=v_month, y=v_data, hue=v_yearly, cut=0, split=True) - #Set y label + # Set y label plt.ylabel(type) - #Set y limit + # Set y limit if v_range['display_range']: plt.ylim(v_range['display_range']) - #Save figure to file + # Save figure to file plt.savefig(output_file_full_path_fig, dpi=300) - #Display - #plt.show() + # Display + # plt.show() def plot_violin_monthly_two_vars(self,subfolder, type,v_value1,v_value1_period,v_value2,v_value2_period,v_range,num_periods): """Make a violin plot for two variables (kW/kVAr) with the monthly variation""" - #Path and file name + # Path and file name output_file_full_path_fig = self.folder + '/' + subfolder + '/' + type + ' Violin Plot.png' - #New figure - #plt.figure + # New figure + # plt.figure plt.clf() - #Init variables + # Init variables v_data=[] v_month=[] v_type=[] for j in range(num_periods): - #Extend lists for monthly var1 + # Extend lists for monthly var1 l_month=["M"+str(j+1) for _ in v_value1_period[j]] l_type=['kW' for _ in v_value1_period[j]] v_data.extend(v_value1_period[j]) v_month.extend(l_month) v_type.extend(l_type) - #Extend lists for monthly var2 + # Extend lists for monthly var2 l_month=["M"+str(j+1) for _ in v_value2_period[j]] l_type=['kVAr' for _ in v_value2_period[j]] v_data.extend(v_value2_period[j]) v_month.extend(l_month) v_type.extend(l_type) - #Extend lists for yearly var1 + # Extend lists for yearly var1 l_month=['Yearly' for _ in v_value1] l_type=['kW' for _ in v_value1] v_data.extend(v_value1) v_month.extend(l_month) v_type.extend(l_type) - #Extend lists for yearly var2 + # Extend lists for yearly var2 l_month=['Yearly' for _ in v_value2] l_type=['kVAr' for _ in v_value2] v_data.extend(v_value2) v_month.extend(l_month) v_type.extend(l_type) - #Show violin plot + # Show violin plot sns.violinplot(x=v_month, y=v_data, hue=v_type, cut=0, split=True) - #Show stripplot (points) (disabled because there are too many points) - #sns.stripplot(x=v_month, y=v_data, hue=v_type, color="k", alpha=0.8) - #Set x,y lables + # Show stripplot (points) (disabled because there are too many points) + # sns.stripplot(x=v_month, y=v_data, hue=v_type, color="k", alpha=0.8) + # Set x,y lables plt.xlabel('Month') plt.ylabel(type) - #Set y limit + # Set y limit if v_range['display_range']: plt.ylim(v_range['display_range']) - #Save figure to file + # Save figure to file plt.savefig(output_file_full_path_fig, dpi=300) - #Display - #plt.show() + # Display + # plt.show() def plot_duration_curve(self,subfolder, v1_yearly,v2_yearly,b_losses): """Make a figure with the duration curve (yearly losses or load)""" - #New figure - #plt.figure + # New figure + # plt.figure plt.clf() - #Display variable 1 + # Display variable 1 plt.plot(sorted(v1_yearly,reverse=True)) - #Display variable 1 + # Display variable 1 plt.plot(sorted(v2_yearly,reverse=True)) - #If displaying losses + # If displaying losses if b_losses: - #Plot the added curve (lines + transformers) + # Plot the added curve (lines + transformers) plt.plot(sorted(np.add(v1_yearly,v2_yearly),reverse=True)) - #Set file path + name + # Set file path + name output_file_full_path_fig = self.folder + '/' + subfolder + '/' + 'Losses' + '.png' - #Set legend + # Set legend plt.legend(['Substation losses','Line losses','Total losses']) - #Set y label + # Set y label plt.ylabel('Losses (kWh)') - else: #If displaying load - #Set file path + name + else: # If displaying load + # Set file path + name output_file_full_path_fig = self.folder + '/' + subfolder + '/' + 'Load' + '.png' - #Set legend + # Set legend plt.legend(['kW','kVAr']) - #Set y label + # Set y label plt.ylabel('Load') - #Set x label + # Set x label plt.xlabel('Hour (h)') - #Save figure to file + # Save figure to file plt.savefig(output_file_full_path_fig) - #Display - #plt.show() + # Display + # plt.show() def add_edges(self,graph,edges): """Add edges to the graph""" - #Populate it with the edges + # Populate it with the edges for idx,element in enumerate(edges): graph.add_edges_from([(element[0],element[1])]) return graph def get_locations(self,graph,bus,locations=[],x_location_max_prev=0,parent=None,level=0,visited_buses=[]): """Get the locations of the buses in the graph""" - #Add to the list of visited buses + # Add to the list of visited buses if visited_buses: visited_buses.append(bus) else: visited_buses=[bus] - #Obtain the buses connected to this one + # Obtain the buses connected to this one connected_buses = list(graph.neighbors(bus)) - #Explore downstream levels + # Explore downstream levels x_downstream_locations=[] for downstream_bus in connected_buses: - #Remove the terminal from the bus name + # Remove the terminal from the bus name downstream_bus=self.remove_terminal(downstream_bus) - #If the bus was already visited, remove from graph (if activated this would remove loops) - #if downstream_bus!=parent and downstream_bus in visited_buses and graph.has_edge(bus,downstream_bus) and b_remove_loops: - #Remove self loops (possible to happen because of terminals in buses) + # If the bus was already visited, remove from graph (if activated this would remove loops) + # if downstream_bus!=parent and downstream_bus in visited_buses and graph.has_edge(bus,downstream_bus) and b_remove_loops: + # Remove self loops (possible to happen because of terminals in buses) if downstream_bus==bus: graph.remove_edge(bus,downstream_bus) else: - #Explore downstream the graph (recursive search) + # Explore downstream the graph (recursive search) if downstream_bus!=parent and not downstream_bus in visited_buses: x_loc,locations,x_location_max_prev=self.get_locations(graph,downstream_bus,locations,x_location_max_prev,bus,level+1,visited_buses) x_downstream_locations.append(x_loc) - #For the upper levels, it takes the average of the downstream buses + # For the upper levels, it takes the average of the downstream buses if x_downstream_locations: loc=(sum(x_downstream_locations)/len(x_downstream_locations),-level); else: if x_location_max_prev: - #Pick up location from this level or the previous ones - #It is neccesary to sort it, to pick in the above for lev loop the x_next_location from the more downstream level + # Pick up location from this level or the previous ones + # It is neccesary to sort it, to pick in the above for lev loop the x_next_location from the more downstream level x_next_location=x_location_max_prev+1 - #Assign location x, y + # Assign location x, y loc=(x_next_location,-level) else: - #Default position for first bus + # Default position for first bus loc=(1,-level) - #Assign x location of this level + # Assign x location of this level if x_location_max_prev'+self.remove_terminal(edge[1]) else: bus1to2=self.remove_terminal(v_dict_ids_buses[edge[0]])+'-->'+self.remove_terminal(v_dict_ids_buses[edge[1]]) - #Obtain name from bus2 to bus1 + # Obtain name from bus2 to bus1 if not self.b_numeric_ids: bus2to1=self.remove_terminal(edge[1])+'-->'+self.remove_terminal(edge[0]) else: bus2to1=self.remove_terminal(v_dict_ids_buses[edge[1]])+'-->'+self.remove_terminal(v_dict_ids_buses[edge[0]]) - #If bus1 to bus2 is the one that exists in the dictionary + # If bus1 to bus2 is the one that exists in the dictionary if bus1to2 in dict_buses_element: - #Set element name + # Set element name element=dict_buses_element[bus1to2] - #Evaluate number of violations + # Evaluate number of violations dic_num_violations_l[edge]=myopendss_io.get_num_violations(v_dict_loading[element],v_range_loading,element,None) elif bus2to1 in dict_buses_element: #If bus2 to bus1 is the one that exists in the dictionary - #Set element name + # Set element name element=dict_buses_element[bus2to1] - #Evaluate number of violations + # Evaluate number of violations dic_num_violations_l[edge]=myopendss_io.get_num_violations(v_dict_loading[element],v_range_loading,element,None) - else: #If the element does not exist in the dictionary, set number of violations to zero + else: # If the element does not exist in the dictionary, set number of violations to zero dic_num_violations_l[edge]=0 return dic_num_violations_l @@ -378,77 +378,77 @@ def get_dict_num_violations_l(self,graph,dict_buses_element,v_dict_loading,v_ran def plot_graph(self,subfolder,my_closed_edges,my_open_edges,v_dict_voltage,v_range,v_dict_loading,v_range_loading,dict_buses_element,v_dict_buses_ids,v_dict_ids_buses): """Plot a graph with the hierarchical representation of the network""" - #Path and file name + # Path and file name output_file_full_path_fig = self.folder + '/' + subfolder + '/' + 'Network Violations' + '.png' - #New figure - #plt.figure + # New figure + # plt.figure plt.clf() - #Close the previous fig + # Close the previous fig plt.close() - #Create empty graph + # Create empty graph mygraph=nx.Graph() - #Commented graph example - #mygraph.add_edges_from([(1,2), (1,3), (1,4), (1,5), (1,2), (2,6), (6,7), (7,1)]) - #discard,locations=self.get_locations(mygraph,1) - #Populate the graph with the closed edges + # Commented graph example + # mygraph.add_edges_from([(1,2), (1,3), (1,4), (1,5), (1,2), (2,6), (6,7), (7,1)]) + # discard,locations=self.get_locations(mygraph,1) + # Populate the graph with the closed edges mygraph=self.add_edges(mygraph,my_closed_edges) mygraph_only_closed_edges=mygraph.copy() - #Populate the graph with the open edges + # Populate the graph with the open edges mygraph=self.add_edges(mygraph,my_open_edges) - #Get the locations of the buses - #WARNING: Locations are extracter from closed edges. This requires that there are no disconnected buses (e.g. two open switches in series) + # Get the locations of the buses + # WARNING: Locations are extracter from closed edges. This requires that there are no disconnected buses (e.g. two open switches in series) if self.b_numeric_ids: discard,locations,x_location_max_prev=self.get_locations(mygraph_only_closed_edges,str(0)) #function get_all_buses_ids sets slack bus to str(0) else: discard,locations,x_location_max_prev=self.get_locations(mygraph_only_closed_edges,'st_mat') #RNM-US specific (the slack bus of the distribution system is always "st_mat") - #Create colormap + # Create colormap cmap = plt.cm.get_cmap('jet') - #Take subset of colormap to avoid dark colors (with overlap with text) + # Take subset of colormap to avoid dark colors (with overlap with text) cmap = cmap.from_list('trunc({n},{a:.3f},{b:.3f})'.format(n=cmap.name, a=0.15, b=0.75),cmap(np.linspace(0.25, 0.75, 120))) - #Init colormap variable + # Init colormap variable color_map_v=[] - #Get number of voltage valiations + # Get number of voltage valiations dic_num_violations_v=self.get_dict_num_violations_v(mygraph,v_dict_voltage,v_range,v_dict_ids_buses) - #Obtain the maximum number of voltage violations in a bus + # Obtain the maximum number of voltage violations in a bus max_violations_v=max(dic_num_violations_v.values()) - #if no violations, use only one color in the colormap + # if no violations, use only one color in the colormap if max_violations_v==0: cmap_v = cmap.from_list('trunc({n},{a:.3f},{b:.3f})'.format(n=cmap.name, a=0, b=0),cmap(np.linspace(0, 0, 2))) else: cmap_v = cmap - #Creater a colormap (color_map_v) o colour the buses according to their number of violations + # Creater a colormap (color_map_v) o colour the buses according to their number of violations for node in mygraph: - #If there are no violations, set all intensities to zero + # If there are no violations, set all intensities to zero if max_violations_v==0: intensity=0 else: intensity=dic_num_violations_v[node]/max_violations_v - #Add the intensity of the bus to the colormap + # Add the intensity of the bus to the colormap color_map_v.append(intensity) - #Init colormap variables + # Init colormap variables color_map_l_closed=[] color_map_l_open=[] - #Get number of loading valiations + # Get number of loading valiations dic_num_violations_l=self.get_dict_num_violations_l(mygraph,dict_buses_element,v_dict_loading,v_range_loading,v_dict_ids_buses) - #Obtain the maximum number of loading violations in a branch + # Obtain the maximum number of loading violations in a branch max_violations_l=max(dic_num_violations_l.values()) - #if no violations, use only one color in the colormap + # if no violations, use only one color in the colormap if max_violations_l==0: cmap_l = cmap.from_list('trunc({n},{a:.3f},{b:.3f})'.format(n=cmap.name, a=0, b=0.01),cmap(np.linspace(0, 0.01, 2))) else: cmap_l = cmap - #Creater a colormap (color_map_l) o colour the closed branches according to their number of violations + # Creater a colormap (color_map_l) o colour the closed branches according to their number of violations for edge in mygraph_only_closed_edges.edges(): - #If there are no violations, set all intensities to zero + # If there are no violations, set all intensities to zero if max_violations_l==0: intensity=0 else: intensity=dic_num_violations_l[edge]/max_violations_l - #Add the intensity of the branch to the colormap + # Add the intensity of the branch to the colormap color_map_l_closed.append(intensity) - #Creater a colormap for the open branches + # Creater a colormap for the open branches for edge in mygraph.edges(): - #Add the intensity of the branch to the colormap + # Add the intensity of the branch to the colormap if not edge in mygraph_only_closed_edges.edges(): color_map_l_open.append(0) #As it is a different graph, order may be different, but it does not matter because they are all zero #Obtain min and max of x locations @@ -459,23 +459,22 @@ def plot_graph(self,subfolder,my_closed_edges,my_open_edges,v_dict_voltage,v_ran max_x=locations[name][0] if (max_y<-locations[name][1]): max_y=-locations[name][1] - #Define the size of the figure + # Define the size of the figure unitary_size=0.5 ratio=16/9 maximum=max(max_x,max_y)*unitary_size if (maximum>40): maximum=40 plt.figure(figsize=(maximum*ratio,maximum)) - #Set transparency parameter + # Set transparency parameter myalpha=0.6 - #Draw the nodes + # Draw the nodes nodes = nx.draw_networkx_nodes(mygraph, pos=locations, node_color=color_map_v, cmap=cmap_v,alpha=myalpha) - #Draw the closed edges (solid lines) + # Draw the closed edges (solid lines) edges=nx.draw_networkx_edges(mygraph_only_closed_edges,pos=locations, edge_color=color_map_l_closed,width=4,edge_cmap=cmap_l,alpha=myalpha) - #Show the buses names - #nx.draw_networkx_labels(mygraph, pos=locations) + # Show the buses names nx.draw_networkx_labels(mygraph, pos=locations,font_size=8) - #Make the ticks, lables, and colorbar + # Make the ticks, lables, and colorbar num_ticks_v=5 ticks_v = np.linspace(0, 1, num_ticks_v) labels_v = np.linspace(0, max_violations_v, num_ticks_v) @@ -490,17 +489,17 @@ def plot_graph(self,subfolder,my_closed_edges,my_open_edges,v_dict_voltage,v_ran cbar.ax.set_yticklabels(["{:4.2f}".format(i) for i in labels_l]) # add the labels cbar.set_label("Thermal limit violations (h)", fontsize=10, y=0.5, rotation=90) cbar.ax.yaxis.set_label_position('left') - #Draw the open edges (dashed lines) + # Draw the open edges (dashed lines) edges=nx.draw_networkx_edges(mygraph,edgelist=my_open_edges,pos=locations, edge_color=color_map_l_open,width=4,edge_cmap=cmap_l,style='--',alpha=myalpha) - #Don't display the axis in the figure + # Don't display the axis in the figure plt.axis('off') - #Maximize figure + # Maximize figure wm = plt.get_current_fig_manager() - wm.window.state('zoomed') - #Save the figure to file - plt.savefig(output_file_full_path_fig, dpi=300) - #Display - plt.show() - - + # the following line doesn't work on mac, comment + # wm.window.state('zoomed') + # Save the figure to file + plt.savefig(output_file_full_path_fig, dpi=300) + # Display + # the following line hangs the process, comment + # plt.show() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3c9c438 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +# python dependencies for RNM validation module +opendssdirect.py>=0.6.1 +pandas>=1.2.5 +matplotlib>=3.6.0 +networkx +seaborn +plotly +shapely +geopandas \ No newline at end of file From b7a1823acf73af6759feca2f08e5784dae5054d6 Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Wed, 19 Oct 2022 19:35:23 -0600 Subject: [PATCH 18/62] adding rake task to test CLI functionality --- Rakefile | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Rakefile b/Rakefile index b6a764a..d7fe93e 100644 --- a/Rakefile +++ b/Rakefile @@ -148,6 +148,29 @@ task :run_simulation, [:scenario_csv_path, :reopt, :use_localhost] do |t, args| puts '...done!' end +# Full Runner workflow (mimics UO CLI functionality) +# pass in the path to the scenario csv, geojson path, whether this is a reopt analysis (true/false), and whether to use localhost RNM API (true/false) +desc 'Full Runner workflow' +task :full_runner_workflow, [:scenario_csv_path, :geojson_path, :reopt, :use_localhost] do |t, args| + # todo: could allow passing in extended catalog, average peak catalog, and opendss_catalog flags too + # if no path passed in, use default: + scenario_csv = args[:scenario_csv_path] || 'spec/test/example_project/run/baseline_scenario' + geojson_path = args[:geojson_path] || 'spec/test/example_project/example_project_with_network_and_streets' + root_dir, scenario_file_name = File.split(File.expand_path(scenario_csv)) + scenario_name = File.basename(scenario_file_name, File.extname(scenario_file_name)) + run_dir = File.join(root_dir, 'run', scenario_name.downcase) + reopt = args[:reopt] || false + reopt = reopt == 'true' + use_local = args[:use_localhost] || false + + runner = URBANopt::RNM::Runner.new(scenario_name, run_dir, scenario_csv, geojson_path, reopt: reopt) + runner.create_simulation_files + runner.run(use_local) + runner.post_process + + puts '...done!' +end + # Create opendss catalog from extended catalog # pass in the path and filename where the OpenDSS catalog should be saved desc 'Create OpenDSS catalog' From f1f2a1a21430febd861a8b766338b92471c7c954 Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Thu, 20 Oct 2022 10:43:01 -0600 Subject: [PATCH 19/62] restore functionality for non-mac users --- lib/urbanopt/rnm/validation/plot_lib.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/urbanopt/rnm/validation/plot_lib.py b/lib/urbanopt/rnm/validation/plot_lib.py index a95cead..f29ed8b 100644 --- a/lib/urbanopt/rnm/validation/plot_lib.py +++ b/lib/urbanopt/rnm/validation/plot_lib.py @@ -495,11 +495,13 @@ def plot_graph(self,subfolder,my_closed_edges,my_open_edges,v_dict_voltage,v_ran plt.axis('off') # Maximize figure wm = plt.get_current_fig_manager() - # the following line doesn't work on mac, comment - # wm.window.state('zoomed') + backend_name = plt.get_backend() + # this won't work on mac but should work on windows? + # macosx does not have a "window" attribute + if backend_name.lower() != 'macosx': + wm.window.state('zoomed') # Save the figure to file plt.savefig(output_file_full_path_fig, dpi=300) # Display - # the following line hangs the process, comment - # plt.show() + plt.show() From cd47bffdeb4e65d5bdc4d05190f15b454a30b7ad Mon Sep 17 00:00:00 2001 From: cmateo Date: Fri, 21 Oct 2022 15:26:15 +0200 Subject: [PATCH 20/62] Plotting the figure that holds the process at the very end of the validation module --- lib/urbanopt/rnm/validation/main_validation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/urbanopt/rnm/validation/main_validation.py b/lib/urbanopt/rnm/validation/main_validation.py index 1520f6a..772f2c5 100644 --- a/lib/urbanopt/rnm/validation/main_validation.py +++ b/lib/urbanopt/rnm/validation/main_validation.py @@ -128,11 +128,11 @@ def main_validation(self): #Equipment parameters myplot_lib.plot_violin('Equipment/Figures','Power Line - Normal Amps (A)',v_lines_norm_amps,v_range_show_all) myplot_lib.plot_violin('Equipment/Figures','Transformer (kVA)',v_transformers_kva,v_range_show_all) - #Hierarchical representation of the network - myplot_lib.plot_graph('Network/Figures',closed_edges,open_edges,v_dict_voltage,v_range_voltage,v_dict_loading,v_range_loading,dict_buses_element,v_dict_buses_ids,v_dict_ids_buses) #Summary operational report myreport=report.Report(folder,self.b_numeric_ids) myreport.write_summary_operational_report('Summary',v_dict_voltage,v_range_voltage,v_dict_unbalance,v_range_unbalance,v_dict_loading,v_range_loading,v_dict_loads) + #Hierarchical representation of the network + myplot_lib.plot_graph('Network/Figures',closed_edges,open_edges,v_dict_voltage,v_range_voltage,v_dict_loading,v_range_loading,dict_buses_element,v_dict_buses_ids,v_dict_ids_buses) #def main_validation(folder): #Example: uncomment to make the script run from a function From f6f740006d8dafc96c9d0ba5f39d0823dff17059 Mon Sep 17 00:00:00 2001 From: cmateo Date: Thu, 3 Nov 2022 16:45:37 +0100 Subject: [PATCH 21/62] Timestamp included in gem, RNM-US, validation module --- lib/urbanopt/rnm/consumers.rb | 16 ++- lib/urbanopt/rnm/input_files.rb | 18 +++ lib/urbanopt/rnm/prosumers.rb | 18 ++- .../rnm/validation/main_validation.py | 48 ++++--- .../rnm/validation/opendss_interface.py | 75 +++++++--- lib/urbanopt/rnm/validation/plot_lib.py | 133 ++++++++++-------- 6 files changed, 206 insertions(+), 102 deletions(-) diff --git a/lib/urbanopt/rnm/consumers.rb b/lib/urbanopt/rnm/consumers.rb index f8b82c4..c6ba3b7 100644 --- a/lib/urbanopt/rnm/consumers.rb +++ b/lib/urbanopt/rnm/consumers.rb @@ -45,7 +45,7 @@ module URBANopt module RNM class Consumers - attr_accessor :customers, :customers_ext, :profile_customer_p, :profile_customer_q, :profile_customer_p_ext, :profile_customer_q_ext, :power_factor + attr_accessor :customers, :customers_ext, :profile_customer_p, :profile_customer_q, :profile_customer_p_ext, :profile_customer_q_ext, :power_factor, :profile_date_time, :profile_date_time_ext # initializing all the attributes to build the inputs files required by the RNM-US model def initialize(reopt, only_lv_consumers = false, max_num_lv_nodes, average_building_peak_catalog_path, lv_limit) @@ -55,8 +55,10 @@ def initialize(reopt, only_lv_consumers = false, max_num_lv_nodes, average_build @max_num_lv_nodes = max_num_lv_nodes @customers = [] @customers_ext = [] + @profile_date_time = [] @profile_customer_p = [] @profile_customer_q = [] + @profile_date_time_ext = [] @profile_customer_p_ext = [] @profile_customer_q_ext = [] @power_factor = power_factor @@ -73,8 +75,10 @@ def initialize(reopt, only_lv_consumers = false, max_num_lv_nodes, average_build # while the 2nd option is run in case "only LV" set to false and the consumption for each building will be placed in a single node def construct_consumer(profiles, single_values, building_map, building_nodes, height, users, folder) if @only_lv_consumers + planning_date_time = [] planning_profile_node_active = [] planning_profile_node_reactive = [] + yearly_date_time = [] yearly_profile_node_active = [] yearly_profile_node_reactive = [] nodes_per_bldg, area, medium_voltage = av_peak_cons_per_building_type(folder['building_types']) @@ -106,19 +110,23 @@ def construct_consumer(profiles, single_values, building_map, building_nodes, he else voltage_default, phases = voltage_values(peak_active_power_cons / @power_factor) end - + for k in 0..profiles[:planning_profile_cust_active].length - 1 + planning_date_time[k]=profiles[:planning_date_time][k] planning_profile_node_active[k] = ((profiles[:planning_profile_cust_active][k]) / nodes_per_bldg).round(2) planning_profile_node_reactive[k] = ((profiles[:planning_profile_cust_reactive][k]) / nodes_per_bldg).round(2) end for k in 0..profiles[:yearly_profile_cust_active].length - 1 + yearly_date_time[k]=profiles[:yearly_date_time][k] yearly_profile_node_active[k] = ((profiles[:yearly_profile_cust_active][k]) / nodes_per_bldg).round(2) yearly_profile_node_reactive[k] = ((profiles[:yearly_profile_cust_reactive][k]) / nodes_per_bldg).round(2) end @customers.push([coordinates, voltage_default, peak_active_power_cons, peak_reactive_power_cons, phases]) @customers_ext.push([coordinates, voltage_default, peak_active_power_cons, peak_reactive_power_cons, phases, area, height, (single_values[:energy] / nodes_per_bldg).round(2), peak_active_power_cons, peak_reactive_power_cons, users]) + @profile_date_time.push([planning_date_time]) @profile_customer_q.push([id, 24, planning_profile_node_reactive]) @profile_customer_p.push([id, 24, planning_profile_node_active]) + @profile_date_time_ext.push([yearly_date_time]) @profile_customer_p_ext.push([id, 8760, yearly_profile_node_active]) @profile_customer_q_ext.push([id, 8760, yearly_profile_node_reactive]) @@ -131,8 +139,10 @@ def construct_consumer(profiles, single_values, building_map, building_nodes, he voltage_default, phases = voltage_values(single_values[:peak_active_power_cons] / @power_factor * 0.9) # applying safety factor @customers.push([building_map, voltage_default, single_values[:peak_active_power_cons], single_values[:peak_reactive_power_cons], phases]) @customers_ext.push([building_map, voltage_default, single_values[:peak_active_power_cons], single_values[:peak_reactive_power_cons], phases, area, height, (single_values[:energy]).round(2), single_values[:peak_active_power_cons], single_values[:peak_reactive_power_cons], users]) + @profile_date_time.push([profiles[:planning_date_time]]) @profile_customer_q.push([id, 24, profiles[:planning_profile_cust_reactive]]) @profile_customer_p.push([id, 24, profiles[:planning_profile_cust_active]]) + @profile_date_time_ext.push([profiles[:yearly_date_time]]) @profile_customer_p_ext.push([id, 8760, profiles[:yearly_profile_cust_active]]) @profile_customer_q_ext.push([id, 8760, profiles[:yearly_profile_cust_reactive]]) end @@ -234,10 +244,12 @@ def customer_files_load(csv_feature_report, json_feature_report, building_map, b # content = CSV.foreach(csv_feature_report, headers: true) do |power| CSV.foreach(csv_feature_report, headers: true) do |power| @power_factor = power['Electricity:Facility Power(kW)'].to_f / power['Electricity:Facility Apparent Power(kVA)'].to_f + profiles[:yearly_date_time].push(power['Datetime']) profiles[:yearly_profile_cust_active].push(power['Electricity:Facility Power(kW)'].to_f) profiles[:yearly_profile_cust_reactive].push(profiles[:yearly_profile_cust_active][k] * Math.tan(Math.acos(@power_factor))) single_values[:energy] += power['REopt:Electricity:Load:Total(kw)'].to_f # calculating the yearly energy consumed by each feature if k >= profile_start_max && k <= profile_start_max + hours + profiles[:planning_date_time].push(power['Datetime']) profiles[:planning_profile_cust_active].push(power['Electricity:Facility Power(kW)'].to_f) if power['Electricity:Facility Power(kW)'].to_f > single_values[:peak_active_power_cons] single_values[:peak_active_power_cons] = power['Electricity:Facility Power(kW)'].to_f diff --git a/lib/urbanopt/rnm/input_files.rb b/lib/urbanopt/rnm/input_files.rb index c3b8857..bb5401d 100644 --- a/lib/urbanopt/rnm/input_files.rb +++ b/lib/urbanopt/rnm/input_files.rb @@ -258,6 +258,10 @@ def create File.open(File.join(@run_dir, @rnm_dirname, 'customers_ext.txt'), 'w+') do |g| g.puts(prosumers.customers_ext.map { |w| w.join(';') }) end + File.open(File.join(@run_dir, @rnm_dirname, 'timestamps.csv'), 'w+') do |g| + g.puts("Datetime\n") + g.puts(prosumers.profile_date_time[0].map { |w| w.join("\n") }) + end File.open(File.join(@run_dir, @rnm_dirname, 'cust_profile_p.txt'), 'w+') do |g| g.puts(prosumers.profile_customer_p.map { |w| w.join(';') }) end @@ -267,6 +271,10 @@ def create # CSV.open(File.join(@run_dir, @rnm_dirname, "cust_profile_q_extendido.csv"), "w") do |csv| # csv << [prosumers.profile_customer_q_ext] # end + File.open(File.join(@run_dir, @rnm_dirname, 'timestamps_extendido.csv'), 'w+') do |g| + g.puts("Datetime\n") + g.puts(prosumers.profile_date_time_ext[0].map { |w| w.join("\n") }) + end File.open(File.join(@run_dir, @rnm_dirname, 'cust_profile_q_extendido.txt'), 'w+') do |g| g.puts(prosumers.profile_customer_q_ext.map { |w| w.join(';') }) end @@ -289,6 +297,7 @@ def create File.open(File.join(@run_dir, @rnm_dirname, 'gen_profile_p_extendido.txt'), 'w+') do |g| g.puts(prosumers.profile_dg_p_extended.map { |w| w.join(';') }) end + ficheros_entrada_inc.push('Timestamps;timestamps.csv;timestamps_extendido.csv') ficheros_entrada_inc.push('CClienteGreenfield;customers_ext.txt;cust_profile_p.txt;cust_profile_q.txt;cust_profile_p_extendido.txt;cust_profile_q_extendido.txt') ficheros_entrada_inc.push('CGeneradorGreenfield;generators.txt;gen_profile_p.txt;gen_profile_q.txt;gen_profile_p_extendido.txt;gen_profile_q_extendido.txt') ficheros_entrada_inc.push('END') @@ -302,18 +311,27 @@ def create File.open(File.join(@run_dir, @rnm_dirname, 'customers_ext.txt'), 'w+') do |g| g.puts(consumers.customers_ext.map { |w| w.join(';') }) end + File.open(File.join(@run_dir, @rnm_dirname, 'timestamps.csv'), 'w+') do |g| + g.puts("Datetime\n") + g.puts(consumers.profile_date_time[0].map { |w| w.join("\n") }) + end File.open(File.join(@run_dir, @rnm_dirname, 'cust_profile_p.txt'), 'w+') do |g| g.puts(consumers.profile_customer_p.map { |w| w.join(';') }) end File.open(File.join(@run_dir, @rnm_dirname, 'cust_profile_q.txt'), 'w+') do |g| g.puts(consumers.profile_customer_q.map { |w| w.join(';') }) end + File.open(File.join(@run_dir, @rnm_dirname, 'timestamps_extendido.csv'), 'w+') do |g| + g.puts("Datetime\n") + g.puts(consumers.profile_date_time_ext[0].map { |w| w.join("\n") }) + end File.open(File.join(@run_dir, @rnm_dirname, 'cust_profile_q_extendido.txt'), 'w+') do |g| g.puts(consumers.profile_customer_q_ext.map { |w| w.join(';') }) end File.open(File.join(@run_dir, @rnm_dirname, 'cust_profile_p_extendido.txt'), 'w+') do |g| g.puts(consumers.profile_customer_p_ext.map { |w| w.join(';') }) end + ficheros_entrada_inc.push('Timestamps;timestamps.csv;timestamps_extendido.csv') ficheros_entrada_inc.push('CClienteGreenfield;customers_ext.txt;cust_profile_p.txt;cust_profile_q.txt;cust_profile_p_extendido.txt;cust_profile_q_extendido.txt') ficheros_entrada_inc.push('END') File.open(File.join(@run_dir, @rnm_dirname, 'ficheros_entrada_inc.txt'), 'w+') do |g| diff --git a/lib/urbanopt/rnm/prosumers.rb b/lib/urbanopt/rnm/prosumers.rb index 07f1ad0..3020896 100644 --- a/lib/urbanopt/rnm/prosumers.rb +++ b/lib/urbanopt/rnm/prosumers.rb @@ -45,7 +45,7 @@ module RNM # creating a class that creates the consumers input required by the RNM-US model, # according to their geographic location, energy consumption and peak demand, and power consumption profiles class Prosumers - attr_accessor :customers, :customers_ext, :profile_customer_p, :profile_customer_q, :profile_customer_p_ext, :profile_customer_q_ext, :dg, :dg_profile_p, :dg_profile_q, :profile_dg_p_extended, :profile_dg_q_extended, :power_factor + attr_accessor :customers, :customers_ext, :profile_customer_p, :profile_customer_q, :profile_customer_p_ext, :profile_customer_q_ext, :dg, :dg_profile_p, :dg_profile_q, :profile_dg_p_extended, :profile_dg_q_extended, :power_factor, :profile_date_time, :profile_date_time_ext # initializing all the attributes to build the inputs files required by the RNM-US model def initialize(reopt, only_lv_consumers = false, max_num_lv_nodes, average_building_peak_catalog_path, lv_limit) @@ -55,8 +55,10 @@ def initialize(reopt, only_lv_consumers = false, max_num_lv_nodes, average_build @max_num_lv_nodes = max_num_lv_nodes @customers = [] @customers_ext = [] + @profile_date_time = [] @profile_customer_p = [] @profile_customer_q = [] + @profile_date_time_ext = [] @profile_customer_p_ext = [] @profile_customer_q_ext = [] @dg = [] @@ -99,16 +101,20 @@ def construct_prosumer_general(profiles, profiles_planning, single_values, build end @customers.push([building_map, id, voltage_default, single_values[:peak_active_power_cons], single_values[:peak_reactive_power_cons], phases]) @customers_ext.push([building_map, id, voltage_default, single_values[:peak_active_power_cons], single_values[:peak_reactive_power_cons], phases, area, height, (single_values[:energy]).round(2), single_values[:peak_active_power_cons], single_values[:peak_reactive_power_cons], users]) + @profile_date_time.push([profiles_planning[:planning_date_time]]) @profile_customer_q.push([id, 48, profiles_planning[:planning_profile_cust_reactive]]) @profile_customer_p.push([id, 48, profiles_planning[:planning_profile_cust_active]]) + @profile_date_time_ext.push([profiles[:yearly_date_time]]) @profile_customer_p_ext.push([id, 8760, profiles[:yearly_profile_cust_active]]) @profile_customer_q_ext.push([id, 8760, profiles[:yearly_profile_cust_reactive]]) if !der_capacity[:storage].nil? && der_capacity[:storage] > 0 @customers.push([building_map, id_batt, voltage_default, single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], phases]) @customers_ext.push([building_map, id_batt, voltage_default, single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], phases, area, height, (single_values[:energy]).round(2), single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], users]) + @profile_date_time.push([profiles_planning[:planning_date_time]]) @profile_customer_q.push([id_batt, 48, profiles_planning[:planning_profile_storage_reactive]]) @profile_customer_p.push([id_batt, 48, profiles_planning[:planning_profile_storage_active]]) + @profile_date_time_ext.push([profiles[:yearly_date_time]]) @profile_customer_p_ext.push([id_batt, 8760, profiles[:yearly_profile_storage_active]]) @profile_customer_q_ext.push([id_batt, 8760, profiles[:yearly_profile_storage_reactive]]) end @@ -129,8 +135,10 @@ def construct_prosumer_general(profiles, profiles_planning, single_values, build # among the nodes of each building def construct_prosumer_lv(nodes_per_bldg = 0, profiles, profiles_planning, single_values, building_map, building_nodes, area, height, users, der_capacity) # the default variables are defined (i.e. type and rurality type) + planning_date_time = [] planning_profile_node_active = [] planning_profile_node_reactive = [] + yearly_date_time = [] yearly_profile_node_active = [] yearly_profile_node_reactive = [] closest_node = building_map[3].split('_')[1].to_i # refers to the closest node of the building in consideration to the street @@ -159,17 +167,21 @@ def construct_prosumer_lv(nodes_per_bldg = 0, profiles, profiles_planning, singl peak_reactive_power_cons = (single_values[:peak_reactive_power_cons] / nodes_consumers).round(2) voltage_default, phases = voltage_values(peak_active_power_cons / @power_factor) for k in 0..profiles_planning[:planning_profile_cust_active].length - 1 + planning_date_time[k]=profiles_planning[:planning_date_time][k] planning_profile_node_active[k] = (profiles_planning[:planning_profile_cust_active][k] / nodes_consumers).round(2) planning_profile_node_reactive[k] = (profiles_planning[:planning_profile_cust_reactive][k] / nodes_consumers).round(2) end for k in 0..profiles[:yearly_profile_cust_active].length - 1 + yearly_date_time[k]=profiles[:yearly_date_time][k] yearly_profile_node_active[k] = (profiles[:yearly_profile_cust_active][k] / nodes_consumers).round(2) yearly_profile_node_reactive[k] = (profiles[:yearly_profile_cust_reactive][k] / nodes_consumers).round(2) end @customers.push([coordinates, id, voltage_default, peak_active_power_cons, peak_reactive_power_cons, phases]) @customers_ext.push([coordinates, id, voltage_default, peak_active_power_cons, peak_reactive_power_cons, phases, area, height, (single_values[:energy] / nodes_consumers).round(2), peak_active_power_cons, peak_reactive_power_cons, users]) + @profile_date_time.push([planning_date_time]) @profile_customer_q.push([id, 48, planning_profile_node_reactive]) @profile_customer_p.push([id, 48, planning_profile_node_active]) + @profile_date_time_ext.push([yearly_date_time]) @profile_customer_p_ext.push([id, 8760, yearly_profile_node_active]) @profile_customer_q_ext.push([id, 8760, yearly_profile_node_reactive]) else @@ -186,8 +198,10 @@ def construct_prosumer_lv(nodes_per_bldg = 0, profiles, profiles_planning, singl if !der_capacity[:storage].nil? && der_capacity[:storage] > 0 @customers.push([coordinates, id_batt, voltage_default, single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], phases]) @customers_ext.push([coordinates, id_batt, voltage_default, single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], phases, area, height, (single_values[:energy]).round(2), single_values[:peak_active_power_storage], single_values[:peak_reactive_power_storage], users]) + @profile_date_time.push([profiles[:planning_date_time]]) @profile_customer_q.push([id_batt, 48, profiles_planning[:planning_profile_storage_reactive]]) @profile_customer_p.push([id_batt, 48, profiles_planning[:planning_profile_storage_active]]) + @profile_date_time_ext.push([profiles[:yearly_date_time]]) @profile_customer_p_ext.push([id_batt, 8760, profiles[:yearly_profile_storage_active]]) @profile_customer_q_ext.push([id_batt, 8760, profiles[:yearly_profile_storage_reactive]]) end @@ -285,6 +299,7 @@ def av_peak_cons_per_building_type(feature_file) # method to order profiles consistently def profiles_planning_creation(profiles_planning, power, single_values, i, hours, power_factor) + profiles_planning[:planning_date_time][i]=power['Datetime'] profiles_planning[:planning_profile_cust_active][i] = power['REopt:Electricity:Load:Total(kw)'].to_f profiles_planning[:planning_profile_storage_active][i] = power['REopt:Electricity:Grid:ToBattery(kw)'].to_f + power['REopt:ElectricityProduced:Generator:ToBattery(kw)'].to_f + power['REopt:ElectricityProduced:PV:ToBattery(kw)'].to_f + power['REopt:ElectricityProduced:Wind:ToBattery(kw)'].to_f - power['REopt:Electricity:Storage:ToLoad(kw)'].to_f - power['REopt:Electricity:Storage:ToGrid(kw)'].to_f profiles_planning[:planning_profile_dg_active][i] = power['REopt:ElectricityProduced:Total(kw)'].to_f @@ -341,6 +356,7 @@ def prosumer_files_load(csv_feature_report, json_feature_report, building_map, b max_peak = 0 CSV.foreach(csv_feature_report, headers: true) do |power| @power_factor = power['Electricity:Facility Power(kW)'].to_f / power['Electricity:Facility Apparent Power(kVA)'].to_f + profiles[:yearly_date_time].push(power['Datetime']) profiles[:yearly_profile_cust_active].push(power['REopt:Electricity:Load:Total(kw)'].to_f) profiles[:yearly_profile_cust_reactive].push(profiles[:yearly_profile_cust_active][k] * Math.tan(Math.acos(@power_factor))) profiles[:yearly_profile_dg_active].push(power['REopt:ElectricityProduced:Total(kw)'].to_f) diff --git a/lib/urbanopt/rnm/validation/main_validation.py b/lib/urbanopt/rnm/validation/main_validation.py index 772f2c5..6fec749 100644 --- a/lib/urbanopt/rnm/validation/main_validation.py +++ b/lib/urbanopt/rnm/validation/main_validation.py @@ -10,6 +10,7 @@ import report import os + class Validation: def __init__(self, folder,sb_numeric_ids): """Initialices the folder variables""" @@ -76,9 +77,13 @@ def main_validation(self): """Carries out the whole validation of the distribution system""" #Path and file name master_file_full_path = self.main_folder + '/dss_files/' + 'Master.dss' #Path for the Master file - start_index = 0 #Default initial index (needed to run OpenDSS) - num_periods=12 #Number of periods (12 months) - end_index = 8760 #Default final index, 1 year, 8760h (needed to run OpenDSS) + #Number of periods (always 12 months) + num_periods=12 + #Start and end index + #Define only to simulate only a subset of hours + #Set to None to use all timestamps + start_index = None #Default initial index (0/None) + end_index = None #Default final index, 1 year, 8760h (8760/None) #Create sub-folders self.make_dirs() @@ -86,7 +91,8 @@ def main_validation(self): v_range_voltage,v_range_loading,v_range_unbalance,v_range_show_all=self.define_ranges() #For tests - #end_index = 24 #Simulate few hours (still broken down in 12 periods) + #start_index = 2000 #Default initial index + #end_index = 4000 #Simulate few hours (still broken down in 12 periods/months) #v_range_voltage['allowed_range']=(0.975, 1.025) #More stringent limmits than the standard ones to show violations #v_range_loading['allowed_range']=(0,0.3) #v_range_unbalance['allowed_range']=(0, 4e-5) @@ -94,16 +100,16 @@ def main_validation(self): #Run power flow iteratively and obtain the results myopendss_io=opendss_interface.OpenDSS_Interface(folder,self.b_numeric_ids) - v_dict_buses_ids,v_dict_ids_buses,v_dict_voltage,v_voltage_yearly,v_voltage_period,v_power_yearly,v_power_period,v_dict_loading,v_loading_yearly,v_loading_period,v_dict_losses,v_subs_losses_yearly,v_line_losses_yearly,dict_buses_element,v_dict_loads,v_loads_kw_yearly,v_loads_kw_period,v_loads_kvar_yearly,v_loads_kvar_period,v_total_load_kw_yearly,v_total_load_kvar_yearly, v_loads_kw, v_loads_kvar, v_dict_unbalance,v_unbalance_yearly,v_unbalance_period,dict_lines,v_lines_norm_amps,dict_transformers,v_transformers_kva=myopendss_io.solve_powerflow_iteratively(num_periods,start_index,end_index,master_file_full_path,v_range_voltage,v_range_loading,v_range_unbalance) + v_dict_buses_ids,v_dict_ids_buses,v_dict_voltage,v_voltage_yearly,v_voltage_period,v_power_yearly,v_power_period,v_dict_loading,v_loading_yearly,v_loading_period,v_dict_losses,v_subs_losses_yearly,v_line_losses_yearly,dict_buses_element,v_dict_loads,v_loads_kw_yearly,v_loads_kw_period,v_loads_kvar_yearly,v_loads_kvar_period,v_total_load_kw_yearly,v_total_load_kvar_yearly, v_loads_kw, v_loads_kvar, v_dict_unbalance,v_unbalance_yearly,v_unbalance_period,dict_lines,v_lines_norm_amps,dict_transformers,v_transformers_kva,timestamps,v_months,v_hours=myopendss_io.solve_powerflow_iteratively(num_periods,start_index,end_index,master_file_full_path,v_range_voltage,v_range_loading,v_range_unbalance) #Save voltage, unbalance, loading and losses results in CSV files - myopendss_io.write_dict('Voltage/CSV',v_dict_voltage,v_range_show_all,'Voltages (p.u.)','Buses',v_dict_buses_ids) - myopendss_io.write_dict('Voltage/CSV',v_dict_voltage,v_range_voltage,'Voltage Violations (p.u.)','Buses',v_dict_buses_ids) - myopendss_io.write_dict('Unbalance/CSV',v_dict_unbalance,v_range_show_all,'Unbalance (p.u.)','Buses',v_dict_buses_ids) - myopendss_io.write_dict('Unbalance/CSV',v_dict_unbalance,v_range_unbalance,'Unbalance Violations (p.u.)','Buses',v_dict_buses_ids) - myopendss_io.write_dict('Loading/CSV',v_dict_loading,v_range_show_all,'Loading (p.u.)','Branches',None) - myopendss_io.write_dict('Loading/CSV',v_dict_loading,v_range_loading,'Loading Violations (p.u.)','Branches',None) - myopendss_io.write_dict('losses/CSV',v_dict_losses,v_range_show_all,'Losses','Branches',None) + myopendss_io.write_dict('Voltage/CSV',v_dict_voltage,v_range_show_all,'Voltages (p.u.)','Buses',v_dict_buses_ids,timestamps,v_hours) + myopendss_io.write_dict('Voltage/CSV',v_dict_voltage,v_range_voltage,'Voltage Violations (p.u.)','Buses',v_dict_buses_ids,timestamps,v_hours) + myopendss_io.write_dict('Unbalance/CSV',v_dict_unbalance,v_range_show_all,'Unbalance (p.u.)','Buses',v_dict_buses_ids,timestamps,v_hours) + myopendss_io.write_dict('Unbalance/CSV',v_dict_unbalance,v_range_unbalance,'Unbalance Violations (p.u.)','Buses',v_dict_buses_ids,timestamps,v_hours) + myopendss_io.write_dict('Loading/CSV',v_dict_loading,v_range_show_all,'Loading (p.u.)','Branches',None,timestamps,v_hours) + myopendss_io.write_dict('Loading/CSV',v_dict_loading,v_range_loading,'Loading Violations (p.u.)','Branches',None,timestamps,v_hours) + myopendss_io.write_dict('losses/CSV',v_dict_losses,v_range_show_all,'Losses','Branches',None,timestamps,v_hours) if self.b_numeric_ids: myopendss_io.write_id_dict('Network/Figures','IDs_Buses',v_dict_buses_ids) #Get the edges of the network (for later making a hierarchical representation of the network) @@ -111,20 +117,20 @@ def main_validation(self): #Plot all the figures myplot_lib=plot_lib.Plot_Lib(folder,self.b_numeric_ids) #Voltage - myplot_lib.plot_hist('Voltage','Voltage (p.u.)',v_voltage_yearly,v_voltage_period,v_range_voltage,num_periods,40) - myplot_lib.plot_violin_monthly('Voltage/Figures','Voltage (p.u.)',v_voltage_yearly,v_voltage_period,v_range_voltage,num_periods) + myplot_lib.plot_hist('Voltage','Voltage (p.u.)',v_voltage_yearly,v_voltage_period,v_range_voltage,num_periods,40,v_months) + myplot_lib.plot_violin_monthly('Voltage/Figures','Voltage (p.u.)',v_voltage_yearly,v_voltage_period,v_range_voltage,num_periods,v_months) #Unbalance - myplot_lib.plot_hist('Unbalance','Unbalance (p.u.)',v_unbalance_yearly,v_unbalance_period,v_range_unbalance,num_periods,40) - myplot_lib.plot_violin_monthly('Unbalance/Figures','Unbalance (p.u.)',v_unbalance_yearly,v_unbalance_period,v_range_unbalance,num_periods) + myplot_lib.plot_hist('Unbalance','Unbalance (p.u.)',v_unbalance_yearly,v_unbalance_period,v_range_unbalance,num_periods,40,v_months) + myplot_lib.plot_violin_monthly('Unbalance/Figures','Unbalance (p.u.)',v_unbalance_yearly,v_unbalance_period,v_range_unbalance,num_periods,v_months) #Loading - myplot_lib.plot_hist('Loading','Loading (p.u.)',v_loading_yearly,v_loading_period,v_range_loading,num_periods,80) - myplot_lib.plot_violin_monthly('Loading/Figures','Loading (p.u.)',v_loading_yearly,v_loading_period,v_range_loading,num_periods) + myplot_lib.plot_hist('Loading','Loading (p.u.)',v_loading_yearly,v_loading_period,v_range_loading,num_periods,80,v_months) + myplot_lib.plot_violin_monthly('Loading/Figures','Loading (p.u.)',v_loading_yearly,v_loading_period,v_range_loading,num_periods,v_months) #Loads and load shpaes - myplot_lib.plot_duration_curve('Loads/Figures',v_total_load_kw_yearly,v_total_load_kvar_yearly,False) - myplot_lib.plot_violin_monthly_two_vars('Loads/Figures','Loads',v_loads_kw_yearly,v_loads_kw_period,v_loads_kvar_yearly,v_loads_kvar_period,v_range_show_all,num_periods) + myplot_lib.plot_duration_curve('Loads/Figures',v_total_load_kw_yearly,v_total_load_kvar_yearly,False,v_hours) + myplot_lib.plot_violin_monthly_two_vars('Loads/Figures','Loads',v_loads_kw_yearly,v_loads_kw_period,v_loads_kvar_yearly,v_loads_kvar_period,v_range_show_all,num_periods,v_months) myplot_lib.plot_violin('Loads/Figures','Loads Peak (kW)',v_loads_kw,v_range_show_all) #Losses - myplot_lib.plot_duration_curve('Losses/Figures',v_subs_losses_yearly,v_line_losses_yearly,True) + myplot_lib.plot_duration_curve('Losses/Figures',v_subs_losses_yearly,v_line_losses_yearly,True,v_hours) #Equipment parameters myplot_lib.plot_violin('Equipment/Figures','Power Line - Normal Amps (A)',v_lines_norm_amps,v_range_show_all) myplot_lib.plot_violin('Equipment/Figures','Transformer (kVA)',v_transformers_kva,v_range_show_all) diff --git a/lib/urbanopt/rnm/validation/opendss_interface.py b/lib/urbanopt/rnm/validation/opendss_interface.py index ba5009e..77f526c 100644 --- a/lib/urbanopt/rnm/validation/opendss_interface.py +++ b/lib/urbanopt/rnm/validation/opendss_interface.py @@ -5,6 +5,7 @@ import sys as sys import math import networkx as nx +from datetime import datetime class OpenDSS_Interface: def __init__(self, folder,b_numeric_ids): @@ -42,13 +43,9 @@ def is_to_be_analyzed(self,name): - def extract_period(self,v_value_i,v_value_period,i,end_index,num_periods): - """Extracts period "i" out of "num_periods" from the whole gieve series (v_value_i)""" - #It is assumes all the periods have the same length - for j in range(num_periods): - if (i<=end_index*(j+1)/num_periods): - v_value_period[j].extend(v_value_i) - break + def extract_period(self,v_value_i,v_value_period,i,end_index,num_periods,month): + """#Assign v_value_i to the corresponding month""" + v_value_period[month-1].extend(v_value_i) return v_value_period def add_to_dictionary(self,dict_all,dict_i): @@ -68,6 +65,24 @@ def dss_run_command(self,command): print(output) + def get_time_stamp(self): + """Read the timestamps and obtain the raw and the formatted version""" + #Select file + timestamp_file = self.main_folder + '/profiles/' + 'timestamps.csv' + #Read file + timestamps = [] + with open(timestamp_file) as csv_data_file: + for row in csv_data_file: + timestamps.append(row.strip()) + #remove the header + timestamps.pop(0) + #Define date time format + dt_format = '%Y/%m/%d %H:%M:%S' + #Convert to datetime structure + timestamps_datetime= [datetime.strptime(i,dt_format) for i in timestamps] + return timestamps,timestamps_datetime + + def get_all_voltage(self): """Computes over and under voltages for all buses""" #Get bus names @@ -448,7 +463,7 @@ def get_num_violations(self,v_value,v_range,name,dict_loads): return num_violations - def write_dict(self,subfolder,v_dict,v_range,type,component,v_dict_buses_ids): + def write_dict(self,subfolder,v_dict,v_range,type,component,v_dict_buses_ids,timestamps,v_hours): """Writes the dictionary to a file""" #Path and file name output_file_full_path = self.folder + '/' + subfolder + '/' + type + '_' + component + '.csv' @@ -456,10 +471,12 @@ def write_dict(self,subfolder,v_dict,v_range,type,component,v_dict_buses_ids): with open(output_file_full_path, 'w') as fp: #Header: ID, hours for idx,name in enumerate(v_dict): - if (self.b_numeric_ids): - fp.write('Num. ID,bus/'+'Hour,'+','.join(str(idx2) for idx2,value in enumerate(v_dict[name])) + '\n') + if (self.b_numeric_ids and not component=='Branches'): + fp.write(',/ '+'Date,'+','.join(str(value) for idx2,value in enumerate(timestamps)) + '\n') + fp.write('Num. ID,bus / '+'Hour,'+','.join(str(value) for value in v_hours) + '\n') else: - fp.write('Hour,'+','.join(str(idx2) for idx2,value in enumerate(v_dict[name])) + '\n') + fp.write('Date,'+','.join(str(value) for idx2,value in enumerate(timestamps)) + '\n') + fp.write('Hour,'+','.join(str(value) for value in v_hours) + '\n') break #Write matrix for idx,name in enumerate(v_dict): @@ -493,12 +510,22 @@ def write_id_dict(self,subfolder,type,v_dict_buses_ids): def solve_powerflow_iteratively(self,num_periods,start_index,end_index,location,v_range_voltage,v_range_loading,v_range_unbalance): """Solves the power flow iteratively""" + #Get timestamps + timestamps,timestamps_datetime=self.get_time_stamp() + if start_index is None or start_index<0: + start_index=0 + if end_index is None or end_index>len(timestamps): + end_index=len(timestamps) + v_hours_sim=range(start_index,end_index,1) #Hours to run OpenDSS + v_hours=range(start_index+1,end_index+1,1) #Hours for outputting #Por flow solving mode (hourly) self.dss_run_command("Clear") self.dss_run_command('Redirect '+location) self.dss_run_command("solve mode = snap") - self.dss_run_command("Set mode=yearly stepsize=1h number=1") + self.dss_run_command("Set mode=yearly stepsize=1h number="+str(start_index+1)) + #Additional initializations #Init vectors + v_months=[[] for _ in range(num_periods)] #Months v_voltage_yearly=[] #Yearly votlage v_voltage_period=[[] for _ in range(num_periods)] #Montly voltage v_unbalance_yearly=[] #Yearly unbalance @@ -520,34 +547,36 @@ def solve_powerflow_iteratively(self,num_periods,start_index,end_index,location, v_dict_loading={} #Dict of loading v_dict_losses={} #Dict of losses v_dict_loads={} #Dict of loads - #Additional initializations - my_range=range(start_index,end_index,1) #Full year old_percentage_str="" #Variable for tracking progress #Get buses ids v_dict_buses_ids,v_dict_ids_buses=self.get_all_buses_ids() #For each hour - for i in my_range: + for i in v_hours_sim: #Solve power flow in that hour self.dss_run_command("Solve") + #Build month vector + month=timestamps_datetime[i].month + if not month in v_months: + v_months[month-1]=month-1 #Get voltages dict_voltage_i, v_voltage_i = self.get_all_voltage() self.add_to_dictionary(v_dict_voltage,dict_voltage_i) v_voltage_yearly.extend(v_voltage_i) - v_voltage_period=self.extract_period(v_voltage_i,v_voltage_period,i,end_index,num_periods) + v_voltage_period=self.extract_period(v_voltage_i,v_voltage_period,i,end_index,num_periods,month) #Get voltage unbalance dict_unbalance_i, v_unbalance_i = self.get_all_unbalance() self.add_to_dictionary(v_dict_unbalance,dict_unbalance_i) v_unbalance_yearly.extend(v_unbalance_i) - v_unbalance_period=self.extract_period(v_unbalance_i,v_unbalance_period,i,end_index,num_periods) + v_unbalance_period=self.extract_period(v_unbalance_i,v_unbalance_period,i,end_index,num_periods,month) #Get power dict_power_i, v_power_i = self.get_all_power() v_power_yearly.extend(v_power_i) - v_power_period=self.extract_period(v_power_i,v_power_period,i,end_index,num_periods) + v_power_period=self.extract_period(v_power_i,v_power_period,i,end_index,num_periods,month) #Get loading dict_loading_i, v_loading_i,dict_buses_element = self.get_all_loading() self.add_to_dictionary(v_dict_loading,dict_loading_i) v_loading_yearly.extend(v_loading_i) - v_loading_period=self.extract_period(v_loading_i,v_loading_period,i,end_index,num_periods) + v_loading_period=self.extract_period(v_loading_i,v_loading_period,i,end_index,num_periods,month) #Get dict losses dict_losses_i, v_losses_i = self.get_all_losses() self.add_to_dictionary(v_dict_losses,dict_losses_i) @@ -560,9 +589,9 @@ def solve_powerflow_iteratively(self,num_periods,start_index,end_index,location, dict_loads_i, v_loads_kw_i, v_loads_kvar_i= self.get_all_buses_loads(i) self.add_to_dictionary(v_dict_loads,dict_loads_i) v_loads_kw_yearly.extend(v_loads_kw_i) - v_loads_kw_period=self.extract_period(v_loads_kw_i,v_loads_kw_period,i,end_index,num_periods) + v_loads_kw_period=self.extract_period(v_loads_kw_i,v_loads_kw_period,i,end_index,num_periods,month) v_loads_kvar_yearly.extend(v_loads_kvar_i) - v_loads_kvar_period=self.extract_period(v_loads_kvar_i,v_loads_kvar_period,i,end_index,num_periods) + v_loads_kvar_period=self.extract_period(v_loads_kvar_i,v_loads_kvar_period,i,end_index,num_periods,month) #Get total peak load v_total_load_kw_yearly.append(sum(v_loads_kw_i)) v_total_load_kvar_yearly.append(sum(v_loads_kvar_i)) @@ -577,6 +606,8 @@ def solve_powerflow_iteratively(self,num_periods,start_index,end_index,location, dict_lines,v_lines_norm_amps=self.get_all_lines() #Get transformers size dict_transformers,v_transformers_kva=self.get_all_transformers() - return v_dict_buses_ids,v_dict_ids_buses,v_dict_voltage,v_voltage_yearly,v_voltage_period,v_power_yearly,v_power_period,v_dict_loading,v_loading_yearly,v_loading_period,v_dict_losses,v_subs_losses_yearly,v_line_losses_yearly,dict_buses_element,v_dict_loads,v_loads_kw_yearly,v_loads_kw_period,v_loads_kvar_yearly,v_loads_kvar_period,v_total_load_kw_yearly,v_total_load_kvar_yearly, v_loads_kw, v_loads_kvar,v_dict_unbalance,v_unbalance_yearly,v_unbalance_period,dict_lines,v_lines_norm_amps,dict_transformers,v_transformers_kva + #Get only the timestamps simulated + timestamps=timestamps[start_index:end_index] + return v_dict_buses_ids,v_dict_ids_buses,v_dict_voltage,v_voltage_yearly,v_voltage_period,v_power_yearly,v_power_period,v_dict_loading,v_loading_yearly,v_loading_period,v_dict_losses,v_subs_losses_yearly,v_line_losses_yearly,dict_buses_element,v_dict_loads,v_loads_kw_yearly,v_loads_kw_period,v_loads_kvar_yearly,v_loads_kvar_period,v_total_load_kw_yearly,v_total_load_kvar_yearly, v_loads_kw, v_loads_kvar,v_dict_unbalance,v_unbalance_yearly,v_unbalance_period,dict_lines,v_lines_norm_amps,dict_transformers,v_transformers_kva,timestamps,v_months,v_hours diff --git a/lib/urbanopt/rnm/validation/plot_lib.py b/lib/urbanopt/rnm/validation/plot_lib.py index f29ed8b..d38716f 100644 --- a/lib/urbanopt/rnm/validation/plot_lib.py +++ b/lib/urbanopt/rnm/validation/plot_lib.py @@ -28,7 +28,7 @@ def remove_terminal(self,bus): return bus - def plot_hist(self,subfolder,type,v_value,v_value_period,v_range,num_periods,num_bins): + def plot_hist(self,subfolder,type,v_value,v_value_period,v_range,num_periods,num_bins,v_months): """Plots an histogram""" # Path and file name output_file_full_path_fig = self.folder + '/' + subfolder + '/Figures/' + type + ' Histogram (p.u.).png' @@ -38,39 +38,48 @@ def plot_hist(self,subfolder,type,v_value,v_value_period,v_range,num_periods,num plt.clf() # Activate figure grid plt.grid(True) + # Evaluate number of valid periods + num_valid_periods=0 + for j in v_months: + #If data in the month + if not j==[]: + num_valid_periods=num_valid_periods+1 # Init variables - v_legend=["" for _ in range(num_periods+2)] - matrix=np.empty((num_bins,num_periods+2)) #Matrix for writting to file (index+periods+yearly) + v_legend=["" for _ in range(num_valid_periods+1)] + matrix=np.empty((num_bins,num_valid_periods+1)) #Matrix for writting to file (index+periods+yearly) + # Set xlim + if v_range['display_range']: + plt.xlim(v_range['display_range']) + # Incremental index for months with data + i=0 # For each month - for j in range(num_periods): - # Set xlim - if v_range['display_range']: - plt.xlim(v_range['display_range']) - # Set the weight variable - v_weights = np.ones_like(v_value_period[j]) / len(v_value_period[j]) - # Calculate the histogram of each month - counts, bins = np.histogram(v_value_period[j], range=v_range['display_range'], bins=num_bins, weights=v_weights) - # Update matrix and legend - # If first iteration - if j==0: - matrix[:,0]=bins[:num_bins:] - v_legend[0]=type - # In subsequent iterations - matrix[:,j+1]=counts - v_legend[j+1]= "M"+str(j+1) - # Plot the month - plt.plot(bins[:-1]+(bins[1]-bins[0])*0.5, counts) + for j in v_months: + #If data in the month + if not j==[]: + # Set the weight variable + v_weights = np.ones_like(v_value_period[j]) / len(v_value_period[j]) + # Calculate the histogram of each month + counts, bins = np.histogram(v_value_period[j], range=v_range['display_range'], bins=num_bins, weights=v_weights) + # Update matrix and legend + # In subsequent iterations + matrix[:,i]=counts + v_legend[i]="M"+str(j+1) + # Plot the month + plt.plot(bins[:-1]+(bins[1]-bins[0])*0.5, counts) + # Increment index if data + i=i+1 # Set the weight variable v_weights = np.ones_like(v_value) / len(v_value) # Calculate the yearly histogram counts, bins = np.histogram(v_value, range=v_range['display_range'], bins=num_bins, weights=v_weights) # Update matrix and legend - matrix[:,num_periods+1]=counts - v_legend[num_periods+1]='Yearly' + matrix[:,i]=counts + v_legend[i]='Yearly' # Plot histogram plt.hist(bins[:-1], bins, weights=counts) # Plot legend - plt.legend(v_legend[1:num_periods+2:]) + #plt.legend(v_legend[1:num_periods+2:]) + plt.legend(v_legend) # Write line with the limits for j in range(len(v_range['limits'])): h = plt.axvline(v_range['limits'][j], color='r', linestyle='--') @@ -145,7 +154,7 @@ def plot_violin_two_vars(self,subfolder, type,v_value1,v_value2,v_range): # plt.show() - def plot_violin_monthly(self,subfolder, type,v_value,v_value_period,v_range,num_periods): + def plot_violin_monthly(self,subfolder, type,v_value,v_value_period,v_range,num_periods,v_months): """Make a violin plot with the monthly variation""" # Path and file name output_file_full_path_fig = self.folder + '/' + subfolder + '/' + type + ' Violin Plot.png' @@ -159,20 +168,26 @@ def plot_violin_monthly(self,subfolder, type,v_value,v_value_period,v_range,num_ # Write line with the limits for j in range(len(v_range['limits'])): h = plt.axhline(v_range['limits'][j], color='r', linestyle='--') + # Incremental index for valid months + i=0 # For each month - for j in range(num_periods): - # Extend lists for monthly - l_month=["M"+str(j+1) for _ in v_value_period[j]] - l_yearly=['Monthly' for _ in v_value_period[j]] - v_data.extend(v_value_period[j]) - v_month.extend(l_month) - v_yearly.extend(l_yearly) - # Extend lists for yearly - l_month=["M"+str(j+1) for _ in v_value] - l_yearly=['Yearly' for _ in v_value] - v_data.extend(v_value) - v_month.extend(l_month) - v_yearly.extend(l_yearly) + for j in v_months: + # If data in the month + if not j==[]: + # Extend lists for monthly + l_month=["M"+str(j+1) for _ in v_value_period[j]] + l_yearly=['Monthly' for _ in v_value_period[j]] + v_data.extend(v_value_period[j]) + v_month.extend(l_month) + v_yearly.extend(l_yearly) + # Extend lists for yearly + l_month=["M"+str(j+1) for _ in v_value] + l_yearly=['Yearly' for _ in v_value] + v_data.extend(v_value) + v_month.extend(l_month) + v_yearly.extend(l_yearly) + #Increment auto-index if there is data + i=i+1 # Display violin plot sns.violinplot(x=v_month, y=v_data, hue=v_yearly, cut=0, split=True) # Set y label @@ -185,7 +200,7 @@ def plot_violin_monthly(self,subfolder, type,v_value,v_value_period,v_range,num_ # Display # plt.show() - def plot_violin_monthly_two_vars(self,subfolder, type,v_value1,v_value1_period,v_value2,v_value2_period,v_range,num_periods): + def plot_violin_monthly_two_vars(self,subfolder, type,v_value1,v_value1_period,v_value2,v_value2_period,v_range,num_periods,v_months): """Make a violin plot for two variables (kW/kVAr) with the monthly variation""" # Path and file name output_file_full_path_fig = self.folder + '/' + subfolder + '/' + type + ' Violin Plot.png' @@ -196,19 +211,25 @@ def plot_violin_monthly_two_vars(self,subfolder, type,v_value1,v_value1_period,v v_data=[] v_month=[] v_type=[] - for j in range(num_periods): - # Extend lists for monthly var1 - l_month=["M"+str(j+1) for _ in v_value1_period[j]] - l_type=['kW' for _ in v_value1_period[j]] - v_data.extend(v_value1_period[j]) - v_month.extend(l_month) - v_type.extend(l_type) - # Extend lists for monthly var2 - l_month=["M"+str(j+1) for _ in v_value2_period[j]] - l_type=['kVAr' for _ in v_value2_period[j]] - v_data.extend(v_value2_period[j]) - v_month.extend(l_month) - v_type.extend(l_type) + # Incremental index for valid months + i=0 + for j in v_months: + #If there is data + if not j==[]: + # Extend lists for monthly var1 + l_month=["M"+str(j+1) for _ in v_value1_period[j]] + l_type=['kW' for _ in v_value1_period[j]] + v_data.extend(v_value1_period[j]) + v_month.extend(l_month) + v_type.extend(l_type) + # Extend lists for monthly var2 + l_month=["M"+str(j+1) for _ in v_value2_period[j]] + l_type=['kVAr' for _ in v_value2_period[j]] + v_data.extend(v_value2_period[j]) + v_month.extend(l_month) + v_type.extend(l_type) + #Increment auto-index if there is data + i=i+1 # Extend lists for yearly var1 l_month=['Yearly' for _ in v_value1] l_type=['kW' for _ in v_value1] @@ -236,19 +257,19 @@ def plot_violin_monthly_two_vars(self,subfolder, type,v_value1,v_value1_period,v # Display # plt.show() - def plot_duration_curve(self,subfolder, v1_yearly,v2_yearly,b_losses): + def plot_duration_curve(self,subfolder, v1_yearly,v2_yearly,b_losses,v_hours): """Make a figure with the duration curve (yearly losses or load)""" # New figure # plt.figure plt.clf() # Display variable 1 - plt.plot(sorted(v1_yearly,reverse=True)) + plt.plot(v_hours,sorted(v1_yearly,reverse=True)) # Display variable 1 - plt.plot(sorted(v2_yearly,reverse=True)) + plt.plot(v_hours,sorted(v2_yearly,reverse=True)) # If displaying losses if b_losses: # Plot the added curve (lines + transformers) - plt.plot(sorted(np.add(v1_yearly,v2_yearly),reverse=True)) + plt.plot(v_hours,sorted(np.add(v1_yearly,v2_yearly),reverse=True)) # Set file path + name output_file_full_path_fig = self.folder + '/' + subfolder + '/' + 'Losses' + '.png' # Set legend From 77d468b25fe471ae00bf65a2d923b40092f1a36a Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Thu, 8 Dec 2022 14:54:33 -0700 Subject: [PATCH 22/62] update gemfile for os 3.5 --- Gemfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index a499375..374d788 100644 --- a/Gemfile +++ b/Gemfile @@ -9,8 +9,8 @@ allow_local = ENV['FAVOR_LOCAL_GEMS'] # Below is an example of how to configure the gemfile for developing with local gems # modify as appropriate -if allow_local && File.exists?('../urbanopt-geojson-gem') - gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem' -elsif allow_local - gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'develop' -end \ No newline at end of file +# if allow_local && File.exists?('../urbanopt-geojson-gem') +# gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem' +# elsif allow_local + gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'OS-3.5' +#end \ No newline at end of file From 4419d8288549172c5e06c5d03ee677cbcc20de59 Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Thu, 8 Dec 2022 14:56:22 -0700 Subject: [PATCH 23/62] temporarily commenting gemspec --- urbanopt-rnm-us-gem.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index c87f90f..2f418d6 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -27,7 +27,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'faraday', '~> 1.0.1' spec.add_dependency 'geoutm', '~> 1.0.2' spec.add_dependency 'rubyzip', '~> 2.3.2' - spec.add_dependency 'urbanopt-geojson', '~> 0.8.0' + #spec.add_dependency 'urbanopt-geojson', '~> 0.8.0' spec.add_development_dependency 'bundler', '~> 2.1' spec.add_development_dependency 'rake', '~> 13.0' From 89cf7850c1ea4663b75c46366fcb809a92221f7e Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Thu, 8 Dec 2022 20:30:26 -0700 Subject: [PATCH 24/62] prep release --- CHANGELOG.md | 5 +++++ lib/urbanopt/rnm/api_client.rb | 11 ++++++----- lib/urbanopt/rnm/version.rb | 2 +- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c8755e..74cdb9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## Version 0.5.0 +Date Range 9/30/22 - 12/8/22 + +- Update dependencies for Extension Gem 0.6.0 and OpenStudio 3.5.0 + ## Version 0.4.0 Date Range 05/10/22 - 9/30/22 diff --git a/lib/urbanopt/rnm/api_client.rb b/lib/urbanopt/rnm/api_client.rb index efb39fd..f36474a 100644 --- a/lib/urbanopt/rnm/api_client.rb +++ b/lib/urbanopt/rnm/api_client.rb @@ -60,11 +60,12 @@ def initialize(name, rnm_dir, use_localhost = false, reopt = false) # TODO: eventually add NREL developer api key support @use_localhost = use_localhost - if @use_localhost - @base_api = 'http://0.0.0.0:8080/api/v2/' - else - @base_api = 'https://rnm.urbanopt.net/api/v2/' - end + # if @use_localhost + # @base_api = 'http://0.0.0.0:8080/api/v2/' + # else + # @base_api = 'https://rnm.urbanopt.net/api/v2/' + # end + @base_api = 'http://0.0.0.0:8080/api/v2/' puts "Running RNM-US at #{@base_api}" diff --git a/lib/urbanopt/rnm/version.rb b/lib/urbanopt/rnm/version.rb index ecbf965..4dc33ce 100644 --- a/lib/urbanopt/rnm/version.rb +++ b/lib/urbanopt/rnm/version.rb @@ -40,6 +40,6 @@ module URBANopt module RNM - VERSION = '0.4.0'.freeze + VERSION = '0.5.0'.freeze end end From c312e25fff0f8aabf98c097b93266e8aa07413ba Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Mon, 12 Dec 2022 13:24:06 -0700 Subject: [PATCH 25/62] small fixes --- Gemfile | 5 ++++- lib/urbanopt/rnm/api_client.rb | 19 +++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index 374d788..e1fd85d 100644 --- a/Gemfile +++ b/Gemfile @@ -13,4 +13,7 @@ allow_local = ENV['FAVOR_LOCAL_GEMS'] # gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem' # elsif allow_local gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'OS-3.5' -#end \ No newline at end of file +#end + +# temporary + gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'OS-3.5' diff --git a/lib/urbanopt/rnm/api_client.rb b/lib/urbanopt/rnm/api_client.rb index f36474a..76471f9 100644 --- a/lib/urbanopt/rnm/api_client.rb +++ b/lib/urbanopt/rnm/api_client.rb @@ -60,12 +60,11 @@ def initialize(name, rnm_dir, use_localhost = false, reopt = false) # TODO: eventually add NREL developer api key support @use_localhost = use_localhost - # if @use_localhost - # @base_api = 'http://0.0.0.0:8080/api/v2/' - # else - # @base_api = 'https://rnm.urbanopt.net/api/v2/' - # end - @base_api = 'http://0.0.0.0:8080/api/v2/' + if @use_localhost + @base_api = 'http://0.0.0.0:8080/api/v2/' + else + @base_api = 'https://rnm.urbanopt.net/api/v2/' + end puts "Running RNM-US at #{@base_api}" @@ -109,6 +108,7 @@ def zip_input_files end if !missing_files.empty? + puts "RNM DIR: #{@rnm_dir}" raise "Input Files missing in directory: #{missing_files.join(',')}" end @@ -282,6 +282,13 @@ def download_results(sim_id = nil) # delete zip File.delete(file_path) + # check if zip is empty + if Dir.empty? File.join(@rnm_dir, 'results') + msg = "Error in simulation: Results.zip empty" + @@logger.error(msg) + raise msg + end + else msg = "Error retrieving results for #{the_sim_id}. error code: #{resp.status}. #{resp.body}" @@logger.error(msg) From 9f6a12162a249bf1a3cec74b0ed8de93b84e1e57 Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Tue, 13 Dec 2022 10:32:25 -0700 Subject: [PATCH 26/62] update dependencies --- Gemfile | 6 ++---- urbanopt-rnm-us-gem.gemspec | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index e1fd85d..577a7a0 100644 --- a/Gemfile +++ b/Gemfile @@ -12,8 +12,6 @@ allow_local = ENV['FAVOR_LOCAL_GEMS'] # if allow_local && File.exists?('../urbanopt-geojson-gem') # gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem' # elsif allow_local - gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'OS-3.5' -#end +# gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'develop' +# end -# temporary - gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'OS-3.5' diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index 2f418d6..4a932ef 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -27,7 +27,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'faraday', '~> 1.0.1' spec.add_dependency 'geoutm', '~> 1.0.2' spec.add_dependency 'rubyzip', '~> 2.3.2' - #spec.add_dependency 'urbanopt-geojson', '~> 0.8.0' + spec.add_dependency 'urbanopt-geojson', '~> 0.9.0' spec.add_development_dependency 'bundler', '~> 2.1' spec.add_development_dependency 'rake', '~> 13.0' From af4e703c9dfdd7886ed27c2d1d357b2cf2c4eff3 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 28 Feb 2023 14:25:06 -0700 Subject: [PATCH 27/62] add coverage to test suite --- spec/spec_helper.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 26631c5..4357e49 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -38,6 +38,16 @@ # OF THE POSSIBILITY OF SUCH DAMAGE. # ********************************************************************************* +require 'simplecov' +require 'simplecov-lcov' + +SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true +SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter +# Don't consider the spec folder for test coverage reporting (inside the do/end loop) +SimpleCov.start do + add_filter '/spec/' +end + require 'bundler/setup' require 'urbanopt/rnm' From d7a3fb0e7513a503771cce37f7851ab30f2e4746 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 28 Feb 2023 14:25:37 -0700 Subject: [PATCH 28/62] add simplecov dev dependencies --- urbanopt-rnm-us-gem.gemspec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index 4a932ef..b6bc13b 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -35,4 +35,6 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'rubocop', '~> 1.15.0' spec.add_development_dependency 'rubocop-checkstyle_formatter', '~> 0.4.0' spec.add_development_dependency 'rubocop-performance', '~> 1.11.3' + spec.add_development_dependency 'simplecov', '~> 0.18.2' + spec.add_development_dependency 'simplecov-lcov', '~> 0.8.0' end From dc74eae59fbd10c8d45cbfa38994ab542998be4c Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 28 Feb 2023 14:25:59 -0700 Subject: [PATCH 29/62] add gha config file --- .github/workflows/nightly_build.yml | 46 +++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .github/workflows/nightly_build.yml diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml new file mode 100644 index 0000000..8c0f57a --- /dev/null +++ b/.github/workflows/nightly_build.yml @@ -0,0 +1,46 @@ + +name: nightly_build + +on: + push: + # schedule: + # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule + # 5:23 am UTC (11:23pm MDT the day before) every weekday night in MDT + # - cron: '23 5 * * 2-6' + +env: + # This env var should enforce develop branch of all dependencies + FAVOR_LOCAL_GEMS: true + GEM_DEVELOPER_KEY: ${{ secrets.GEM_DEVELOPER_KEY }} + +jobs: + weeknight-tests: + runs-on: ubuntu-latest + container: + image: docker://nrel/openstudio:3.5.1 + steps: + - uses: actions/checkout@v3 + - name: Update gems + run: | + ruby --version + bundle update + bundle exec certified-update + - name: Run Rspec + continue-on-error: true + # Continue to upload step even if a test fails, so we can troubleshoot + run: bundle exec rspec + - name: Upload artifacts + uses: actions/upload-artifact@v3 + if: failure() # Only upload if rspec fails + with: + name: rspec_results + path: | + spec/test_directory**/run/ + # coverage/ + retention-days: 7 # save for 1 week before deleting + # coveralls action docs: https://github.com/marketplace/actions/coveralls-github-action + - name: Coveralls + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + path-to-lcov: "./coverage/lcov/urbanopt-rnm-us-gem.lcov" From e95adc95e0be6e907e9113346902e9991ce4e70c Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 28 Feb 2023 14:31:45 -0700 Subject: [PATCH 30/62] update artifact path for saving ci results on failure --- .github/workflows/nightly_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml index 8c0f57a..7ca28f0 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/nightly_build.yml @@ -35,7 +35,7 @@ jobs: with: name: rspec_results path: | - spec/test_directory**/run/ + spec/test*/** # coverage/ retention-days: 7 # save for 1 week before deleting # coveralls action docs: https://github.com/marketplace/actions/coveralls-github-action From c63d45c3fbb93ad2bd363dc53a4d09f5e5959d3c Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 28 Feb 2023 14:33:47 -0700 Subject: [PATCH 31/62] add coverage badge to readme --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4e5ae62..aad4e6e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ +[![Coverage Status](https://coveralls.io/repos/github/urbanopt/urbanopt-rnm-us-gem/badge.svg?branch=develop)](https://coveralls.io/github/urbanopt/urbanopt-rnm-us-gem?branch=develop) + # URBANopt RNM-US Gem -The URBANopt RNM-US Gem includes functionalities to interface the URBANopt SDK to the RNM-US Gem for the development of a synthetic optimum distribution network in the considered district, given data related to the buildings energy consumption/DER energy generation and location, modeled by the other URBANopt modules. +The URBANopt RNM-US Gem includes functionalities to interface the URBANopt SDK to the RNM-US Gem for the development of a synthetic optimum distribution network in the considered district, given data related to the buildings energy consumption/DER energy generation and location, modeled by the other URBANopt modules. The RNM-US Gem is used to collect required data for the execution of RNM-US, which has been modeled in the other URBANopt modules, translating information provided in .json and .csv format into .txt files @@ -15,7 +17,7 @@ The OpenDSS format presents results for power system analysis and simulations. The current functionalities of the RNM-US Gem include the creation of a streetmap text file, the substation txt file and multiple txt files related to the consumers peak loads and profiles and DERs peak generation and profiles. The streetmap text file is developed from coordinates information provided by geoJSON feature file input. The customers and generators text files, which define all the network consumers and DG included in the project, are created from their peak electricity demand/generation, and building location, provided by csv and json feature_report files modeled by the URBANopt Scenario Gem. The profiles txt files are divided among the consumers hourly profiles of active and reactive power and the DG hourly profiles of active and reactive power for the 2 most "extreme" days of maximum net demand and maximum net generation for the district . -Finally, the extended profiles txt files provide the active and reactive profiles for each consumer/DG for the whole year. +Finally, the extended profiles txt files provide the active and reactive profiles for each consumer/DG for the whole year. ## Generate input files @@ -67,4 +69,4 @@ The validation and results visualization functionality is written in python. Fol ```bash bundle exec rspec -``` \ No newline at end of file +``` From aa8b73e4c1f382d868ce27571aaffaf904cdb66d Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 28 Feb 2023 14:35:09 -0700 Subject: [PATCH 32/62] rename gha file to ci --- .github/workflows/{nightly_build.yml => ci.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{nightly_build.yml => ci.yml} (98%) diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/ci.yml similarity index 98% rename from .github/workflows/nightly_build.yml rename to .github/workflows/ci.yml index 7ca28f0..443918b 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ -name: nightly_build +name: ci on: push: From 1f8d6ed0ebeeccf384171abff3864d7bc6595a56 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 28 Feb 2023 14:39:04 -0700 Subject: [PATCH 33/62] put gha on schedule, not on push --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 443918b..7a70d44 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,11 +2,11 @@ name: ci on: - push: - # schedule: + # push: + schedule: # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule # 5:23 am UTC (11:23pm MDT the day before) every weekday night in MDT - # - cron: '23 5 * * 2-6' + - cron: '23 5 * * 2-6' env: # This env var should enforce develop branch of all dependencies From 9ac2afca6caabacdb89e693f78a3e864f395e85f Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Thu, 25 May 2023 22:06:18 -0600 Subject: [PATCH 34/62] fix for courtyard buildings --- lib/urbanopt/rnm/geojson_input.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/urbanopt/rnm/geojson_input.rb b/lib/urbanopt/rnm/geojson_input.rb index 395a341..515cd60 100644 --- a/lib/urbanopt/rnm/geojson_input.rb +++ b/lib/urbanopt/rnm/geojson_input.rb @@ -210,7 +210,11 @@ def coordinates_feature_hash(geojson_hash, scenario_features = []) street_coordinates[street_number] = each_street street_number += 1 elsif street['geometry']['type'] == 'Polygon' && street['properties']['type'] == 'Building' && scenario_features.include?(street['properties']['id']) - for k in 0..street['geometry']['coordinates'].length - 1 + puts "------ processing Building #{ street['properties']['name']} --------" + # this loop goes through each polygon and assign it a building and is not correct for buildings with + # inner courtyards (it would create 2 buildings) + # Assume the outward footprint is the first polygon -- only process the first one + for k in 0..0 h = 0 # index representing number of nodes for each single building building = [] # array containing every building node coordinates and id of 1 building for j in 0..street['geometry']['coordinates'][k].length - 1 From 44da61383e4fed61e69e9905888ffbda0db05407 Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Fri, 26 May 2023 09:45:51 -0600 Subject: [PATCH 35/62] cleanup comments --- lib/urbanopt/rnm/geojson_input.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/urbanopt/rnm/geojson_input.rb b/lib/urbanopt/rnm/geojson_input.rb index 515cd60..1ca47cf 100644 --- a/lib/urbanopt/rnm/geojson_input.rb +++ b/lib/urbanopt/rnm/geojson_input.rb @@ -213,7 +213,7 @@ def coordinates_feature_hash(geojson_hash, scenario_features = []) puts "------ processing Building #{ street['properties']['name']} --------" # this loop goes through each polygon and assign it a building and is not correct for buildings with # inner courtyards (it would create 2 buildings) - # Assume the outward footprint is the first polygon -- only process the first one + # This assumes the outward footprint is the first polygon -- we only process the first one here for k in 0..0 h = 0 # index representing number of nodes for each single building building = [] # array containing every building node coordinates and id of 1 building From 123a87c308c71f627f4c858f8a8e142df5f77a94 Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Wed, 7 Jun 2023 14:12:18 -0600 Subject: [PATCH 36/62] bump version 0.5.1 --- CHANGELOG.md | 5 +++++ LICENSE.md | 2 +- lib/urbanopt/rnm/version.rb | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74cdb9f..e2cc850 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## Version 0.5.1 +Date Range 12/9/22 - 6/7/23 + +- Fix to handle buildings with courtyard without creating additional erroneous buildings + ## Version 0.5.0 Date Range 9/30/22 - 12/8/22 diff --git a/LICENSE.md b/LICENSE.md index 1104f2e..a126334 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other +URBANopt (tm), Copyright (c) 2019-2023, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, diff --git a/lib/urbanopt/rnm/version.rb b/lib/urbanopt/rnm/version.rb index 4dc33ce..b475e25 100644 --- a/lib/urbanopt/rnm/version.rb +++ b/lib/urbanopt/rnm/version.rb @@ -40,6 +40,6 @@ module URBANopt module RNM - VERSION = '0.5.0'.freeze + VERSION = '0.5.1'.freeze end end From 8b80121b01392b98c5c97d1a92ae663f8b834416 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 30 Jun 2023 11:45:11 -0600 Subject: [PATCH 37/62] bump version to 0.6.0 --- lib/urbanopt/rnm/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/urbanopt/rnm/version.rb b/lib/urbanopt/rnm/version.rb index b475e25..7665076 100644 --- a/lib/urbanopt/rnm/version.rb +++ b/lib/urbanopt/rnm/version.rb @@ -40,6 +40,6 @@ module URBANopt module RNM - VERSION = '0.5.1'.freeze + VERSION = '0.6.0'.freeze end end From e91c438aaf67b824800d78038b57ff40da2dd665 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 30 Jun 2023 11:45:39 -0600 Subject: [PATCH 38/62] point to geojson-gem branch os361 --- Gemfile | 3 +-- urbanopt-rnm-us-gem.gemspec | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 577a7a0..e63c004 100644 --- a/Gemfile +++ b/Gemfile @@ -12,6 +12,5 @@ allow_local = ENV['FAVOR_LOCAL_GEMS'] # if allow_local && File.exists?('../urbanopt-geojson-gem') # gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem' # elsif allow_local -# gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'develop' + gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'os361' # end - diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index b6bc13b..9bae3bd 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -27,7 +27,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'faraday', '~> 1.0.1' spec.add_dependency 'geoutm', '~> 1.0.2' spec.add_dependency 'rubyzip', '~> 2.3.2' - spec.add_dependency 'urbanopt-geojson', '~> 0.9.0' + # spec.add_dependency 'urbanopt-geojson', '~> 0.9.0' spec.add_development_dependency 'bundler', '~> 2.1' spec.add_development_dependency 'rake', '~> 13.0' From 454731b9c66d7d55cc83098a7e5d1f09fda4a526 Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Fri, 30 Jun 2023 12:03:02 -0600 Subject: [PATCH 39/62] fix dependencies --- Gemfile | 5 ++++- urbanopt-rnm-us-gem.gemspec | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index e63c004..805fce2 100644 --- a/Gemfile +++ b/Gemfile @@ -12,5 +12,8 @@ allow_local = ENV['FAVOR_LOCAL_GEMS'] # if allow_local && File.exists?('../urbanopt-geojson-gem') # gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem' # elsif allow_local - gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'os361' +# gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'os361' # end + +gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'develop' +gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'os361' diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index 9bae3bd..9eaf3ba 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -33,6 +33,8 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'rake', '~> 13.0' spec.add_development_dependency 'rspec', '~> 3.7' spec.add_development_dependency 'rubocop', '~> 1.15.0' + # pin this one: + spec.add_development_dependency 'parallel', '~> 1.19.1' spec.add_development_dependency 'rubocop-checkstyle_formatter', '~> 0.4.0' spec.add_development_dependency 'rubocop-performance', '~> 1.11.3' spec.add_development_dependency 'simplecov', '~> 0.18.2' From ecdb93801a536925e01881966132fcf2ee18c185 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 30 Jun 2023 16:00:25 -0600 Subject: [PATCH 40/62] temporary ci change for testing --- .github/workflows/ci.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7a70d44..490cabd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,11 +2,11 @@ name: ci on: - # push: - schedule: + push: + # schedule: # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule # 5:23 am UTC (11:23pm MDT the day before) every weekday night in MDT - - cron: '23 5 * * 2-6' + # - cron: '23 5 * * 2-6' env: # This env var should enforce develop branch of all dependencies @@ -17,7 +17,7 @@ jobs: weeknight-tests: runs-on: ubuntu-latest container: - image: docker://nrel/openstudio:3.5.1 + image: docker://nrel/openstudio:3.6.1 steps: - uses: actions/checkout@v3 - name: Update gems @@ -31,7 +31,8 @@ jobs: run: bundle exec rspec - name: Upload artifacts uses: actions/upload-artifact@v3 - if: failure() # Only upload if rspec fails + # Only upload if rspec fails + if: ${{ failure() }} with: name: rspec_results path: | From ba1aeb52896c069ebecaf5d5238911257bc3de36 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 30 Jun 2023 16:22:34 -0600 Subject: [PATCH 41/62] try renaming ci file and use released version of coveralls --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 490cabd..8da6559 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,5 @@ -name: ci +name: nightly_build on: push: @@ -40,8 +40,8 @@ jobs: # coverage/ retention-days: 7 # save for 1 week before deleting # coveralls action docs: https://github.com/marketplace/actions/coveralls-github-action - - name: Coveralls - uses: coverallsapp/github-action@master + - name: Coveralls GitHub Action + uses: coverallsapp/github-action@v2 with: github-token: ${{ secrets.GITHUB_TOKEN }} path-to-lcov: "./coverage/lcov/urbanopt-rnm-us-gem.lcov" From 074212f2422d49c3f681b052add49352cc334405 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 30 Jun 2023 16:25:07 -0600 Subject: [PATCH 42/62] oops, actually rename the gha ci config file --- .github/workflows/{ci.yml => nightly_ci_build.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{ci.yml => nightly_ci_build.yml} (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/nightly_ci_build.yml similarity index 100% rename from .github/workflows/ci.yml rename to .github/workflows/nightly_ci_build.yml From 9d4fe746a64e9aebc8f6814bbcc4220fc6017a0a Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 30 Jun 2023 16:46:25 -0600 Subject: [PATCH 43/62] update license and references to it --- LICENSE.md | 26 +++++----- Rakefile | 47 +++---------------- lib/urbanopt-rnm.rb | 39 +-------------- lib/urbanopt/rnm.rb | 39 +-------------- lib/urbanopt/rnm/api_client.rb | 39 +-------------- lib/urbanopt/rnm/capacitor_opendss.rb | 39 +-------------- lib/urbanopt/rnm/carson_eq.rb | 39 +-------------- lib/urbanopt/rnm/consumers.rb | 41 ++-------------- lib/urbanopt/rnm/conversion_to_opendss.rb | 39 +-------------- lib/urbanopt/rnm/geojson_input.rb | 39 +-------------- lib/urbanopt/rnm/input_files.rb | 39 +-------------- lib/urbanopt/rnm/logger.rb | 39 +-------------- lib/urbanopt/rnm/oh_ug_rate.rb | 39 +-------------- lib/urbanopt/rnm/post_processor.rb | 39 +-------------- lib/urbanopt/rnm/processor_opendss_catalog.rb | 39 +-------------- lib/urbanopt/rnm/prosumers.rb | 39 +-------------- lib/urbanopt/rnm/rnm_us_catalog_conversion.rb | 39 +-------------- lib/urbanopt/rnm/runner.rb | 39 +-------------- lib/urbanopt/rnm/scenario_report.rb | 39 +-------------- lib/urbanopt/rnm/substation_location.rb | 39 +-------------- lib/urbanopt/rnm/transformer_opendss.rb | 39 +-------------- lib/urbanopt/rnm/validation.rb | 41 ++-------------- lib/urbanopt/rnm/version.rb | 39 +-------------- lib/urbanopt/rnm/wires_class.rb | 39 +-------------- lib/urbanopt/rnm/wires_opendss.rb | 39 +-------------- spec/spec_helper.rb | 39 +-------------- spec/urbanopt/urbanopt_rnm_spec.rb | 39 +-------------- 27 files changed, 73 insertions(+), 979 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index a126334..486cf9f 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -25,14 +25,18 @@ refer to any modified version of this software or any modified version of the underlying software originally provided by Alliance without the prior written consent of Alliance. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. -********************************************************************************* +The name of the copyright holder(s), any contributors, the United States Government, +the United States Department of Energy, or any of their employees may not be used to +endorse or promote products derived from this software without specific prior written +permission from the respective party. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED +STATES DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY +WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Rakefile b/Rakefile index d7fe93e..615374f 100644 --- a/Rakefile +++ b/Rakefile @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'bundler/gem_tasks' @@ -195,9 +160,9 @@ desc 'Run Validation' task :run_validation, [:scenario_csv_path, :use_numeric_ids] do |t, args| #Exammple to run validation #bundle exec rake run_validation[D:/.../urbanopt-rnm-us-gem/spec/files/example_project/baseline_scenario.csv,true] - + puts 'Running OpenDSS validation' - + # if no path passed in, use default: scenario_csv = args[:scenario_csv_path] || 'spec/test/example_project/run/baseline_scenario' root_dir, scenario_file_name = File.split(File.expand_path(scenario_csv)) @@ -207,8 +172,8 @@ task :run_validation, [:scenario_csv_path, :use_numeric_ids] do |t, args| #Use numeric ids (for the hierarchical plot of the network) use_numeric_ids = args[:use_numeric_ids] || false - use_numeric_ids = use_numeric_ids == 'true' - + use_numeric_ids = use_numeric_ids == 'true' + if !File.exist?(rnm_dir) puts rnm_dir raise 'No rnm-us directory found for this scenario...run the create_inputs rake task first.' diff --git a/lib/urbanopt-rnm.rb b/lib/urbanopt-rnm.rb index 9664b18..85e0e96 100644 --- a/lib/urbanopt-rnm.rb +++ b/lib/urbanopt-rnm.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require_relative 'urbanopt/rnm' diff --git a/lib/urbanopt/rnm.rb b/lib/urbanopt/rnm.rb index 68908f9..83ba176 100644 --- a/lib/urbanopt/rnm.rb +++ b/lib/urbanopt/rnm.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'urbanopt/rnm/version' diff --git a/lib/urbanopt/rnm/api_client.rb b/lib/urbanopt/rnm/api_client.rb index 76471f9..e04e3f2 100644 --- a/lib/urbanopt/rnm/api_client.rb +++ b/lib/urbanopt/rnm/api_client.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'faraday' diff --git a/lib/urbanopt/rnm/capacitor_opendss.rb b/lib/urbanopt/rnm/capacitor_opendss.rb index 4efe8af..e917d60 100644 --- a/lib/urbanopt/rnm/capacitor_opendss.rb +++ b/lib/urbanopt/rnm/capacitor_opendss.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* module URBANopt diff --git a/lib/urbanopt/rnm/carson_eq.rb b/lib/urbanopt/rnm/carson_eq.rb index b4bd600..3222da6 100644 --- a/lib/urbanopt/rnm/carson_eq.rb +++ b/lib/urbanopt/rnm/carson_eq.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'urbanopt/rnm/logger' diff --git a/lib/urbanopt/rnm/consumers.rb b/lib/urbanopt/rnm/consumers.rb index c6ba3b7..5ce3a8a 100644 --- a/lib/urbanopt/rnm/consumers.rb +++ b/lib/urbanopt/rnm/consumers.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* # creating a class that creates the consumers input required by the RNM-US model, @@ -110,7 +75,7 @@ def construct_consumer(profiles, single_values, building_map, building_nodes, he else voltage_default, phases = voltage_values(peak_active_power_cons / @power_factor) end - + for k in 0..profiles[:planning_profile_cust_active].length - 1 planning_date_time[k]=profiles[:planning_date_time][k] planning_profile_node_active[k] = ((profiles[:planning_profile_cust_active][k]) / nodes_per_bldg).round(2) diff --git a/lib/urbanopt/rnm/conversion_to_opendss.rb b/lib/urbanopt/rnm/conversion_to_opendss.rb index 6c280e5..8e0587b 100644 --- a/lib/urbanopt/rnm/conversion_to_opendss.rb +++ b/lib/urbanopt/rnm/conversion_to_opendss.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'json' diff --git a/lib/urbanopt/rnm/geojson_input.rb b/lib/urbanopt/rnm/geojson_input.rb index 1ca47cf..0027ac8 100644 --- a/lib/urbanopt/rnm/geojson_input.rb +++ b/lib/urbanopt/rnm/geojson_input.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'geoutm' diff --git a/lib/urbanopt/rnm/input_files.rb b/lib/urbanopt/rnm/input_files.rb index bb5401d..4293871 100644 --- a/lib/urbanopt/rnm/input_files.rb +++ b/lib/urbanopt/rnm/input_files.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'csv' diff --git a/lib/urbanopt/rnm/logger.rb b/lib/urbanopt/rnm/logger.rb index d20e84d..a35734f 100644 --- a/lib/urbanopt/rnm/logger.rb +++ b/lib/urbanopt/rnm/logger.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'logger' diff --git a/lib/urbanopt/rnm/oh_ug_rate.rb b/lib/urbanopt/rnm/oh_ug_rate.rb index ab12c66..71b324e 100644 --- a/lib/urbanopt/rnm/oh_ug_rate.rb +++ b/lib/urbanopt/rnm/oh_ug_rate.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* # find when the power lines in a street have to be considered OH or UG diff --git a/lib/urbanopt/rnm/post_processor.rb b/lib/urbanopt/rnm/post_processor.rb index b3babc2..06e24e9 100644 --- a/lib/urbanopt/rnm/post_processor.rb +++ b/lib/urbanopt/rnm/post_processor.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'urbanopt/rnm/logger' diff --git a/lib/urbanopt/rnm/processor_opendss_catalog.rb b/lib/urbanopt/rnm/processor_opendss_catalog.rb index c81109c..adcdd0d 100644 --- a/lib/urbanopt/rnm/processor_opendss_catalog.rb +++ b/lib/urbanopt/rnm/processor_opendss_catalog.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* module URBANopt module RNM diff --git a/lib/urbanopt/rnm/prosumers.rb b/lib/urbanopt/rnm/prosumers.rb index 3020896..45c8c84 100644 --- a/lib/urbanopt/rnm/prosumers.rb +++ b/lib/urbanopt/rnm/prosumers.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'json' diff --git a/lib/urbanopt/rnm/rnm_us_catalog_conversion.rb b/lib/urbanopt/rnm/rnm_us_catalog_conversion.rb index 6719780..5d9f21c 100644 --- a/lib/urbanopt/rnm/rnm_us_catalog_conversion.rb +++ b/lib/urbanopt/rnm/rnm_us_catalog_conversion.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'json' diff --git a/lib/urbanopt/rnm/runner.rb b/lib/urbanopt/rnm/runner.rb index 36a221b..0af9fbe 100644 --- a/lib/urbanopt/rnm/runner.rb +++ b/lib/urbanopt/rnm/runner.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'csv' diff --git a/lib/urbanopt/rnm/scenario_report.rb b/lib/urbanopt/rnm/scenario_report.rb index b1df54a..5c0311b 100644 --- a/lib/urbanopt/rnm/scenario_report.rb +++ b/lib/urbanopt/rnm/scenario_report.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* module URBANopt diff --git a/lib/urbanopt/rnm/substation_location.rb b/lib/urbanopt/rnm/substation_location.rb index 6f6ad54..91bc9b2 100644 --- a/lib/urbanopt/rnm/substation_location.rb +++ b/lib/urbanopt/rnm/substation_location.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* # version for integrating DG, UG-OH in RNM-US diff --git a/lib/urbanopt/rnm/transformer_opendss.rb b/lib/urbanopt/rnm/transformer_opendss.rb index 24d56e7..b193b97 100644 --- a/lib/urbanopt/rnm/transformer_opendss.rb +++ b/lib/urbanopt/rnm/transformer_opendss.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* module URBANopt module RNM diff --git a/lib/urbanopt/rnm/validation.rb b/lib/urbanopt/rnm/validation.rb index eebd2bc..b6db8ae 100644 --- a/lib/urbanopt/rnm/validation.rb +++ b/lib/urbanopt/rnm/validation.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'urbanopt/rnm/logger' @@ -45,7 +10,7 @@ module RNM # Class for OpenDSS validation (runs python script) class Validation ## - # Initialize attributes: ++run directory+ + # Initialize attributes: ++run directory+ ## # [parameters:] # * +rnm_dirname+ - _String_ - name of RNM-US directory that will contain the input files (within the scenario directory) diff --git a/lib/urbanopt/rnm/version.rb b/lib/urbanopt/rnm/version.rb index 7665076..c703394 100644 --- a/lib/urbanopt/rnm/version.rb +++ b/lib/urbanopt/rnm/version.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* module URBANopt diff --git a/lib/urbanopt/rnm/wires_class.rb b/lib/urbanopt/rnm/wires_class.rb index 1070491..a77a926 100644 --- a/lib/urbanopt/rnm/wires_class.rb +++ b/lib/urbanopt/rnm/wires_class.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'urbanopt/rnm/logger' diff --git a/lib/urbanopt/rnm/wires_opendss.rb b/lib/urbanopt/rnm/wires_opendss.rb index d250e27..08f8cf9 100644 --- a/lib/urbanopt/rnm/wires_opendss.rb +++ b/lib/urbanopt/rnm/wires_opendss.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* module URBANopt module RNM diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4357e49..52a891d 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'simplecov' diff --git a/spec/urbanopt/urbanopt_rnm_spec.rb b/spec/urbanopt/urbanopt_rnm_spec.rb index 24de79d..383fc68 100644 --- a/spec/urbanopt/urbanopt_rnm_spec.rb +++ b/spec/urbanopt/urbanopt_rnm_spec.rb @@ -1,41 +1,6 @@ # ********************************************************************************* -# URBANopt (tm), Copyright (c) 2019-2022, Alliance for Sustainable Energy, LLC, and other -# contributors. All rights reserved. - -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: - -# Redistributions of source code must retain the above copyright notice, this list -# of conditions and the following disclaimer. - -# Redistributions in binary form must reproduce the above copyright notice, this -# list of conditions and the following disclaimer in the documentation and/or other -# materials provided with the distribution. - -# Neither the name of the copyright holder nor the names of its contributors may be -# used to endorse or promote products derived from this software without specific -# prior written permission. - -# Redistribution of this software, without modification, must refer to the software -# by the same designation. Redistribution of a modified version of this software -# (i) may not refer to the modified version by the same designation, or by any -# confusingly similar designation, and (ii) must refer to the underlying software -# originally provided by Alliance as "URBANopt". Except to comply with the foregoing, -# the term "URBANopt", or any confusingly similar designation may not be used to -# refer to any modified version of this software or any modified version of the -# underlying software originally provided by Alliance without the prior written -# consent of Alliance. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -# OF THE POSSIBILITY OF SUCH DAMAGE. +# URBANopt™, Copyright © Alliance for Sustainable Energy, LLC. +# See also https://github.com/urbanopt/urbanopt-rnm-us-gem/blob/develop/LICENSE.md # ********************************************************************************* require 'fileutils' From bc8b7f83d55f5579e0c86dbfc41296fcd9b2facb Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 30 Jun 2023 16:49:55 -0600 Subject: [PATCH 44/62] remove unnecessary rubocop dev dependency --- urbanopt-rnm-us-gem.gemspec | 1 - 1 file changed, 1 deletion(-) diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index 9eaf3ba..ade5ded 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -32,7 +32,6 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'bundler', '~> 2.1' spec.add_development_dependency 'rake', '~> 13.0' spec.add_development_dependency 'rspec', '~> 3.7' - spec.add_development_dependency 'rubocop', '~> 1.15.0' # pin this one: spec.add_development_dependency 'parallel', '~> 1.19.1' spec.add_development_dependency 'rubocop-checkstyle_formatter', '~> 0.4.0' From 86db123dd60a3883f029ebe894cf532f8c5ea399 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 30 Jun 2023 16:55:17 -0600 Subject: [PATCH 45/62] update changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2cc850..cba1391 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## Version 0.6.0 +Date Range: 6/7/23 - 6/30/23 + +- Update dependencies & CI for OpenStudio 3.6.1 +- Update license and references to the license file +- Remove unnecessary dev dependency on rubocop as rubocop comes in from other dependencies +- Reactivate GitHub Actions for CI + ## Version 0.5.1 Date Range 12/9/22 - 6/7/23 From bb927270e04123da8c886c14f3b464ed36abe23c Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Wed, 5 Jul 2023 08:02:44 -0600 Subject: [PATCH 46/62] revert to scheduled CI after testing --- .github/workflows/nightly_ci_build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/nightly_ci_build.yml b/.github/workflows/nightly_ci_build.yml index 8da6559..9ab179b 100644 --- a/.github/workflows/nightly_ci_build.yml +++ b/.github/workflows/nightly_ci_build.yml @@ -2,11 +2,11 @@ name: nightly_build on: - push: - # schedule: + # push: + schedule: # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule # 5:23 am UTC (11:23pm MDT the day before) every weekday night in MDT - # - cron: '23 5 * * 2-6' + - cron: '23 5 * * 2-6' env: # This env var should enforce develop branch of all dependencies From 511c869e99459691000d22380b37958d9a58be7e Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 7 Jul 2023 08:23:11 -0600 Subject: [PATCH 47/62] point to new core-gem branch --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 805fce2..e3e035a 100644 --- a/Gemfile +++ b/Gemfile @@ -15,5 +15,5 @@ allow_local = ENV['FAVOR_LOCAL_GEMS'] # gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'os361' # end -gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'develop' +gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'more-361-updates' gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'os361' From 5ef7d2e78db8871c6ca273a4c6400d9bfecbbdfd Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Thu, 20 Jul 2023 13:19:08 -0600 Subject: [PATCH 48/62] update dependencies --- Gemfile | 5 +---- urbanopt-rnm-us-gem.gemspec | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index e3e035a..348d4f7 100644 --- a/Gemfile +++ b/Gemfile @@ -13,7 +13,4 @@ allow_local = ENV['FAVOR_LOCAL_GEMS'] # gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem' # elsif allow_local # gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'os361' -# end - -gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'more-361-updates' -gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'os361' +# end \ No newline at end of file diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index ade5ded..c4efa25 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -27,7 +27,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'faraday', '~> 1.0.1' spec.add_dependency 'geoutm', '~> 1.0.2' spec.add_dependency 'rubyzip', '~> 2.3.2' - # spec.add_dependency 'urbanopt-geojson', '~> 0.9.0' + spec.add_dependency 'urbanopt-geojson', '~> 0.10.0' spec.add_development_dependency 'bundler', '~> 2.1' spec.add_development_dependency 'rake', '~> 13.0' From 5f1d5e942b2181d8ea94dca9ff71f9d6897eb192 Mon Sep 17 00:00:00 2001 From: kflemin <2205659+kflemin@users.noreply.github.com> Date: Thu, 20 Jul 2023 16:45:56 -0600 Subject: [PATCH 49/62] comment --- urbanopt-rnm-us-gem.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index c4efa25..5891671 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -32,7 +32,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'bundler', '~> 2.1' spec.add_development_dependency 'rake', '~> 13.0' spec.add_development_dependency 'rspec', '~> 3.7' - # pin this one: + # pin this dependency: spec.add_development_dependency 'parallel', '~> 1.19.1' spec.add_development_dependency 'rubocop-checkstyle_formatter', '~> 0.4.0' spec.add_development_dependency 'rubocop-performance', '~> 1.11.3' From 262318201414fc74c372c3d87912421a9ad16a4c Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Mon, 24 Jul 2023 11:17:29 -0600 Subject: [PATCH 50/62] remove Jenkinsfile --- Jenkinsfile | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index daf833e..0000000 --- a/Jenkinsfile +++ /dev/null @@ -1,10 +0,0 @@ -//Jenkins pipelines are stored in shared libaries. Please see: https://github.com/tijcolem/nrel_cbci_jenkins_libs - -@Library('cbci_shared_libs') _ - -// Build for PR to develop branch only. -if ((env.CHANGE_ID) && (env.CHANGE_TARGET) ) { // check if set - - urbanopt_rnm_us() - -} From 80fd6d8c8375a9bfb6d203dec6900bd2a4cfbdcf Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 18 Aug 2023 10:09:50 -0600 Subject: [PATCH 51/62] also run CI when a PR gets a review request --- .github/workflows/nightly_ci_build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/nightly_ci_build.yml b/.github/workflows/nightly_ci_build.yml index 9ab179b..77207f4 100644 --- a/.github/workflows/nightly_ci_build.yml +++ b/.github/workflows/nightly_ci_build.yml @@ -7,6 +7,8 @@ on: # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule # 5:23 am UTC (11:23pm MDT the day before) every weekday night in MDT - cron: '23 5 * * 2-6' + pull_request: + types: [review_requested] env: # This env var should enforce develop branch of all dependencies From be9892fcf4f587a61a7a80d55a6790881d2a7030 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 25 Aug 2023 15:56:41 -0600 Subject: [PATCH 52/62] add build status badge from github actions --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index aad4e6e..aecdd30 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ [![Coverage Status](https://coveralls.io/repos/github/urbanopt/urbanopt-rnm-us-gem/badge.svg?branch=develop)](https://coveralls.io/github/urbanopt/urbanopt-rnm-us-gem?branch=develop) +[![nightly_build](https://github.com/urbanopt/urbanopt-rnm-us-gem/actions/workflows/nightly_ci_build.yml/badge.svg)](https://github.com/urbanopt/urbanopt-rnm-us-gem/actions/workflows/nightly_ci_build.yml) # URBANopt RNM-US Gem From 5463e72f8eff8649cf7445b15b615e054cef90b9 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 25 Aug 2023 16:25:40 -0600 Subject: [PATCH 53/62] rename CI workflow in GHA config for more informative badges --- .github/workflows/nightly_ci_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly_ci_build.yml b/.github/workflows/nightly_ci_build.yml index 77207f4..53b90ff 100644 --- a/.github/workflows/nightly_ci_build.yml +++ b/.github/workflows/nightly_ci_build.yml @@ -1,5 +1,5 @@ -name: nightly_build +name: RNM-gem CI on: # push: From 1a4ba961d7f1761b6c254e3abde9a4dcb5f1d603 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Fri, 25 Aug 2023 16:28:56 -0600 Subject: [PATCH 54/62] update build status badge in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aecdd30..77f1567 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![Coverage Status](https://coveralls.io/repos/github/urbanopt/urbanopt-rnm-us-gem/badge.svg?branch=develop)](https://coveralls.io/github/urbanopt/urbanopt-rnm-us-gem?branch=develop) -[![nightly_build](https://github.com/urbanopt/urbanopt-rnm-us-gem/actions/workflows/nightly_ci_build.yml/badge.svg)](https://github.com/urbanopt/urbanopt-rnm-us-gem/actions/workflows/nightly_ci_build.yml) +[![RNM-gem CI](https://github.com/urbanopt/urbanopt-rnm-us-gem/actions/workflows/nightly_ci_build.yml/badge.svg)](https://github.com/urbanopt/urbanopt-rnm-us-gem/actions/workflows/nightly_ci_build.yml) # URBANopt RNM-US Gem From bcad08ac0a435854cfc78d06820035a013737ab9 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Mon, 8 Jan 2024 16:30:13 -0700 Subject: [PATCH 55/62] bump version to 0.7.0 --- lib/urbanopt/rnm/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/urbanopt/rnm/version.rb b/lib/urbanopt/rnm/version.rb index c703394..c3fdf85 100644 --- a/lib/urbanopt/rnm/version.rb +++ b/lib/urbanopt/rnm/version.rb @@ -5,6 +5,6 @@ module URBANopt module RNM - VERSION = '0.6.0'.freeze + VERSION = '0.7.0'.freeze end end From be2fea884423c19a322bf44fe77bc0aaae49c927 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Mon, 8 Jan 2024 16:30:25 -0700 Subject: [PATCH 56/62] update CI to use OS3.7 --- .github/workflows/nightly_ci_build.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/nightly_ci_build.yml b/.github/workflows/nightly_ci_build.yml index 53b90ff..2b80e76 100644 --- a/.github/workflows/nightly_ci_build.yml +++ b/.github/workflows/nightly_ci_build.yml @@ -19,20 +19,22 @@ jobs: weeknight-tests: runs-on: ubuntu-latest container: - image: docker://nrel/openstudio:3.6.1 + image: docker://nrel/openstudio:3.7.0 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + - name: set git config options + shell: bash + run: | + git config --global --add safe.directory '*' - name: Update gems run: | ruby --version bundle update bundle exec certified-update - name: Run Rspec - continue-on-error: true - # Continue to upload step even if a test fails, so we can troubleshoot run: bundle exec rspec - name: Upload artifacts - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 # Only upload if rspec fails if: ${{ failure() }} with: From 3ab1625688d5c855ccdecb05fabee64b332e0347 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Mon, 8 Jan 2024 16:31:32 -0700 Subject: [PATCH 57/62] use appropriate dependency versions --- Gemfile | 11 ++++++++--- urbanopt-rnm-us-gem.gemspec | 6 +++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index 348d4f7..ba2dc82 100644 --- a/Gemfile +++ b/Gemfile @@ -6,11 +6,16 @@ gemspec # if you want to use local gems during development, use this environment variable to enable them allow_local = ENV['FAVOR_LOCAL_GEMS'] +# pin this dependency to avoid unicode_normalize error +gem 'addressable', '2.8.1' +# pin this dependency to avoid using racc dependency (which has native extensions) +gem 'parser', '3.2.2.2' + # Below is an example of how to configure the gemfile for developing with local gems # modify as appropriate # if allow_local && File.exists?('../urbanopt-geojson-gem') -# gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem' + # gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem' # elsif allow_local -# gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'os361' -# end \ No newline at end of file + gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'os37' +# end diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index 5891671..a782127 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -27,11 +27,11 @@ Gem::Specification.new do |spec| spec.add_dependency 'faraday', '~> 1.0.1' spec.add_dependency 'geoutm', '~> 1.0.2' spec.add_dependency 'rubyzip', '~> 2.3.2' - spec.add_dependency 'urbanopt-geojson', '~> 0.10.0' + # spec.add_dependency 'urbanopt-geojson', '~> 0.10.0' spec.add_development_dependency 'bundler', '~> 2.1' - spec.add_development_dependency 'rake', '~> 13.0' - spec.add_development_dependency 'rspec', '~> 3.7' + spec.add_development_dependency 'rake', '~> 13.1' + spec.add_development_dependency 'rspec', '~> 3.12' # pin this dependency: spec.add_development_dependency 'parallel', '~> 1.19.1' spec.add_development_dependency 'rubocop-checkstyle_formatter', '~> 0.4.0' From fb3355a1158d4c487ef0146238511b4b4d22c7e2 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 9 Jan 2024 13:13:20 -0700 Subject: [PATCH 58/62] clean up markdown table formatting --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 77f1567..df45129 100644 --- a/README.md +++ b/README.md @@ -48,16 +48,16 @@ bundle exec rake create_opendss_catalog[/desired/path/to/opendss_catalog.json] ## RNM-US API compatibility | API Version | RNM-US Gem Version | RNM-US exe Version | -| ----------- | ----------- | ---------------- | -| v1 | 0.3.0 and earlier | RNM-US_20220819 | -| v2 | 0.4.0 | RNM-US_20221018 | +| ----------- | ------------------ | ------------------ | +| v1 | 0.3.0 and earlier | RNM-US_20220819 | +| v2 | 0.4.0 | RNM-US_20221018 | ## Validation Functionality The validation and results visualization functionality is written in python. Follow these steps if you would like to use it. -1. Install python (3.10) if you do not already have it installed +1. Install python (>=3.10) if you do not already have it installed 1. Clone the repo to your computer 1. cd into the repo directory 1. run `bundle install` to install the required ruby dependencies From 38cd95e95a77ae546e547c47482ea0b30d997384 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 9 Jan 2024 13:13:41 -0700 Subject: [PATCH 59/62] use released version of geojson-gem --- Gemfile | 2 +- urbanopt-rnm-us-gem.gemspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index ba2dc82..6c5a5e8 100644 --- a/Gemfile +++ b/Gemfile @@ -17,5 +17,5 @@ gem 'parser', '3.2.2.2' # if allow_local && File.exists?('../urbanopt-geojson-gem') # gem 'urbanopt-geojson', path: '../urbanopt-geojson-gem' # elsif allow_local - gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'os37' +# gem 'urbanopt-geojson', github: 'URBANopt/urbanopt-geojson-gem', branch: 'os37' # end diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index a782127..e794423 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -27,7 +27,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'faraday', '~> 1.0.1' spec.add_dependency 'geoutm', '~> 1.0.2' spec.add_dependency 'rubyzip', '~> 2.3.2' - # spec.add_dependency 'urbanopt-geojson', '~> 0.10.0' + spec.add_dependency 'urbanopt-geojson', '~> 0.11.0' spec.add_development_dependency 'bundler', '~> 2.1' spec.add_development_dependency 'rake', '~> 13.1' From e82b618f8b91f5098bda78ab9e32a9b8bd706513 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 9 Jan 2024 13:16:10 -0700 Subject: [PATCH 60/62] Update CHANGELOG.md for v0.7.0 --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cba1391..9aaf2d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## Version 0.7.0 +Date Range 06/30/23 - 01/09/24 + +* remove Jenkinsfile by @vtnate in https://github.com/urbanopt/urbanopt-rnm-us-gem/pull/34 +* also run CI when a PR gets a review request by @vtnate in https://github.com/urbanopt/urbanopt-rnm-us-gem/pull/35 +* Support OpenStudio 3.7 by @vtnate in https://github.com/urbanopt/urbanopt-rnm-us-gem/pull/36 + +**Full Changelog**: https://github.com/urbanopt/urbanopt-rnm-us-gem/compare/v0.6.0...v0.7.0 + ## Version 0.6.0 Date Range: 6/7/23 - 6/30/23 From abac38a52fe82f5b39e2be44b437403e29b91cfa Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Tue, 9 Jan 2024 15:31:27 -0700 Subject: [PATCH 61/62] use 0.11.1 of geojson-gem to fix my potential bug --- urbanopt-rnm-us-gem.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/urbanopt-rnm-us-gem.gemspec b/urbanopt-rnm-us-gem.gemspec index e794423..383e54f 100644 --- a/urbanopt-rnm-us-gem.gemspec +++ b/urbanopt-rnm-us-gem.gemspec @@ -27,7 +27,7 @@ Gem::Specification.new do |spec| spec.add_dependency 'faraday', '~> 1.0.1' spec.add_dependency 'geoutm', '~> 1.0.2' spec.add_dependency 'rubyzip', '~> 2.3.2' - spec.add_dependency 'urbanopt-geojson', '~> 0.11.0' + spec.add_dependency 'urbanopt-geojson', '~> 0.11.1' spec.add_development_dependency 'bundler', '~> 2.1' spec.add_development_dependency 'rake', '~> 13.1' From b7c03f0eea64f24ef7f17985158b2bbdf4d67713 Mon Sep 17 00:00:00 2001 From: Nathan Moore Date: Wed, 10 Jan 2024 13:51:21 -0700 Subject: [PATCH 62/62] Update copyright date in LICENSE.md --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index 486cf9f..ddf412f 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -URBANopt (tm), Copyright (c) 2019-2023, Alliance for Sustainable Energy, LLC, and other +URBANopt (tm), Copyright (c) 2019-2024, Alliance for Sustainable Energy, LLC, and other contributors. All rights reserved. Redistribution and use in source and binary forms, with or without modification,