Scaling Commercial Reference Buildings
Are there any forthcoming measures that will allow the OpenStudio versions of the Commercial Reference Buildings to be scaled is size?
First time here? Check out the Help page!
Are there any forthcoming measures that will allow the OpenStudio versions of the Commercial Reference Buildings to be scaled is size?
Here is some code that allows you to scale the X-Y-Z dimensions of the building. Make a new measure and put this into the measure.rb file:
#start the measure
class ScaleBuildingSize < OpenStudio::Ruleset::ModelUserScript
#define the name that a user will see, this method may be deprecated as
#the display name in PAT comes from the name field in measure.xml
def name
return "ScaleBuildingSize"
end
#define the arguments that the user will input
def arguments(model)
args = OpenStudio::Ruleset::OSArgumentVector.new
#make an argument for the X direction scale
x_scale = OpenStudio::Ruleset::OSArgument::makeDoubleArgument("x_scale",true)
x_scale.setDisplayName("X-dimension scale")
x_scale.setDefaultValue(1.0)
args << x_scale
#make an argument for the Y direction scale
y_scale = OpenStudio::Ruleset::OSArgument::makeDoubleArgument("y_scale",true)
y_scale.setDisplayName("Y-dimension scale")
y_scale.setDefaultValue(1.0)
args << y_scale
#make an argument for the Z direction scale
z_scale = OpenStudio::Ruleset::OSArgument::makeDoubleArgument("z_scale",true)
z_scale.setDisplayName("Z-dimension scale")
z_scale.setDefaultValue(1.0)
args << z_scale
return args
end #end the arguments method
#define what happens when the measure is run
def run(model, runner, user_arguments)
super(model, runner, user_arguments)
#use the built-in error checking
if not runner.validateUserArguments(arguments(model), user_arguments)
return false
end
#assign the user inputs to variables
x_scale = runner.getDoubleArgumentValue("x_scale",user_arguments)
y_scale = runner.getDoubleArgumentValue("y_scale",user_arguments)
z_scale = runner.getDoubleArgumentValue("z_scale",user_arguments)
#check the user_name for reasonableness
if x_scale <= 0 or y_scale <= 0 or z_scale <= 0
runner.registerError("X, Y, and Z scale values must all be > 0")
return false
end
#report the initial building area
if model.building.is_initialized
initial_building_area = OpenStudio::convert(model.building.get.floorArea,"m^2","ft^2").get
runner.registerInitialCondition("The building floor area started at #{initial_building_area} ft^2.")
end
model.getPlanarSurfaces.each do |surface|
new_vertices = OpenStudio::Point3dVector.new
surface.vertices.each do |vertex|
new_vertices << OpenStudio::Point3d.new(vertex.x * x_scale, vertex.y * y_scale, vertex.z * z_scale)
end
surface.setVertices(new_vertices)
end
model.getPlanarSurfaceGroups.each do |surface_group|
transformation = surface_group.transformation
translation = transformation.translation
euler_angles = transformation.eulerAngles
new_translation = OpenStudio::Vector3d.new(translation.x * x_scale, translation.y * y_scale, translation.z * z_scale)
#TODO these might be in the wrong order
new_transformation = OpenStudio::createRotation(euler_angles) * OpenStudio::createTranslation(new_translation)
surface_group.setTransformation(new_transformation)
end
#report the final building area
if model.building.is_initialized
final_building_area = OpenStudio::convert(model.building.get.floorArea,"m^2","ft^2").get
runner.registerFinalCondition("The building floor area ended at #{final_building_area} ft^2.")
end
return true
end #end the run method
end #end the measure
#this allows the measure to be use by the application
ScaleBuildingSize.new.registerWithApplication
I'm going to point to a few existing questions, and then make a few additional comments.
This thread talks about our plans to make measures to produce DOE reference buildings.
Ideally in most cases you will feed in a the geometry from your current design, but if you did want to use the reference building envelope, there are a few options for scaling it. I think the most straight forward approach would be to adjust the thermal zone multipliers.
If you do physically want to stretch the reference building geometry (or any model) you can adapt the process shown on this post that shows a plugin and a measure based approach to increase the floor to floor height of a model. Same logic will work on x and y axis as well.
@David Goldwasser Thanks the zone multipliers are a very elegant solution. I need to think through the assumptions that are inherent in both the scaling geometry and thermal zone multiplier approaches to decide which will be more accurate for my application
Your welcome. My main concern with scaling the geometry to mimic a larger building is that exterior walls won't scale equitability (for a building with similar depth) with the floor area. As a result changes to wall constructions and window to wall ratio won't impact results as much as they should. Also scaling surfaces won't address daylighting controls if they exist.
If you are just scaling to 120% Probably not much to worry about, but 300% is another issue.
If the building is a bar you could just scale it along one axis vs both, although at some point in real life would add more floors or break into multiple buildings.
Oh, and if the model has any loads and they are not area based they won't scale properly with geometry. Water use equipment would always fall into this category. Exhaust fans would be issue since not auto sized. Zone multipliers should handle most of these, but maybe not water use equipment since it doesn't have to be part of a zone. Similar for exterior lighting.
Please start posting anonymously - your entry will be published after you log in or create a new account.
Asked: 2015-03-10 09:20:10 -0500
Seen: 430 times
Last updated: Mar 10 '15
Great question!