def test_refet_daily_output(daily_params): """Test daily RefET calculation at a single point and time""" # If I don't copy, the pop changes the test values in daily_data() inputs = daily_params.copy() surface = inputs.pop('surface') expected = inputs.pop('expected') # print('ETr: {}'.format(expected)) # ETr/ETo values only have 4 significant figures # Small number of days don't match if difference is set < 0.008 diff = 0.05 if expected >= 10.0 else 0.008 # Cast all numeric inputs to ee.Number type except tmin (for now) adj_inputs = {} for k, v in inputs.items(): if k == 'rso_type': adj_inputs[k] = v elif k in ['tmin', 'tmax', 'ea', 'rs', 'uz']: adj_inputs[k] = ee.Image.constant(v) else: adj_inputs[k] = ee.Number(v) if surface.lower() == 'etr': refet = Daily(**adj_inputs).etr elif surface.lower() == 'eto': refet = Daily(**adj_inputs).eto output = refet\ .reduceRegion(ee.Reducer.first(), geometry=constant_geom, scale=1)\ .getInfo() assert float(output[surface.lower()]) == pytest.approx(expected, abs=diff)
def test_refet_daily_rso_type_exception(): with pytest.raises(ValueError): refet = Daily(tmax=ee.Image.constant(d_args['tmax']), tmin=ee.Image.constant(d_args['tmin']), ea=ee.Image.constant(d_args['ea']), rs=ee.Image.constant(d_args['rs']), uz=ee.Image.constant(d_args['uz']), zw=ee.Number(s_args['zw']), elev=ee.Number(s_args['elev']), lat=ee.Number(s_args['lat']), doy=ee.Number(d_args['doy']), rso_type='nonsense', method='refet')
def test_refet_daily_etw(): refet = Daily(tmax=ee.Image.constant(d_args['tmax']), tmin=ee.Image.constant(d_args['tmin']), ea=ee.Image.constant(d_args['ea']), rs=ee.Image.constant(d_args['rs']), uz=ee.Image.constant(d_args['uz']), zw=ee.Number(s_args['zw']), elev=ee.Number(s_args['elev']), lat=ee.Number(s_args['lat']), doy=ee.Number(d_args['doy']), method='refet') output = refet.etw\ .reduceRegion(ee.Reducer.first(), geometry=constant_geom, scale=1)\ .getInfo() assert float(output['etw']) == pytest.approx(d_args['etw_refet'])
def test_refet_daily_etsz(surface, expected): refet = Daily(tmax=ee.Image.constant(d_args['tmax']), tmin=ee.Image.constant(d_args['tmin']), ea=ee.Image.constant(d_args['ea']), rs=ee.Image.constant(d_args['rs']), uz=ee.Image.constant(d_args['uz']), zw=ee.Number(s_args['zw']), elev=ee.Number(s_args['elev']), lat=ee.Number(s_args['lat']), doy=ee.Number(d_args['doy']), method='refet') output = refet.etsz(surface).rename(['etsz']).reduceRegion( reducer=ee.Reducer.first(), geometry=ee.Geometry.Rectangle([0, 0, 10, 10], 'EPSG:32613', False), scale=1).getInfo() assert float(output['etsz']) == pytest.approx(expected)
def test_refet_daily_pet_hargreaves(): refet = Daily(tmax=ee.Image.constant(d_args['tmax']), tmin=ee.Image.constant(d_args['tmin']), ea=ee.Image.constant(0), rs=ee.Image.constant(0), uz=ee.Image.constant(0), zw=ee.Number(s_args['zw']), elev=ee.Number(0), lat=ee.Number(s_args['lat']), doy=ee.Number(d_args['doy']), method='asce') output = refet.pet_hargreaves\ .reduceRegion(ee.Reducer.first(), geometry=constant_geom, scale=1)\ .getInfo() assert float(output['pet_hargreaves']) == pytest.approx( d_args['pet_hargreaves'])