forked from 3rdparty/wrf-python
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							178 lines
						
					
					
						
							5.7 KiB
						
					
					
				
			
		
		
	
	
							178 lines
						
					
					
						
							5.7 KiB
						
					
					
				| import unittest as ut | |
| import numpy.testing as nt | |
| import numpy as np | |
| import numpy.ma as ma | |
| import os | |
| import sys | |
| import subprocess | |
|  | |
| from wrf import (getvar, interplevel, interpline, vertcross, vinterp, | |
|                  disable_xarray, xarray_enabled, to_np, | |
|                  xy_to_ll, ll_to_xy, xy_to_ll_proj, ll_to_xy_proj, | |
|                  extract_global_attrs, viewitems, CoordPair, ll_points) | |
| from wrf.util import is_multi_file | |
|  | |
| IN_DIR = "/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/moving_nest" | |
| TEST_FILES = [os.path.join(IN_DIR, "wrfout_d02_2005-08-28_00:00:00"), | |
|               os.path.join(IN_DIR, "wrfout_d02_2005-08-28_12:00:00"), | |
|               os.path.join(IN_DIR, "wrfout_d02_2005-08-29_00:00:00")] | |
|  | |
|  | |
| def wrfin_gen(wrf_in): | |
|     for x in wrf_in: | |
|         yield x | |
|  | |
|  | |
| class wrf_in_iter_class(object): | |
|     def __init__(self, wrf_in): | |
|         self._wrf_in = wrf_in | |
|         self._total = len(wrf_in) | |
|         self._i = 0 | |
|  | |
|     def __iter__(self): | |
|         return self | |
|  | |
|     def next(self): | |
|         if self._i >= self._total: | |
|             raise StopIteration | |
|         else: | |
|             result = self._wrf_in[self._i] | |
|             self._i += 1 | |
|             return result | |
|  | |
|     # Python 3 | |
|     def __next__(self): | |
|         return self.next() | |
|  | |
|  | |
| def make_test(varname, wrf_in): | |
|     def test(self): | |
|         x = getvar(wrf_in, varname, 0) | |
|         xa = getvar(wrf_in, varname, None) | |
|  | |
|     return test | |
|  | |
|  | |
| def make_interp_test(varname, wrf_in): | |
|     def test(self): | |
|  | |
|         # Only testing vinterp since other interpolation just use variables | |
|         if (varname == "vinterp"): | |
|             for timeidx in (0, None): | |
|                 eth = getvar(wrf_in, "eth", timeidx=timeidx) | |
|                 interp_levels = [850, 500, 5] | |
|                 field = vinterp(wrf_in, | |
|                                 field=eth, | |
|                                 vert_coord="pressure", | |
|                                 interp_levels=interp_levels, | |
|                                 extrapolate=True, | |
|                                 field_type="theta-e", | |
|                                 timeidx=timeidx, | |
|                                 log_p=True) | |
|         else: | |
|             pass | |
|  | |
|     return test | |
|  | |
|  | |
| def make_latlon_test(testid, wrf_in): | |
|     def test(self): | |
|         if testid == "xy_out": | |
|             # Lats/Lons taken from NCL script, just hard-coding for now | |
|             lats = [-55, -60, -65] | |
|             lons = [25, 30, 35] | |
|             xy = ll_to_xy(wrf_in, lats, lons, timeidx=0) | |
|             xy = ll_to_xy(wrf_in, lats, lons, timeidx=None) | |
|         else: | |
|             i_s = np.asarray([10, 100, 150], int) | |
|             j_s = np.asarray([10, 100, 150], int) | |
|             ll = xy_to_ll(wrf_in, i_s, j_s, timeidx=0) | |
|             ll = xy_to_ll(wrf_in, i_s, j_s, timeidx=None) | |
|  | |
|     return test | |
|  | |
|  | |
| class WRFVarsTest(ut.TestCase): | |
|     longMessage = True | |
|  | |
|  | |
| class WRFInterpTest(ut.TestCase): | |
|     longMessage = True | |
|  | |
|  | |
| class WRFLatLonTest(ut.TestCase): | |
|     longMessage = True | |
|  | |
|  | |
| if __name__ == "__main__": | |
|     from wrf import (omp_set_num_threads, omp_set_schedule, omp_get_schedule, | |
|                      omp_set_dynamic, omp_get_num_procs, OMP_SCHED_STATIC) | |
|     omp_set_num_threads(omp_get_num_procs()-1) | |
|     omp_set_schedule(OMP_SCHED_STATIC, 0) | |
|     omp_set_dynamic(False) | |
|  | |
|     ignore_vars = []  # Not testable yet | |
|     wrf_vars = ["avo", "eth", "cape_2d", "cape_3d", "ctt", "dbz", "mdbz", | |
|                 "geopt", "helicity", "lat", "lon", "omg", "p", "pressure", | |
|                 "pvo", "pw", "rh2", "rh", "slp", "ter", "td2", "td", "tc", | |
|                 "theta", "tk", "tv", "twb", "updraft_helicity", "ua", "va", | |
|                 "wa", "uvmet10", "uvmet", "z", "cfrac", "zstag", "geopt_stag"] | |
|     interp_methods = ["interplevel", "vertcross", "interpline", "vinterp"] | |
|     latlon_tests = ["xy_out", "ll_out"] | |
|  | |
|     for nc_lib in ("netcdf4", "pynio", "scipy"): | |
|         if nc_lib == "netcdf4": | |
|             try: | |
|                 from netCDF4 import Dataset | |
|             except ImportError: | |
|                 print("netcdf4-python not installed") | |
|                 continue | |
|             else: | |
|                 test_in = [Dataset(x) for x in TEST_FILES] | |
|         elif nc_lib == "pynio": | |
|             try: | |
|                 from Nio import open_file | |
|             except ImportError: | |
|                 print("PyNIO not installed") | |
|                 continue | |
|             else: | |
|                 test_in = [open_file(x + ".nc", "r") for x in TEST_FILES] | |
|         elif nc_lib == "scipy": | |
|             try: | |
|                 from scipy.io.netcdf import netcdf_file | |
|             except ImportError: | |
|                 print("scipy.io.netcdf not installed") | |
|             else: | |
|                 test_in = [netcdf_file(x, mmap=False) for x in TEST_FILES] | |
|  | |
|         input0 = test_in[0] | |
|         input1 = test_in | |
|         input2 = tuple(input1) | |
|         input3 = wrfin_gen(test_in) | |
|         input4 = wrf_in_iter_class(test_in) | |
|         input5 = {"A": input1, | |
|                   "B": input2} | |
|         input6 = {"A": {"AA": input1}, | |
|                   "B": {"BB": input2}} | |
|  | |
|         for i, input in enumerate((input0, input1, input2, | |
|                                   input3, input4, input5, input6)): | |
|             for var in wrf_vars: | |
|                 if var in ignore_vars: | |
|                     continue | |
|                 test_func1 = make_test(var, input) | |
|  | |
|                 setattr(WRFVarsTest, "test_{0}_input{1}_{2}".format( | |
|                     nc_lib, i, var), test_func1) | |
|  | |
|             for method in interp_methods: | |
|                 test_interp_func1 = make_interp_test(method, input) | |
|                 setattr(WRFInterpTest, "test_{0}_input{1}_{2}".format( | |
|                     nc_lib, i, method), test_interp_func1) | |
|  | |
|             for testid in latlon_tests: | |
|                 test_ll_func = make_latlon_test(testid, input) | |
|                 test_name = "test_{0}_input{1}_{2}".format(nc_lib, i, testid) | |
|                 setattr(WRFLatLonTest, test_name, test_ll_func) | |
|  | |
|     ut.main()
 | |
| 
 |