urbanopt-reporting 0.1.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +19 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +15 -0
  4. data/.github/pull_request_template.md +13 -0
  5. data/.rdoc_options +36 -0
  6. data/CHANGELOG.md +39 -0
  7. data/CONTRIBUTING.md +1 -1
  8. data/LICENSE.md +1 -1
  9. data/RDOC_MAIN.md +10 -0
  10. data/README.md +1 -1
  11. data/Rakefile +1 -1
  12. data/deploy_docs.sh +5 -0
  13. data/doc_templates/LICENSE.md +1 -1
  14. data/doc_templates/copyright_erb.txt +1 -1
  15. data/doc_templates/copyright_js.txt +1 -1
  16. data/doc_templates/copyright_ruby.txt +1 -1
  17. data/docs/.gitignore +3 -0
  18. data/docs/.vuepress/components/InnerJsonSchema.vue +76 -0
  19. data/docs/.vuepress/components/JsonSchema.vue +12 -0
  20. data/docs/.vuepress/components/ScenarioSchema.vue +12 -0
  21. data/docs/.vuepress/components/StaticLink.vue +8 -0
  22. data/docs/.vuepress/config.js +25 -0
  23. data/docs/.vuepress/highlight.js +8 -0
  24. data/docs/.vuepress/json-schema-deref-loader.js +22 -0
  25. data/docs/.vuepress/public/custom_rdoc_styles.css +78 -0
  26. data/docs/.vuepress/styles/palette.styl +1 -0
  27. data/docs/.vuepress/utils.js +17 -0
  28. data/docs/README.md +9 -0
  29. data/docs/package-lock.json +10018 -0
  30. data/docs/package.json +30 -0
  31. data/docs/schemas/scenario-schema.md +3 -0
  32. data/lib/measures/default_feature_reports/LICENSE.md +1 -1
  33. data/lib/measures/default_feature_reports/measure.rb +261 -88
  34. data/lib/measures/default_feature_reports/measure.xml +11 -11
  35. data/lib/urbanopt/reporting.rb +1 -1
  36. data/lib/urbanopt/reporting/default_reports.rb +1 -1
  37. data/lib/urbanopt/reporting/default_reports/construction_cost.rb +1 -1
  38. data/lib/urbanopt/reporting/default_reports/date.rb +1 -1
  39. data/lib/urbanopt/reporting/default_reports/distributed_generation.rb +119 -6
  40. data/lib/urbanopt/reporting/default_reports/end_use.rb +1 -1
  41. data/lib/urbanopt/reporting/default_reports/end_uses.rb +53 -39
  42. data/lib/urbanopt/reporting/default_reports/extension.rb +30 -0
  43. data/lib/urbanopt/reporting/default_reports/feature_report.rb +52 -21
  44. data/lib/urbanopt/reporting/default_reports/generator.rb +2 -2
  45. data/lib/urbanopt/reporting/default_reports/location.rb +12 -12
  46. data/lib/urbanopt/reporting/default_reports/logger.rb +1 -1
  47. data/lib/urbanopt/reporting/default_reports/power_distribution.rb +1 -1
  48. data/lib/urbanopt/reporting/default_reports/program.rb +87 -87
  49. data/lib/urbanopt/reporting/default_reports/reporting_period.rb +87 -79
  50. data/lib/urbanopt/reporting/default_reports/scenario_report.rb +1 -1
  51. data/lib/urbanopt/reporting/default_reports/schema/README.md +1 -1
  52. data/lib/urbanopt/reporting/default_reports/schema/scenario_csv_columns.txt +18 -1
  53. data/lib/urbanopt/reporting/default_reports/schema/scenario_schema.json +117 -82
  54. data/lib/urbanopt/reporting/default_reports/solar_pv.rb +2 -2
  55. data/lib/urbanopt/reporting/default_reports/storage.rb +2 -2
  56. data/lib/urbanopt/reporting/default_reports/thermal_storage.rb +111 -0
  57. data/lib/urbanopt/reporting/default_reports/timeseries_csv.rb +1 -1
  58. data/lib/urbanopt/reporting/default_reports/validator.rb +1 -1
  59. data/lib/urbanopt/reporting/default_reports/wind.rb +2 -2
  60. data/lib/urbanopt/reporting/derived_extension.rb +1 -1
  61. data/lib/urbanopt/reporting/version.rb +2 -2
  62. data/urbanopt-reporting-gem.gemspec +4 -4
  63. metadata +37 -15
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt (tm), Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without modification,
@@ -36,6 +36,7 @@ require_relative 'timeseries_csv'
36
36
  require_relative 'distributed_generation'
37
37
  require_relative 'power_distribution'
38
38
  require_relative 'validator'
39
+ require_relative 'thermal_storage'
39
40
 
40
41
  require 'json-schema'
41
42
  require 'json'
@@ -52,7 +53,7 @@ module URBANopt
52
53
  ##
53
54
  class FeatureReport
54
55
  attr_accessor :id, :name, :directory_name, :feature_type, :timesteps_per_hour, :simulation_status,
55
- :timeseries_csv, :location, :program, :design_parameters, :construction_costs, :reporting_periods, :distributed_generation, :power_distribution # :nodoc:
56
+ :timeseries_csv, :location, :program, :design_parameters, :construction_costs, :reporting_periods, :distributed_generation, :power_distribution, :thermal_storage # :nodoc:
56
57
  ##
57
58
  # Each FeatureReport object corresponds to a single Feature.
58
59
  ##
@@ -88,6 +89,8 @@ module URBANopt
88
89
 
89
90
  @power_distribution = PowerDistribution.new(hash[:power_distribution])
90
91
 
92
+ @thermal_storage = ThermalStorage.new(hash[:thermal_storage])
93
+
91
94
  # initialize class variables @@validator and @@schema
92
95
  @@validator ||= Validator.new
93
96
  @@schema ||= @@validator.schema
@@ -108,6 +111,7 @@ module URBANopt
108
111
  hash[:reporting_periods] = []
109
112
  hash[:distributed_generation] = {}
110
113
  hash[:power_distribution] = {}
114
+ hash[:thermal_storage] = {}
111
115
  return hash
112
116
  end
113
117
 
@@ -209,6 +213,8 @@ module URBANopt
209
213
 
210
214
  result[:power_distribution] = @power_distribution.to_hash if @power_distribution
211
215
 
216
+ result[:thermal_storage] = @thermal_storage.to_hash if @thermal_storage
217
+
212
218
  # validate feature_report properties against schema
213
219
  if @@validator.validate(@@schema[:definitions][:FeatureReport][:properties], result).any?
214
220
  raise "feature_report properties does not match schema: #{@@validator.validate(@@schema[:definitions][:FeatureReport][:properties], result)}"
@@ -217,31 +223,36 @@ module URBANopt
217
223
  return result
218
224
  end
219
225
 
220
- ##
221
- # Saves the 'default_feature_report.json' and 'default_feature_report.csv' files
226
+ ##
227
+ # Calls the individual functions to save 'default_feature_report.json' and 'default_feature_report.csv'
228
+ # For backward compatibility and ease of use
222
229
  ##
223
230
  # [parameters]:
224
- # +file_name+ - _String_ - Assign a name to the saved feature report results file without an extension
231
+ # +file_name+ - _String_ - Assign a name to the saved feature report file without an extension
225
232
  def save_feature_report(file_name = 'default_feature_report')
233
+ save_json_report(file_name)
234
+ save_csv_report(file_name)
235
+ end
236
+
237
+ ##
238
+ # Saves the 'default_feature_report.json' file to the results directory
239
+ ##
240
+ # [parameters]:
241
+ # +file_name+ - _String_ - Assign a name to the saved feature report file without an extension
242
+ def save_json_report(file_name = 'default_feature_report')
226
243
  # reassign the initialize local variable @file_name to the file name input.
227
244
  @file_name = file_name
228
245
 
246
+ # define the results_dir_path
247
+ results_dir_path = File.join(@directory_name, 'feature_reports')
229
248
  # create feature reports directory
230
- Dir.mkdir(File.join(@directory_name, 'feature_reports')) unless Dir.exist?(File.join(@directory_name, 'feature_reports'))
231
-
232
- # save the csv data
233
- old_timeseries_path = nil
234
- if !@timeseries_csv.path.nil?
235
- old_timeseries_path = @timeseries_csv.path
236
- end
237
-
238
- @timeseries_csv.path = File.join(@directory_name, 'feature_reports', file_name + '.csv')
239
- @timeseries_csv.save_data
249
+ Dir.mkdir(results_dir_path) unless Dir.exist?(File.join(@directory_name, 'feature_reports'))
240
250
 
251
+ ## save json rport
241
252
  # feature_hash
242
253
  feature_hash = to_hash
243
254
 
244
- json_name_path = File.join(@directory_name, 'feature_reports', file_name + '.json')
255
+ json_name_path = File.join(results_dir_path, file_name + '.json')
245
256
 
246
257
  File.open(json_name_path, 'w') do |f|
247
258
  f.puts JSON.pretty_generate(feature_hash)
@@ -253,13 +264,33 @@ module URBANopt
253
264
  end
254
265
  end
255
266
 
256
- if !old_timeseries_path.nil?
257
- @timeseries_csv.path = old_timeseries_path
258
- else
259
- @timeseries_csv.path = File.join(@directory_name, 'feature_reports', file_name + '.csv')
267
+ end
268
+
269
+ ##
270
+ # Saves the 'default_feature_report.csv' file to the results directory
271
+ ##
272
+ # [parameters]:
273
+ # +file_name+ - _String_ - Assign a name to the saved feature report file without an extension
274
+ def save_csv_report(file_name = 'default_feature_report')
275
+ # reassign the initialize local variable @file_name to the file name input.
276
+ @file_name = file_name
277
+
278
+ # define the results_dir_path
279
+ results_dir_path = File.join(@directory_name, 'feature_reports')
280
+ # create feature reports directory
281
+ Dir.mkdir(results_dir_path) unless Dir.exist?(File.join(@directory_name, 'feature_reports'))
282
+
283
+ ## copy CSV report to the new feature_reports folder
284
+ # get all folder names in the feature diectory
285
+ directory_folders = Dir.glob "#{@directory_name}/*/"
286
+ # copy the CSV report to the new feature_reports folder
287
+ directory_folders.each do |f|
288
+ if f.include? '_default_feature_reports'
289
+ FileUtils.cp(File.join(f, 'default_feature_reports.csv'), File.join(results_dir_path, @file_name +'.csv'))
290
+ end
260
291
  end
261
- return true
262
292
  end
293
+
263
294
  end
264
295
  end
265
296
  end
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt (tm), Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without modification,
@@ -60,7 +60,7 @@ module URBANopt
60
60
  @@schema ||= @@validator.schema
61
61
 
62
62
  # initialize @@logger
63
- @@logger ||= URBANopt::Scenario::DefaultReports.logger
63
+ @@logger ||= URBANopt::Reporting::DefaultReports.logger
64
64
  end
65
65
 
66
66
  ##
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt (tm), Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without modification,
@@ -39,9 +39,9 @@ module URBANopt
39
39
  # Location include all location information.
40
40
  ##
41
41
  class Location
42
- attr_accessor :latitude, :longitude, :surface_elevation, :weather_filename #:nodoc:
42
+ attr_accessor :latitude_deg, :longitude_deg, :surface_elevation_ft, :weather_filename #:nodoc:
43
43
  ##
44
- # Location class initialize location attributes: +:latitude+ , +:longitude+ , +:surface_elevation+ , +:weather_filename+
44
+ # Location class initialize location attributes: +:latitude_deg+ , +:longitude_deg+ , +:surface_elevation_ft+ , +:weather_filename+
45
45
  ##
46
46
  # [parameters:]
47
47
  # +hash+ - _Hash_ - A hash which may contain a deserialized location.
@@ -50,9 +50,9 @@ module URBANopt
50
50
  hash.delete_if { |k, v| v.nil? }
51
51
  hash = defaults.merge(hash)
52
52
 
53
- @latitude = hash[:latitude]
54
- @longitude = hash[:longitude]
55
- @surface_elevation = hash[:surface_elevation]
53
+ @latitude_deg = hash[:latitude_deg]
54
+ @longitude_deg = hash[:longitude_deg]
55
+ @surface_elevation_ft = hash[:surface_elevation_ft]
56
56
  @weather_filename = hash[:weather_filename]
57
57
 
58
58
  # initialize class variables @@validator and @@schema
@@ -68,9 +68,9 @@ module URBANopt
68
68
  ##
69
69
  def to_hash
70
70
  result = {}
71
- result[:latitude] = @latitude if @latitude
72
- result[:longitude] = @longitude if @longitude
73
- result[:surface_elevation] = @surface_elevation if @surface_elevation
71
+ result[:latitude_deg] = @latitude_deg if @latitude_deg
72
+ result[:longitude_deg] = @longitude_deg if @longitude_deg
73
+ result[:surface_elevation_ft] = @surface_elevation_ft if @surface_elevation_ft
74
74
  result[:weather_filename] = @weather_filename if @weather_filename
75
75
 
76
76
  # validate location properties against schema
@@ -86,9 +86,9 @@ module URBANopt
86
86
  ##
87
87
  def defaults
88
88
  hash = {}
89
- hash[:latitude] = nil
90
- hash[:longitude] = nil
91
- hash[:surface_elevation] = nil
89
+ hash[:latitude_deg] = nil
90
+ hash[:longitude_deg] = nil
91
+ hash[:surface_elevation_ft] = nil
92
92
  hash[:weather_filename] = nil
93
93
 
94
94
  return hash
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt (tm), Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without modification,
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt (tm), Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without modification,
@@ -1,5 +1,5 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt (tm), Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
4
  #
5
5
  # Redistribution and use in source and binary forms, with or without modification,
@@ -40,18 +40,18 @@ module URBANopt
40
40
  # Program includes all building program related information.
41
41
  ##
42
42
  class Program
43
- attr_accessor :site_area, :floor_area, :conditioned_area, :unconditioned_area, :footprint_area, :maximum_roof_height,
44
- :maximum_number_of_stories, :maximum_number_of_stories_above_ground, :parking_area, :number_of_parking_spaces,
45
- :number_of_parking_spaces_charging, :parking_footprint_area, :maximum_parking_height, :maximum_number_of_parking_stories,
43
+ attr_accessor :site_area_sqft, :floor_area_sqft, :conditioned_area_sqft, :unconditioned_area_sqft, :footprint_area_sqft, :maximum_roof_height_ft,
44
+ :maximum_number_of_stories, :maximum_number_of_stories_above_ground, :parking_area_sqft, :number_of_parking_spaces,
45
+ :number_of_parking_spaces_charging, :parking_footprint_area_sqft, :maximum_parking_height_ft, :maximum_number_of_parking_stories,
46
46
  :maximum_number_of_parking_stories_above_ground, :number_of_residential_units, :building_types, :building_type, :maximum_occupancy,
47
- :area, :window_area, :north_window_area, :south_window_area, :east_window_area, :west_window_area, :wall_area, :roof_area, :equipment_roof_area,
48
- :photovoltaic_roof_area, :available_roof_area, :total_roof_area, :orientation, :aspect_ratio, :total_construction_cost # :nodoc:
49
- # Program class initialize building program attributes: +:site_area+ , +:floor_area+ , +:conditioned_area+ , +:unconditioned_area+ ,
50
- # +:footprint_area+ , +:maximum_roof_height, +:maximum_number_of_stories+ , +:maximum_number_of_stories_above_ground+ , +:parking_area+ ,
51
- # +:number_of_parking_spaces+ , +:number_of_parking_spaces_charging+ , +:parking_footprint_area+ , +:maximum_parking_height+ , +:maximum_number_of_parking_stories+ ,
47
+ :area_sqft, :window_area_sqft, :north_window_area_sqft, :south_window_area_sqft, :east_window_area_sqft, :west_window_area_sqft, :wall_area_sqft, :roof_area_sqft, :equipment_roof_area_sqft,
48
+ :photovoltaic_roof_area_sqft, :available_roof_area_sqft, :total_roof_area_sqft, :orientation_deg, :aspect_ratio, :total_construction_cost_dollar # :nodoc:
49
+ # Program class initialize building program attributes: +:site_area_sqft+ , +:floor_area_sqft+ , +:conditioned_area_sqft+ , +:unconditioned_area_sqft+ ,
50
+ # +:footprint_area_sqft+ , +:maximum_roof_height_ft, +:maximum_number_of_stories+ , +:maximum_number_of_stories_above_ground+ , +:parking_area_sqft+ ,
51
+ # +:number_of_parking_spaces+ , +:number_of_parking_spaces_charging+ , +:parking_footprint_area_sqft+ , +:maximum_parking_height_ft+ , +:maximum_number_of_parking_stories+ ,
52
52
  # +:maximum_number_of_parking_stories_above_ground+ , +:number_of_residential_units+ , +:building_types+ , +:building_type+ , +:maximum_occupancy+ ,
53
- # +:area+ , +:window_area+ , +:north_window_area+ , +:south_window_area+ , +:east_window_area+ , +:west_window_area+ , +:wall_area+ , +:roof_area+ ,
54
- # +:equipment_roof_area+ , +:photovoltaic_roof_area+ , +:available_roof_area+ , +:total_roof_area+ , +:orientation+ , +:aspect_ratio+
53
+ # +:area_sqft+ , +:window_area_sqft+ , +:north_window_area_sqft+ , +:south_window_area_sqft+ , +:east_window_area_sqft+ , +:west_window_area_sqft+ , +:wall_area_sqft+ , +:roof_area_sqft+ ,
54
+ # +:equipment_roof_area_sqft+ , +:photovoltaic_roof_area_sqft+ , +:available_roof_area_sqft+ , +:total_roof_area_sqft+ , +:orientation_deg+ , +:aspect_ratio+
55
55
  ##
56
56
  # [parameters:]
57
57
  # +hash+ - _Hash_ - A hash which may contain a deserialized program.
@@ -60,29 +60,29 @@ module URBANopt
60
60
  hash.delete_if { |k, v| v.nil? }
61
61
  hash = defaults.merge(hash)
62
62
 
63
- @site_area = hash[:site_area]
64
- @floor_area = hash[:floor_area]
65
- @conditioned_area = hash[:conditioned_area]
66
- @unconditioned_area = hash[:unconditioned_area]
67
- @footprint_area = hash[:footprint_area]
68
- @maximum_roof_height = hash[:maximum_roof_height]
63
+ @site_area_sqft = hash[:site_area_sqft]
64
+ @floor_area_sqft = hash[:floor_area_sqft]
65
+ @conditioned_area_sqft = hash[:conditioned_area_sqft]
66
+ @unconditioned_area_sqft = hash[:unconditioned_area_sqft]
67
+ @footprint_area_sqft = hash[:footprint_area_sqft]
68
+ @maximum_roof_height_ft = hash[:maximum_roof_height_ft]
69
69
  @maximum_number_of_stories = hash[:maximum_number_of_stories]
70
70
  @maximum_number_of_stories_above_ground = hash[:maximum_number_of_stories_above_ground]
71
- @parking_area = hash[:parking_area]
71
+ @parking_area_sqft = hash[:parking_area_sqft]
72
72
  @number_of_parking_spaces = hash[:number_of_parking_spaces]
73
73
  @number_of_parking_spaces_charging = hash[:number_of_parking_spaces_charging]
74
- @parking_footprint_area = hash[:parking_footprint_area]
75
- @maximum_parking_height = hash[:maximum_parking_height]
74
+ @parking_footprint_area_sqft = hash[:parking_footprint_area_sqft]
75
+ @maximum_parking_height_ft = hash[:maximum_parking_height_ft]
76
76
  @maximum_number_of_parking_stories = hash[:maximum_number_of_parking_stories]
77
77
  @maximum_number_of_parking_stories_above_ground = hash[:maximum_number_of_parking_stories_above_ground]
78
78
  @number_of_residential_units = hash[:number_of_residential_units]
79
79
  @building_types = hash[:building_types]
80
- @window_area = hash[:window_area]
81
- @wall_area = hash[:wall_area]
82
- @roof_area = hash[:roof_area]
83
- @orientation = hash[:orientation]
80
+ @window_area_sqft = hash[:window_area_sqft]
81
+ @wall_area_sqft = hash[:wall_area_sqft]
82
+ @roof_area_sqft = hash[:roof_area_sqft]
83
+ @orientation_deg = hash[:orientation_deg]
84
84
  @aspect_ratio = hash[:aspect_ratio]
85
- @total_construction_cost = hash[:total_construction_cost]
85
+ @total_construction_cost_dollar = hash[:total_construction_cost_dollar]
86
86
 
87
87
  # initialize class variables @@validator and @@schema
88
88
  @@validator ||= Validator.new
@@ -94,29 +94,29 @@ module URBANopt
94
94
  ##
95
95
  def defaults
96
96
  hash = {}
97
- hash[:site_area] = nil
98
- hash[:floor_area] = nil
99
- hash[:conditioned_area] = nil
100
- hash[:unconditioned_area] = nil
101
- hash[:footprint_area] = nil
102
- hash[:maximum_roof_height] = nil
97
+ hash[:site_area_sqft] = nil
98
+ hash[:floor_area_sqft] = nil
99
+ hash[:conditioned_area_sqft] = nil
100
+ hash[:unconditioned_area_sqft] = nil
101
+ hash[:footprint_area_sqft] = nil
102
+ hash[:maximum_roof_height_ft] = nil
103
103
  hash[:maximum_number_of_stories] = nil
104
104
  hash[:maximum_number_of_stories_above_ground] = nil
105
- hash[:parking_area] = nil
105
+ hash[:parking_area_sqft] = nil
106
106
  hash[:number_of_parking_spaces] = nil
107
107
  hash[:number_of_parking_spaces_charging] = nil
108
- hash[:parking_footprint_area] = nil
109
- hash[:maximum_parking_height] = nil
108
+ hash[:parking_footprint_area_sqft] = nil
109
+ hash[:maximum_parking_height_ft] = nil
110
110
  hash[:maximum_number_of_parking_stories] = nil
111
111
  hash[:maximum_number_of_parking_stories_above_ground] = nil
112
112
  hash[:number_of_residential_units] = nil
113
- hash[:building_types] = [{ building_type: nil, maximum_occupancy: nil, floor_area: nil }]
114
- hash[:window_area] = { north_window_area: nil, south_window_area: nil, east_window_area: nil, west_window_area: nil, total_window_area: nil }
115
- hash[:wall_area] = { north_wall_area: nil, south_wall_area: nil, east_wall_area: nil, west_wall_area: nil, total_wall_area: nil }
116
- hash[:roof_area] = { equipment_roof_area: nil, photovoltaic_roof_area: nil, available_roof_area: nil, total_roof_area: nil }
117
- hash[:orientation] = nil
113
+ hash[:building_types] = [{ building_type: nil, maximum_occupancy: nil, floor_area_sqft: nil }]
114
+ hash[:window_area_sqft] = { north_window_area_sqft: nil, south_window_area_sqft: nil, east_window_area_sqft: nil, west_window_area_sqft: nil, total_window_area_sqft: nil }
115
+ hash[:wall_area_sqft] = { north_wall_area_sqft: nil, south_wall_area_sqft: nil, east_wall_area_sqft: nil, west_wall_area_sqft: nil, total_wall_area_sqft: nil }
116
+ hash[:roof_area_sqft] = { equipment_roof_area_sqft: nil, photovoltaic_roof_area_sqft: nil, available_roof_area_sqft: nil, total_roof_area_sqft: nil }
117
+ hash[:orientation_deg] = nil
118
118
  hash[:aspect_ratio] = nil
119
- hash[:total_construction_cost] = nil
119
+ hash[:total_construction_cost_dollar] = nil
120
120
  return hash
121
121
  end
122
122
 
@@ -128,19 +128,19 @@ module URBANopt
128
128
  ##
129
129
  def to_hash
130
130
  result = {}
131
- result[:site_area] = @site_area if @site_area
132
- result[:floor_area] = @floor_area if @floor_area
133
- result[:conditioned_area] = @conditioned_area if @conditioned_area
134
- result[:unconditioned_area] = @unconditioned_area if @unconditioned_area
135
- result[:footprint_area] = @footprint_area if @footprint_area
136
- result[:maximum_roof_height] = @maximum_roof_height if @maximum_roof_height
131
+ result[:site_area_sqft] = @site_area_sqft if @site_area_sqft
132
+ result[:floor_area_sqft] = @floor_area_sqft if @floor_area_sqft
133
+ result[:conditioned_area_sqft] = @conditioned_area_sqft if @conditioned_area_sqft
134
+ result[:unconditioned_area_sqft] = @unconditioned_area_sqft if @unconditioned_area_sqft
135
+ result[:footprint_area_sqft] = @footprint_area_sqft if @footprint_area_sqft
136
+ result[:maximum_roof_height_ft] = @maximum_roof_height_ft if @maximum_roof_height_ft
137
137
  result[:maximum_number_of_stories] = @maximum_number_of_stories if @maximum_number_of_stories
138
138
  result[:maximum_number_of_stories_above_ground] = @maximum_number_of_stories_above_ground if @maximum_number_of_parking_stories_above_ground
139
- result[:parking_area] = @parking_area if @parking_area
139
+ result[:parking_area_sqft] = @parking_area_sqft if @parking_area_sqft
140
140
  result[:number_of_parking_spaces] = @number_of_parking_spaces if @number_of_parking_spaces
141
141
  result[:number_of_parking_spaces_charging] = @number_of_parking_spaces_charging if @number_of_parking_spaces_charging
142
- result[:parking_footprint_area] = @parking_footprint_area if @parking_footprint_area
143
- result[:maximum_parking_height] = @maximum_parking_height if @maximum_parking_height
142
+ result[:parking_footprint_area_sqft] = @parking_footprint_area_sqft if @parking_footprint_area_sqft
143
+ result[:maximum_parking_height_ft] = @maximum_parking_height_ft if @maximum_parking_height_ft
144
144
  result[:maximum_number_of_parking_stories] = @maximum_number_of_parking_stories if @maximum_number_of_parking_stories
145
145
  result[:maximum_number_of_parking_stories_above_ground] = @maximum_number_of_parking_stories_above_ground if @maximum_number_of_parking_stories_above_ground
146
146
  result[:number_of_residential_units] = @number_of_residential_units if @number_of_residential_units
@@ -152,25 +152,25 @@ module URBANopt
152
152
  end
153
153
  end
154
154
 
155
- # result[:window_area] = @window_area if @window_area
156
- window_area_hash = @window_area if @window_area
157
- window_area_hash.delete_if { |k, v| v.nil? }
158
- result[:window_area] = window_area_hash if @window_area
155
+ # result[:window_area_sqft] = @window_area_sqft if @window_area_sqft
156
+ window_area_sqft_hash = @window_area_sqft if @window_area_sqft
157
+ window_area_sqft_hash.delete_if { |k, v| v.nil? }
158
+ result[:window_area_sqft] = window_area_sqft_hash if @window_area_sqft
159
159
 
160
- # result[:wall_area] = @wall_area if @wall_area
161
- wall_area_hash = @wall_area if @wall_area
162
- wall_area_hash.delete_if { |k, v| v.nil? }
163
- result[:wall_area] = wall_area_hash if @wall_area
160
+ # result[:wall_area_sqft] = @wall_area_sqft if @wall_area_sqft
161
+ wall_area_sqft_hash = @wall_area_sqft if @wall_area_sqft
162
+ wall_area_sqft_hash.delete_if { |k, v| v.nil? }
163
+ result[:wall_area_sqft] = wall_area_sqft_hash if @wall_area_sqft
164
164
 
165
- # result[:roof_area] = @roof_area if @roof_area
166
- roof_area_hash = @roof_area if @roof_area
167
- roof_area_hash.delete_if { |k, v| v.nil? }
168
- result[:roof_area] = roof_area_hash if @roof_area
165
+ # result[:roof_area_sqft] = @roof_area_sqft if @roof_area_sqft
166
+ roof_area_sqft_hash = @roof_area_sqft if @roof_area_sqft
167
+ roof_area_sqft_hash.delete_if { |k, v| v.nil? }
168
+ result[:roof_area_sqft] = roof_area_sqft_hash if @roof_area_sqft
169
169
 
170
- result[:orientation] = @orientation if @orientation
170
+ result[:orientation_deg] = @orientation_deg if @orientation_deg
171
171
  result[:aspect_ratio] = @aspect_ratio if @aspect_ratio
172
172
 
173
- result[:total_construction_cost] = @total_construction_cost if @total_construction_cost
173
+ result[:total_construction_cost_dollar] = @total_construction_cost_dollar if @total_construction_cost_dollar
174
174
 
175
175
  # validate program properties against schema
176
176
  if @@validator.validate(@@schema[:definitions][:Program][:properties], result).any?
@@ -221,43 +221,43 @@ module URBANopt
221
221
  # +other+ - _Program_ - An object of Program class.
222
222
  ##
223
223
  def add_program(other)
224
- @site_area = add_values(@site_area, other.site_area)
224
+ @site_area_sqft = add_values(@site_area_sqft, other.site_area_sqft)
225
225
 
226
- @floor_area = add_values(@floor_area, other.floor_area)
227
- @conditioned_area = add_values(@conditioned_area, other.conditioned_area)
228
- @unconditioned_area = add_values(@unconditioned_area, other.unconditioned_area)
229
- @footprint_area = add_values(@footprint_area, other.footprint_area)
230
- @maximum_roof_height = max_value(@maximum_roof_height, other.maximum_roof_height)
226
+ @floor_area_sqft = add_values(@floor_area_sqft, other.floor_area_sqft)
227
+ @conditioned_area_sqft = add_values(@conditioned_area_sqft, other.conditioned_area_sqft)
228
+ @unconditioned_area_sqft = add_values(@unconditioned_area_sqft, other.unconditioned_area_sqft)
229
+ @footprint_area_sqft = add_values(@footprint_area_sqft, other.footprint_area_sqft)
230
+ @maximum_roof_height_ft = max_value(@maximum_roof_height_ft, other.maximum_roof_height_ft)
231
231
  @maximum_number_of_stories = max_value(@maximum_number_of_stories, other.maximum_number_of_stories)
232
232
  @maximum_number_of_stories_above_ground = max_value(@maximum_number_of_stories_above_ground, other.maximum_number_of_stories_above_ground)
233
- @parking_area = add_values(@parking_area, other.parking_area)
233
+ @parking_area_sqft = add_values(@parking_area_sqft, other.parking_area_sqft)
234
234
  @number_of_parking_spaces = add_values(@number_of_parking_spaces, other.number_of_parking_spaces)
235
235
  @number_of_parking_spaces_charging = add_values(@number_of_parking_spaces_charging, other.number_of_parking_spaces_charging)
236
- @parking_footprint_area = add_values(@parkig_footprint_area, other.parking_footprint_area)
237
- @maximum_parking_height = max_value(@maximum_parking_height, other.maximum_parking_height)
236
+ @parking_footprint_area_sqft = add_values(@parkig_footprint_area_sqft, other.parking_footprint_area_sqft)
237
+ @maximum_parking_height_ft = max_value(@maximum_parking_height_ft, other.maximum_parking_height_ft)
238
238
  @maximum_number_of_parking_stories = max_value(@maximum_number_of_parking_stories, other.maximum_number_of_parking_stories)
239
239
  @maximum_number_of_parking_stories_above_ground = max_value(maximum_number_of_parking_stories_above_ground, other.maximum_number_of_parking_stories_above_ground)
240
240
  @number_of_residential_units = add_values(@number_of_residential_units, other.number_of_residential_units)
241
- @total_construction_cost = add_values(@total_construction_cost, other.total_construction_cost)
241
+ @total_construction_cost_dollar = add_values(@total_construction_cost_dollar, other.total_construction_cost_dollar)
242
242
 
243
243
  @building_types = other.building_types
244
244
 
245
- @window_area[:north_window_area] = add_values(@window_area[:north_window_area], other.window_area[:north_window_area])
246
- @window_area[:south_window_area] = add_values(@window_area[:south_window_area], other.window_area[:south_window_area])
247
- @window_area[:east_window_area] = add_values(@window_area[:east_window_area], other.window_area[:east_window_area])
248
- @window_area[:west_window_area] = add_values(@window_area[:west_window_area], other.window_area[:west_window_area])
249
- @window_area[:total_window_area] = add_values(@window_area[:total_window_area], other.window_area[:total_window_area])
245
+ @window_area_sqft[:north_window_area_sqft] = add_values(@window_area_sqft[:north_window_area_sqft], other.window_area_sqft[:north_window_area_sqft])
246
+ @window_area_sqft[:south_window_area_sqft] = add_values(@window_area_sqft[:south_window_area_sqft], other.window_area_sqft[:south_window_area_sqft])
247
+ @window_area_sqft[:east_window_area_sqft] = add_values(@window_area_sqft[:east_window_area_sqft], other.window_area_sqft[:east_window_area_sqft])
248
+ @window_area_sqft[:west_window_area_sqft] = add_values(@window_area_sqft[:west_window_area_sqft], other.window_area_sqft[:west_window_area_sqft])
249
+ @window_area_sqft[:total_window_area_sqft] = add_values(@window_area_sqft[:total_window_area_sqft], other.window_area_sqft[:total_window_area_sqft])
250
250
 
251
- @wall_area[:north_wall_area] = add_values(@wall_area[:north_wall_area], other.wall_area[:north_wall_area])
252
- @wall_area[:south_wall_area] = add_values(@wall_area[:south_wall_area], other.wall_area[:south_wall_area])
253
- @wall_area[:east_wall_area] = add_values(@wall_area[:east_wall_area], other.wall_area[:east_wall_area])
254
- @wall_area[:west_wall_area] = add_values(@wall_area[:west_wall_area], other.wall_area[:west_wall_area])
255
- @wall_area[:total_wall_area] = add_values(@wall_area[:total_wall_area], other.wall_area[:total_wall_area])
251
+ @wall_area_sqft[:north_wall_area_sqft] = add_values(@wall_area_sqft[:north_wall_area_sqft], other.wall_area_sqft[:north_wall_area_sqft])
252
+ @wall_area_sqft[:south_wall_area_sqft] = add_values(@wall_area_sqft[:south_wall_area_sqft], other.wall_area_sqft[:south_wall_area_sqft])
253
+ @wall_area_sqft[:east_wall_area_sqft] = add_values(@wall_area_sqft[:east_wall_area_sqft], other.wall_area_sqft[:east_wall_area_sqft])
254
+ @wall_area_sqft[:west_wall_area_sqft] = add_values(@wall_area_sqft[:west_wall_area_sqft], other.wall_area_sqft[:west_wall_area_sqft])
255
+ @wall_area_sqft[:total_wall_area_sqft] = add_values(@wall_area_sqft[:total_wall_area_sqft], other.wall_area_sqft[:total_wall_area_sqft])
256
256
 
257
- @roof_area[:equipment_roof_area] = add_values(@roof_area[:equipment_roof_area], other.roof_area[:equipment_roof_area])
258
- @roof_area[:photovoltaic_roof_area] = add_values(@roof_area[:photovoltaic_roof_area], other.roof_area[:photovoltaic_roof_area])
259
- @roof_area[:available_roof_area] = add_values(@roof_area[:available_roof_area], other.roof_area[:available_roof_area])
260
- @roof_area[:total_roof_area] = add_values(@roof_area[:total_roof_area], other.roof_area[:total_roof_area])
257
+ @roof_area_sqft[:equipment_roof_area_sqft] = add_values(@roof_area_sqft[:equipment_roof_area_sqft], other.roof_area_sqft[:equipment_roof_area_sqft])
258
+ @roof_area_sqft[:photovoltaic_roof_area_sqft] = add_values(@roof_area_sqft[:photovoltaic_roof_area_sqft], other.roof_area_sqft[:photovoltaic_roof_area_sqft])
259
+ @roof_area_sqft[:available_roof_area_sqft] = add_values(@roof_area_sqft[:available_roof_area_sqft], other.roof_area_sqft[:available_roof_area_sqft])
260
+ @roof_area_sqft[:total_roof_area_sqft] = add_values(@roof_area_sqft[:total_roof_area_sqft], other.roof_area_sqft[:total_roof_area_sqft])
261
261
  end
262
262
  end
263
263
  end