pulo 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pulo.rb +28 -0
  3. data/lib/pulo/exceptions.rb +6 -0
  4. data/lib/pulo/figure/figure2d.rb +248 -0
  5. data/lib/pulo/figure/figure3d.rb +166 -0
  6. data/lib/pulo/formatting.rb +140 -0
  7. data/lib/pulo/frames/frame.rb +289 -0
  8. data/lib/pulo/frames/frame_cell.rb +83 -0
  9. data/lib/pulo/frames/frame_column.rb +149 -0
  10. data/lib/pulo/frames/frame_row.rb +87 -0
  11. data/lib/pulo/helpers.rb +1 -0
  12. data/lib/pulo/machine/hydraulics/pipe.rb +71 -0
  13. data/lib/pulo/machine/machines.rb +10 -0
  14. data/lib/pulo/machine/mechanics/moments_of_inertia.rb +64 -0
  15. data/lib/pulo/machine/steam/boiler.rb +61 -0
  16. data/lib/pulo/machine/steam/boiler_deaerator.rb +64 -0
  17. data/lib/pulo/machine/steam/deaerator.rb +37 -0
  18. data/lib/pulo/machine/steam/desuperheater.rb +29 -0
  19. data/lib/pulo/machine/steam/header.rb +20 -0
  20. data/lib/pulo/machine/steam/if97.rb +378 -0
  21. data/lib/pulo/machine/steam/steam_process.rb +27 -0
  22. data/lib/pulo/machine/steam/steam_turbine.rb +42 -0
  23. data/lib/pulo/machine/steam/water_steam.rb +229 -0
  24. data/lib/pulo/material/water.rb +34 -0
  25. data/lib/pulo/quantity/dimension.rb +63 -0
  26. data/lib/pulo/quantity/numeric_overloads.rb +217 -0
  27. data/lib/pulo/quantity/quantity.rb +285 -0
  28. data/lib/pulo/quantity/quantity_builder.rb +185 -0
  29. data/lib/pulo/quantity/quantity_definitions.rb +8 -0
  30. data/lib/pulo/quantity/quantity_definitions/area_volume.rb +73 -0
  31. data/lib/pulo/quantity/quantity_definitions/basic.rb +157 -0
  32. data/lib/pulo/quantity/quantity_definitions/electric.rb +22 -0
  33. data/lib/pulo/quantity/quantity_definitions/energy.rb +50 -0
  34. data/lib/pulo/quantity/quantity_definitions/fluids.rb +23 -0
  35. data/lib/pulo/quantity/quantity_definitions/force_power.rb +82 -0
  36. data/lib/pulo/quantity/quantity_definitions/rotation.rb +49 -0
  37. data/lib/pulo/quantity/quantity_definitions/value.rb +65 -0
  38. data/lib/pulo/quantity/quantity_definitions/velocity_acc_flow.rb +66 -0
  39. data/lib/pulo/quantity/quantity_groups/quantity_groups.rb +36 -0
  40. data/lib/pulo/quantity/unit.rb +45 -0
  41. data/lib/pulo/quantity_checker.rb +13 -0
  42. data/lib/pulo/tables/density.rb +10 -0
  43. data/lib/pulo/tables/melting_temperature.rb +9 -0
  44. data/lib/pulo/tables/specific_energy.rb +10 -0
  45. data/lib/pulo/tables/speed_of_sound.rb +9 -0
  46. data/lib/pulo/tables/tables.rb +104 -0
  47. data/lib/pulo/tables/tensile_strength.rb +10 -0
  48. data/lib/pulo/tables/yield_strength.rb +10 -0
  49. data/lib/pulo/version.rb +3 -0
  50. metadata +51 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c66281d85496053c2775de970706f5cdaae460d8
4
- data.tar.gz: 0d6b04db8547de1a3c72d6cac992a59b6d09a2f5
3
+ metadata.gz: c3cd821eca19f9a4d1a19906109e39c39077b3d3
4
+ data.tar.gz: 7287a0e64e3f40f0f90b074a20bb30a4730ec0a3
5
5
  SHA512:
6
- metadata.gz: c3ac909efb7efe59174d02a21e6a20944c6ce241f8f71627da31aca8eb3f68159c9eb5ad5fa4ae51bbdaafe1f1d49bd378b62a30a3d476b7f4587f9202dd2e28
7
- data.tar.gz: 13b06f8726a6e088abb87fc7ae37ca05d114f92becb880adf2bed40da9219214b056ee9da3cf562b5b8c9c7dc44ae1c90933c1d010702c2d00279f4060f2c34a
6
+ metadata.gz: 6e9bfeff6d877d31741b238b137a86830e2b29568d86db2fcf07532b0c73007edbbd0d4063fd8535de318f0cb34a7d93093102e8a3caf94fb5a170cc6df242f3
7
+ data.tar.gz: a01f39e0ebd30eb5e60f887338e4601818415cdb528ef5f3f4f7e90513de0aec06f4d59d76254c694b00267f0df31799adc555f3258e71c844f8846decc9876b
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+
3
+ require_relative 'pulo/version'
4
+
5
+ require 'bigdecimal'
6
+ require 'bigdecimal/util'
7
+ require 'yaml'
8
+
9
+ require_relative 'pulo/helpers'
10
+ require_relative 'pulo/formatting'
11
+ require_relative 'pulo/quantity_checker'
12
+ require_relative 'pulo/exceptions'
13
+
14
+ require_relative 'pulo/quantity/quantity'
15
+ require_relative 'pulo/quantity/quantity_builder'
16
+ require_relative 'pulo/quantity/unit'
17
+ require_relative 'pulo/quantity/dimension'
18
+
19
+ require_relative 'pulo/quantity/quantity_definitions'
20
+
21
+ require_relative 'pulo/quantity/quantity_groups/quantity_groups'
22
+
23
+ require_relative 'pulo/figure/figure2d'
24
+ require_relative 'pulo/figure/figure3d'
25
+ require_relative 'pulo/machine/machines'
26
+ require_relative 'pulo/quantity/numeric_overloads'
27
+ require_relative 'pulo/frames/frame'
28
+ require_relative 'pulo/tables/tables'
@@ -0,0 +1,6 @@
1
+ # encoding: utf-8
2
+ module Pulo
3
+ class QuantitiesException < StandardError
4
+
5
+ end
6
+ end
@@ -0,0 +1,248 @@
1
+
2
+ module Pulo
3
+
4
+ module Figure2D
5
+ include Quantity_Checker
6
+ attr_reader :area,:perimeter
7
+ def * (other)
8
+ if other.is_a?(Length)
9
+ raise "No extrusion figure known for #{self.class}" unless self.respond_to?(:extrusion_figure)
10
+ self.extrusion_figure.new(face: self, length: other)
11
+ else
12
+ raise "Dont know how to multiply a #{self.class} by a #{other.class}"
13
+ end
14
+ end
15
+ end
16
+
17
+ class Circle
18
+ include Figure2D
19
+ attr_reader :radius,:diameter
20
+ def extrusion_figure
21
+ Cylinder
22
+ end
23
+ def initialize(radius: nil, diameter: nil, area: nil)
24
+ raise 'Circle needs area or diameter or radius.' unless (area || diameter || radius)
25
+ quantity_check [radius,Length] ,[diameter,Length] , [area,Area]
26
+ if area
27
+ @area=area
28
+ @radius=(@area/Math::PI).rt(2)
29
+ @diameter=@radius*2
30
+ else
31
+ if diameter
32
+ @diameter=diameter
33
+ @radius=@diameter/2
34
+ else
35
+ @radius=radius
36
+ @diameter=@radius*2
37
+ end
38
+ @area=(@radius**2)*Math::PI
39
+ end
40
+ @perimeter=@radius*2*Math::PI
41
+ end
42
+ end
43
+
44
+ class Square
45
+ include Figure2D
46
+
47
+ attr_reader :width
48
+ def initialize(width: nil, area: nil)
49
+ raise "Square needs area or width." unless (area || width)
50
+
51
+ quantity_check [area,Area] ,[width,Length]
52
+ if area
53
+ @area=area; @width=@area.rt(2)
54
+ else
55
+ @width=width; @area=@width**2
56
+ end
57
+ @perimeter=@width*4
58
+ end
59
+ end
60
+
61
+ class Rectangle
62
+ include Figure2D
63
+
64
+ attr_reader :width, :height
65
+
66
+ def extrusion_figure
67
+ Cuboid
68
+ end
69
+ def initialize(area: nil, width: nil, height: nil)
70
+ quantity_check [area,Area] ,[width,Length] , [height,Length]
71
+ raise 'Rectangle needs width and height or area and width or height.' unless (width && height) || (area && (width || height))
72
+ if area
73
+ @area=area
74
+ if width
75
+ @width=width; @height=@area/@width
76
+ else
77
+ @height=height; @width=@area/@height
78
+ end
79
+ else
80
+ @width=width; @height=height
81
+ @area=@width*@height
82
+ end
83
+ @perimeter=@width*2+@height*2
84
+ end
85
+ end
86
+
87
+ class Triangle
88
+ include Figure2D
89
+ attr_reader :angles,:lengths
90
+
91
+ def extrusion_figure
92
+ Prism
93
+ end
94
+ def initialize(angles: [], lengths: [], area: nil)
95
+ quantity_check [area,Area] ,[angles,Array] , [lengths,Array]
96
+
97
+ raise 'Need more arguments for triangle' unless (
98
+ ((not area) && angles.count+lengths.count>=3 && lengths.count>0) ||
99
+ (area && (angles.count>=2 || lengths.count>=2 || (lengths.count==1 && angles.count>0)))
100
+ )
101
+ while lengths.count<3; lengths<<nil; end
102
+ while angles.count<3; angles<<nil; end
103
+
104
+ lengths_count=lengths.compact.count
105
+ angles_count=angles.compact.count
106
+ if area
107
+ #area=area.value if area.is_a?(Area)
108
+ if angles_count==2
109
+ while angles[0].nil?
110
+ angles=angles.unshift(angles.last).take(3)
111
+ lengths=lengths.unshift(lengths.last).take(3)
112
+ end
113
+ angles[2]=Angle.pi-angles[0]-angles[1]
114
+ k=((area*2)/(Math.sin(angles[0])*Math.sin(angles[1])*Math.sin(angles[2]))).rt(2)
115
+ lengths[0]=k*Math.sin(angles[0])
116
+ lengths[1]=k*Math.sin(angles[1])
117
+ lengths[2]=k*Math.sin(angles[2])
118
+ else
119
+ if lengths_count==2
120
+ while lengths[0].nil? or lengths[1].nil?
121
+ lengths=lengths.unshift(lengths.last).take(3)
122
+ angles=angles.unshift(angles.last).take(3)
123
+ end
124
+ angles[0]=angle_from_area(area,lengths[0],lengths[1])
125
+ lengths[2]=length_from_cosine(lengths[0],lengths[1],angles[0])
126
+ angles[1]=angle_from_sine(lengths[0],lengths[2],angles[0])
127
+ angles[2]=Angle.pi-angles[0]-angles[1]
128
+ else
129
+ while lengths[0].nil?
130
+ lengths=lengths.unshift(lengths.last).take(3)
131
+ angles=angles.unshift(angles.last).take(3)
132
+ end
133
+ if not angles[0].nil?
134
+ lengths[1]=length_from_area(area,lengths[0],angles[0])
135
+ lengths[2]=length_from_cosine(lengths[0],lengths[1],angles[0])
136
+ angles[1]=angle_from_sine(lengths[0],lengths[2],angles[0])
137
+ angles[2]=Angle.pi-angles[0]-angles[1]
138
+ elsif not angles[1].nil?
139
+ #assume isosceles
140
+ angles[0]=angles[2]=(Angle.pi-angles[1])/2
141
+ lengths[1]=length_from_area(area,lengths[0],angles[0])
142
+ lengths[2]=length_from_cosine(lengths[0],lengths[1],angles[0])
143
+ else
144
+ lengths[2]=length_from_area(area,lengths[0],angles[2])
145
+ lengths[1]=length_from_cosine(lengths[0],lengths[2],angles[2])
146
+ angles[0]=angle_from_sine(lengths[2],lengths[1],angles[2])
147
+ angles[1]=Angle.pi-angles[0]-angles[2]
148
+ end
149
+ end
150
+ end
151
+
152
+ @area=area
153
+ else
154
+ if lengths_count==3
155
+ angles[0]=angle_from_cosine(lengths[2],lengths[0],lengths[1])
156
+ angles[1]=angle_from_sine(lengths[0],lengths[2],angles[0])
157
+ angles[2]=Angle.pi-angles[0]-angles[1]
158
+ elsif lengths_count==2
159
+ while lengths[0].nil? or lengths[1].nil?
160
+ lengths=lengths.unshift(lengths.last).take(3)
161
+ angles=angles.unshift(angles.last).take(3)
162
+ end
163
+ if not angles[0].nil?
164
+ lengths[2]=length_from_cosine(lengths[0],lengths[1],angles[0])
165
+ angles[1]=angle_from_sine(lengths[0],lengths[2],angles[0])
166
+ angles[2]=Angle.pi-angles[0]-angles[1]
167
+ elsif not angles[1].nil?
168
+ angles[2]=angle_from_sine(lengths[1],lengths[0],angles[1])
169
+ angles[0]=Angle.pi-angles[1]-angles[2]
170
+ lengths[2]=length_from_sine(lengths[0],angles[0],angles[1])
171
+ else
172
+ angles[1]=angle_from_sine(lengths[0],lengths[1],angles[2])
173
+ angles[0]=Angle.pi-angles[1]-angles[2]
174
+ lengths[2]=length_from_sine(lengths[0],angles[0],angles[1])
175
+ end
176
+ else
177
+ while angles[0].nil? or angles[1].nil?
178
+ lengths=lengths.unshift(lengths.last).take(3)
179
+ angles=angles.unshift(angles.last).take(3)
180
+ end
181
+ angles[2]=Angle.pi-angles[0]-angles[1]
182
+ if not lengths[0].nil?
183
+ lengths[1]=length_from_sine(lengths[0],angles[2],angles[1])
184
+ lengths[2]=length_from_sine(lengths[0],angles[0],angles[1])
185
+ elsif not lengths[1].nil?
186
+ lengths[0]=length_from_sine(lengths[1],angles[1],angles[2])
187
+ lengths[2]=length_from_sine(lengths[0],angles[0],angles[1])
188
+ elsif not lengths[2].nil?
189
+ lengths[0]=length_from_sine(lengths[2],angles[1],angles[0])
190
+ lengths[1]=length_from_sine(lengths[0],angles[2],angles[1])
191
+ end
192
+ end
193
+ @area=0.5*lengths[2]*lengths[0]*Math.sin(angles[2])
194
+ end
195
+ @angles=angles
196
+ @lengths=lengths
197
+ @perimeter=@lengths[0]+@lengths[1]+@lengths[2]
198
+ end
199
+ def length_from_cosine(b,c,ang_a); Math.sqrt(b**2+c**2-(2*b*c*Math.cos(ang_a))); end
200
+ def angle_from_cosine(a,b,c); Math.acos((b**2+c**2-a**2)/(2*b*c)); end
201
+ def length_from_sine(b,ang_a,ang_b); b/Math.sin(ang_b)*Math.sin(ang_a); end
202
+ def angle_from_sine(a,b,ang_b); Math.asin(a*Math.sin(ang_b)/b); end
203
+ def length_from_area(area,b,ang_c); (2*area)/(b*Math.sin(ang_c)); end
204
+ def angle_from_area(area,a,b); Math.asin(2*area/(a*b)); end
205
+ end
206
+
207
+ class Trapezoid #isoscelese only
208
+ include Figure2D
209
+ attr_reader :base,:top,:height,:angle, :side_triangle, :side
210
+ def extrusion_figure
211
+ TrapezoidalPrism
212
+ end
213
+ def initialize(angle: nil,height: nil,base: nil, area: nil,top: nil)
214
+ quantity_check [angle,Angle] ,[height,Length] , [base,Length] , [top,Length], [area,Area]
215
+ raise 'Need more arguments for trapezoid' unless ((angle and height and (base or top) or (base and top and height) or (area and base and top)))
216
+ if angle and height and (base or top)
217
+ @angle=angle; @height=height
218
+ @side_triangle=Triangle.new(angles: [@angle,nil,Angle.pi/2], lengths: [@height,nil,nil])
219
+ @side=@side_triangle.lengths[2]
220
+ if base
221
+ @base=base; @top=@base-@side_triangle.lengths[0]*2
222
+ else #top
223
+ @top=top; @base=@top+@side_triangle.lengths[0]*2
224
+ end
225
+ @area=(@base+@top)/2*@height
226
+ elsif base and top and height
227
+ @height=height;@base=base;@top=top
228
+ @side_triangle=Triangle.new(lengths: [@height,(@base-@top)/2,nil],angles: [Angle.pi/2])
229
+ @side=@side_triangle.lengths[2]
230
+ @area=(@base+@top)/2*@height
231
+ elsif area and base and top
232
+ @area=area; @base=base; @top=top
233
+ @height=(@area*2)/(@base+@top)
234
+ @side_triangle=Triangle.new(angles: [Angle.pi/2], lengths: [@height,(@base-@top)/2])
235
+ @side=@side_triangle.lengths[2]
236
+ elsif area and angle and base
237
+ #TODO: area and angle and base
238
+
239
+ #@angle=angle; @area=area; @base=base
240
+ #@height=(Math.sqrt((@base**2)+(4*Math.tan(@angle)*@area))-@base)/(2*Math.tan(@angle))
241
+ #@side_triangle=Triangle.new(angles: [@angle,nil,Angle.pi/2], lengths: [@height,nil,nil])
242
+ #@side=@side_triangle.lengths[2]
243
+ #@top=@base+@side_triangle.lengths[0]*2
244
+ end
245
+ @perimeter=@base+@top+(@side*2)
246
+ end
247
+ end
248
+ end
@@ -0,0 +1,166 @@
1
+
2
+ module Pulo
3
+
4
+ module Figure3D
5
+ include Quantity_Checker
6
+ attr_reader :volume, :surfacearea
7
+ end
8
+
9
+ class Sphere
10
+ include Figure3D
11
+ attr_reader :radius,:diameter
12
+ def initialize(radius: nil, diameter: nil, volume: nil)
13
+ quantity_check [radius,Length] ,[diameter,Length], [volume, Volume]
14
+ raise "Need more arguments for Sphere" unless volume || diameter || radius
15
+ if volume
16
+ @volume=volume
17
+ @radius=(@volume*3/(Angle.pi*4)).rt(3)
18
+ @diameter=@radius*2
19
+ else
20
+ if diameter
21
+ @diameter=diameter
22
+ @radius=@diameter/2
23
+ else
24
+ @radius=radius
25
+ @diameter=@radius*2
26
+ end
27
+ @volume=(@radius**3)*(4.0/3.0)*Angle.pi
28
+ end
29
+ @surfacearea=@radius**2*(4*Angle.pi)
30
+ end
31
+ end
32
+
33
+ class Cube
34
+ include Figure3D
35
+ attr_reader :length, :face
36
+
37
+ def initialize(length: nil, face: nil, volume: nil)
38
+ quantity_check [length,Length] ,[face,Square], [volume, Volume]
39
+ raise 'Cube needs volume or face or length.' unless (length || volume || face)
40
+
41
+ if volume
42
+ @volume=volume
43
+ @length=volume.rt(3)
44
+ @face=Square.new(width: @length)
45
+ elsif face
46
+ @face=face
47
+ @length=@face.width
48
+ @volume=@face.area*@length
49
+ elsif length
50
+ @length=length
51
+ @face=Square.new(width: @length)
52
+ @volume=@face.area*@length
53
+ end
54
+ @surfacearea=@face.area*6
55
+ end
56
+ end
57
+
58
+ class Cuboid
59
+ include Figure3D
60
+ attr_reader :width, :length, :height, :faces
61
+ def initialize(width: nil, height: nil, length: nil, volume: nil, face: nil)
62
+ raise 'Cuboid needs width, length and height or volume and face or length and face.' unless ((width && length && height) || (volume && face) || (length && face))
63
+
64
+ @faces=[]
65
+ if width and length and height
66
+ @width=width; @length=length; @height=height
67
+ @faces[0]=Rectangle.new(width: width, height: height)
68
+ @faces[1]=Rectangle.new(width: width, height: length)
69
+ @faces[2]=Rectangle.new(width: length, height: height)
70
+ @volume=@faces[0].area*@length
71
+ end
72
+ if volume and face
73
+ @volume=volume
74
+ @faces[0]=face
75
+ @width=@faces[0].width
76
+ @height=@faces[0].height
77
+ @length=@volume/@faces[0].area
78
+ @faces[1]=Rectangle.new(width: @width, height: @length)
79
+ @faces[2]=Rectangle.new(width: @length, height: @height)
80
+ end
81
+ if face and length
82
+ @faces[0]=face
83
+ @length=length
84
+ @volume=face.area * length
85
+ @width=@faces[0].width
86
+ @height=@faces[0].height
87
+ @faces[1]=Rectangle.new(width: @width, height: @length)
88
+ @faces[2]=Rectangle.new(width: @length, height: @height)
89
+ end
90
+ @surfacearea=(@faces[0].area+@faces[1].area+@faces[2].area)*2
91
+ end
92
+ end
93
+
94
+ class Cylinder
95
+ include Figure3D
96
+
97
+ attr_reader :face, :length
98
+ def initialize (face: nil, length: nil, volume: nil, radius: nil, diameter: nil)
99
+ quantity_check [face,Circle] ,[length,Length] , [volume,Volume], [radius, Length], [diameter, Length]
100
+ raise 'Cylinder needs length and face or volume and length or volume and radius or diameter.' unless
101
+ (face && length) || (volume && length) || (volume && (radius || diameter)) || (length && (radius || diameter))
102
+
103
+ if face and length
104
+ @face=face
105
+ @length=length
106
+ @volume=@face.area*@length
107
+ else
108
+ if volume and length
109
+ @length=length
110
+ @volume=volume
111
+ @face=Circle.new(area: @volume/@length)
112
+ else
113
+ if (radius or diameter) and volume
114
+ @face=Circle.new(radius: radius, diameter: diameter)
115
+ @volume=volume
116
+ @length=volume/@face.area
117
+ else
118
+ @face=Circle.new(radius: radius, diameter: diameter)
119
+ @length=length
120
+ @volume=@face.area*@length
121
+ end
122
+ end
123
+ end
124
+
125
+ @surfacearea=@face.area*2+@face.perimeter*@length
126
+ @area=@face.area
127
+ @radius=@face.radius
128
+ end
129
+ end
130
+
131
+ class Prism
132
+ include Figure3D
133
+ attr_reader :face, :length
134
+ attr_reader :side_areas
135
+ def initialize(face: nil, length: nil)
136
+ quantity_check [face,Triangle] ,[length,Length]
137
+ raise 'Prism needs a face and length.' unless face && length
138
+ @face=face
139
+ @length=length
140
+ @volume=@face.area*@length
141
+ @side_areas=[]
142
+ @side_areas[0]=@face.lengths[0]*@length
143
+ @side_areas[1]=@face.lengths[1]*@length
144
+ @side_areas[2]=@face.lengths[2]*@length
145
+ @surfacearea=@face.area*2+@side_areas[0]+@side_areas[1]+@side_areas[2]
146
+ end
147
+ end
148
+
149
+ class TrapezoidalPrism
150
+ include Figure3D
151
+ attr_reader :face, :length
152
+ attr_reader :base_area,:side_area,:top_area
153
+ def initialize(face: nil, length: nil)
154
+ quantity_check [face,Trapezoid] ,[length,Length]
155
+ raise 'TrapezoidalPrism needs a face and length.' unless face && length
156
+ @face=face
157
+ @length=length
158
+ @volume=@face.area*@length
159
+ @base_area=@face.base*@length
160
+ @side_area=@face.side*@length
161
+ @top_area=@face.top*@length
162
+ @surfacearea=@face.area*2+@base_area+@top_area+@side_area*2
163
+ end
164
+ end
165
+
166
+ end