atmospheric 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,37 @@
1
+ module Atmospheric
2
+ module Export
3
+ module Iso25331975
4
+ class << self
5
+ def table_5
6
+ GroupOne.new.to_h
7
+ end
8
+
9
+ def table_6
10
+ GroupTwo.new.to_h
11
+ end
12
+
13
+ def table_7
14
+ GroupThree.new.to_h
15
+ end
16
+
17
+ def table_5_yaml
18
+ GroupOne.new.to_yaml
19
+ end
20
+
21
+ def table_6_yaml
22
+ GroupTwo.new.to_yaml
23
+ end
24
+
25
+ def table_7_yaml
26
+ GroupThree.new.to_yaml
27
+ end
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+
34
+ require_relative "iso_25331975/group_base"
35
+ require_relative "iso_25331975/group_one"
36
+ require_relative "iso_25331975/group_two"
37
+ require_relative "iso_25331975/group_three"
@@ -0,0 +1,105 @@
1
+ require_relative "./target"
2
+
3
+ module Atmospheric
4
+ module Export
5
+
6
+ module Iso25331997
7
+
8
+ module GroupBaseMeters
9
+ def steps
10
+ (-5000..2000).step(50)
11
+ end
12
+ end
13
+
14
+ class GroupOne < Iso25331975::GroupOne
15
+ include Iso25331997::GroupBaseMeters
16
+ end
17
+
18
+ class GroupTwo < Iso25331975::GroupTwo
19
+ include Iso25331997::GroupBaseMeters
20
+ end
21
+
22
+ class GroupThree < Iso25331975::GroupThree
23
+ include Iso25331997::GroupBaseMeters
24
+ end
25
+
26
+ module GroupBaseFeet
27
+ def steps
28
+ (
29
+ (-16500..-13999).step(250) +
30
+ (-14000..104999).step(200) +
31
+ (105000..262500).step(500)
32
+ )
33
+ end
34
+
35
+ def steps_unit
36
+ :feet
37
+ end
38
+ end
39
+
40
+ class GroupFour < Iso25331975::GroupOne
41
+ include Iso25331997::GroupBaseFeet
42
+ end
43
+
44
+ class GroupFive < Iso25331975::GroupTwo
45
+ include Iso25331997::GroupBaseFeet
46
+ end
47
+
48
+ class GroupSix < Iso25331975::GroupThree
49
+ include Iso25331997::GroupBaseFeet
50
+ end
51
+
52
+ class << self
53
+ def table_1
54
+ GroupOne.new.to_h
55
+ end
56
+
57
+ def table_2
58
+ GroupTwo.new.to_h
59
+ end
60
+
61
+ def table_3
62
+ GroupThree.new.to_h
63
+ end
64
+
65
+ def table_4
66
+ GroupFour.new.to_h
67
+ end
68
+
69
+ def table_5
70
+ GroupFive.new.to_h
71
+ end
72
+
73
+ def table_6
74
+ GroupSix.new.to_h
75
+ end
76
+
77
+ def table_1_yaml
78
+ GroupOne.new.to_yaml
79
+ end
80
+
81
+ def table_2_yaml
82
+ GroupTwo.new.to_yaml
83
+ end
84
+
85
+ def table_3_yaml
86
+ GroupThree.new.to_yaml
87
+ end
88
+
89
+ def table_4_yaml
90
+ GroupFour.new.to_yaml
91
+ end
92
+
93
+ def table_5_yaml
94
+ GroupFive.new.to_yaml
95
+ end
96
+
97
+ def table_6_yaml
98
+ GroupSix.new.to_yaml
99
+ end
100
+ end
101
+
102
+ end
103
+
104
+ end
105
+ end
@@ -0,0 +1,32 @@
1
+ require "measured"
2
+ require "yaml"
3
+
4
+ module Atmospheric
5
+ module Export
6
+
7
+ module Target
8
+ def round_to_sig_figs(num, num_sig_figs)
9
+ num.round(num_sig_figs - Math.log10(num).ceil).to_f
10
+ end
11
+
12
+ def m_to_ft(meters)
13
+ Measured::Length.new(meters, "m").convert_to("ft").value.to_f
14
+ end
15
+
16
+ def ft_to_m(feet)
17
+ Measured::Length.new(feet, "ft").convert_to("m").value.to_f
18
+ end
19
+
20
+ def to_yaml
21
+ to_h
22
+ .to_yaml(indentation: 4)
23
+ .gsub("\n- ", "\n\n - ")
24
+ .gsub(/^(.*):\n/, "\n\\1:") # Make fancy
25
+ end
26
+
27
+ def to_file(hash = to_yaml)
28
+ File.write(filename, hash)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,8 @@
1
+ module Atmospheric
2
+ module Export
3
+ end
4
+ end
5
+
6
+ require_relative "export/iso_25331975"
7
+ require_relative "export/iso_25331997"
8
+ require_relative "export/hypsometrical_tables"
@@ -6,29 +6,46 @@ module Atmospheric
6
6
  # 2.1 Primary constants and characteristics
7
7
  # Table 1 - Main constants and characteristics adopted for
8
8
  # the calculation of the ISO Standard Atmosphere
9
- CONST = {
10
- g_n: 9.80665, # m.s-2
11
- N_A: 602.257e21, # Avogadro constant, mol-1
12
- p_n: 101325, # In Pascal
13
- rho_n: 1.225, # rho_n standard air density
14
- T_n: 288.15, # T_n standard thermodynamic air temperature at mean sea level
15
- R_star: 8.31432, # universal gas constant
16
-
17
- radius: 6356766, # radius of the Earth (m)
18
- k: 1.4 # adiabatic index, dimensionless
9
+ constants = {
10
+ # g_n gravitation at mean sea level (m.s-2)
11
+ g_n: 9.80665,
12
+
13
+ # Avogadro constant (mol-1)
14
+ N_A: 6.02257e+23,
15
+
16
+ # p_n pressure at mean sea level (Pa)
17
+ p_n: 101325,
18
+
19
+ # rho_n standard air density
20
+ rho_n: 1.225,
21
+
22
+ # T_n standard thermodynamic air temperature at mean sea level
23
+ T_n: 288.15,
24
+
25
+ # universal gas constant
26
+ R_star: 8.31432,
27
+
28
+ # radius of the Earth (m)
29
+ radius: 6356766,
30
+
31
+ # adiabatic index (dimensionless)
32
+ k: 1.4,
19
33
  }
20
34
 
21
35
  # 2.2 The equation of the static atmosphere and the perfect gas law
22
36
  # Formula (2)
23
37
  # M: air molar mass at sea level, kg.kmol-1
24
38
  # Value given in 2.1 as M: 28.964720
25
- CONST[:M] = (CONST[:rho_n] * CONST[:R_star] * CONST[:T_n]) / CONST[:p_n]
39
+ constants[:M] =
40
+ (constants[:rho_n] * constants[:R_star] * constants[:T_n]) \
41
+ / constants[:p_n]
26
42
 
27
43
  # Formula (3)
28
44
  # R: specific gas constant, J.K-1.kg-1.
29
45
  # Value given in 2.1 as R: 287.05287
30
- CONST[:R] = CONST[:R_star] / CONST[:M]
46
+ constants[:R] = constants[:R_star] / constants[:M]
31
47
 
48
+ CONST = constants.freeze
32
49
 
33
50
  class << self
34
51
  # 2.3 Geopotential and geometric altitides; acceleration of free fall
@@ -67,7 +84,7 @@ module Atmospheric
67
84
 
68
85
  # Formula (11)
69
86
  # T
70
- def temperature_at_layer_from_H(geopotential_alt)
87
+ def temperature_at_layer_from_geopotential(geopotential_alt)
71
88
  lower_layer_index = locate_lower_layer(geopotential_alt)
72
89
  lower_layer = TEMPERATURE_LAYERS[lower_layer_index]
73
90
  beta = lower_layer[:B]
@@ -78,7 +95,9 @@ module Atmospheric
78
95
  end
79
96
 
80
97
  def temperature_at_layer_celcius(geopotential_alt)
81
- kelvin_to_celsius(temperature_at_layer_from_H(geopotential_alt))
98
+ kelvin_to_celsius(
99
+ temperature_at_layer_from_geopotential(geopotential_alt),
100
+ )
82
101
  end
83
102
 
84
103
  def locate_lower_layer(geopotential_alt)
@@ -89,9 +108,9 @@ module Atmospheric
89
108
  i = TEMPERATURE_LAYERS.length - 1
90
109
  return i - 1 if geopotential_alt >= TEMPERATURE_LAYERS[i][:H]
91
110
 
92
- # find last layer with H larger than our H
93
- TEMPERATURE_LAYERS.each_with_index do |layer, i|
94
- return i if layer[:H] > geopotential_alt
111
+ # find last layer with H smaller than our H
112
+ TEMPERATURE_LAYERS.each_with_index do |layer, ind|
113
+ return ind - 1 if layer[:H] > geopotential_alt
95
114
  end
96
115
 
97
116
  nil
@@ -108,38 +127,40 @@ module Atmospheric
108
127
  # [H: -5000, T: 320.65, B: -0.0065 ],
109
128
 
110
129
  # This line is from ISO 2533:1975
111
- {H: -2000, T: 301.15, B: -0.0065 },
112
- {H: 0, T: 288.15, B: -0.0065 },
113
- {H: 11000, T: 216.65, B: 0 },
114
- {H: 20000, T: 216.65, B: 0.001 },
115
- {H: 32000, T: 228.65, B: 0.0028 },
116
- {H: 47000, T: 270.65, B: 0 },
117
- {H: 51000, T: 270.65, B: -0.0028 },
118
- {H: 71000, T: 214.65, B: -0.002 },
119
- {H: 80000, T: 196.65},
120
- ]
121
-
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 },
139
+ ].freeze
122
140
 
123
141
  # 2.7 Pressure
124
142
 
125
143
  # Base pressure values given defined `TEMPERATURE_LAYERS` and constants
144
+ # rubocop:disable Metrics/AbcSize
145
+ # rubocop:disable Metrics/PerceivedComplexity
146
+ # rubocop:disable Metrics/MethodLength
126
147
  def pressure_layers
127
148
  return @pressure_layers if @pressure_layers
128
149
 
129
- # assuming TEMPERATURE_LAYERS index 1 base altitude is zero (mean sea level)
150
+ # assume TEMPERATURE_LAYERS index 1 base altitude is 0 (mean sea level)
130
151
  p = []
131
152
 
132
- TEMPERATURE_LAYERS.each_with_index do |x, i|
133
- last_i = (i == 0) ? 0 : i - 1
153
+ TEMPERATURE_LAYERS.each_with_index do |_x, i|
154
+ last_i = i.zero? ? 0 : i - 1
134
155
  last_layer = TEMPERATURE_LAYERS[last_i]
135
156
  beta = last_layer[:B]
136
157
 
137
158
  if last_layer[:H] <= 0
138
- pb = CONST[:p_n]
159
+ p_b = CONST[:p_n]
139
160
  capital_h_b = 0
140
161
  capital_t_b = CONST[:T_n]
141
162
  else
142
- pb = p[last_i]
163
+ p_b = p[last_i]
143
164
  capital_h_b = last_layer[:H]
144
165
  capital_t_b = last_layer[:T]
145
166
  end
@@ -147,18 +168,35 @@ module Atmospheric
147
168
  current_layer = TEMPERATURE_LAYERS[i]
148
169
  geopotential_alt = current_layer[:H]
149
170
  temp = current_layer[:T]
150
-
151
- p[i] = if beta != 0
152
- # Formula (12)
153
- pb * (1 + ((beta / capital_t_b) * (geopotential_alt - capital_h_b))) ** (-CONST[:g_n] / (beta * CONST[:R]))
154
- else
155
- # Formula (13)
156
- pb * Math.exp(-(CONST[:g_n] / (CONST[:R] * temp)) * (geopotential_alt - capital_h_b))
157
- end
171
+ height_diff = geopotential_alt - capital_h_b
172
+
173
+ p_i = if beta != 0
174
+ # Formula (12)
175
+ pressure_formula_beta_nonzero(p_b, beta, capital_t_b,
176
+ height_diff)
177
+ else
178
+ # Formula (13)
179
+ pressure_formula_beta_zero(p_b, temp, height_diff)
180
+ end
181
+ p[i] = p_i
158
182
  end
159
183
 
160
184
  @pressure_layers = p
161
185
  end
186
+ # rubocop:enable Metrics/AbcSize
187
+ # rubocop:enable Metrics/PerceivedComplexity
188
+ # rubocop:enable Metrics/MethodLength
189
+
190
+ # Formula (12)
191
+ def pressure_formula_beta_nonzero(p_b, beta, temp, height_diff)
192
+ p_b * (1 + ((beta / temp) * height_diff)) \
193
+ **(-CONST[:g_n] / (beta * CONST[:R]))
194
+ end
195
+
196
+ # Formula (13)
197
+ def pressure_formula_beta_zero(p_b, temp, height_diff)
198
+ p_b * Math.exp(-(CONST[:g_n] / (CONST[:R] * temp)) * height_diff)
199
+ end
162
200
 
163
201
  # puts "PRE-CALCULATED PRESSURE LAYERS:"
164
202
  # pp @pressure_layers
@@ -171,63 +209,66 @@ module Atmospheric
171
209
  pascal * 0.01
172
210
  end
173
211
 
212
+ # rubocop:disable Metrics/MethodLength
174
213
  # Pressure for a given geopotential altitude `H` (m) above mean sea level
175
- def pressure_from_H(geopotential_alt)
214
+ def pressure_from_geopotential(geopotential_alt)
176
215
  i = locate_lower_layer(geopotential_alt)
177
216
  lower_temperature_layer = TEMPERATURE_LAYERS[i]
178
217
  beta = lower_temperature_layer[:B]
179
218
  capital_h_b = lower_temperature_layer[:H]
180
219
  capital_t_b = lower_temperature_layer[:T]
181
- temp = temperature_at_layer_from_H(geopotential_alt)
182
- pb = pressure_layers[i]
220
+ temp = temperature_at_layer_from_geopotential(geopotential_alt)
221
+ p_b = pressure_layers[i]
222
+ height_diff = geopotential_alt - capital_h_b
183
223
 
184
224
  if beta != 0
185
225
  # Formula (12)
186
- pb * (1 + ((beta / capital_t_b) * (geopotential_alt - capital_h_b))) ** (-CONST[:g_n] / (beta * CONST[:R]))
226
+ pressure_formula_beta_nonzero(p_b, beta, capital_t_b, height_diff)
187
227
  else
188
228
  # Formula (13)
189
- pb * Math.exp(-(CONST[:g_n] / (CONST[:R] * temp)) * (geopotential_alt - capital_h_b))
229
+ pressure_formula_beta_zero(p_b, temp, height_diff)
190
230
  end
191
231
  end
232
+ # rubocop:enable Metrics/MethodLength
192
233
 
193
- def pressure_from_H_mbar(geopotential_alt)
194
- pa_to_mbar(pressure_from_H(geopotential_alt))
234
+ def pressure_from_geopotential_mbar(geopotential_alt)
235
+ pa_to_mbar(pressure_from_geopotential(geopotential_alt))
195
236
  end
196
237
 
197
- def pressure_from_H_mmhg(geopotential_alt)
198
- pa_to_mmhg(pressure_from_H(geopotential_alt))
238
+ def pressure_from_geopotential_mmhg(geopotential_alt)
239
+ pa_to_mmhg(pressure_from_geopotential(geopotential_alt))
199
240
  end
200
241
 
201
- def p_p_n_from_H(geopotential_alt)
202
- pressure_from_H(geopotential_alt) / CONST[:p_n]
242
+ def p_p_n_from_geopotential(geopotential_alt)
243
+ pressure_from_geopotential(geopotential_alt) / CONST[:p_n]
203
244
  end
204
245
 
205
246
  # 2.8 Density and specific weight
206
247
 
207
- # Calculate density for a given geopotential altitude `H` (m) above mean sea level
248
+ # Density for a given geopotential altitude `H` (m) above mean sea level
208
249
  # Formula (14)
209
250
  # rho
210
- def density_from_H(geopotential_alt)
211
- temp = temperature_at_layer_from_H(geopotential_alt)
212
- p = pressure_from_H(geopotential_alt)
251
+ def density_from_geopotential(geopotential_alt)
252
+ temp = temperature_at_layer_from_geopotential(geopotential_alt)
253
+ p = pressure_from_geopotential(geopotential_alt)
213
254
 
214
255
  p / (CONST[:R] * temp)
215
256
  end
216
257
 
217
- def rho_rho_n_from_H(geopotential_alt)
218
- density_from_H(geopotential_alt) / CONST[:rho_n]
258
+ def rho_rho_n_from_geopotential(geopotential_alt)
259
+ density_from_geopotential(geopotential_alt) / CONST[:rho_n]
219
260
  end
220
261
 
221
- def root_rho_rho_n_from_H(geopotential_alt)
222
- Math.sqrt(rho_rho_n_from_H(geopotential_alt))
262
+ def root_rho_rho_n_from_geopotential(geopotential_alt)
263
+ Math.sqrt(rho_rho_n_from_geopotential(geopotential_alt))
223
264
  end
224
265
 
225
-
226
266
  # Specific weight
227
267
  # Formula (15)
228
268
  # gamma
229
- def specific_weight_from_H(geopotential_alt)
230
- density_from_H(geopotential_alt) * gravity_at_geopotential(geopotential_alt)
269
+ def specific_weight_from_geopotential(geopotential_alt)
270
+ density_from_geopotential(geopotential_alt) *
271
+ gravity_at_geopotential(geopotential_alt)
231
272
  end
232
273
 
233
274
  # 2.9 Pressure scale height
@@ -237,17 +278,17 @@ module Atmospheric
237
278
  (CONST[:R] * temp) / CONST[:g_n]
238
279
  end
239
280
 
240
- def pressure_scale_height_from_H(geopotential_alt)
241
- temp = temperature_at_layer_from_H(geopotential_alt)
281
+ def pressure_scale_height_from_geopotential(geopotential_alt)
282
+ temp = temperature_at_layer_from_geopotential(geopotential_alt)
242
283
  (CONST[:R] * temp) / gravity_at_geopotential(geopotential_alt)
243
284
  end
244
285
 
245
286
  # 2.10 Air number density
246
287
  # Formula (17)
247
288
  # n
248
- def air_number_density_from_H(geopotential_alt)
249
- temp = temperature_at_layer_from_H(geopotential_alt)
250
- p = pressure_from_H(geopotential_alt)
289
+ def air_number_density_from_geopotential(geopotential_alt)
290
+ temp = temperature_at_layer_from_geopotential(geopotential_alt)
291
+ p = pressure_from_geopotential(geopotential_alt)
251
292
 
252
293
  CONST[:N_A] * p / (CONST[:R_star] * temp)
253
294
  end
@@ -260,28 +301,31 @@ module Atmospheric
260
301
  1.595769 * Math.sqrt(CONST[:R] * temp)
261
302
  end
262
303
 
263
- def mean_air_particle_speed_from_H(geopotential_alt)
264
- temp = temperature_at_layer_from_H(geopotential_alt)
304
+ def mean_air_particle_speed_from_geopotential(geopotential_alt)
305
+ temp = temperature_at_layer_from_geopotential(geopotential_alt)
265
306
  mean_air_particle_speed_from_temp(temp)
266
307
  end
267
308
 
268
309
  # 2.12 Mean free path of air particles
269
310
  # Formula (19)
270
311
  # l
271
- def mean_free_path_of_air_particles_from_H(geopotential_alt)
272
- 1 / (1.414213562 * 3.141592654 * (0.365e-9 ** 2) * air_number_density_from_H(geopotential_alt))
312
+ def mean_free_path_of_air_particles_from_geopotential(geopotential_alt)
313
+ 1 / (1.414213562 * 3.141592654 * (3.65e-10**2) * \
314
+ air_number_density_from_geopotential(geopotential_alt))
273
315
  end
274
316
 
275
317
  # 2.13 Air-particle collision frequency
276
318
  # Formula (20)
277
319
  # omega
278
- def air_particle_collision_frequency_from_temp(n, temp)
279
- 4 * (0.365e-9 ** 2) * ((3.141592654 / (CONST[:R_star] * CONST[:M])) ** 0.5) * n * CONST[:R_star] * (temp ** 0.5)
320
+ 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)
280
324
  end
281
325
 
282
- def air_particle_collision_frequency_from_H(geopotential_alt)
283
- temp = temperature_at_layer_from_H(geopotential_alt)
284
- n = air_number_density_from_H(geopotential_alt)
326
+ def air_particle_collision_frequency_from_geopotential(geopotential_alt)
327
+ temp = temperature_at_layer_from_geopotential(geopotential_alt)
328
+ n = air_number_density_from_geopotential(geopotential_alt)
285
329
  air_particle_collision_frequency_from_temp(n, temp)
286
330
  end
287
331
 
@@ -295,12 +339,11 @@ module Atmospheric
295
339
  Math.sqrt(kappa * CONST[:R] * temp)
296
340
  end
297
341
 
298
- def speed_of_sound_from_H(geopotential_alt)
299
- temp = temperature_at_layer_from_H(geopotential_alt)
342
+ def speed_of_sound_from_geopotential(geopotential_alt)
343
+ temp = temperature_at_layer_from_geopotential(geopotential_alt)
300
344
  speed_of_sound_from_temp(temp)
301
345
  end
302
346
 
303
-
304
347
  # 2.15 Dynamic viscosity
305
348
  # Formula (22)
306
349
  # mu (Pa s)
@@ -309,11 +352,11 @@ module Atmospheric
309
352
  capital_b_s = 1.458e-6
310
353
  capital_s = 110.4
311
354
 
312
- (capital_b_s * (temp ** (1.5))) / (temp + capital_s)
355
+ (capital_b_s * (temp**1.5)) / (temp + capital_s)
313
356
  end
314
357
 
315
- def dynamic_viscosity_from_H(geopotential_alt)
316
- temp = temperature_at_layer_from_H(geopotential_alt)
358
+ def dynamic_viscosity_from_geopotential(geopotential_alt)
359
+ temp = temperature_at_layer_from_geopotential(geopotential_alt)
317
360
  dynamic_viscosity(temp)
318
361
  end
319
362
 
@@ -324,20 +367,20 @@ module Atmospheric
324
367
  dynamic_viscosity(temp) / CONST[:rho_n]
325
368
  end
326
369
 
327
- def kinematic_viscosity_from_H(geopotential_alt)
328
- temp = temperature_at_layer_from_H(geopotential_alt)
329
- dynamic_viscosity(temp) / density_from_H(geopotential_alt)
370
+ def kinematic_viscosity_from_geopotential(geopotential_alt)
371
+ temp = temperature_at_layer_from_geopotential(geopotential_alt)
372
+ dynamic_viscosity(temp) / density_from_geopotential(geopotential_alt)
330
373
  end
331
374
 
332
375
  # 2.17 Thermal conductivity
333
376
  # Formula (24)
334
377
  # lambda
335
378
  def thermal_conductivity_from_temp(temp)
336
- (2.648151e-3 * (temp ** (1.5))) / (temp + (245.4 * (10 ** (-12.0/temp))))
379
+ (2.648151e-3 * (temp**1.5)) / (temp + (245.4 * (10**(-12.0 / temp))))
337
380
  end
338
381
 
339
- def thermal_conductivity_from_H(geopotential_alt)
340
- temp = temperature_at_layer_from_H(geopotential_alt)
382
+ def thermal_conductivity_from_geopotential(geopotential_alt)
383
+ temp = temperature_at_layer_from_geopotential(geopotential_alt)
341
384
  thermal_conductivity_from_temp(temp)
342
385
  end
343
386
 
@@ -345,6 +388,40 @@ module Atmospheric
345
388
  kelvin - 273.15
346
389
  end
347
390
 
391
+ # ADD 1
392
+ # Formulae used in the calculation of the relationships
393
+ # between geopotential altitude and pressure
394
+ # rubocop:disable Metrics/AbcSize
395
+ # rubocop:disable Metrics/MethodLength
396
+ def geopotential_altitude_from_pressure_mbar(pressure)
397
+ if pressure >= pa_to_mbar(pressure_layers[2]) # H <= 11 000 m
398
+ (3.731444 - pressure**0.1902631) / 8.41728e-5
399
+ elsif pressure >= pa_to_mbar(pressure_layers[3]) # H <= 20 000 m
400
+ (3.1080387 - Math.log10(pressure)) / 6.848325e-5
401
+ 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)
404
+ 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)
407
+ end
408
+ end
409
+
410
+ def geopotential_altitude_from_pressure_mmhg(pressure)
411
+ if pressure >= pa_to_mmhg(pressure_layers[2]) # H <= 11 000 m
412
+ (3.532747 - pressure**0.1902631) / 7.96906e-5
413
+ elsif pressure >= pa_to_mmhg(pressure_layers[3]) # H <= 20 000 m
414
+ (2.9831357 - Math.log10(pressure)) / 6.848325e-5
415
+ 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)
418
+ 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)
421
+ end
422
+ end
423
+ # rubocop:enable Metrics/AbcSize
424
+ # rubocop:enable Metrics/MethodLength
348
425
  end
349
426
  end
350
427
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Atmospheric
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/atmospheric.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative "atmospheric/version"
4
4
  require_relative "atmospheric/isa"
5
+ require_relative "atmospheric/export"
5
6
 
6
7
  module Atmospheric
7
8
  class Error < StandardError; end