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.
222 lines
6.8 KiB
222 lines
6.8 KiB
import unittest as ut |
|
from os.path import join, basename |
|
|
|
import numpy as np |
|
import matplotlib.pyplot as plt |
|
import matplotlib.cm as cm |
|
|
|
from netCDF4 import Dataset as NetCDF |
|
|
|
from wrf import get_proj_params |
|
from wrf.projection import getproj, RotatedLatLon, PolarStereographic |
|
|
|
PYNGL = True |
|
try: |
|
import Ngl |
|
except ImportError: |
|
PYNGL = False |
|
|
|
BASEMAP = True |
|
try: |
|
import mpl_toolkits.basemap |
|
except ImportError: |
|
BASEMAP = False |
|
|
|
CARTOPY = True |
|
try: |
|
from cartopy import crs, feature |
|
except ImportError: |
|
CARTOPY = False |
|
|
|
|
|
FILE_DIR = "/Users/ladwig/Documents/wrf_files/" |
|
WRF_FILES = [join(FILE_DIR, "norway", "geo_em.d01.nc"), |
|
join(FILE_DIR, "rotated_pole", "EAS_geo_em.d01.nc"), |
|
join(FILE_DIR, "rotated_pole", "EUR_geo_em.d01.nc"), |
|
join(FILE_DIR, "wrfout_d01_2016-02-25_18_00_00"), |
|
join(FILE_DIR, "wrfout_d01_2008-09-29_23-30-00"), |
|
join(FILE_DIR, "wrfout_d01_2010-06-13_21:00:00")] |
|
|
|
|
|
def nz_proj(): |
|
lats = np.array([[-47.824014, -47.824014], |
|
[-32.669853, -32.669853]]) |
|
lons = np.array([[163.839595, -179.693502], |
|
[163.839595, -179.693502]]) |
|
|
|
params = {"MAP_PROJ": 6, |
|
"CEN_LAT": -41.814869, |
|
"CEN_LON": 179.693502, |
|
"TRUELAT1": 0, |
|
"TRUELAT2": 0, |
|
"MOAD_CEN_LAT": -41.814869, |
|
"STAND_LON": 180.0 - 179.693502, |
|
"POLE_LAT": 48.185131, |
|
"POLE_LON": 0.0} |
|
|
|
return lats, lons, RotatedLatLon(lats=lats, lons=lons, **params) |
|
|
|
|
|
def argentina_proj(): |
|
lats = np.array([[-57.144064, -57.144064], |
|
[-21.154470, -21.154470]]) |
|
lons = np.array([[-86.893797, -37.089724], |
|
[-86.893797, -37.089724]]) |
|
|
|
params = {"MAP_PROJ": 6, |
|
"CEN_LAT": -39.222954, |
|
"CEN_LON": -65.980109, |
|
"TRUELAT1": 0, |
|
"TRUELAT2": 0, |
|
"MOAD_CEN_LAT": -39.222954, |
|
"STAND_LON": 180.0 - -65.980109, |
|
"POLE_LAT": 90 + -39.222954, |
|
"POLE_LON": 0.0} |
|
|
|
return lats, lons, RotatedLatLon(lats=lats, lons=lons, **params) |
|
|
|
|
|
def south_polar_proj(): |
|
lats = np.array([[-30.0, -30.0], |
|
[-30.0, -30.0]]) |
|
lons = np.array([[-120, 60], |
|
[-120, 60]]) |
|
|
|
params = {"MAP_PROJ": 2, |
|
"CEN_LAT": -90.0, |
|
"CEN_LON": 0, |
|
"TRUELAT1": -10.0, |
|
"MOAD_CEN_LAT": -90.0, |
|
"STAND_LON": 0} |
|
|
|
return lats, lons, PolarStereographic(lats=lats, lons=lons, **params) |
|
|
|
|
|
def north_polar_proj(): |
|
lats = np.array([[30.0, 30.0], |
|
[30.0, 30.0]]) |
|
lons = np.array([[-45, 140], |
|
[-45, 140]]) |
|
|
|
params = {"MAP_PROJ": 2, |
|
"CEN_LAT": 90.0, |
|
"CEN_LON": 10, |
|
"TRUELAT1": 10.0, |
|
"MOAD_CEN_LAT": 90.0, |
|
"STAND_LON": 10} |
|
|
|
return lats, lons, PolarStereographic(lats=lats, lons=lons, **params) |
|
|
|
|
|
def dateline_rot_proj(): |
|
lats = np.array([[60.627974, 60.627974], |
|
[71.717521, 71.717521]]) |
|
lons = np.array([[170.332771, -153.456292], |
|
[170.332771, -153.456292]]) |
|
|
|
params = {"MAP_PROJ": 6, |
|
"CEN_LAT": 66.335764, |
|
"CEN_LON": -173.143792, |
|
"TRUELAT1": 0, |
|
"TRUELAT2": 0, |
|
"MOAD_CEN_LAT": 66.335764, |
|
"STAND_LON": 173.143792, |
|
"POLE_LAT": 90.0 - 66.335764, |
|
"POLE_LON": 180.0} |
|
return lats, lons, RotatedLatLon(lats=lats, lons=lons, **params) |
|
|
|
|
|
class WRFProjTest(ut.TestCase): |
|
longMessage = True |
|
|
|
|
|
def make_test(wrf_file=None, fixed_case=None): |
|
if wrf_file is not None: |
|
ncfile = NetCDF(wrf_file) |
|
lats, lons, proj_params = get_proj_params(ncfile) |
|
proj = getproj(lats=lats, lons=lons, **proj_params) |
|
name_suffix = basename(wrf_file) |
|
elif fixed_case is not None: |
|
name_suffix = fixed_case |
|
if fixed_case == "south_rot": |
|
lats, lons, proj = nz_proj() |
|
elif fixed_case == "arg_rot": |
|
lats, lons, proj = argentina_proj() |
|
elif fixed_case == "south_polar": |
|
lats, lons, proj = south_polar_proj() |
|
elif fixed_case == "north_polar": |
|
lats, lons, proj = north_polar_proj() |
|
elif fixed_case == "dateline_rot": |
|
lats, lons, proj = dateline_rot_proj() |
|
|
|
print("wrf proj4: {}".format(proj.proj4())) |
|
if PYNGL: |
|
# PyNGL plotting |
|
wks_type = bytes("png") |
|
wks = Ngl.open_wks(wks_type, bytes("pyngl_{}".format(name_suffix))) |
|
mpres = proj.pyngl() |
|
map = Ngl.map(wks, mpres) |
|
|
|
Ngl.delete_wks(wks) |
|
|
|
if BASEMAP: |
|
# Basemap plotting |
|
fig = plt.figure(figsize=(10, 10)) |
|
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8]) |
|
|
|
# Define and plot the meridians and parallels |
|
min_lat = np.amin(lats) |
|
max_lat = np.amax(lats) |
|
min_lon = np.amin(lons) |
|
max_lon = np.amax(lons) |
|
|
|
parallels = np.arange(np.floor(min_lat), np.ceil(max_lat), |
|
(max_lat - min_lat)/5.0) |
|
meridians = np.arange(np.floor(min_lon), np.ceil(max_lon), |
|
(max_lon - min_lon)/5.0) |
|
|
|
bm = proj.basemap() |
|
bm.drawcoastlines(linewidth=.5) |
|
# bm.drawparallels(parallels,labels=[1,1,1,1],fontsize=10) |
|
# bm.drawmeridians(meridians,labels=[1,1,1,1],fontsize=10) |
|
print("basemap proj4: {}".format(bm.proj4string)) |
|
plt.savefig("basemap_{}.png".format(name_suffix)) |
|
plt.close(fig) |
|
|
|
if CARTOPY: |
|
# Cartopy plotting |
|
fig = plt.figure(figsize=(10, 10)) |
|
ax = plt.axes([0.1, 0.1, 0.8, 0.8], projection=proj.cartopy()) |
|
print("cartopy proj4: {}".format(proj.cartopy().proj4_params)) |
|
|
|
ax.coastlines('50m', linewidth=0.8) |
|
# print proj.x_extents() |
|
# print proj.y_extents() |
|
ax.set_xlim(proj.cartopy_xlim()) |
|
ax.set_ylim(proj.cartopy_ylim()) |
|
ax.gridlines() |
|
plt.savefig("cartopy_{}.png".format(name_suffix)) |
|
plt.close(fig) |
|
|
|
|
|
if __name__ == "__main__": |
|
for wrf_file in WRF_FILES: |
|
test_func = make_test(wrf_file=wrf_file) |
|
setattr(WRFProjTest, "test_proj", test_func) |
|
|
|
test_func2 = make_test(fixed_case="south_rot") |
|
setattr(WRFProjTest, "test_south_rot", test_func2) |
|
|
|
test_func3 = make_test(fixed_case="arg_rot") |
|
setattr(WRFProjTest, "test_arg_rot", test_func3) |
|
|
|
test_func4 = make_test(fixed_case="south_polar") |
|
setattr(WRFProjTest, "test_south_polar", test_func4) |
|
|
|
test_func5 = make_test(fixed_case="north_polar") |
|
setattr(WRFProjTest, "test_north_polar", test_func5) |
|
|
|
test_func6 = make_test(fixed_case="dateline_rot") |
|
setattr(WRFProjTest, "test_dateline_rot", test_func6) |
|
|
|
ut.main()
|
|
|