Class: Atmospheris::Iso5878::WindObservation

Inherits:
Object
  • Object
show all
Defined in:
lib/atmospheris/iso5878/wind_observation.rb

Overview

Encapsulates a single altitude-level wind observation with its empirically measured parameters and lazily computed derived statistics.

Empirical inputs: Vx, Vy, sigma_r, Vsa (optional), nu_max (optional) Derived outputs: Vr, theta, Vsc, percentile bounds

Examples:

obs = WindObservation.new(
  geopotential_altitude: 1000,
  vx: -3.9, vy: -1.2, sigma_r: 5.9,
  vsa: 7.6
)
obs.vr          # => 4.08
obs.vsc         # => 6.03 (calculated)
obs.distribution.percentile_bounds[1].high  # => 14.7

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(geopotential_altitude:, vx:, vy:, sigma_r:, vsa: nil, nu_max: nil, use_absolute_vx: false) ⇒ WindObservation

Returns a new instance of WindObservation.

Parameters:

  • geopotential_altitude (Numeric)

    altitude in metres

  • vx (Numeric)

    mean zonal wind component (m/s)

  • vy (Numeric)

    mean meridional wind component (m/s)

  • sigma_r (Numeric)

    standard deviation of vector mean wind (m/s)

  • vsa (Numeric, nil) (defaults to: nil)

    observed scalar mean speed (m/s)

  • nu_max (Numeric, nil) (defaults to: nil)

    max observed speed once in 10 years (m/s)

  • use_absolute_vx (Boolean) (defaults to: false)

    for zones > 20°N where Vy ≈ 0



30
31
32
33
34
35
36
37
38
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 30

def initialize(geopotential_altitude:, vx:, vy:, sigma_r:, vsa: nil, nu_max: nil, use_absolute_vx: false)
  @geopotential_altitude = geopotential_altitude.to_f
  @vx = vx.to_f
  @vy = vy.to_f
  @sigma_r = sigma_r.to_f
  @vsa = vsa
  @nu_max = nu_max
  @use_absolute_vx = use_absolute_vx
end

Instance Attribute Details

#geopotential_altitudeObject (readonly)

Returns the value of attribute geopotential_altitude.



21
22
23
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 21

def geopotential_altitude
  @geopotential_altitude
end

#nu_maxObject (readonly)

Returns the value of attribute nu_max.



21
22
23
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 21

def nu_max
  @nu_max
end

#sigma_rObject (readonly)

Returns the value of attribute sigma_r.



21
22
23
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 21

def sigma_r
  @sigma_r
end

#vsaObject (readonly)

Returns the value of attribute vsa.



21
22
23
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 21

def vsa
  @vsa
end

#vxObject (readonly)

Returns the value of attribute vx.



21
22
23
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 21

def vx
  @vx
end

#vyObject (readonly)

Returns the value of attribute vy.



21
22
23
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 21

def vy
  @vy
end

Instance Method Details

#derived_fieldsWindDerivedFields

Full derived result as a WindDerivedFields struct (legacy API compat).

Returns:



74
75
76
77
78
79
80
81
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 74

def derived_fields
  @derived_fields ||= WindDerivedFields.new(
    vr: vr,
    sigma: distribution.sigma,
    vsc: vsc,
    percentiles: percentile_bounds
  )
end

#distributionRiceDistribution

The Rice distribution for this observation level. Lazily constructed and cached.

Returns:



56
57
58
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 56

def distribution
  @distribution ||= RiceDistribution.new(vr: vr, sigma_r: @sigma_r)
end

#percentile_boundsHash{Integer => PercentilePair}

Calculated percentile bounds.

Returns:



68
69
70
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 68

def percentile_bounds
  @percentile_bounds ||= distribution.percentile_bounds
end

#thetaFloat

Direction of the vector mean wind (radians from east).

Returns:

  • (Float)


49
50
51
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 49

def theta
  @theta ||= Math.atan2(@vy, @vx)
end

#vrFloat

Magnitude of the vector mean wind. For zones > 20°N, uses |Vx| as specified in ISO 5878 Section 5.4.

Returns:

  • (Float)


43
44
45
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 43

def vr
  @vr ||= @use_absolute_vx ? @vx.abs : Math.sqrt(@vx**2 + @vy**2)
end

#vscFloat

Calculated scalar mean wind speed (Vsc).

Returns:

  • (Float)


62
63
64
# File 'lib/atmospheris/iso5878/wind_observation.rb', line 62

def vsc
  @vsc ||= distribution.mean
end