Spaces:
Sleeping
Sleeping
| import Foundation | |
| import OmFileFormat | |
| /** | |
| Domain definition for ICON wave models | |
| */ | |
| enum IconWaveDomain: String, CaseIterable, GenericDomain { | |
| case gwam | |
| case ewam | |
| var hasYearlyFiles: Bool { | |
| return false | |
| } | |
| var masterTimeRange: Range<Timestamp>? { | |
| return nil | |
| } | |
| var domainRegistry: DomainRegistry { | |
| switch self { | |
| case .gwam: | |
| return .dwd_gwam | |
| case .ewam: | |
| return .dwd_ewam | |
| } | |
| } | |
| var domainRegistryStatic: DomainRegistry? { | |
| return domainRegistry | |
| } | |
| /// Number of time steps in each time series optimised file. 5 days more than each run. | |
| var omFileLength: Int { | |
| let dtHours = dtSeconds/3600 | |
| return countForecastHours + 5 * 24 / dtHours | |
| } | |
| var dtSeconds: Int { | |
| switch self { | |
| case .gwam: | |
| return 3*3600 | |
| case .ewam: | |
| return 3600 | |
| } | |
| } | |
| var grid: Gridable { | |
| switch self { | |
| case .gwam: | |
| return RegularGrid(nx: 1440, ny: 699, latMin: -85.25, lonMin: -180, dx: 0.25, dy: 0.25) | |
| case .ewam: | |
| return RegularGrid(nx: 526, ny: 721, latMin: 30, lonMin: -10.5, dx: 0.1, dy: 0.05) | |
| } | |
| } | |
| var updateIntervalSeconds: Int { | |
| switch self { | |
| case .gwam: | |
| return 12*3600 | |
| case .ewam: | |
| return 12*3600 | |
| } | |
| } | |
| /// Number of actual forecast timesteps per run | |
| var countForecastHours: Int { | |
| switch self { | |
| case .gwam: | |
| return 59 | |
| case .ewam: | |
| return 79 | |
| } | |
| } | |
| } | |
| enum IconWaveVariable: String, CaseIterable, GenericVariable, GenericVariableMixable { | |
| //case windspeed_10m // Disabled, because already available in better quality in regular domains | |
| //case winddirection_10m | |
| case wave_height | |
| case wave_period | |
| case wave_direction | |
| case wind_wave_height | |
| case wind_wave_period | |
| case wind_wave_peak_period | |
| case wind_wave_direction | |
| case swell_wave_height | |
| case swell_wave_period | |
| case swell_wave_peak_period | |
| case swell_wave_direction | |
| var storePreviousForecast: Bool { | |
| return false | |
| } | |
| var isElevationCorrectable: Bool { | |
| return false | |
| } | |
| var requiresOffsetCorrectionForMixing: Bool { | |
| return false | |
| } | |
| var omFileName: (file: String, level: Int) { | |
| return (rawValue, 0) | |
| } | |
| /// Name used on the dwd open data server | |
| var dwdName: String { | |
| switch self { | |
| /*case .windspeed_10m: | |
| return "sp_10m" | |
| case .winddirection_10m: | |
| return "dd_10m"*/ | |
| case .wave_height: | |
| return "swh" | |
| case .wave_period: | |
| return "tm10" | |
| case .wave_direction: | |
| return "mwd" | |
| case .wind_wave_height: | |
| return "shww" | |
| case .wind_wave_period: | |
| return "mpww" | |
| case .wind_wave_peak_period: | |
| return "ppww" | |
| case .wind_wave_direction: | |
| return "mdww" | |
| case .swell_wave_height: | |
| return "shts" | |
| case .swell_wave_period: | |
| return "mpts" | |
| case .swell_wave_peak_period: | |
| return "ppts" | |
| case .swell_wave_direction: | |
| return "mdts" | |
| } | |
| } | |
| /// Si unit | |
| var unit: SiUnit { | |
| switch self { | |
| /*case .windspeed_10m: | |
| return .metrePerSecond | |
| case .winddirection_10m: | |
| return .degreeDirection*/ | |
| case .wave_height: | |
| return .metre | |
| case .wave_period: | |
| return .seconds | |
| case .wave_direction: | |
| return .degreeDirection | |
| case .wind_wave_height: | |
| return .metre | |
| case .wind_wave_period: | |
| return .seconds | |
| case .wind_wave_peak_period: | |
| return .seconds | |
| case .wind_wave_direction: | |
| return .degreeDirection | |
| case .swell_wave_height: | |
| return .metre | |
| case .swell_wave_period: | |
| return .seconds | |
| case .swell_wave_peak_period: | |
| return .seconds | |
| case .swell_wave_direction: | |
| return .degreeDirection | |
| } | |
| } | |
| var scalefactor: Float { | |
| let period: Float = 20 // 0.05s resolution | |
| let height: Float = 50 // 0.02m resolution | |
| let direction: Float = 1 | |
| switch self { | |
| /*case .windspeed_10m: | |
| return 36 // 0.1 kmh resolution | |
| case .winddirection_10m: | |
| return direction*/ | |
| case .wave_height: | |
| return height | |
| case .wave_period: | |
| return period | |
| case .wave_direction: | |
| return direction | |
| case .wind_wave_height: | |
| return height | |
| case .wind_wave_period: | |
| return period | |
| case .wind_wave_peak_period: | |
| return period | |
| case .wind_wave_direction: | |
| return direction | |
| case .swell_wave_height: | |
| return height | |
| case .swell_wave_period: | |
| return period | |
| case .swell_wave_peak_period: | |
| return period | |
| case .swell_wave_direction: | |
| return direction | |
| } | |
| } | |
| var interpolation: ReaderInterpolation { | |
| switch self { | |
| /*case .windspeed_10m: | |
| return .hermite | |
| case .winddirection_10m: | |
| return .linear*/ | |
| case .wave_height: | |
| return .linear | |
| case .wave_period: | |
| return .hermite(bounds: 0...Float.infinity) | |
| case .wave_direction: | |
| return .linearDegrees | |
| case .wind_wave_height: | |
| return .linear | |
| case .wind_wave_period: | |
| return .hermite(bounds: 0...Float.infinity) | |
| case .wind_wave_peak_period: | |
| return .hermite(bounds: 0...Float.infinity) | |
| case .wind_wave_direction: | |
| return .linearDegrees | |
| case .swell_wave_height: | |
| return .linear | |
| case .swell_wave_period: | |
| return .hermite(bounds: 0...Float.infinity) | |
| case .swell_wave_peak_period: | |
| return .hermite(bounds: 0...Float.infinity) | |
| case .swell_wave_direction: | |
| return .linearDegrees | |
| } | |
| } | |
| } | |