lib/openstudio-standards/btap/btap.model.rb in openstudio-standards-0.3.0 vs lib/openstudio-standards/btap/btap.model.rb in openstudio-standards-0.3.1.rc1

- old
+ new

@@ -1,717 +1,717 @@ -require "#{File.dirname(__FILE__)}/btap" - - -class OpenStudio::Model::Construction - #This method will search through the layers and find the layer with the - #lowest conductance and set that as the insulation layer. Note: Concrete walls - #or slabs with no insulation layer but with a carper will see the carpet as the - #insulation layer. - #@author Phylroy A. Lopez <plopez@nrcan.gc.ca> - #@return OpenStudio::Model::Material insulation_material_layer - def self.find_and_set_insulaton_layer() - insulation_material_layer = nil - #return if there is already a defined insulation layer. - return self.insulation unless self.insulation.empty? - #set minimum conductance to 100.0 - min_conductance = 100.0 - #loop through Layers - self.layers.each do |layer| - #try casting the layer to an OpaqueMaterial. - material = nil - material = layer.to_OpaqueMaterial.get unless layer.to_OpaqueMaterial.empty? - material = layer.to_FenestrationMaterial.get unless layer.to_FenestrationMaterial.empty? - #check if the cast was successful, then find the insulation layer. - unless nil == material - if BTAP::Resources::Envelope::Materials::get_conductance(material) < min_conductance - #Keep track of the highest thermal resistance value. - min_conductance = BTAP::Resources::Envelope::Materials::get_conductance(material) - insulation_material_layer = material - unless material.to_OpaqueMaterial.empty? - self.setInsulation(material) - end - end - end - end - if self.insulation.empty? and self.isOpaque - raise ("construction #{self.name.get.to_s} insulation layer could not be set!. This occurs when a insulation layer is duplicated in the construction.") - end - return insulation_material_layer - end - - - - - #This method will create a new construction based on self and a new conductance value. - #It will check to see if a similar construction has already been created by this method - #if so it will return the existing construction. If you wish to keep some of the properties, enter the - #string "default" instead of a numerical value. - #@author Phylroy A. Lopez <plopez@nrcan.gc.ca> - #@param model [OpenStudio::Model::Model] - #@param construction <String> - #@param conductance [Fixnum] - #@return [<String]OpenStudio::Model::getConstructionByName] new_construction - def customize(model, - construction, - conductance, - solarTransmittanceatNormalIncidence = nil, - visibleTransmittance = nil - ) - - if self.isOpaque - - minimum_resistance = 0 - name_prefix = "#{construction.handle()} U- #{conductance}" - - #Check to see if we already made one like this. - existing_construction = OpenStudio::Model::getConstructionByName(self.model,name_prefix) - if not existing_construction.empty? - # if so, return existing construction - return existing_construction.get - end - - #create a copy - new_construction = self.deep_copy(self.model,construction) - - #Change Construction name in clone - new_construction.setName( name_prefix) - - if conductance.kind_of?(Float) - #re-find insulation layer - find_and_set_insulaton_layer(self.model,new_construction) - - #Determine how low the resistance can be set. Subtract existing insulation - #Values from the total resistance to see how low we can go. - minimum_resistance = (1 / new_construction.thermalConductance.to_f) - (1.0 / new_construction.insulation.get.thermalConductance.to_f) - - #Check if the requested resistance is smaller than the minimum - # resistance. If so, use the minimum resistance instead. - if minimum_resistance > ( 1 / conductance ) - #tell user why we are defaulting and set the conductance of the - # construction. - raise ("could not set conductance of construction #{new_construction.name.to_s} to because existing layers make this impossible. Change the construction to allow for this conductance to be set." + (conductance).to_s + "setting to closest value possible value:" + (1.0 / minimum_resistance).to_s ) - # new_construction.setConductance((1.0/minimum_resistance)) - else - unless new_construction.setConductance(conductance) - raise("could not set conductance of construction #{new_construction.name.to_s}") - end - end - end - return new_construction - elsif self.isFenestration() - - #get equivilant values for tsol, tvis, and conductances. - solarTransmittanceatNormalIncidence = self.get_shgc(model, construction) if solarTransmittanceatNormalIncidence == nil - visibleTransmittance = self.get_tvis(model,construction) if visibleTransmittance == nil - conductance = self.get_conductance(construction) if conductance == nil - frontSideSolarReflectanceatNormalIncidence = 1.0 - solarTransmittanceatNormalIncidence - backSideSolarReflectanceatNormalIncidence = 1.0 - solarTransmittanceatNormalIncidence - frontSideVisibleReflectanceatNormalIncidence = 0.081000 - backSideVisibleReflectanceatNormalIncidence = 0.081000 - infraredTransmittanceatNormalIncidence = 0.0 - frontSideInfraredHemisphericalEmissivity = 0.84 - backSideInfraredHemisphericalEmissivity = 0.84 - #store part of fenestation in array bins. - glazing_array = Array.new() - shading_material_array = Array.new() - gas_array = Array.new() - construction.layers.each do |material| - glazing_array << material unless material.to_Glazing.empty? - shading_material_array << material unless material.to_ShadingMaterial.empty? - gas_array << material unless material.to_GasLayer.empty? - end - - #set value of fictious glazing based on the fenestrations front and back if available - unless glazing_array.first.to_StandardGlazing.empty? - frontSideSolarReflectanceatNormalIncidence = glazing_array.first.to_StandardGlazing.get.frontSideSolarReflectanceatNormalIncidence - frontSideVisibleReflectanceatNormalIncidence = glazing_array.first.to_StandardGlazing.get.frontSideVisibleReflectanceatNormalIncidence - frontSideInfraredHemisphericalEmissivity = glazing_array.first.to_StandardGlazing.get.frontSideInfraredHemisphericalEmissivity - end - - unless glazing_array.last.to_StandardGlazing.empty? - backSideSolarReflectanceatNormalIncidence = glazing_array.last.to_StandardGlazing.get.backSideSolarReflectanceatNormalIncidence - backSideVisibleReflectanceatNormalIncidence = glazing_array.last.to_StandardGlazing.get.backSideVisibleReflectanceatNormalIncidence - backSideInfraredHemisphericalEmissivity = glazing_array.last.to_StandardGlazing.get.backSideInfraredHemisphericalEmissivity - end - #create fictious glazing. - #assume a thickness of 0.10m - thickness = 0.10 - #calculate conductivity - conductivity = conductance * thickness - data_name_suffix = " cond=#{("%.3f" % conductivity).to_s} tvis=#{("%.3f" % visibleTransmittance).to_s} tsol=#{("%.3f" % solarTransmittanceatNormalIncidence).to_s}" - cons_name = "Customized Fenestration:" + data_name_suffix - glazing_name = "Customized Fenestration::" + data_name_suffix - #Search to prevent the massive duplication that may ensue. - return model.getConstructionByName(cons_name).get unless model.getConstructionByName(cons_name).empty? - - #fix for Simple glazing - conductivity = conductance - glazing = BTAP::Resources::Envelope::Materials::Fenestration::create_simple_glazing( - construction.model,#model - glazing_name, #name - 0.60, #SHGC - conductivity, #u-factor - thickness, #Thickness - 0.21 #vis trans - ) - - new_materials_array = Array.new() - new_materials_array << glazing - new_materials_array.concat(shading_material_array) unless shading_material_array.empty? - return self.create_construction(construction.model, cons_name, new_materials_array) - end - end - - - -end - - - -# open the class to add methods to size all HVAC equipment -class OpenStudio::Model::Model - - def perform_load_elimination_analysis(folder = Dir.pwd) - #remove hvac and only use ideal loads. - model = self.clone(true).to_Model - BTAP::Resources::HVAC::clear_all_hvac_from_model(model) - model.getThermalZones.sort.each {|zone| zone.setUseIdealAirLoads(true)} - conductance = 0.200 - models = Array.new() - #Add baseline - models << {:name => 'baseline', :model => model} - #Add copies of model with elimination of a characteristic. - models << {:name => 'elim_ext_wall', :model => model.clone(true).to_Model} -=begin - models << {:name => 'elim_ext_roof', :model => model.clone(true).to_Model.set_all_ext_roof_conductances_to(conductance)} - models << {:name => 'elim_ground_floor', :model => model.clone(true).to_Model.set_all_ground_floor_conductances_to(conductance)} - models << {:name => 'elim_ground_wall', :model => model.clone(true).to_Model.set_all_ground_wall_conductances_to(conductance)} - models << {:name => 'elim_win_doors', :model => model.clone(true).to_Model.set_all_ext_windows_and_door_conductances_to(conductance)} - models << {:name => 'elim_skylights', :model => model.clone(true).to_Model.set_all_ext_skylight_conductances_to(conductance)} - models << {:name => 'elim_people', :model => model.clone(true).to_Model.eliminate_all_people_loads} - models << {:name => 'elim_lighting', :model => model.clone(true).to_Model.eliminate_all_lighting_loads} - models << {:name => 'elim_plug_loads', :model => model.clone(true).to_Model.eliminate_all_electric_loads} - models << {:name => 'elim_outdoor_air', :model => model.clone(true).to_Model.eliminate_all_design_specification_outdoor_air} - models << {:name => 'elim_infiltration', :model => model.clone(true).to_Model.eliminate_all_space_infiltration_design_flow_rates} - models << {:name => 'elim_all_loads', :model => model.clone(true).to_Model.eliminate_all_loads} -=end - - #Get a handle for the baseline. - baseline = models.find {|model| model[:name] == 'baseline' } - #Create a result hash. - result = Hash.new() - models.each do |model| - #run each model in its own folder. - success = model_run_simulation_and_log_errors(model[:model], "#{folder}/#{model[:name]}") - - #Run the qa-qc method to get all the results. - - qa_qc = BTAP::perform_qaqc(model[:model]) - #Store total energy in the hash - model[:total_end_uses_gj_per_m2] = qa_qc[:end_uses_eui][:total_end_uses_gj_per_m2] - #This assumes that the baseline is always the first in the hash. - unless model[:name] = 'baseline' - result[model[:name]] = model[:total_end_uses_gj_per_m2] / baseline[:total_end_uses_gj_per_m2] - end - end - return result - end - - - # Set global changes - def set_all_ext_wall_conductances_to(conductance) - #Set conductances to needed values in construction set if possible. - self.getDefaultConstructionSets.sort.each_with_index do |default_construction_set, index| - BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( - self, - "Sensitivity Def Cnst Set #{index}", - default_construction_set, - 1/conductance, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil - ) - end - #sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type. - self.getPlanarSurfaces.sort.each {|item| item.resetConstruction} - #if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces - BTAP::Resources::Envelope::assign_interior_surface_construction_to_adiabatic_surfaces(self, nil) - return self - end - - def set_all_ext_roof_conductances_to(conductance) - #Set conductances to needed values in construction set if possible. - self.getDefaultConstructionSets.sort.each_with_index do |default_construction_set, index| - BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( - self, - "Sensitivity Def Cnst Set #{index}", - default_construction_set, - nil, - nil, - 1/conductance, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil - ) - end - #sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type. - self.getPlanarSurfaces.sort.each {|item| item.resetConstruction} - #if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces - BTAP::Resources::Envelope::assign_interior_surface_construction_to_adiabatic_surfaces(self, nil) - return self - end - - def set_all_ground_wall_conductances_to(conductance) - #Set conductances to needed values in construction set if possible. - self.getDefaultConstructionSets.sort.each_with_index do |default_construction_set, index| - BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( - self, - "Sensitivity Def Cnst Set #{index}", - default_construction_set, - nil, - nil, - nil, - 1/conductance, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil - ) - end - #sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type. - self.getPlanarSurfaces.sort.each {|item| item.resetConstruction} - #if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces - BTAP::Resources::Envelope::assign_interior_surface_construction_to_adiabatic_surfaces(self, nil) - return self - end - - def set_all_ground_floor_conductances_to(conductance) - #Set conductances to needed values in construction set if possible. - self.getDefaultConstructionSets.sort.each_with_index do |default_construction_set, index| - BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( - self, - "Sensitivity Def Cnst Set #{index}", - default_construction_set, - nil, - nil, - nil, - nil, - 1/conductance, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil - ) - end - #sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type. - self.getPlanarSurfaces.sort.each {|item| item.resetConstruction} - #if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces - BTAP::Resources::Envelope::assign_interior_surface_construction_to_adiabatic_surfaces(self, nil) - return self - end - - def set_all_ext_windows_and_door_conductances_to(conductance) - #Set conductances to needed values in construction set if possible. - self.getDefaultConstructionSets.sort.each_with_index do |default_construction_set, index| - BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( - self, - "Sensitivity Def Cnst Set #{index}", - default_construction_set, - nil, - nil, - nil, - nil, - nil, - nil, - 1/conductance, - nil, - nil, - 1/conductance, - nil, - nil, - 1/conductance, - 1/conductance, - nil, - nil, - 1/conductance, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil - ) - end - #sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type. - self.getPlanarSurfaces.sort.each {|item| item.resetConstruction} - #if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces - BTAP::Resources::Envelope::assign_interior_surface_construction_to_adiabatic_surfaces(self, nil) - return self - end - - def set_all_ext_skylight_conductances_to(conductance) - #Set conductances to needed values in construction set if possible. - self.getDefaultConstructionSets.sort.each_with_index do |default_construction_set, index| - BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( - self, - "Sensitivity Def Cnst Set #{index}", - default_construction_set, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - 1/conductance, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil - ) - end - #sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type. - self.getPlanarSurfaces.sort.each {|item| item.resetConstruction} - #if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces - BTAP::Resources::Envelope::assign_interior_surface_construction_to_adiabatic_surfaces(self, nil) - return self - end - - #This method will set the infiltration magnitude. - #@author phylroy.lopez@nrcan.gc.ca - #@param self [OpenStudio::model::Model] A model object - #@param setDesignFlowRate [Float] - #@param setFlowperSpaceFloorArea [Float] - #@param setFlowperExteriorSurfaceArea [Float] - #@param setAirChangesperHour [Float] - #@return [String] table - def set_all_inflitration_rates(setDesignFlowRate, - setFlowperSpaceFloorArea, - setFlowperExteriorSurfaceArea, - setAirChangesperHour) - - table = "name,infiltration_method,infiltration_design_flow_rate,infiltration_flow_per_space,infiltration_flow_per_exterior_area,infiltration_air_changes_per_hour\n" - self.getSpaceInfiltrationDesignFlowRates.sort.each do |infiltration_load| - infiltration_load.setAirChangesperHour(setAirChangesperHour) unless setAirChangesperHour.nil? - infiltration_load.setDesignFlowRate(setDesignFlowRate) unless setDesignFlowRate.nil? - infiltration_load.setFlowperSpaceFloorArea(setFlowperSpaceFloorArea) unless setFlowperSpaceFloorArea.nil? - infiltration_load.setFlowperExteriorSurfaceArea(setFlowperExteriorSurfaceArea) unless setFlowperExteriorSurfaceArea.nil? - table << infiltration_load.name.get.to_s << "," - table << infiltration_load.designFlowRateCalculationMethod << "," - infiltration_load.airChangesperHour.empty? ? ach = "NA" : ach = infiltration_load.airChangesperHour.get - infiltration_load.designFlowRate.empty? ? dfr = "NA" : dfr = infiltration_load.designFlowRate.get - infiltration_load.flowperSpaceFloorArea.empty? ? fsfa = "NA" : fsfa = infiltration_load.flowperSpaceFloorArea.get - infiltration_load.flowperExteriorSurfaceArea.empty? ? fesa = "NA" : fesa = infiltration_load.flowperExteriorSurfaceArea.get - table << "#{ach},#{dfr},#{fsfa},#{fesa}\n" - end - return table - end - - #Scale Global Changes - def scale_all_people_loads(factor) - self.getPeoples.sort.each do |item| - item.setMultiplier(item.multiplier * factor) - end - end - - #This method will scale people loads schedule. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - #@param a_coef [Float] - #@param b_coef [Float] - #@param c_coef [Float] - #@param time_shift [Float] - #@param time_sign [Float] - def scale_people_loads_schedule(a_coef, - b_coef, - c_coef, - time_shift = nil, - time_sign = nil) - model.getPeoples.sort.each do |item| - #Do an in-place modification of the schedule. - BTAP::Resources::Schedules::modify_schedule!(self, item.schedule, a_coef, b_coef, c_coef, time_shift, time_sign) - end - end - - #This method will scale lighting loads. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - #@param factor [Float] - def scale_lighting_loads(factor) - self.getLightss.sort.each do |item| - item.setMultiplier(item.multiplier * factor) - end - end - - #This method will scale lighting loads schedule. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - #@param a_coef [Float] - #@param b_coef [Float] - #@param c_coef [Float] - #@param time_shift [Float] - #@param time_sign [Float] - def scale_lighting_loads_schedule(a_coef, - b_coef, - c_coef, - time_shift = nil, - time_sign = nil) - model.getLightss.sort.each do |item| - #Do an in-place modification of the schedule. - BTAP::Resources::Schedules::modify_schedule!(self, item.schedule, a_coef, b_coef, c_coef, time_shift, time_sign) - end - end - - #This method will scale electrical loads. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - #@param factor [Float] - def scale_electrical_loads(model, factor) - self.getElectricEquipments.sort.each do |item| - item.setMultiplier(item.multiplier * factor) - end - end - - #This method will scale electrical loads schedule. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - #@param a_coef [Float] - #@param b_coef [Float] - #@param c_coef [Float] - #@param time_shift [Float] - #@param time_sign [Float] - def scale_electrical_loads_schedule(a_coef, - b_coef, - c_coef, - time_shift = nil, - time_sign = nil) - self.getElectricEquipments.sort.each do |item| - BTAP::Resources::Schedules::modify_schedule!(self, item.schedule, a_coef, b_coef, c_coef, time_shift, time_sign) - end - end - - #This method will scale Outdoor Air loads. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - #@param factor [Float] - def scale_oa_loads(factor) - self.getDesignSpecificationOutdoorAirs.sort.each do |oa_def| - oa_def.setOutdoorAirFlowperPerson(oa_def.outdoorAirFlowperPerson * factor) unless oa_def.isOutdoorAirFlowperPersonDefaulted - oa_def.setOutdoorAirFlowperFloorArea(oa_def.outdoorAirFlowperFloorArea * factor) unless oa_def.isOutdoorAirFlowperFloorAreaDefaulted - oa_def.setOutdoorAirFlowRate(oa_def.outdoorAirFlowRate * factor) unless oa_def.isOutdoorAirFlowRateDefaulted - oa_def.setOutdoorAirFlowAirChangesperHour(oa_def.outdoorAirFlowAirChangesperHour * factor) unless oa_def.isOutdoorAirFlowAirChangesperHourDefaulted - end - end - - #This method will scale infiltration loads. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - #@param factor [Float] - def scale_inflitration_loads(factor) - self.getSpaceInfiltrationDesignFlowRates.sort.each do |infiltration_load| - infiltration_load.setDesignFlowRate(infiltration_load.designFlowRate.get * factor) unless infiltration_load.designFlowRate.empty? - infiltration_load.setFlowperSpaceFloorArea(infiltration_load.flowperSpaceFloorArea.get * factor) unless infiltration_load.flowperSpaceFloorArea.empty? - infiltration_load.setFlowperExteriorSurfaceArea(infiltration_load.flowperExteriorSurfaceArea.get * factor) unless infiltration_load.flowperExteriorSurfaceArea.empty? - infiltration_load.setAirChangesperHour(infiltration_load.airChangesperHour.get * factor) unless infiltration_load.airChangesperHour.empty? - end - end - - # Elimination Methods - #This method removes people loads from the model. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - def eliminate_all_people_loads() - self.getPeoples.sort.each {|people| people.remove} - self.getPeopleDefinitions.sort.each {|people| people.remove} - return self - end - - #This method removes light loads from model. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - def eliminate_all_lighting_loads() - self.getLightss.sort.each {|item| item.remove} - self.getLightsDefinitions.sort.each {|item| item.remove} - return self - end - - #This method removes elec loads from model. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - def eliminate_all_electric_loads() - self.getElectricEquipments.sort.each {|item| item.remove} - self.getElectricEquipmentDefinitions.sort.each {|item| item.remove} - return self - end - - #This method removes all design specification OA from model. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - def eliminate_all_design_specification_outdoor_air() - self.getDesignSpecificationOutdoorAirs.sort.each {|item| item.remove} - return self - end - - #This method removes infiltration from model.. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - def eliminate_all_space_infiltration_design_flow_rates() - self.getSpaceInfiltrationDesignFlowRates.sort.each {|item| item.remove} - return self - end - - #This method removes all space loads from model. - #@author phylroy.lopez@nrcan.gc.ca - #@param model [OpenStudio::model::Model] A model object - def eliminate_all_loads() - conductance = 0.200 - - #self.set_all_ext_wall_conductances_to(conductance) - #self.set_all_ext_roof_conductances_to(conductance) - #self.set_all_ground_floor_conductances_to(conductance) - #self.set_all_ground_wall_conductances_to(conductance) - #self.set_all_ext_windows_and_door_conductances_to(conductance) - #self.set_all_ext_skylight_conductances_to(conductance) - self.eliminate_all_people_loads - self.eliminate_all_lighting_loads - self.eliminate_all_electric_loads - self.eliminate_all_design_specification_outdoor_air - self.eliminate_all_space_infiltration_design_flow_rates - self.eliminate_all_space_infiltration_design_flow_rates - return self - end - -end - -# open the class to add methods to size all HVAC equipment - -class OpenStudio::Model::Space - def get_average_height() - roof_datum = 0 - total_roof_area = 0 - floor_datum = 0 - total_floor_area = 0 - average_height = 0 - #create a model to create a planar object.. Hopefully garbage collection deals with this right. - temp_model = OpenStudio::Model::Model.new() - self.surfaces.each do |surface| - projected_vertices = Array.new() - if surface.surfaceType == "Floor" - average_surface_height = 0 - surface.vertices.each do |point3d| - average_surface_height += point3d.z / surface.vertices.size - projected_vertices << OpenStudio::Point3d.new(point3d.x, point3d.y, 0) - end - projected_surface_area = OpenStudio::Model::Surface.new(projected_vertices ,temp_model).grossArea - total_roof_area += projected_surface_area - floor_datum += average_surface_height * projected_surface_area - elsif surface.surfaceType == "RoofCeiling" - average_surface_height = 0 - surface.vertices.each do |point3d| - average_surface_height += point3d.z / surface.vertices.size - projected_vertices << OpenStudio::Point3d.new(point3d.x, point3d.y, 0) - end - projected_surface_area = OpenStudio::Model::Surface.new(projected_vertices ,temp_model).grossArea - total_roof_area += projected_surface_area - roof_datum += average_surface_height * projected_surface_area - end - end - if total_floor_area > 0 and total_roof_area > 0 - average_height = roof_datum / total_roof_area - floor_datum / total_floor_area - end - return average_height - end -end +# require "#{File.dirname(__FILE__)}/btap" +# +# +# class OpenStudio::Model::Construction +# #This method will search through the layers and find the layer with the +# #lowest conductance and set that as the insulation layer. Note: Concrete walls +# #or slabs with no insulation layer but with a carper will see the carpet as the +# #insulation layer. +# #@author Phylroy A. Lopez <plopez@nrcan.gc.ca> +# #@return OpenStudio::Model::Material insulation_material_layer +# def self.find_and_set_insulaton_layer() +# insulation_material_layer = nil +# #return if there is already a defined insulation layer. +# return self.insulation unless self.insulation.empty? +# #set minimum conductance to 100.0 +# min_conductance = 100.0 +# #loop through Layers +# self.layers.each do |layer| +# #try casting the layer to an OpaqueMaterial. +# material = nil +# material = layer.to_OpaqueMaterial.get unless layer.to_OpaqueMaterial.empty? +# material = layer.to_FenestrationMaterial.get unless layer.to_FenestrationMaterial.empty? +# #check if the cast was successful, then find the insulation layer. +# unless nil == material +# if BTAP::Resources::Envelope::Materials::get_conductance(material) < min_conductance +# #Keep track of the highest thermal resistance value. +# min_conductance = BTAP::Resources::Envelope::Materials::get_conductance(material) +# insulation_material_layer = material +# unless material.to_OpaqueMaterial.empty? +# self.setInsulation(material) +# end +# end +# end +# end +# if self.insulation.empty? and self.isOpaque +# raise ("construction #{self.name.get.to_s} insulation layer could not be set!. This occurs when a insulation layer is duplicated in the construction.") +# end +# return insulation_material_layer +# end +# +# +# +# +# #This method will create a new construction based on self and a new conductance value. +# #It will check to see if a similar construction has already been created by this method +# #if so it will return the existing construction. If you wish to keep some of the properties, enter the +# #string "default" instead of a numerical value. +# #@author Phylroy A. Lopez <plopez@nrcan.gc.ca> +# #@param model [OpenStudio::Model::Model] +# #@param construction <String> +# #@param conductance [Fixnum] +# #@return [<String]OpenStudio::Model::getConstructionByName] new_construction +# def customize(model, +# construction, +# conductance, +# solarTransmittanceatNormalIncidence = nil, +# visibleTransmittance = nil +# ) +# +# if self.isOpaque +# +# minimum_resistance = 0 +# name_prefix = "#{construction.handle()} U- #{conductance}" +# +# #Check to see if we already made one like this. +# existing_construction = OpenStudio::Model::getConstructionByName(self.model,name_prefix) +# if not existing_construction.empty? +# # if so, return existing construction +# return existing_construction.get +# end +# +# #create a copy +# new_construction = self.deep_copy(self.model,construction) +# +# #Change Construction name in clone +# new_construction.setName( name_prefix) +# +# if conductance.kind_of?(Float) +# #re-find insulation layer +# find_and_set_insulaton_layer(self.model,new_construction) +# +# #Determine how low the resistance can be set. Subtract existing insulation +# #Values from the total resistance to see how low we can go. +# minimum_resistance = (1 / new_construction.thermalConductance.to_f) - (1.0 / new_construction.insulation.get.thermalConductance.to_f) +# +# #Check if the requested resistance is smaller than the minimum +# # resistance. If so, use the minimum resistance instead. +# if minimum_resistance > ( 1 / conductance ) +# #tell user why we are defaulting and set the conductance of the +# # construction. +# raise ("could not set conductance of construction #{new_construction.name.to_s} to because existing layers make this impossible. Change the construction to allow for this conductance to be set." + (conductance).to_s + "setting to closest value possible value:" + (1.0 / minimum_resistance).to_s ) +# # new_construction.setConductance((1.0/minimum_resistance)) +# else +# unless new_construction.setConductance(conductance) +# raise("could not set conductance of construction #{new_construction.name.to_s}") +# end +# end +# end +# return new_construction +# elsif self.isFenestration() +# +# #get equivilant values for tsol, tvis, and conductances. +# solarTransmittanceatNormalIncidence = self.get_shgc(model, construction) if solarTransmittanceatNormalIncidence == nil +# visibleTransmittance = self.get_tvis(model,construction) if visibleTransmittance == nil +# conductance = self.get_conductance(construction) if conductance == nil +# frontSideSolarReflectanceatNormalIncidence = 1.0 - solarTransmittanceatNormalIncidence +# backSideSolarReflectanceatNormalIncidence = 1.0 - solarTransmittanceatNormalIncidence +# frontSideVisibleReflectanceatNormalIncidence = 0.081000 +# backSideVisibleReflectanceatNormalIncidence = 0.081000 +# infraredTransmittanceatNormalIncidence = 0.0 +# frontSideInfraredHemisphericalEmissivity = 0.84 +# backSideInfraredHemisphericalEmissivity = 0.84 +# #store part of fenestation in array bins. +# glazing_array = Array.new() +# shading_material_array = Array.new() +# gas_array = Array.new() +# construction.layers.each do |material| +# glazing_array << material unless material.to_Glazing.empty? +# shading_material_array << material unless material.to_ShadingMaterial.empty? +# gas_array << material unless material.to_GasLayer.empty? +# end +# +# #set value of fictious glazing based on the fenestrations front and back if available +# unless glazing_array.first.to_StandardGlazing.empty? +# frontSideSolarReflectanceatNormalIncidence = glazing_array.first.to_StandardGlazing.get.frontSideSolarReflectanceatNormalIncidence +# frontSideVisibleReflectanceatNormalIncidence = glazing_array.first.to_StandardGlazing.get.frontSideVisibleReflectanceatNormalIncidence +# frontSideInfraredHemisphericalEmissivity = glazing_array.first.to_StandardGlazing.get.frontSideInfraredHemisphericalEmissivity +# end +# +# unless glazing_array.last.to_StandardGlazing.empty? +# backSideSolarReflectanceatNormalIncidence = glazing_array.last.to_StandardGlazing.get.backSideSolarReflectanceatNormalIncidence +# backSideVisibleReflectanceatNormalIncidence = glazing_array.last.to_StandardGlazing.get.backSideVisibleReflectanceatNormalIncidence +# backSideInfraredHemisphericalEmissivity = glazing_array.last.to_StandardGlazing.get.backSideInfraredHemisphericalEmissivity +# end +# #create fictious glazing. +# #assume a thickness of 0.10m +# thickness = 0.10 +# #calculate conductivity +# conductivity = conductance * thickness +# data_name_suffix = " cond=#{("%.3f" % conductivity).to_s} tvis=#{("%.3f" % visibleTransmittance).to_s} tsol=#{("%.3f" % solarTransmittanceatNormalIncidence).to_s}" +# cons_name = "Customized Fenestration:" + data_name_suffix +# glazing_name = "Customized Fenestration::" + data_name_suffix +# #Search to prevent the massive duplication that may ensue. +# return model.getConstructionByName(cons_name).get unless model.getConstructionByName(cons_name).empty? +# +# #fix for Simple glazing +# conductivity = conductance +# glazing = BTAP::Resources::Envelope::Materials::Fenestration::create_simple_glazing( +# construction.model,#model +# glazing_name, #name +# 0.60, #SHGC +# conductivity, #u-factor +# thickness, #Thickness +# 0.21 #vis trans +# ) +# +# new_materials_array = Array.new() +# new_materials_array << glazing +# new_materials_array.concat(shading_material_array) unless shading_material_array.empty? +# return self.create_construction(construction.model, cons_name, new_materials_array) +# end +# end +# +# +# +# end +# +# +# +# # open the class to add methods to size all HVAC equipment +# class OpenStudio::Model::Model +# +# def perform_load_elimination_analysis(folder = Dir.pwd) +# #remove hvac and only use ideal loads. +# model = self.clone(true).to_Model +# BTAP::Resources::HVAC::clear_all_hvac_from_model(model) +# model.getThermalZones.sort.each {|zone| zone.setUseIdealAirLoads(true)} +# conductance = 0.200 +# models = Array.new() +# #Add baseline +# models << {:name => 'baseline', :model => model} +# #Add copies of model with elimination of a characteristic. +# models << {:name => 'elim_ext_wall', :model => model.clone(true).to_Model} +# =begin +# models << {:name => 'elim_ext_roof', :model => model.clone(true).to_Model.set_all_ext_roof_conductances_to(conductance)} +# models << {:name => 'elim_ground_floor', :model => model.clone(true).to_Model.set_all_ground_floor_conductances_to(conductance)} +# models << {:name => 'elim_ground_wall', :model => model.clone(true).to_Model.set_all_ground_wall_conductances_to(conductance)} +# models << {:name => 'elim_win_doors', :model => model.clone(true).to_Model.set_all_ext_windows_and_door_conductances_to(conductance)} +# models << {:name => 'elim_skylights', :model => model.clone(true).to_Model.set_all_ext_skylight_conductances_to(conductance)} +# models << {:name => 'elim_people', :model => model.clone(true).to_Model.eliminate_all_people_loads} +# models << {:name => 'elim_lighting', :model => model.clone(true).to_Model.eliminate_all_lighting_loads} +# models << {:name => 'elim_plug_loads', :model => model.clone(true).to_Model.eliminate_all_electric_loads} +# models << {:name => 'elim_outdoor_air', :model => model.clone(true).to_Model.eliminate_all_design_specification_outdoor_air} +# models << {:name => 'elim_infiltration', :model => model.clone(true).to_Model.eliminate_all_space_infiltration_design_flow_rates} +# models << {:name => 'elim_all_loads', :model => model.clone(true).to_Model.eliminate_all_loads} +# =end +# +# #Get a handle for the baseline. +# baseline = models.find {|model| model[:name] == 'baseline' } +# #Create a result hash. +# result = Hash.new() +# models.each do |model| +# #run each model in its own folder. +# success = model_run_simulation_and_log_errors(model[:model], "#{folder}/#{model[:name]}") +# +# #Run the qa-qc method to get all the results. +# +# qa_qc = BTAP::perform_qaqc(model[:model]) +# #Store total energy in the hash +# model[:total_end_uses_gj_per_m2] = qa_qc[:end_uses_eui][:total_end_uses_gj_per_m2] +# #This assumes that the baseline is always the first in the hash. +# unless model[:name] = 'baseline' +# result[model[:name]] = model[:total_end_uses_gj_per_m2] / baseline[:total_end_uses_gj_per_m2] +# end +# end +# return result +# end +# +# +# # Set global changes +# def set_all_ext_wall_conductances_to(conductance) +# #Set conductances to needed values in construction set if possible. +# self.getDefaultConstructionSets.sort.each_with_index do |default_construction_set, index| +# BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( +# self, +# "Sensitivity Def Cnst Set #{index}", +# default_construction_set, +# 1/conductance, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil +# ) +# end +# #sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type. +# self.getPlanarSurfaces.sort.each {|item| item.resetConstruction} +# #if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces +# BTAP::Resources::Envelope::assign_interior_surface_construction_to_adiabatic_surfaces(self, nil) +# return self +# end +# +# def set_all_ext_roof_conductances_to(conductance) +# #Set conductances to needed values in construction set if possible. +# self.getDefaultConstructionSets.sort.each_with_index do |default_construction_set, index| +# BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( +# self, +# "Sensitivity Def Cnst Set #{index}", +# default_construction_set, +# nil, +# nil, +# 1/conductance, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil +# ) +# end +# #sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type. +# self.getPlanarSurfaces.sort.each {|item| item.resetConstruction} +# #if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces +# BTAP::Resources::Envelope::assign_interior_surface_construction_to_adiabatic_surfaces(self, nil) +# return self +# end +# +# def set_all_ground_wall_conductances_to(conductance) +# #Set conductances to needed values in construction set if possible. +# self.getDefaultConstructionSets.sort.each_with_index do |default_construction_set, index| +# BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( +# self, +# "Sensitivity Def Cnst Set #{index}", +# default_construction_set, +# nil, +# nil, +# nil, +# 1/conductance, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil +# ) +# end +# #sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type. +# self.getPlanarSurfaces.sort.each {|item| item.resetConstruction} +# #if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces +# BTAP::Resources::Envelope::assign_interior_surface_construction_to_adiabatic_surfaces(self, nil) +# return self +# end +# +# def set_all_ground_floor_conductances_to(conductance) +# #Set conductances to needed values in construction set if possible. +# self.getDefaultConstructionSets.sort.each_with_index do |default_construction_set, index| +# BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( +# self, +# "Sensitivity Def Cnst Set #{index}", +# default_construction_set, +# nil, +# nil, +# nil, +# nil, +# 1/conductance, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil +# ) +# end +# #sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type. +# self.getPlanarSurfaces.sort.each {|item| item.resetConstruction} +# #if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces +# BTAP::Resources::Envelope::assign_interior_surface_construction_to_adiabatic_surfaces(self, nil) +# return self +# end +# +# def set_all_ext_windows_and_door_conductances_to(conductance) +# #Set conductances to needed values in construction set if possible. +# self.getDefaultConstructionSets.sort.each_with_index do |default_construction_set, index| +# BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( +# self, +# "Sensitivity Def Cnst Set #{index}", +# default_construction_set, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# 1/conductance, +# nil, +# nil, +# 1/conductance, +# nil, +# nil, +# 1/conductance, +# 1/conductance, +# nil, +# nil, +# 1/conductance, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil +# ) +# end +# #sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type. +# self.getPlanarSurfaces.sort.each {|item| item.resetConstruction} +# #if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces +# BTAP::Resources::Envelope::assign_interior_surface_construction_to_adiabatic_surfaces(self, nil) +# return self +# end +# +# def set_all_ext_skylight_conductances_to(conductance) +# #Set conductances to needed values in construction set if possible. +# self.getDefaultConstructionSets.sort.each_with_index do |default_construction_set, index| +# BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( +# self, +# "Sensitivity Def Cnst Set #{index}", +# default_construction_set, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# 1/conductance, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil, +# nil +# ) +# end +# #sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type. +# self.getPlanarSurfaces.sort.each {|item| item.resetConstruction} +# #if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces +# BTAP::Resources::Envelope::assign_interior_surface_construction_to_adiabatic_surfaces(self, nil) +# return self +# end +# +# #This method will set the infiltration magnitude. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param self [OpenStudio::model::Model] A model object +# #@param setDesignFlowRate [Float] +# #@param setFlowperSpaceFloorArea [Float] +# #@param setFlowperExteriorSurfaceArea [Float] +# #@param setAirChangesperHour [Float] +# #@return [String] table +# def set_all_inflitration_rates(setDesignFlowRate, +# setFlowperSpaceFloorArea, +# setFlowperExteriorSurfaceArea, +# setAirChangesperHour) +# +# table = "name,infiltration_method,infiltration_design_flow_rate,infiltration_flow_per_space,infiltration_flow_per_exterior_area,infiltration_air_changes_per_hour\n" +# self.getSpaceInfiltrationDesignFlowRates.sort.each do |infiltration_load| +# infiltration_load.setAirChangesperHour(setAirChangesperHour) unless setAirChangesperHour.nil? +# infiltration_load.setDesignFlowRate(setDesignFlowRate) unless setDesignFlowRate.nil? +# infiltration_load.setFlowperSpaceFloorArea(setFlowperSpaceFloorArea) unless setFlowperSpaceFloorArea.nil? +# infiltration_load.setFlowperExteriorSurfaceArea(setFlowperExteriorSurfaceArea) unless setFlowperExteriorSurfaceArea.nil? +# table << infiltration_load.name.get.to_s << "," +# table << infiltration_load.designFlowRateCalculationMethod << "," +# infiltration_load.airChangesperHour.empty? ? ach = "NA" : ach = infiltration_load.airChangesperHour.get +# infiltration_load.designFlowRate.empty? ? dfr = "NA" : dfr = infiltration_load.designFlowRate.get +# infiltration_load.flowperSpaceFloorArea.empty? ? fsfa = "NA" : fsfa = infiltration_load.flowperSpaceFloorArea.get +# infiltration_load.flowperExteriorSurfaceArea.empty? ? fesa = "NA" : fesa = infiltration_load.flowperExteriorSurfaceArea.get +# table << "#{ach},#{dfr},#{fsfa},#{fesa}\n" +# end +# return table +# end +# +# #Scale Global Changes +# def scale_all_people_loads(factor) +# self.getPeoples.sort.each do |item| +# item.setMultiplier(item.multiplier * factor) +# end +# end +# +# #This method will scale people loads schedule. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# #@param a_coef [Float] +# #@param b_coef [Float] +# #@param c_coef [Float] +# #@param time_shift [Float] +# #@param time_sign [Float] +# def scale_people_loads_schedule(a_coef, +# b_coef, +# c_coef, +# time_shift = nil, +# time_sign = nil) +# model.getPeoples.sort.each do |item| +# #Do an in-place modification of the schedule. +# BTAP::Resources::Schedules::modify_schedule!(self, item.schedule, a_coef, b_coef, c_coef, time_shift, time_sign) +# end +# end +# +# #This method will scale lighting loads. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# #@param factor [Float] +# def scale_lighting_loads(factor) +# self.getLightss.sort.each do |item| +# item.setMultiplier(item.multiplier * factor) +# end +# end +# +# #This method will scale lighting loads schedule. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# #@param a_coef [Float] +# #@param b_coef [Float] +# #@param c_coef [Float] +# #@param time_shift [Float] +# #@param time_sign [Float] +# def scale_lighting_loads_schedule(a_coef, +# b_coef, +# c_coef, +# time_shift = nil, +# time_sign = nil) +# model.getLightss.sort.each do |item| +# #Do an in-place modification of the schedule. +# BTAP::Resources::Schedules::modify_schedule!(self, item.schedule, a_coef, b_coef, c_coef, time_shift, time_sign) +# end +# end +# +# #This method will scale electrical loads. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# #@param factor [Float] +# def scale_electrical_loads(model, factor) +# self.getElectricEquipments.sort.each do |item| +# item.setMultiplier(item.multiplier * factor) +# end +# end +# +# #This method will scale electrical loads schedule. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# #@param a_coef [Float] +# #@param b_coef [Float] +# #@param c_coef [Float] +# #@param time_shift [Float] +# #@param time_sign [Float] +# def scale_electrical_loads_schedule(a_coef, +# b_coef, +# c_coef, +# time_shift = nil, +# time_sign = nil) +# self.getElectricEquipments.sort.each do |item| +# BTAP::Resources::Schedules::modify_schedule!(self, item.schedule, a_coef, b_coef, c_coef, time_shift, time_sign) +# end +# end +# +# #This method will scale Outdoor Air loads. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# #@param factor [Float] +# def scale_oa_loads(factor) +# self.getDesignSpecificationOutdoorAirs.sort.each do |oa_def| +# oa_def.setOutdoorAirFlowperPerson(oa_def.outdoorAirFlowperPerson * factor) unless oa_def.isOutdoorAirFlowperPersonDefaulted +# oa_def.setOutdoorAirFlowperFloorArea(oa_def.outdoorAirFlowperFloorArea * factor) unless oa_def.isOutdoorAirFlowperFloorAreaDefaulted +# oa_def.setOutdoorAirFlowRate(oa_def.outdoorAirFlowRate * factor) unless oa_def.isOutdoorAirFlowRateDefaulted +# oa_def.setOutdoorAirFlowAirChangesperHour(oa_def.outdoorAirFlowAirChangesperHour * factor) unless oa_def.isOutdoorAirFlowAirChangesperHourDefaulted +# end +# end +# +# #This method will scale infiltration loads. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# #@param factor [Float] +# def scale_inflitration_loads(factor) +# self.getSpaceInfiltrationDesignFlowRates.sort.each do |infiltration_load| +# infiltration_load.setDesignFlowRate(infiltration_load.designFlowRate.get * factor) unless infiltration_load.designFlowRate.empty? +# infiltration_load.setFlowperSpaceFloorArea(infiltration_load.flowperSpaceFloorArea.get * factor) unless infiltration_load.flowperSpaceFloorArea.empty? +# infiltration_load.setFlowperExteriorSurfaceArea(infiltration_load.flowperExteriorSurfaceArea.get * factor) unless infiltration_load.flowperExteriorSurfaceArea.empty? +# infiltration_load.setAirChangesperHour(infiltration_load.airChangesperHour.get * factor) unless infiltration_load.airChangesperHour.empty? +# end +# end +# +# # Elimination Methods +# #This method removes people loads from the model. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# def eliminate_all_people_loads() +# self.getPeoples.sort.each {|people| people.remove} +# self.getPeopleDefinitions.sort.each {|people| people.remove} +# return self +# end +# +# #This method removes light loads from model. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# def eliminate_all_lighting_loads() +# self.getLightss.sort.each {|item| item.remove} +# self.getLightsDefinitions.sort.each {|item| item.remove} +# return self +# end +# +# #This method removes elec loads from model. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# def eliminate_all_electric_loads() +# self.getElectricEquipments.sort.each {|item| item.remove} +# self.getElectricEquipmentDefinitions.sort.each {|item| item.remove} +# return self +# end +# +# #This method removes all design specification OA from model. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# def eliminate_all_design_specification_outdoor_air() +# self.getDesignSpecificationOutdoorAirs.sort.each {|item| item.remove} +# return self +# end +# +# #This method removes infiltration from model.. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# def eliminate_all_space_infiltration_design_flow_rates() +# self.getSpaceInfiltrationDesignFlowRates.sort.each {|item| item.remove} +# return self +# end +# +# #This method removes all space loads from model. +# #@author phylroy.lopez@nrcan.gc.ca +# #@param model [OpenStudio::model::Model] A model object +# def eliminate_all_loads() +# conductance = 0.200 +# +# #self.set_all_ext_wall_conductances_to(conductance) +# #self.set_all_ext_roof_conductances_to(conductance) +# #self.set_all_ground_floor_conductances_to(conductance) +# #self.set_all_ground_wall_conductances_to(conductance) +# #self.set_all_ext_windows_and_door_conductances_to(conductance) +# #self.set_all_ext_skylight_conductances_to(conductance) +# self.eliminate_all_people_loads +# self.eliminate_all_lighting_loads +# self.eliminate_all_electric_loads +# self.eliminate_all_design_specification_outdoor_air +# self.eliminate_all_space_infiltration_design_flow_rates +# self.eliminate_all_space_infiltration_design_flow_rates +# return self +# end +# +# end +# +# # open the class to add methods to size all HVAC equipment +# +# class OpenStudio::Model::Space +# def get_average_height() +# roof_datum = 0 +# total_roof_area = 0 +# floor_datum = 0 +# total_floor_area = 0 +# average_height = 0 +# #create a model to create a planar object.. Hopefully garbage collection deals with this right. +# temp_model = OpenStudio::Model::Model.new() +# self.surfaces.each do |surface| +# projected_vertices = Array.new() +# if surface.surfaceType == "Floor" +# average_surface_height = 0 +# surface.vertices.each do |point3d| +# average_surface_height += point3d.z / surface.vertices.size +# projected_vertices << OpenStudio::Point3d.new(point3d.x, point3d.y, 0) +# end +# projected_surface_area = OpenStudio::Model::Surface.new(projected_vertices ,temp_model).grossArea +# total_roof_area += projected_surface_area +# floor_datum += average_surface_height * projected_surface_area +# elsif surface.surfaceType == "RoofCeiling" +# average_surface_height = 0 +# surface.vertices.each do |point3d| +# average_surface_height += point3d.z / surface.vertices.size +# projected_vertices << OpenStudio::Point3d.new(point3d.x, point3d.y, 0) +# end +# projected_surface_area = OpenStudio::Model::Surface.new(projected_vertices ,temp_model).grossArea +# total_roof_area += projected_surface_area +# roof_datum += average_surface_height * projected_surface_area +# end +# end +# if total_floor_area > 0 and total_roof_area > 0 +# average_height = roof_datum / total_roof_area - floor_datum / total_floor_area +# end +# return average_height +# end +# end