energyplus 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,169 @@
1
+ ######################################################################
2
+ # Copyright (c) 2008-2013, Alliance for Sustainable Energy.
3
+ # All rights reserved.
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2.1 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ ######################################################################
19
+
20
+ require 'pathname'
21
+ require 'csv'
22
+ require 'Formats/Formats.rb'
23
+
24
+ def make_schedule_name(s)
25
+ schedule_name = s
26
+ schedule_name = schedule_name.gsub(/[A-Z][a-z]/, ' \0').lstrip
27
+ schedule_name = schedule_name.gsub(/[a-z][A-Z]/) {|s| "" << s[0] << " " << s[1]}
28
+ schedule_name = schedule_name.gsub('_', ' ').gsub('-',' ').gsub(',',' ').gsub('()', '')
29
+ schedule_name = schedule_name.split(' ').each{|p| p.capitalize!}.join(' ')
30
+ return schedule_name
31
+ end
32
+
33
+ class Schedule
34
+ attr_accessor :name, :type, :table, :hours_per_year
35
+
36
+ def initialize(s)
37
+ @lines = s.split("\n")
38
+ @name = make_schedule_name(@lines[0])
39
+ @type = @lines[1]
40
+
41
+ @table = Array.new
42
+ this_table = Array.new
43
+ duration = ""
44
+ this_cols = 0
45
+ open = false
46
+ multi_duration = false
47
+ (2..@lines.length-1).each do |idx|
48
+ parts = CSV.parse_line(@lines[idx])
49
+
50
+ if parts[0].include?('Through')
51
+ if open
52
+ if (not this_table[-1][0] == 'Total Hours/Year')
53
+ this_table.push(Array.new)
54
+ this_table[-1].push('Total Hours/Year') if not multi_duration
55
+ (1..this_cols-1).each {|i| this_table[-1].push("") }
56
+ end
57
+ multi_duration = true
58
+ close_table(this_table)
59
+ end
60
+ this_table = Array.new
61
+ duration = parts[0]
62
+ open = true
63
+
64
+ elsif parts[0]==('Hour')
65
+ this_table.push(Array.new)
66
+ this_cols = parts.length
67
+ this_table[-1].push(parts[0]) if not multi_duration
68
+ (1..this_cols-1).each {|i| this_table[-1].push(parts[i] + " (" + duration + ")") }
69
+
70
+ elsif parts[0].include?('Total Hours/Day')
71
+ this_table.push(Array.new)
72
+ this_table[-1].push(parts[0]) if not multi_duration
73
+ (1..this_cols-1).each {|i| this_table[-1].push(custom_print(parts[i].to_f, 4)) }
74
+
75
+ elsif parts[0].include?('Total Hours/Week')
76
+ this_table.push(Array.new)
77
+ this_table[-1].push(parts[0]) if not multi_duration
78
+ this_table[-1].push(custom_print(parts[1].to_f, 4))
79
+ (2..this_cols-1).each {|i| this_table[-1].push("") }
80
+
81
+ elsif parts[0].include?('Total Hours/Year')
82
+ @hours_per_year = parts[1].to_f
83
+
84
+ this_table.push(Array.new)
85
+ this_table[-1].push(parts[0]) if not multi_duration
86
+ this_table[-1].push(custom_print(parts[1].to_f, 4))
87
+ (2..this_cols-1).each {|i| this_table[-1].push("") }
88
+ else
89
+ parts.delete_at(0) if multi_duration
90
+ this_table.push(parts)
91
+ end
92
+ end
93
+ close_table(this_table)
94
+ #print_table if multi_duration
95
+ end
96
+
97
+ def close_table(this_table)
98
+ if @table.empty?
99
+ @table = this_table
100
+ else
101
+ @table.each_index do |idx|
102
+ @table[idx].concat(this_table[idx])
103
+ end
104
+ end
105
+ end
106
+
107
+ def print_table
108
+ puts @name
109
+ puts @type
110
+ @table.each_index do |idx|
111
+ puts @table[idx].join(', ')
112
+ end
113
+ puts
114
+ end
115
+
116
+ def to_s
117
+ @lines.join("\n")
118
+ end
119
+ def hash
120
+ to_s.hash
121
+ end
122
+ def ==(other)
123
+ eql?(other)
124
+ end
125
+ def eql?(other)
126
+ other.is_a?(Schedule) && to_s == other.to_s
127
+ end
128
+ end
129
+
130
+
131
+ class SchedulesCSV
132
+ attr_accessor :schedules
133
+
134
+ def initialize(path)
135
+ @schedules = Hash.new
136
+ if File.exists?(path)
137
+ @path = Pathname.new(path)
138
+ process_schedules
139
+ else
140
+ @path = nil
141
+ end
142
+ end
143
+
144
+ def process_schedules
145
+ File.open(@path) do |f|
146
+ name = ""
147
+ schedule_string = ""
148
+ while line = f.gets
149
+
150
+ if line.chomp.empty?
151
+ if not name.empty?
152
+ new_schedule = Schedule.new(schedule_string)
153
+ @schedules[new_schedule.name] = new_schedule
154
+ end
155
+ name = ""
156
+ schedule_string = ""
157
+ next
158
+ end
159
+
160
+ if name.empty?
161
+ name = line.chomp
162
+ schedule_string = line
163
+ else
164
+ schedule_string += line
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,100 @@
1
+ ######################################################################
2
+ # Copyright (c) 2008-2013, Alliance for Sustainable Energy.
3
+ # All rights reserved.
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2.1 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ ######################################################################
19
+
20
+ module EnergyPlus
21
+ require 'pathname'
22
+
23
+ class SlabGtpFile
24
+ attr_accessor :convergence
25
+ attr_accessor :months
26
+ attr_accessor :averageTemps
27
+
28
+ def initialize(path)
29
+ @path = Pathname.new(path)
30
+ @convergence = false
31
+ @months = []
32
+ @averageTemps = []
33
+ init
34
+ end
35
+
36
+ def getGroundTemps
37
+ result = "Site:GroundTemperature:BuildingSurface,\n"
38
+ result+= " #{@averageTemps[0]}, !- January Ground Temperature {C}\n"
39
+ result+= " #{@averageTemps[1]}, !- February Ground Temperature {C}\n"
40
+ result+= " #{@averageTemps[2]}, !- March Ground Temperature {C}\n"
41
+ result+= " #{@averageTemps[3]}, !- April Ground Temperature {C}\n"
42
+ result+= " #{@averageTemps[4]}, !- May Ground Temperature {C}\n"
43
+ result+= " #{@averageTemps[5]}, !- June Ground Temperature {C}\n"
44
+ result+= " #{@averageTemps[6]}, !- July Ground Temperature {C}\n"
45
+ result+= " #{@averageTemps[7]}, !- August Ground Temperature {C}\n"
46
+ result+= " #{@averageTemps[8]}, !- September Ground Temperature {C}\n"
47
+ result+= " #{@averageTemps[9]}, !- October Ground Temperature {C}\n"
48
+ result+= " #{@averageTemps[10]}, !- November Ground Temperature {C}\n"
49
+ result+= " #{@averageTemps[11]}; !- December Ground Temperature {C}\n"
50
+ return result
51
+ end
52
+
53
+ private
54
+
55
+ def init
56
+ if @path.exist?
57
+ File.open(@path) do |f|
58
+ text = f.read
59
+ parse(text)
60
+ end
61
+ end
62
+ end
63
+
64
+ def parse(text)
65
+ # check for convergence
66
+ regex = /(Convergence has been gained.).*\n/
67
+ if text.match(regex) then
68
+ @convergence = true
69
+ end
70
+
71
+ #parse out the monthly values
72
+ startRegex = /\s*Month\s*TAverage\s*TPerimeter\s*TCore\s*TInside\s*AverageFlux\s*PerimeterFlux\s*CoreFlux/
73
+ readingTable = false
74
+ numRowsRead = 0
75
+ text.each_line do |line|
76
+ if readingTable
77
+
78
+ # split each row and count as read
79
+ data = line.strip.split(/\s+/)
80
+ numRowsRead += 1
81
+
82
+ # insert into members
83
+ @months << data[2]
84
+ @averageTemps << data[1]
85
+
86
+ # only read 12 months
87
+ if numRowsRead == 12
88
+ break
89
+ end
90
+ end
91
+
92
+ # have we started reading the table yet
93
+ if line.match(startRegex)
94
+ readingTable = true
95
+ end
96
+ end
97
+ end
98
+
99
+ end
100
+ end
@@ -0,0 +1,78 @@
1
+ ######################################################################
2
+ # Copyright (c) 2008-2013, Alliance for Sustainable Energy.
3
+ # All rights reserved.
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2.1 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ ######################################################################
19
+
20
+ module EnergyPlus
21
+ require 'pathname'
22
+
23
+ class SlabIdfFile
24
+
25
+ def initialize(path)
26
+ @path = Pathname.new(path)
27
+ @initialized = false
28
+ @text = ""
29
+ init
30
+ end
31
+
32
+ def savefileas(path)
33
+ File.open(path, "w") do |f|
34
+ f << @text
35
+ end
36
+ end
37
+
38
+ # function to alter input based on options
39
+ def setSetpoints(cdd, hdd)
40
+ #options is an array of cdd and hdd... so have to wait the values
41
+ #create a new array with the weighted values
42
+ heatSP = 21 #in deg c
43
+ coolSP = 24 #in deg c
44
+
45
+ weight = []
46
+ for i in 1..12
47
+ num = cdd * coolSP + hdd * heatSP
48
+ den = cdd + hdd
49
+ weight[i] = (num) / (den)
50
+ end
51
+
52
+ @text.gsub!("%JAN%", sprintf("%.2f", weight[1].to_s))
53
+ @text.gsub!("%FEB%", sprintf("%.2f", weight[2].to_s))
54
+ @text.gsub!("%MAR%", sprintf("%.2f", weight[3].to_s))
55
+ @text.gsub!("%APR%", sprintf("%.2f", weight[4].to_s))
56
+ @text.gsub!("%MAY%", sprintf("%.2f", weight[5].to_s))
57
+ @text.gsub!("%JUN%", sprintf("%.2f", weight[6].to_s))
58
+ @text.gsub!("%JUL%", sprintf("%.2f", weight[7].to_s))
59
+ @text.gsub!("%AUG%", sprintf("%.2f", weight[8].to_s))
60
+ @text.gsub!("%SEP%", sprintf("%.2f", weight[9].to_s))
61
+ @text.gsub!("%OCT%", sprintf("%.2f", weight[10].to_s))
62
+ @text.gsub!("%NOV%", sprintf("%.2f", weight[11].to_s))
63
+ @text.gsub!("%DEC%", sprintf("%.2f", weight[12].to_s))
64
+ end
65
+
66
+ private
67
+
68
+ def init
69
+ @initialized = true
70
+
71
+ if @path.exist?
72
+ File.open(@path) do |f|
73
+ @text = f.read
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end #module
@@ -0,0 +1,192 @@
1
+ ######################################################################
2
+ # Copyright (c) 2008-2013, Alliance for Sustainable Energy.
3
+ # All rights reserved.
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2.1 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ ######################################################################
19
+
20
+ module EnergyPlus
21
+
22
+ require 'pathname'
23
+
24
+ class StatFile
25
+ attr_accessor :valid
26
+ attr_accessor :lat
27
+ attr_accessor :lon
28
+ attr_accessor :elevation
29
+ attr_accessor :gmt
30
+ attr_accessor :monthlyDB
31
+ attr_accessor :hdd18
32
+ attr_accessor :cdd18
33
+ attr_accessor :hdd10
34
+ attr_accessor :cdd10
35
+
36
+ def initialize(path)
37
+ @path = Pathname.new(path)
38
+ @valid = false
39
+ @lat = []
40
+ @lon = []
41
+ @gmt = []
42
+ @elevation = []
43
+ @hdd18 = []
44
+ @cdd18 = []
45
+ @hdd10 = []
46
+ @cdd10 = []
47
+ @monthlyDB = []
48
+ @deltaDB = []
49
+ init
50
+ end
51
+
52
+ def valid?
53
+ return @valid
54
+ end
55
+
56
+ # the mean of the mean monthly dry bulbs
57
+ def meanDB
58
+ if not @monthlyDB.empty? then
59
+ thisSum = 0
60
+ @monthlyDB.each { |db| thisSum += db }
61
+ thisMean = thisSum/@monthlyDB.size
62
+ else
63
+ thisMean = ""
64
+ end
65
+ return thisMean
66
+ end
67
+
68
+ # max - min of the mean monthly dry bulbs
69
+ def deltaDB
70
+ if not @monthlyDB.empty? then
71
+ deltaT = @monthlyDB.max-@monthlyDB.min
72
+ else
73
+ deltaT = ""
74
+ end
75
+
76
+ return deltaT
77
+ end
78
+
79
+ private
80
+
81
+ # initialize
82
+ def init
83
+ if @path.exist?
84
+ File.open(@path) do |f|
85
+ text = f.read
86
+ parse(text)
87
+ end
88
+ end
89
+ end
90
+
91
+ def parse(text)
92
+
93
+ # get lat, lon, gmt
94
+ regex = /\{(N|S)\s*([0-9]*).\s*([0-9]*)'\}\s*\{(E|W)\s*([0-9]*).\s*([0-9]*)'\}\s*\{GMT\s*(.*)\s*Hours\}/
95
+ matchData = text.match(regex)
96
+ if matchData.nil?
97
+ puts "Can't find lat/lon/gmt"
98
+ return
99
+ else
100
+
101
+ @lat = matchData[2].to_f + (matchData[3].to_f)/60.0
102
+ if matchData[1] == 'S'
103
+ @lat = -@lat
104
+ end
105
+
106
+ @lon = matchData[5].to_f + (matchData[6].to_f)/60.0
107
+ if matchData[4] == 'W'
108
+ @lon = -@lon
109
+ end
110
+
111
+ @gmt = matchData[7]
112
+
113
+ end
114
+
115
+ # get elevation
116
+ regex = /Elevation --\s*(.*)m (above|below) sea level/
117
+ matchData = text.match(regex)
118
+ if matchData.nil?
119
+ puts "Can't find elevation"
120
+ return
121
+ else
122
+ @elevation = matchData[1].to_f
123
+ if matchData[2] == 'below'
124
+ @elevation = -@elevation
125
+ end
126
+ end
127
+
128
+
129
+ # get heating and cooling degree days
130
+ cdd10Regex = /-\s*(.*) annual \(standard\) cooling degree-days \(10.C baseline\)/
131
+ matchData = text.match(cdd10Regex)
132
+ if matchData.nil?
133
+ puts "Can't find CDD 10"
134
+ return
135
+ else
136
+ @cdd10 = matchData[1].to_f
137
+ end
138
+
139
+ hdd10Regex = /-\s*(.*) annual \(standard\) heating degree-days \(10.C baseline\)/
140
+ matchData = text.match(hdd10Regex)
141
+ if matchData.nil?
142
+ puts "Can't find HDD 10"
143
+ return
144
+ else
145
+ @hdd10 = matchData[1].to_f
146
+ end
147
+
148
+ cdd18Regex = /-\s*(.*) annual \(standard\) cooling degree-days \(18.3.C baseline\)/
149
+ matchData = text.match(cdd18Regex)
150
+ if matchData.nil?
151
+ puts "Can't find CDD 18"
152
+ return
153
+ else
154
+ @cdd18 = matchData[1].to_f
155
+ end
156
+
157
+ hdd18Regex = /-\s*(.*) annual \(standard\) heating degree-days \(18.3.C baseline\)/
158
+ matchData = text.match(hdd18Regex)
159
+ if matchData.nil?
160
+ puts "Can't find HDD 18"
161
+ return
162
+ else
163
+ @hdd18 = matchData[1].to_f
164
+ end
165
+
166
+
167
+ #use regex to get the temperatures
168
+ regex = /Daily Avg(.*)\n/
169
+ matchData = text.match(regex)
170
+ if matchData.nil?
171
+ puts "Can't find outdoor air temps"
172
+ return
173
+ else
174
+ # first match is outdoor air temps
175
+ monthlyTemps = matchData[1].strip.split(/\s+/)
176
+
177
+ # have to be 12 months
178
+ if monthlyTemps.size != 12
179
+ puts "Can't find outdoor air temps"
180
+ return
181
+ end
182
+
183
+ # insert as numbers
184
+ monthlyTemps.each {|temp| @monthlyDB << temp.to_f}
185
+ end
186
+
187
+ # now we are valid
188
+ @valid = true
189
+ end
190
+
191
+ end
192
+ end