Browse Source

Merge branch 'feature/build11' into develop

lon0
Bill Ladwig 7 years ago
parent
commit
f02db010f8
  1. 2
      MANIFEST.in
  2. 2
      build_scripts/gnu_no_omp.sh
  3. 4
      build_scripts/gnu_omp.sh
  4. 15
      build_scripts/win_mingw_no_omp.bat
  5. 17
      build_scripts/win_mingw_omp.bat
  6. 14
      build_scripts/win_msvc_mingw_no_omp.bat
  7. 16
      build_scripts/win_msvc_mingw_omp.bat
  8. 17
      conda_recipe/bld.bat
  9. 8
      conda_recipe/build.sh
  10. 24
      conda_recipe/meta.yaml
  11. 58
      conda_recipe/meta.yaml.develop
  12. 58
      conda_recipe/meta.yaml.release
  13. 58
      doc/source/installation.rst
  14. 3
      requirements.txt
  15. 9
      src/wrf/__init__.py
  16. 32
      src/wrf/metadecorators.py
  17. BIN
      test/ci_tests/ci_test_file.nc
  18. 6
      test/ci_tests/make_test_file.py
  19. 23
      test/ci_tests/utests.py
  20. 23
      test/utests.py

2
MANIFEST.in

@ -4,6 +4,8 @@ include requirements.txt
include fortran/*.f90 include fortran/*.f90
include fortran/*.pyf include fortran/*.pyf
include build_scripts/*.sh
include build_scripts/*.bat
include setup.py include setup.py
recursive-include doc/source * recursive-include doc/source *

2
build_scripts/gnu_no_omp.sh

@ -4,5 +4,7 @@ cd ../fortran
gfortran -E ompgen.F90 -cpp -o omp.f90 gfortran -E ompgen.F90 -cpp -o omp.f90
f2py *.f90 -m _wrffortran -h wrffortran.pyf --overwrite-signature f2py *.f90 -m _wrffortran -h wrffortran.pyf --overwrite-signature
cd .. cd ..
python setup.py clean --all python setup.py clean --all
python setup.py config_fc --f90flags="-mtune=generic" build_ext build python setup.py config_fc --f90flags="-mtune=generic" build_ext build
pip install .

4
build_scripts/gnu_omp.sh

@ -2,8 +2,10 @@
cd ../fortran cd ../fortran
gfortran -E ompgen.F90 -fopenmp -cpp -o omp.f90 gfortran -E ompgen.F90 -fopenmp -cpp -o omp.f90
f2py *.f90 -m _wrffortran -h wrffortran.pyf --overwrite-signature --no-wrap-functions f2py *.f90 -m _wrffortran -h wrffortran.pyf --overwrite-signature
cd .. cd ..
python setup.py clean --all python setup.py clean --all
python setup.py config_fc --f90flags="-mtune=generic -fopenmp" build_ext --libraries="gomp" build python setup.py config_fc --f90flags="-mtune=generic -fopenmp" build_ext --libraries="gomp" build
pip install .

15
build_scripts/win_mingw_no_omp.bat

@ -0,0 +1,15 @@
cd ../fortran
CALL gfortran -E ompgen.F90 -cpp -o omp.f90
REM Wildcards not working on Windows for some reason
CALL f2py -m _wrffortran -h wrffortran.pyf --overwrite-signature wrf_constants.f90 wrf_testfunc.f90 wrf_user.f90 rip_cape.f90 wrf_cloud_fracf.f90 wrf_fctt.f90 wrf_user_dbz.f90 wrf_relhl.f90 calc_uh.f90 wrf_user_latlon_routines.f90 wrf_pvo.f90 eqthecalc.f90 wrf_rip_phys_routines.f90 wrf_pw.f90 wrf_vinterp.f90 wrf_wind.f90 omp.f90
cd ..
CALL python setup.py clean --all
IF %PROCESSOR_ARCHITECTURE% == AMD64 (
CALL python setup.py config_fc --f90flags="-O2 -mtune=generic" build --compiler=mingw32 --fcompiler=gnu95
) ELSE (
CALL python setup.py config_fc --f90flags="-O2 -mtune=generic -mincoming-stack-boundary=2" build --compiler=mingw32 --fcompiler=gnu95
)
CALL pip install .

17
build_scripts/win_mingw_omp.bat

@ -0,0 +1,17 @@
cd ../fortran
CALL gfortran -E ompgen.F90 -cpp -fopenmp -o omp.f90
REM Wildcards not working on Windows for some reason
CALLf2py -m _wrffortran -h wrffortran.pyf --overwrite-signature wrf_constants.f90 wrf_testfunc.f90 wrf_user.f90 rip_cape.f90 wrf_cloud_fracf.f90 wrf_fctt.f90 wrf_user_dbz.f90 wrf_relhl.f90 calc_uh.f90 wrf_user_latlon_routines.f90 wrf_pvo.f90 eqthecalc.f90 wrf_rip_phys_routines.f90 wrf_pw.f90 wrf_vinterp.f90 wrf_wind.f90 omp.f90
cd ..
CALL python setup.py clean --all
IF %PROCESSOR_ARCHITECTURE% == AMD64 (
CALL python setup.py config_fc --f90flags="-O2 -mtune=generic -fopenmp" build_ext --libraries="gomp" build --compiler=mingw32 --fcompiler=gnu95
) ELSE (
CALL python setup.py config_fc --f90flags="-O2 -mtune=generic -fopenmp -mincoming-stack-boundary=2" build_ext --libraries="gomp" build --compiler=mingw32 --fcompiler=gnu95
)
CALL pip install .

14
build_scripts/win_msvc_mingw_no_omp.bat

@ -0,0 +1,14 @@
cd ../fortran
CALL gfortran -E ompgen.F90 -cpp -o omp.f90
REM Wildcards not working on Windows for some reason
CALL f2py -m _wrffortran -h wrffortran.pyf --overwrite-signature wrf_constants.f90 wrf_testfunc.f90 wrf_user.f90 rip_cape.f90 wrf_cloud_fracf.f90 wrf_fctt.f90 wrf_user_dbz.f90 wrf_relhl.f90 calc_uh.f90 wrf_user_latlon_routines.f90 wrf_pvo.f90 eqthecalc.f90 wrf_rip_phys_routines.f90 wrf_pw.f90 wrf_vinterp.f90 wrf_wind.f90 omp.f90
cd ..
CALL python setup.py clean --all
IF %PROCESSOR_ARCHITECTURE% == AMD64 (
CALL python setup.py config_fc --f90flags="-O2 -mtune=generic" build --compiler=mingw32 --fcompiler=gnu95
) ELSE (
CALL python setup.py config_fc --f90flags="-O2 -mtune=generic -mincoming-stack-boundary=2" build --compiler=msvc --fcompiler=gnu95
)
CALL pip install .

16
build_scripts/win_msvc_mingw_omp.bat

@ -0,0 +1,16 @@
cd ../fortran
CALL gfortran -E ompgen.F90 -cpp -fopenmp -o omp.f90
REM Wildcards not working on Windows for some reason
CALL f2py -m _wrffortran -h wrffortran.pyf --overwrite-signature wrf_constants.f90 wrf_testfunc.f90 wrf_user.f90 rip_cape.f90 wrf_cloud_fracf.f90 wrf_fctt.f90 wrf_user_dbz.f90 wrf_relhl.f90 calc_uh.f90 wrf_user_latlon_routines.f90 wrf_pvo.f90 eqthecalc.f90 wrf_rip_phys_routines.f90 wrf_pw.f90 wrf_vinterp.f90 wrf_wind.f90 omp.f90
cd ..
CALL python setup.py clean --all
IF %PROCESSOR_ARCHITECTURE% == AMD64 (
CALL python setup.py config_fc --f90flags="-O2 -mtune=generic -fopenmp" build_ext --libraries="gomp" build --compiler=msvc --fcompiler=gnu95
) ELSE (
CALL python setup.py config_fc --f90flags="-O2 -mtune=generic -fopenmp -mincoming-stack-boundary=2" build_ext --libraries="gomp" build --compiler=msvc --fcompiler=gnu95
)
CALL pip install .

17
conda_recipe/bld.bat

@ -1,8 +1,15 @@
cd ./fortran
CALL gfortran -E ompgen.F90 -cpp -fopenmp -o omp.f90
REM Wildcards not working on Windows for some reason
CALL f2py -m _wrffortran -h wrffortran.pyf --overwrite-signature wrf_constants.f90 wrf_testfunc.f90 wrf_user.f90 rip_cape.f90 wrf_cloud_fracf.f90 wrf_fctt.f90 wrf_user_dbz.f90 wrf_relhl.f90 calc_uh.f90 wrf_user_latlon_routines.f90 wrf_pvo.f90 eqthecalc.f90 wrf_rip_phys_routines.f90 wrf_pw.f90 wrf_vinterp.f90 wrf_wind.f90 omp.f90
cd ..
%ARCH% == 64 ( IF %ARCH% == 64 (
%PYTHON% setup.py config_fc --f90flags="-O2 -mtune=generic -mfpmath=sse -msse2" build --compiler=mingw32 --fcompiler=gnu95 CALL %PYTHON% setup.py config_fc --f90flags="-O2 -mtune=generic -fopenmp" build_ext --libraries="gomp" build --compiler=msvc --fcompiler=gnu95
) else ( ) ELSE (
%PYTHON% setup.py config_fc --f90flags="-O2 -mtune=generic -mfpmath=sse -msse2 -mincoming-stack-boundary=2" build --compiler=mingw32 --fcompiler=gnu95 CALL %PYTHON% setup.py config_fc --f90flags="-O2 -mtune=generic -fopenmp -mincoming-stack-boundary=2" build_ext --libraries="gomp" build --compiler=msvc --fcompiler=gnu95
) )
%PYTHON% setup.py install --single-version-externally-managed --record=record.txt
CALL %PYTHON% setup.py install --single-version-externally-managed --record=record.txt

8
conda_recipe/build.sh

@ -1,10 +1,16 @@
#!/bin/bash #!/bin/bash
cd ./fortran
gfortran -E ompgen.F90 -fopenmp -cpp -o omp.f90
f2py *.f90 -m _wrffortran -h wrffortran.pyf --overwrite-signature
cd ..
if [ `uname` == Darwin ]; then if [ `uname` == Darwin ]; then
LDFLAGS="$LDFLAGS -undefined dynamic_lookup -bundle" LDFLAGS="$LDFLAGS -undefined dynamic_lookup -bundle"
fi fi
$PYTHON setup.py config_fc --f90flags="-mtune=generic -mfpmath=sse" build $PYTHON setup.py config_fc --f90flags="-mtune=generic -fopenmp" build_ext --libraries="gomp" build
$PYTHON setup.py install --single-version-externally-managed --record=record.txt $PYTHON setup.py install --single-version-externally-managed --record=record.txt

24
conda_recipe/meta.yaml

@ -1,38 +1,40 @@
{% set version = "1.0.5" %} {% set version = "1.1.0" %}
package: package:
name: wrf-python name: wrf-python
version: {{ version }} version: {{ version }}
source: source:
fn: wrf-python-{{ version }}.tar.gz git_url: https://github.com/NCAR/wrf-python
url: https://github.com/NCAR/wrf-python/archive/{{ version }}.tar.gz git_branch: develop
sha256: ea2202e1d8237c65b9d77a91f00da0f2e7a37ed6214ddd976872b619b9647b33
build: build:
number: 0 number: 0
detect_binary_files_with_prefix: true detect_binary_files_with_prefix: true
skip: True # [(win and py>=35)]
requirements: requirements:
build: build:
- setuptools - setuptools
- numpy x.x
- wrapt
- mingwpy # [win]
- gcc # [unix]
- python - python
- numpy 1.11.* # [unix]
- numpy 1.14.* # [win]
- wrapt
- m2w64-toolchain # [win]
- gcc # [unix]
run: run:
- numpy x.x - setuptools
- numpy >=1.11
- python - python
- wrapt - wrapt
- mingwpy # [win] - m2w64-gcc-libs # [win]
- libgfortran # [unix] - libgfortran # [unix]
- libgcc # [unix] - libgcc # [unix]
- xarray - xarray
test: test:
requires: requires:
- setuptools
- netcdf4 - netcdf4
- xarray - xarray
source_files: source_files:

58
conda_recipe/meta.yaml.develop

@ -0,0 +1,58 @@
{% set version = "1.1.0" %}
package:
name: wrf-python
version: {{ version }}
source:
git_url: https://github.com/NCAR/wrf-python
git_branch: develop
build:
number: 0
detect_binary_files_with_prefix: true
requirements:
build:
- setuptools
- numpy 1.11.* # [unix]
- numpy 1.14.* # [win]
- wrapt
- m2w64-toolchain # [win]
- gcc # [unix]
- python
run:
- setuptools
- numpy >=1.11
- python
- wrapt
- m2w64-gcc-libs # [win]
- libgfortran # [unix]
- libgcc # [unix]
- xarray
test:
requires:
- setuptools
- netcdf4
- xarray
source_files:
- test/ci_tests
imports:
- wrf
commands:
- cd test/ci_tests && python utests.py
about:
home: https://github.com/NCAR/wrf-python
license: "UCAR"
license_file: '{{ environ["RECIPE_DIR"] }}/LICENSE'
summary: "Diagnostic and interpolation routines for WRF-ARW data."
extra:
recipe-maintainers:
- bladwig1
- marylhaley
- david-ian-brown
- khallock

58
conda_recipe/meta.yaml.release

@ -0,0 +1,58 @@
{% set version = "1.1.0" %}
package:
name: wrf-python
version: {{ version }}
source:
fn: wrf-python-{{ version }}.tar.gz
url: https://github.com/NCAR/wrf-python/archive/{{ version }}.tar.gz
sha256: ea2202e1d8237c65b9d77a91f00da0f2e7a37ed6214ddd976872b619b9647b33
build:
number: 0
detect_binary_files_with_prefix: true
requirements:
build:
- setuptools
- numpy 1.11.* # [unix]
- numpy 1.14.* # [win]
- wrapt
- m2w64-toolchain # [win]
- gcc # [unix]
- python
run:
- setuptools
- numpy >=1.11
- python
- wrapt
- m2w64-gcc-libs # [win]
- libgfortran # [unix]
- libgcc # [unix]
- xarray
test:
requires:
- setuptools
- netcdf4
- xarray
source_files:
- test/ci_tests
imports:
- wrf
commands:
- cd test/ci_tests && python utests.py
about:
home: https://github.com/NCAR/wrf-python
license: "UCAR"
license_file: '{{ environ["RECIPE_DIR"] }}/LICENSE'
summary: "Diagnostic and interpolation routines for WRF-ARW data."
extra:
recipe-maintainers:
- bladwig1
- marylhaley
- david-ian-brown
- khallock

58
doc/source/installation.rst

@ -4,9 +4,10 @@ Installation
Required Dependencies Required Dependencies
---------------------- ----------------------
- Python 2.7, 3.4, or 3.5 - Python 2.7, 3.4, or 3.5+
- numpy (1.9 or later) - numpy (1.11 or later; 1.14 required to build on Windows)
- wrapt (1.10 or later) - wrapt (1.10 or later)
- setuptools (38.0 or later)
Highly Recommended Packages Highly Recommended Packages
@ -81,13 +82,52 @@ The source code is available via github:
https://github.com/NCAR/wrf-python https://github.com/NCAR/wrf-python
To install, change to the wrf-python directory and run:: Or PyPI:
https://pypi.python.org/pypi/wrf-python
To install, if you do not need OpenMP support, change your working directory
to the wrf-python source directory and run::
$ pip install . $ pip install .
Beginning with wrf-python 1.1, OpenMP is supported, but preprocessing the
ompgen.F90 file is required, which also requires running f2py to
build the .pyf file. To simplify this process, you can use the build scripts in
the *build_scripts* directory as a guide, or just call the script directly.
Below is a sample from a build script for GNU compiler with OpenMP enabled:
.. code-block:: none
cd ../fortran
gfortran -E ompgen.F90 -fopenmp -cpp -o omp.f90
f2py *.f90 -m _wrffortran -h wrffortran.pyf --overwrite-signature
cd ..
python setup.py clean --all
python setup.py config_fc --f90flags="-mtune=generic -fopenmp" build_ext --libraries="gomp" build
pip install .
Beginning with numpy 1.14, f2py extensions can now be built using the MSVC
compiler and mingw gfortran compiler. Numpy 1.14 is required to build
wrf-python for Python 3.5+.
.. note::
If you are building on a supercomputer and receiving linker related
errors (e.g. missing symbols, undefined references, etc), you probably
need to unset the LDFLAGS environment variable. System administrators on
supercomputing systems often define LDFLAGS for you so that you don't need
to worry about where libraries like NetCDF are installed. Unfortunately,
this can cause problems with the numpy.distutils build system. To fix,
using the build command from above::
$ unset LDFLAGS python setup.py config_fc --f90flags="-mtune=generic -fopenmp" build_ext --libraries="gomp" build
Note that building on Win64 with Python 3.5+ and the mingw-64 compiler
is very difficult, due to incompatibilities with the runtime libraries and
lack of support from numpy's distutils. Improved support for these
configurations, along with numpy distutils support, should take place this
year. But for now, visual studio and the intel compiler may be required.
Otherwise, Python 2.7 or Python 3.4 is recommended.

3
requirements.txt

@ -1,2 +1,3 @@
numpy>=1.10 numpy>=1.11
wrapt>=1.10 wrapt>=1.10
setuptools>=38.0

9
src/wrf/__init__.py

@ -4,12 +4,13 @@ import os
import pkg_resources import pkg_resources
# For gfortran+msvc combination, extra shared libraries may exist (stored by numpy.distutils) # For gfortran+msvc combination, extra shared libraries may exist (stored by numpy.distutils)
if os.name == 'nt': if os.name == "nt":
try: try:
req = pkg_resources.Requirement.parse('wrf-python') req = pkg_resources.Requirement.parse("wrf-python")
extra_dll_dir = pkg_resources.resource_filename(req, 'wrf-python/extra-dll') extra_dll_dir = pkg_resources.resource_filename(req,
"wrf-python/.libs")
if os.path.isdir(extra_dll_dir): if os.path.isdir(extra_dll_dir):
os.environ['PATH'] += os.pathsep + extra_dll_dir os.environ["PATH"] += os.pathsep + extra_dll_dir
except ImportError: except ImportError:
pass pass

32
src/wrf/metadecorators.py

@ -805,7 +805,7 @@ def _set_horiz_meta(wrapped, instance, args, kwargs):
outname = None outname = None
outdimnames = None outdimnames = None
outcoords = None outcoords = None
outattrs = None outattrs = OrderedDict()
# Get the vertical level units # Get the vertical level units
vert_units = None vert_units = None
@ -823,7 +823,6 @@ def _set_horiz_meta(wrapped, instance, args, kwargs):
if isinstance(field3d, DataArray): if isinstance(field3d, DataArray):
outcoords = OrderedDict() outcoords = OrderedDict()
outattrs = OrderedDict()
outdimnames = list(field3d.dims) outdimnames = list(field3d.dims)
outcoords.update(field3d.coords) outcoords.update(field3d.coords)
outdimnames.remove(field3d.dims[-3]) outdimnames.remove(field3d.dims[-3])
@ -836,7 +835,6 @@ def _set_horiz_meta(wrapped, instance, args, kwargs):
else: else:
outname = "field3d_{0}".format(name_levelstr) outname = "field3d_{0}".format(name_levelstr)
outattrs = OrderedDict()
outattrs["level"] = levelstr outattrs["level"] = levelstr
outattrs["missing_value"] = missingval outattrs["missing_value"] = missingval
@ -959,7 +957,7 @@ def _set_cross_meta(wrapped, instance, args, kwargs):
outname = None outname = None
outdimnames = None outdimnames = None
outcoords = None outcoords = None
outattrs = None outattrs = OrderedDict()
# Use XY to set the cross-section metadata # Use XY to set the cross-section metadata
st_x = xy[0,0] st_x = xy[0,0]
@ -974,7 +972,6 @@ def _set_cross_meta(wrapped, instance, args, kwargs):
if isinstance(field3d, DataArray): if isinstance(field3d, DataArray):
outcoords = OrderedDict() outcoords = OrderedDict()
outattrs = OrderedDict()
outdimnames = list(field3d.dims) outdimnames = list(field3d.dims)
outcoords.update(field3d.coords) outcoords.update(field3d.coords)
for i in py3range(-3,0,1): for i in py3range(-3,0,1):
@ -1062,7 +1059,6 @@ def _set_cross_meta(wrapped, instance, args, kwargs):
"not of type xarray.DataArray and contains no " "not of type xarray.DataArray and contains no "
"coordinate information") "coordinate information")
outname = "field3d_cross" outname = "field3d_cross"
outattrs = OrderedDict()
outattrs["orientation"] = cross_str outattrs["orientation"] = cross_str
outattrs["missing_value"] = missingval outattrs["missing_value"] = missingval
@ -1173,7 +1169,7 @@ def _set_line_meta(wrapped, instance, args, kwargs):
outname = None outname = None
outdimnames = None outdimnames = None
outcoords = None outcoords = None
outattrs = None outattrs = OrderedDict()
# Use XY to set the cross-section metadata # Use XY to set the cross-section metadata
st_x = xy[0,0] st_x = xy[0,0]
@ -1188,7 +1184,6 @@ def _set_line_meta(wrapped, instance, args, kwargs):
if isinstance(field2d, DataArray): if isinstance(field2d, DataArray):
outcoords = OrderedDict() outcoords = OrderedDict()
outattrs = OrderedDict()
outdimnames = list(field2d.dims) outdimnames = list(field2d.dims)
outcoords.update(field2d.coords) outcoords.update(field2d.coords)
for i in py3range(-2,0,1): for i in py3range(-2,0,1):
@ -1273,7 +1268,6 @@ def _set_line_meta(wrapped, instance, args, kwargs):
"not of type xarray.DataArray and contains no " "not of type xarray.DataArray and contains no "
"coordinate information") "coordinate information")
outname = "field2d_line" outname = "field2d_line"
outattrs = OrderedDict()
outattrs["orientation"] = cross_str outattrs["orientation"] = cross_str
@ -1334,12 +1328,11 @@ def _set_vinterp_meta(wrapped, instance, args, kwargs):
outname = None outname = None
outdimnames = None outdimnames = None
outcoords = None outcoords = None
outattrs = None outattrs = OrderedDict()
if isinstance(field, DataArray): if isinstance(field, DataArray):
outcoords = OrderedDict() outcoords = OrderedDict()
outattrs = OrderedDict()
outdimnames = list(field.dims) outdimnames = list(field.dims)
outcoords.update(field.coords) outcoords.update(field.coords)
@ -1352,13 +1345,14 @@ def _set_vinterp_meta(wrapped, instance, args, kwargs):
outdimnames.insert(-2, "interp_level") outdimnames.insert(-2, "interp_level")
outcoords["interp_level"] = interp_levels outcoords["interp_level"] = interp_levels
outattrs.update(field.attrs) outattrs.update(field.attrs)
outattrs["vert_interp_type"] = vert_coord
outname = field.name outname = field.name
else: else:
outname = field_type outname = field_type
outattrs["vert_interp_type"] = vert_coord
return DataArray(result, name=outname, dims=outdimnames, return DataArray(result, name=outname, dims=outdimnames,
coords=outcoords, attrs=outattrs) coords=outcoords, attrs=outattrs)
@ -1402,8 +1396,7 @@ def _set_2dxy_meta(wrapped, instance, args, kwargs):
argvars = from_args(wrapped, ("field3d", "xy"), *args, **kwargs) argvars = from_args(wrapped, ("field3d", "xy"), *args, **kwargs)
field3d = argvars["field3d"] field3d = argvars["field3d"]
xy = argvars["xy"] xy = to_np(argvars["xy"])
xy = to_np(xy)
result = wrapped(*args, **kwargs) result = wrapped(*args, **kwargs)
@ -1419,12 +1412,11 @@ def _set_2dxy_meta(wrapped, instance, args, kwargs):
outname = None outname = None
outdimnames = None outdimnames = None
outcoords = None outcoords = None
outattrs = None outattrs = OrderedDict()
# Dims are (...,xy,z) # Dims are (...,xy,z)
if isinstance(field3d, DataArray): if isinstance(field3d, DataArray):
outcoords = OrderedDict() outcoords = OrderedDict()
outattrs = OrderedDict()
outdimnames = list(field3d.dims) outdimnames = list(field3d.dims)
outcoords.update(field3d.coords) outcoords.update(field3d.coords)
@ -1520,12 +1512,11 @@ def _set_1d_meta(wrapped, instance, args, kwargs):
outname = None outname = None
outdimnames = None outdimnames = None
outcoords = None outcoords = None
outattrs = None outattrs = OrderedDict()
# Dims are (...,xy,z) # Dims are (...,xy,z)
if isinstance(field, DataArray): if isinstance(field, DataArray):
outcoords = OrderedDict() outcoords = OrderedDict()
outattrs = OrderedDict()
outdimnames = list(field.dims) outdimnames = list(field.dims)
outdimnames.pop(-1) outdimnames.pop(-1)
@ -1540,9 +1531,6 @@ def _set_1d_meta(wrapped, instance, args, kwargs):
outname = "{0}_z".format(field.name) outname = "{0}_z".format(field.name)
outcoords["z"] = z_out outcoords["z"] = z_out
outattrs["_FillValue"] = missingval
outattrs["missing_value"] = missingval
desc = field.attrs.get("description", None) desc = field.attrs.get("description", None)
if desc is not None: if desc is not None:
outattrs["description"] = desc outattrs["description"] = desc
@ -1554,6 +1542,8 @@ def _set_1d_meta(wrapped, instance, args, kwargs):
else: else:
outname = "field_z" outname = "field_z"
outattrs["_FillValue"] = missingval
outattrs["missing_value"] = missingval
return DataArray(result, name=outname, dims=outdimnames, return DataArray(result, name=outname, dims=outdimnames,
coords=outcoords, attrs=outattrs) coords=outcoords, attrs=outattrs)

BIN
test/ci_tests/ci_test_file.nc

Binary file not shown.

6
test/ci_tests/make_test_file.py

@ -9,9 +9,9 @@ from netCDF4 import Dataset
from wrf import (getvar, interplevel, interpline, vertcross, vinterp, py2round, from wrf import (getvar, interplevel, interpline, vertcross, vinterp, py2round,
CoordPair, ll_to_xy, xy_to_ll, to_np) CoordPair, ll_to_xy, xy_to_ll, to_np)
VARS_TO_KEEP = ("XLAT", "XLONG", "XLAT_U", "XLAT_V", "XLONG_U", "XLONG_V", VARS_TO_KEEP = ("Times", "XLAT", "XLONG", "XLAT_U", "XLAT_V", "XLONG_U",
"U", "V", "W", "PH", "PHB", "T", "P", "PB", "Q2", "T2", "XLONG_V", "U", "V", "W", "PH", "PHB", "T", "P", "PB", "Q2",
"PSFC", "U10", "V10", "XTIME", "QVAPOR", "QCLOUD", "T2", "PSFC", "U10", "V10", "XTIME", "QVAPOR", "QCLOUD",
"QGRAUP", "QRAIN", "QSNOW", "MAPFAC_M", "MAPFAC_U", "QGRAUP", "QRAIN", "QSNOW", "MAPFAC_M", "MAPFAC_U",
"MAPFAC_V", "F", "HGT", "RAINC", "RAINSH", "RAINNC") "MAPFAC_V", "F", "HGT", "RAINC", "RAINSH", "RAINNC")

23
test/ci_tests/utests.py

@ -100,6 +100,10 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
ref_ht_850 = _get_refvals(referent, "interplevel", repeat, multi) ref_ht_850 = _get_refvals(referent, "interplevel", repeat, multi)
hts = getvar(in_wrfnc, "z", timeidx=timeidx) hts = getvar(in_wrfnc, "z", timeidx=timeidx)
p = getvar(in_wrfnc, "pressure", timeidx=timeidx) p = getvar(in_wrfnc, "pressure", timeidx=timeidx)
# Check that it works with numpy arrays
hts_850 = interplevel(to_np(hts), p, 850)
#print (hts_850)
hts_850 = interplevel(hts, p, 850) hts_850 = interplevel(hts, p, 850)
nt.assert_allclose(to_np(hts_850), ref_ht_850) nt.assert_allclose(to_np(hts_850), ref_ht_850)
@ -111,6 +115,10 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
p = getvar(in_wrfnc, "pressure", timeidx=timeidx) p = getvar(in_wrfnc, "pressure", timeidx=timeidx)
pivot_point = CoordPair(hts.shape[-1] // 2, hts.shape[-2] // 2) pivot_point = CoordPair(hts.shape[-1] // 2, hts.shape[-2] // 2)
# 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)
ht_cross = vertcross(hts, p, pivot_point=pivot_point, angle=90.) ht_cross = vertcross(hts, p, pivot_point=pivot_point, angle=90.)
nt.assert_allclose(to_np(ht_cross), ref_ht_cross, rtol=.01) nt.assert_allclose(to_np(ht_cross), ref_ht_cross, rtol=.01)
@ -123,6 +131,10 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
t2 = getvar(in_wrfnc, "T2", timeidx=timeidx) t2 = getvar(in_wrfnc, "T2", timeidx=timeidx)
pivot_point = CoordPair(t2.shape[-1] // 2, t2.shape[-2] // 2) pivot_point = CoordPair(t2.shape[-1] // 2, t2.shape[-2] // 2)
# Check that it works with numpy arrays
t2_line1 = interpline(to_np(t2), pivot_point=pivot_point,
angle=90.0)
#print (t2_line1)
t2_line1 = interpline(t2, pivot_point=pivot_point, angle=90.0) t2_line1 = interpline(t2, pivot_point=pivot_point, angle=90.0)
nt.assert_allclose(to_np(t2_line1), ref_t2_line) nt.assert_allclose(to_np(t2_line1), ref_t2_line)
@ -136,6 +148,17 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
interp_levels = [200,300,500,1000] interp_levels = [200,300,500,1000]
# Check that it works with numpy arrays
field = vinterp(in_wrfnc,
field=to_np(tk),
vert_coord="theta",
interp_levels=interp_levels,
extrapolate=True,
field_type="tk",
timeidx=timeidx,
log_p=True)
#print (field)
field = vinterp(in_wrfnc, field = vinterp(in_wrfnc,
field=tk, field=tk,
vert_coord="theta", vert_coord="theta",

23
test/utests.py

@ -269,6 +269,9 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
ref_ht_500 = _get_refvals(referent, "z_500", repeat, multi) ref_ht_500 = _get_refvals(referent, "z_500", repeat, multi)
hts = getvar(in_wrfnc, "z", timeidx=timeidx) hts = getvar(in_wrfnc, "z", timeidx=timeidx)
p = getvar(in_wrfnc, "pressure", timeidx=timeidx) p = getvar(in_wrfnc, "pressure", timeidx=timeidx)
# Make sure the numpy versions work first
hts_500 = interplevel(to_np(hts), to_np(p), 500)
hts_500 = interplevel(hts, p, 500) hts_500 = interplevel(hts, p, 500)
nt.assert_allclose(to_np(hts_500), ref_ht_500) nt.assert_allclose(to_np(hts_500), ref_ht_500)
@ -283,6 +286,9 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
pivot_point = CoordPair(hts.shape[-1] / 2, hts.shape[-2] / 2) pivot_point = CoordPair(hts.shape[-1] / 2, hts.shape[-2] / 2)
#ht_cross = vertcross(to_np(hts), p, pivot_point=pivot_point, #ht_cross = vertcross(to_np(hts), p, pivot_point=pivot_point,
# angle=90., latlon=True) # angle=90., latlon=True)
# Make sure the numpy versions work first
ht_cross = vertcross(to_np(hts), to_np(p),
pivot_point=pivot_point, angle=90.)
ht_cross = vertcross(hts, p, pivot_point=pivot_point, angle=90.) ht_cross = vertcross(hts, p, pivot_point=pivot_point, angle=90.)
# Note: Until the bug is fixed in NCL, the wrf-python cross # Note: Until the bug is fixed in NCL, the wrf-python cross
@ -315,6 +321,9 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
#t2_line1 = interpline(to_np(t2), pivot_point=pivot_point, #t2_line1 = interpline(to_np(t2), pivot_point=pivot_point,
# angle=90.0, latlon=True) # angle=90.0, latlon=True)
# Make sure the numpy version works
t2_line1 = interpline(to_np(t2), pivot_point=pivot_point,
angle=90.0)
t2_line1 = interpline(t2, pivot_point=pivot_point, angle=90.0) t2_line1 = interpline(t2, pivot_point=pivot_point, angle=90.0)
# Note: After NCL is fixed, remove the slice. # Note: After NCL is fixed, remove the slice.
@ -337,6 +346,16 @@ def make_interp_test(varname, wrf_in, referent, multi=False,
interp_levels = [200,300,500,1000] interp_levels = [200,300,500,1000]
# Make sure the numpy version works
field = vinterp(in_wrfnc,
field=to_np(tk),
vert_coord="theta",
interp_levels=interp_levels,
extrapolate=True,
field_type="tk",
timeidx=timeidx,
log_p=True)
field = vinterp(in_wrfnc, field = vinterp(in_wrfnc,
field=tk, field=tk,
vert_coord="theta", vert_coord="theta",
@ -630,8 +649,8 @@ class WRFLatLonTest(ut.TestCase):
if __name__ == "__main__": if __name__ == "__main__":
from wrf import (omp_set_num_threads, omp_set_schedule, omp_get_schedule, from wrf import (omp_set_num_threads, omp_set_schedule, omp_get_schedule,
omp_set_dynamic, OMP_SCHED_STATIC) omp_set_dynamic, omp_get_num_procs, OMP_SCHED_STATIC)
omp_set_num_threads(8) omp_set_num_threads(omp_get_num_procs()-1)
omp_set_schedule(OMP_SCHED_STATIC, 0) omp_set_schedule(OMP_SCHED_STATIC, 0)
omp_set_dynamic(False) omp_set_dynamic(False)

Loading…
Cancel
Save