Skip to content

Commit

Permalink
Test base class weather construction (#542)
Browse files Browse the repository at this point in the history
  • Loading branch information
tskisner authored Mar 9, 2022
1 parent 0f8e6b5 commit 707250e
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 29 deletions.
50 changes: 33 additions & 17 deletions src/toast/tests/weather.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

import numpy as np

import astropy.units as u

from .mpi import MPITestCase

import numpy.testing as nt
Expand All @@ -17,25 +19,39 @@ class WeatherTest(MPITestCase):
def setUp(self):
pass

def get_props(self, w):
val = w.time
val = w.ice_water
val = w.liquid_water
val = w.pwv
val = w.humidity
val = w.surface_pressure
val = w.surface_temperature
val = w.air_temperature
val = w.west_wind
val = w.south_wind

def test_base(self):
date = datetime.now()
real = Weather(
time=date,
ice_water=1.0e-4 * u.mm,
liquid_water=1.0e-4 * u.mm,
pwv=2.0 * u.mm,
humidity=0.005 * u.mm,
surface_pressure=53000 * u.Pa,
surface_temperature=273.0 * u.Kelvin,
air_temperature=270.0 * u.Kelvin,
west_wind=2.0 * (u.meter / u.second),
south_wind=1.0 * (u.meter / u.second),
)
self.get_props(real)

def test_sim(self):
date = datetime.now()

sim_atacama = SimWeather(time=date, name="atacama", site_uid=1)
sim_pole = SimWeather(time=date, name="south_pole", site_uid=2)
self.get_props(sim_atacama)

# for name, sim in zip(["atacama", "south_pole"], [sim_atacama, sim_pole]):
# print(
# "{} (uid = {}, realiz. = {}):".format(
# name, sim._site_uid, sim._realization
# )
# )
# print(" time = ", sim.time)
# print(" ice_water = ", sim.ice_water)
# print(" liquid_water = ", sim.liquid_water)
# print(" pwv = ", sim.pwv)
# print(" humidity = ", sim.humidity)
# print(" surface_pressure = ", sim.surface_pressure)
# print(" surface_temperature = ", sim.surface_temperature)
# print(" air_temperature = ", sim.air_temperature)
# print(" west_wind = ", sim.west_wind)
# print(" south_wind = ", sim.south_wind)
sim_pole = SimWeather(time=date, name="south_pole", site_uid=2)
self.get_props(sim_pole)
93 changes: 81 additions & 12 deletions src/toast/weather.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,85 +28,154 @@ class Weather(object):
these are constant, under the assumption that the weather changes slowly during a
good science observation.
This base class can be used directly to hold values specified at construction.
Args:
time (datetime): A python date/time in UTC.
ice_water (Quantity): Precipitable ice water.
liquid_water (Quantity): Precipitable liquid water.
pwv (Quantity): Precipitable water vapor.
humidity (Quantity): Specific humidity at 10m altitude.
surface_pressure (Quantity): Surface pressure.
surface_temperature (Quantity): Surface temperature.
air_temperature (Quantity): Air temperature at 10m altitude.
west_wind (Quantity): Eastward moving wind at 10m altitude.
south_wind (Quantity): Northward moving wind at 10m altitude.
"""

def __init__(self):
pass
def __init__(
self,
time=None,
ice_water=None,
liquid_water=None,
pwv=None,
humidity=None,
surface_pressure=None,
surface_temperature=None,
air_temperature=None,
west_wind=None,
south_wind=None,
):
self._time_val = time
self._ice_water_val = ice_water
self._liquid_water_val = liquid_water
self._pwv_val = pwv
self._humidity_val = humidity
self._surface_pressure_val = surface_pressure
self._surface_temperature_val = surface_temperature
self._air_temperature_val = air_temperature
self._west_wind_val = west_wind
self._south_wind_val = south_wind

def _time(self):
raise NotImplementedError("Derived class must implement _time()")
if self._time_val is None:
raise NotImplementedError("Base class _time() called, but has no value")
return self._time_val

@property
def time(self):
"""The time for these weather properties."""
return self._time()

def _ice_water(self):
raise NotImplementedError("Derived class must implement _ice_water()")
if self._ice_water_val is None:
raise NotImplementedError(
"Base class _ice_water() called, but has no value"
)
return self._ice_water_val

@property
def ice_water(self):
"""Total precipitable ice water [kg/m^2] (also [mm])."""
return self._ice_water()

def _liquid_water(self):
raise NotImplementedError("Derived class must implement _liquid_water()")
if self._liquid_water_val is None:
raise NotImplementedError(
"Base class _liquid_water() called, but has no value"
)
return self._liquid_water_val

@property
def liquid_water(self):
"""Total precipitable liquid water [kg/m^2] (also [mm])."""
return self._liquid_water()

def _pwv(self):
raise NotImplementedError("Derived class must implement _pwv()")
if self._pwv_val is None:
raise NotImplementedError("Base class _pwv() called, but has no value")
return self._pwv_val

@property
def pwv(self):
"""Total precipitable water vapor [kg/m^2] (also [mm])."""
return self._pwv()

def _humidity(self):
raise NotImplementedError("Derived class must implement _humidity()")
if self._humidity_val is None:
raise NotImplementedError("Base class _humidity() called, but has no value")
return self._humidity_val

@property
def humidity(self):
"""10-meter specific humidity [kg/kg]"""
return self._humidity()

def _surface_pressure(self):
raise NotImplementedError("Derived class must implement _surface_pressure()")
if self._surface_pressure_val is None:
raise NotImplementedError(
"Base class _surface_pressure() called, but has no value"
)
return self._surface_pressure_val

@property
def surface_pressure(self):
"""Surface pressure [Pa]."""
return self._surface_pressure()

def _surface_temperature(self):
raise NotImplementedError("Derived class must implement _surface_temperature()")
if self._surface_temperature_val is None:
raise NotImplementedError(
"Base class _surface_temperature() called, but has no value"
)
return self._surface_temperature_val

@property
def surface_temperature(self):
"""Surface skin temperature [K]."""
return self._surface_temperature()

def _air_temperature(self):
raise NotImplementedError("Derived class must implement _air_temperature()")
if self._air_temperature_val is None:
raise NotImplementedError(
"Base class _air_temperature() called, but has no value"
)
return self._air_temperature_val

@property
def air_temperature(self):
"""10-meter air temperature [K]."""
return self._air_temperature()

def _west_wind(self):
raise NotImplementedError("Derived class must implement _west_wind()")
if self._west_wind_val is None:
raise NotImplementedError(
"Base class _west_wind() called, but has no value"
)
return self._west_wind_val

@property
def west_wind(self):
"""10-meter eastward wind [m/s]."""
return self._west_wind()

def _south_wind(self):
raise NotImplementedError("Derived class must implement _south_wind()")
if self._south_wind_val is None:
raise NotImplementedError(
"Base class _south_wind() called, but has no value"
)
return self._south_wind_val

@property
def south_wind(self):
Expand Down

0 comments on commit 707250e

Please sign in to comment.