atmospheric 0.4.1 → 0.4.3

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