lib/urbanopt/reopt/feature_report_adapter.rb in urbanopt-reopt-0.6.0 vs lib/urbanopt/reopt/feature_report_adapter.rb in urbanopt-reopt-0.6.1
- old
+ new
@@ -97,65 +97,60 @@
# Parse Location
reopt_inputs[:Scenario][:Site][:latitude] = feature_report.location.latitude_deg
reopt_inputs[:Scenario][:Site][:longitude] = feature_report.location.longitude_deg
# Parse Optional FeatureReport metrics - do not overwrite from assumptions file
- if reopt_inputs[:Scenario][:Site][:roof_squarefeet].nil?
- unless feature_report.program.roof_area_sqft.nil?
- reopt_inputs[:Scenario][:Site][:roof_squarefeet] = feature_report.program.roof_area_sqft[:available_roof_area_sqft]
- end
+ if reopt_inputs[:Scenario][:Site][:roof_squarefeet].nil? && !feature_report.program.roof_area_sqft.nil?
+ reopt_inputs[:Scenario][:Site][:roof_squarefeet] = feature_report.program.roof_area_sqft[:available_roof_area_sqft]
end
- if reopt_inputs[:Scenario][:Site][:land_acres].nil?
- unless feature_report.program.site_area_sqft.nil?
- reopt_inputs[:Scenario][:Site][:land_acres] = feature_report.program.site_area_sqft * 1.0 / 43560 # acres/sqft
- end
+ if reopt_inputs[:Scenario][:Site][:land_acres].nil? && !feature_report.program.site_area_sqft.nil?
+ reopt_inputs[:Scenario][:Site][:land_acres] = feature_report.program.site_area_sqft * 1.0 / 43560 # acres/sqft
end
if reopt_inputs[:Scenario][:time_steps_per_hour].nil?
reopt_inputs[:Scenario][:time_steps_per_hour] = 1
end
# Parse Load Profile
begin
- #Convert kWh values in the timeseries CSV to kW
+ # Convert kWh values in the timeseries CSV to kW
col_num = feature_report.timeseries_csv.column_names.index('Electricity:Facility(kWh)')
t = CSV.read(feature_report.timeseries_csv.path, headers: true, converters: :numeric)
- energy_timeseries_kw = t.by_col[col_num].map { |e| ((e * feature_report.timesteps_per_hour || 0) ) }
- #Fill in missing timestep values with 0 if a full year is not provided
+ energy_timeseries_kw = t.by_col[col_num].map { |e| ((e * feature_report.timesteps_per_hour || 0)) }
+ # Fill in missing timestep values with 0 if a full year is not provided
if energy_timeseries_kw.length < (feature_report.timesteps_per_hour * 8760)
- start_date = Time.parse(t.by_col["Datetime"][0])
+ start_date = Time.parse(t.by_col['Datetime'][0])
start_ts = (((start_date.yday * 60.0 * 60.0 * 24) + (start_date.hour * 60.0 * 60.0) + (start_date.min * 60.0) + start_date.sec) /
- (( 60 / feature_report.timesteps_per_hour ) * 60)).to_int
- end_date = Time.parse(t.by_col["Datetime"][-1])
+ ((60 / feature_report.timesteps_per_hour) * 60)).to_int
+ end_date = Time.parse(t.by_col['Datetime'][-1])
end_ts = (((end_date.yday * 60.0 * 60.0 * 24) + (end_date.hour * 60.0 * 60.0) + (end_date.min * 60.0) + end_date.sec) /
- (( 60 / feature_report.timesteps_per_hour ) * 60)).to_int
- energy_timeseries_kw = [0.0]*(start_ts-1) + energy_timeseries_kw + [0.0]*((feature_report.timesteps_per_hour * 8760) - end_ts)
+ ((60 / feature_report.timesteps_per_hour) * 60)).to_int
+ energy_timeseries_kw = [0.0] * (start_ts - 1) + energy_timeseries_kw + [0.0] * ((feature_report.timesteps_per_hour * 8760) - end_ts)
end
- #Clip to one non-leap year's worth of data
- energy_timeseries_kw = energy_timeseries_kw.map { |e| e ? e : 0 }[0,(feature_report.timesteps_per_hour * 8760)]
- #Convert from the OpenDSS resolution to the REopt Lite resolution, if necessary
+ # Clip to one non-leap year's worth of data
+ energy_timeseries_kw = energy_timeseries_kw.map { |e| e || 0 }[0, (feature_report.timesteps_per_hour * 8760)]
+ # Convert from the OpenDSS resolution to the REopt Lite resolution, if necessary
rescue StandardError
@@logger.error("Could not parse the annual electric load from the timeseries csv - #{feature_report.timeseries_csv.path}")
raise "Could not parse the annual electric load from the timeseries csv - #{feature_report.timeseries_csv.path}"
end
# Convert load to REopt Resolution
begin
reopt_inputs[:Scenario][:Site][:LoadProfile][:loads_kw] = convert_powerflow_resolution(energy_timeseries_kw, feature_report.timesteps_per_hour, reopt_inputs[:Scenario][:time_steps_per_hour])
-
- rescue
+ rescue StandardError
@@logger.error("Could not convert the annual electric load from a resolution of #{feature_report.timesteps_per_hour} to #{reopt_inputs[:Scenario][:time_steps_per_hour]}")
raise "Could not convert the annual electric load from a resolution of #{feature_report.timesteps_per_hour} to #{reopt_inputs[:Scenario][:time_steps_per_hour]}"
end
if reopt_inputs[:Scenario][:Site][:ElectricTariff][:coincident_peak_load_active_timesteps].nil?
n_top_values = 100
tmp1 = reopt_inputs[:Scenario][:Site][:LoadProfile][:loads_kw]
- tmp2 = tmp1.each_index.max_by(n_top_values*reopt_inputs[:Scenario][:time_steps_per_hour]){|i| tmp1[i]}
+ tmp2 = tmp1.each_index.max_by(n_top_values * reopt_inputs[:Scenario][:time_steps_per_hour]) { |i| tmp1[i] }
for i in (0...tmp2.count)
- tmp2[i] += 1
+ tmp2[i] += 1
end
reopt_inputs[:Scenario][:Site][:ElectricTariff][:coincident_peak_load_active_timesteps] = tmp2
end
if reopt_inputs[:Scenario][:Site][:ElectricTariff][:coincident_peak_load_charge_us_dollars_per_kw].nil?
@@ -163,11 +158,10 @@
end
return reopt_inputs
end
-
##
# Update a FeatureReport from a \REopt Lite response
#
# [*parameters:*]
#
@@ -175,11 +169,11 @@
# * +reopt_output+ - _Hash_ - A reponse hash from the \REopt Lite API to use in overwriting FeatureReport technology sizes, costs and dispatch strategies.
# * +timeseries_csv_path+ - _String_ - Optional. The path to a file at which a new timeseries CSV will be written. If not provided a file is created based on the run_uuid of the \REopt Lite optimization task.
#
# [*return:*] _URBANopt::Reporting::DefaultReports::FeatureReport_ - Returns an updated FeatureReport.
##
- def update_feature_report(feature_report, reopt_output, timeseries_csv_path=nil, resilience_stats=nil)
+ def update_feature_report(feature_report, reopt_output, timeseries_csv_path = nil, resilience_stats = nil)
# Check if the \REopt Lite response is valid
if reopt_output['outputs']['Scenario']['status'] != 'optimal'
@@logger.info("Warning cannot Feature Report #{feature_report.name} #{feature_report.id} - REopt optimization was non-optimal")
return feature_report
end
@@ -208,62 +202,52 @@
feature_report.distributed_generation.probs_of_surviving = resilience_stats['probs_of_surviving']
feature_report.distributed_generation.probs_of_surviving_by_month = resilience_stats['probs_of_surviving_by_month']
feature_report.distributed_generation.probs_of_surviving_by_hour_of_the_day = resilience_stats['probs_of_surviving_by_hour_of_the_day']
end
- if reopt_output['outputs']['Scenario']['Site']['PV'].class == Hash
+ if reopt_output['outputs']['Scenario']['Site']['PV'].instance_of?(Hash)
reopt_output['outputs']['Scenario']['Site']['PV'] = [reopt_output['outputs']['Scenario']['Site']['PV']]
elsif reopt_output['outputs']['Scenario']['Site']['PV'].nil?
reopt_output['outputs']['Scenario']['Site']['PV'] = []
end
reopt_output['outputs']['Scenario']['Site']['PV'].each_with_index do |pv, i|
- feature_report.distributed_generation.add_tech 'solar_pv', URBANopt::Reporting::DefaultReports::SolarPV.new( {size_kw: (pv['size_kw'] || 0), id: i })
+ feature_report.distributed_generation.add_tech 'solar_pv', URBANopt::Reporting::DefaultReports::SolarPV.new({ size_kw: (pv['size_kw'] || 0), id: i })
end
wind = reopt_output['outputs']['Scenario']['Site']['Wind']
- if !wind['size_kw'].nil? and wind['size_kw'] != 0
- feature_report.distributed_generation.add_tech 'wind', URBANopt::Reporting::DefaultReports::Wind.new( {size_kw: (wind['size_kw'] || 0) })
+ if !wind['size_kw'].nil? && (wind['size_kw'] != 0)
+ feature_report.distributed_generation.add_tech 'wind', URBANopt::Reporting::DefaultReports::Wind.new({ size_kw: (wind['size_kw'] || 0) })
end
generator = reopt_output['outputs']['Scenario']['Site']['Generator']
- if !generator['size_kw'].nil? and generator['size_kw'] != 0
- feature_report.distributed_generation.add_tech 'generator', URBANopt::Reporting::DefaultReports::Generator.new( {size_kw: (generator['size_kw'] || 0) })
+ if !generator['size_kw'].nil? && (generator['size_kw'] != 0)
+ feature_report.distributed_generation.add_tech 'generator', URBANopt::Reporting::DefaultReports::Generator.new({ size_kw: (generator['size_kw'] || 0) })
end
storage = reopt_output['outputs']['Scenario']['Site']['Storage']
- if !storage['size_kw'].nil? and storage['size_kw'] != 0
- feature_report.distributed_generation.add_tech 'storage', URBANopt::Reporting::DefaultReports::Storage.new( {size_kwh: (storage['size_kwh'] || 0), size_kw: (storage['size_kw'] || 0) })
+ if !storage['size_kw'].nil? && (storage['size_kw'] != 0)
+ feature_report.distributed_generation.add_tech 'storage', URBANopt::Reporting::DefaultReports::Storage.new({ size_kwh: (storage['size_kwh'] || 0), size_kw: (storage['size_kw'] || 0) })
end
generation_timeseries_kwh = Matrix[[0] * (8760 * feature_report.timesteps_per_hour)]
reopt_resolution = reopt_output['inputs']['Scenario']['time_steps_per_hour']
unless reopt_output['outputs']['Scenario']['Site']['PV'].nil?
reopt_output['outputs']['Scenario']['Site']['PV'].each do |pv|
- if (pv['size_kw'] || 0) > 0
- if !pv['year_one_power_production_series_kw'].nil?
- generation_timeseries_kwh += Matrix[convert_powerflow_resolution(pv['year_one_power_production_series_kw'], reopt_resolution, feature_report.timesteps_per_hour)]
- end
+ if (pv['size_kw'] || 0) > 0 && !pv['year_one_power_production_series_kw'].nil?
+ generation_timeseries_kwh += Matrix[convert_powerflow_resolution(pv['year_one_power_production_series_kw'], reopt_resolution, feature_report.timesteps_per_hour)]
end
- end
+ end
end
- unless reopt_output['outputs']['Scenario']['Site']['Wind'].nil?
- if (reopt_output['outputs']['Scenario']['Site']['Wind']['size_kw'] || 0) > 0
- if !reopt_output['outputs']['Scenario']['Site']['Wind']['year_one_power_production_series_kw'].nil?
- generation_timeseries_kwh += Matrix[convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Wind']['year_one_power_production_series_kw'], reopt_resolution, feature_report.timesteps_per_hour)]
- end
- end
+ if !reopt_output['outputs']['Scenario']['Site']['Wind'].nil? && ((reopt_output['outputs']['Scenario']['Site']['Wind']['size_kw'] || 0) > 0) && !reopt_output['outputs']['Scenario']['Site']['Wind']['year_one_power_production_series_kw'].nil?
+ generation_timeseries_kwh += Matrix[convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Wind']['year_one_power_production_series_kw'], reopt_resolution, feature_report.timesteps_per_hour)]
end
- unless reopt_output['outputs']['Scenario']['Site']['Generator'].nil?
- if (reopt_output['outputs']['Scenario']['Site']['Generator']['size_kw'] || 0) > 0
- if !reopt_output['outputs']['Scenario']['Site']['Generator']['year_one_power_production_series_kw'].nil?
- generation_timeseries_kwh += Matrix[convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Generator']['year_one_power_production_series_kw'], reopt_resolution, feature_report.timesteps_per_hour)]
- end
- end
+ if !reopt_output['outputs']['Scenario']['Site']['Generator'].nil? && ((reopt_output['outputs']['Scenario']['Site']['Generator']['size_kw'] || 0) > 0) && !reopt_output['outputs']['Scenario']['Site']['Generator']['year_one_power_production_series_kw'].nil?
+ generation_timeseries_kwh += Matrix[convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Generator']['year_one_power_production_series_kw'], reopt_resolution, feature_report.timesteps_per_hour)]
end
$generation_timeseries_kwh = generation_timeseries_kwh.to_a[0] || [0] * (8760 * feature_report.timesteps_per_hour)
$generation_timeseries_kwh_col = feature_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Total(kw)')
if $generation_timeseries_kwh_col.nil?
@@ -357,11 +341,10 @@
if $pv_to_load_col.nil?
$pv_to_load_col = feature_report.timeseries_csv.column_names.length
feature_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:PV:ToLoad(kw)')
end
-
$pv_to_grid_col = feature_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:PV:ToGrid(kw)')
if $pv_to_grid_col.nil?
$pv_to_grid_col = feature_report.timeseries_csv.column_names.length
feature_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:PV:ToGrid(kw)')
end
@@ -439,17 +422,17 @@
old_data = CSV.open(feature_report.timeseries_csv.path).read
start_date = Time.parse(old_data[1][0])
start_ts = (
(
((start_date.yday - 1) * 60.0 * 60.0 * 24) +
- (((start_date.hour) - 1) * 60.0 * 60.0) +
- (start_date.min * 60.0) + start_date.sec ) /
- (( 60 / feature_report.timesteps_per_hour ) * 60)
+ ((start_date.hour - 1) * 60.0 * 60.0) +
+ (start_date.min * 60.0) + start_date.sec) /
+ ((60 / feature_report.timesteps_per_hour) * 60)
).to_int
mod_data = old_data.map.with_index do |x, i|
if i > 0
- modrow(x, start_ts + i -1)
+ modrow(x, start_ts + i - 1)
else
x
end
end