tsunami / src /tsuwave /utils /units.py
Gitdeeper4's picture
رفع جميع ملفات TSU-WAVE مع YAML
12834b7
"""Unit conversion utilities for TSU-WAVE"""
import numpy as np
# Length conversions
def m_to_km(meters: float) -> float:
"""Convert meters to kilometers"""
return meters / 1000.0
def km_to_m(kilometers: float) -> float:
"""Convert kilometers to meters"""
return kilometers * 1000.0
def m_to_ft(meters: float) -> float:
"""Convert meters to feet"""
return meters * 3.28084
def ft_to_m(feet: float) -> float:
"""Convert feet to meters"""
return feet / 3.28084
def m_to_miles(meters: float) -> float:
"""Convert meters to miles"""
return meters / 1609.34
def miles_to_m(miles: float) -> float:
"""Convert miles to meters"""
return miles * 1609.34
def m_to_nm(meters: float) -> float:
"""Convert meters to nautical miles"""
return meters / 1852.0
def nm_to_m(nautical_miles: float) -> float:
"""Convert nautical miles to meters"""
return nautical_miles * 1852.0
# Speed conversions
def ms_to_knots(m_per_s: float) -> float:
"""Convert meters per second to knots"""
return m_per_s * 1.94384
def knots_to_ms(knots: float) -> float:
"""Convert knots to meters per second"""
return knots / 1.94384
def ms_to_kmh(m_per_s: float) -> float:
"""Convert meters per second to kilometers per hour"""
return m_per_s * 3.6
def kmh_to_ms(km_per_h: float) -> float:
"""Convert kilometers per hour to meters per second"""
return km_per_h / 3.6
def ms_to_mph(m_per_s: float) -> float:
"""Convert meters per second to miles per hour"""
return m_per_s * 2.23694
def mph_to_ms(mph: float) -> float:
"""Convert miles per hour to meters per second"""
return mph / 2.23694
# Temperature conversions
def celsius_to_kelvin(celsius: float) -> float:
"""Convert Celsius to Kelvin"""
return celsius + 273.15
def kelvin_to_celsius(kelvin: float) -> float:
"""Convert Kelvin to Celsius"""
return kelvin - 273.15
def celsius_to_fahrenheit(celsius: float) -> float:
"""Convert Celsius to Fahrenheit"""
return celsius * 9/5 + 32
def fahrenheit_to_celsius(fahrenheit: float) -> float:
"""Convert Fahrenheit to Celsius"""
return (fahrenheit - 32) * 5/9
# Pressure conversions
def pa_to_hpa(pascals: float) -> float:
"""Convert Pascals to hectopascals"""
return pascals / 100.0
def hpa_to_pa(hectopascals: float) -> float:
"""Convert hectopascals to Pascals"""
return hectopascals * 100.0
def pa_to_mbar(pascals: float) -> float:
"""Convert Pascals to millibars"""
return pascals / 100.0 # 1 mbar = 1 hPa
def mbar_to_pa(millibars: float) -> float:
"""Convert millibars to Pascals"""
return millibars * 100.0
def pa_to_atm(pascals: float) -> float:
"""Convert Pascals to atmospheres"""
return pascals / 101325.0
def atm_to_pa(atmospheres: float) -> float:
"""Convert atmospheres to Pascals"""
return atmospheres * 101325.0
# Depth conversions (pressure to depth)
def pressure_to_depth(pressure_pa: float, latitude: float = 45.0) -> float:
"""Convert pressure to ocean depth (simplified)
Args:
pressure_pa: pressure in Pascals
latitude: latitude in degrees (for gravity correction)
Returns:
depth in meters
"""
g = 9.780327 * (1 + 0.0053024 * np.sin(np.radians(latitude))**2 -
0.0000058 * np.sin(2 * np.radians(latitude))**2)
rho = 1025.0 # seawater density
return pressure_pa / (rho * g)
def depth_to_pressure(depth_m: float, latitude: float = 45.0) -> float:
"""Convert ocean depth to pressure
Args:
depth_m: depth in meters
latitude: latitude in degrees
Returns:
pressure in Pascals
"""
g = 9.780327 * (1 + 0.0053024 * np.sin(np.radians(latitude))**2 -
0.0000058 * np.sin(2 * np.radians(latitude))**2)
rho = 1025.0
return depth_m * rho * g
# Time conversions
def seconds_to_minutes(seconds: float) -> float:
"""Convert seconds to minutes"""
return seconds / 60.0
def minutes_to_seconds(minutes: float) -> float:
"""Convert minutes to seconds"""
return minutes * 60.0
def seconds_to_hours(seconds: float) -> float:
"""Convert seconds to hours"""
return seconds / 3600.0
def hours_to_seconds(hours: float) -> float:
"""Convert hours to seconds"""
return hours * 3600.0
# Wave parameters
def period_to_frequency(period_s: float) -> float:
"""Convert wave period to frequency"""
return 1.0 / period_s
def frequency_to_period(frequency_hz: float) -> float:
"""Convert frequency to wave period"""
return 1.0 / frequency_hz
def wavelength_from_period(period_s: float, depth_m: float, g: float = 9.81) -> float:
"""Estimate wavelength from period and depth (shallow water approximation)"""
return period_s * np.sqrt(g * depth_m)
def celerity_from_depth(depth_m: float, g: float = 9.81) -> float:
"""Compute shallow water wave celerity"""
return np.sqrt(g * depth_m)
# Energy conversions
def joules_to_kwh(joules: float) -> float:
"""Convert Joules to kilowatt-hours"""
return joules / 3.6e6
def kwh_to_joules(kwh: float) -> float:
"""Convert kilowatt-hours to Joules"""
return kwh * 3.6e6
# Unit testing
def test_conversions():
"""Test unit conversions"""
assert abs(m_to_km(1000) - 1.0) < 1e-6
assert abs(km_to_m(1) - 1000) < 1e-6
assert abs(m_to_ft(1) - 3.28084) < 1e-5
assert abs(ft_to_m(3.28084) - 1) < 1e-5
assert abs(ms_to_knots(1) - 1.94384) < 1e-5
assert abs(knots_to_ms(1.94384) - 1) < 1e-5
assert abs(celsius_to_kelvin(0) - 273.15) < 1e-6
print("All unit tests passed!")
if __name__ == "__main__":
test_conversions()