pulo 0.1.1 → 0.1.2

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.
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