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,13 @@
1
+ require 'energyplus/DDYFile'
2
+ require 'energyplus/EpErrFile'
3
+ require 'energyplus/EpImfFile'
4
+ require 'energyplus/EpwFile'
5
+ require 'energyplus/EsoFile'
6
+ require 'energyplus/IdfObject'
7
+ require 'energyplus/KmlFile'
8
+ require 'energyplus/ResultsLog'
9
+ #require 'energyplus/SchedulesCSV'
10
+ require 'energyplus/SlabGtpFile'
11
+ require 'energyplus/SlabIdfFile'
12
+ require 'energyplus/StatFile'
13
+ require 'energyplus/version'
@@ -0,0 +1,176 @@
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
+ class DDYFile
23
+ def initialize(path)
24
+ @path = path
25
+ @lines = []
26
+ if File.exists?(@path)
27
+ File.open(@path) do |f|
28
+ while line = f.gets
29
+ @lines << line.chomp
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ def objects
36
+ objects = []
37
+ object_fields = []
38
+ object_type = ''
39
+ inobject = false
40
+ object_comment = nil
41
+ @lines.each_index do |i|
42
+ if not inobject and @lines[i] =~ /^\s*\w/
43
+ object_fields = []
44
+ inobject = true
45
+ object_type = @lines[i]
46
+ if @lines[i-1] =~ /^\s*!/
47
+ object_comment = @lines[i-1]
48
+ end
49
+ elsif inobject and @lines[i] =~ /^[^!]*;/
50
+ object_fields << @lines[i]
51
+ inobject = false
52
+ objects << IdfObject.new(object_type,object_fields,object_comment)
53
+ elsif inobject
54
+ object_fields << @lines[i]
55
+ else
56
+ end
57
+ end
58
+ return objects
59
+ end
60
+
61
+ def findObjectByComment(comment)
62
+ comment = Regexp.new(comment)
63
+ objects().each do |object|
64
+ if object.comment =~ comment
65
+ return object
66
+ end
67
+ end
68
+
69
+ return nil
70
+ end
71
+
72
+ #returns an array of "data source, year, and type
73
+ def get_data_source
74
+ #! Using Design Conditions from "Climate Design Data 2005 ASHRAE Handbook"
75
+ #! Using Design Conditions from "Climate Design Data 2009 ASHRAE Handbook"
76
+ src_s = ""
77
+ @lines.each_index do |i|
78
+ if @lines[i] =~ /Climate Design Data [0-9]{4} ASHRAE Handbook/
79
+ src_s = @lines[i]
80
+ break
81
+ end
82
+ end
83
+
84
+ src = []
85
+ src << src_s.match("Climate Design Data [0-9]{4} ASHRAE Handbook")[0]
86
+ src << src_s.match("[0-9]{4}")[0]
87
+ src << "ASHRAE Handbook"
88
+
89
+ return src
90
+
91
+ end
92
+
93
+ def write_idf_snippet(filename, ddyobj)
94
+ if not ddyobj.nil?
95
+ File.delete(filename) if File.exists?(filename)
96
+ File.open(filename, 'w') do |fl|
97
+ #add version identifier to file
98
+ fl << "\nVersion,\n 7.1; ! Version Identifier \n\n"
99
+ fl << ddyobj
100
+ end
101
+ end
102
+ end
103
+
104
+ #updated for ddy for EP 7.1 2012
105
+ def get_indicating_type(ddyobj)
106
+ val = ddyobj.fieldString(8).downcase
107
+ if val == "dewpoint"
108
+ res = []
109
+ res << val
110
+ res << ddyobj.fieldValue(9)
111
+ res << "C"
112
+ elsif val == "wetbulb"
113
+ res = []
114
+ res << val
115
+ res << ddyobj.fieldValue(9)
116
+ res << "C"
117
+ elsif val == "enthalpy"
118
+ res = []
119
+ res << val
120
+ res << ddyobj.fieldValue(12)
121
+ res << "kJ/kg"
122
+ end
123
+ return res
124
+ end
125
+
126
+ #untyped enumerations for heating, cooling, and humidification
127
+ #make this an array, the first column of the array is the ep object,
128
+ #the remaining items are the "attributes and tags"
129
+ def heating(typestr)
130
+ search = "Annual Heating " + typestr
131
+
132
+ obj = findObjectByComment(search)
133
+
134
+ puts "[DDYFile] #{File.basename(@path.to_s)} missing heating #{typestr}" if obj.nil?
135
+
136
+ ddyinfo = []
137
+ ddyinfo << search.gsub("\\","")
138
+ ddyinfo << search.gsub("\\","").gsub(" ","_").gsub(".","_").gsub("%","").gsub("=>","_").gsub("__","_")
139
+ ddyinfo << obj
140
+
141
+ return ddyinfo
142
+ end
143
+
144
+ def humidification(typestr)
145
+ search = "Annual Humidification " + typestr
146
+
147
+ obj = findObjectByComment(search)
148
+
149
+ puts "[DDYFile] #{File.basename(@path.to_s)} missing humidification #{typestr}" if obj.nil?
150
+
151
+ ddyinfo = []
152
+ ddyinfo << search.gsub("\\","")
153
+ ddyinfo << search.gsub("\\","").gsub(" ","_").gsub(".","_").gsub("%","").gsub("=>","_").gsub("__","_")
154
+ ddyinfo << obj
155
+
156
+ return ddyinfo
157
+ end
158
+
159
+ def cooling(typestr)
160
+ search = "Annual Cooling " + typestr
161
+
162
+ obj = findObjectByComment(search)
163
+
164
+ puts "[DDYFile] #{File.basename(@path.to_s)} missing cooling #{typestr}" if obj.nil?
165
+
166
+ ddyinfo = []
167
+ ddyinfo << search.gsub("\\","")
168
+ ddyinfo << search.gsub("\\","").gsub(" ","_").gsub(".","_").gsub("%","").gsub("=>","_").gsub("__","_")
169
+ ddyinfo << obj
170
+
171
+ return ddyinfo
172
+
173
+ end
174
+ end
175
+
176
+ end #moduel
@@ -0,0 +1,123 @@
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
+ class EpErrFile
23
+
24
+ def initialize(path)
25
+ @path = path.expand_path
26
+ @warnings = []
27
+ @severe_errors = []
28
+ @fatal_errors = []
29
+ @initialized = false
30
+ @successful = false
31
+ end
32
+
33
+ def init
34
+ @initialized = true
35
+
36
+ if @path.exist?
37
+ File.open(@path) do |f|
38
+ text = ''
39
+ text << f.read
40
+ @valid = true
41
+ @warnings = parse("Warning", text)
42
+ @severe_errors = parse("Severe", text)
43
+ @fatal_errors = parse("Fatal", text)
44
+ if text =~ /\s\*{13} EnergyPlus Completed Successfully/
45
+ @successful = true
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ def valid?
52
+ init if not initialized?
53
+ @valid
54
+ end
55
+
56
+ def initialized?
57
+ @initialized
58
+ end
59
+
60
+ def path
61
+ @path
62
+ end
63
+
64
+ def dirname
65
+ @path.dirname
66
+ end
67
+
68
+ def warnings
69
+ init if not initialized?
70
+ @warnings
71
+ end
72
+
73
+ def severe_errors
74
+ init if not initialized?
75
+ @severe_errors
76
+ end
77
+
78
+ def fatal_errors
79
+ init if not initialized?
80
+ @fatal_errors
81
+ end
82
+
83
+ # just a warning
84
+ def warning_count
85
+ init if not initialized?
86
+ warnings.size
87
+ end
88
+
89
+ # severe errors are not as bad as fatal
90
+ def severe_error_count
91
+ init if not initialized?
92
+ @severe_errors.size
93
+ end
94
+
95
+ # the worst error
96
+ def fatal_error_count
97
+ init if not initialized?
98
+ @fatal_errors.size
99
+ end
100
+
101
+ # work horse
102
+ def parse(id, text)
103
+ storage = []
104
+ this_text = text
105
+ # match first id label and continue matching across lines while seeing the continue label "** ~~~ **"
106
+ regex = /\*\*\s*#{id}\s*\*\*.*?\n(\s+\*\*\s\s\s~~~\s\s\s\*\*.*?\n)*/m
107
+ while match_data = this_text.match(regex)
108
+ this_string = match_data.to_s.gsub(/.*\*\*\s*#{id}\s*\*\*/, '').gsub(/.*\*\*\s\s\s~~~\s\s\s\*\*/, '').gsub(/\s*\n/, "\n")
109
+ storage.push(this_string)
110
+ this_text = match_data.post_match
111
+ end
112
+ return storage.uniq
113
+ end
114
+
115
+ def successful?
116
+ init if not initialized?
117
+ @successful
118
+ end
119
+
120
+
121
+ end
122
+
123
+ end #module
@@ -0,0 +1,93 @@
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
+ class EpImfFile
23
+ attr_accessor :locations
24
+
25
+ def initialize(path)
26
+ puts 'parsing ' + path
27
+ @path = path.expand_path
28
+ @text = ''
29
+ @locations = []
30
+
31
+ if @path.exist?
32
+ File.open(@path) do |f|
33
+ @text << f.read
34
+ parse
35
+ end
36
+ end
37
+ end
38
+
39
+ def savefileas(path)
40
+ File.open(path, "w") do |f|
41
+ @locations.each do |loc|
42
+ f << "##def " + loc[0] + "[]\n"
43
+ f << loc[1]
44
+ f << "##enddef\n\n"
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ def parse
51
+ this_text = @text
52
+
53
+ locations = Hash.new
54
+
55
+ regex = /##def.*?##enddef/im
56
+ while match_data = this_text.match(regex)
57
+ #Grab the name of the location
58
+ regex2 = /##def (.*?)\[\]$/im
59
+
60
+ location_name = match_data.to_s.match(regex2)[1].lstrip.rstrip
61
+
62
+ #remove the header/footer from imf snippet
63
+ regex3 = /##def (.*?)\[\]\n*/im
64
+ regex4 = /##enddef(.*)\n*/im
65
+ imf_data = match_data.to_s.gsub(regex3, "").gsub(regex4, "")
66
+
67
+ #clean up the IMF (which is really idf data at this point)
68
+ imf_data.gsub!(/^( )/,"")
69
+
70
+ location = [location_name, imf_data]
71
+ @locations.push(location)
72
+
73
+ this_text = match_data.post_match
74
+ end
75
+ end
76
+
77
+ def location_sort(x,y)
78
+ if x[0].include?('ShowHeader')
79
+ return -1
80
+ elsif y[0].include?('ShowHeader')
81
+ return 1
82
+ else
83
+ return x[0] <=> y[0]
84
+ end
85
+ end
86
+
87
+ def sort
88
+ @locations.sort! {|x,y| location_sort(x,y)}
89
+ end
90
+
91
+ end
92
+
93
+ end #module
@@ -0,0 +1,120 @@
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
+
23
+ module EnergyPlus
24
+
25
+ class EpwFile
26
+ attr_accessor :path
27
+ attr_accessor :city
28
+ attr_accessor :state
29
+ attr_accessor :country
30
+ attr_accessor :typ
31
+ attr_accessor :wmo
32
+ attr_accessor :lat
33
+ attr_accessor :lon
34
+ attr_accessor :gmt
35
+ attr_accessor :elevation
36
+ attr_accessor :url
37
+
38
+ def initialize(path)
39
+ @path = Pathname.new(path)
40
+ @city = ""
41
+ @state = ""
42
+ @country = ""
43
+ @typ = ""
44
+ @wmo = ""
45
+ @lat = ""
46
+ @lon = ""
47
+ @gmt = ""
48
+ @elevation = ""
49
+ @url = ""
50
+ init
51
+ end
52
+
53
+ def toKml(xml)
54
+ xml.Placemark {
55
+ xml.name @city
56
+ xml.visibility "0"
57
+ xml.description {
58
+ xml.cdata!("<img src=\"kml/ep_header8.png\" width=180 align=right><br><table><tr><td colspan=\"2\">"+
59
+ "<b>#{@city}</b></href></td></tr>\n"+
60
+ #"<tr><td></td><td><b>Data Type</td></tr>\n"+
61
+ "<tr><td></td><td>WMO <b>#{@wmo}</b></td></tr>\n"+
62
+ #"<tr><td></td><td>E 3� 15' N 36� 43'</td></tr>\n"+
63
+ #"<tr><td></td><td><b>25</b> m</td></tr>\n"+
64
+ "<tr><td></td><td>Time Zone GMT <b>#{@gmt}</b> hours</td></tr>\n"+
65
+ #"<tr><td></td><td>ASHRAE Std 169 Climate Zone <b>4A - Mixed - Humid</b></td></tr>\n"+
66
+ #"<tr><td></td><td>99% Heating DB=<b>3.1</b>, 1% Cooling DB=<b>33.2</b></td></tr>\n"+
67
+ #"<tr><td></td><td>HDD18 <b>1019</b>, CDD10 <b>2849</b></td></tr>\n"+
68
+ "<tr><td></td><td>URL #{@url}</td></tr></table>")
69
+ }
70
+ xml.styleUrl "#weatherlocation"
71
+ xml.Point {
72
+ xml.altitudeMode "absolute"
73
+ xml.coordinates "#{@lon},#{@lat},#{elevation}"
74
+ }
75
+ }
76
+ end
77
+
78
+ def valid?
79
+ return @valid
80
+ end
81
+
82
+
83
+
84
+ # the mean of the mean monthly dry bulbs
85
+ private
86
+
87
+ # initialize
88
+ def init
89
+ if @path.exist?
90
+ rowCount = 0
91
+ CSV.open(@path, 'r') do |row|
92
+ rowCount += 1
93
+
94
+ # LOCATION,Adak Nas,AK,USA,TMY3,704540,51.88,-176.65,-10.0,5.0
95
+ @valid = true
96
+
97
+ # process only header row
98
+ if rowCount == 1
99
+ @city = row[1].gsub("/","-")
100
+ @state = row[2]
101
+ @country = row[3]
102
+ @typ = row[4]
103
+ @wmo = row[5]
104
+ @wmo = "wmoundefined" if @wmo.nil?
105
+ @lat = row[6]
106
+ @lon = row[7]
107
+ @gmt = row[8]
108
+ @elevation = row[9]
109
+ break
110
+ end
111
+
112
+
113
+ end
114
+ end
115
+ end
116
+
117
+
118
+ end
119
+
120
+ end #module