|
|
|
@ -2,7 +2,8 @@ import unittest as ut
@@ -2,7 +2,8 @@ import unittest as ut
|
|
|
|
|
import numpy.testing as nt |
|
|
|
|
import numpy as np |
|
|
|
|
import numpy.ma as ma |
|
|
|
|
import os, sys |
|
|
|
|
import os |
|
|
|
|
import sys |
|
|
|
|
import subprocess |
|
|
|
|
|
|
|
|
|
from wrf import (getvar, interplevel, interpline, vertcross, vinterp, |
|
|
|
@ -20,6 +21,7 @@ REF_FILE = "ci_result_file.nc"
@@ -20,6 +21,7 @@ REF_FILE = "ci_result_file.nc"
|
|
|
|
|
if sys.version_info > (3,): |
|
|
|
|
xrange = range |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Using helpful information at: |
|
|
|
|
# http://eli.thegreenplace.net/2014/04/02/dynamically-generating-python-test-cases |
|
|
|
|
def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False): |
|
|
|
@ -34,7 +36,6 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
@@ -34,7 +36,6 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
|
|
|
|
|
multiproduct = varname in ("uvmet", "uvmet10", "cape_2d", "cape_3d", |
|
|
|
|
"cfrac") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ref_vals = refnc.variables[varname][:] |
|
|
|
|
|
|
|
|
|
if (varname == "tc"): |
|
|
|
@ -45,8 +46,7 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
@@ -45,8 +46,7 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
|
|
|
|
|
elif (varname == "pw"): |
|
|
|
|
my_vals = getvar(in_wrfnc, "pw", timeidx=timeidx) |
|
|
|
|
tol = .5/100.0 |
|
|
|
|
atol = 0 # NCL uses different constants and doesn't use same |
|
|
|
|
# handrolled virtual temp in method |
|
|
|
|
atol = 0 |
|
|
|
|
nt.assert_allclose(to_np(my_vals), ref_vals, tol, atol) |
|
|
|
|
elif (varname == "cape_2d"): |
|
|
|
|
cape_2d = getvar(in_wrfnc, varname, timeidx=timeidx) |
|
|
|
@ -56,7 +56,7 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
@@ -56,7 +56,7 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
|
|
|
|
|
# merged back in to NCL. The modifications to the R and CP |
|
|
|
|
# changes TK enough that non-lifting parcels could lift, thus |
|
|
|
|
# causing wildly different values in LCL |
|
|
|
|
nt.assert_allclose(to_np(cape_2d[0,:]), ref_vals[0,:], tol, atol) |
|
|
|
|
nt.assert_allclose(to_np(cape_2d[0, :]), ref_vals[0, :], tol, atol) |
|
|
|
|
elif (varname == "cape_3d"): |
|
|
|
|
cape_3d = getvar(in_wrfnc, varname, timeidx=timeidx) |
|
|
|
|
# Changing the R and CP constants, while keeping TK within |
|
|
|
@ -67,18 +67,18 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
@@ -67,18 +67,18 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
|
|
|
|
|
tol = 0/100. |
|
|
|
|
atol = 200.0 |
|
|
|
|
|
|
|
|
|
#print np.amax(np.abs(to_np(cape_3d[0,:]) - ref_vals[0,:])) |
|
|
|
|
# print np.amax(np.abs(to_np(cape_3d[0,:]) - ref_vals[0,:])) |
|
|
|
|
nt.assert_allclose(to_np(cape_3d), ref_vals, tol, atol) |
|
|
|
|
else: |
|
|
|
|
my_vals = getvar(in_wrfnc, varname, timeidx=timeidx) |
|
|
|
|
tol = 2/100. |
|
|
|
|
atol = 0.1 |
|
|
|
|
#print (np.amax(np.abs(to_np(my_vals) - ref_vals))) |
|
|
|
|
# print (np.amax(np.abs(to_np(my_vals) - ref_vals))) |
|
|
|
|
nt.assert_allclose(to_np(my_vals), ref_vals, tol, atol) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return test |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _get_refvals(referent, varname, repeat, multi): |
|
|
|
|
from netCDF4 import Dataset as NetCDF |
|
|
|
|
|
|
|
|
@ -88,6 +88,7 @@ def _get_refvals(referent, varname, repeat, multi):
@@ -88,6 +88,7 @@ def _get_refvals(referent, varname, repeat, multi):
|
|
|
|
|
|
|
|
|
|
return ref_vals |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def make_interp_test(varname, wrf_in, referent, multi=False, |
|
|
|
|
repeat=3, pynio=False): |
|
|
|
|
def test(self): |
|
|
|
@ -103,7 +104,7 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
@@ -103,7 +104,7 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
|
|
|
|
|
|
|
|
|
|
# Check that it works with numpy arrays |
|
|
|
|
hts_850 = interplevel(to_np(hts), p, 850) |
|
|
|
|
#print (hts_850) |
|
|
|
|
# print (hts_850) |
|
|
|
|
hts_850 = interplevel(hts, p, 850) |
|
|
|
|
|
|
|
|
|
nt.assert_allclose(to_np(hts_850), ref_ht_850) |
|
|
|
@ -118,12 +119,11 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
@@ -118,12 +119,11 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
|
|
|
|
|
# Check that it works with numpy arrays |
|
|
|
|
ht_cross = vertcross(to_np(hts), to_np(p), |
|
|
|
|
pivot_point=pivot_point, angle=90.) |
|
|
|
|
#print (ht_cross) |
|
|
|
|
# print (ht_cross) |
|
|
|
|
ht_cross = vertcross(hts, p, pivot_point=pivot_point, angle=90.) |
|
|
|
|
|
|
|
|
|
nt.assert_allclose(to_np(ht_cross), ref_ht_cross, rtol=.01) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elif (varname == "interpline"): |
|
|
|
|
|
|
|
|
|
ref_t2_line = _get_refvals(referent, "interpline", repeat, multi) |
|
|
|
@ -134,7 +134,7 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
@@ -134,7 +134,7 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
|
|
|
|
|
# Check that it works with numpy arrays |
|
|
|
|
t2_line1 = interpline(to_np(t2), pivot_point=pivot_point, |
|
|
|
|
angle=90.0) |
|
|
|
|
#print (t2_line1) |
|
|
|
|
# print (t2_line1) |
|
|
|
|
t2_line1 = interpline(t2, pivot_point=pivot_point, angle=90.0) |
|
|
|
|
|
|
|
|
|
nt.assert_allclose(to_np(t2_line1), ref_t2_line) |
|
|
|
@ -146,7 +146,7 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
@@ -146,7 +146,7 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
|
|
|
|
|
|
|
|
|
|
tk = getvar(in_wrfnc, "temp", timeidx=timeidx, units="k") |
|
|
|
|
|
|
|
|
|
interp_levels = [200,300,500,1000] |
|
|
|
|
interp_levels = [200, 300, 500, 1000] |
|
|
|
|
|
|
|
|
|
# Check that it works with numpy arrays |
|
|
|
|
field = vinterp(in_wrfnc, |
|
|
|
@ -157,7 +157,7 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
@@ -157,7 +157,7 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
|
|
|
|
|
field_type="tk", |
|
|
|
|
timeidx=timeidx, |
|
|
|
|
log_p=True) |
|
|
|
|
#print (field) |
|
|
|
|
# print (field) |
|
|
|
|
|
|
|
|
|
field = vinterp(in_wrfnc, |
|
|
|
|
field=tk, |
|
|
|
@ -200,7 +200,6 @@ def make_latlon_test(testid, wrf_in, referent, single, multi=False, repeat=3,
@@ -200,7 +200,6 @@ def make_latlon_test(testid, wrf_in, referent, single, multi=False, repeat=3,
|
|
|
|
|
|
|
|
|
|
nt.assert_allclose(to_np(xy), ref_vals) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else: |
|
|
|
|
# Since this domain is not moving, the reference values are the |
|
|
|
|
# same whether there are multiple or single files |
|
|
|
@ -215,15 +214,17 @@ def make_latlon_test(testid, wrf_in, referent, single, multi=False, repeat=3,
@@ -215,15 +214,17 @@ def make_latlon_test(testid, wrf_in, referent, single, multi=False, repeat=3,
|
|
|
|
|
|
|
|
|
|
nt.assert_allclose(to_np(ll), ref_vals) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return test |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class WRFVarsTest(ut.TestCase): |
|
|
|
|
longMessage = True |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class WRFInterpTest(ut.TestCase): |
|
|
|
|
longMessage = True |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class WRFLatLonTest(ut.TestCase): |
|
|
|
|
longMessage = True |
|
|
|
|
|
|
|
|
@ -261,10 +262,7 @@ if __name__ == "__main__":
@@ -261,10 +262,7 @@ if __name__ == "__main__":
|
|
|
|
|
repeat=3, pynio=False) |
|
|
|
|
multistr = "" if not multi else "_multi" |
|
|
|
|
singlestr = "_nosingle" if not single else "_single" |
|
|
|
|
test_name = "test_{}{}{}".format(testid, singlestr, |
|
|
|
|
multistr) |
|
|
|
|
test_name = "test_{}{}{}".format(testid, singlestr, multistr) |
|
|
|
|
setattr(WRFLatLonTest, test_name, test_ll_func) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ut.main() |
|
|
|
|
|