Browse Source

Updated tests to use a set of files with the moving domain

lon0
Bill Ladwig 7 years ago
parent
commit
d06a7b8ea7
  1. 111
      test/ncl_get_var.ncl
  2. 494
      test/utests.py

111
test/ncl_get_var.ncl

@ -4,20 +4,29 @@
;system("printenv") ;system("printenv")
if (.not. isvar("in_file")) then if (.not. isvar("dir")) then
in_file = "/Users/ladwig/Documents/wrf_files/wrfout_d01_2010-06-13_21:00:00.nc" dir = "/Users/ladwig/Documents/wrf_files/wrf_vortex_multi"
;in_file = "/Users/ladwig/Documents/wrf_files/wrfout_d01_2010-06-13_21:00:00.nc"
;in_file = "/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/wrfout_d02_2005-08-28_00:00:00.nc" ;in_file = "/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/wrfout_d02_2005-08-28_00:00:00.nc"
end if end if
if (.not. isvar("pattern")) then
pattern = "wrfout_d02_*"
end if
if (.not. isvar("out_file")) then if (.not. isvar("out_file")) then
out_file = "/tmp/wrftest.nc" out_file = "/tmp/wrftest.nc"
end if end if
input_file = addfile(in_file,"r")
pat = dir + "/" + pattern
cmd = "ls " + pat
fils = systemfunc (cmd) ; file paths
input_file = addfiles(fils,"r")
system("/bin/rm -f " + out_file) ; remove if exists system("/bin/rm -f " + out_file) ; remove if exists
fout = addfile(out_file, "c") fout = addfile(out_file, "c")
time = 0 time = -1
wrf_vars = [/"avo", "eth", "cape_2d", "cape_3d", "ctt", "dbz", "mdbz", \ wrf_vars = [/"avo", "eth", "cape_2d", "cape_3d", "ctt", "dbz", "mdbz", \
"geopt", "helicity", "lat", "lon", "omg", "p", "pressure", \ "geopt", "helicity", "lat", "lon", "omg", "p", "pressure", \
@ -48,13 +57,16 @@
; Do the interpolation routines manually ; Do the interpolation routines manually
; 3D vertical cross section ;;;;;;;;;;;;;;;;;;; 3D vertical cross section
z := wrf_user_getvar(input_file, "z", 0) ; grid point height time = -1
p := wrf_user_getvar(input_file, "pressure", 0) ; total pressure
z := wrf_user_getvar(input_file, "z", time) ; grid point height
p := wrf_user_getvar(input_file, "pressure", time) ; total pressure
dimsz = dimsizes(z) dimsz = dimsizes(z)
pivot = (/ dimsz(2)/2, dimsz(1)/2 /) ; pivot point is center of domain pivot = (/ dimsz(2)/2, dimsz(1)/2 /) ; pivot point is center of domain
time = 0
ht_cross = wrf_user_intrp3d(z,p,"v",pivot,90.0,False) ht_cross = wrf_user_intrp3d(z,p,"v",pivot,90.0,False)
p_cross = wrf_user_intrp3d(p,z,"v",pivot,90.0,False) p_cross = wrf_user_intrp3d(p,z,"v",pivot,90.0,False)
@ -69,10 +81,11 @@
xopt@use_pivot = True xopt@use_pivot = True
xopt@angle = 90.0 xopt@angle = 90.0
xopt@file_handle = input_file xopt@file_handle = input_file
xopt@timeidx = 0 xopt@timeidx = time
xopt@linecoords = True xopt@linecoords = True
ht_vertcross1 = wrf_user_vertcross(z, p, pivot, xopt) ht_vertcross1 = wrf_user_vertcross(z, p, pivot, xopt)
printVarSummary(ht_vertcross1)
fout->ht_vertcross1 = ht_vertcross1 fout->ht_vertcross1 = ht_vertcross1
@ -82,16 +95,20 @@
xopt@angle = 90.0 xopt@angle = 90.0
xopt@levels = (/1000., 850., 700., 500., 250./) xopt@levels = (/1000., 850., 700., 500., 250./)
xopt@file_handle = input_file xopt@file_handle = input_file
xopt@timeidx = 0 xopt@timeidx = time
xopt@linecoords = True xopt@linecoords = True
ht_vertcross2 = wrf_user_vertcross(z, p, pivot, xopt) ht_vertcross2 = wrf_user_vertcross(z, p, pivot, xopt)
ht_vertcross2!0 = "vertical2" ht_vertcross2!0 = "vertical2"
ht_vertcross2!1 = "cross_line_idx2" ht_vertcross2!1 = "cross_line_idx2"
fout->ht_vertcross2 = ht_vertcross2 fout->ht_vertcross2 = ht_vertcross2
; Can only use a single time for lat/lon version at this time
vertdims = dimsizes(ht_vertcross2)
htdims = dimsizes(z)
lats = wrf_user_getvar(input_file, "lat", 0) lats = wrf_user_getvar(input_file, "lat", 0)
lons = wrf_user_getvar(input_file, "lon", 0) lons = wrf_user_getvar(input_file, "lon", 0)
@ -108,17 +125,26 @@
xopt@use_pivot = False xopt@use_pivot = False
xopt@latlon = True xopt@latlon = True
xopt@file_handle = input_file xopt@file_handle = input_file
xopt@timeidx = 0 xopt@timeidx = -1
xopt@linecoords = True xopt@linecoords = True
xopt@autolevels = 1000 xopt@autolevels = 1000
ht_vertcross3 = wrf_user_vertcross(z, p, start_end, xopt) ht_vertcross3 = wrf_user_vertcross(z, p, start_end, xopt)
ht_vertcross3!0 = "vertical3"
ht_vertcross3!1 = "cross_line_idx3" printVarSummary(ht_vertcross3)
ht_vertcross3!0 = "Time"
ht_vertcross3!1 = "vertical3"
ht_vertcross3!2 = "cross_line_idx3"
fout->ht_vertcross3 = ht_vertcross3 fout->ht_vertcross3 = ht_vertcross3
; 3D horizontal interpolation ;;;;;;;;;;;;;;;;;;;;;;;; 3D horizontal interpolation
time = -1
z := wrf_user_getvar(input_file, "z", time) ; grid point height
p := wrf_user_getvar(input_file, "pressure", time) ; total pressure
; First, check backwards compat ; First, check backwards compat
plev = 500. ; 500 MB plev = 500. ; 500 MB
@ -158,7 +184,7 @@
fout->z2_multi = z2_multi fout->z2_multi = z2_multi
fout->p2_multi = p2_multi fout->p2_multi = p2_multi
pblh = wrf_user_getvar(input_file, "PBLH", 0) pblh = wrf_user_getvar(input_file, "PBLH", time)
opts := False opts := False
opts@inc2dlevs = True opts@inc2dlevs = True
p_lev2d = wrf_user_interplevel(p, z, pblh, opts) p_lev2d = wrf_user_interplevel(p, z, pblh, opts)
@ -166,19 +192,24 @@
fout->p_lev2d = p_lev2d fout->p_lev2d = p_lev2d
; 2D interpolation along line ;;;;;;;;;;;;;;;;;;;;;;;; 2D interpolation along line
t2 = wrf_user_getvar(input_file, "T2", 0)
time = -1
t2 = wrf_user_getvar(input_file, "T2", time)
dimst2 = dimsizes(t2) dimst2 = dimsizes(t2)
pivot = (/ dimst2(1)/2, dimst2(0)/2 /) pivot = (/ dimst2(2)/2, dimst2(1)/2 /)
t2_line = wrf_user_intrp2d(t2, pivot, 90.0, False) t2_line = wrf_user_intrp2d(t2, pivot, 90.0, False)
fout->t2_line = (/t2_line/) fout->t2_line = (/t2_line/)
; 3D interpolation to new vertical coordinates ;;;;;;;;;;;;;;;;;;;;;;; 3D interpolation to new vertical coordinates
time = -1
; interp t to theta ; interp t to theta
fld1 = wrf_user_getvar(input_file, "tk", -1) fld1 = wrf_user_getvar(input_file, "tk", time)
vert_coord = "theta" vert_coord = "theta"
interp_levels = (/200,300,500,1000/) interp_levels = (/200,300,500,1000/)
@ -231,7 +262,7 @@
fout->fld_tk_ght_agl = fld5_intrp fout->fld_tk_ght_agl = fld5_intrp
; interp ht to pres ; interp ht to pres
fld6 = wrf_user_getvar(input_file, "height", -1) fld6 = wrf_user_getvar(input_file, "height", time)
vert_coord := "pressure" vert_coord := "pressure"
opts@field_type = "ght" opts@field_type = "ght"
interp_levels := (/500,50/) interp_levels := (/500,50/)
@ -242,7 +273,7 @@
; interp pres to theta ; interp pres to theta
fld7 = wrf_user_getvar(input_file, "pressure", -1) fld7 = wrf_user_getvar(input_file, "pressure", time)
vert_coord := "theta" vert_coord := "theta"
opts@field_type = "pressure" opts@field_type = "pressure"
interp_levels := (/200,300,500,1000/) interp_levels := (/200,300,500,1000/)
@ -253,7 +284,7 @@
; interp theta-e to pressure ; interp theta-e to pressure
fld8 = wrf_user_getvar(input_file, "eth", -1) fld8 = wrf_user_getvar(input_file, "eth", time)
vert_coord := "pressure" vert_coord := "pressure"
opts@field_type = "T" opts@field_type = "T"
interp_levels := (/850,500,5/) interp_levels := (/850,500,5/)
@ -263,16 +294,32 @@
fout->fld_thetae_pres = fld8_intrp fout->fld_thetae_pres = fld8_intrp
; lat/lon to x/y and x/y to lat/lon routines ;;;;;;;;;;;;;;;;;;; lat/lon to x/y and x/y to lat/lon routines
lats := (/-55, -60, -65 /)
lons := (/25, 30, 35 /) lats := (/22.0, 25.0, 27.0 /)
i_s = (/10, 100, 150 /) lons := (/-90.0, -87.5, -83.75 /)
j_s = (/10, 100, 150 /) x_s = (/10, 50, 90 /)
ij = wrf_user_ll_to_ij(input_file, lons, lats, True) y_s = (/10, 50, 90 /)
ll = wrf_user_ij_to_ll(input_file, i_s, j_s, True)
opt = True
opt@useTime = -1
opt@returnInt = False
xy1 = wrf_user_ll_to_xy(input_file, lons, lats, opt)
ll1 = wrf_user_xy_to_ll(input_file, x_s, y_s, opt)
fout->xy1 = xy1
fout->ll1 = ll1
opt = True
opt@useTime = 8
opt@returnInt = True
xy2 = wrf_user_ll_to_xy(input_file, lons, lats, opt)
ll2 = wrf_user_xy_to_ll(input_file, x_s, y_s, opt)
fout->ij = ij fout->xy2 = xy2
fout->ll = ll fout->ll2 = ll2
delete(fout) delete(fout)

494
test/utests.py

@ -4,6 +4,7 @@ import numpy as np
import numpy.ma as ma import numpy.ma as ma
import os, sys import os, sys
import subprocess import subprocess
import glob
from wrf import (getvar, interplevel, interpline, vertcross, vinterp, from wrf import (getvar, interplevel, interpline, vertcross, vinterp,
disable_xarray, xarray_enabled, to_np, disable_xarray, xarray_enabled, to_np,
@ -11,44 +12,46 @@ from wrf import (getvar, interplevel, interpline, vertcross, vinterp,
extract_global_attrs, viewitems, CoordPair, ll_points) extract_global_attrs, viewitems, CoordPair, ll_points)
from wrf.util import is_multi_file from wrf.util import is_multi_file
NCL_EXE = "/Users/ladwig/nclbuild/6.3.0/bin/ncl" NCL_EXE = "/Users/ladwig/miniconda2/envs/ncl_build/bin/ncl"
TEST_FILE = "/Users/ladwig/Documents/wrf_files/wrfout_d01_2010-06-13_21:00:00" NCARG_ROOT = "/Users/ladwig/miniconda2/envs/ncl_build"
OUT_NC_FILE = "/tmp/wrftest.nc" #TEST_FILE = "/Users/ladwig/Documents/wrf_files/wrfout_d01_2010-06-13_21:00:00"
DIR = "/Users/ladwig/Documents/wrf_files/wrf_vortex_multi"
PATTERN = "wrfout_d02_*"
REF_NC_FILE = "/tmp/wrftest.nc"
# Python 3 # Python 3
if sys.version_info > (3,): if sys.version_info > (3,):
xrange = range xrange = range
def setUpModule(): def setUpModule():
ncarg_root = os.environ.get("NCARG_ROOT", None) #ncarg_root = os.environ.get("NCARG_ROOT", None)
if ncarg_root is None: #if ncarg_root is None:
raise RuntimeError("$NCARG_ROOT environment variable not set") # raise RuntimeError("$NCARG_ROOT environment variable not set")
os.environ["NCARG_ROOT"] = NCARG_ROOT
os.environ["NCARG_NCARG"] = os.path.join(NCARG_ROOT, "lib", "ncarg")
this_path = os.path.realpath(__file__) this_path = os.path.realpath(__file__)
ncl_script = os.path.join(os.path.dirname(this_path), ncl_script = os.path.join(os.path.dirname(this_path),
"ncl_get_var.ncl") "ncl_get_var.ncl")
ncfile = TEST_FILE + ".nc" # NCL requires extension
# This needs to be set when PyNIO is installed, since PyNIOs data does cmd = "%s %s 'dir=\"%s\"' 'pattern=\"%s\"' 'out_file=\"%s\"'" % (NCL_EXE,
# not contain the dat file for the CAPE calcluations
os.environ["NCARG_NCARG"] = os.path.join(os.environ["NCARG_ROOT"],
"lib", "ncarg")
cmd = "%s %s 'in_file=\"%s\"' 'out_file=\"%s\"'" % (NCL_EXE,
ncl_script, ncl_script,
ncfile, DIR,
OUT_NC_FILE) PATTERN,
REF_NC_FILE)
#print cmd print cmd
if not os.path.exists(OUT_NC_FILE): if not os.path.exists(REF_NC_FILE):
status = subprocess.call(cmd, shell=True) status = subprocess.call(cmd, shell=True)
if (status != 0): if (status != 0):
raise RuntimeError("NCL script failed. Could not set up test.") raise RuntimeError("NCL script failed. Could not set up test.")
# Using helpful information at: # Using helpful information at:
# http://eli.thegreenplace.net/2014/04/02/dynamically-generating-python-test-cases # 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): def make_test(varname, dir, pattern, referent, multi=False, pynio=False):
def test(self): def test(self):
try: try:
@ -61,39 +64,27 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
except: except:
pass pass
if not multi: timeidx = 0 if not multi else None
timeidx = 0 pat = os.path.join(dir, pattern)
if not pynio: wrf_files = glob.glob(pat)
in_wrfnc = NetCDF(wrf_in) wrf_files.sort()
try:
in_wrfnc.set_auto_mask(False) wrfin = []
except: for fname in wrf_files:
pass
else:
# Note: Python doesn't like it if you reassign an outer scoped
# variable (wrf_in in this case)
if not wrf_in.endswith(".nc"):
wrf_file = wrf_in + ".nc"
else:
wrf_file = wrf_in
in_wrfnc = Nio.open_file(wrf_file)
else:
timeidx = None
if not pynio: if not pynio:
nc = NetCDF(wrf_in) f = NetCDF(fname)
try: try:
nc.set_auto_mask(False) f.set_auto_mask(False)
except: except:
pass pass
in_wrfnc = [nc for i in xrange(repeat)] wrfin.append(f)
else: else:
if not wrf_in.endswith(".nc"): if not fname.endswith(".nc"):
wrf_file = wrf_in + ".nc" _fname = fname + ".nc"
else: else:
wrf_file = wrf_in _fname = fname
nc = Nio.open_file(wrf_file) f = Nio.open_file(_fname)
in_wrfnc = [nc for i in xrange(repeat)] wrfin.append(f)
refnc = NetCDF(referent) refnc = NetCDF(referent)
try: try:
@ -104,69 +95,42 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
# These have a left index that defines the product type # These have a left index that defines the product type
multiproduct = varname in ("uvmet", "uvmet10", "cape_2d", "cape_3d", multiproduct = varname in ("uvmet", "uvmet10", "cape_2d", "cape_3d",
"cfrac") "cfrac")
multi2d = ("uvmet10", "cape_2d", "cfrac")
multi3d = ("uvmet", "cape_3d")
# These varnames don't have NCL functions to test against # These varnames don't have NCL functions to test against
ignore_referent = ("zstag", "geopt_stag") ignore_referent = ("zstag", "geopt_stag")
if varname not in ignore_referent: if varname not in ignore_referent:
if not multi: if not multi:
ref_vals = refnc.variables[varname][:] if varname in multi2d:
else: ref_vals = refnc.variables[varname][...,0,:,:]
data = refnc.variables[varname][:] elif varname in multi3d:
if (varname != "uvmet" and varname != "uvmet10" ref_vals = refnc.variables[varname][...,0,:,:,:]
and varname != "cape_2d" and varname != "cape_3d"):
new_dims = [repeat] + [x for x in data.shape]
elif (varname == "uvmet" or varname == "uvmet10"
or varname == "cape_3d"):
new_dims = [2] + [repeat] + [x for x in data.shape[1:]]
elif (varname == "cape_2d"):
new_dims = [4] + [repeat] + [x for x in data.shape[1:]]
elif (varname == "cfrac"):
new_dims = [3] + [repeat] + [x for x in data.shape[1:]]
masked=False
if (isinstance(data, ma.core.MaskedArray)):
masked=True
if not masked:
ref_vals = np.zeros(new_dims, data.dtype)
else: else:
ref_vals = ma.asarray(np.zeros(new_dims, data.dtype)) ref_vals = refnc.variables[varname][0,:]
else:
for i in xrange(repeat): ref_vals = refnc.variables[varname][:]
if not multiproduct:
ref_vals[i,:] = data[:]
if masked:
ref_vals.mask[i,:] = data.mask[:]
else:
for prod in xrange(ref_vals.shape[0]):
ref_vals[prod,i,:] = data[prod,:]
if masked:
ref_vals.mask[prod,i,:] = data.mask[prod,:]
if (varname == "tc"): if (varname == "tc"):
my_vals = getvar(in_wrfnc, "temp", timeidx=timeidx, units="c") my_vals = getvar(wrfin, "temp", timeidx=timeidx, units="c")
tol = 1/100. tol = 1/100.
atol = .1 # Note: NCL uses 273.16 as conversion for some reason atol = .1 # Note: NCL uses 273.16 as conversion for some reason
nt.assert_allclose(to_np(my_vals), ref_vals, tol, atol) nt.assert_allclose(to_np(my_vals), ref_vals, tol, atol)
elif (varname == "height_agl"): elif (varname == "height_agl"):
# Change the vert_type to height_agl when NCL gets updated. # Change the vert_type to height_agl when NCL gets updated.
my_vals = getvar(in_wrfnc, "z", timeidx=timeidx, msl=False) my_vals = getvar(wrfin, "z", timeidx=timeidx, msl=False)
tol = 1/100. tol = 1/100.
atol = .1 # Note: NCL uses 273.16 as conversion for some reason atol = .1 # Note: NCL uses 273.16 as conversion for some reason
nt.assert_allclose(to_np(my_vals), ref_vals, tol, atol) nt.assert_allclose(to_np(my_vals), ref_vals, tol, atol)
elif (varname == "cfrac"): elif (varname == "cfrac"):
# Change the vert_type to height_agl when NCL gets updated. # Change the vert_type to height_agl when NCL gets updated.
my_vals = getvar(in_wrfnc, "cfrac", timeidx=timeidx) my_vals = getvar(wrfin, "cfrac", timeidx=timeidx)
tol = 1/100. tol = 1/100.
atol = .1 # Note: NCL uses 273.16 as conversion for some reason atol = .1 # Note: NCL uses 273.16 as conversion for some reason
nt.assert_allclose(to_np(my_vals), ref_vals, tol, atol) nt.assert_allclose(to_np(my_vals), ref_vals, tol, atol)
elif (varname == "pw"): elif (varname == "pw"):
my_vals = getvar(in_wrfnc, "pw", timeidx=timeidx) my_vals = getvar(wrfin, "pw", timeidx=timeidx)
tol = .5/100.0 tol = .5/100.0
atol = 0 # NCL uses different constants and doesn't use same atol = 0 # NCL uses different constants and doesn't use same
# handrolled virtual temp in method # handrolled virtual temp in method
@ -176,7 +140,7 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
print (np.amax(np.abs(to_np(my_vals) - ref_vals))) print (np.amax(np.abs(to_np(my_vals) - ref_vals)))
raise raise
elif (varname == "cape_2d"): elif (varname == "cape_2d"):
cape_2d = getvar(in_wrfnc, varname, timeidx=timeidx) cape_2d = getvar(wrfin, varname, timeidx=timeidx)
tol = 0/100. tol = 0/100.
atol = 200.0 atol = 200.0
# Let's only compare CAPE values until the F90 changes are # Let's only compare CAPE values until the F90 changes are
@ -185,7 +149,7 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
# causing wildly different values in LCL # 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"): elif (varname == "cape_3d"):
cape_3d = getvar(in_wrfnc, varname, timeidx=timeidx) cape_3d = getvar(wrfin, varname, timeidx=timeidx)
# Changing the R and CP constants, while keeping TK within # Changing the R and CP constants, while keeping TK within
# 2%, can lead to some big changes in CAPE. Tolerances # 2%, can lead to some big changes in CAPE. Tolerances
# have been set wide when comparing the with the original # have been set wide when comparing the with the original
@ -197,11 +161,11 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
#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) nt.assert_allclose(to_np(cape_3d), ref_vals, tol, atol)
elif (varname == "zstag" or varname == "geopt_stag"): elif (varname == "zstag" or varname == "geopt_stag"):
v = getvar(in_wrfnc, varname, timeidx=timeidx) v = getvar(wrfin, varname, timeidx=timeidx)
# For now, only make sure it runs without crashing since no NCL # For now, only make sure it runs without crashing since no NCL
# to compare with yet. # to compare with yet.
else: else:
my_vals = getvar(in_wrfnc, varname, timeidx=timeidx) my_vals = getvar(wrfin, varname, timeidx=timeidx)
tol = 2/100. tol = 2/100.
atol = 0.1 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)))
@ -218,7 +182,7 @@ def make_test(varname, wrf_in, referent, multi=False, repeat=3, pynio=False):
return test return test
def _get_refvals(referent, varname, repeat, multi): def _get_refvals(referent, varname, multi):
try: try:
from netCDF4 import Dataset as NetCDF from netCDF4 import Dataset as NetCDF
except: except:
@ -230,30 +194,27 @@ def _get_refvals(referent, varname, repeat, multi):
except: except:
pass pass
multi2d = ("uvmet10", "cape_2d", "cfrac")
multi3d = ("uvmet", "cape_3d")
if not multi: if not multi:
ref_vals = refnc.variables[varname][:] if varname in multi2d:
else: ref_vals = refnc.variables[varname][...,0,:,:]
data = refnc.variables[varname][:] elif varname in multi3d:
new_dims = [repeat] + [x for x in data.shape] ref_vals = refnc.variables[varname][...,0,:,:,:]
masked=False
if (isinstance(data, ma.core.MaskedArray)):
masked=True
if not masked:
ref_vals = np.zeros(new_dims, data.dtype)
else: else:
ref_vals = ma.asarray(np.zeros(new_dims, data.dtype)) v = refnc.variables[varname][:]
if v.ndim == 2:
for i in xrange(repeat): ref_vals = v
ref_vals[i,:] = data[:] else:
ref_vals = v[0,:]
if masked: else:
ref_vals.mask[i,:] = data.mask[:] ref_vals = refnc.variables[varname][:]
return ref_vals return ref_vals
def make_interp_test(varname, wrf_in, referent, multi=False, def make_interp_test(varname, dir, pattern, referent, multi=False,
repeat=3, pynio=False): pynio=False):
def test(self): def test(self):
try: try:
from netCDF4 import Dataset as NetCDF from netCDF4 import Dataset as NetCDF
@ -265,55 +226,44 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
except: except:
pass pass
if not multi: timeidx = 0 if not multi else None
timeidx = 0 pat = os.path.join(dir, pattern)
if not pynio: wrf_files = glob.glob(pat)
in_wrfnc = NetCDF(wrf_in) wrf_files.sort()
try:
in_wrfnc.set_auto_mask(False) wrfin = []
except: for fname in wrf_files:
pass
else:
# Note: Python doesn't like it if you reassign an outer scoped
# variable (wrf_in in this case)
if not wrf_in.endswith(".nc"):
wrf_file = wrf_in + ".nc"
else:
wrf_file = wrf_in
in_wrfnc = Nio.open_file(wrf_file)
else:
timeidx = None
if not pynio: if not pynio:
nc = NetCDF(wrf_in) f = NetCDF(fname)
try: try:
nc.set_auto_mask(False) f.set_auto_mask(False)
except: except:
pass pass
in_wrfnc = [nc for i in xrange(repeat)] wrfin.append(f)
else: else:
if not wrf_in.endswith(".nc"): if not fname.endswith(".nc"):
wrf_file = wrf_in + ".nc" _fname = fname + ".nc"
else: else:
wrf_file = wrf_in _fname = fname
nc = Nio.open_file(wrf_file) f = Nio.open_file(_fname)
in_wrfnc = [nc for i in xrange(repeat)] wrfin.append(f)
if (varname == "interplevel"): if (varname == "interplevel"):
ref_ht_500 = _get_refvals(referent, "z_500", repeat, multi) ref_ht_500 = _get_refvals(referent, "z_500", multi)
ref_p_5000 = _get_refvals(referent, "p_5000", repeat, multi) ref_p_5000 = _get_refvals(referent, "p_5000", multi)
ref_ht_multi = _get_refvals(referent, "z_multi", repeat, multi) ref_ht_multi = _get_refvals(referent, "z_multi", multi)
ref_p_multi = _get_refvals(referent, "p_multi", repeat, multi) ref_p_multi = _get_refvals(referent, "p_multi", multi)
ref_ht2_500 = _get_refvals(referent, "z2_500", repeat, multi) ref_ht2_500 = _get_refvals(referent, "z2_500", multi)
ref_p2_5000 = _get_refvals(referent, "p2_5000", repeat, multi) ref_p2_5000 = _get_refvals(referent, "p2_5000", multi)
ref_ht2_multi = _get_refvals(referent, "z2_multi", repeat, multi) ref_ht2_multi = _get_refvals(referent, "z2_multi", multi)
ref_p2_multi = _get_refvals(referent, "p2_multi", repeat, multi) ref_p2_multi = _get_refvals(referent, "p2_multi", multi)
ref_p_lev2d = _get_refvals(referent, "p_lev2d", repeat, multi) ref_p_lev2d = _get_refvals(referent, "p_lev2d", multi)
hts = getvar(in_wrfnc, "z", timeidx=timeidx) hts = getvar(wrfin, "z", timeidx=timeidx)
p = getvar(in_wrfnc, "pressure", timeidx=timeidx) p = getvar(wrfin, "pressure", timeidx=timeidx)
wspd_wdir = getvar(in_wrfnc, "wspd_wdir", timeidx=timeidx) wspd_wdir = getvar(wrfin, "wspd_wdir", timeidx=timeidx)
# Make sure the numpy versions work first # Make sure the numpy versions work first
hts_500 = interplevel(to_np(hts), to_np(p), 500) hts_500 = interplevel(to_np(hts), to_np(p), 500)
@ -346,7 +296,7 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
nt.assert_allclose(to_np(p_multi), ref_p_multi) nt.assert_allclose(to_np(p_multi), ref_p_multi)
nt.assert_allclose(to_np(p_multi), ref_p2_multi) nt.assert_allclose(to_np(p_multi), ref_p2_multi)
pblh = getvar(in_wrfnc, "PBLH", timeidx=timeidx) pblh = getvar(wrfin, "PBLH", timeidx=timeidx)
p_lev2d = interplevel(to_np(p), to_np(hts), to_np(pblh)) p_lev2d = interplevel(to_np(p), to_np(hts), to_np(pblh))
p_lev2d = interplevel(p, hts, pblh) p_lev2d = interplevel(p, hts, pblh)
nt.assert_allclose(to_np(p_lev2d), ref_p_lev2d) nt.assert_allclose(to_np(p_lev2d), ref_p_lev2d)
@ -382,17 +332,17 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
elif (varname == "vertcross"): elif (varname == "vertcross"):
ref_ht_cross = _get_refvals(referent, "ht_cross", repeat, multi) ref_ht_cross = _get_refvals(referent, "ht_cross", multi)
ref_p_cross = _get_refvals(referent, "p_cross", repeat, multi) ref_p_cross = _get_refvals(referent, "p_cross", multi)
ref_ht_vertcross1 = _get_refvals(referent, "ht_vertcross1", repeat, ref_ht_vertcross1 = _get_refvals(referent, "ht_vertcross1",
multi) multi)
ref_ht_vertcross2 = _get_refvals(referent, "ht_vertcross2", repeat, ref_ht_vertcross2 = _get_refvals(referent, "ht_vertcross2",
multi) multi)
ref_ht_vertcross3 = _get_refvals(referent, "ht_vertcross3", repeat, ref_ht_vertcross3 = _get_refvals(referent, "ht_vertcross3",
multi) multi)
hts = getvar(in_wrfnc, "z", timeidx=timeidx) hts = getvar(wrfin, "z", timeidx=timeidx)
p = getvar(in_wrfnc, "pressure", timeidx=timeidx) p = getvar(wrfin, "pressure", timeidx=timeidx)
pivot_point = CoordPair(hts.shape[-1] / 2, hts.shape[-2] / 2) pivot_point = CoordPair(hts.shape[-1] / 2, hts.shape[-2] / 2)
@ -423,7 +373,7 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
lon=lons[int(lons.shape[-2]/2), lon=lons[int(lons.shape[-2]/2),
int(lons.shape[-1]/2)]) int(lons.shape[-1]/2)])
v1 = vertcross(hts,p,wrfin=in_wrfnc,pivot_point=pivot_point, v1 = vertcross(hts,p,wrfin,pivot_point=pivot_point,
angle=90.0) angle=90.0)
v2 = vertcross(hts,p,projection=hts.attrs["projection"], v2 = vertcross(hts,p,projection=hts.attrs["projection"],
ll_point=ll_point, ll_point=ll_point,
@ -495,9 +445,9 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
elif (varname == "interpline"): elif (varname == "interpline"):
ref_t2_line = _get_refvals(referent, "t2_line", repeat, multi) ref_t2_line = _get_refvals(referent, "t2_line", multi)
t2 = getvar(in_wrfnc, "T2", timeidx=timeidx) t2 = getvar(wrfin, "T2", timeidx=timeidx)
pivot_point = CoordPair(t2.shape[-1] / 2, t2.shape[-2] / 2) pivot_point = CoordPair(t2.shape[-1] / 2, t2.shape[-2] / 2)
# Make sure the numpy version works # Make sure the numpy version works
@ -510,12 +460,17 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
# Test the manual projection method with lat/lon # Test the manual projection method with lat/lon
lats = t2.coords["XLAT"] lats = t2.coords["XLAT"]
lons = t2.coords["XLONG"] lons = t2.coords["XLONG"]
if multi:
lats = lats[0,:]
lons = lons[0,:]
ll_point = ll_points(lats, lons) ll_point = ll_points(lats, lons)
pivot = CoordPair(lat=lats[int(lats.shape[-2]/2), pivot = CoordPair(lat=lats[int(lats.shape[-2]/2),
int(lats.shape[-1]/2)], int(lats.shape[-1]/2)],
lon=lons[int(lons.shape[-2]/2), lon=lons[int(lons.shape[-2]/2),
int(lons.shape[-1]/2)]) int(lons.shape[-1]/2)])
l1 = interpline(t2,wrfin=in_wrfnc,pivot_point=pivot_point, l1 = interpline(t2,wrfin,pivot_point=pivot_point,
angle=90.0) angle=90.0)
l2 = interpline(t2,projection=t2.attrs["projection"], l2 = interpline(t2,projection=t2.attrs["projection"],
ll_point=ll_point, ll_point=ll_point,
@ -532,15 +487,15 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
nt.assert_allclose(to_np(t2_line1), to_np(t2_line2)) nt.assert_allclose(to_np(t2_line1), to_np(t2_line2))
elif (varname == "vinterp"): elif (varname == "vinterp"):
# Tk to theta # Tk to theta
fld_tk_theta = _get_refvals(referent, "fld_tk_theta", repeat, multi) fld_tk_theta = _get_refvals(referent, "fld_tk_theta", multi)
fld_tk_theta = np.squeeze(fld_tk_theta) fld_tk_theta = np.squeeze(fld_tk_theta)
tk = getvar(in_wrfnc, "temp", timeidx=timeidx, units="k") tk = getvar(wrfin, "temp", timeidx=timeidx, units="k")
interp_levels = [200,300,500,1000] interp_levels = [200,300,500,1000]
# Make sure the numpy version works # Make sure the numpy version works
field = vinterp(in_wrfnc, field = vinterp(wrfin,
field=to_np(tk), field=to_np(tk),
vert_coord="theta", vert_coord="theta",
interp_levels=interp_levels, interp_levels=interp_levels,
@ -549,7 +504,7 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
timeidx=timeidx, timeidx=timeidx,
log_p=True) log_p=True)
field = vinterp(in_wrfnc, field = vinterp(wrfin,
field=tk, field=tk,
vert_coord="theta", vert_coord="theta",
interp_levels=interp_levels, interp_levels=interp_levels,
@ -566,12 +521,12 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
nt.assert_allclose(to_np(field), fld_tk_theta, tol, atol) nt.assert_allclose(to_np(field), fld_tk_theta, tol, atol)
# Tk to theta-e # Tk to theta-e
fld_tk_theta_e = _get_refvals(referent, "fld_tk_theta_e", repeat, multi) fld_tk_theta_e = _get_refvals(referent, "fld_tk_theta_e", multi)
fld_tk_theta_e = np.squeeze(fld_tk_theta_e) fld_tk_theta_e = np.squeeze(fld_tk_theta_e)
interp_levels = [200,300,500,1000] interp_levels = [200,300,500,1000]
field = vinterp(in_wrfnc, field = vinterp(wrfin,
field=tk, field=tk,
vert_coord="theta-e", vert_coord="theta-e",
interp_levels=interp_levels, interp_levels=interp_levels,
@ -588,12 +543,12 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
nt.assert_allclose(to_np(field), fld_tk_theta_e, tol, atol) nt.assert_allclose(to_np(field), fld_tk_theta_e, tol, atol)
# Tk to pressure # Tk to pressure
fld_tk_pres = _get_refvals(referent, "fld_tk_pres", repeat, multi) fld_tk_pres = _get_refvals(referent, "fld_tk_pres", multi)
fld_tk_pres = np.squeeze(fld_tk_pres) fld_tk_pres = np.squeeze(fld_tk_pres)
interp_levels = [850,500] interp_levels = [850,500]
field = vinterp(in_wrfnc, field = vinterp(wrfin,
field=tk, field=tk,
vert_coord="pressure", vert_coord="pressure",
interp_levels=interp_levels, interp_levels=interp_levels,
@ -608,11 +563,11 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
nt.assert_allclose(to_np(field), fld_tk_pres, tol, atol) nt.assert_allclose(to_np(field), fld_tk_pres, tol, atol)
# Tk to geoht_msl # Tk to geoht_msl
fld_tk_ght_msl = _get_refvals(referent, "fld_tk_ght_msl", repeat, multi) fld_tk_ght_msl = _get_refvals(referent, "fld_tk_ght_msl", multi)
fld_tk_ght_msl = np.squeeze(fld_tk_ght_msl) fld_tk_ght_msl = np.squeeze(fld_tk_ght_msl)
interp_levels = [1,2] interp_levels = [1,2]
field = vinterp(in_wrfnc, field = vinterp(wrfin,
field=tk, field=tk,
vert_coord="ght_msl", vert_coord="ght_msl",
interp_levels=interp_levels, interp_levels=interp_levels,
@ -626,11 +581,11 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
nt.assert_allclose(to_np(field), fld_tk_ght_msl, tol, atol) nt.assert_allclose(to_np(field), fld_tk_ght_msl, tol, atol)
# Tk to geoht_agl # Tk to geoht_agl
fld_tk_ght_agl = _get_refvals(referent, "fld_tk_ght_agl", repeat, multi) fld_tk_ght_agl = _get_refvals(referent, "fld_tk_ght_agl", multi)
fld_tk_ght_agl = np.squeeze(fld_tk_ght_agl) fld_tk_ght_agl = np.squeeze(fld_tk_ght_agl)
interp_levels = [1,2] interp_levels = [1,2]
field = vinterp(in_wrfnc, field = vinterp(wrfin,
field=tk, field=tk,
vert_coord="ght_agl", vert_coord="ght_agl",
interp_levels=interp_levels, interp_levels=interp_levels,
@ -644,12 +599,12 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
nt.assert_allclose(to_np(field), fld_tk_ght_agl, tol, atol) nt.assert_allclose(to_np(field), fld_tk_ght_agl, tol, atol)
# Hgt to pressure # Hgt to pressure
fld_ht_pres = _get_refvals(referent, "fld_ht_pres", repeat, multi) fld_ht_pres = _get_refvals(referent, "fld_ht_pres", multi)
fld_ht_pres = np.squeeze(fld_ht_pres) fld_ht_pres = np.squeeze(fld_ht_pres)
z = getvar(in_wrfnc, "height", timeidx=timeidx, units="m") z = getvar(wrfin, "height", timeidx=timeidx, units="m")
interp_levels = [500,50] interp_levels = [500,50]
field = vinterp(in_wrfnc, field = vinterp(wrfin,
field=z, field=z,
vert_coord="pressure", vert_coord="pressure",
interp_levels=interp_levels, interp_levels=interp_levels,
@ -663,12 +618,12 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
nt.assert_allclose(to_np(field), fld_ht_pres, tol, atol) nt.assert_allclose(to_np(field), fld_ht_pres, tol, atol)
# Pressure to theta # Pressure to theta
fld_pres_theta = _get_refvals(referent, "fld_pres_theta", repeat, multi) fld_pres_theta = _get_refvals(referent, "fld_pres_theta", multi)
fld_pres_theta = np.squeeze(fld_pres_theta) fld_pres_theta = np.squeeze(fld_pres_theta)
p = getvar(in_wrfnc, "pressure", timeidx=timeidx) p = getvar(wrfin, "pressure", timeidx=timeidx)
interp_levels = [200,300,500,1000] interp_levels = [200,300,500,1000]
field = vinterp(in_wrfnc, field = vinterp(wrfin,
field=p, field=p,
vert_coord="theta", vert_coord="theta",
interp_levels=interp_levels, interp_levels=interp_levels,
@ -682,12 +637,12 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
nt.assert_allclose(to_np(field), fld_pres_theta, tol, atol) nt.assert_allclose(to_np(field), fld_pres_theta, tol, atol)
# Theta-e to pres # Theta-e to pres
fld_thetae_pres = _get_refvals(referent, "fld_thetae_pres", repeat, multi) fld_thetae_pres = _get_refvals(referent, "fld_thetae_pres", multi)
fld_thetae_pres = np.squeeze(fld_thetae_pres) fld_thetae_pres = np.squeeze(fld_thetae_pres)
eth = getvar(in_wrfnc, "eth", timeidx=timeidx) eth = getvar(wrfin, "eth", timeidx=timeidx)
interp_levels = [850,500,5] interp_levels = [850,500,5]
field = vinterp(in_wrfnc, field = vinterp(wrfin,
field=eth, field=eth,
vert_coord="pressure", vert_coord="pressure",
interp_levels=interp_levels, interp_levels=interp_levels,
@ -702,25 +657,31 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
return test return test
def extract_proj_params(wrfnc): def extract_proj_params(wrfnc, timeidx=0):
attrs = extract_global_attrs(wrfnc, ("MAP_PROJ", "TRUELAT1", "TRUELAT2", attrs = extract_global_attrs(wrfnc, ("MAP_PROJ", "TRUELAT1", "TRUELAT2",
"STAND_LON", "POLE_LAT", "POLE_LON", "STAND_LON", "POLE_LAT", "POLE_LON",
"DX", "DY")) "DX", "DY"))
result = {key.lower(): val for key,val in viewitems(attrs)} result = {key.lower(): val for key,val in viewitems(attrs)}
_timeidx = timeidx
if is_multi_file(wrfnc): if is_multi_file(wrfnc):
wrfnc = wrfnc[0] wrfnc0 = wrfnc[0]
num_times_per_file = len(wrfnc0.dimensions["Time"])
file_idx = timeidx // num_times_per_file
_timeidx = timeidx % num_times_per_file
wrfnc = wrfnc[file_idx]
result["known_x"] = 0 result["known_x"] = 0
result["known_y"] = 0 result["known_y"] = 0
result["ref_lat"] = wrfnc.variables["XLAT"][0,0,0] result["ref_lat"] = wrfnc.variables["XLAT"][_timeidx,0,0]
result["ref_lon"] = wrfnc.variables["XLONG"][0,0,0] result["ref_lon"] = wrfnc.variables["XLONG"][_timeidx,0,0]
return result return result
def make_latlon_test(testid, wrf_in, referent, single, multi=False, repeat=3, def make_latlon_test(testid, dir, pattern, referent, single,
pynio=False): multi=False, pynio=False):
def test(self): def test(self):
try: try:
from netCDF4 import Dataset as NetCDF from netCDF4 import Dataset as NetCDF
@ -732,38 +693,10 @@ def make_latlon_test(testid, wrf_in, referent, single, multi=False, repeat=3,
except: except:
pass pass
if not multi: timeidx = 0 if not multi else None
timeidx = 0 pat = os.path.join(dir, pattern)
if not pynio: wrf_files = glob.glob(pat)
in_wrfnc = NetCDF(wrf_in) wrf_files.sort()
try:
in_wrfnc.set_auto_mask(False)
except:
pass
else:
# Note: Python doesn't like it if you reassign an outer scoped
# variable (wrf_in in this case)
if not wrf_in.endswith(".nc"):
wrf_file = wrf_in + ".nc"
else:
wrf_file = wrf_in
in_wrfnc = Nio.open_file(wrf_file)
else:
timeidx = None
if not pynio:
nc = NetCDF(wrf_in)
try:
nc.set_auto_mask(False)
except:
pass
in_wrfnc = [nc for i in xrange(repeat)]
else:
if not wrf_in.endswith(".nc"):
wrf_file = wrf_in + ".nc"
else:
wrf_file = wrf_in
nc = Nio.open_file(wrf_file)
in_wrfnc = [nc for i in xrange(repeat)]
refnc = NetCDF(referent) refnc = NetCDF(referent)
try: try:
@ -771,74 +704,99 @@ def make_latlon_test(testid, wrf_in, referent, single, multi=False, repeat=3,
except: except:
pass pass
wrfin = []
for fname in wrf_files:
if not pynio:
f = NetCDF(fname)
try:
f.set_auto_mask(False)
except:
pass
wrfin.append(f)
else:
if not fname.endswith(".nc"):
_fname = fname + ".nc"
else:
_fname = fname
f = Nio.open_file(_fname)
wrfin.append(f)
if testid == "xy": if testid == "xy":
# Since this domain is not moving, the reference values are the
# same whether there are multiple or single files
ref_vals = refnc.variables["ij"][:]
# Lats/Lons taken from NCL script, just hard-coding for now # Lats/Lons taken from NCL script, just hard-coding for now
lats = [-55, -60, -65] lats = [22.0, 25.0, 27.0]
lons = [25, 30, 35] lons = [-90.0, -87.5, -83.75]
# Just call with a single lat/lon # Just call with a single lat/lon
if single: if single:
xy = ll_to_xy(in_wrfnc, lats[0], lons[0]) timeidx = 8
xy = xy + 1 # NCL uses fortran indexing ref_vals = refnc.variables["xy2"][:]
xy = ll_to_xy(wrfin, lats[0], lons[0], timeidx=timeidx,
as_int=True)
ref = ref_vals[:,0] ref = ref_vals[:,0]
nt.assert_allclose(to_np(xy), ref) nt.assert_allclose(to_np(xy), ref)
# Next make sure the 'proj' version works # Next make sure the 'proj' version works
projparams = extract_proj_params(in_wrfnc) projparams = extract_proj_params(wrfin, timeidx=timeidx)
xy_proj = ll_to_xy_proj(lats[0], lons[0], **projparams) xy_proj = ll_to_xy_proj(lats[0], lons[0],
as_int=True,
**projparams)
nt.assert_allclose(to_np(xy_proj), to_np(xy-1)) nt.assert_allclose(to_np(xy_proj), to_np(xy))
else: else:
xy = ll_to_xy(in_wrfnc, lats, lons) ref_vals = refnc.variables["xy1"][:]
xy = xy + 1 # NCL uses fortran indexing xy = ll_to_xy(wrfin, lats, lons, timeidx=None, as_int=False)
ref = ref_vals[:] ref = ref_vals[:]
nt.assert_allclose(to_np(xy), ref) nt.assert_allclose(to_np(xy), ref)
# Next make sure the 'proj' version works for tidx in range(9):
projparams = extract_proj_params(in_wrfnc)
xy_proj = ll_to_xy_proj(lats, lons, **projparams)
nt.assert_allclose(to_np(xy_proj), to_np(xy-1)) # Next make sure the 'proj' version works
projparams = extract_proj_params(wrfin, timeidx=tidx)
xy_proj = ll_to_xy_proj(lats, lons, as_int=False,
**projparams)
else: nt.assert_allclose(to_np(xy_proj), to_np(xy[:,tidx,:]))
# Since this domain is not moving, the reference values are the
# same whether there are multiple or single files
ref_vals = refnc.variables["ll"][:]
else:
# i_s, j_s taken from NCL script, just hard-coding for now # i_s, j_s taken from NCL script, just hard-coding for now
# NCL uses 1-based indexing for this, so need to subtract 1 # NCL uses 1-based indexing for this, so need to subtract 1
i_s = np.asarray([10, 100, 150], int) - 1 x_s = np.asarray([10, 50, 90], int)
j_s = np.asarray([10, 100, 150], int) - 1 y_s = np.asarray([10, 50, 90], int)
if single: if single:
ll = xy_to_ll(in_wrfnc, i_s[0], j_s[0]) timeidx=8
ref_vals = refnc.variables["ll2"][:]
ll = xy_to_ll(wrfin, x_s[0], y_s[0], timeidx=timeidx)
ref = ref_vals[::-1,0] ref = ref_vals[::-1,0]
nt.assert_allclose(to_np(ll), ref) nt.assert_allclose(to_np(ll), ref)
# Next make sure the 'proj' version works # Next make sure the 'proj' version works
projparams = extract_proj_params(in_wrfnc) projparams = extract_proj_params(wrfin, timeidx=8)
ll_proj = xy_to_ll_proj(i_s[0], j_s[0], **projparams) ll_proj = xy_to_ll_proj(x_s[0], y_s[0], **projparams)
nt.assert_allclose(to_np(ll_proj), to_np(ll)) nt.assert_allclose(to_np(ll_proj), to_np(ll))
else: else:
ll = xy_to_ll(in_wrfnc, i_s, j_s) ref_vals = refnc.variables["ll1"][:]
ll = xy_to_ll(wrfin, x_s, y_s, timeidx=None)
ref = ref_vals[::-1,:] ref = ref_vals[::-1,:]
nt.assert_allclose(to_np(ll), ref) nt.assert_allclose(to_np(ll), ref)
# Next make sure the 'proj' version works
projparams = extract_proj_params(in_wrfnc)
ll_proj = xy_to_ll_proj(i_s, j_s, **projparams)
nt.assert_allclose(to_np(ll_proj), to_np(ll)) for tidx in range(9):
# Next make sure the 'proj' version works
projparams = extract_proj_params(wrfin, timeidx=tidx)
ll_proj = xy_to_ll_proj(x_s, y_s, **projparams)
nt.assert_allclose(to_np(ll_proj), to_np(ll[:,tidx,:]))
return test return test
@ -878,16 +836,16 @@ if __name__ == "__main__":
if var in ignore_vars: if var in ignore_vars:
continue continue
test_func1 = make_test(var, TEST_FILE, OUT_NC_FILE) test_func1 = make_test(var, DIR, PATTERN, REF_NC_FILE)
test_func2 = make_test(var, TEST_FILE, OUT_NC_FILE, multi=True) test_func2 = make_test(var, DIR, PATTERN, REF_NC_FILE, multi=True)
setattr(WRFVarsTest, 'test_{0}'.format(var), test_func1) setattr(WRFVarsTest, 'test_{0}'.format(var), test_func1)
setattr(WRFVarsTest, 'test_multi_{0}'.format(var), test_func2) setattr(WRFVarsTest, 'test_multi_{0}'.format(var), test_func2)
for method in interp_methods: for method in interp_methods:
test_interp_func1 = make_interp_test(method, TEST_FILE, test_interp_func1 = make_interp_test(method, DIR, PATTERN,
OUT_NC_FILE) REF_NC_FILE)
test_interp_func2 = make_interp_test(method, TEST_FILE, test_interp_func2 = make_interp_test(method, DIR, PATTERN,
OUT_NC_FILE, multi=True) REF_NC_FILE, multi=True)
setattr(WRFInterpTest, 'test_{0}'.format(method), setattr(WRFInterpTest, 'test_{0}'.format(method),
test_interp_func1) test_interp_func1)
setattr(WRFInterpTest, 'test_multi_{0}'.format(method), setattr(WRFInterpTest, 'test_multi_{0}'.format(method),
@ -896,10 +854,11 @@ if __name__ == "__main__":
for testid in latlon_tests: for testid in latlon_tests:
for single in (True, False): for single in (True, False):
for multi in (True, False): for multi in (True, False):
test_ll_func = make_latlon_test(testid, TEST_FILE, test_ll_func = make_latlon_test(testid, DIR, PATTERN,
OUT_NC_FILE, REF_NC_FILE,
single=single, multi=multi, single=single,
repeat=3, pynio=False) multi=multi,
pynio=False)
multistr = "" if not multi else "_multi" multistr = "" if not multi else "_multi"
singlestr = "_nosingle" if not single else "_single" singlestr = "_nosingle" if not single else "_single"
test_name = "test_{}{}{}".format(testid, singlestr, test_name = "test_{}{}{}".format(testid, singlestr,
@ -915,18 +874,18 @@ if __name__ == "__main__":
if var in ignore_vars: if var in ignore_vars:
continue continue
test_func1 = make_test(var, TEST_FILE, OUT_NC_FILE, pynio=True) test_func1 = make_test(var, DIR, PATTERN, REF_NC_FILE, pynio=True)
test_func2 = make_test(var, TEST_FILE, OUT_NC_FILE, multi=True, test_func2 = make_test(var, DIR, PATTERN, REF_NC_FILE, multi=True,
pynio=True) pynio=True)
setattr(WRFVarsTest, 'test_pynio_{0}'.format(var), test_func1) setattr(WRFVarsTest, 'test_pynio_{0}'.format(var), test_func1)
setattr(WRFVarsTest, 'test_pynio_multi_{0}'.format(var), setattr(WRFVarsTest, 'test_pynio_multi_{0}'.format(var),
test_func2) test_func2)
for method in interp_methods: for method in interp_methods:
test_interp_func1 = make_interp_test(method, TEST_FILE, test_interp_func1 = make_interp_test(method, DIR, PATTERN,
OUT_NC_FILE) REF_NC_FILE)
test_interp_func2 = make_interp_test(method, TEST_FILE, test_interp_func2 = make_interp_test(method, DIR, PATTERN,
OUT_NC_FILE, multi=True) REF_NC_FILE, multi=True)
setattr(WRFInterpTest, 'test_pynio_{0}'.format(method), setattr(WRFInterpTest, 'test_pynio_{0}'.format(method),
test_interp_func1) test_interp_func1)
setattr(WRFInterpTest, 'test_pynio_multi_{0}'.format(method), setattr(WRFInterpTest, 'test_pynio_multi_{0}'.format(method),
@ -935,10 +894,11 @@ if __name__ == "__main__":
for testid in latlon_tests: for testid in latlon_tests:
for single in (True, False): for single in (True, False):
for multi in (True, False): for multi in (True, False):
test_ll_func = make_latlon_test(testid, TEST_FILE, test_ll_func = make_latlon_test(testid, DIR, PATTERN,
OUT_NC_FILE, REF_NC_FILE,
single=single, multi=multi, single=single,
repeat=3, pynio=False) multi=multi,
pynio=False)
multistr = "" if not multi else "_multi" multistr = "" if not multi else "_multi"
singlestr = "_nosingle" if not single else "_single" singlestr = "_nosingle" if not single else "_single"
test_name = "test_pynio_{}{}{}".format(testid, test_name = "test_pynio_{}{}{}".format(testid,

Loading…
Cancel
Save