atmospheric 0.4.1 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ff04fca9f0e2b8073be7d74f58132e49097b004da8a467f4edc4ce67c7010175
4
- data.tar.gz: a9693609f11f56541e6c3e69de7f3a5e89ece4b1b2278b87323c595566a82b7c
3
+ metadata.gz: 1e29f2a7a1728dcceb1b2771ddc124879daa5359658b6c3e3968ed1c18661f11
4
+ data.tar.gz: b8a4a413763693b0f659e886009c084460766354a42c1ee198540b653d96301c
5
5
  SHA512:
6
- metadata.gz: bab58f7b049a27c5f8c114f0dcdf99d661e2b9be95ea8c05ff270a156272350591912080ec0b16589f881cea3185376fc05acef5c81bd5247e976c6238425b67
7
- data.tar.gz: 73de8de20ab781b18cd5460ce77eabcfff37eefad83aca2736bc2389cdf25e0ba61a3dab09ab3665d7c34adc7c149714ec16b4386a345736b5d2a54a553eca6d
6
+ metadata.gz: e2dad3faa88a2241f6bcb4817e4f7ecb1b886a16650cb25ed4621f5dc4e76b286341f05a5ac0c46607dcb5d9ad3fecaf24babcb8c73175b46cd148ff11595739
7
+ data.tar.gz: 50440fcd7c21bbce1677c24290136e72698e73363ac137cb45fa2afdd32b52adefa2644c1aef665a16d387348536519667a9a442667439797392787d5417bc5f
data/README.adoc CHANGED
@@ -14,13 +14,44 @@ units (the ICAO document includes `ft` in addition to `m`).
14
14
 
15
15
  == Usage
16
16
 
17
+ === Precision modes
18
+
19
+ There are two precision modes available for calculations: high precision and normal precision (default).
20
+
21
+ High Precision Mode::
22
+ Uses more accurate constants and number calculations through Ruby's BigDecimal
23
+ to provide results with higher precision. Suitable for applications where the
24
+ utmost accuracy is required.
25
+
26
+ Normal Precision Mode (default)::
27
+ Uses standard constants and number calculations to provide results with
28
+ sufficient accuracy for most applications.
29
+
30
+ To specify the precision mode, set the `precision` attribute when creating an instance of `Atmospheric::Isa`:
31
+
32
+ `:high`:: High precision mode
33
+ `:normal` or not specified:: Normal precision mode
34
+
35
+ Example usage:
36
+
37
+ [source,ruby]
38
+ ----
39
+ require 'atmospheric'
40
+
41
+ # Normal precision mode (default)
42
+ normal_precision_instance = Atmospheric::Isa.new
43
+
44
+ # High precision mode
45
+ high_precision_instance = Atmospheric::Isa.new(precision: :high)
46
+ ----
47
+
17
48
  === Formulas and calculations
18
49
 
19
50
  [source,ruby]
20
51
  ----
21
- > require 'atmospheric'
22
- > instance = Atmospheric::Isa.method_name
23
- > # method_name is one of the following
52
+ require 'atmospheric'
53
+ instance = Atmospheric::Isa.{method_name}
54
+ # {method_name} is one of the following
24
55
  ----
25
56
 
26
57
  The available methods are:
@@ -1,4 +1,3 @@
1
- require "measured"
2
1
  require "yaml"
3
2
 
4
3
  module Atmospheric
@@ -10,11 +9,11 @@ module Atmospheric
10
9
  end
11
10
 
12
11
  def m_to_ft(meters)
13
- Measured::Length.new(meters, "m").convert_to("ft").value.to_f
12
+ meters / 0.3048
14
13
  end
15
14
 
16
15
  def ft_to_m(feet)
17
- Measured::Length.new(feet, "ft").convert_to("m").value.to_f
16
+ feet * 0.3048
18
17
  end
19
18
 
20
19
  def to_yaml
@@ -1,51 +1,102 @@
1
+ require "bigdecimal"
2
+ require "bigdecimal/math"
3
+
1
4
  module Atmospheric
2
5
  module Isa
3
6
  # International Standard Atmosphere (ISA) (ISO 2533:1975)
4
7
  # ICAO Standard Atmosphere (ICAO Doc 7488/3, 1994)
5
8
 
6
- # 2.1 Primary constants and characteristics
7
- # Table 1 - Main constants and characteristics adopted for
8
- # the calculation of the ISO Standard Atmosphere
9
- constants = {
10
- # g_n gravitation at mean sea level (m.s-2)
11
- g_n: 9.80665,
9
+ class << self
10
+ private
11
+
12
+ @precision = :normal # Note the initial make_constants run won't see this
13
+
14
+ def num(str)
15
+ if @precision == :high
16
+ BigDecimal(str)
17
+ else
18
+ str.to_f
19
+ end
20
+ end
21
+
22
+ def sqrt(num)
23
+ if @precision == :high
24
+ BigMath.sqrt(num, 100)
25
+ else
26
+ Math.sqrt(num)
27
+ end
28
+ end
29
+
30
+ def log10(num)
31
+ if @precision == :high
32
+ BigMath.log(num, 100) / BigMath.log(10, 100)
33
+ else
34
+ Math.log10(num)
35
+ end
36
+ end
37
+
38
+ # rubocop:disable Metrics/AbcSize
39
+ # rubocop:disable Metrics/MethodLength
40
+ def make_constants
41
+ # 2.1 Primary constants and characteristics
42
+ # Table 1 - Main constants and characteristics adopted for
43
+ # the calculation of the ISO Standard Atmosphere
44
+ @constants = {
45
+ # g_n gravitation at mean sea level (m.s-2)
46
+ g_n: num("9.80665"),
47
+
48
+ # Avogadro constant (mol-1)
49
+ N_A: num("6.02257e+23"),
12
50
 
13
- # Avogadro constant (mol-1)
14
- N_A: 6.02257e+23,
51
+ # p_n pressure at mean sea level (Pa)
52
+ p_n: num("101325"),
15
53
 
16
- # p_n pressure at mean sea level (Pa)
17
- p_n: 101325,
54
+ # rho_n standard air density
55
+ rho_n: num("1.225"),
18
56
 
19
- # rho_n standard air density
20
- rho_n: 1.225,
57
+ # T_n standard thermodynamic air temperature at mean sea level
58
+ T_n: num("288.15"),
21
59
 
22
- # T_n standard thermodynamic air temperature at mean sea level
23
- T_n: 288.15,
60
+ # universal gas constant
61
+ R_star: num("8.31432"),
24
62
 
25
- # universal gas constant
26
- R_star: 8.31432,
63
+ # radius of the Earth (m)
64
+ radius: num("6356766"),
27
65
 
28
- # radius of the Earth (m)
29
- radius: 6356766,
66
+ # adiabatic index (dimensionless)
67
+ k: num("1.4"),
68
+ }
30
69
 
31
- # adiabatic index (dimensionless)
32
- k: 1.4,
33
- }
70
+ # 2.2 The equation of the static atmosphere and the perfect gas law
71
+ # Formula (2)
72
+ # M: air molar mass at sea level, kg.kmol-1
73
+ # Value given in 2.1 as M: 28.964720
74
+ @constants[:M] =
75
+ (@constants[:rho_n] * @constants[:R_star] * @constants[:T_n]) \
76
+ / @constants[:p_n]
34
77
 
35
- # 2.2 The equation of the static atmosphere and the perfect gas law
36
- # Formula (2)
37
- # M: air molar mass at sea level, kg.kmol-1
38
- # Value given in 2.1 as M: 28.964720
39
- constants[:M] =
40
- (constants[:rho_n] * constants[:R_star] * constants[:T_n]) \
41
- / constants[:p_n]
78
+ # Formula (3)
79
+ # R: specific gas constant, J.K-1.kg-1.
80
+ # Value given in 2.1 as R: 287.05287
81
+ @constants[:R] = @constants[:R_star] / @constants[:M]
42
82
 
43
- # Formula (3)
44
- # R: specific gas constant, J.K-1.kg-1.
45
- # Value given in 2.1 as R: 287.05287
46
- constants[:R] = constants[:R_star] / constants[:M]
83
+ @sqrt2 = sqrt(num("2"))
84
+ @pi = if @precision == :high then BigMath.PI(100) else Math::PI end
85
+ end
86
+ # rubocop:enable Metrics/AbcSize
87
+ # rubocop:enable Metrics/MethodLength
47
88
 
48
- CONST = constants.freeze
89
+ public
90
+
91
+ def set_precision(precision)
92
+ @precision = if precision == :high then :high else :normal end
93
+ remove_instance_variable(:@pressure_layers) \
94
+ if defined?(@pressure_layers)
95
+ make_constants
96
+ end
97
+ end
98
+
99
+ make_constants
49
100
 
50
101
  class << self
51
102
  # 2.3 Geopotential and geometric altitides; acceleration of free fall
@@ -54,21 +105,23 @@ module Atmospheric
54
105
  # H to h
55
106
  # h(m)
56
107
  def geometric_altitude_from_geopotential(geopotential_alt)
57
- CONST[:radius] * geopotential_alt / (CONST[:radius] - geopotential_alt)
108
+ @constants[:radius] * geopotential_alt \
109
+ / (@constants[:radius] - geopotential_alt)
58
110
  end
59
111
 
60
112
  # 2.3 Formula (9)
61
113
  # h to H
62
114
  # H(m)
63
115
  def geopotential_altitude_from_geometric(geometric_alt)
64
- CONST[:radius] * geometric_alt / (CONST[:radius] + geometric_alt)
116
+ @constants[:radius] * geometric_alt \
117
+ / (@constants[:radius] + geometric_alt)
65
118
  end
66
119
 
67
120
  # 2.3 Formula (7)
68
121
  # g(h)
69
122
  def gravity_at_geometric(geometric_alt)
70
- temp = CONST[:radius] / (CONST[:radius] + geometric_alt)
71
- CONST[:g_n] * temp * temp
123
+ temp = @constants[:radius] / (@constants[:radius] + geometric_alt)
124
+ @constants[:g_n] * temp * temp
72
125
  end
73
126
 
74
127
  def gravity_at_geopotential(geopotential_alt)
@@ -87,9 +140,9 @@ module Atmospheric
87
140
  def temperature_at_layer_from_geopotential(geopotential_alt)
88
141
  lower_layer_index = locate_lower_layer(geopotential_alt)
89
142
  lower_layer = TEMPERATURE_LAYERS[lower_layer_index]
90
- beta = lower_layer[:B]
91
- capital_t_b = lower_layer[:T]
92
- capital_h_b = lower_layer[:H]
143
+ beta = num(lower_layer[:B])
144
+ capital_t_b = num(lower_layer[:T])
145
+ capital_h_b = num(lower_layer[:H])
93
146
 
94
147
  capital_t_b + (beta * (geopotential_alt - capital_h_b))
95
148
  end
@@ -100,21 +153,23 @@ module Atmospheric
100
153
  )
101
154
  end
102
155
 
156
+ # rubocop:disable Metrics/AbcSize
103
157
  def locate_lower_layer(geopotential_alt)
104
158
  # Return first layer if lower than lowest
105
- return 0 if geopotential_alt < TEMPERATURE_LAYERS[0][:H]
159
+ return 0 if geopotential_alt < num(TEMPERATURE_LAYERS[0][:H])
106
160
 
107
161
  # Return second last layer if beyond last layer
108
162
  i = TEMPERATURE_LAYERS.length - 1
109
- return i - 1 if geopotential_alt >= TEMPERATURE_LAYERS[i][:H]
163
+ return i - 1 if geopotential_alt >= num(TEMPERATURE_LAYERS[i][:H])
110
164
 
111
165
  # find last layer with H smaller than our H
112
166
  TEMPERATURE_LAYERS.each_with_index do |layer, ind|
113
- return ind - 1 if layer[:H] > geopotential_alt
167
+ return ind - 1 if num(layer[:H]) > geopotential_alt
114
168
  end
115
169
 
116
170
  nil
117
171
  end
172
+ # rubocop:enable Metrics/AbcSize
118
173
 
119
174
  # Table 4 - Temperature and vertical temperature gradients
120
175
  #
@@ -124,18 +179,18 @@ module Atmospheric
124
179
  # B is Temperature gradient, "beta", K m^-1
125
180
 
126
181
  # This line is from ICAO 7488/3
127
- # [H: -5000, T: 320.65, B: -0.0065 ],
182
+ # { H: "-5000", T: "320.65", B: "-0.0065" },
128
183
 
129
184
  # This line is from ISO 2533:1975
130
- { H: -2000, T: 301.15, B: -0.0065 },
131
- { H: 0, T: 288.15, B: -0.0065 },
132
- { H: 11000, T: 216.65, B: 0 },
133
- { H: 20000, T: 216.65, B: 0.001 },
134
- { H: 32000, T: 228.65, B: 0.0028 },
135
- { H: 47000, T: 270.65, B: 0 },
136
- { H: 51000, T: 270.65, B: -0.0028 },
137
- { H: 71000, T: 214.65, B: -0.002 },
138
- { H: 80000, T: 196.65 },
185
+ { H: "-2000", T: "301.15", B: "-0.0065" },
186
+ { H: "0", T: "288.15", B: "-0.0065" },
187
+ { H: "11000", T: "216.65", B: "0" },
188
+ { H: "20000", T: "216.65", B: "0.001" },
189
+ { H: "32000", T: "228.65", B: "0.0028" },
190
+ { H: "47000", T: "270.65", B: "0" },
191
+ { H: "51000", T: "270.65", B: "-0.0028" },
192
+ { H: "71000", T: "214.65", B: "-0.002" },
193
+ { H: "80000", T: "196.65" },
139
194
  ].freeze
140
195
 
141
196
  # 2.7 Pressure
@@ -153,21 +208,21 @@ module Atmospheric
153
208
  TEMPERATURE_LAYERS.each_with_index do |_x, i|
154
209
  last_i = i.zero? ? 0 : i - 1
155
210
  last_layer = TEMPERATURE_LAYERS[last_i]
156
- beta = last_layer[:B]
211
+ beta = num(last_layer[:B])
157
212
 
158
- if last_layer[:H] <= 0
159
- p_b = CONST[:p_n]
213
+ if num(last_layer[:H]) <= 0
214
+ p_b = @constants[:p_n]
160
215
  capital_h_b = 0
161
- capital_t_b = CONST[:T_n]
216
+ capital_t_b = @constants[:T_n]
162
217
  else
163
218
  p_b = p[last_i]
164
- capital_h_b = last_layer[:H]
165
- capital_t_b = last_layer[:T]
219
+ capital_h_b = num(last_layer[:H])
220
+ capital_t_b = num(last_layer[:T])
166
221
  end
167
222
 
168
223
  current_layer = TEMPERATURE_LAYERS[i]
169
- geopotential_alt = current_layer[:H]
170
- temp = current_layer[:T]
224
+ geopotential_alt = num(current_layer[:H])
225
+ temp = num(current_layer[:T])
171
226
  height_diff = geopotential_alt - capital_h_b
172
227
 
173
228
  p_i = if beta != 0
@@ -190,33 +245,35 @@ module Atmospheric
190
245
  # Formula (12)
191
246
  def pressure_formula_beta_nonzero(p_b, beta, temp, height_diff)
192
247
  p_b * (1 + ((beta / temp) * height_diff)) \
193
- **(-CONST[:g_n] / (beta * CONST[:R]))
248
+ **(-@constants[:g_n] / (beta * @constants[:R]))
194
249
  end
195
250
 
196
251
  # Formula (13)
197
252
  def pressure_formula_beta_zero(p_b, temp, height_diff)
198
- p_b * Math.exp(-(CONST[:g_n] / (CONST[:R] * temp)) * height_diff)
253
+ p_b *
254
+ Math.exp(-(@constants[:g_n] / (@constants[:R] * temp)) * height_diff)
199
255
  end
200
256
 
201
257
  # puts "PRE-CALCULATED PRESSURE LAYERS:"
202
258
  # pp @pressure_layers
203
259
 
204
260
  def pa_to_mmhg(pascal)
205
- pascal * 0.007500616827
261
+ pascal * num("0.007500616827")
206
262
  end
207
263
 
208
264
  def pa_to_mbar(pascal)
209
- pascal * 0.01
265
+ pascal * num("0.01")
210
266
  end
211
267
 
268
+ # rubocop:disable Metrics/AbcSize
212
269
  # rubocop:disable Metrics/MethodLength
213
270
  # Pressure for a given geopotential altitude `H` (m) above mean sea level
214
271
  def pressure_from_geopotential(geopotential_alt)
215
272
  i = locate_lower_layer(geopotential_alt)
216
273
  lower_temperature_layer = TEMPERATURE_LAYERS[i]
217
- beta = lower_temperature_layer[:B]
218
- capital_h_b = lower_temperature_layer[:H]
219
- capital_t_b = lower_temperature_layer[:T]
274
+ beta = num(lower_temperature_layer[:B])
275
+ capital_h_b = num(lower_temperature_layer[:H])
276
+ capital_t_b = num(lower_temperature_layer[:T])
220
277
  temp = temperature_at_layer_from_geopotential(geopotential_alt)
221
278
  p_b = pressure_layers[i]
222
279
  height_diff = geopotential_alt - capital_h_b
@@ -229,6 +286,7 @@ module Atmospheric
229
286
  pressure_formula_beta_zero(p_b, temp, height_diff)
230
287
  end
231
288
  end
289
+ # rubocop:enable Metrics/AbcSize
232
290
  # rubocop:enable Metrics/MethodLength
233
291
 
234
292
  def pressure_from_geopotential_mbar(geopotential_alt)
@@ -240,7 +298,7 @@ module Atmospheric
240
298
  end
241
299
 
242
300
  def p_p_n_from_geopotential(geopotential_alt)
243
- pressure_from_geopotential(geopotential_alt) / CONST[:p_n]
301
+ pressure_from_geopotential(geopotential_alt) / @constants[:p_n]
244
302
  end
245
303
 
246
304
  # 2.8 Density and specific weight
@@ -252,15 +310,15 @@ module Atmospheric
252
310
  temp = temperature_at_layer_from_geopotential(geopotential_alt)
253
311
  p = pressure_from_geopotential(geopotential_alt)
254
312
 
255
- p / (CONST[:R] * temp)
313
+ p / (@constants[:R] * temp)
256
314
  end
257
315
 
258
316
  def rho_rho_n_from_geopotential(geopotential_alt)
259
- density_from_geopotential(geopotential_alt) / CONST[:rho_n]
317
+ density_from_geopotential(geopotential_alt) / @constants[:rho_n]
260
318
  end
261
319
 
262
320
  def root_rho_rho_n_from_geopotential(geopotential_alt)
263
- Math.sqrt(rho_rho_n_from_geopotential(geopotential_alt))
321
+ sqrt(rho_rho_n_from_geopotential(geopotential_alt))
264
322
  end
265
323
 
266
324
  # Specific weight
@@ -275,12 +333,12 @@ module Atmospheric
275
333
  # Formula (16)
276
334
  # H_p
277
335
  def pressure_scale_height_from_temp(temp)
278
- (CONST[:R] * temp) / CONST[:g_n]
336
+ (@constants[:R] * temp) / @constants[:g_n]
279
337
  end
280
338
 
281
339
  def pressure_scale_height_from_geopotential(geopotential_alt)
282
340
  temp = temperature_at_layer_from_geopotential(geopotential_alt)
283
- (CONST[:R] * temp) / gravity_at_geopotential(geopotential_alt)
341
+ (@constants[:R] * temp) / gravity_at_geopotential(geopotential_alt)
284
342
  end
285
343
 
286
344
  # 2.10 Air number density
@@ -290,7 +348,7 @@ module Atmospheric
290
348
  temp = temperature_at_layer_from_geopotential(geopotential_alt)
291
349
  p = pressure_from_geopotential(geopotential_alt)
292
350
 
293
- CONST[:N_A] * p / (CONST[:R_star] * temp)
351
+ @constants[:N_A] * p / (@constants[:R_star] * temp)
294
352
  end
295
353
 
296
354
  # 2.11 Mean air-particle speed
@@ -298,7 +356,7 @@ module Atmospheric
298
356
  # v_bar
299
357
  # CORRECT
300
358
  def mean_air_particle_speed_from_temp(temp)
301
- 1.595769 * Math.sqrt(CONST[:R] * temp)
359
+ num("1.595769") * sqrt(@constants[:R] * temp)
302
360
  end
303
361
 
304
362
  def mean_air_particle_speed_from_geopotential(geopotential_alt)
@@ -310,7 +368,8 @@ module Atmospheric
310
368
  # Formula (19)
311
369
  # l
312
370
  def mean_free_path_of_air_particles_from_geopotential(geopotential_alt)
313
- 1 / (1.414213562 * 3.141592654 * (3.65e-10**2) * \
371
+ # 1 / (sqrt(2) * Pi * (3.65e-10**2) * air_number_density
372
+ 1 / (@sqrt2 * @pi * num("0.133225e-18") * \
314
373
  air_number_density_from_geopotential(geopotential_alt))
315
374
  end
316
375
 
@@ -318,9 +377,10 @@ module Atmospheric
318
377
  # Formula (20)
319
378
  # omega
320
379
  def air_particle_collision_frequency_from_temp(air_number_density, temp)
321
- 4 * (3.65e-10**2) *
322
- ((3.141592654 / (CONST[:R_star] * CONST[:M]))**0.5) *
323
- air_number_density * CONST[:R_star] * (temp**0.5)
380
+ # 4 * (3.65e-10**2) * ...
381
+ 4 * num("0.133225e-18") *
382
+ ((@pi / (@constants[:R_star] * @constants[:M]))**num("0.5")) *
383
+ air_number_density * @constants[:R_star] * (temp**num("0.5"))
324
384
  end
325
385
 
326
386
  def air_particle_collision_frequency_from_geopotential(geopotential_alt)
@@ -335,8 +395,8 @@ module Atmospheric
335
395
  # CORRECT
336
396
  def speed_of_sound_from_temp(temp)
337
397
  # `kappa` (ratio of c_p / c_v) = 1.4 (see 2.14)
338
- kappa = 1.4
339
- Math.sqrt(kappa * CONST[:R] * temp)
398
+ kappa = num("1.4")
399
+ sqrt(kappa * @constants[:R] * temp)
340
400
  end
341
401
 
342
402
  def speed_of_sound_from_geopotential(geopotential_alt)
@@ -349,10 +409,10 @@ module Atmospheric
349
409
  # mu (Pa s)
350
410
  def dynamic_viscosity(temp)
351
411
  # Sutherland's empirical constants in the equation for dynamic viscosity
352
- capital_b_s = 1.458e-6
353
- capital_s = 110.4
412
+ capital_b_s = num("1.458e-6")
413
+ capital_s = num("110.4")
354
414
 
355
- (capital_b_s * (temp**1.5)) / (temp + capital_s)
415
+ (capital_b_s * (temp**num("1.5"))) / (temp + capital_s)
356
416
  end
357
417
 
358
418
  def dynamic_viscosity_from_geopotential(geopotential_alt)
@@ -364,7 +424,7 @@ module Atmospheric
364
424
  # Formula (23)
365
425
  # v
366
426
  def kinematic_viscosity(temp)
367
- dynamic_viscosity(temp) / CONST[:rho_n]
427
+ dynamic_viscosity(temp) / @constants[:rho_n]
368
428
  end
369
429
 
370
430
  def kinematic_viscosity_from_geopotential(geopotential_alt)
@@ -376,7 +436,8 @@ module Atmospheric
376
436
  # Formula (24)
377
437
  # lambda
378
438
  def thermal_conductivity_from_temp(temp)
379
- (2.648151e-3 * (temp**1.5)) / (temp + (245.4 * (10**(-12.0 / temp))))
439
+ (num("2.648151e-3") * (temp**num("1.5"))) \
440
+ / (temp + (num("245.4") * (num("10")**(num("-12") / temp))))
380
441
  end
381
442
 
382
443
  def thermal_conductivity_from_geopotential(geopotential_alt)
@@ -385,7 +446,7 @@ module Atmospheric
385
446
  end
386
447
 
387
448
  def kelvin_to_celsius(kelvin)
388
- kelvin - 273.15
449
+ kelvin - num("273.15")
389
450
  end
390
451
 
391
452
  # ADD 1
@@ -395,29 +456,29 @@ module Atmospheric
395
456
  # rubocop:disable Metrics/MethodLength
396
457
  def geopotential_altitude_from_pressure_mbar(pressure)
397
458
  if pressure >= pa_to_mbar(pressure_layers[2]) # H <= 11 000 m
398
- (3.731444 - pressure**0.1902631) / 8.41728e-5
459
+ (num("3.731444") - pressure**num("0.1902631")) / num("8.41728e-5")
399
460
  elsif pressure >= pa_to_mbar(pressure_layers[3]) # H <= 20 000 m
400
- (3.1080387 - Math.log10(pressure)) / 6.848325e-5
461
+ (num("3.1080387") - log10(pressure)) / num("6.848325e-5")
401
462
  elsif pressure >= pa_to_mbar(pressure_layers[4]) # H <= 32 000 m
402
- (1.2386515 - pressure**0.02927125) \
403
- / (5.085177e-6 * pressure**0.02927125)
463
+ (num("1.2386515") - pressure**num("0.02927125")) \
464
+ / (num("5.085177e-6") * pressure**num("0.02927125"))
404
465
  elsif pressure >= pa_to_mbar(pressure_layers[5]) # H <= 47 000 m
405
- (1.9630052 - pressure**0.08195949) \
406
- / (2.013664e-5 * pressure**0.08195949)
466
+ (num("1.9630052") - pressure**num("0.08195949")) \
467
+ / (num("2.013664e-5") * pressure**num("0.08195949"))
407
468
  end
408
469
  end
409
470
 
410
471
  def geopotential_altitude_from_pressure_mmhg(pressure)
411
472
  if pressure >= pa_to_mmhg(pressure_layers[2]) # H <= 11 000 m
412
- (3.532747 - pressure**0.1902631) / 7.96906e-5
473
+ (num("3.532747") - pressure**num("0.1902631")) / num("7.96906e-5")
413
474
  elsif pressure >= pa_to_mmhg(pressure_layers[3]) # H <= 20 000 m
414
- (2.9831357 - Math.log10(pressure)) / 6.848325e-5
475
+ (num("2.9831357") - log10(pressure)) / num("6.848325e-5")
415
476
  elsif pressure >= pa_to_mmhg(pressure_layers[4]) # H <= 32 000 m
416
- (1.2282678 - pressure**0.02927125) \
417
- / (5.085177e-6 * pressure**0.02927125)
477
+ (num("1.2282678") - pressure**num("0.02927125")) \
478
+ / (num("5.085177e-6") * pressure**num("0.02927125"))
418
479
  elsif pressure >= pa_to_mmhg(pressure_layers[5]) # H <= 47 000 m
419
- (1.9172753 - pressure**0.08195949) \
420
- / (2.013664e-5 * pressure**0.08195949)
480
+ (num("1.9172753") - pressure**num("0.08195949")) \
481
+ / (num("2.013664e-5") * pressure**num("0.08195949"))
421
482
  end
422
483
  end
423
484
  # rubocop:enable Metrics/AbcSize
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Atmospheric
4
- VERSION = "0.4.1"
4
+ VERSION = "0.4.3"
5
5
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atmospheric
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-03-30 00:00:00.000000000 Z
11
+ date: 2024-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: measured
14
+ name: bigdecimal
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -101,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
101
  - !ruby/object:Gem::Version
102
102
  version: '0'
103
103
  requirements: []
104
- rubygems_version: 3.3.26
104
+ rubygems_version: 3.3.27
105
105
  signing_key:
106
106
  specification_version: 4
107
107
  summary: Implementation of International Standard Atmosphere (ISA) formulas"