lib/openstudio-standards/btap/measures.rb in openstudio-standards-0.2.17.rc1 vs lib/openstudio-standards/btap/measures.rb in openstudio-standards-0.2.17.rc2
- old
+ new
@@ -22,80 +22,80 @@
# and open the template in the editor.
require "#{File.dirname(__FILE__)}/btap"
class OSMArg
ARGUMENT_TYPES = [
- "BOOL",
- "STRING",
- "INTEGER",
- "FLOAT",
+ "BOOL",
+ "STRING",
+ "INTEGER",
+ "FLOAT",
"STRINGCHOICE",
- "WSCHOICE"
+ "WSCHOICE"
]
-
-
-
- attr_accessor :runner,
- :variable_name,
+
+
+
+ attr_accessor :runner,
+ :variable_name,
:type,
- :required,
+ :required,
:model_dependant,
- :display_name,
- :default_value,
- :min_value,
- :max_value,
- :string_choice_array,
+ :display_name,
+ :default_value,
+ :min_value,
+ :max_value,
+ :string_choice_array,
:os_object_type
-
+
def self.bool( variable_name,display_name,required,default_value )
raise "#{default_value} defaut value is not a bool." unless default_value.is_a?(Bool)
default_value.respond_to?(:to_s)
arg = OSMArg.new( "BOOL", variable_name, display_name, required)
arg.default_value = default_value
return arg
end
-
+
def self.string( variable_name,display_name,required,default_value )
raise "#{default_value} defaut value is not a string." unless default_value.respond_to?(:to_s)
arg = OSMArg.new( "STRING", variable_name, display_name, required)
arg.default_value = default_value
return arg
end
-
+
def self.integer( variable_name,display_name,required,default_value,min_value,max_value )
raise "#{default_value} defaut value is not a integer." unless default_value.respond_to?(:to_i)
arg = OSMArg.new( "INTEGER", variable_name, display_name, required)
arg.default_value = default_value
arg.min_value = min_value
arg.max_value = max_value
- return arg
+ return arg
end
-
+
def self.float( variable_name, display_name, required,default_value,min_value, max_value )
raise "#{default_value} defaut value is not a float." unless default_value.respond_to?(:to_f)
arg = OSMArg.new( "INTEGER", variable_name, display_name, required)
arg.default_value = default_value
arg.min_value = min_value
arg.max_value = max_value
- return arg
+ return arg
end
-
+
def self.choice(variable_name,display_name,required,default_value,string_choice_array)
- raise "#{default_value} defaut value is not an array." unless default_value.is_a?(Array)
+ raise "#{default_value} defaut value is not an array." unless default_value.is_a?(Array)
arg = OSMArg.new( "STRINGCHOICE", variable_name, display_name, required)
arg.default_value = default_value
arg.string_choice_array = string_choice_array
return arg
end
-
+
def self.wschoice( variable_name, display_name, required, default_value, os_object_type)
arg = OSMArg.new( "WSCHOICE", variable_name, display_name, required )
arg.default_value = default_value
arg.os_object_type = os_object_type
- return arg
+ return arg
end
-
+
def initialize( type, variable_name, display_name, required )
self.type = type
self.variable_name = variable_name
self.display_name = display_name
self.required = required
@@ -104,24 +104,24 @@
self.model_dependant = true
else
self.model_dependant = false
end
return self
- end
+ end
end
-
+
module BTAP
module Measures
module OSMeasures
-
-
-
-
+
+
+
+
class BTAPModelUserScript < OpenStudio::Ruleset::ModelUserScript
#if and E+ measure replace OpenStudio::Ruleset::ModelUserScript with OpenStudio::Ruleset::WorkspaceUserScript
#Array containing information of all inputs required by measure.
attr_accessor :argument_array_of_arrays
attr_accessor :argument_array
@@ -132,12 +132,12 @@
#if and E+ measure replace OpenStudio::Ruleset::ModelUserScript with OpenStudio::Ruleset::WorkspaceUserScript
def name
"BTAPModelUserScript"
OSMArgument.new
end
-
- #this method will output the ruby macro to perform the change.
+
+ #this method will output the ruby macro to perform the change.
def generate_ruby_macro(model,runner)
if @file == nil or @file == ""
@file = "Enter_Path_To_#{self.class.name}_measure.rb_File!"
end
BTAP::runner_register("MACRO", "\##{self.class.name} Measure Start", runner)
@@ -188,23 +188,23 @@
super(model, runner, user_arguments)
BTAP::runner_register("INFO", "Initial model being modified by #{self.class.name}",runner)
if not runner.validateUserArguments(self.arguments(model),user_arguments)
return false
end
-
- #Set argument to instance variables.
+
+ #Set argument to instance variables.
self.argument_getter(model, runner,user_arguments)
#will run the childs method measure_code
result = self.measure_code(model,runner)
generate_ruby_macro(model,runner)
return result
end # end method run
def argument_setter(model,args)
#***boilerplate code starts. Do not edit...
-
+
#iterate through array of hashes and make arguments based on type and set
# max and min values where applicable.
@argument_array.each do |row|
#strip out first char that contains the @ symbol
row.variable_name[0] = ''
@@ -245,11 +245,11 @@
def argument_getter(model, runner,user_arguments)
@arg_table = []
unless @argument_array == nil
@argument_array.each do |row|
name = row.variable_name
-
+
case row.type
when "BOOL"
value = runner.getBoolArgumentValue(name, user_arguments)
instance_variable_set("@#{name}",value)
@arg_table << [name,value]
@@ -267,11 +267,11 @@
end
when "FLOAT"
value = runner.getDoubleArgumentValue(name, user_arguments)
instance_variable_set("@#{name}",value)
@arg_table << [name,value]
-
+
if ( not row.min_value.nil? and instance_variable_get("@#{name}") < row.min_value ) or ( not row.max_value.nil? and instance_variable_get("@#{name}") > row.max_value )
runner.registerError("#{row.display_name} must be greater than or equal to #{row.min_value} and less than or equal to #{row.max_value}. You entered #{instance_variable_get("@#{name}")}.")
return false
end
when "STRINGCHOICE"
@@ -286,14 +286,14 @@
instance_variable_set("@#{name}", runner.getPathArgument(name, user_arguments) )
end #end case
end #end do
end
return @arg_table
- end
-
+ end
+
end
- #Measure Template simplified.
+ #Measure Template simplified.
class TemplateModelMeasure < BTAPModelUserScript
def name
"BTAPTempModelMeasure"
end
@@ -389,18 +389,18 @@
end
def run(model, runner, user_arguments)
#run the super
parent_method_is_true = super(model, runner, user_arguments)
-
-
+
+
###############
-
- #Set Archetype name in runner.
+
+ #Set Archetype name in runner.
runner.registerValue('archetype_name',@archetype_name)
-
- #Set path to OSM files.
+
+ #Set path to OSM files.
alternative_model_path = OpenStudio::Path.new("#{File.dirname(__FILE__)}/#{@archetype_name}.osm")
#load model and test.
translator = OpenStudio::OSVersion::VersionTranslator.new
oModel = translator.loadModel(alternative_model_path)
if oModel.empty?
@@ -559,11 +559,11 @@
@csv_data = row
unless @csv_data["measure_id"] == "NA"
model = self.load_base_model_building()
self.set_weather_file(model)
self.set_hourly_output(model)
-
+
model,log = self.apply_ecms(model,@csv_data)
BTAP::FileIO::save_osm( model, "#{output_folder}/#{BTAP::FileIO::get_name(model)}.osm") unless output_folder.nil?
File.open("#{output_folder}/#{BTAP::FileIO::get_name(model)}.log", 'w') { |file| file.write(log) } unless output_folder.nil?
baseline_models[BTAP::FileIO::get_name(model)] = model
end
@@ -619,11 +619,11 @@
"measure_id",
"cost_per_floor_m2",
"cost_per_building"
]
self.set_instance_variables( measure_values )
-
+
#cost per building and building area
building = model.building.get
raise ("you did not enter a cost for measure #{@measure_id}. All measures must have a cost of at least 0.0 . Please add a cost_per_building field.") if @cost_per_building.nil?
unless @cost_per_building.nil?
BTAP::Resources::Economics::object_cost(building,"#{@measure_id} Capital Cost per building",@cost_per_building.to_f,"CostPerEach")
@@ -751,11 +751,11 @@
@tubular_daylight_dome_cost_m2,
@tubular_daylight_diffuser_cost_m2,
@total_building_construction_set_cost
)
- #Give adiabatic surfaces a construction. Does not matter what. This is a bug in Openstudio that leave these surfaces unassigned by the default construction set.
+ #Give adiabatic surfaces a construction. Does not matter what. This is a bug in OpenStudio that leave these surfaces unassigned by the default construction set.
all_adiabatic_surfaces = BTAP::Geometry::Surfaces::filter_by_boundary_condition(model.getSurfaces, "Adiabatic")
unless all_adiabatic_surfaces.empty?
BTAP::Geometry::Surfaces::set_surfaces_construction( all_adiabatic_surfaces, model.building.get.defaultConstructionSet.get.defaultInteriorSurfaceConstructions.get.wallConstruction.get)
end
#Create sample csv file.
@@ -770,11 +770,11 @@
"infiltration_design_flow_rate",
"infiltration_flow_per_space",
"infiltration_flow_per_exterior_area",
"infiltration_air_changes_per_hour"
]
-
+
#Set all the above instance variables to the @csv_data values or, if not set or == 'na', to nil.
self.set_instance_variables(measure_values)
log = BTAP::Resources::SpaceLoads::ScaleLoads::set_inflitration_magnitude(
model,
@@ -809,11 +809,11 @@
model.getFanConstantVolumes.sort.each do |fan|
fan.setFanEfficiency( @fan_total_eff ) unless @fan_total_eff.nil?
fan.setMotorEfficiency( @fan_motor_eff ) unless @fan_motor_eff.nil?
log << fan.name.get.to_s << ",#{fan.fanEfficiency},#{fan.motorEfficiency}\n"
end
-
+
end
case @fan_volume_type
when "VariableVolume"
@@ -973,11 +973,13 @@
unless model.getCoilCoolingDXSingleSpeeds.empty?
log = "coil_cooling_dx_single_speed_name,cop\n"
model.getCoilCoolingDXSingleSpeeds.sort.each do |cooling_coil|
cooling_coil.setRatedCOP( OpenStudio::OptionalDouble.new( @cop ) ) unless @cop.nil?
cop = "NA"
- cop = cooling_coil.ratedCOP.get unless cooling_coil.ratedCOP.empty?
+ # Prior to 3.5.0, it was an optional double, now it's a double
+ cop_ = OpenStudio::OptionalDouble.new(cooling_coil.ratedCOP)
+ cop = cop_.get unless cop_.empty?
log << cooling_coil.name.get.to_s << ",#{cop}\n"
end
end
@@ -985,13 +987,15 @@
log << "coil_cooling_dx_two_speed_name,cop\n"
model.getCoilCoolingDXTwoSpeeds.sort.each do |cooling_coil|
cooling_coil.setRatedHighSpeedCOP( @cop ) unless @cop.nil?
cooling_coil.setRatedLowSpeedCOP( @cop ) unless @cop.nil?
cop_high = "NA"
- cop_high = cooling_coil.ratedHighSpeedCOP.get unless cooling_coil.ratedHighSpeedCOP.empty?
+ cop_ = OpenStudio::OptionalDouble.new(cooling_coil.ratedHighSpeedCOP)
+ cop_high = cop_.get unless cop_.empty?
cop_low = "NA"
- cop_low = cooling_coil.ratedLowSpeedCOP.get unless cooling_coil.ratedLowSpeedCOP.empty?
+ cop_ = OpenStudio::OptionalDouble.new(cooling_coil.ratedLowSpeedCOP)
+ cop_low = cop_.get unless cop_.empty?
log << cooling_coil.name.get.to_s << ",#{cop_high},#{cop_low}\n"
end
end
return log
end
@@ -1294,11 +1298,11 @@
@erv_ThresholdTemperature,
@erv_InitialDefrostTimeFraction,
@erv_nominal_electric_power,
@erv_economizer_lockout.to_bool
).each { |erv| log << erv.to_s }
-
-
+
+
#Add setpoint manager to all OA object in airloops.
model.getHeatExchangerAirToAirSensibleAndLatents.sort.each do |erv|
#needed to get the supply outlet node from the erv to place the setpoint manager.
node = erv.primaryAirOutletModelObject.get.to_Node.get if erv.primaryAirOutletModelObject.is_initialized