Module: BTAP::Resources::Envelope::Constructions
- Defined in:
- lib/openstudio-standards/btap/envelope.rb
Overview
This module contains methods dealing with the creation and modification of constructions.
Defined Under Namespace
Classes: ConstructionsTests
Class Method Summary collapse
-
.create_construction(model, name, materials, insulationLayer = nil) ⇒ String
This will create construction model.
- .create_default_construction(model, rsi) ⇒ Object
- .create_default_fenestration(model, rsi) ⇒ Object
-
.customize_fenestration_construction(model, construction, conductance = nil, solarTransmittanceatNormalIncidence = nil, visibleTransmittance = nil, at_temperature_c = 0.0) ⇒ String
This will customize fenestration construction.
-
.customize_opaque_construction(model, construction, conductance) ⇒ <String]OpenStudio::Model::getConstructionByName
This method will create a new construction based on self and a new conductance value.
-
.deep_copy(model, construction) ⇒ String
This will create a deep copy of the construction.
-
.find_and_set_insulaton_layer(model, constructions_array) ⇒ String
This method will search through the layers and find the layer with the lowest conductance and set that as the insulation layer.
-
.get_conductance(construction, at_temperature_c = 0.0) ⇒ Double
this method will get the conductance (metric) of the construction.
-
.get_rsi(construction, at_temperature_c = 0.0) ⇒ Double
this method will get the rsi (metric) of the construction.
-
.get_tsol(model, construction) ⇒ Float
This model gets tsol.
-
.get_tvis(model, construction) ⇒ Float
This model gets tvis.
Class Method Details
.create_construction(model, name, materials, insulationLayer = nil) ⇒ String
This will create construction model
732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 |
# File 'lib/openstudio-standards/btap/envelope.rb', line 732 def self.create_construction(model, name, materials, insulationLayer = nil) construction = OpenStudio::Model::Construction.new(model) construction.setName( name) #check to see if they are all Fenestation or Opaque. Can't mix and match. is_fenestration = false is_opaque = false #check to see if materials are all the same type. materials.each do |material| is_fenestration = true unless material.to_FenestrationMaterial.empty? is_opaque = true unless material.to_OpaqueMaterial.empty? end raise ("Materials Passed are not valid. Either they are mixed Opaque/Fenestration or invalid materials") if (is_fenestration and is_opaque) or (not is_fenestration and not is_opaque) construction.setLayers(materials) construction.setInsulation(insulationLayer) unless nil == insulationLayer or is_fenestration return construction end |
.create_default_construction(model, rsi) ⇒ Object
850 851 852 |
# File 'lib/openstudio-standards/btap/envelope.rb', line 850 def self.create_default_construction(model, rsi) end |
.create_default_fenestration(model, rsi) ⇒ Object
854 855 856 |
# File 'lib/openstudio-standards/btap/envelope.rb', line 854 def self.create_default_fenestration(model, rsi) end |
.customize_fenestration_construction(model, construction, conductance = nil, solarTransmittanceatNormalIncidence = nil, visibleTransmittance = nil, at_temperature_c = 0.0) ⇒ String
This will customize fenestration construction
758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 |
# File 'lib/openstudio-standards/btap/envelope.rb', line 758 def self.customize_fenestration_construction( model, construction, conductance = nil, solarTransmittanceatNormalIncidence = nil, visibleTransmittance = nil, at_temperature_c = 0.0) construction = OpenStudio::Model::getConstructionByName(model,construction.name.to_s).get raise ("This is not a fenestration!") unless construction.isFenestration #get equivilant values for tsol, tvis, and conductances. solarTransmittanceatNormalIncidence = self.get_tsol(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 ) # glazing = BTAP::Resources::Envelope::Materials::Fenestration::create_standard_glazing( # construction.model, # glazing_name, # thickness, # conductivity, # solarTransmittanceatNormalIncidence , # frontSideSolarReflectanceatNormalIncidence , # backSideSolarReflectanceatNormalIncidence , # visibleTransmittance , # frontSideVisibleReflectanceatNormalIncidence , # backSideVisibleReflectanceatNormalIncidence , # infraredTransmittanceatNormalIncidence, # frontSideInfraredHemisphericalEmissivity, # backSideInfraredHemisphericalEmissivity , # "SpectralAverage", # 1.0, # false # ) #add the glazing and any shading materials to the array and create construction based on this. new_materials_array = Array.new() new_materials_array << glazing new_materials_array.concat(shading_material_array) unless shading_material_array.empty? #puts new_materials_array.size return self.create_construction(construction.model, cons_name, new_materials_array) end |
.customize_opaque_construction(model, construction, conductance) ⇒ <String]OpenStudio::Model::getConstructionByName
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.
591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 |
# File 'lib/openstudio-standards/btap/envelope.rb', line 591 def self.customize_opaque_construction(model,construction,conductance) #Will convert from a string identifier to an object if required. construction = BTAP::Common::validate_array(model,construction,"Construction").first #If it is Opaque raise ("This construction is not opaque :#{construction.name}") unless (construction.isOpaque) minimum_resistance = 0 name_prefix = "Customized opaque construction #{construction.name} to conductance of #{conductance}" #Check to see if we already made one like this. existing_construction = OpenStudio::Model::getConstructionByName(construction.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(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(model,new_construction) #There is a limit of 3 meters for material thickness. To avoid hitting that #limit, let's adjust the conductivity of the materials to a very low value. #construction.insulation.get.setThermalConductivity(0.001) # #Determine how low the resistance can be set. Subtract exisiting 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 end |
.deep_copy(model, construction) ⇒ String
This will create a deep copy of the construction
712 713 714 715 716 717 718 719 720 721 722 723 |
# File 'lib/openstudio-standards/btap/envelope.rb', line 712 def self.deep_copy(model, construction) construction = BTAP::Common::validate_array(model,construction,"Construction").first new_construction = construction.clone.to_Construction.get #interating through layers." (0..new_construction.layers.length-1).each do |layernumber| #cloning material" cloned_layer = new_construction.getLayer(layernumber).clone.to_Material.get #"setting material to new construction." new_construction.setLayer(layernumber,cloned_layer ) end return new_construction end |
.find_and_set_insulaton_layer(model, constructions_array) ⇒ String
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.
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 |
# File 'lib/openstudio-standards/btap/envelope.rb', line 543 def self.find_and_set_insulaton_layer(model,constructions_array) constructions_array = BTAP::Common::validate_array(model,constructions_array,"Construction") insulating_layers = Array.new() constructions_array.each do |construction| return_material = "" #skip if already has an insulation layer set. next unless construction.insulation.empty? #set insulation layer. #find insulation layer min_conductance = 100.0 #loop through Layers construction.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) return_material = material unless material.to_OpaqueMaterial.empty? construction.setInsulation(material) end end end end if construction.insulation.empty? and construction.isOpaque raise ("construction #{construction.name.get.to_s} insulation layer could not be set!. This occurs when a insulation layer is duplicated in the construction.") end insulating_layers << return_material end return insulating_layers end |
.get_conductance(construction, at_temperature_c = 0.0) ⇒ Double
this method will get the conductance (metric) of the construction.
686 687 688 689 690 691 692 693 694 695 |
# File 'lib/openstudio-standards/btap/envelope.rb', line 686 def self.get_conductance(construction, at_temperature_c = 0.0) #if , by accidnet a construction base was passed...convert it to a construction object. construction = OpenStudio::Model::getConstructionByName(construction.model,construction.name.to_s).get unless construction.to_ConstructionBase.empty? total = 0.0 construction.layers.each do |material| total = total + 1.0 / BTAP::Resources::Envelope::Materials::get_conductance(material,at_temperature_c) end return 1.0 / total end |
.get_rsi(construction, at_temperature_c = 0.0) ⇒ Double
this method will get the rsi (metric) of the construction.
702 703 704 |
# File 'lib/openstudio-standards/btap/envelope.rb', line 702 def self.get_rsi(construction, at_temperature_c = 0.0) return 1.0 / self.get_conductance(construction, at_temperature_c) end |
.get_tsol(model, construction) ⇒ Float
This model gets tsol
645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 |
# File 'lib/openstudio-standards/btap/envelope.rb', line 645 def self.get_tsol(model,construction) construction = BTAP::Common::validate_array(model,construction,"Construction").first construction = OpenStudio::Model::getConstructionByName(model,construction.name.to_s).get tsol = 1.0 if construction.isFenestration construction.layers.each do |layer| #check to see if it is a simple glazing. If so use the SHGC method. tsol = tsol * layer.to_SimpleGlazing.get.getSolarHeatGainCoefficient().value unless layer.to_SimpleGlazing.empty? #check to see if it is a standard glazing. If so use the solar transmittance method. tsol = tsol * layer.to_StandardGlazing.get.solarTransmittance() unless layer.to_StandardGlazing.empty? end end return tsol end |
.get_tvis(model, construction) ⇒ Float
This model gets tvis
666 667 668 669 670 671 672 673 674 675 676 677 678 679 |
# File 'lib/openstudio-standards/btap/envelope.rb', line 666 def self.get_tvis(model,construction) construction = BTAP::Common::validate_array(model,construction,"Construction").first construction = OpenStudio::Model::getConstructionByName(model,construction.name.to_s).get tvis = 1.0 if construction.isFenestration construction.layers.each do |layer| #check to see if it is a simple glazing. If so use the SHGC method. tvis = tvis * layer.to_SimpleGlazing.get.getVisibleTransmittance().get.value unless layer.to_SimpleGlazing.empty? #check to see if it is a standard glazing. If so use the solar transmittance method. tvis = tvis * layer.to_StandardGlazing.get.visibleTransmittanceatNormalIncidence().get unless layer.to_StandardGlazing.empty? end end return tvis end |