Class: Atmospheris::Iso5878::AtmosphereModelRegistry
- Inherits:
-
Object
- Object
- Atmospheris::Iso5878::AtmosphereModelRegistry
- Defined in:
- lib/atmospheris/iso5878/model_registry.rb
Overview
Factory for constructing AtmosphereProfile instances from model identifiers.
Maps model IDs (e.g. "15-annual", "60-warm") to their latitude, season, and temperature layer structure key. Surface conditions are looked up from Table 2 data. Layer structures are loaded from YAML data (Table 16/19).
Open/closed: new models can be added to MODELS without modifying AtmosphereProfile or TemperatureLayerStructure.
Constant Summary collapse
- MODELS =
Model definitions: maps model_id to configuration
{ "15-annual" => { latitude: 15, season: :annual, layers_key: :"rows-15" }, "30-winter" => { latitude: 30, season: :winter, layers_key: :"rows-30-w" }, "30-summer" => { latitude: 30, season: :summer, layers_key: :"rows-30-s" }, "45-winter" => { latitude: 45, season: :winter, layers_key: :"rows-45-w" }, "45-summer" => { latitude: 45, season: :summer, layers_key: :"rows-45-s" }, "60-winter" => { latitude: 60, season: :winter, layers_key: :"rows-60-w" }, "60-summer" => { latitude: 60, season: :summer, layers_key: :"rows-60-s" }, "60-warm" => { latitude: 60, season: :winter, layers_key: :"rows-60-warm" }, "60-cold" => { latitude: 60, season: :winter, layers_key: :"rows-60-cold" }, "80-winter" => { latitude: 80, season: :winter, layers_key: :"rows-80-w" }, "80-summer" => { latitude: 80, season: :summer, layers_key: :"rows-80-s" }, "80-warm" => { latitude: 80, season: :winter, layers_key: :"rows-80-warm" }, "80-cold" => { latitude: 80, season: :winter, layers_key: :"rows-80-cold" } }.freeze
- SURFACE_CONDITIONS =
Surface conditions from ISO 5878 Table 2. Pressures in Pa, temperatures in K.
{ 15 => { annual: { T: 299.650, P: 101_325.0 } }, 30 => { winter: { T: 283.150, P: 102_050.0 }, summer: { T: 297.150, P: 101_400.0 } }, 45 => { winter: { T: 272.650, P: 101_800.0 }, summer: { T: 291.150, P: 101_350.0 } }, 60 => { winter: { T: 256.150, P: 101_300.0 }, summer: { T: 282.150, P: 101_020.0 } }, 80 => { winter: { T: 248.950, P: 101_380.0 }, summer: { T: 276.650, P: 101_200.0 } } }.freeze
Class Method Summary collapse
-
.create(model_id, layers_data) ⇒ AtmosphereProfile
Construct an AtmosphereProfile for the given model ID.
-
.model_ids ⇒ Array<String>
List all available model IDs.
Class Method Details
.create(model_id, layers_data) ⇒ AtmosphereProfile
Construct an AtmosphereProfile for the given model ID.
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/atmospheris/iso5878/model_registry.rb', line 61 def self.create(model_id, layers_data) config = MODELS.fetch(model_id) do raise ArgumentError, "Unknown ISO 5878 model: #{model_id}. " \ "Available: #{MODELS.keys.join(", ")}" end surface = SURFACE_CONDITIONS.dig(config[:latitude], config[:season]) raise ArgumentError, "No surface conditions for #{config[:latitude]}° #{config[:season]}" unless surface raw_rows = layers_data[config[:layers_key].to_s] raise ArgumentError, "Layer data key '#{config[:layers_key]}' not found in provided data" unless raw_rows # Normalize YAML keys to symbols normalized = raw_rows.map do |row| { geopotential_altitude: row["geopotential-altitude"] || row[:geopotential_altitude], temperature_K: row["temperature-K"] || row[:temperature_K] } end tls = TemperatureLayerStructure.from_yaml_rows(normalized) params = SurfaceParameters.new(config[:latitude]) AtmosphereProfile.new( surface_params: params, surface_temperature: surface[:T], surface_pressure: surface[:P], layers: tls.to_a ) end |
.model_ids ⇒ Array<String>
List all available model IDs.
94 95 96 |
# File 'lib/atmospheris/iso5878/model_registry.rb', line 94 def self.model_ids MODELS.keys end |