urbanopt-reopt 0.11.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -38,11 +38,20 @@ module URBANopt # :nodoc:
38
38
  description = "scenario_report_#{name}_#{scenario_id}"
39
39
 
40
40
  # Create base REpopt post
41
- reopt_inputs = { Scenario: { Site: { ElectricTariff: { blended_monthly_demand_charges_us_dollars_per_kw: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], blended_monthly_rates_us_dollars_per_kwh: [0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13] }, LoadProfile: {}, Wind: { max_kw: 0 } } } }
42
41
  if !reopt_assumptions_json.nil?
43
42
  reopt_inputs = reopt_assumptions_json
44
43
  else
45
44
  @@logger.info('Using default REopt assumptions')
45
+ reopt_inputs = {
46
+ Settings: {},
47
+ Site: {},
48
+ Financial: {},
49
+ ElectricTariff: {
50
+ monthly_demand_rates: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
51
+ monthly_energy_rates: [0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13]
52
+ },
53
+ ElectricLoad: {}
54
+ }
46
55
  end
47
56
 
48
57
  # Update required info
@@ -76,26 +85,26 @@ module URBANopt # :nodoc:
76
85
  end
77
86
  end
78
87
 
79
- reopt_inputs[:Scenario][:description] = description
88
+ reopt_inputs[:description] = description
80
89
 
81
- reopt_inputs[:Scenario][:Site][:latitude] = scenario_report.location.latitude_deg
82
- reopt_inputs[:Scenario][:Site][:longitude] = scenario_report.location.longitude_deg
90
+ reopt_inputs[:Site][:latitude] = scenario_report.location.latitude_deg
91
+ reopt_inputs[:Site][:longitude] = scenario_report.location.longitude_deg
83
92
 
84
93
  # Update optional info
85
94
  # REK: attribute names should be updated
86
- if reopt_inputs[:Scenario][:Site][:roof_squarefeet].nil? && !scenario_report.program.roof_area_sqft.nil?
87
- reopt_inputs[:Scenario][:Site][:roof_squarefeet] = scenario_report.program.roof_area_sqft[:available_roof_area_sqft]
95
+ if reopt_inputs[:Site][:roof_squarefeet].nil? && !scenario_report.program.roof_area_sqft.nil?
96
+ reopt_inputs[:Site][:roof_squarefeet] = scenario_report.program.roof_area_sqft[:available_roof_area_sqft]
88
97
  end
89
98
 
90
99
  begin
91
- if reopt_inputs[:Scenario][:Site][:land_acres].nil? && !community_photovoltaic[0][:properties][:footprint_area].nil?
92
- reopt_inputs[:Scenario][:Site][:land_acres] = community_photovoltaic[0][:properties][:footprint_area] * 1.0 / 43560 # acres/sqft
100
+ if reopt_inputs[:Site][:land_acres].nil? && !community_photovoltaic[0][:properties][:footprint_area].nil?
101
+ reopt_inputs[:Site][:land_acres] = community_photovoltaic[0][:properties][:footprint_area] * 1.0 / 43560 # acres/sqft
93
102
  end
94
103
  rescue StandardError
95
104
  end
96
105
 
97
- if reopt_inputs[:Scenario][:time_steps_per_hour].nil?
98
- reopt_inputs[:Scenario][:time_steps_per_hour] = 1
106
+ if reopt_inputs[:Settings][:time_steps_per_hour].nil?
107
+ reopt_inputs[:Settings][:time_steps_per_hour] = 1
99
108
  end
100
109
 
101
110
  # Update load profile info
@@ -120,25 +129,27 @@ module URBANopt # :nodoc:
120
129
 
121
130
  # Convert load to REopt Resolution
122
131
  begin
123
- reopt_inputs[:Scenario][:Site][:LoadProfile][:loads_kw] = convert_powerflow_resolution(energy_timeseries_kw, scenario_report.timesteps_per_hour, reopt_inputs[:Scenario][:time_steps_per_hour])
132
+ reopt_inputs[:ElectricLoad][:loads_kw] = convert_powerflow_resolution(energy_timeseries_kw, scenario_report.timesteps_per_hour, reopt_inputs[:Settings][:time_steps_per_hour])
124
133
  rescue StandardError
125
- @@logger.error("Could not convert the annual electric load from a resolution of #{scenario_report.timesteps_per_hour} to #{reopt_inputs[:Scenario][:time_steps_per_hour]}")
126
- raise "Could not convert the annual electric load from a resolution of #{scenario_report.timesteps_per_hour} to #{reopt_inputs[:Scenario][:time_steps_per_hour]}"
127
- end
128
-
129
- if reopt_inputs[:Scenario][:Site][:ElectricTariff][:coincident_peak_load_active_timesteps].nil?
130
- n_top_values = 100
131
- tmp1 = reopt_inputs[:Scenario][:Site][:LoadProfile][:loads_kw]
132
- tmp2 = tmp1.each_index.max_by(n_top_values * reopt_inputs[:Scenario][:time_steps_per_hour]) { |i| tmp1[i] }
133
- for i in (0...tmp2.count)
134
- tmp2[i] += 1
135
- end
136
- reopt_inputs[:Scenario][:Site][:ElectricTariff][:coincident_peak_load_active_timesteps] = tmp2
137
- end
138
-
139
- if reopt_inputs[:Scenario][:Site][:ElectricTariff][:coincident_peak_load_charge_us_dollars_per_kw].nil?
140
- reopt_inputs[:Scenario][:Site][:ElectricTariff][:coincident_peak_load_charge_us_dollars_per_kw] = 0
141
- end
134
+ @@logger.error("Could not convert the annual electric load from a resolution of #{scenario_report.timesteps_per_hour} to #{reopt_inputs[:Settings][:time_steps_per_hour]}")
135
+ raise "Could not convert the annual electric load from a resolution of #{scenario_report.timesteps_per_hour} to #{reopt_inputs[:Settings][:time_steps_per_hour]}"
136
+ end
137
+
138
+ # REMOVE COINCIDENT PEAKS STUFF JUST FOR TESTING
139
+ # if reopt_inputs[:ElectricTariff][:coincident_peak_load_active_time_steps].nil?
140
+ # n_top_values = 10
141
+ # tmp1 = reopt_inputs[:ElectricLoad][:loads_kw]
142
+ # tmp2 = tmp1.each_index.max_by(n_top_values * reopt_inputs[:Settings][:time_steps_per_hour]) { |i| tmp1[i] }
143
+ # for i in (0...tmp2.count)
144
+ # tmp2[i] += 1
145
+ # end
146
+ # # this needs to be a 2D array
147
+ # reopt_inputs[:ElectricTariff][:coincident_peak_load_active_time_steps] = [tmp2]
148
+ # end
149
+
150
+ # if reopt_inputs[:ElectricTariff][:coincident_peak_load_charge_per_kw].nil?
151
+ # reopt_inputs[:ElectricTariff][:coincident_peak_load_charge_per_kw] = 0
152
+ # end
142
153
 
143
154
  return reopt_inputs
144
155
  end
@@ -165,29 +176,6 @@ module URBANopt # :nodoc:
165
176
  return results
166
177
  end
167
178
 
168
- def modrow(data, idx) # :nodoc:
169
- data[$generation_timeseries_kwh_col] = $generation_timeseries_kwh[idx] || 0
170
- data[$load_col] = $load[idx] || 0
171
- data[$utility_to_load_col] = $utility_to_load[idx] || 0
172
- data[$utility_to_battery_col] = $utility_to_battery[idx] || 0
173
- data[$storage_to_load_col] = $storage_to_load[idx] || 0
174
- data[$storage_to_grid_col] = $storage_to_grid[idx] || 0
175
- data[$storage_soc_col] = $storage_soc[idx] || 0
176
- data[$generator_total_col] = $generator_total[idx] || 0
177
- data[$generator_to_battery_col] = $generator_to_battery[idx] || 0
178
- data[$generator_to_load_col] = $generator_to_load[idx] || 0
179
- data[$generator_to_grid_col] = $generator_to_grid[idx] || 0
180
- data[$pv_total_col] = $pv_total[idx] || 0
181
- data[$pv_to_battery_col] = $pv_to_battery[idx] || 0
182
- data[$pv_to_load_col] = $pv_to_load[idx] || 0
183
- data[$pv_to_grid_col] = $pv_to_grid[idx] || 0
184
- data[$wind_total_col] = $wind_total[idx] || 0
185
- data[$wind_to_battery_col] = $wind_to_battery[idx] || 0
186
- data[$wind_to_load_col] = $wind_to_load[idx] || 0
187
- data[$wind_to_grid_col] = $wind_to_grid[idx] || 0
188
- return data
189
- end
190
-
191
179
  ##
192
180
  # Updates a ScenarioReport from a \REopt response
193
181
  #
@@ -200,29 +188,29 @@ module URBANopt # :nodoc:
200
188
  # [*return:*] _URBANopt::Reporting::DefaultReports::ScenarioReport_ - Returns an updated ScenarioReport
201
189
  ##
202
190
  def update_scenario_report(scenario_report, reopt_output, timeseries_csv_path = nil, resilience_stats = nil)
203
- if reopt_output['outputs']['Scenario']['status'] != 'optimal'
191
+ if reopt_output['status'] != 'optimal'
204
192
  @@logger.info("Warning cannot Feature Report #{scenario_report.name} #{scenario_report.id} - REopt optimization was non-optimal")
205
193
  return scenario_report
206
194
  end
207
195
 
208
196
  # Update location
209
- scenario_report.location.latitude_deg = reopt_output['inputs']['Scenario']['Site']['latitude']
210
- scenario_report.location.longitude_deg = reopt_output['inputs']['Scenario']['Site']['longitude']
197
+ scenario_report.location.latitude_deg = reopt_output['inputs']['Site']['latitude']
198
+ scenario_report.location.longitude_deg = reopt_output['inputs']['Site']['longitude']
211
199
 
212
200
  # Update distributed generation sizing and financials
213
- scenario_report.distributed_generation.annual_renewable_electricity_pct = reopt_output['outputs']['Scenario']['Site']['annual_renewable_electricity_pct'] || 0
214
- scenario_report.distributed_generation.lcc_us_dollars = reopt_output['outputs']['Scenario']['Site']['Financial']['lcc_us_dollars'] || 0
215
- scenario_report.distributed_generation.npv_us_dollars = reopt_output['outputs']['Scenario']['Site']['Financial']['npv_us_dollars'] || 0
216
- scenario_report.distributed_generation.year_one_energy_cost_us_dollars = reopt_output['outputs']['Scenario']['Site']['ElectricTariff']['year_one_energy_cost_us_dollars'] || 0
217
- scenario_report.distributed_generation.year_one_demand_cost_us_dollars = reopt_output['outputs']['Scenario']['Site']['ElectricTariff']['year_one_demand_cost_us_dollars'] || 0
218
- scenario_report.distributed_generation.year_one_bill_us_dollars = reopt_output['outputs']['Scenario']['Site']['ElectricTariff']['year_one_bill_us_dollars'] || 0
219
- scenario_report.distributed_generation.total_energy_cost_us_dollars = reopt_output['outputs']['Scenario']['Site']['ElectricTariff']['total_energy_cost_us_dollars'] || 0
220
- scenario_report.distributed_generation.total_demand_cost_us_dollars = reopt_output['outputs']['Scenario']['Site']['ElectricTariff']['total_demand_cost_us_dollars'] || 0
221
- scenario_report.distributed_generation.year_one_energy_cost_bau_us_dollars = reopt_output['outputs']['Scenario']['Site']['ElectricTariff']['year_one_energy_cost_bau_us_dollars'] || 0
222
- scenario_report.distributed_generation.year_one_demand_cost_bau_us_dollars = reopt_output['outputs']['Scenario']['Site']['ElectricTariff']['year_one_demand_cost_bau_us_dollars'] || 0
223
- scenario_report.distributed_generation.year_one_bill_bau_us_dollars = reopt_output['outputs']['Scenario']['Site']['ElectricTariff']['year_one_bill_bau_us_dollars'] || 0
224
- scenario_report.distributed_generation.total_demand_cost_bau_us_dollars = reopt_output['outputs']['Scenario']['Site']['ElectricTariff']['total_demand_cost_bau_us_dollars'] || 0
225
- scenario_report.distributed_generation.total_energy_cost_bau_us_dollars = reopt_output['outputs']['Scenario']['Site']['ElectricTariff']['total_energy_cost_bau_us_dollars'] || 0
201
+ scenario_report.distributed_generation.renewable_electricity_fraction = reopt_output['outputs']['Site']['renewable_electricity_fraction'] || 0
202
+ scenario_report.distributed_generation.lcc = reopt_output['outputs']['Financial']['lcc'] || 0
203
+ scenario_report.distributed_generation.npv = reopt_output['outputs']['Financial']['npv'] || 0
204
+ scenario_report.distributed_generation.year_one_energy_cost_before_tax = reopt_output['outputs']['ElectricTariff']['year_one_energy_cost_before_tax'] || 0
205
+ scenario_report.distributed_generation.year_one_demand_cost_before_tax = reopt_output['outputs']['ElectricTariff']['year_one_demand_cost_before_tax'] || 0
206
+ scenario_report.distributed_generation.year_one_bill_before_tax = reopt_output['outputs']['ElectricTariff']['year_one_bill_before_tax'] || 0
207
+ scenario_report.distributed_generation.lifecycle_energy_cost_after_tax = reopt_output['outputs']['ElectricTariff']['lifecycle_energy_cost_after_tax'] || 0
208
+ scenario_report.distributed_generation.lifecycle_demand_cost_after_tax = reopt_output['outputs']['ElectricTariff']['lifecycle_demand_cost_after_tax'] || 0
209
+ scenario_report.distributed_generation.year_one_energy_cost_before_tax_bau = reopt_output['outputs']['ElectricTariff']['year_one_energy_cost_before_tax_bau'] || 0
210
+ scenario_report.distributed_generation.year_one_demand_cost_before_tax_bau = reopt_output['outputs']['ElectricTariff']['year_one_demand_cost_before_tax_bau'] || 0
211
+ scenario_report.distributed_generation.year_one_bill_before_tax_bau = reopt_output['outputs']['ElectricTariff']['year_one_bill_before_tax_bau'] || 0
212
+ scenario_report.distributed_generation.lifecycle_demand_cost_after_tax_bau = reopt_output['outputs']['ElectricTariff']['lifecycle_demand_cost_after_tax_bau'] || 0
213
+ scenario_report.distributed_generation.lifecycle_energy_cost_after_tax_bau = reopt_output['outputs']['ElectricTariff']['lifecycle_energy_cost_after_tax_bau'] || 0
226
214
  if !resilience_stats.nil?
227
215
  scenario_report.distributed_generation.resilience_hours_min = resilience_stats['resilience_hours_min']
228
216
  scenario_report.distributed_generation.resilience_hours_max = resilience_stats['resilience_hours_max']
@@ -232,10 +220,10 @@ module URBANopt # :nodoc:
232
220
  scenario_report.distributed_generation.probs_of_surviving_by_hour_of_the_day = resilience_stats['probs_of_surviving_by_hour_of_the_day']
233
221
  end
234
222
 
235
- if reopt_output['outputs']['Scenario']['Site']['PV'].instance_of?(Hash)
236
- reopt_output['outputs']['Scenario']['Site']['PV'] = [reopt_output['outputs']['Scenario']['Site']['PV']]
237
- elsif reopt_output['outputs']['Scenario']['Site']['PV'].nil?
238
- reopt_output['outputs']['Scenario']['Site']['PV'] = []
223
+ if reopt_output['outputs']['PV'].is_a?(Hash)
224
+ reopt_output['outputs']['PV'] = [reopt_output['outputs']['PV']]
225
+ elsif reopt_output['outputs']['PV'].nil?
226
+ reopt_output['outputs']['PV'] = []
239
227
  end
240
228
 
241
229
  # Store the PV name and location in a hash
@@ -245,81 +233,81 @@ module URBANopt # :nodoc:
245
233
  module_type = {}
246
234
  gcr = {}
247
235
  # Check whether multi PV assumption input file is used or single PV
248
- if reopt_output['inputs']['Scenario']['Site']['PV'].is_a?(Array)
249
- reopt_output['inputs']['Scenario']['Site']['PV'].each do |pv|
250
- location[pv['pv_name']] = pv['location']
251
- azimuth[pv['pv_name']] = pv['azimuth']
252
- tilt[pv['pv_name']] = pv['tilt']
253
- module_type[pv['pv_name']] = pv['module_type']
254
- gcr[pv['pv_name']] = pv['gcr']
255
- end
256
- else
257
- location[reopt_output['inputs']['Scenario']['Site']['PV']['pv_name']] = reopt_output['inputs']['Scenario']['Site']['PV']['location']
258
- azimuth[reopt_output['inputs']['Scenario']['Site']['PV']['pv_name']] = reopt_output['inputs']['Scenario']['Site']['PV']['azimuth']
259
- tilt[reopt_output['inputs']['Scenario']['Site']['PV']['pv_name']] = reopt_output['inputs']['Scenario']['Site']['PV']['tilt']
260
- module_type[reopt_output['inputs']['Scenario']['Site']['PV']['pv_name']] = reopt_output['inputs']['Scenario']['Site']['PV']['module_type']
261
- gcr[reopt_output['inputs']['Scenario']['Site']['PV']['pv_name']] = reopt_output['inputs']['Scenario']['Site']['PV']['gcr']
262
- end
263
- pv_inputs = reopt_output['inputs']['Scenario']['Site']['PV']
264
- if pv_inputs.is_a?(Hash)
265
- pv_inputs = [pv_inputs]
266
- end
267
- pv_outputs = reopt_output['outputs']['Scenario']['Site']['PV']
268
- if pv_outputs.is_a?(Hash)
269
- pv_outputs = [pv_outputs]
270
- end
271
- pv_outputs.each_with_index do |pv, i|
272
- if pv_inputs[i]
273
- if pv_inputs[i]['tilt']
274
- tilt[pv['pv_name']] = pv_inputs[i]['tilt']
275
- end
276
- if pv_inputs[i]['azimuth']
277
- azimuth[pv['pv_name']] = pv_inputs[i]['azimuth']
236
+ if reopt_output['inputs'].key?('PV')
237
+ if reopt_output['inputs']['PV'].is_a?(Array)
238
+ reopt_output['inputs']['PV'].each do |pv|
239
+ location[pv['name']] = pv['location']
240
+ azimuth[pv['name']] = pv['azimuth']
241
+ tilt[pv['name']] = pv['tilt']
242
+ module_type[pv['name']] = pv['module_type']
243
+ gcr[pv['name']] = pv['gcr']
278
244
  end
279
- if pv_inputs[i]['module_type']
280
- module_type[pv['pv_name']] = pv_inputs[i]['module_type']
245
+ else
246
+ location[reopt_output['inputs']['PV']['name']] = reopt_output['inputs']['PV']['location']
247
+ azimuth[reopt_output['inputs']['PV']['name']] = reopt_output['inputs']['PV']['azimuth']
248
+ tilt[reopt_output['inputs']['PV']['name']] = reopt_output['inputs']['PV']['tilt']
249
+ module_type[reopt_output['inputs']['PV']['name']] = reopt_output['inputs']['PV']['module_type']
250
+ gcr[reopt_output['inputs']['PV']['name']] = reopt_output['inputs']['PV']['gcr']
251
+ end
252
+ pv_inputs = reopt_output['inputs']['PV']
253
+ if pv_inputs.is_a?(Hash)
254
+ pv_inputs = [pv_inputs]
255
+ end
256
+ pv_outputs = reopt_output['outputs']['PV']
257
+ if pv_outputs.is_a?(Hash)
258
+ pv_outputs = [pv_outputs]
259
+ end
260
+ pv_outputs.each_with_index do |pv, i|
261
+ if pv_inputs[i]
262
+ if pv_inputs[i]['tilt']
263
+ tilt[pv['name']] = pv_inputs[i]['tilt']
264
+ end
265
+ if pv_inputs[i]['azimuth']
266
+ azimuth[pv['name']] = pv_inputs[i]['azimuth']
267
+ end
268
+ if pv_inputs[i]['module_type']
269
+ module_type[pv['name']] = pv_inputs[i]['module_type']
270
+ end
281
271
  end
272
+ scenario_report.distributed_generation.add_tech 'solar_pv', URBANopt::Reporting::DefaultReports::SolarPV.new({ size_kw: (pv['size_kw'] || 0), id: i, location: location[pv['name']], average_yearly_energy_produced_kwh: pv['average_yearly_energy_produced_kwh'], azimuth: azimuth[pv['name']], tilt: tilt[pv['name']], module_type: module_type[pv['name']], gcr: gcr[pv['name']] })
282
273
  end
283
- scenario_report.distributed_generation.add_tech 'solar_pv', URBANopt::Reporting::DefaultReports::SolarPV.new({ size_kw: (pv['size_kw'] || 0), id: i, location: location[pv['pv_name']], average_yearly_energy_produced_kwh: pv['average_yearly_energy_produced_kwh'], azimuth: azimuth[pv['pv_name']], tilt: tilt[pv['pv_name']], module_type: module_type[pv['pv_name']], gcr: gcr[pv['pv_name']] })
284
274
  end
285
275
 
286
- wind = reopt_output['outputs']['Scenario']['Site']['Wind']
287
- if !wind['size_kw'].nil? && (wind['size_kw'] != 0)
276
+ if reopt_output['outputs'].key?('Wind')
277
+ wind = reopt_output['outputs']['Wind']
288
278
  # find size_class
289
279
  size_class = nil
290
- if reopt_output['inputs']['Scenario']['Site']['Wind']['size_class']
291
- size_class = reopt_output['inputs']['Scenario']['Site']['Wind']['size_class']
292
- else
293
- size_class = 'commercial' # default
294
- end
295
- scenario_report.distributed_generation.add_tech 'wind', URBANopt::Reporting::DefaultReports::Wind.new({ size_kw: (wind['size_kw'] || 0), size_class: size_class, average_yearly_energy_produced_kwh: (wind['average_yearly_energy_produced_kwh'] || 0) })
280
+ size_class = reopt_output['inputs']['Wind']['size_class'] || 'commercial'
281
+ scenario_report.distributed_generation.add_tech 'wind', URBANopt::Reporting::DefaultReports::Wind.new({ size_kw: (wind['size_kw'] || 0), size_class:, average_yearly_energy_produced_kwh: (wind['average_yearly_energy_produced_kwh'] || 0) })
296
282
  end
297
283
 
298
- generator = reopt_output['outputs']['Scenario']['Site']['Generator']
299
- if !generator['size_kw'].nil? && (generator['size_kw'] != 0)
284
+ if reopt_output['outputs'].key?('Generator')
285
+ generator = reopt_output['outputs']['Generator']
300
286
  scenario_report.distributed_generation.add_tech 'generator', URBANopt::Reporting::DefaultReports::Generator.new({ size_kw: (generator['size_kw'] || 0) })
301
287
  end
302
288
 
303
- storage = reopt_output['outputs']['Scenario']['Site']['Storage']
304
- if !storage['size_kw'].nil? && (storage['size_kw'] != 0)
289
+ if reopt_output['outputs'].key?('ElectricStorage')
290
+ storage = reopt_output['outputs']['ElectricStorage']
305
291
  scenario_report.distributed_generation.add_tech 'storage', URBANopt::Reporting::DefaultReports::Storage.new({ size_kwh: (storage['size_kwh'] || 0), size_kw: (storage['size_kw'] || 0) })
306
292
  end
307
293
 
308
- reopt_resolution = reopt_output['inputs']['Scenario']['time_steps_per_hour']
294
+ reopt_resolution = reopt_output['inputs']['Settings']['time_steps_per_hour']
309
295
  generation_timeseries_kwh = Matrix[[0] * (8760 * scenario_report.timesteps_per_hour)]
310
296
 
311
- reopt_output['outputs']['Scenario']['Site']['PV'].each do |pv|
312
- if (pv['size_kw'] || 0) > 0 && !pv['year_one_power_production_series_kw'].nil?
313
- generation_timeseries_kwh += Matrix[convert_powerflow_resolution(pv['year_one_power_production_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour)]
297
+ if reopt_output['outputs'].key?('PV') && !reopt_output['outputs']['PV'].nil?
298
+ reopt_output['outputs']['PV'].each do |pv|
299
+ if (pv['size_kw'] || 0) > 0 && !pv['year_one_power_production_series_kw'].nil?
300
+ generation_timeseries_kwh += Matrix[convert_powerflow_resolution(pv['year_one_power_production_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour)]
301
+ end
314
302
  end
315
303
  end
316
304
 
317
- 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?
318
- generation_timeseries_kwh += Matrix[convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Wind']['year_one_power_production_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour)]
305
+ if reopt_output['outputs'].key?('Wind') && !reopt_output['outputs']['Wind'].nil? && ((reopt_output['outputs']['Wind']['size_kw'] || 0) > 0) && !reopt_output['outputs']['Wind']['year_one_power_production_series_kw'].nil?
306
+ generation_timeseries_kwh += Matrix[convert_powerflow_resolution(reopt_output['outputs']['Wind']['year_one_power_production_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour)]
319
307
  end
320
308
 
321
- 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?
322
- generation_timeseries_kwh += Matrix[convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Generator']['year_one_power_production_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour)]
309
+ if reopt_output['outputs'].key?('Generator') && !reopt_output['outputs']['Generator'].nil? && ((reopt_output['outputs']['Generator']['size_kw'] || 0) > 0) && !reopt_output['outputs']['Generator']['year_one_power_production_series_kw'].nil?
310
+ generation_timeseries_kwh += Matrix[convert_powerflow_resolution(reopt_output['outputs']['Generator']['year_one_power_production_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour)]
323
311
  end
324
312
 
325
313
  $generation_timeseries_kwh = generation_timeseries_kwh.to_a[0] || [0] * (8760 * scenario_report.timesteps_per_hour)
@@ -329,145 +317,188 @@ module URBANopt # :nodoc:
329
317
  scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Total(kw)')
330
318
  end
331
319
 
332
- $load = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['LoadProfile']['year_one_electric_load_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
320
+ $load = convert_powerflow_resolution(reopt_output['outputs']['ElectricLoad']['year_one_electric_load_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
333
321
  $load_col = scenario_report.timeseries_csv.column_names.index('REopt:Electricity:Load:Total(kw)')
334
322
  if $load_col.nil?
335
323
  $load_col = scenario_report.timeseries_csv.column_names.length
336
324
  scenario_report.timeseries_csv.column_names.push('REopt:Electricity:Load:Total(kw)')
337
325
  end
338
326
 
339
- $utility_to_load = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['ElectricTariff']['year_one_to_load_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
327
+ $utility_to_load = convert_powerflow_resolution(reopt_output['outputs']['ElectricUtility']['electric_to_load_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
340
328
  $utility_to_load_col = scenario_report.timeseries_csv.column_names.index('REopt:Electricity:Grid:ToLoad(kw)')
341
329
  if $utility_to_load_col.nil?
342
330
  $utility_to_load_col = scenario_report.timeseries_csv.column_names.length
343
331
  scenario_report.timeseries_csv.column_names.push('REopt:Electricity:Grid:ToLoad(kw)')
344
332
  end
345
333
 
346
- $utility_to_battery = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['ElectricTariff']['year_one_to_battery_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
347
- $utility_to_battery_col = scenario_report.timeseries_csv.column_names.index('REopt:Electricity:Grid:ToBattery(kw)')
348
- if $utility_to_battery_col.nil?
349
- $utility_to_battery_col = scenario_report.timeseries_csv.column_names.length
350
- scenario_report.timeseries_csv.column_names.push('REopt:Electricity:Grid:ToBattery(kw)')
351
- end
334
+ if !storage.nil?
335
+ $utility_to_battery = convert_powerflow_resolution(reopt_output['outputs']['ElectricUtility']['electric_to_storage_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
336
+ $utility_to_battery_col = scenario_report.timeseries_csv.column_names.index('REopt:Electricity:Grid:ToBattery(kw)')
337
+ if $utility_to_battery_col.nil?
338
+ $utility_to_battery_col = scenario_report.timeseries_csv.column_names.length
339
+ scenario_report.timeseries_csv.column_names.push('REopt:Electricity:Grid:ToBattery(kw)')
340
+ end
352
341
 
353
- $storage_to_load = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Storage']['year_one_to_load_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
354
- $storage_to_load_col = scenario_report.timeseries_csv.column_names.index('REopt:Electricity:Storage:ToLoad(kw)')
355
- if $storage_to_load_col.nil?
356
- $storage_to_load_col = scenario_report.timeseries_csv.column_names.length
357
- scenario_report.timeseries_csv.column_names.push('REopt:Electricity:Storage:ToLoad(kw)')
358
- end
342
+ $storage_to_load = convert_powerflow_resolution(reopt_output['outputs']['ElectricStorage']['storage_to_load_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
343
+ $storage_to_load_col = scenario_report.timeseries_csv.column_names.index('REopt:Electricity:Storage:ToLoad(kw)')
344
+ if $storage_to_load_col.nil?
345
+ $storage_to_load_col = scenario_report.timeseries_csv.column_names.length
346
+ scenario_report.timeseries_csv.column_names.push('REopt:Electricity:Storage:ToLoad(kw)')
347
+ end
359
348
 
360
- $storage_to_grid = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Storage']['year_one_to_grid_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
361
- $storage_to_grid_col = scenario_report.timeseries_csv.column_names.index('REopt:Electricity:Storage:ToGrid(kw)')
362
- if $storage_to_grid_col.nil?
363
- $storage_to_grid_col = scenario_report.timeseries_csv.column_names.length
364
- scenario_report.timeseries_csv.column_names.push('REopt:Electricity:Storage:ToGrid(kw)')
365
- end
349
+ $storage_to_grid = convert_powerflow_resolution(reopt_output['outputs']['ElectricStorage']['electric_to_grid_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
350
+ $storage_to_grid_col = scenario_report.timeseries_csv.column_names.index('REopt:Electricity:Storage:ToGrid(kw)')
351
+ if $storage_to_grid_col.nil?
352
+ $storage_to_grid_col = scenario_report.timeseries_csv.column_names.length
353
+ scenario_report.timeseries_csv.column_names.push('REopt:Electricity:Storage:ToGrid(kw)')
354
+ end
366
355
 
367
- $storage_soc = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Storage']['year_one_soc_series_pct'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
368
- $storage_soc_col = scenario_report.timeseries_csv.column_names.index('REopt:Electricity:Storage:StateOfCharge(pct)')
369
- if $storage_soc_col.nil?
370
- $storage_soc_col = scenario_report.timeseries_csv.column_names.length
371
- scenario_report.timeseries_csv.column_names.push('REopt:Electricity:Storage:StateOfCharge(pct)')
356
+ $storage_soc = convert_powerflow_resolution(reopt_output['outputs']['ElectricStorage']['soc_series_fraction'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
357
+ $storage_soc_col = scenario_report.timeseries_csv.column_names.index('REopt:Electricity:Storage:StateOfCharge(pct)')
358
+ if $storage_soc_col.nil?
359
+ $storage_soc_col = scenario_report.timeseries_csv.column_names.length
360
+ scenario_report.timeseries_csv.column_names.push('REopt:Electricity:Storage:StateOfCharge(pct)')
361
+ end
372
362
  end
373
363
 
374
- $generator_total = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Generator']['year_one_power_production_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
375
- $generator_total_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Generator:Total(kw)')
376
- if $generator_total_col.nil?
377
- $generator_total_col = scenario_report.timeseries_csv.column_names.length
378
- scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Generator:Total(kw)')
379
- end
364
+ if !generator.nil?
365
+ # $generator_total = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Generator']['year_one_power_production_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
366
+ $generator_total_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Generator:Total(kw)')
367
+ if $generator_total_col.nil?
368
+ $generator_total_col = scenario_report.timeseries_csv.column_names.length
369
+ scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Generator:Total(kw)')
370
+ end
380
371
 
381
- $generator_to_battery = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Generator']['year_one_to_battery_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
382
- $generator_to_battery_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Generator:ToBattery(kw)')
383
- if $generator_to_battery_col.nil?
384
- $generator_to_battery_col = scenario_report.timeseries_csv.column_names.length
385
- scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Generator:ToBattery(kw)')
386
- end
372
+ if !storage.nil?
373
+ $generator_to_battery = convert_powerflow_resolution(reopt_output['outputs']['Generator']['electric_to_storage_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
374
+ $generator_to_battery_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Generator:ToBattery(kw)')
375
+ if $generator_to_battery_col.nil?
376
+ $generator_to_battery_col = scenario_report.timeseries_csv.column_names.length
377
+ scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Generator:ToBattery(kw)')
378
+ end
379
+ end
387
380
 
388
- $generator_to_load = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Generator']['year_one_to_load_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
389
- $generator_to_load_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Generator:ToLoad(kw)')
390
- if $generator_to_load_col.nil?
391
- $generator_to_load_col = scenario_report.timeseries_csv.column_names.length
392
- scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Generator:ToLoad(kw)')
393
- end
381
+ $generator_to_load = convert_powerflow_resolution(reopt_output['outputs']['Generator']['electric_to_load_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
382
+ $generator_to_load_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Generator:ToLoad(kw)')
383
+ if $generator_to_load_col.nil?
384
+ $generator_to_load_col = scenario_report.timeseries_csv.column_names.length
385
+ scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Generator:ToLoad(kw)')
386
+ end
394
387
 
395
- $generator_to_grid = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Generator']['year_one_to_grid_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
396
- $generator_to_grid_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Generator:ToGrid(kw)')
397
- if $generator_to_grid_col.nil?
398
- $generator_to_grid_col = scenario_report.timeseries_csv.column_names.length
399
- scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Generator:ToGrid(kw)')
388
+ $generator_to_grid = convert_powerflow_resolution(reopt_output['outputs']['Generator']['electric_to_grid_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
389
+ $generator_to_grid_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Generator:ToGrid(kw)')
390
+ if $generator_to_grid_col.nil?
391
+ $generator_to_grid_col = scenario_report.timeseries_csv.column_names.length
392
+ scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Generator:ToGrid(kw)')
393
+ end
400
394
  end
401
395
 
402
- $pv_total_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:PV:Total(kw)')
403
- if $pv_total_col.nil?
404
- $pv_total_col = scenario_report.timeseries_csv.column_names.length
405
- scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:PV:Total(kw)')
406
- end
396
+ if reopt_output['outputs'].key?('PV') && !reopt_output['outputs']['PV'].nil?
397
+ $pv_total_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:PV:Total(kw)')
398
+ if $pv_total_col.nil?
399
+ $pv_total_col = scenario_report.timeseries_csv.column_names.length
400
+ scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:PV:Total(kw)')
401
+ end
407
402
 
408
- $pv_to_battery_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:PV:ToBattery(kw)')
409
- if $pv_to_battery_col.nil?
410
- $pv_to_battery_col = scenario_report.timeseries_csv.column_names.length
411
- scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:PV:ToBattery(kw)')
412
- end
403
+ if !storage.nil?
404
+ $pv_to_battery_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:PV:ToBattery(kw)')
405
+ if $pv_to_battery_col.nil?
406
+ $pv_to_battery_col = scenario_report.timeseries_csv.column_names.length
407
+ scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:PV:ToBattery(kw)')
408
+ end
409
+ end
413
410
 
414
- $pv_to_load_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:PV:ToLoad(kw)')
415
- if $pv_to_load_col.nil?
416
- $pv_to_load_col = scenario_report.timeseries_csv.column_names.length
417
- scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:PV:ToLoad(kw)')
418
- end
411
+ $pv_to_load_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:PV:ToLoad(kw)')
412
+ if $pv_to_load_col.nil?
413
+ $pv_to_load_col = scenario_report.timeseries_csv.column_names.length
414
+ scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:PV:ToLoad(kw)')
415
+ end
419
416
 
420
- $pv_to_grid_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:PV:ToGrid(kw)')
421
- if $pv_to_grid_col.nil?
422
- $pv_to_grid_col = scenario_report.timeseries_csv.column_names.length
423
- scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:PV:ToGrid(kw)')
424
- end
417
+ $pv_to_grid_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:PV:ToGrid(kw)')
418
+ if $pv_to_grid_col.nil?
419
+ $pv_to_grid_col = scenario_report.timeseries_csv.column_names.length
420
+ scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:PV:ToGrid(kw)')
421
+ end
422
+
423
+ $pv_total = Matrix[[0] * (8760 * scenario_report.timesteps_per_hour)]
424
+ if !storage.nil?
425
+ $pv_to_battery = Matrix[[0] * (8760 * scenario_report.timesteps_per_hour)]
426
+ end
427
+ $pv_to_load = Matrix[[0] * (8760 * scenario_report.timesteps_per_hour)]
428
+ $pv_to_grid = Matrix[[0] * (8760 * scenario_report.timesteps_per_hour)]
429
+
430
+ reopt_output['outputs']['PV'].each_with_index do |pv, i|
431
+ if (pv['size_kw'] || 0) > 0
432
+ # $pv_total += Matrix[convert_powerflow_resolution(pv['year_one_power_production_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)]
433
+ if !storage.nil?
434
+ $pv_to_battery += Matrix[convert_powerflow_resolution(pv['electric_to_storage_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)]
435
+ end
436
+ $pv_to_load += Matrix[convert_powerflow_resolution(pv['electric_to_load_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)]
437
+ $pv_to_grid += Matrix[convert_powerflow_resolution(pv['electric_to_grid_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)]
438
+ end
439
+ end
425
440
 
426
- $pv_total = Matrix[[0] * (8760 * scenario_report.timesteps_per_hour)]
427
- $pv_to_battery = Matrix[[0] * (8760 * scenario_report.timesteps_per_hour)]
428
- $pv_to_load = Matrix[[0] * (8760 * scenario_report.timesteps_per_hour)]
429
- $pv_to_grid = Matrix[[0] * (8760 * scenario_report.timesteps_per_hour)]
430
-
431
- reopt_output['outputs']['Scenario']['Site']['PV'].each_with_index do |pv, i|
432
- if (pv['size_kw'] || 0) > 0
433
- $pv_total += Matrix[convert_powerflow_resolution(pv['year_one_power_production_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)]
434
- $pv_to_battery += Matrix[convert_powerflow_resolution(pv['year_one_to_battery_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)]
435
- $pv_to_load += Matrix[convert_powerflow_resolution(pv['year_one_to_load_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)]
436
- $pv_to_grid += Matrix[convert_powerflow_resolution(pv['year_one_to_grid_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)]
441
+ $pv_total = $pv_total.to_a[0]
442
+ if !storage.nil?
443
+ $pv_to_battery = $pv_to_battery.to_a[0]
437
444
  end
445
+ $pv_to_load = $pv_to_load.to_a[0]
446
+ $pv_to_grid = $pv_to_grid.to_a[0]
438
447
  end
439
448
 
440
- $pv_total = $pv_total.to_a[0]
441
- $pv_to_battery = $pv_to_battery.to_a[0]
442
- $pv_to_load = $pv_to_load.to_a[0]
443
- $pv_to_grid = $pv_to_grid.to_a[0]
449
+ if !wind.nil?
450
+ # $wind_total = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Wind']['year_one_power_production_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
451
+ $wind_total_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Wind:Total(kw)')
452
+ if $wind_total_col.nil?
453
+ $wind_total_col = scenario_report.timeseries_csv.column_names.length
454
+ scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Wind:Total(kw)')
455
+ end
444
456
 
445
- $wind_total = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Wind']['year_one_power_production_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
446
- $wind_total_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Wind:Total(kw)')
447
- if $wind_total_col.nil?
448
- $wind_total_col = scenario_report.timeseries_csv.column_names.length
449
- scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Wind:Total(kw)')
450
- end
457
+ if !storage.nil?
458
+ $wind_to_battery = convert_powerflow_resolution(reopt_output['outputs']['Wind']['electric_to_storage_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
459
+ $wind_to_battery_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Wind:ToBattery(kw)')
460
+ if $wind_to_battery_col.nil?
461
+ $wind_to_battery_col = scenario_report.timeseries_csv.column_names.length
462
+ scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Wind:ToBattery(kw)')
463
+ end
464
+ end
451
465
 
452
- $wind_to_battery = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Wind']['year_one_to_battery_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
453
- $wind_to_battery_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Wind:ToBattery(kw)')
454
- if $wind_to_battery_col.nil?
455
- $wind_to_battery_col = scenario_report.timeseries_csv.column_names.length
456
- scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Wind:ToBattery(kw)')
457
- end
466
+ $wind_to_load = convert_powerflow_resolution(reopt_output['outputs']['Wind']['electric_to_load_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
467
+ $wind_to_load_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Wind:ToLoad(kw)')
468
+ if $wind_to_load_col.nil?
469
+ $wind_to_load_col = scenario_report.timeseries_csv.column_names.length
470
+ scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Wind:ToLoad(kw)')
471
+ end
458
472
 
459
- $wind_to_load = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Wind']['year_one_to_load_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
460
- $wind_to_load_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Wind:ToLoad(kw)')
461
- if $wind_to_load_col.nil?
462
- $wind_to_load_col = scenario_report.timeseries_csv.column_names.length
463
- scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Wind:ToLoad(kw)')
473
+ $wind_to_grid = convert_powerflow_resolution(reopt_output['outputs']['Wind']['electric_to_grid_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
474
+ $wind_to_grid_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Wind:ToGrid(kw)')
475
+ if $wind_to_grid_col.nil?
476
+ $wind_to_grid_col = scenario_report.timeseries_csv.column_names.length
477
+ scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Wind:ToGrid(kw)')
478
+ end
464
479
  end
465
480
 
466
- $wind_to_grid = convert_powerflow_resolution(reopt_output['outputs']['Scenario']['Site']['Wind']['year_one_to_grid_series_kw'], reopt_resolution, scenario_report.timesteps_per_hour) || [0] * (8760 * scenario_report.timesteps_per_hour)
467
- $wind_to_grid_col = scenario_report.timeseries_csv.column_names.index('REopt:ElectricityProduced:Wind:ToGrid(kw)')
468
- if $wind_to_grid_col.nil?
469
- $wind_to_grid_col = scenario_report.timeseries_csv.column_names.length
470
- scenario_report.timeseries_csv.column_names.push('REopt:ElectricityProduced:Wind:ToGrid(kw)')
481
+ def modrow(data, idx) # :nodoc:
482
+ data[$generation_timeseries_kwh_col] = $generation_timeseries_kwh[idx] || 0
483
+ data[$load_col] = $load[idx] || 0
484
+ data[$utility_to_load_col] = $utility_to_load[idx] || 0
485
+ data[$utility_to_battery_col] = $utility_to_battery[idx] || 0 if defined?(storage)
486
+ data[$storage_to_load_col] = $storage_to_load[idx] || 0 if defined?(storage)
487
+ data[$storage_to_grid_col] = $storage_to_grid[idx] || 0 if defined?(storage)
488
+ data[$storage_soc_col] = $storage_soc[idx] || 0 if defined?(storage)
489
+ data[$generator_total_col] = $generator_total[idx] || 0 if defined?(generator)
490
+ data[$generator_to_battery_col] = $generator_to_battery[idx] || 0 if defined?(generator) && defined?(storage)
491
+ data[$generator_to_load_col] = $generator_to_load[idx] || 0 if defined?(generator)
492
+ data[$generator_to_grid_col] = $generator_to_grid[idx] || 0 if defined?(generator)
493
+ data[$pv_total_col] = $pv_total[idx] || 0
494
+ data[$pv_to_battery_col] = $pv_to_battery[idx] || 0 if defined?(storage)
495
+ data[$pv_to_load_col] = $pv_to_load[idx] || 0
496
+ data[$pv_to_grid_col] = $pv_to_grid[idx] || 0
497
+ data[$wind_total_col] = $wind_total[idx] || 0 if defined?(wind)
498
+ data[$wind_to_battery_col] = $wind_to_battery[idx] || 0 if defined?(wind) && defined?(storage)
499
+ data[$wind_to_load_col] = $wind_to_load[idx] || 0 if defined?(wind)
500
+ data[$wind_to_grid_col] = $wind_to_grid[idx] || 0 if defined?(wind)
501
+ return data
471
502
  end
472
503
 
473
504
  old_data = CSV.open(scenario_report.timeseries_csv.path).read