Class: URBANopt::Scenario::ScenarioRunnerOSW

Inherits:
ScenarioRunnerBase show all
Defined in:
lib/urbanopt/scenario/scenario_runner_osw.rb

Instance Method Summary collapse

Constructor Details

#initializeScenarioRunnerOSW

ScenarioRunnerOSW is a class to create and run SimulationFileOSWs



43
# File 'lib/urbanopt/scenario/scenario_runner_osw.rb', line 43

def initialize; end

Instance Method Details

#create_simulation_files(scenario, force_clear = false) ⇒ Object

Create all OSWs for Scenario.

parameters:

scenario - ScenarioBase - Scenario to create simulation input files for. force_clear - Bool - Clear Scenario before creating simulation input files.

return:

Array Returns array of all SimulationDirs, even those created previously, for Scenario.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/urbanopt/scenario/scenario_runner_osw.rb', line 52

def create_simulation_files(scenario, force_clear = false)
  if force_clear
    scenario.clear
  end

  FileUtils.mkdir_p(scenario.run_dir) if !File.exist?(scenario.run_dir)
  FileUtils.rm_rf(File.join(scenario.run_dir, 'run_status.json')) if File.exist?(File.join(scenario.run_dir, 'run_status.json'))

  simulation_dirs = scenario.simulation_dirs

  simulation_dirs.each do |simulation_dir|
    if simulation_dir.out_of_date?
      puts "simulation_dir #{simulation_dir.run_dir} is out of date, regenerating input files"
      simulation_dir.create_input_files
    end
  end
  return simulation_dirs
end

#get_results(scenario, simulation_dirs) ⇒ Object



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'lib/urbanopt/scenario/scenario_runner_osw.rb', line 167

def get_results(scenario, simulation_dirs)
  # look for other failed datapoints (command line display)
  # also compile datapoint status for latest_run.json file
  status_arr = []
  failed_sims = []
  simulation_dirs.each do |sim_dir|
    if File.exist?(sim_dir.failed_job_path)
      failed_sims << sim_dir.run_dir.split('/')[-1]
    end
    status_arr << { "id": sim_dir.feature_id, "status": sim_dir.simulation_status, "mapper_class": sim_dir.mapper_class }
  end

  # write to file
  File.open(File.join(scenario.run_dir, 'run_status.json'), 'w') { |f| f.write JSON.pretty_generate("timestamp": Time.now.strftime('%Y-%m-%dT%k:%M:%S.%L'), "results": status_arr) }

  if !failed_sims.empty?
    puts "FAILED SIMULATION IDs: #{failed_sims.join(',')}"
  end
end

#run(scenario, force_clear = false, options = {}) ⇒ Object

Create and run all SimulationFileOSW for Scenario. A staged runner is implented to run buildings, then transformers then district systems.

  • instantiate openstudio runner to run .osw files.

  • create simulation files for this scenario.

  • get feature_type value from in.osw files

  • cretae 3 groups to store .osw files (building_osws , transformer_osws , district_system_osws)

  • add each osw file to its corresponding group id simulation_dir is out_of_date

  • Run osw file groups in order and store simulation failure in a array.

parameters:

scenario - ScenarioBase - Scenario to create and run SimulationFiles for. force_clear - Bool - Clear Scenario before creating SimulationFiles.

return:

Array Returns array of all SimulationFiles, even those created previously, for Scenario.



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/urbanopt/scenario/scenario_runner_osw.rb', line 85

def run(scenario, force_clear = false, options = {})
  # instantiate openstudio runner - use the defaults for now. If need to change then create
  # the runner.conf file (i.e. run `rake openstudio:runner:init`)
  # allow passing gemfile_path and bundle_install_path in options
  runner = OpenStudio::Extension::Runner.new(scenario.root_dir, [], options)

  # create simulation files
  simulation_dirs = create_simulation_files(scenario, force_clear)

  # osws = []
  # simulation_dirs.each do |simulation_dir|
  #   if !simulation_dir.is_a?(SimulationDirOSW)
  #     raise "ScenarioRunnerOSW does not know how to run #{simulation_dir.class}"
  #   end
  #   if simulation_dir.out_of_date?
  #     osws << simulation_dir.in_osw_path
  #   end
  # end

  # cretae 3 groups to store .osw files (+building_osws+ , +transformer_osws+ , +district_system_osws+)
  building_osws = []
  transformer_osws = []
  district_system_osws = []

  simulation_dirs.each do |simulation_dir|
    in_osw = File.read(simulation_dir.in_osw_path)
    in_osw_hash = JSON.parse(in_osw, symbolize_names: true)

    if !simulation_dir.is_a?(SimulationDirOSW)
      raise "ScenarioRunnerOSW does not know how to run #{simulation_dir.class}"
    end

    # get feature_type value from in.osw files
    feature_type = nil
    in_osw_hash[:steps].each { |x| feature_type = x[:arguments][:feature_type] if x[:arguments][:feature_type] }

    # add each osw file to its corresponding group id +simulation_dir+ is out_of_date
    if simulation_dir.out_of_date?

      if feature_type == 'Building'
        building_osws << simulation_dir.in_osw_path
      elsif feature_type == 'District System'
        district_system_osws << simulation_dir.in_osw_path
      elsif feature_type == 'Transformer'
        transformer_osws << simulation_dir.in_osw_path
      else
        raise "ScenarioRunnerOSW does not know how to run a #{feature_type} feature"
      end

    end
  end

  # Run osw groups in order and store simulation failure in an array.
  # Return simulation_dirs after running all simulations.

  # failures
  failures = []
  # run building_osws
  # building_failures = runner.run_osws(building_osws, num_parallel = Extension::NUM_PARALLEL, max_to_run = Extension::MAX_DATAPOINTS)
  building_failures = runner.run_osws(building_osws)
  failures + building_failures
  # run district_system_osws
  # district_system_failures = runner.run_osws(district_system_osws, num_parallel = Extension::NUM_PARALLEL, max_to_run = Extension::MAX_DATAPOINTS)
  district_system_failures = runner.run_osws(district_system_osws)
  failures + district_system_failures
  # run transformer_osws
  # transformer_failures = runner.run_osws(transformer_osws, num_parallel = Extension::NUM_PARALLEL, max_to_run = Extension::MAX_DATAPOINTS)
  transformer_failures = runner.run_osws(transformer_osws)
  failures + transformer_failures

  puts 'Done Running Scenario'

  # if failures.size > 0
  #   puts "DATAPOINT FAILURES: #{failures}"
  # end

  # write results to file and to command line
  get_results(scenario, simulation_dirs)

  return simulation_dirs
end