Browse Source

Merge branch 'feature/pep8' into develop

lon0
Bill Ladwig 6 years ago
parent
commit
ea6f040acd
  1. 10
      README.md
  2. 79
      chey_intel.py
  3. 10
      doc/source/_templates/product_table.txt
  4. 3
      doc/source/internal_api/index.rst
  5. 38
      fortran/build_help/sub_sizes.py
  6. 36
      fortran/wrf_wind.f90
  7. 46
      setup.py
  8. 18
      src/wrf/extension.py
  9. 68
      src/wrf/g_geoht.py
  10. 5
      src/wrf/routines.py
  11. 3
      test/ci_tests/make_test_file.py
  12. 38
      test/ci_tests/utests.py
  13. 138
      test/comp_utest.py
  14. 17
      test/ctt_test.py
  15. 8
      test/generator_test.py
  16. 40
      test/misc/extract_one_time.py
  17. 70
      test/misc/loop_and_fill_meta.py
  18. 35
      test/misc/mocktest.py
  19. 124
      test/misc/projtest.py
  20. 58
      test/misc/quiver_test.py
  21. 0
      test/misc/reduce_file.py
  22. 29
      test/misc/snippet.py
  23. 18
      test/misc/varcache.py
  24. 19
      test/misc/viewtest.py
  25. 230
      test/misc/wps.py
  26. 0
      test/ncl/listBug.ncl
  27. 30
      test/ncl/ncl_get_var.ncl
  28. 92
      test/ncl/ncl_vertcross.ncl
  29. 81
      test/ncl/refl10_cross.ncl
  30. 26
      test/ncl/rotated_test.ncl
  31. 21
      test/ncl/test_this.ncl
  32. 0
      test/ncl/test_vinterp.ncl
  33. 416
      test/ncl/wrf_user_vertcross.ncl
  34. 30
      test/snippet.py
  35. 52
      test/test_filevars.py
  36. 41
      test/test_inputs.py
  37. 42
      test/test_multi_cache.py
  38. 29
      test/test_omp.py
  39. 120
      test/test_proj_params.py
  40. 1
      test/test_units.py
  41. 576
      test/utests.py

10
README.md

@ -23,3 +23,13 @@ Citation @@ -23,3 +23,13 @@ Citation
Ladwig, W. (2017). wrf-python (Version x.x.x) [Software]. Boulder, Colorado: UCAR/NCAR. https://doi.org/10.5065/D6W094P1
Note: The version number x.x.x should be set to the version of wrf-python that you are using.
--------------------
*The National Center for Atmospheric Research is sponsored by the National
Science Foundation. Any opinions, findings and conclusions or recommendations
expressed in this material do not necessarily reflect the views of the
National Science Foundation.*

79
chey_intel.py

@ -13,7 +13,8 @@ compilers = ['IntelFCompiler', 'IntelVisualFCompiler', @@ -13,7 +13,8 @@ compilers = ['IntelFCompiler', 'IntelVisualFCompiler',
def intel_version_match(type):
# Match against the important stuff in the version string
return simple_version_match(start=r'Intel.*?Fortran.*?(?:%s).*?Version' % (type,))
return simple_version_match(
start=r'Intel.*?Fortran.*?(?:%s).*?Version'.format(type,))
class BaseIntelFCompiler(FCompiler):
@ -36,13 +37,13 @@ class IntelFCompiler(BaseIntelFCompiler): @@ -36,13 +37,13 @@ class IntelFCompiler(BaseIntelFCompiler):
possible_executables = ['ifort', 'ifc']
executables = {
'version_cmd' : None, # set by update_executables
'compiler_f77' : [None, "-72", "-w90", "-w95"],
'compiler_f90' : [None],
'compiler_fix' : [None, "-FI"],
'linker_so' : ["<F90>", "-shared"],
'archiver' : ["ar", "-cr"],
'ranlib' : ["ranlib"]
'version_cmd': None, # set by update_executables
'compiler_f77': [None, "-72", "-w90", "-w95"],
'compiler_f90': [None],
'compiler_fix': [None, "-FI"],
'linker_so': ["<F90>", "-shared"],
'archiver': ["ar", "-cr"],
'ranlib': ["ranlib"]
}
pic_flags = ['-fPIC']
@ -89,13 +90,13 @@ class IntelItaniumFCompiler(IntelFCompiler): @@ -89,13 +90,13 @@ class IntelItaniumFCompiler(IntelFCompiler):
possible_executables = ['ifort', 'efort', 'efc']
executables = {
'version_cmd' : None,
'compiler_f77' : [None, "-FI", "-w90", "-w95"],
'compiler_fix' : [None, "-FI"],
'compiler_f90' : [None],
'linker_so' : ['<F90>', "-shared"],
'archiver' : ["ar", "-cr"],
'ranlib' : ["ranlib"]
'version_cmd': None,
'compiler_f77': [None, "-FI", "-w90", "-w95"],
'compiler_fix': [None, "-FI"],
'compiler_f90': [None],
'linker_so': ['<F90>', "-shared"],
'archiver': ["ar", "-cr"],
'ranlib': ["ranlib"]
}
@ -104,18 +105,19 @@ class IntelEM64TFCompiler(IntelFCompiler): @@ -104,18 +105,19 @@ class IntelEM64TFCompiler(IntelFCompiler):
compiler_aliases = ()
description = 'Intel Fortran Compiler for 64-bit apps'
version_match = intel_version_match('EM64T-based|Intel\\(R\\) 64|64|IA-64|64-bit')
version_match = intel_version_match(
'EM64T-based|Intel\\(R\\) 64|64|IA-64|64-bit')
possible_executables = ['ifort', 'efort', 'efc']
executables = {
'version_cmd' : None,
'compiler_f77' : [None, "-FI"],
'compiler_fix' : [None, "-FI"],
'compiler_f90' : [None],
'linker_so' : ['<F90>', "-shared"],
'archiver' : ["ar", "-cr"],
'ranlib' : ["ranlib"]
'version_cmd': None,
'compiler_f77': [None, "-FI"],
'compiler_fix': [None, "-FI"],
'compiler_f90': [None],
'linker_so': ['<F90>', "-shared"],
'archiver': ["ar", "-cr"],
'ranlib': ["ranlib"]
}
def get_flags(self):
@ -147,13 +149,13 @@ class IntelVisualFCompiler(BaseIntelFCompiler): @@ -147,13 +149,13 @@ class IntelVisualFCompiler(BaseIntelFCompiler):
possible_executables = ['ifort', 'ifl']
executables = {
'version_cmd' : None,
'compiler_f77' : [None],
'compiler_fix' : [None],
'compiler_f90' : [None],
'linker_so' : [None],
'archiver' : [ar_exe, "/verbose", "/OUT:"],
'ranlib' : None
'version_cmd': None,
'compiler_f77': [None],
'compiler_fix': [None],
'compiler_f90': [None],
'linker_so': [None],
'archiver': [ar_exe, "/verbose", "/OUT:"],
'ranlib': None
}
compile_switch = '/c '
@ -163,7 +165,8 @@ class IntelVisualFCompiler(BaseIntelFCompiler): @@ -163,7 +165,8 @@ class IntelVisualFCompiler(BaseIntelFCompiler):
module_include_switch = '/I'
def get_flags(self):
opt = ['/nologo', '/MD', '/nbs', '/names:lowercase', '/assume:underscore']
opt = ['/nologo', '/MD', '/nbs', '/names:lowercase',
'/assume:underscore']
return opt
def get_flags_free(self):
@ -192,13 +195,13 @@ class IntelItaniumVisualFCompiler(IntelVisualFCompiler): @@ -192,13 +195,13 @@ class IntelItaniumVisualFCompiler(IntelVisualFCompiler):
ar_exe = IntelVisualFCompiler.ar_exe
executables = {
'version_cmd' : None,
'compiler_f77' : [None, "-FI", "-w90", "-w95"],
'compiler_fix' : [None, "-FI", "-4L72", "-w"],
'compiler_f90' : [None],
'linker_so' : ['<F90>', "-shared"],
'archiver' : [ar_exe, "/verbose", "/OUT:"],
'ranlib' : None
'version_cmd': None,
'compiler_f77': [None, "-FI", "-w90", "-w95"],
'compiler_fix': [None, "-FI", "-4L72", "-w"],
'compiler_f90': [None],
'linker_so': ['<F90>', "-shared"],
'archiver': [ar_exe, "/verbose", "/OUT:"],
'ranlib': None
}

10
doc/source/_templates/product_table.txt

@ -245,6 +245,16 @@ @@ -245,6 +245,16 @@
| | | | |
| | | mi | |
+--------------------+---------------------------------------------------------------+-----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| height_agl | Model Height for Mass Grid (AGL) | m | **units** (str) : Set to desired units. Default is *'m'*. |
| | | | |
| | | km | |
| | | | |
| | | dm | |
| | | | |
| | | ft | |
| | | | |
| | | mi | |
+--------------------+---------------------------------------------------------------+-----------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| zstag | Model Height for Vertically Staggered Grid | m | **msl** (boolean): Set to False to return AGL values. True is for MSL. Default is *True*. |
| | | | |
| | | km | **units** (str) : Set to desired units. Default is *'m'*. |

3
doc/source/internal_api/index.rst

@ -23,6 +23,9 @@ The routines below are called internally by :meth:`wrf.getvar`. @@ -23,6 +23,9 @@ The routines below are called internally by :meth:`wrf.getvar`.
wrf.g_dewpoint.get_dp_2m
wrf.g_geoht.get_geopt
wrf.g_geoht.get_height
wrf.g_geoht.get_height_agl
wrf.g_geoht.get_stag_geopt
wrf.g_geoht.get_stag_height
wrf.g_helicity.get_srh
wrf.g_helicity.get_uh
wrf.g_omega.get_omega

38
fortran/build_help/sub_sizes.py

@ -3,12 +3,13 @@ import os @@ -3,12 +3,13 @@ import os
from string import Template
import sys
def main():
print("Running sub_sizes")
print ("Running sub_sizes")
try:
result = subprocess.check_output(["./sizes"])
except:
except OSError:
result = subprocess.check_output(["sizes.exe"])
split_result = result.split()
@ -17,28 +18,27 @@ def main(): @@ -17,28 +18,27 @@ def main():
if split_result[0].strip().decode() != "SIZES":
raise ValueError("First line is not SIZES")
subs = {"FOMP_SCHED_KIND" : split_result[1].strip().decode(),
"FOMP_LOCK_KIND" : split_result[2].strip().decode(),
"FOMP_NEST_LOCK_KIND" : split_result[3].strip().decode(),
"FOMP_SCHED_STATIC" : split_result[4].strip().decode(),
"FOMP_SCHED_DYNAMIC" : split_result[5].strip().decode(),
"FOMP_SCHED_GUIDED" : split_result[6].strip().decode(),
"FOMP_SCHED_AUTO" : split_result[7].strip().decode()
subs = {"FOMP_SCHED_KIND": split_result[1].strip().decode(),
"FOMP_LOCK_KIND": split_result[2].strip().decode(),
"FOMP_NEST_LOCK_KIND": split_result[3].strip().decode(),
"FOMP_SCHED_STATIC": split_result[4].strip().decode(),
"FOMP_SCHED_DYNAMIC": split_result[5].strip().decode(),
"FOMP_SCHED_GUIDED": split_result[6].strip().decode(),
"FOMP_SCHED_AUTO": split_result[7].strip().decode()
}
else:
if split_result[0].strip() != "SIZES":
raise ValueError("First line is not SIZES")
subs = {"FOMP_SCHED_KIND" : split_result[1].strip(),
"FOMP_LOCK_KIND" : split_result[2].strip(),
"FOMP_NEST_LOCK_KIND" : split_result[3].strip(),
"FOMP_SCHED_STATIC" : split_result[4].strip(),
"FOMP_SCHED_DYNAMIC" : split_result[5].strip(),
"FOMP_SCHED_GUIDED" : split_result[6].strip(),
"FOMP_SCHED_AUTO" : split_result[7].strip()
subs = {"FOMP_SCHED_KIND": split_result[1].strip(),
"FOMP_LOCK_KIND": split_result[2].strip(),
"FOMP_NEST_LOCK_KIND": split_result[3].strip(),
"FOMP_SCHED_STATIC": split_result[4].strip(),
"FOMP_SCHED_DYNAMIC": split_result[5].strip(),
"FOMP_SCHED_GUIDED": split_result[6].strip(),
"FOMP_SCHED_AUTO": split_result[7].strip()
}
ompgen_temp_path = os.path.join("..", "ompgen.F90.template")
ompgen_out_path = os.path.join("..", "ompgen.F90")
@ -47,11 +47,11 @@ def main(): @@ -47,11 +47,11 @@ def main():
ompgen_string = ompgen_template.substitute(subs)
with open(ompgen_out_path, "w") as ompgen_out:
ompgen_out.write(ompgen_string)
print("End sub_sizes")
print ("End sub_sizes")
if __name__ == "__main__":
main()

36
fortran/wrf_wind.f90

@ -1,23 +1,21 @@ @@ -1,23 +1,21 @@
! NCLFORTSTART
SUBROUTINE DCOMPUTEWSPD(wspd, u, v, nx, ny)
SUBROUTINE DCOMPUTEWSPD(wspd, u, v, n)
IMPLICIT NONE
!f2py threadsafe
!f2py intent(in,out) :: wspd
INTEGER, INTENT(IN) :: nx, ny
REAL(KIND=8), DIMENSION(nx,ny), INTENT(OUT) :: wspd
REAL(KIND=8), DIMENSION(nx,ny), INTENT(IN) :: u, v
INTEGER, INTENT(IN) :: n
REAL(KIND=8), DIMENSION(n), INTENT(OUT) :: wspd
REAL(KIND=8), DIMENSION(n), INTENT(IN) :: u, v
! NCLEND
INTEGER i, j
INTEGER i
!$OMP PARALLEL DO COLLAPSE(2) SCHEDULE(runtime)
DO j = 1,ny
DO i = 1,nx
wspd(i,j) = SQRT(u(i,j)*u(i,j) + v(i,j)*v(i,j))
END DO
!$OMP PARALLEL DO SCHEDULE(runtime)
DO i = 1,n
wspd(i) = SQRT(u(i)*u(i) + v(i)*v(i))
END DO
!$OMP END PARALLEL DO
@ -25,7 +23,7 @@ END SUBROUTINE DCOMPUTEWSPD @@ -25,7 +23,7 @@ END SUBROUTINE DCOMPUTEWSPD
! NCLFORTSTART
SUBROUTINE DCOMPUTEWDIR(wdir, u, v, nx, ny)
SUBROUTINE DCOMPUTEWDIR(wdir, u, v, n)
USE wrf_constants, ONLY : DEG_PER_RAD
IMPLICIT NONE
@ -33,18 +31,16 @@ SUBROUTINE DCOMPUTEWDIR(wdir, u, v, nx, ny) @@ -33,18 +31,16 @@ SUBROUTINE DCOMPUTEWDIR(wdir, u, v, nx, ny)
!f2py threadsafe
!f2py intent(in,out) :: wdir
INTEGER, INTENT(IN) :: nx, ny
REAL(KIND=8), DIMENSION(nx,ny), INTENT(OUT) :: wdir
REAL(KIND=8), DIMENSION(nx,ny), INTENT(IN) :: u, v
INTEGER, INTENT(IN) :: n
REAL(KIND=8), DIMENSION(n), INTENT(OUT) :: wdir
REAL(KIND=8), DIMENSION(n), INTENT(IN) :: u, v
! NCLEND
INTEGER i, j
INTEGER i
!$OMP PARALLEL DO COLLAPSE(2) SCHEDULE(runtime)
DO j = 1,ny
DO i = 1,nx
wdir(i,j) = MOD(270.0 - ATAN2(v(i,j), u(i,j)) * DEG_PER_RAD, 360.)
END DO
!$OMP PARALLEL DO SCHEDULE(runtime)
DO i = 1,n
wdir(i) = MOD(270.0 - ATAN2(v(i), u(i)) * DEG_PER_RAD, 360.)
END DO
!$OMP END PARALLEL DO

46
setup.py

@ -31,8 +31,8 @@ else: @@ -31,8 +31,8 @@ else:
chey_intel.IntelEM64TFCompiler)
ext1 = numpy.distutils.core.Extension(
name = "wrf._wrffortran",
sources = ["fortran/wrf_constants.f90",
name="wrf._wrffortran",
sources=["fortran/wrf_constants.f90",
"fortran/wrf_testfunc.f90",
"fortran/wrf_user.f90",
"fortran/rip_cape.f90",
@ -55,9 +55,9 @@ with open("src/wrf/version.py") as f: @@ -55,9 +55,9 @@ with open("src/wrf/version.py") as f:
exec(f.read())
on_rtd = os.environ.get("READTHEDOCS", None) == "True"
#on_rtd=True
# on_rtd=True
if on_rtd:
if sys.version_info < (3,3):
if sys.version_info < (3, 3):
requirements = ["mock"] # for python2 and python < 3.3
else:
requirements = [] # for >= python3.3
@ -68,29 +68,29 @@ else: @@ -68,29 +68,29 @@ else:
with open("requirements.txt") as f2:
requirements = f2.read().strip().splitlines()
#if sys.version_info < (3,3):
# if sys.version_info < (3,3):
# requirements.append("mock")
ext_modules = [ext1]
numpy.distutils.core.setup(
author = "Bill Ladwig",
author_email = "ladwig@ucar.edu",
description = "Diagnostic and interpolation routines for WRF-ARW data.",
long_description = ("A collection of diagnostic and interpolation routines "
"to be used with WRF-ARW data.\n\n"
author="Bill Ladwig",
author_email="ladwig@ucar.edu",
description="Diagnostic and interpolation routines for WRF-ARW data.",
long_description=("A collection of diagnostic and interpolation "
"routines to be used with WRF-ARW data.\n\n"
"GitHub Repository:\n\n"
"https://github.com/NCAR/wrf-python\n\n"
"Documentation:\n\n"
"http://wrf-python.rtfd.org\n"),
url = "https://github.com/NCAR/wrf-python",
keywords = ["python", "wrf-python", "wrf", "forecast", "model",
url="https://github.com/NCAR/wrf-python",
keywords=["python", "wrf-python", "wrf", "forecast", "model",
"weather research and forecasting", "interpolation",
"plotting", "plots", "meteorology", "nwp",
"numerical weather prediction", "diagnostic",
"science", "numpy"],
install_requires = requirements,
classifiers = ["Development Status :: 5 - Production/Stable",
install_requires=requirements,
classifiers=["Development Status :: 5 - Production/Stable",
"Intended Audience :: Science/Research",
"Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License",
@ -106,14 +106,14 @@ numpy.distutils.core.setup( @@ -106,14 +106,14 @@ numpy.distutils.core.setup(
"Operating System :: Unix",
"Operating System :: MacOS",
"Operating System :: Microsoft :: Windows"],
name = "wrf-python",
platforms = ["any"],
license = "Apache License 2.0",
version = __version__,
packages = setuptools.find_packages("src"),
ext_modules = ext_modules,
package_dir = {"" : "src"},
download_url = "http://python.org/pypi/wrf-python",
package_data={"wrf" : ["data/psadilookup.dat"]},
name="wrf-python",
platforms=["any"],
license="Apache License 2.0",
version=__version__,
packages=setuptools.find_packages("src"),
ext_modules=ext_modules,
package_dir={"": "src"},
download_url="http://python.org/pypi/wrf-python",
package_data={"wrf": ["data/psadilookup.dat"]},
scripts=[]
)

18
src/wrf/extension.py

@ -949,12 +949,15 @@ def _wspd(u, v, outview=None): @@ -949,12 +949,15 @@ def _wspd(u, v, outview=None):
Located in wrf_wind.f90.
"""
shape = u.shape
if outview is None:
outview = np.empty_like(u)
result = dcomputewspd(outview,
u,
v)
result = dcomputewspd(outview.ravel(order="A"),
u.ravel(order="A"),
v.ravel(order="A"))
result = np.reshape(result, shape, order="F")
return result
@ -969,12 +972,15 @@ def _wdir(u, v, outview=None): @@ -969,12 +972,15 @@ def _wdir(u, v, outview=None):
Located in wrf_wind.f90.
"""
shape = u.shape
if outview is None:
outview = np.empty_like(u)
result = dcomputewdir(outview,
u,
v)
result = dcomputewdir(outview.ravel(order="A"),
u.ravel(order="A"),
v.ravel(order="A"))
result = np.reshape(result, shape, order="F")
return result

68
src/wrf/g_geoht.py

@ -391,3 +391,71 @@ def get_stag_height(wrfin, timeidx=0, method="cat", squeeze=True, @@ -391,3 +391,71 @@ def get_stag_height(wrfin, timeidx=0, method="cat", squeeze=True,
return _get_geoht(wrfin, timeidx, method, squeeze, cache, meta, _key,
True, msl, stag=True)
@set_height_metadata(geopt=False, stag=False)
@convert_units("height", "m")
def get_height_agl(wrfin, timeidx=0, method="cat", squeeze=True,
cache=None, meta=True, _key=None, units="m"):
"""Return the geopotential height (AGL).
The geopotential height is returned as Above Ground Level (AGL) by
subtracting the terrain height.
This functions extracts the necessary variables from the NetCDF file
object in order to perform the calculation.
Args:
wrfin (:class:`netCDF4.Dataset`, :class:`Nio.NioFile`, or an \
iterable): WRF-ARW NetCDF
data as a :class:`netCDF4.Dataset`, :class:`Nio.NioFile`
or an iterable sequence of the aforementioned types.
timeidx (:obj:`int` or :data:`wrf.ALL_TIMES`, optional): The
desired time index. This value can be a positive integer,
negative integer, or
:data:`wrf.ALL_TIMES` (an alias for None) to return
all times in the file or sequence. The default is 0.
method (:obj:`str`, optional): The aggregation method to use for
sequences. Must be either 'cat' or 'join'.
'cat' combines the data along the Time dimension.
'join' creates a new dimension for the file index.
The default is 'cat'.
squeeze (:obj:`bool`, optional): Set to False to prevent dimensions
with a size of 1 from being automatically removed from the shape
of the output. Default is True.
cache (:obj:`dict`, optional): A dictionary of (varname, ndarray)
that can be used to supply pre-extracted NetCDF variables to the
computational routines. It is primarily used for internal
purposes, but can also be used to improve performance by
eliminating the need to repeatedly extract the same variables
used in multiple diagnostics calculations, particularly when using
large sequences of files.
Default is None.
meta (:obj:`bool`, optional): Set to False to disable metadata and
return :class:`numpy.ndarray` instead of
:class:`xarray.DataArray`. Default is True.
_key (:obj:`int`, optional): A caching key. This is used for internal
purposes only. Default is None.
units (:obj:`str`): The desired units. Refer to the :meth:`getvar`
product table for a list of available units for 'height_agl'.
Default is 'm'.
Returns:
:class:`xarray.DataArray` or :class:`numpy.ndarray`: The
geopotential height.
If xarray is enabled and the *meta* parameter is True, then the result
will be a :class:`xarray.DataArray` object. Otherwise, the result will
be a :class:`numpy.ndarray` object with no metadata.
"""
return _get_geoht(wrfin, timeidx, method, squeeze, cache, meta, _key,
True, False)

5
src/wrf/routines.py

@ -8,7 +8,8 @@ from .g_cape import (get_2dcape, get_3dcape, get_cape2d_only, @@ -8,7 +8,8 @@ from .g_cape import (get_2dcape, get_3dcape, get_cape2d_only,
from .g_ctt import get_ctt
from .g_dbz import get_dbz, get_max_dbz
from .g_dewpoint import get_dp, get_dp_2m
from .g_geoht import get_geopt, get_height, get_stag_geopt, get_stag_height
from .g_geoht import (get_geopt, get_height, get_stag_geopt, get_stag_height,
get_height_agl)
from .g_helicity import get_srh, get_uh
from .g_latlon import get_lat, get_lon
from .g_omega import get_omega
@ -78,6 +79,7 @@ _FUNC_MAP = {"cape2d": get_2dcape, @@ -78,6 +79,7 @@ _FUNC_MAP = {"cape2d": get_2dcape,
"cloudfrac": get_cloudfrac,
"geopt_stag": get_stag_geopt,
"zstag": get_stag_height,
"height_agl": get_height_agl,
# Diagnostics below are extracted from multi-product diagnostics
"cape2d_only": get_cape2d_only,
"cin2d_only": get_cin2d_only,
@ -143,6 +145,7 @@ _VALID_KARGS = {"cape2d": ["missing"], @@ -143,6 +145,7 @@ _VALID_KARGS = {"cape2d": ["missing"],
"mid_thresh", "high_thresh"],
"geopt_stag": [],
"zstag": ["msl", "units"],
"height_agl": ["units"],
"cape2d_only": ["missing"],
"cin2d_only": ["missing"],
"lcl": ["missing"],

3
test/ci_tests/make_test_file.py

@ -131,7 +131,7 @@ def make_result_file(opts): @@ -131,7 +131,7 @@ def make_result_file(opts):
tk = getvar(infile, "temp", units="k")
interp_levels = [200,300,500,1000]
interp_levels = [200, 300, 500, 1000]
field = vinterp(infile,
field=tk,
@ -159,6 +159,7 @@ def make_result_file(opts): @@ -159,6 +159,7 @@ def make_result_file(opts):
ll = xy_to_ll(infile, x_s[0], y_s[0])
add_to_ncfile(outfile, ll, "ll")
def main(opts):
copy_and_reduce(opts)
make_result_file(opts)

38
test/ci_tests/utests.py

@ -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()

138
test/comp_utest.py

@ -4,7 +4,8 @@ import unittest as ut @@ -4,7 +4,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 netCDF4 import Dataset as nc
@ -21,36 +22,36 @@ NCGROUP = [NCFILE, NCFILE, NCFILE] @@ -21,36 +22,36 @@ NCGROUP = [NCFILE, NCFILE, NCFILE]
if sys.version_info > (3,):
xrange = range
ROUTINE_MAP = {"avo": avo,
"eth": eth,
"cape_2d": cape_2d,
"cape_3d": cape_3d,
"ctt": ctt,
"dbz": dbz,
"helicity": srhel,
"omg": omega,
"pvo": pvo,
"pw": pw,
"rh": rh,
"slp": slp,
"td": td,
"tk": tk,
"tv": tvirtual,
"twb": wetbulb,
"updraft_helicity": udhel,
"uvmet": uvmet,
"cloudfrac": cloudfrac}
ROUTINE_MAP = {"avo" : avo,
"eth" : eth,
"cape_2d" : cape_2d,
"cape_3d" : cape_3d,
"ctt" : ctt,
"dbz" : dbz,
"helicity" : srhel,
"omg" : omega,
"pvo" : pvo,
"pw" : pw,
"rh" : rh,
"slp" : slp,
"td" : td,
"tk" : tk,
"tv" : tvirtual,
"twb" : wetbulb,
"updraft_helicity" : udhel,
"uvmet" : uvmet,
"cloudfrac" : cloudfrac}
class ProjectionError(RuntimeError):
pass
def get_args(varname, wrfnc, timeidx, method, squeeze):
if varname == "avo":
ncvars = extract_vars(wrfnc, timeidx, ("U", "V", "MAPFAC_U",
"MAPFAC_V", "MAPFAC_M",
"F"),
method, squeeze, cache=None, meta=True)
varnames = ("U", "V", "MAPFAC_U", "MAPFAC_V", "MAPFAC_M", "F")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
attrs = extract_global_attrs(wrfnc, attrs=("DX", "DY"))
u = ncvars["U"]
@ -66,10 +67,10 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -66,10 +67,10 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (u, v, msfu, msfv, msfm, cor, dx, dy)
if varname == "pvo":
ncvars = extract_vars(wrfnc, timeidx, ("U", "V", "T", "P",
"PB", "MAPFAC_U",
"MAPFAC_V", "MAPFAC_M",
"F"),
varnames = ("U", "V", "T", "P", "PB", "MAPFAC_U", "MAPFAC_V",
"MAPFAC_M", "F")
ncvars = extract_vars(wrfnc, timeidx,
varnames,
method, squeeze, cache=None, meta=True)
attrs = extract_global_attrs(wrfnc, attrs=("DX", "DY"))
@ -92,7 +93,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -92,7 +93,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (u, v, full_t, full_p, msfu, msfv, msfm, cor, dx, dy)
if varname == "eth":
varnames=("T", "P", "PB", "QVAPOR")
varnames = ("T", "P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
t = ncvars["T"]
@ -107,7 +108,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -107,7 +108,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (qv, tkel, full_p)
if varname == "cape_2d":
varnames = ("T", "P", "PB", "QVAPOR", "PH","PHB", "HGT", "PSFC")
varnames = ("T", "P", "PB", "QVAPOR", "PH", "PHB", "HGT", "PSFC")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
@ -187,7 +188,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -187,7 +188,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
qice = np.zeros(qv.shape, qv.dtype)
haveqci = 0
else:
qice = icevars["QICE"] * 1000.0 #g/kg
qice = icevars["QICE"] * 1000.0 # g/kg
try:
cldvars = extract_vars(wrfnc, timeidx, "QCLOUD",
@ -195,7 +196,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -195,7 +196,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
except KeyError:
raise RuntimeError("'QCLOUD' not found in NetCDF file")
else:
qcld = cldvars["QCLOUD"] * 1000.0 #g/kg
qcld = cldvars["QCLOUD"] * 1000.0 # g/kg
full_p = p + pb
p_hpa = full_p * ConversionFactors.PA_TO_HPA
@ -269,8 +270,9 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -269,8 +270,9 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (u, v, z, ter)
if varname == "updraft_helicity":
ncvars = extract_vars(wrfnc, timeidx, ("W", "PH", "PHB", "MAPFAC_M"),
method, squeeze, cache=None, meta=True)
varnames = ("W", "PH", "PHB", "MAPFAC_M")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
wstag = ncvars["W"]
ph = ncvars["PH"]
@ -297,7 +299,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -297,7 +299,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (zstag, mapfct, u, v, wstag, dx, dy)
if varname == "omg":
varnames=("T", "P", "W", "PB", "QVAPOR")
varnames = ("T", "P", "W", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
t = ncvars["T"]
@ -314,7 +316,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -314,7 +316,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (qv, tkel, wa, full_p)
if varname == "pw":
varnames=("T", "P", "PB", "PH", "PHB", "QVAPOR")
varnames = ("T", "P", "PB", "PH", "PHB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
@ -335,7 +337,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -335,7 +337,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (full_p, tkel, qv, ht)
if varname == "rh":
varnames=("T", "P", "PB", "QVAPOR")
varnames = ("T", "P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
t = ncvars["T"]
@ -351,7 +353,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -351,7 +353,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (qvapor, full_p, tkel)
if varname == "slp":
varnames=("T", "P", "PB", "QVAPOR", "PH", "PHB")
varnames = ("T", "P", "PB", "QVAPOR", "PH", "PHB")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
@ -375,7 +377,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -375,7 +377,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (destag_ph, tkel, full_p, qvapor)
if varname == "td":
varnames=("P", "PB", "QVAPOR")
varnames = ("P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
@ -390,7 +392,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -390,7 +392,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (full_p, qvapor)
if varname == "tk":
varnames=("T", "P", "PB")
varnames = ("T", "P", "PB")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
t = ncvars["T"]
@ -403,7 +405,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -403,7 +405,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (full_p, full_t)
if varname == "tv":
varnames=("T", "P", "PB", "QVAPOR")
varnames = ("T", "P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
@ -419,7 +421,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -419,7 +421,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
return (tkel, qv)
if varname == "twb":
varnames=("T", "P", "PB", "QVAPOR")
varnames = ("T", "P", "PB", "QVAPOR")
ncvars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
t = ncvars["T"]
@ -449,9 +451,9 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -449,9 +451,9 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
map_proj_attrs = extract_global_attrs(wrfnc, attrs="MAP_PROJ")
map_proj = map_proj_attrs["MAP_PROJ"]
if map_proj in (0,3,6):
if map_proj in (0, 3, 6):
raise ProjectionError("Map projection does not need rotation")
elif map_proj in (1,2):
elif map_proj in (1, 2):
lat_attrs = extract_global_attrs(wrfnc, attrs=("TRUELAT1",
"TRUELAT2"))
radians_per_degree = Constants.PI/180.0
@ -463,15 +465,16 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -463,15 +465,16 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
lon_attrs = extract_global_attrs(wrfnc, attrs="STAND_LON")
except AttributeError:
try:
cen_lon_attrs = extract_global_attrs(wrfnc, attrs="CEN_LON")
cen_lon_attrs = extract_global_attrs(wrfnc,
attrs="CEN_LON")
except AttributeError:
raise RuntimeError("longitude attributes not found in NetCDF")
raise RuntimeError("longitude attributes not found in "
"NetCDF")
else:
cen_lon = cen_lon_attrs["CEN_LON"]
else:
cen_lon = lon_attrs["STAND_LON"]
varname = "XLAT"
xlat_var = extract_vars(wrfnc, timeidx, varname,
method, squeeze, cache=None, meta=True)
@ -485,13 +488,15 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -485,13 +488,15 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
if map_proj == 1:
if((fabs(true_lat1 - true_lat2) > 0.1) and
(fabs(true_lat2 - 90.) > 0.1)):
cone = (log(cos(true_lat1*radians_per_degree))
- log(cos(true_lat2*radians_per_degree)))
cone = (log(cos(true_lat1 * radians_per_degree))
- log(cos(true_lat2 * radians_per_degree)))
cone = (cone /
(log(tan((45.-fabs(true_lat1/2.))*radians_per_degree))
- log(tan((45.-fabs(true_lat2/2.))*radians_per_degree))))
(log(tan((45.-fabs(true_lat1/2.)) *
radians_per_degree))
- log(tan((45.-fabs(true_lat2/2.)) *
radians_per_degree))))
else:
cone = sin(fabs(true_lat1)*radians_per_degree)
cone = sin(fabs(true_lat1) * radians_per_degree)
else:
cone = 1
@ -499,8 +504,10 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -499,8 +504,10 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
if varname == "cloudfrac":
from wrf.g_geoht import get_height
vars = extract_vars(wrfnc, timeidx, ("P", "PB", "QVAPOR", "T"),
method, squeeze, cache=None, meta=True)
varnames = ("P", "PB", "QVAPOR", "T")
vars = extract_vars(wrfnc, timeidx, varnames, method, squeeze,
cache=None, meta=True)
p = vars["P"]
pb = vars["PB"]
@ -522,6 +529,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze): @@ -522,6 +529,7 @@ def get_args(varname, wrfnc, timeidx, method, squeeze):
class WRFVarsTest(ut.TestCase):
longMessage = True
def make_func(varname, wrfnc, timeidx, method, squeeze, meta):
def func(self):
@ -532,7 +540,7 @@ def make_func(varname, wrfnc, timeidx, method, squeeze, meta): @@ -532,7 +540,7 @@ def make_func(varname, wrfnc, timeidx, method, squeeze, meta):
routine = ROUTINE_MAP[varname]
kwargs = {"meta" : meta}
kwargs = {"meta": meta}
result = routine(*args, **kwargs)
ref = getvar(wrfnc, varname, timeidx, method, squeeze, cache=None,
@ -651,6 +659,7 @@ def test_cape2d_1d(wrfnc): @@ -651,6 +659,7 @@ def test_cape2d_1d(wrfnc):
return func
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)
@ -664,11 +673,6 @@ if __name__ == "__main__": @@ -664,11 +673,6 @@ if __name__ == "__main__":
"theta", "tk", "tv", "twb", "updraft_helicity", "ua", "va",
"wa", "uvmet10", "uvmet", "z", "cloudfrac"]
#varnames = ["helicity"]
varnames=["avo", "pvo", "eth", "dbz", "helicity", "updraft_helicity",
"omg", "pw", "rh", "slp", "td", "tk", "tv", "twb", "uvmet",
"cloudfrac", "ctt"]
omp_set_num_threads(omp_get_num_procs()-1)
omp_set_schedule(OMP_SCHED_STATIC, 0)
omp_set_dynamic(False)
@ -677,8 +681,8 @@ if __name__ == "__main__": @@ -677,8 +681,8 @@ if __name__ == "__main__":
varnames += ["cape_2d", "cape_3d"]
for varname in varnames:
for i,wrfnc in enumerate((NCFILE, NCGROUP)):
for j,timeidx in enumerate((0, ALL_TIMES)):
for i, wrfnc in enumerate((NCFILE, NCGROUP)):
for j, timeidx in enumerate((0, ALL_TIMES)):
for method in ("cat", "join"):
for squeeze in (True, False):
for meta in (True, False):
@ -686,10 +690,11 @@ if __name__ == "__main__": @@ -686,10 +690,11 @@ if __name__ == "__main__":
squeeze, meta)
ncname = "single" if i == 0 else "multi"
timename = "t0" if j == 0 else "all"
squeeze_name = "squeeze" if squeeze else "nosqueeze"
squeeze_name = ("squeeze" if squeeze
else "nosqueeze")
meta_name = "meta" if meta else "nometa"
test_name = "test_{}_{}_{}_{}_{}_{}".format(varname,
ncname, timename, method,
test_name = "test_{}_{}_{}_{}_{}_{}".format(
varname, ncname, timename, method,
squeeze_name, meta_name)
setattr(WRFVarsTest, test_name, func)
@ -700,7 +705,4 @@ if __name__ == "__main__": @@ -700,7 +705,4 @@ if __name__ == "__main__":
func = test_cape2d_1d(wrfnc)
setattr(WRFVarsTest, "test_cape2d_1d", func)
ut.main()

17
test/ctt_test.py

@ -4,10 +4,12 @@ from matplotlib.cm import get_cmap @@ -4,10 +4,12 @@ from matplotlib.cm import get_cmap
import cartopy.crs as crs
from cartopy.feature import NaturalEarthFeature
from wrf import to_np, getvar, smooth2d, get_cartopy, cartopy_xlim, cartopy_ylim, latlon_coords
from wrf import (to_np, getvar, smooth2d, get_cartopy, cartopy_xlim,
cartopy_ylim, latlon_coords)
# Open the NetCDF file
ncfile = Dataset("/Users/ladwig/Documents/wrf_files/problem_files/cfrac_bug/wrfout_d02_1987-10-01_00:00:00")
ncfile = Dataset("/Users/ladwig/Documents/wrf_files/"
"problem_files/cfrac_bug/wrfout_d02_1987-10-01_00:00:00")
# Get the sea level pressure
ctt = getvar(ncfile, "ctt")
@ -19,20 +21,23 @@ lats, lons = latlon_coords(ctt) @@ -19,20 +21,23 @@ lats, lons = latlon_coords(ctt)
cart_proj = get_cartopy(ctt)
# Create a figure
fig = plt.figure(figsize=(12,9))
fig = plt.figure(figsize=(12, 9))
# Set the GeoAxes to the projection used by WRF
ax = plt.axes(projection=cart_proj)
# Download and add the states and coastlines
states = NaturalEarthFeature(category='cultural', scale='50m', facecolor='none',
states = NaturalEarthFeature(category='cultural', scale='50m',
facecolor='none',
name='admin_1_states_provinces_shp')
ax.add_feature(states, linewidth=.5)
ax.coastlines('50m', linewidth=0.8)
# Make the contour outlines and filled contours for the smoothed sea level pressure.
# Make the contour outlines and filled contours for the smoothed sea level
# pressure.
plt.contour(to_np(lons), to_np(lats), to_np(ctt), 10, colors="black",
transform=crs.PlateCarree())
plt.contourf(to_np(lons), to_np(lats), to_np(ctt), 10, transform=crs.PlateCarree(),
plt.contourf(to_np(lons), to_np(lats), to_np(ctt), 10,
transform=crs.PlateCarree(),
cmap=get_cmap("jet"))
# Add a color bar

8
test/generator_test.py

@ -1,17 +1,19 @@ @@ -1,17 +1,19 @@
from __future__ import (absolute_import, division, print_function, unicode_literals)
from __future__ import (absolute_import, division, print_function,
unicode_literals)
from wrf import getvar
from netCDF4 import Dataset as nc
#ncfile = nc("/Users/ladwig/Documents/wrf_files/wrfout_d01_2016-02-25_18_00_00")
ncfile = nc("/Users/ladwig/Documents/wrf_files/wrfout_d01_2016-10-07_00_00_00")
def gen_seq():
wrfseq = [ncfile, ncfile, ncfile]
for wrf in wrfseq:
yield wrf
p_gen = getvar(gen_seq(), "P", method="join")
print(p_gen)
del p_gen

40
test/misc/extract_one_time.py

@ -0,0 +1,40 @@ @@ -0,0 +1,40 @@
from netCDF4 import Dataset
VARS_TO_KEEP = ("Times", "XLAT", "XLONG", "XLAT_U", "XLAT_V", "XLONG_U",
"XLONG_V", "U", "V", "W", "PH", "PHB", "T", "P", "PB", "Q2",
"T2", "PSFC", "U10", "V10", "XTIME", "QVAPOR", "QCLOUD",
"QGRAUP", "QRAIN", "QSNOW", "QICE", "MAPFAC_M", "MAPFAC_U",
"MAPFAC_V", "F", "HGT", "RAINC", "RAINSH", "RAINNC",
"I_RAINC", "I_RAINNC")
INPUT_FILE = "wrfout_d02_2005-08-28_00:00:00"
OUTPUT_FILE = "wrfout_problem_file"
DESIRED_TIME_INDEX = 0
with Dataset(INPUT_FILE) as infile, Dataset(OUTPUT_FILE, mode="w") as outfile:
# Copy the global attributes
outfile.setncatts(infile.__dict__)
# Copy Dimensions
for name, dimension in infile.dimensions.items():
if name != "Time":
dimsize = len(dimension)
outfile.createDimension(name, dimsize)
else:
outfile.createDimension(name, 1)
# Copy Variables
for name, variable in infile.variables.iteritems():
if name not in VARS_TO_KEEP:
continue
outvar = outfile.createVariable(name, variable.datatype,
variable.dimensions, zlib=True)
if len(variable.dimensions) > 1:
outvar[:] = variable[DESIRED_TIME_INDEX, :]
else:
outvar[:] = variable[DESIRED_TIME_INDEX]
outvar.setncatts(variable.__dict__)

70
test/misc/loop_and_fill_meta.py

@ -0,0 +1,70 @@ @@ -0,0 +1,70 @@
from __future__ import print_function, division
import os
import numpy as np
from netCDF4 import Dataset
from wrf import getvar, ALL_TIMES, to_np
import xarray
filename_list = ["/Users/ladwig/Documents/wrf_files/"
"wrf_vortex_single/wrfout_d02_2005-08-28_00:00:00",
"/Users/ladwig/Documents/wrf_files/wrf_vortex_single/"
"wrfout_d02_2005-08-28_03:00:00",
"/Users/ladwig/Documents/wrf_files/wrf_vortex_single/"
"wrfout_d02_2005-08-28_06:00:00",
"/Users/ladwig/Documents/wrf_files/wrf_vortex_single/"
"wrfout_d02_2005-08-28_09:00:00"]
result_shape = (4, 1, 96, 96)
# Let's get the first time so we can copy the metadata later
f = Dataset(filename_list[0])
# By setting squeeze to False, you'll get all the dimension names.
z1 = getvar(f, "T2", 0, squeeze=False)
xlat = getvar(f, "XLAT", 0)
xlong = getvar(f, "XLONG", 0)
z_final = np.empty(result_shape, np.float32)
# Modify this number if using more than 1 time per file
times_per_file = 1
data_times = []
xtimes = []
for timeidx in range(result_shape[0]):
# Compute the file index and the time index inside the file
fileidx = timeidx // times_per_file
file_timeidx = timeidx % times_per_file
f = Dataset(filename_list[fileidx])
z = getvar(f, "T2", file_timeidx)
t = getvar(f, "Times", file_timeidx)
xt = getvar(f, "xtimes", file_timeidx)
data_times.append(to_np(t))
xtimes.append(to_np(xt))
z_final[timeidx, :] = z[:]
f.close()
# Let's make the metadata. Dimension names should copy easily if you set
# sqeeze to False, otherwise you can just set them yourself is a tuple of
# dimension names. Since you wanted
# to keep the bottom_top dimension for this 2D variable (which is normally
# removed), I'm doing this manually.
z_dims = ["Time", "bottom_top", "south_north", "west_east"]
# Xarray doesn't copy coordinates easily (it always complains about shape
# mismatches), so do this manually
z_coords = {}
z_coords["Time"] = data_times
z_coords["XTIME"] = ("Time",), xtimes
z_coords["XLAT"] = ("south_north", "west_east"), xlat
z_coords["XLONG"] = ("south_north", "west_east"), xlong
z_name = "T2"
# Attributes copy nicely
z_attrs = {}
z_attrs.update(z1.attrs)
z_with_meta = xarray.DataArray(z_final, coords=z_coords, dims=z_dims,
attrs=z_attrs, name=z_name)

35
test/mocktest.py → test/misc/mocktest.py

@ -6,39 +6,48 @@ try: @@ -6,39 +6,48 @@ try:
except ImportError:
from mock import Mock as MagicMock
class Mock(MagicMock):
@classmethod
def __getattr__(cls, name):
return Mock()
MOCK_MODULES = ["numpy", "numpy.ma", "xarray", "cartopy",
"pandas", "matplotlib", "netCDF4", "mpl_toolkits.basemap",
"wrf._wrffortran"]
sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES)
consts = {"DEFAULT_FILL" : 9.9692099683868690E36,
"DEFAULT_FILL_INT8" : -127,
"DEFAULT_FILL_INT16" : -32767,
"DEFAULT_FILL_INT32" : -2147483647,
"DEFAULT_FILL_INT64" : -9223372036854775806,
"DEFAULT_FILL_FLOAT" : 9.9692099683868690E36,
"DEFAULT_FILL_DOUBLE" : 9.9692099683868690E36,
"fomp_sched_static" : 1,
"fomp_sched_dynamic" : 2,
"fomp_sched_guided" : 3,
"fomp_sched_auto" : 4}
consts = {"DEFAULT_FILL": 9.9692099683868690E36,
"DEFAULT_FILL_INT8": -127,
"DEFAULT_FILL_INT16": -32767,
"DEFAULT_FILL_INT32": -2147483647,
"DEFAULT_FILL_INT64": -9223372036854775806,
"DEFAULT_FILL_FLOAT": 9.9692099683868690E36,
"DEFAULT_FILL_DOUBLE": 9.9692099683868690E36,
"fomp_sched_static": 1,
"fomp_sched_dynamic": 2,
"fomp_sched_guided": 3,
"fomp_sched_auto": 4}
class MockWrfConstants(object):
def __init__(self):
self.__dict__ = consts
def mock_asscalar(val):
return float(val)
sys.modules["wrf._wrffortran"].wrf_constants = MockWrfConstants()
sys.modules["wrf._wrffortran"].omp_constants = MockWrfConstants()
sys.modules["numpy"].asscalar = mock_asscalar
import wrf
print (wrf.get_coord_pairs.__doc__)
try:
import wrf
except ImportError:
pass
print(wrf.get_coord_pairs.__doc__)

124
test/projtest.py → test/misc/projtest.py

@ -7,6 +7,8 @@ import matplotlib.cm as cm @@ -7,6 +7,8 @@ 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:
@ -27,15 +29,11 @@ except ImportError: @@ -27,15 +29,11 @@ except ImportError:
CARTOPY = False
from wrf import get_proj_params
from wrf.projection import getproj, RotatedLatLon, PolarStereographic
FILE_DIR = "/Users/ladwig/Documents/wrf_files/"
WRF_FILES = [
join(FILE_DIR, "norway", "geo_em.d01.nc"),
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_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")]
@ -46,63 +44,66 @@ def nz_proj(): @@ -46,63 +44,66 @@ def nz_proj():
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,
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}
"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,
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}
"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]])
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}
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]])
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}
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)
@ -113,20 +114,22 @@ def dateline_rot_proj(): @@ -113,20 +114,22 @@ def dateline_rot_proj():
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,
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}
"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)
@ -144,22 +147,22 @@ def make_test(wrf_file=None, fixed_case=None): @@ -144,22 +147,22 @@ def make_test(wrf_file=None, fixed_case=None):
elif fixed_case == "north_polar":
lats, lons, proj = north_polar_proj()
elif fixed_case == "dateline_rot":
lats,lons,proj = dateline_rot_proj()
lats, lons, proj = dateline_rot_proj()
print ("wrf proj4: {}".format(proj.proj4()))
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)))
wks = Ngl.open_wks(wks_type, bytes("pyngl_{}".format(name_suffix)))
mpres = proj.pyngl()
map = Ngl.map(wks,mpres)
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])
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)
@ -174,27 +177,28 @@ def make_test(wrf_file=None, fixed_case=None): @@ -174,27 +177,28 @@ def make_test(wrf_file=None, fixed_case=None):
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))
# 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))
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()
# 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)

58
test/misc/quiver_test.py

@ -0,0 +1,58 @@ @@ -0,0 +1,58 @@
from netCDF4 import Dataset
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.cm import get_cmap
import cartopy.crs as crs
from cartopy.feature import NaturalEarthFeature
from wrf import (getvar, interplevel, to_np, latlon_coords, get_cartopy,
cartopy_xlim, cartopy_ylim)
# Open the NetCDF file
ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00")
# Extract the pressure and wind variables
p = getvar(ncfile, "pressure")
# Note: This is m/s.
ua = getvar(ncfile, "ua")
va = getvar(ncfile, "va")
# Interpolate u, and v winds to 950 hPa
u_950 = interplevel(ua, p, 950)
v_950 = interplevel(va, p, 950)
# Get the lat/lon coordinates
lats, lons = latlon_coords(u_950)
# Get the map projection information
cart_proj = get_cartopy(u_950)
# Create the figure
fig = plt.figure(figsize=(12, 9))
ax = plt.axes(projection=cart_proj)
# Download and add the states and coastlines
states = NaturalEarthFeature(category='cultural', scale='50m',
facecolor='none',
name='admin_1_states_provinces_shp')
ax.add_feature(states, linewidth=0.5)
ax.coastlines('50m', linewidth=0.8)
# Add the 950 hPa wind barbs, only plotting every 'thin'ed barb. Adjust thin
# as needed. Also, no scaling is done for the arrows, so you might need to
# mess with the scale argument.
thin = 50
plt.quiver(to_np(lons[::thin, ::thin]), to_np(lats[::thin, ::thin]),
to_np(u_950[::thin, ::thin]), to_np(v_950[::thin, ::thin]),
transform=crs.PlateCarree())
# Set the map bounds
ax.set_xlim(cartopy_xlim(u_950))
ax.set_ylim(cartopy_ylim(v_950))
ax.gridlines()
plt.title("Arrows")
plt.show()

0
test/reduce_file.py → test/misc/reduce_file.py

29
test/misc/snippet.py

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
def main():
bm = Basemap(projection="rotpole",
o_lat_p=36.0,
o_lon_p=180.0,
llcrnrlat=-10.590603,
urcrnrlat=46.591976,
llcrnrlon=-139.08585,
urcrnrlon=22.661009,
lon_0=-106.0,
rsphere=6370000,
resolution='l')
fig = plt.figure(figsize=(8, 8))
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
bm.drawcoastlines(linewidth=.5)
print(bm.proj4string)
plt.savefig("basemap_map.png")
plt.close(fig)
if __name__ == "__main__":
main()

18
test/varcache.py → test/misc/varcache.py

@ -4,13 +4,18 @@ import time @@ -4,13 +4,18 @@ import time
from netCDF4 import Dataset
from wrf import getvar, ALL_TIMES, extract_vars
wrf_filenames = ["/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/moving_nest/wrfout_d02_2005-08-28_00:00:00",
"/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/moving_nest/wrfout_d02_2005-08-28_12:00:00",
"/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/moving_nest/wrfout_d02_2005-08-29_00:00:00"]
wrf_filenames = ["/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/"
"moving_nest/wrfout_d02_2005-08-28_00:00:00",
"/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/"
"moving_nest/wrfout_d02_2005-08-28_12:00:00",
"/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/"
"moving_nest/wrfout_d02_2005-08-29_00:00:00"]
wrfin = [Dataset(x) for x in wrf_filenames]
my_cache = extract_vars(wrfin, ALL_TIMES, ("P", "PB", "PH", "PHB", "T", "QVAPOR", "HGT", "U", "V", "W", "PSFC"))
my_cache = extract_vars(wrfin, ALL_TIMES,
("P", "PB", "PH", "PHB", "T", "QVAPOR", "HGT", "U",
"V", "W", "PSFC"))
start = time.time()
for var in ("avo", "eth", "cape_2d", "cape_3d", "ctt", "dbz", "mdbz",
@ -21,7 +26,7 @@ for var in ("avo", "eth", "cape_2d", "cape_3d", "ctt", "dbz", "mdbz", @@ -21,7 +26,7 @@ for var in ("avo", "eth", "cape_2d", "cape_3d", "ctt", "dbz", "mdbz",
v = getvar(wrfin, var, ALL_TIMES)
end = time.time()
print ("Time taken without variable cache: ", (end-start))
print("Time taken without variable cache: ", (end-start))
start = time.time()
for var in ("avo", "eth", "cape_2d", "cape_3d", "ctt", "dbz", "mdbz",
@ -32,5 +37,4 @@ for var in ("avo", "eth", "cape_2d", "cape_3d", "ctt", "dbz", "mdbz", @@ -32,5 +37,4 @@ for var in ("avo", "eth", "cape_2d", "cape_3d", "ctt", "dbz", "mdbz",
v = getvar(wrfin, var, ALL_TIMES, cache=my_cache)
end = time.time()
print ("Time taken with variable cache: ", (end-start))
print("Time taken with variable cache: ", (end-start))

19
test/viewtest.py → test/misc/viewtest.py

@ -1,26 +1,25 @@ @@ -1,26 +1,25 @@
# Test snippet for f2py
import numpy as np
import wrf._wrffortran
errlen = int(wrf._wrffortran.constants.errlen)
a = np.ones((3,3,3))
b = np.zeros((3,3,3,3))
a = np.ones((3, 3, 3))
b = np.zeros((3, 3, 3, 3))
c = np.zeros(errlen, "c")
errstat = np.array(0)
errmsg = np.zeros(errlen, "c")
c[:] = "Test String"
for i in xrange(2):
outview = b[i,:]
outview = b[i, :]
outview = outview.T
q = wrf._wrffortran.testfunc(a,outview,c,errstat=errstat,errmsg=errmsg)
print errstat
q = wrf._wrffortran.testfunc(a, outview, c, errstat=errstat,
errmsg=errmsg)
print(errstat)
str_bytes = (bytes(char).decode("utf-8") for char in errmsg[:])
print repr(errmsg)
print "".join(str_bytes).strip()
print(repr(errmsg))
print("".join(str_bytes).strip())

230
test/misc/wps.py

@ -0,0 +1,230 @@ @@ -0,0 +1,230 @@
# Hastily made script to read WPS intermediate files
from __future__ import print_function
import struct
import numpy as np
# Number of bytes used at the start and end of a fortran record to
# indicate the record size
SIZE_BYTES = 4
class WPSData(object):
def __init__(self, ifv=None, hdate=None, xfcst=None, map_source=None,
field=None, units=None, desc=None, xlvl=None, nx=None,
ny=None, iproj=None, startloc=None, startlat=None,
startlon=None, deltalat=None, deltalon=None, nlats=None,
dx=None, dy=None, xlonc=None, truelat1=None, truelat2=None,
earth_radius=None, is_wind_earth_rel=None, slab=None):
self.ifv = ifv
self.hdate = hdate
self.xfcst = xfcst
self.map_source = map_source
self.field = field
self.units = units
self.desc = desc
self.xlvl = xlvl
self.nx = nx
self.ny = ny
self.iproj = iproj
self.startloc = startloc
self.startlat = startlat
self.startlon = startlon
self.deltalat = deltalat
self.deltalon = deltalon
self.nlats = nlats
self.dx = dx
self.dy = dy
self.xlonc = xlonc
self.truelat1 = truelat1
self.truelat2 = truelat2
self.earth_radius = earth_radius
self.is_wind_earth_rel = is_wind_earth_rel
self.slab = slab
def _parse_record1(data):
result = {}
result["ifv"] = struct.unpack(">i", data)
return result
def _parse_record2(data):
result = {}
parsed = struct.unpack(">24sf32s9s25s46sfiii", data)
result["hdate"] = parsed[0]
result["xfcst"] = parsed[1]
result["map_source"] = parsed[2]
result["field"] = parsed[3]
result["units"] = parsed[4]
result["desc"] = parsed[5]
result["xlvl"] = parsed[6]
result["nx"] = parsed[7]
result["ny"] = parsed[8]
result["iproj"] = parsed[9]
return result
def _parse_record3(data, iproj):
result = {}
if iproj == 0:
fmt = ">8sfffff"
parsed = struct.unpack(fmt, data)
result["startloc"] = parsed[0]
result["startlat"] = parsed[1]
result["startlon"] = parsed[2]
result["deltalat"] = parsed[3]
result["deltalon"] = parsed[4]
result["earth_radius"] = parsed[5]
elif iproj == 1:
fmt = ">8sffffff"
parsed = struct.unpack(fmt, data)
result["startloc"] = parsed[0]
result["startlat"] = parsed[1]
result["startlon"] = parsed[2]
result["dx"] = parsed[3]
result["dy"] = parsed[4]
result["truelat1"] = parsed[5]
result["earth_radius"] = parsed[6]
elif iproj == 3:
fmt = ">8sffffffff"
parsed = struct.unpack(fmt, data)
result["startloc"] = parsed[0]
result["startlat"] = parsed[1]
result["startlon"] = parsed[2]
result["dx"] = parsed[3]
result["dy"] = parsed[4]
result["xlonc"] = parsed[5]
result["truelat1"] = parsed[6]
result["truelat2"] = parsed[7]
result["earth_radius"] = parsed[8]
elif iproj == 4:
fmt = ">8sfffff"
parsed = struct.unpack(fmt, data)
result["startloc"] = parsed[0]
result["startlat"] = parsed[1]
result["startlon"] = parsed[2]
result["nlats"] = parsed[3]
result["deltalon"] = parsed[4]
result["earth_radius"] = parsed[5]
elif iproj == 5:
fmt = ">8sfffffff"
parsed = struct.unpack(fmt, data)
result["startloc"] = parsed[0]
result["startlat"] = parsed[1]
result["startlon"] = parsed[2]
result["dx"] = parsed[3]
result["dy"] = parsed[4]
result["xlonc"] = parsed[5]
result["truelat1"] = parsed[6]
result["earth_radius"] = parsed[7]
return result
def _parse_record4(data):
result = {}
result["is_wind_earth_rel"] = struct.unpack(">i", data)
return result
def _parse_record5(data, nx, ny):
result = {}
size = nx * ny
fmt = ">{}f".format(size)
parsed = struct.unpack(fmt, data)
arr = np.array(parsed, dtype=np.float32)
result["slab"] = arr.reshape((nx, ny), order="F")
return result
_PARSE_MAP = {0: _parse_record1,
1: _parse_record2,
2: _parse_record3,
3: _parse_record4,
4: _parse_record5}
def parse_record(record_idx, data, iproj=None, nx=None, ny=None):
if record_idx == 0 or record_idx == 1 or record_idx == 3:
return _PARSE_MAP[record_idx](data)
elif record_idx == 2:
return _PARSE_MAP[record_idx](data, iproj)
elif record_idx == 4:
return _PARSE_MAP[record_idx](data, nx, ny)
def read_wps(wps_file, field=None):
with open(wps_file, "rb") as f:
wps_params = {}
record_list = []
raw_data = f.read()
record_size_idx = 0
end_of_file_idx = len(raw_data) - 1
while True:
iproj = None
nx = None
ny = None
keep_record = True
for record_idx in range(5):
# Each record has the size (in SIZE_BYTES bytes) at the
# start and end of each record. This might be compiler
# dependent though, so this might need to be modified.
# Also, the WPS files are stored big endian.
record_size = struct.unpack(
">i",
raw_data[record_size_idx: record_size_idx + SIZE_BYTES])
record_start = record_size_idx + SIZE_BYTES
record_end = record_start + record_size[0]
record_data = raw_data[record_start:record_end]
parsed_record = parse_record(record_idx, record_data, iproj,
nx, ny)
try:
field_name = parsed_record["field"].strip()
except KeyError:
pass
else:
if field is not None:
if field_name != field:
keep_record = False
try:
iproj = parsed_record["iproj"]
except KeyError:
pass
try:
nx = parsed_record["nx"]
except KeyError:
pass
try:
ny = parsed_record["ny"]
except KeyError:
pass
wps_params.update(parsed_record)
record_size_idx = record_end + SIZE_BYTES
if keep_record:
record_list.append(WPSData(**wps_params))
# Repeat for all record slabs
if record_end + SIZE_BYTES > end_of_file_idx:
break
return record_list

0
test/listBug.ncl → test/ncl/listBug.ncl

30
test/ncl_get_var.ncl → test/ncl/ncl_get_var.ncl

@ -32,7 +32,9 @@ @@ -32,7 +32,9 @@
"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", "height_agl" /]
"wa", "uvmet10", "uvmet", "z", "cfrac", "height_agl", \
"wspd_wdir", "wspd_wdir10", "uvmet_wspd_wdir", \
"uvmet10_wspd_wdir" /]
unique_dimname_list = NewList("fifo")
unique_dimsize_list = NewList("fifo")
@ -87,7 +89,7 @@ @@ -87,7 +89,7 @@
xopt@timeidx = time
xopt@linecoords = True
ht_vertcross1 = wrf_user_vertcross(z, p, pivot, xopt)
ht_vertcross1 = wrf_user_vert_cross(z, p, pivot, xopt)
fout->ht_vertcross1 = ht_vertcross1
@ -100,7 +102,7 @@ @@ -100,7 +102,7 @@
xopt@timeidx = time
xopt@linecoords = True
ht_vertcross2 = wrf_user_vertcross(z, p, pivot, xopt)
ht_vertcross2 = wrf_user_vert_cross(z, p, pivot, xopt)
ht_vertcross2!1 = "vertical2"
ht_vertcross2!2 = "cross_line_idx2"
@ -131,7 +133,7 @@ @@ -131,7 +133,7 @@
xopt@linecoords = True
xopt@autolevels = 1000
ht_vertcross3 = wrf_user_vertcross(z, p, start_end, xopt)
ht_vertcross3 = wrf_user_vert_cross(z, p, start_end, xopt)
ht_vertcross3!0 = "Time"
ht_vertcross3!1 = "vertical3"
@ -150,7 +152,7 @@ @@ -150,7 +152,7 @@
p_var := p(i,:,:,:)
z_var := z(i,:,:,:)
ht_vertcross := wrf_user_vertcross(z_var, p_var, start_end, xopt)
ht_vertcross := wrf_user_vert_cross(z_var, p_var, start_end, xopt)
dim0name = sprinti("vertical_t%i",i)
dim1name = sprinti("cross_line_idx_t%i",i)
@ -190,8 +192,8 @@ @@ -190,8 +192,8 @@
plev := 500. ; 500 MB
hlev := 5000 ; 5000 m
z2_500 = wrf_user_interplevel(z,p,plev,False)
p2_5000 = wrf_user_interplevel(p,z,hlev,False)
z2_500 = wrf_user_interp_level(z,p,plev,False)
p2_5000 = wrf_user_interp_level(p,z,hlev,False)
fout->z2_500 = z2_500
fout->p2_5000 = p2_5000
@ -199,8 +201,8 @@ @@ -199,8 +201,8 @@
plev := (/1000., 850., 500., 250./)
hlev := (/500., 2500., 5000., 10000. /)
z2_multi = wrf_user_interplevel(z,p,plev,False)
p2_multi = wrf_user_interplevel(p,z,hlev,False)
z2_multi = wrf_user_interp_level(z,p,plev,False)
p2_multi = wrf_user_interp_level(p,z,hlev,False)
fout->z2_multi = z2_multi
fout->p2_multi = p2_multi
@ -208,7 +210,7 @@ @@ -208,7 +210,7 @@
pblh = wrf_user_getvar(input_file, "PBLH", time)
opts := False
opts@inc2dlevs = True
p_lev2d = wrf_user_interplevel(p, z, pblh, opts)
p_lev2d = wrf_user_interp_level(p, z, pblh, opts)
fout->p_lev2d = p_lev2d
@ -234,7 +236,7 @@ @@ -234,7 +236,7 @@
xopt@timeidx = 0
xopt@linecoords = True
t2_line2 = wrf_user_interpline(t2, pivot, xopt)
t2_line2 = wrf_user_interp_line(t2, pivot, xopt)
fout->t2_line2 = t2_line2
@ -257,7 +259,7 @@ @@ -257,7 +259,7 @@
xopt@timeidx = 0
xopt@linecoords = True
t2_line3 = wrf_user_interpline(t2, start_end, xopt)
t2_line3 = wrf_user_interp_line(t2, start_end, xopt)
t2_line3!1 = "line_idx_t2_line3"
fout->t2_line3 = t2_line3
@ -270,7 +272,7 @@ @@ -270,7 +272,7 @@
name = sprinti("t2_line_t%i", i)
dim0name = sprinti("lineidx_t%i",i)
var := t2(i,:,:)
t2_line := wrf_user_interpline(var, start_end, xopt)
t2_line := wrf_user_interp_line(var, start_end, xopt)
t2_line!0 = dim0name
fout->$name$ = t2_line
end do
@ -286,7 +288,7 @@ @@ -286,7 +288,7 @@
xopt@timeidx = 0
xopt@linecoords = True
t2_line4 = wrf_user_interpline(t2, start_end, xopt)
t2_line4 = wrf_user_interp_line(t2, start_end, xopt)
t2_line4!0 = "t2_line4_idx"
fout->t2_line4 = t2_line4

92
test/ncl/ncl_vertcross.ncl

@ -0,0 +1,92 @@ @@ -0,0 +1,92 @@
input_file = addfile("/Users/ladwig/Documents/wrf_files/wrfout_d02_2010-06-13_21:00:00.nc", "r")
z = wrf_user_getvar(input_file, "z", 0) ; grid point height
p = wrf_user_getvar(input_file, "pressure", 0) ; total pressure
dimsz = dimsizes(z)
pivot = (/ (dimsz(2)-1)/2, (dimsz(1)-1)/2 /) ; pivot point is center of domain
; For the new cross section routine
xopt = True
xopt@use_pivot = True
xopt@angle = 45.0
;xopt@levels =
;xopt@latlon =
xopt@file_handle = input_file
;xopt@timeidx =
xopt@linecoords = True
ht_vertcross = wrf_user_vertcross(z, p, pivot, xopt)
printVarSummary(ht_vertcross)
print(min(ht_vertcross@lats))
print(min(ht_vertcross@lons))
print(max(ht_vertcross@lats))
print(max(ht_vertcross@lons))
xopt@use_pivot = False
xopt@angle = 0.0
;xopt@levels =
xopt@latlon = True
xopt@file_handle = input_file
xopt@timeidx = 0
xopt@linecoords = True
loc_param = (/-104.3632, 32.8562, -95.15308, 40.06575 /) ; pivot point is center of domain
ht_vertcross2 = wrf_user_vertcross(z, p, loc_param, xopt)
printVarSummary(ht_vertcross2)
print(min(ht_vertcross2@lats))
print(min(ht_vertcross2@lons))
print(max(ht_vertcross2@lats))
print(max(ht_vertcross2@lons))
print(ht_vertcross2@lats(190))
print(ht_vertcross2@lons(190))
xopt@use_pivot = True
xopt@angle = 45.0
;xopt@levels =
xopt@latlon = True
xopt@file_handle = input_file
xopt@timeidx = 0
xopt@linecoords = True
loc_param := (/-99.98572, 36.54949 /) ; pivot point is center of domain
ht_vertcross3 = wrf_user_vertcross(z, p, loc_param, xopt)
printVarSummary(ht_vertcross3)
print(min(ht_vertcross3@lats))
print(min(ht_vertcross3@lons))
print(max(ht_vertcross3@lats))
print(max(ht_vertcross3@lons))
xopt@use_pivot = True
xopt@angle = 45.0
xopt@levels = (/1000., 850., 700., 500., 250. /)
xopt@latlon = True
xopt@file_handle = input_file
xopt@timeidx = 0
xopt@linecoords = True
loc_param := (/-99.98572, 36.54949 /) ; pivot point is center of domain
ht_vertcross4 = wrf_user_vertcross(z, p, loc_param, xopt)
printVarSummary(ht_vertcross4)
print(min(ht_vertcross4@lats))
print(min(ht_vertcross4@lons))
print(max(ht_vertcross4@lats))
print(max(ht_vertcross4@lons))
o = True
o@returnInt = False
o@useTime = 0
l = wrf_user_ll_to_xy(input_file, -99.98572, 36.54949, o)
print(l)
l1 = wrf_user_xy_to_ll(input_file, l(1), l(0), o)
print(l1)

81
test/ncl/refl10_cross.ncl

@ -0,0 +1,81 @@ @@ -0,0 +1,81 @@
a = addfile("wrfout_d03_2017-04-03_06:00:00_ctrl","r")
time = 0
refl_10cm = wrf_user_getvar(a,"REFL_10CM",time)
z = wrf_user_getvar(a, "z", time)
lat = wrf_user_getvar(a, "lat", time)
lon = wrf_user_getvar(a, "lon", time)
; convert the lat/lon to x,y
start_lat = 20.9
start_lon = 92.5
end_lat = 29.2
end_lon = 92.5
opt = True
start_ij = wrf_user_ll_to_ij(a, start_lon, start_lat, opt)
start_ij = start_ij - 1
end_ij = wrf_user_ll_to_ij(a, end_lon, end_lat, opt)
end_ij = end_ij - 1
start_end = (/start_ij(0), start_ij(1), end_ij(0), end_ij(1)/)
lat_line = wrf_user_intrp2d(lat,start_end,0.0,True)
nlat = dimsizes(lat_line)
lon_line = wrf_user_intrp2d(lon,start_end,0.0,True)
refl_cross = wrf_user_intrp3d(refl_10cm,z,"v",start_end,0.,True)
; Need to make a vertical coordinate by using the same code as the
; cross section
; Currently, the vertical coordinate is not set, so let's do it
; manually. This will be fixed in the next version of NCL.
; If you want to set these levels yourself, you'll need to copy the
; code I sent before and manually set the levels in the cross section
; routine, then do it again here.
z_max = max(z)
z_min = 0.
dz = 0.01 * z_max
nlevels = tointeger( z_max/dz )
z_var2d = new( (/nlevels/), typeof(z))
z_var2d(0) = z_min
do i=1, nlevels-1
z_var2d(i) = z_var2d(0)+i*dz
end do
refl_cross&Vertical = z_var2d
wks = gsn_open_wks("png","cross")
cmap := read_colormap_file("BlAqGrYeOrReVi200")
cmap(0,:) = (/0,0,0,0/) ; make first color fully transparent
resx = True
resx@gsnMaximize = True
resx@lbLabelAutoStride = True ; default v6.1.0
resx@cnFillOn = True ; turn on color fill
resx@cnLinesOn = False ; turn lines on/off ; True is default
resx@cnLineLabelsOn = False ; turn line labels on/off ; True is default
resx@cnFillPalette = cmap
nLabels = 8 ; arbitrary
resx@tmXBLabels = new(nLabels,"string")
resx@tmXBMode = "Explicit"
resx@tmXBValues := toint(fspan(0,nlat-1,nLabels))
do i=0,nLabels-1
x = lon_line(i)
y = lat_line(i)
resx@tmXBLabels(i) = sprintf("%5.1f", y)+"~C~"+sprintf("%5.1f", x)
end do
resx@tiMainString = "Full South-North Grid Line X-Section"
plot1 = gsn_csm_contour(wks, refl_cross, resx )

26
test/ncl/rotated_test.ncl

@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
;---Open file and calculate slp.
a = addfile("/Users/ladwig/Documents/wrf_files/rotated_pole_test.nc","r")
t2 = wrf_user_getvar(a,"T2",0)
;---Start the graphics
wks = gsn_open_wks("x11","wrf")
;---Set some graphical resources
res = True
res@gsnMaximize = True
res@cnFillOn = True
res@tfDoNDCOverlay = True ; This is necessary if you don't
; set sfXArray/sfYArray
;---Add additional map resources
res = wrf_map_resources(a,res)
;---Change some of the resources that were set (these were set to "gray")
res@mpGeophysicalLineColor = "black"
res@mpNationalLineColor = "black"
res@mpUSStateLineColor = "black"
plot = gsn_csm_contour_map(wks,t2,res)

21
test/ncl/test_this.ncl

@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
ifils = systemfunc ("ls /Users/ladwig/Documents/wrf_files/wrf_vortex_single/wrfout_d02_*")
print(ifils)
a = addfiles(ifils, "r")
;a = addfile("/Users/ladwig/Documents/wrf_files/wrfout_d01_2010-06-13_21:00:00.nc", "r")
lats := (/22.0, 25.0, 27.0 /)
lons := (/-90.0, -87.5, -83.75 /)
opt = True
opt@useTime = -1
opt@returnI = False
xy = wrf_user_ll_to_xy(a, lons, lats, opt)
print(xy)
x_s = (/10, 50, 90 /)
y_s = (/10, 50, 90 /)
ll = wrf_user_xy_to_ll(a, x_s, y_s, opt)
print(ll)

0
test/test_vinterp.ncl → test/ncl/test_vinterp.ncl

416
test/ncl/wrf_user_vertcross.ncl

@ -0,0 +1,416 @@ @@ -0,0 +1,416 @@
;--------------------------------------------------------------------------------
undef("wrf_user_ll_to_xy")
function wrf_user_ll_to_xy( file_handle, longitude:numeric, latitude:numeric, \
opts_args:logical )
; This is the same as wrf_user_ll_to_ij, but returns 0-based indexes
begin
;
; As of NCL V6.0.0, wrf_user_ll_to_ij can now handle a file
; or a list of files.
;
if(typeof(file_handle).eq."file") then
ISFILE = True
nc_file = file_handle
elseif(typeof(file_handle).eq."list") then
ISFILE = False
nc_file = file_handle[0]
else
print("wrf_user_ll_to_xy: Error: the first argument must be a file or a list of files opened with addfile or addfiles")
return
end if
opts = opts_args
useT = get_res_value(opts,"useTime",0)
returnI= get_res_value(opts,"returnInt",True)
res = True
res@MAP_PROJ = nc_file@MAP_PROJ
res@TRUELAT1 = nc_file@TRUELAT1
res@TRUELAT2 = nc_file@TRUELAT2
res@STAND_LON = nc_file@STAND_LON
res@DX = nc_file@DX
res@DY = nc_file@DY
if (res@MAP_PROJ .eq. 6) then
res@POLE_LAT = nc_file@POLE_LAT
res@POLE_LON = nc_file@POLE_LON
res@LATINC = (res@DY*360.)/2.0/3.141592653589793/6370000.
res@LONINC = (res@DX*360.)/2.0/3.141592653589793/6370000.
else
res@POLE_LAT = 90.0
res@POLE_LON = 0.0
res@LATINC = 0.0
res@LONINC = 0.0
end if
if(isfilevar(nc_file,"XLAT"))
if(ISFILE) then
XLAT = nc_file->XLAT(useT,:,:)
XLONG = nc_file->XLONG(useT,:,:)
else
XLAT = file_handle[:]->XLAT
XLONG = file_handle[:]->XLONG
end if
else
if(ISFILE) then
XLAT = nc_file->XLAT_M(useT,:,:)
XLONG = nc_file->XLONG_M(useT,:,:)
else
XLAT = file_handle[:]->XLAT_M
XLONG = file_handle[:]->XLONG_M
end if
end if
if(dimsizes(dimsizes(XLAT)).eq.2) then
; Rank 2
res@REF_LAT = XLAT(0,0)
res@REF_LON = XLONG(0,0)
else
; Rank 3
res@REF_LAT = XLAT(useT,0,0)
res@REF_LON = XLONG(useT,0,0)
end if
res@KNOWNI = 1.0
res@KNOWNJ = 1.0
loc = wrf_ll_to_ij (longitude, latitude, res)
loc = loc - 1
if (dimsizes(dimsizes(loc)) .eq. 1) then
loc!0 = "x_y"
elseif (dimsizes(dimsizes(loc)) .eq. 2) then
loc!0 = "x_y"
loc!1 = "idx"
else ; Not currently supported
loc!0 = "x_y"
loc!1 = "domain_idx"
loc!2 = "idx"
end if
if ( returnI ) then
loci = new(dimsizes(loc),integer)
;loci@_FillValue = default_fillvalue("integer") ; was -999
loci = tointeger(loc + .5)
loci!0 = loc!0
return(loci)
else
return(loc)
end if
end
;--------------------------------------------------------------------------------
undef("wrf_user_xy_to_ll")
function wrf_user_xy_to_ll( file_handle, x:numeric, y:numeric, \
opts_args:logical )
begin
;
; As of NCL V6.0.0, wrf_user_ll_to_ij can now handle a file
; or a list of files.
;
if(typeof(file_handle).eq."file") then
ISFILE = True
nc_file = file_handle
elseif(typeof(file_handle).eq."list") then
ISFILE = False
nc_file = file_handle[0]
else
print("wrf_user_xy_to_ll: Error: the first argument must be a file or a list of files opened with addfile or addfiles")
return
end if
opts = opts_args
useT = get_res_value(opts,"useTime",0)
res = True
res@MAP_PROJ = nc_file@MAP_PROJ
res@TRUELAT1 = nc_file@TRUELAT1
res@TRUELAT2 = nc_file@TRUELAT2
res@STAND_LON = nc_file@STAND_LON
res@DX = nc_file@DX
res@DY = nc_file@DY
if (res@MAP_PROJ .eq. 6) then
res@POLE_LAT = nc_file@POLE_LAT
res@POLE_LON = nc_file@POLE_LON
res@LATINC = (res@DY*360.)/2.0/3.141592653589793/6370000.
res@LONINC = (res@DX*360.)/2.0/3.141592653589793/6370000.
else
res@POLE_LAT = 90.0
res@POLE_LON = 0.0
res@LATINC = 0.0
res@LONINC = 0.0
end if
if(isfilevar(nc_file,"XLAT")) then
if(ISFILE) then
XLAT = nc_file->XLAT(useT,:,:)
XLONG = nc_file->XLONG(useT,:,:)
else
XLAT = file_handle[:]->XLAT
XLONG = file_handle[:]->XLONG
end if
else
if(ISFILE) then
XLAT = nc_file->XLAT_M(useT,:,:)
XLONG = nc_file->XLONG_M(useT,:,:)
else
XLAT = file_handle[:]->XLAT_M
XLONG = file_handle[:]->XLONG_M
end if
end if
if(dimsizes(dimsizes(XLAT)).eq.2) then
; Rank 2
res@REF_LAT = XLAT(0,0)
res@REF_LON = XLONG(0,0)
else
; Rank 3
res@REF_LAT = XLAT(useT,0,0)
res@REF_LON = XLONG(useT,0,0)
end if
res@KNOWNI = 1.0
res@KNOWNJ = 1.0
; Convert to 1-based indexes for Fortran
new_x = x + 1
new_y = y + 1
loc = wrf_ij_to_ll (new_x,new_y,res)
if (dimsizes(dimsizes(loc)) .eq. 1) then
loc!0 = "lon_lat"
elseif (dimsizes(dimsizes(loc)) .eq. 2) then
loc!0 = "lon_lat"
loc!1 = "idx"
else ; Not currently supported
loc!0 = "lon_lat"
loc!1 = "domain_idx"
loc!2 = "idx"
end if
return(loc)
end
;--------------------------------------------------------------------------------
undef("wrf_user_vertcross")
function wrf_user_vertcross(var3d:numeric, z_in:numeric, \
loc_param:numeric, opts:logical )
; var3d - 3d field to interpolate (all input fields must be unstaggered)
; z_in - interpolate to this field (either p/z)
; loc_param - an array of 4 values representing the start point and end point
; for the cross section (start_x, start_y, end_x, end_y) OR a single
; point when opt@use_pivot is True representing the pivot point.
; The values can be in grid coordinates or lat/lon coordinates
; (start_x = start_lon, start_y = start_lat, ...). If using
; lat/lon coordinates, then opt@latlon must be True.
; opts - optional arguments
; use_pivot - set to True to indicate that loc_param and angle are used,
; otherwise loc_param is set to 4 values to indicate a start and
; end point
; angle - an angle for vertical plots - 90 represent a WE cross section,
; ignored if use_pivot is False.
; levels - the vertical levels to use in the same units as z_in. Set to
; False to automatically generate the number of levels specified
; by autolevels.
; latlon - set to True if the values in loc_param are latitude and longitude
; values rather than grid values
; file_handle - must be set to a file handle when latlon is True or
; linecoords is True, otherwise this is ignored.
; timeidx - the time index to use for moving nests when latlon is True. Set
; to 0 if the nest is not moving.
; linecoords - set to True to include the latitude and longitude coordinates
; for the cross section line in the output attributes.
; autolevels - set to the desired number of levels when levels are
; selected automatically (default 100).
begin
use_pivot = get_res_value(opts, "use_pivot", False)
angle = get_res_value(opts, "angle", 0.0)
levels = get_res_value(opts, "levels", new(1,integer))
latlon = get_res_value(opts, "latlon", False)
file_handle = get_res_value(opts, "file_handle", 0)
timeidx = get_res_value(opts, "timeidx", 0)
linecoords = get_res_value(opts, "linecoords", False)
nlevels = get_res_value(opts, "autolevels", 100)
dims = dimsizes(var3d)
nd = dimsizes(dims)
dimX = dims(nd-1)
dimY = dims(nd-2)
dimZ = dims(nd-3)
if ( nd .eq. 4 ) then
z = z_in(0,:,:,:)
else
z = z_in
end if
; Convert latlon to xy coordinates
if (use_pivot) then
if (latlon) then
opt = True
opt@returnInt = True
opt@useTime = timeidx
ij := wrf_user_ll_to_xy(file_handle, loc_param(0), loc_param(1), opt)
start_x = ij(0)
start_y = ij(1)
else
start_x = loc_param(0)
start_y = loc_param(1)
end if
else
if (latlon) then
opt = True
opt@returnInt = True
opt@useTime = timeidx
ij := wrf_user_ll_to_xy(file_handle, (/ loc_param(0), loc_param(2) /), (/ loc_param(1), loc_param(3) /), opt)
start_x = ij(0,0)
start_y = ij(1,0)
end_x = ij(0,1)
end_y = ij(1,1)
else
start_x = loc_param(0)
start_y = loc_param(1)
end_x = loc_param(2)
end_y = loc_param(3)
end if
end if
; get the lat/lons along the cross section line if requested
; set the cross section line coordinates if requested
if (linecoords) then
latname = "XLAT"
lonname = "XLONG"
if(.not. isfilevar(file_handle,"XLAT")) then
if(isfilevar(file_handle,"XLAT_M")) then
latname = "XLAT_M"
lonname = "XLONG_M"
end if
end if
latvar = _get_wrf_var(file_handle, latname, timeidx)
lonvar = _get_wrf_var(file_handle, lonname, timeidx)
if (use_pivot) then
loc := (/start_x, start_y/)
linelats = wrf_user_intrp2d(latvar, loc, angle, False)
linelons = wrf_user_intrp2d(lonvar, loc, angle, False)
else
loc := (/start_x, start_y, end_x, end_y /)
linelats = wrf_user_intrp2d(latvar, loc, angle, True)
linelons = wrf_user_intrp2d(lonvar, loc, angle, True)
end if
end if
; set vertical cross section
; Note for wrf_user_set_xy, opt is False when pivot and angle used.
if (use_pivot) then
xy = wrf_user_set_xy( z, start_x, start_y, \ ; assumes 0-based indexing in v6.5.0
0.0, 0.0, angle, False )
else
xy = wrf_user_set_xy( z, start_x, start_y, \ ; assumes 0-based indexing in v6.5.0
end_x, end_y, \
angle, True)
end if
xp = dimsizes(xy)
; first we interp z
var2dz = wrf_interp_2d_xy( z, xy)
; interp to constant z grid
if (all(ismissing(levels))) then
if(var2dz(0,0) .gt. var2dz(1,0) ) then ; monotonically decreasing coordinate
z_max = floor(max(z)/10)*10 ; bottom value
z_min = ceil(min(z)/10)*10 ; top value
dz = (1.0/nlevels) * (z_max - z_min)
;nlevels = tointeger( (z_max-z_min)/dz)
z_var2d = new( (/nlevels/), typeof(z))
z_var2d(0) = z_max
dz = -dz
else
z_max = max(z)
z_min = 0.
dz = (1.0/nlevels) * z_max
;nlevels = tointeger( z_max/dz )
z_var2d = new( (/nlevels/), typeof(z))
z_var2d(0) = z_min
end if
do i=1, nlevels-1
z_var2d(i) = z_var2d(0)+i*dz
end do
else
z_var2d = levels
nlevels = dimsizes(z_var2d)
end if
; interp the variable
if ( dimsizes(dims) .eq. 4 ) then
var2d = new( (/dims(0), nlevels, xp(0)/), typeof(var2dz))
do it = 0,dims(0)-1
var2dtmp = wrf_interp_2d_xy( var3d(it,:,:,:), xy)
do i=0,xp(0)-1
var2d(it,:,i) = wrf_interp_1d( var2dtmp(:,i), var2dz(:,i), z_var2d)
end do
end do
var2d!0 = var3d!0
var2d!1 = "vertical"
var2d!2 = "cross_line_idx"
else
var2d = new( (/nlevels, xp(0)/), typeof(var2dz))
var2dtmp = wrf_interp_2d_xy( var3d, xy)
do i=0,xp(0)-1
var2d(:,i) = wrf_interp_1d( var2dtmp(:,i), var2dz(:,i), z_var2d)
end do
var2d!0 = "vertical"
var2d!1 = "cross_line_idx"
end if
st_x = tointeger(xy(0,0)) ; + 1 (removed 1-based indexing in 6.5.0)
st_y = tointeger(xy(0,1)) ; + 1
ed_x = tointeger(xy(xp(0)-1,0)) ; + 1
ed_y = tointeger(xy(xp(0)-1,1)) ; + 1
if (.not. use_pivot) then
var2d@Orientation = "Cross-Section: (" + \
st_x + "," + st_y + ") to (" + \
ed_x + "," + ed_y + ")"
else
var2d@Orientation = "Cross-Section: (" + \
st_x + "," + st_y + ") to (" + \
ed_x + "," + ed_y + ") ; center=(" + \
start_x + "," + start_y + \
") ; angle=" + angle
end if
if (linecoords) then
var2d@lats = linelats
var2d@lons = linelons
end if
var2d&vertical = z_var2d
return(var2d)
end

30
test/snippet.py

@ -1,30 +0,0 @@ @@ -1,30 +0,0 @@
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
def main():
bm = Basemap(projection = "rotpole",
o_lat_p = 36.0,
o_lon_p = 180.0,
llcrnrlat = -10.590603,
urcrnrlat = 46.591976,
llcrnrlon = -139.08585,
urcrnrlon = 22.661009,
lon_0 = -106.0,
rsphere = 6370000,
resolution = 'l')
fig = plt.figure(figsize=(8,8))
ax = fig.add_axes([0.1,0.1,0.8,0.8])
bm.drawcoastlines(linewidth=.5)
print bm.proj4string
plt.savefig("basemap_map.png")
plt.close(fig)
if __name__ == "__main__":
main()

52
test/test_filevars.py

@ -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, ALL_TIMES
@ -21,38 +22,39 @@ if sys.version_info > (3,): @@ -21,38 +22,39 @@ if sys.version_info > (3,):
class WRFFileVarsTest(ut.TestCase):
longMessage = True
def make_test(ncfiles, varname):
def test(self):
#import time
#very_start = time.time()
#start = time.time()
# import time
# very_start = time.time()
# start = time.time()
t1 = getvar(ncfiles, varname, 0)
#end = time.time()
#print ("t1: ", start-end)
#start = time.time()
# end = time.time()
# print("t1: ", start-end)
# start = time.time()
t2 = getvar(ncfiles, varname, 0, meta=False)
#end = time.time()
#print ("t2: ", start-end)
#start = time.time()
# end = time.time()
# print("t2: ", start-end)
# start = time.time()
t3 = getvar(ncfiles, varname, ALL_TIMES)
#end = time.time()
#print ("t3: ", start-end)
#start = time.time()
# end = time.time()
# print("t3: ", start-end)
# start = time.time()
t4 = getvar(ncfiles, varname, ALL_TIMES, meta=False)
#end = time.time()
#print ("t4: ", start-end)
#start = time.time()
# end = time.time()
# print("t4: ", start-end)
# start = time.time()
t5 = getvar(ncfiles, varname, ALL_TIMES, method="join")
#end = time.time()
#print ("t5: ", start-end)
#start = time.time()
# end = time.time()
# print("t5: ", start-end)
# start = time.time()
t6 = getvar(ncfiles, varname, ALL_TIMES, method="join", meta=False)
#end = time.time()
#print ("t6: ", start-end)
#start = time.time()
# end = time.time()
# print("t6: ", start-end)
# start = time.time()
#print ("Total Time: ", (end-start))
# print("Total Time: ", (end-start))
return test
@ -60,8 +62,8 @@ if __name__ == "__main__": @@ -60,8 +62,8 @@ if __name__ == "__main__":
from netCDF4 import Dataset
ncfiles = [Dataset(x) for x in TEST_FILES]
#import scipy.io
#ncfiles = [scipy.io.netcdf.netcdf_file(x) for x in TEST_FILES]
# import scipy.io
# ncfiles = [scipy.io.netcdf.netcdf_file(x) for x in TEST_FILES]
file_vars = ncfiles[0].variables.keys()

41
test/test_inputs.py

@ -17,6 +17,7 @@ TEST_FILES = [os.path.join(IN_DIR, "wrfout_d02_2005-08-28_00:00:00"), @@ -17,6 +17,7 @@ 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
@ -51,6 +52,7 @@ def make_test(varname, wrf_in): @@ -51,6 +52,7 @@ def make_test(varname, wrf_in):
return test
def make_interp_test(varname, wrf_in):
def test(self):
@ -58,7 +60,7 @@ def make_interp_test(varname, wrf_in): @@ -58,7 +60,7 @@ def make_interp_test(varname, wrf_in):
if (varname == "vinterp"):
for timeidx in (0, None):
eth = getvar(wrf_in, "eth", timeidx=timeidx)
interp_levels = [850,500,5]
interp_levels = [850, 500, 5]
field = vinterp(wrf_in,
field=eth,
vert_coord="pressure",
@ -70,7 +72,6 @@ def make_interp_test(varname, wrf_in): @@ -70,7 +72,6 @@ def make_interp_test(varname, wrf_in):
else:
pass
return test
@ -94,12 +95,15 @@ def make_latlon_test(testid, wrf_in): @@ -94,12 +95,15 @@ def make_latlon_test(testid, wrf_in):
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)
@ -116,13 +120,12 @@ if __name__ == "__main__": @@ -116,13 +120,12 @@ if __name__ == "__main__":
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")
print("netcdf4-python not installed")
continue
else:
test_in = [Dataset(x) for x in TEST_FILES]
@ -130,15 +133,15 @@ if __name__ == "__main__": @@ -130,15 +133,15 @@ if __name__ == "__main__":
try:
from Nio import open_file
except ImportError:
print ("PyNIO not installed")
print("PyNIO not installed")
continue
else:
test_in = [open_file(x +".nc", "r") for x in TEST_FILES]
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")
print("scipy.io.netcdf not installed")
else:
test_in = [netcdf_file(x, mmap=False) for x in TEST_FILES]
@ -147,29 +150,25 @@ if __name__ == "__main__": @@ -147,29 +150,25 @@ if __name__ == "__main__":
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}}
input5 = {"A": input1,
"B": input2}
input6 = {"A": {"AA": input1},
"B": {"BB": input2}}
for i,input in enumerate((input0, input1, 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)
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)
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)
@ -177,5 +176,3 @@ if __name__ == "__main__": @@ -177,5 +176,3 @@ if __name__ == "__main__":
setattr(WRFLatLonTest, test_name, test_ll_func)
ut.main()

42
test/test_multi_cache.py

@ -3,56 +3,60 @@ from wrf.cache import _get_cache @@ -3,56 +3,60 @@ from wrf.cache import _get_cache
from wrf import getvar
from netCDF4 import Dataset as nc
#a = nc("/Users/ladwig/Documents/wrf_files/wrf_vortex_single/wrfout_d02_2005-08-28_00:00:00")
#b = nc("/Users/ladwig/Documents/wrf_files/wrf_vortex_single/wrfout_d02_2005-08-28_03:00:00")
a = nc("/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/moving_nest/wrfout_d02_2005-08-28_00:00:00")
b = nc("/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/moving_nest/wrfout_d02_2005-08-28_12:00:00")
q = {"outoutoutout" : {"outoutout" : {"outout" : {"out1" : {"blah" : [a,b], "blah2" : [a,b]}, "out2" : {"blah" : [a,b], "blah2" : [a,b]} } } } }
a = nc("/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/moving_nest/"
"wrfout_d02_2005-08-28_00:00:00")
b = nc("/Users/ladwig/Documents/wrf_files/wrf_vortex_multi/moving_nest/"
"wrfout_d02_2005-08-28_12:00:00")
q = {"outoutoutout":
{"outoutout":
{"outout":
{"out1": {"blah": [a, b], "blah2": [a, b]},
"out2": {"blah": [a, b], "blah2": [a, b]}}}}}
t1 = time.time()
c = getvar(q, "rh", method="cat", timeidx=None, squeeze=True)
t2 = time.time()
print (c)
print ("time taken: {}".format((t2-t1)*1000.))
print(c)
print("time taken: {}".format((t2-t1)*1000.))
t1 = time.time()
c = getvar(q, "rh", method="cat", timeidx=None, squeeze=False)
t2 = time.time()
print (c)
print ("time taken: {}".format((t2-t1)*1000.))
print(c)
print("time taken: {}".format((t2-t1)*1000.))
t1 = time.time()
c = getvar(q, "rh", method="cat", timeidx=1, squeeze=True)
t2 = time.time()
print (c)
print ("time taken: {}".format((t2-t1)*1000.))
print(c)
print("time taken: {}".format((t2-t1)*1000.))
t1 = time.time()
c = getvar(q, "rh", method="cat", timeidx=1, squeeze=False)
t2 = time.time()
print(c)
print ("time taken: {}".format((t2-t1)*1000.))
print("time taken: {}".format((t2-t1)*1000.))
t1 = time.time()
c = getvar(q, "rh", method="join", timeidx=None, squeeze=True)
t2 = time.time()
print (c)
print ("time taken: {}".format((t2-t1)*1000.))
print(c)
print("time taken: {}".format((t2-t1)*1000.))
t1 = time.time()
c = getvar(q, "rh", method="join", timeidx=None, squeeze=False)
t2 = time.time()
print(c)
print ("time taken: {}".format((t2-t1)*1000.))
print("time taken: {}".format((t2-t1)*1000.))
t1 = time.time()
c = getvar(q, "rh", method="join", timeidx=1, squeeze=True)
t2 = time.time()
print (c)
print ("time taken: {}".format((t2-t1)*1000.))
print(c)
print("time taken: {}".format((t2-t1)*1000.))
t1 = time.time()
c = getvar(q, "rh", method="join", timeidx=1, squeeze=False)
t2 = time.time()
print (c)
print ("time taken: {}".format((t2-t1)*1000.))
print(c)
print("time taken: {}".format((t2-t1)*1000.))

29
test/test_omp.py

@ -28,11 +28,11 @@ class OmpTest(ut.TestCase): @@ -28,11 +28,11 @@ class OmpTest(ut.TestCase):
longMessage = True
def test_locks(self):
l = omp_init_lock()
omp_set_lock(l)
omp_unset_lock(l)
omp_test_lock(l)
omp_destroy_lock(l)
lk = omp_init_lock()
omp_set_lock(lk)
omp_unset_lock(lk)
omp_test_lock(lk)
omp_destroy_lock(lk)
nl = omp_init_nest_lock()
omp_set_nest_lock(nl)
@ -40,24 +40,25 @@ class OmpTest(ut.TestCase): @@ -40,24 +40,25 @@ class OmpTest(ut.TestCase):
omp_test_nest_lock(nl)
omp_destroy_nest_lock(nl)
def test_thread_set(self):
omp_set_num_threads(4)
max_threads = omp_get_max_threads()
self.assertEqual(max_threads, 4)
num_threads = omp_get_num_threads()
self.assertEqual(num_threads, 1) # Always 1 outside of parallel region
# Always 1 outside of parallel region
self.assertEqual(num_threads, 1)
thread_num = omp_get_thread_num()
self.assertEqual(thread_num, 0) # Always 0 outside of parallel region
# Always 0 outside of parallel region
self.assertEqual(thread_num, 0)
num_procs = omp_get_num_procs()
in_parallel = omp_in_parallel()
self.assertFalse(in_parallel) # Always False outside of parallel region
# Always False outside of parallel region
self.assertFalse(in_parallel)
limit = omp_get_thread_limit()
def test_dynamic(self):
omp_set_dynamic(True)
dynamic = omp_get_dynamic()
@ -76,7 +77,6 @@ class OmpTest(ut.TestCase): @@ -76,7 +77,6 @@ class OmpTest(ut.TestCase):
nested = omp_get_nested()
self.assertFalse(nested)
def test_schedule(self):
omp_set_schedule(OMP_SCHED_STATIC, 100000)
kind, modifier = omp_get_schedule()
@ -96,10 +96,10 @@ class OmpTest(ut.TestCase): @@ -96,10 +96,10 @@ class OmpTest(ut.TestCase):
omp_set_schedule(OMP_SCHED_AUTO, 10)
kind, modifier = omp_get_schedule()
self.assertEqual(kind, OMP_SCHED_AUTO)
self.assertNotEqual(modifier, 10) # The modifier argument is ignored,
# The modifier argument is ignored,
# so it will be set to the previous
# value of 100.
self.assertNotEqual(modifier, 10)
def test_team_level(self):
omp_set_max_active_levels(10)
@ -112,11 +112,10 @@ class OmpTest(ut.TestCase): @@ -112,11 +112,10 @@ class OmpTest(ut.TestCase):
active_level = omp_get_active_level()
in_final = omp_in_final()
def test_time(self):
wtime = omp_get_wtime()
wtick = omp_get_wtick()
if __name__ == "__main__":
ut.main()

120
test/test_proj_params.py

@ -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 xy_to_ll_proj, ll_to_xy_proj, to_np
@ -11,11 +12,12 @@ from wrf import xy_to_ll_proj, ll_to_xy_proj, to_np @@ -11,11 +12,12 @@ from wrf import xy_to_ll_proj, ll_to_xy_proj, to_np
class WRFLatLonProjTest(ut.TestCase):
longMessage = True
def make_test(xy_or_ll_out):
def test(self):
# Python 3
if sys.version_info > (3,):
if sys.version_info > (3, ):
assert_raises_regex = self.assertRaisesRegex
xrange = range
else:
@ -23,37 +25,37 @@ def make_test(xy_or_ll_out): @@ -23,37 +25,37 @@ def make_test(xy_or_ll_out):
if xy_or_ll_out == "xy":
# Test the required failures
with assert_raises_regex(ValueError, ".*map_proj.*" ):
ll_to_xy_proj(30,-110)
with assert_raises_regex(ValueError, ".*map_proj.*"):
ll_to_xy_proj(30, -110)
with assert_raises_regex(ValueError, ".*ref_lat.*" ):
ll_to_xy_proj(30,-110, map_proj=1)
with assert_raises_regex(ValueError, ".*ref_lat.*"):
ll_to_xy_proj(30, -110, map_proj=1)
with assert_raises_regex(ValueError, ".*ref_lon.*" ):
ll_to_xy_proj(30,-110, map_proj=1, ref_lat=45)
with assert_raises_regex(ValueError, ".*ref_lon.*"):
ll_to_xy_proj(30, -110, map_proj=1, ref_lat=45)
with assert_raises_regex(ValueError, ".*known_x.*" ):
ll_to_xy_proj(30,-110, map_proj=1, ref_lat=45.0,
with assert_raises_regex(ValueError, ".*known_x.*"):
ll_to_xy_proj(30, -110, map_proj=1, ref_lat=45.0,
ref_lon=-120.)
with assert_raises_regex(ValueError, ".*known_y.*" ):
ll_to_xy_proj(30,-110, map_proj=1, ref_lat=45.0,
with assert_raises_regex(ValueError, ".*known_y.*"):
ll_to_xy_proj(30, -110, map_proj=1, ref_lat=45.0,
ref_lon=-120., known_x=1)
with assert_raises_regex(ValueError, ".*dx.*" ):
ll_to_xy_proj(30,-110, map_proj=1, ref_lat=45.0,
with assert_raises_regex(ValueError, ".*dx.*"):
ll_to_xy_proj(30, -110, map_proj=1, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0)
####### Now test the projections
# Now test the projections
# Lambert Conformal - truelat1, stand_lon required
with assert_raises_regex(ValueError, ".*truelat1.*" ):
ll_to_xy_proj(30,-110, map_proj=1, ref_lat=45.0,
with assert_raises_regex(ValueError, ".*truelat1.*"):
ll_to_xy_proj(30, -110, map_proj=1, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
dx=3000.)
with assert_raises_regex(ValueError, ".*stand_lon.*" ):
ll_to_xy_proj(30,-110, map_proj=1, ref_lat=45.0,
with assert_raises_regex(ValueError, ".*stand_lon.*"):
ll_to_xy_proj(30, -110, map_proj=1, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
dx=3000.,
truelat1=60.)
@ -64,23 +66,21 @@ def make_test(xy_or_ll_out): @@ -64,23 +66,21 @@ def make_test(xy_or_ll_out):
dx=30000., truelat1=30., truelat2=30.,
stand_lon=-89., pole_lat=90., pole_lon=0.)
p_def = ll_to_xy_proj(28., -89., map_proj=1, ref_lat=17.803,
ref_lon=-100.7747, known_x=0, known_y=0,
dx=30000., truelat1=30.,
stand_lon=-89.)
dx=30000., truelat1=30., stand_lon=-89.)
nt.assert_allclose(to_np(p_all), to_np(p_def))
# Polar Stereographic - truelat1, stand_lon
with assert_raises_regex(ValueError, ".*truelat1.*" ):
ll_to_xy_proj(30,-110, map_proj=2, ref_lat=45.0,
with assert_raises_regex(ValueError, ".*truelat1.*"):
ll_to_xy_proj(30, -110, map_proj=2, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
dx=3000.)
with assert_raises_regex(ValueError, ".*stand_lon.*" ):
ll_to_xy_proj(30,-110, map_proj=2, ref_lat=45.0,
with assert_raises_regex(ValueError, ".*stand_lon.*"):
ll_to_xy_proj(30, -110, map_proj=2, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
dx=3000.,
truelat1=60.)
@ -90,19 +90,16 @@ def make_test(xy_or_ll_out): @@ -90,19 +90,16 @@ def make_test(xy_or_ll_out):
dx=30000., truelat1=30., truelat2=30.,
stand_lon=-89., pole_lat=90., pole_lon=0.)
p_def = ll_to_xy_proj(28., -89., map_proj=2, ref_lat=17.933,
ref_lon=-100.0735, known_x=0, known_y=0,
dx=30000., truelat1=30.,
stand_lon=-89.)
dx=30000., truelat1=30., stand_lon=-89.)
nt.assert_allclose(to_np(p_all), to_np(p_def))
# Mercator - truelat1
with assert_raises_regex(ValueError, ".*truelat1.*" ):
ll_to_xy_proj(30,-110, map_proj=2, ref_lat=45.0,
with assert_raises_regex(ValueError, ".*truelat1.*"):
ll_to_xy_proj(30, -110, map_proj=2, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
dx=3000.)
@ -111,7 +108,6 @@ def make_test(xy_or_ll_out): @@ -111,7 +108,6 @@ def make_test(xy_or_ll_out):
dx=30000., truelat1=30., truelat2=30.,
stand_lon=-89., pole_lat=90., pole_lon=0.)
p_def = ll_to_xy_proj(28., -89., map_proj=3, ref_lat=19.1075,
ref_lon=-101.008, known_x=0, known_y=0,
dx=30000., truelat1=30.)
@ -120,38 +116,37 @@ def make_test(xy_or_ll_out): @@ -120,38 +116,37 @@ def make_test(xy_or_ll_out):
# Lat/lon - stand_lon, dy, pole_lat, pole_lon
with assert_raises_regex(ValueError, ".*stand_lon.*" ):
ll_to_xy_proj(30,-110, map_proj=6, ref_lat=45.0,
with assert_raises_regex(ValueError, ".*stand_lon.*"):
ll_to_xy_proj(30, -110, map_proj=6, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
dx=.2698388)
with assert_raises_regex(ValueError, ".*dy.*" ):
ll_to_xy_proj(30,-110, map_proj=6, ref_lat=45.0,
with assert_raises_regex(ValueError, ".*dy.*"):
ll_to_xy_proj(30, -110, map_proj=6, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
stand_lon=89.0,
dx=.2698388)
with assert_raises_regex(ValueError, ".*pole_lat.*" ):
ll_to_xy_proj(30,-110, map_proj=6, ref_lat=45.0,
with assert_raises_regex(ValueError, ".*pole_lat.*"):
ll_to_xy_proj(30, -110, map_proj=6, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
stand_lon=89.0,
dx=.2698388, dy=.2698388)
with assert_raises_regex(ValueError, ".*pole_lon.*" ):
ll_to_xy_proj(30,-110, map_proj=6, ref_lat=45.0,
with assert_raises_regex(ValueError, ".*pole_lon.*"):
ll_to_xy_proj(30, -110, map_proj=6, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
stand_lon=89.0,
dx=.2698388, dy=.2698388,
pole_lat=62.0)
p_all = ll_to_xy_proj(28.,-89., map_proj=6, ref_lat=17.6759,
p_all = ll_to_xy_proj(28., -89., map_proj=6, ref_lat=17.6759,
ref_lon=-101.4286, known_x=0, known_y=0,
dx=30000, dy=30000,
truelat1=30., truelat2=30.,
stand_lon=-89., pole_lat=62.0,
pole_lon=180.)
p_def = ll_to_xy_proj(28., -89., map_proj=6, ref_lat=17.6759,
ref_lon=-101.4286, known_x=0, known_y=0,
stand_lon=-89.,
@ -160,40 +155,39 @@ def make_test(xy_or_ll_out): @@ -160,40 +155,39 @@ def make_test(xy_or_ll_out):
nt.assert_allclose(to_np(p_all), to_np(p_def))
if xy_or_ll_out == "ll":
# Test the required failures
with assert_raises_regex(ValueError, ".*map_proj.*" ):
with assert_raises_regex(ValueError, ".*map_proj.*"):
xy_to_ll_proj(45, 50)
with assert_raises_regex(ValueError, ".*ref_lat.*" ):
with assert_raises_regex(ValueError, ".*ref_lat.*"):
xy_to_ll_proj(45, 50, map_proj=1)
with assert_raises_regex(ValueError, ".*ref_lon.*" ):
with assert_raises_regex(ValueError, ".*ref_lon.*"):
xy_to_ll_proj(45, 50, map_proj=1, ref_lat=45)
with assert_raises_regex(ValueError, ".*known_x.*" ):
with assert_raises_regex(ValueError, ".*known_x.*"):
xy_to_ll_proj(45, 50, map_proj=1, ref_lat=45.0,
ref_lon=-120.)
with assert_raises_regex(ValueError, ".*known_y.*" ):
with assert_raises_regex(ValueError, ".*known_y.*"):
xy_to_ll_proj(45, 50, map_proj=1, ref_lat=45.0,
ref_lon=-120., known_x=1)
with assert_raises_regex(ValueError, ".*dx.*" ):
with assert_raises_regex(ValueError, ".*dx.*"):
xy_to_ll_proj(45, 50, map_proj=1, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0)
####### Now test the projections
# Now test the projections
# Lambert Conformal - truelat1, stand_lon required
with assert_raises_regex(ValueError, ".*truelat1.*" ):
with assert_raises_regex(ValueError, ".*truelat1.*"):
xy_to_ll_proj(45, 50, map_proj=1, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
dx=3000.)
with assert_raises_regex(ValueError, ".*stand_lon.*" ):
with assert_raises_regex(ValueError, ".*stand_lon.*"):
xy_to_ll_proj(45, 50, map_proj=1, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
dx=3000.,
@ -205,7 +199,6 @@ def make_test(xy_or_ll_out): @@ -205,7 +199,6 @@ def make_test(xy_or_ll_out):
dx=30000., truelat1=30., truelat2=30.,
stand_lon=-89., pole_lat=90., pole_lon=0.)
p_def = xy_to_ll_proj(45, 50, map_proj=1, ref_lat=17.803,
ref_lon=-100.7747, known_x=0, known_y=0,
dx=30000., truelat1=30.,
@ -215,12 +208,12 @@ def make_test(xy_or_ll_out): @@ -215,12 +208,12 @@ def make_test(xy_or_ll_out):
# Polar Stereographic - truelat1, stand_lon
with assert_raises_regex(ValueError, ".*truelat1.*" ):
with assert_raises_regex(ValueError, ".*truelat1.*"):
xy_to_ll_proj(45, 50, map_proj=2, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
dx=3000.)
with assert_raises_regex(ValueError, ".*stand_lon.*" ):
with assert_raises_regex(ValueError, ".*stand_lon.*"):
xy_to_ll_proj(45, 50, map_proj=2, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
dx=3000.,
@ -231,7 +224,6 @@ def make_test(xy_or_ll_out): @@ -231,7 +224,6 @@ def make_test(xy_or_ll_out):
dx=30000., truelat1=30., truelat2=30.,
stand_lon=-89., pole_lat=90., pole_lon=0.)
p_def = xy_to_ll_proj(45, 50, map_proj=2, ref_lat=17.933,
ref_lon=-100.0735, known_x=0, known_y=0,
dx=30000., truelat1=30.,
@ -239,10 +231,9 @@ def make_test(xy_or_ll_out): @@ -239,10 +231,9 @@ def make_test(xy_or_ll_out):
nt.assert_allclose(to_np(p_all), to_np(p_def))
# Mercator - truelat1
with assert_raises_regex(ValueError, ".*truelat1.*" ):
with assert_raises_regex(ValueError, ".*truelat1.*"):
xy_to_ll_proj(45, 50, map_proj=2, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
dx=3000.)
@ -252,7 +243,6 @@ def make_test(xy_or_ll_out): @@ -252,7 +243,6 @@ def make_test(xy_or_ll_out):
dx=30000., truelat1=30., truelat2=30.,
stand_lon=-89., pole_lat=90., pole_lon=0.)
p_def = xy_to_ll_proj(45, 50, map_proj=3, ref_lat=19.1075,
ref_lon=-101.008, known_x=0, known_y=0,
dx=30000., truelat1=30.)
@ -261,24 +251,24 @@ def make_test(xy_or_ll_out): @@ -261,24 +251,24 @@ def make_test(xy_or_ll_out):
# Lat/lon - stand_lon, dy, pole_lat, pole_lon
with assert_raises_regex(ValueError, ".*stand_lon.*" ):
with assert_raises_regex(ValueError, ".*stand_lon.*"):
xy_to_ll_proj(45, 50, map_proj=6, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
dx=.2698388)
with assert_raises_regex(ValueError, ".*dy.*" ):
with assert_raises_regex(ValueError, ".*dy.*"):
xy_to_ll_proj(45, 50, map_proj=6, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
stand_lon=89.0,
dx=.2698388)
with assert_raises_regex(ValueError, ".*pole_lat.*" ):
with assert_raises_regex(ValueError, ".*pole_lat.*"):
xy_to_ll_proj(45, 50, map_proj=6, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
stand_lon=89.0,
dx=.2698388, dy=.2698388)
with assert_raises_regex(ValueError, ".*pole_lon.*" ):
with assert_raises_regex(ValueError, ".*pole_lon.*"):
xy_to_ll_proj(45, 50, map_proj=6, ref_lat=45.0,
ref_lon=-120., known_x=0, known_y=0,
stand_lon=89.0,
@ -292,7 +282,6 @@ def make_test(xy_or_ll_out): @@ -292,7 +282,6 @@ def make_test(xy_or_ll_out):
stand_lon=-89., pole_lat=62.0,
pole_lon=180.)
p_def = xy_to_ll_proj(64, 40, map_proj=6, ref_lat=17.6759,
ref_lon=-101.4286, known_x=0, known_y=0,
stand_lon=-89.,
@ -311,4 +300,3 @@ if __name__ == "__main__": @@ -311,4 +300,3 @@ if __name__ == "__main__":
setattr(WRFLatLonProjTest, 'test_{0}'.format(v), test_func)
ut.main()

1
test/test_units.py

@ -51,6 +51,5 @@ class TestUnits(ut.TestCase): @@ -51,6 +51,5 @@ class TestUnits(ut.TestCase):
self.assertEqual(var.attrs["units"], units)
if __name__ == "__main__":
ut.main()

576
test/utests.py

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save