From 1c7baf0a4ef703b8fe124f3fec3bfe2f304439f8 Mon Sep 17 00:00:00 2001 From: Bill Ladwig Date: Fri, 11 Nov 2016 17:15:35 -0700 Subject: [PATCH] Updated documentation. Fixed bugs found while creating examples, mostly related to xarray and compiled extensions. --- doc/source/_static/images/cartopy_slp.png | Bin 0 -> 130623 bytes doc/source/_static/images/matthew.png | Bin 0 -> 56968 bytes doc/source/api.rst | 2 +- doc/source/basic_usage.rst | 1176 +++++++++++++++++++++ doc/source/diagnostics.rst | 7 + doc/source/index.rst | 26 +- doc/source/installation.rst | 54 + doc/source/internal_api/index.rst | 2 - doc/source/new.rst | 10 + doc/source/plot.rst | 91 ++ doc/source/user_api/index.rst | 2 - src/wrf/api.py | 2 + src/wrf/interputils.py | 36 +- src/wrf/latlonutils.py | 16 +- src/wrf/metadecorators.py | 2 +- src/wrf/projection.py | 5 +- src/wrf/util.py | 6 +- src/wrf/uvmet.py | 6 +- test/ipynb/Doc_Examples.ipynb | 415 ++++++++ test/ipynb/WRF_Workshop_Demo.ipynb | 29 +- test/ipynb/WRF_python_demo.ipynb | 275 ++++- test/utests.py | 14 +- 22 files changed, 2083 insertions(+), 93 deletions(-) create mode 100644 doc/source/_static/images/cartopy_slp.png create mode 100644 doc/source/_static/images/matthew.png create mode 100644 doc/source/basic_usage.rst create mode 100644 doc/source/diagnostics.rst create mode 100644 doc/source/installation.rst create mode 100644 doc/source/new.rst create mode 100644 doc/source/plot.rst create mode 100644 test/ipynb/Doc_Examples.ipynb diff --git a/doc/source/_static/images/cartopy_slp.png b/doc/source/_static/images/cartopy_slp.png new file mode 100644 index 0000000000000000000000000000000000000000..d107bd0390aa0864ddf615bb9cda0f572d5888cd GIT binary patch literal 130623 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
    gMTHN|4tx~Usk&D{=A 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 n>CrC%ix7_bkokL%(*5xN>YV5AQR~NIcvL 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

    7Lw7VfR4+GP*3-=?# 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 TMH4nbfD0fdCt53P5cIzQkUO=H literal 0 HcmV?d00001 diff --git a/doc/source/_static/images/matthew.png b/doc/source/_static/images/matthew.png new file mode 100644 index 0000000000000000000000000000000000000000..c2362e86099acc8912d8e01e774b8cdb16a33ee1 GIT binary patch literal 56968 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

    ud;$(NHAN~Z1 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 Q0|H*wID2gQaeT`E0ZZRAYXATM literal 0 HcmV?d00001 diff --git a/doc/source/api.rst b/doc/source/api.rst index a205c49..544c28f 100644 --- a/doc/source/api.rst +++ b/doc/source/api.rst @@ -3,7 +3,7 @@ API Reference .. toctree:: - :maxdepth: 1 + :maxdepth: 2 user_api/index.rst internal_api/index.rst diff --git a/doc/source/basic_usage.rst b/doc/source/basic_usage.rst new file mode 100644 index 0000000..e89dc84 --- /dev/null +++ b/doc/source/basic_usage.rst @@ -0,0 +1,1176 @@ +How To Use +============ + +Basic Usage +---------------- + +.. _diagnostic-usage: + +Computing Diagnostic Variables +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The primary use for the :meth:`wrf.getvar` function is to return diagnostic +variables that require a calculation, since WRF does not produce these variables +natively. These diagnostics include CAPE, storm relative helicity, +omega, sea level pressure, etc. A table of all available diagnostics can be +found here: :ref:`diagnostic-table`. + +In the example below, sea level pressure is calculated and printed. + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + # Get the Sea Level Pressure + slp = getvar(ncfile, "slp") + + print(slp) + +Result: + +.. code-block:: none + + + array([[ 1012.22033691, 1012.29815674, 1012.24786377, ..., + 1010.13201904, 1009.93231201, 1010.06707764], + [ 1012.43286133, 1012.44476318, 1012.33666992, ..., + 1010.1072998 , 1010.10845947, 1010.04760742], + [ 1012.39544678, 1012.38085938, 1012.41705322, ..., + 1010.22937012, 1010.05596924, 1010.02679443], + ..., + [ 1009.0423584 , 1009.06921387, 1008.98779297, ..., + 1019.19281006, 1019.14434814, 1019.1105957 ], + [ 1009.22485352, 1009.07513428, 1008.98638916, ..., + 1019.07189941, 1019.04266357, 1019.0612793 ], + [ 1009.18896484, 1009.1071167 , 1008.97979736, ..., + 1018.91778564, 1018.95684814, 1019.04748535]], dtype=float32) + Coordinates: + XLONG (south_north, west_east) float32 -122.72 -122.693 -122.666 ... + XLAT (south_north, west_east) float32 21.1381 21.1451 21.1521 ... + Time datetime64[ns] 2016-10-07 + * south_north (south_north) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... + * west_east (west_east) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + Attributes: + FieldType: 104 + MemoryOrder: XY + description: sea level pressure + units: hPa + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + +.. _extract_ncvars: + +Extracting WRF NetCDF Variables +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In addition to computing diagnostic variables (see :ref:`diagnostic-usage`), +the :meth:`wrf.getvar` function can be used to extract regular WRF-ARW output +NetCDF variables. + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + p = getvar(ncfile, "P") + + print(p) + +Result: + +.. code-block:: none + + + array([[[ 1.21753906e+03, 1.22532031e+03, 1.22030469e+03, ..., + 1.00760156e+03, 9.87640625e+02, 1.00111719e+03], + [ 1.23877344e+03, 1.24004688e+03, 1.22926562e+03, ..., + 1.00519531e+03, 1.00529688e+03, 9.99171875e+02], + [ 1.23503906e+03, 1.23367188e+03, 1.23731250e+03, ..., + 1.01739844e+03, 1.00005469e+03, 9.97093750e+02], + ..., + [ 1.77978516e+00, 1.77050781e+00, 1.79003906e+00, ..., + 4.22949219e+00, 4.25659180e+00, 4.13647461e+00], + [ 1.73291016e+00, 1.76879883e+00, 1.77978516e+00, ..., + 4.24047852e+00, 4.24707031e+00, 4.13549805e+00], + [ 1.71533203e+00, 1.65722656e+00, 1.67480469e+00, ..., + 4.06884766e+00, 4.03637695e+00, 4.04785156e+00]]], dtype=float32) + Coordinates: + XLONG (south_north, west_east) float32 -122.72 -122.693 -122.666 ... + XLAT (south_north, west_east) float32 21.1381 21.1451 21.1521 ... + Time datetime64[ns] 2016-10-07 + * bottom_top (bottom_top) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + * south_north (south_north) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... + * west_east (west_east) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + Attributes: + FieldType: 104 + MemoryOrder: XYZ + description: perturbation pressure + units: Pa + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + + +Disabling xarray and metadata +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Sometimes you just want a regular numpy array and don't care about metadata. +This is often the case when you are working with compiled extensions. Metadata +can be disabled in one of two ways. + +#. disable xarray completely +#. set the *meta* function parameter to False. + +The example below illustrates both. + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, disable_xarray + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + # Disable xarray completely + disable_xarray() + p_no_meta = getvar(ncfile, "P") + print (type(p_no_meta)) + enable_xarray() + + # Disable by using the meta parameter + p_no_meta = getvar(ncfile, "P", meta=False) + print (type(p_no_meta)) + +Result: + +.. code-block:: none + + + + +Extracting a Numpy Array from a DataArray +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If you need to convert an :class:`xarray.DataArray` to a :class:`numpy.ndarray`, +wrf-python provides the :meth:`wrf.npvalues` function for this purpose. Although +an :class:`xarray.DataArary` object already contains the +:attr:`xarray.DataArray.values` attribute to extract the Numpy array, there is a +problem when working with compiled extensions. The behavior for xarray (and pandas) +is to convert missing/fill values to NaN, which may cause crashes when working +with compiled extensions. Also, some existing code may be designed to work with +:class:`numpy.ma.MaskedArray`, and numpy arrays with NaN may not work with it. + +The :meth:`wrf.npvalues` function does the following: + +#. If no missing/fill values are used, :meth:`wrf.npvalues` simply returns the + :attr:`xarray.DataArray.values` attribute. + +#. If missing/fill values are used, then :meth:`wrf.npvalues` replaces the NaN + values with the _FillValue found in the :attr:`xarray.DataArray.attrs` + attribute (required) and a :class:`numpy.ma.MaskedArray` is returned. + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + # Get the Sea Level Pressure + cape_3d = getvar(ncfile, "cape_3d") + + cape_3d_ndarray = npvalues(cape_3d) + + print(type(cape_3d_ndarray)) + + +Result: + +.. code-block:: none + + + + +Sequences of Files +---------------------- + +Combining Multiple Files Using the 'cat' Method +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The 'cat' (concatenate) method aggregates all files in the sequence along the +'Time' dimension, which will be the leftmost dimension for the output array. +To include all of the times, in all of the files, in the output array, set the +*timeidx* parameter to :data:`wrf.ALL_TIMES` (an alias for None). If a single +value is specified for *timeidx*, then the time index is assumed to be taken from +the concatenation of all times for all files. + +It is import to note that no sorting is performed in the :meth:`wrf.getvar` +routine, so all files in the sequence must be sorted prior to calling this +function. + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, ALL_TIMES + + + # Creating a simple test list with three timesteps + wrflist = [Dataset("wrfout_d01_2016-10-07_00_00_00"), + Dataset("wrfout_d01_2016-10-07_01_00_00"), + Dataset("wrfout_d01_2016-10-07_02_00_00")] + + # Extract the 'P' variable for all times + p_cat = getvar(wrflist, "P", timeidx=ALL_TIMES, method="cat") + + print(p_cat) + +Result: + +.. code-block:: none + + + array([[[[ 1.21753906e+03, 1.22532031e+03, 1.22030469e+03, ..., + 1.00760156e+03, 9.87640625e+02, 1.00111719e+03], + [ 1.23877344e+03, 1.24004688e+03, 1.22926562e+03, ..., + 1.00519531e+03, 1.00529688e+03, 9.99171875e+02], + [ 1.23503906e+03, 1.23367188e+03, 1.23731250e+03, ..., + 1.01739844e+03, 1.00005469e+03, 9.97093750e+02], + ..., + [ 1.77978516e+00, 1.77050781e+00, 1.79003906e+00, ..., + 4.22949219e+00, 4.25659180e+00, 4.13647461e+00], + [ 1.73291016e+00, 1.76879883e+00, 1.77978516e+00, ..., + 4.24047852e+00, 4.24707031e+00, 4.13549805e+00], + [ 1.71533203e+00, 1.65722656e+00, 1.67480469e+00, ..., + 4.06884766e+00, 4.03637695e+00, 4.04785156e+00]]]], dtype=float32) + Coordinates: + XLONG (south_north, west_east) float32 -122.72 -122.693 -122.666 ... + XLAT (south_north, west_east) float32 21.1381 21.1451 21.1521 ... + * Time (Time) datetime64[ns] 2016-10-07 2016-10-07 2016-10-07 + * bottom_top (bottom_top) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + * south_north (south_north) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... + * west_east (west_east) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + datetime (Time) datetime64[ns] 2016-10-07T00:00:00 ... + Attributes: + FieldType: 104 + MemoryOrder: XYZ + description: perturbation pressure + units: Pa + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + + +Combining Multiple Files Using the 'join' Method +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The 'join' method combines a sequence of files by adding a new leftmost +dimension for the file/sequence index. In situations where there are multiple +files with multiple times, and the last file contains less times than the +previous files, the remaining arrays will be arrays filled with missing values. +There are checks in place within the wrf-python algorithms to look for these missing +arrays, but be careful when calling compiled routines outside of wrf-python. + +In most cases, *timeidx* parameter should be set to :data:`wrf.ALL_TIMES`. If +a *timeidx* value is specified, then this time index is used when extracting the +variable from each file. In cases where there are multiple files with multiple +time steps, this is probably nonsensical, since the nth time index for each +file represents a different time. + +In general, join is rarely used, so the concatenate method should be used +for most cases. + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, ALL_TIMES + + + # Creating a simple test list with three timesteps + wrflist = [Dataset("wrfout_d01_2016-10-07_00_00_00"), + Dataset("wrfout_d01_2016-10-07_01_00_00"), + Dataset("wrfout_d01_2016-10-07_02_00_00")] + + # Extract the 'P' variable for all times + p_join = getvar(wrflist, "P", timeidx=ALL_TIMES, method="join") + + print(p_join) + +Result: + +.. code-block:: none + + + array([[[[ 1.21753906e+03, 1.22532031e+03, 1.22030469e+03, ..., + 1.00760156e+03, 9.87640625e+02, 1.00111719e+03], + [ 1.23877344e+03, 1.24004688e+03, 1.22926562e+03, ..., + 1.00519531e+03, 1.00529688e+03, 9.99171875e+02], + [ 1.23503906e+03, 1.23367188e+03, 1.23731250e+03, ..., + 1.01739844e+03, 1.00005469e+03, 9.97093750e+02], + ..., + [ 1.77978516e+00, 1.77050781e+00, 1.79003906e+00, ..., + 4.22949219e+00, 4.25659180e+00, 4.13647461e+00], + [ 1.73291016e+00, 1.76879883e+00, 1.77978516e+00, ..., + 4.24047852e+00, 4.24707031e+00, 4.13549805e+00], + [ 1.71533203e+00, 1.65722656e+00, 1.67480469e+00, ..., + 4.06884766e+00, 4.03637695e+00, 4.04785156e+00]]]], dtype=float32) + Coordinates: + XLONG (south_north, west_east) float32 -122.72 -122.693 -122.666 ... + XLAT (south_north, west_east) float32 21.1381 21.1451 21.1521 ... + * bottom_top (bottom_top) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + * south_north (south_north) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... + * west_east (west_east) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + * file (file) int64 0 1 2 + datetime (file) datetime64[ns] 2016-10-07T00:00:00 ... + Time int64 0 + Attributes: + FieldType: 104 + MemoryOrder: XYZ + description: perturbation pressure + units: Pa + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + + +Note how the 'Time' dimension was replaced with the 'file' dimension, due to the +numpy's automatic squeezing of the single 'Time' dimension. To maintain the +'Time' dimension, set the *squeeze* parameter to False. + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, ALL_TIMES + + + # Creating a simple test list with three timesteps + wrflist = [Dataset("wrfout_d01_2016-10-07_00_00_00"), + Dataset("wrfout_d01_2016-10-07_01_00_00"), + Dataset("wrfout_d01_2016-10-07_02_00_00")] + + # Extract the 'P' variable for all times + p_join = getvar(wrflist, "P", timeidx=ALL_TIMES, method="join", squeeze=False) + + print(p_join) + +Result + +.. code-block:: none + + + array([[[[[ 1.21753906e+03, 1.22532031e+03, 1.22030469e+03, ..., + 1.00760156e+03, 9.87640625e+02, 1.00111719e+03], + [ 1.23877344e+03, 1.24004688e+03, 1.22926562e+03, ..., + 1.00519531e+03, 1.00529688e+03, 9.99171875e+02], + [ 1.23503906e+03, 1.23367188e+03, 1.23731250e+03, ..., + 1.01739844e+03, 1.00005469e+03, 9.97093750e+02], + ..., + [ 1.77978516e+00, 1.77050781e+00, 1.79003906e+00, ..., + 4.22949219e+00, 4.25659180e+00, 4.13647461e+00], + [ 1.73291016e+00, 1.76879883e+00, 1.77978516e+00, ..., + 4.24047852e+00, 4.24707031e+00, 4.13549805e+00], + [ 1.71533203e+00, 1.65722656e+00, 1.67480469e+00, ..., + 4.06884766e+00, 4.03637695e+00, 4.04785156e+00]]]]], dtype=float32) + Coordinates: + XLONG (south_north, west_east) float32 -122.72 -122.693 -122.666 ... + XLAT (south_north, west_east) float32 21.1381 21.1451 21.1521 ... + * bottom_top (bottom_top) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + * south_north (south_north) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... + * west_east (west_east) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + * file (file) int64 0 1 2 + datetime (file, Time) datetime64[ns] 2016-10-07T00:00:00 ... + * Time (Time) int64 0 + Attributes: + FieldType: 104 + MemoryOrder: XYZ + description: perturbation pressure + units: Pa + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + + +Dictionaries of WRF File Sequences +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Dictionaries can also be used as input to the :meth:`wrf.getvar` functions. +This can be useful when working with ensembles. However, all WRF files in the +dictionary must have the same dimensions. The result is an array where the +leftmost dimension is the keys from the dictionary. Nested dictionaries +are allowed. + +The *method* argument is used to describe how each sequence in the dictionary +will be combined. + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, ALL_TIMES + + wrf_dict = {"ens1" : [Dataset("ens1/wrfout_d01_2016-10-07_00_00_00"), + Dataset("ens1/wrfout_d01_2016-10-07_01_00_00"), + Dataset("ens1/wrfout_d01_2016-10-07_02_00_00")], + "ens2" : [Dataset("ens2/wrfout_d01_2016-10-07_00_00_00"), + Dataset("ens2/wrfout_d01_2016-10-07_01_00_00"), + Dataset("ens2/wrfout_d01_2016-10-07_02_00_00")] + } + + p = getvar(wrf_dict, "P", timeidx=ALL_TIMES) + + print(p) + +Result: + +.. code-block:: none + + + array([[[[[ 1.21753906e+03, 1.22532031e+03, 1.22030469e+03, ..., + 1.00760156e+03, 9.87640625e+02, 1.00111719e+03], + [ 1.23877344e+03, 1.24004688e+03, 1.22926562e+03, ..., + 1.00519531e+03, 1.00529688e+03, 9.99171875e+02], + [ 1.23503906e+03, 1.23367188e+03, 1.23731250e+03, ..., + 1.01739844e+03, 1.00005469e+03, 9.97093750e+02], + ..., + [ 1.77978516e+00, 1.77050781e+00, 1.79003906e+00, ..., + 4.22949219e+00, 4.25659180e+00, 4.13647461e+00], + [ 1.73291016e+00, 1.76879883e+00, 1.77978516e+00, ..., + 4.24047852e+00, 4.24707031e+00, 4.13549805e+00], + [ 1.71533203e+00, 1.65722656e+00, 1.67480469e+00, ..., + 4.06884766e+00, 4.03637695e+00, 4.04785156e+00]]]]], dtype=float32) + Coordinates: + XLONG (south_north, west_east) float32 -122.72 -122.693 -122.666 ... + XLAT (south_north, west_east) float32 21.1381 21.1451 21.1521 ... + * Time (Time) datetime64[ns] 2016-10-07T00:00:00 ... + * bottom_top (bottom_top) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + * south_north (south_north) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... + * west_east (west_east) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + datetime (Time) datetime64[ns] 2016-10-07T00:00:00 ... + * key_0 (key_0) + array([[ 5882.16992188, 5881.87939453, 5881.81005859, ..., + 5890.14501953, 5890.23583984, 5890.33349609], + [ 5882.71777344, 5882.17529297, 5882.1171875 , ..., + 5890.37695312, 5890.38525391, 5890.27978516], + [ 5883.32177734, 5882.47119141, 5882.34130859, ..., + 5890.48339844, 5890.42871094, 5890.17724609], + ..., + [ 5581.45800781, 5580.46826172, 5579.32617188, ..., + 5788.93554688, 5788.70507812, 5788.64453125], + [ 5580.32714844, 5579.51611328, 5578.34863281, ..., + 5788.15869141, 5787.87304688, 5787.65527344], + [ 5579.64404297, 5578.30957031, 5576.98632812, ..., + 5787.19384766, 5787.10888672, 5787.06933594]], dtype=float32) + Coordinates: + XLONG (south_north, west_east) float32 -122.72 -122.693 -122.666 ... + XLAT (south_north, west_east) float32 21.1381 21.1451 21.1521 ... + Time datetime64[ns] 2016-10-07 + * south_north (south_north) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... + * west_east (west_east) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + Attributes: + FieldType: 104 + units: m + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + level: 500 hPa + missing_value: 9.96920996839e+36 + _FillValue: 9.96920996839e+36 + + +.. _vert_cross_interp: + +Vertical Cross Sections +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The :meth:`wrf.vertcross` function is used to create vertical cross sections. +To define a cross section, a start point and an end point needs to be specified. +Alternatively, a pivot point and an angle may be used. The start point, +end point, and pivot point are specified using a :class:`wrf.CoordPair` object, +and coordinates can either be in grid (x,y) coordinates or (latitude,longitude) +coordinates. When using (latitude,longitude) coordinates, a NetCDF file object or +a :class:`wrf.WrfProj` object must be provided. + +The vertical levels can also be specified using the *levels* parameter. If +not specified, then approximately 100 levels will be chosen in 1% increments. + +Example Using Start Point and End Point +***************************************** + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, vertcross, CoordPair + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + # Get the geopotential height (m) and pressure (hPa). + z = getvar(ncfile, "z") + p = getvar(ncfile, "pressure") + + # Define a start point and end point in grid coordinates + start_point = CoordPair(x=0, y=(z.shape[-2]-1)//2) + end_point = CoordPair(x=-1, y=(z.shape[-2]-1)//2) + + # Calculate the vertical cross section. By setting latlon to True, this + # also calculates the latitude and longitude coordinates along the cross + # section line and adds them to the 'xy_loc' metadata to help with plotting. + p_vert = vertcross(p, z, start_point=start_point, end_point=end_point, latlon=True) + + print(p_vert) + +Result: + +.. code-block:: none + + + array([[ nan, nan, nan, ..., nan, + nan, nan], + [ 989.66168213, 989.66802979, 989.66351318, ..., 988.05737305, + 987.99151611, 987.96917725], + [ 959.49450684, 959.50109863, 959.50030518, ..., 958.96948242, + 958.92980957, 958.89294434], + ..., + [ 24.28092003, 24.27359581, 24.27034378, ..., 24.24800491, + 24.2486496 , 24.24947357], + [ 23.2868309 , 23.27933884, 23.27607918, ..., 23.25231361, + 23.2530098 , 23.25384521], + [ nan, nan, nan, ..., nan, + nan, nan]], dtype=float32) + Coordinates: + Time datetime64[ns] 2016-10-07 + xy_loc (idx) object CoordPair(x=0.0, y=529.0, lat=34.5279502869, lon=-127.398925781) ... + * vertical (vertical) float32 0.0 261.828 523.656 785.484 1047.31 1309.14 ... + * idx (idx) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... + Attributes: + FieldType: 104 + description: pressure + units: hPa + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + orientation: (0.0, 529.0) to (1797.0, 529.0) + missing_value: 9.96920996839e+36 + _FillValue: 9.96920996839e+36 + + +Example Using Pivot Point and Angle +************************************* + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, vertcross, CoordPair + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + # Get the geopotential height (m) and pressure (hPa). + z = getvar(ncfile, "z") + p = getvar(ncfile, "pressure") + + # Define a pivot point and angle in grid coordinates, with the + # pivot point being the center of the grid. + pivot_point = CoordPair(x=(z.shape[-1]-1)//2, y=(z.shape[-2]-1)//2) + angle = 90.0 + + # Calculate the vertical cross section. By setting latlon to True, this + # also calculates the latitude and longitude coordinates along the line + # and adds them to the metadata to help with plotting labels. + p_vert = vertcross(p, z, pivot_point=pivot_point, angle=angle, latlon=True) + + print (p_vert) + +Result: + +.. code-block:: none + + + array([[ nan, nan, nan, ..., nan, + nan, nan], + [ 989.66168213, 989.66802979, 989.66351318, ..., 988.05737305, + 987.99151611, 987.96917725], + [ 959.49450684, 959.50109863, 959.50030518, ..., 958.96948242, + 958.92980957, 958.89294434], + ..., + [ 24.28092003, 24.27359581, 24.27034378, ..., 24.24800491, + 24.2486496 , 24.24947357], + [ 23.2868309 , 23.27933884, 23.27607918, ..., 23.25231361, + 23.2530098 , 23.25384521], + [ nan, nan, nan, ..., nan, + nan, nan]], dtype=float32) + Coordinates: + Time datetime64[ns] 2016-10-07 + xy_loc (idx) object CoordPair(x=0.0, y=529.0, lat=34.5279502869, lon=-127.398925781) ... + * vertical (vertical) float32 0.0 261.828 523.656 785.484 1047.31 1309.14 ... + * idx (idx) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... + Attributes: + FieldType: 104 + description: pressure + units: hPa + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + orientation: (0.0, 529.0) to (1797.0, 529.0) ; center=CoordPair(x=899.0, y=529.0) ; angle=90.0 + missing_value: 9.96920996839e+36 + _FillValue: 9.96920996839e+36 + + +Example Using Lat/Lon Coordinates +************************************* + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, vertcross, CoordPair + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + # Get the geopotential height (m) and pressure (hPa). + z = getvar(ncfile, "z") + p = getvar(ncfile, "pressure") + lats = getvar(ncfile, "lat") + lons = getvar(ncfile, "lon") + + # Making the same horizontal line, but with lats/lons + start_lat = lats[(lats.shape[-2]-1)//2, 0] + end_lat = lats[(lats.shape[-2]-1)//2, -1] + start_lon = lons[(lats.shape[-2]-1)//2, 0] + end_lon = lons[(lats.shape[-2]-1)//2, -1] + + # Cross section line using start_point and end_point. + start_point = CoordPair(lat=start_lat, lon=start_lon) + end_point = CoordPair(lat=end_lat, lon=end_lon) + + # When using lat/lon coordinates, you must supply a netcdf file object, or a + # projection object. + p_vert = vertcross(p, z, wrfin=ncfile, start_point=start_point, end_point=end_point, latlon=True) + print(p_vert) + +Result: + +.. code-block:: none + + + array([[ nan, nan, nan, ..., nan, + nan, nan], + [ 989.66168213, 989.66802979, 989.66351318, ..., 988.05737305, + 987.99151611, 987.96917725], + [ 959.49450684, 959.50109863, 959.50030518, ..., 958.96948242, + 958.92980957, 958.89294434], + ..., + [ 24.28092003, 24.27359581, 24.27034378, ..., 24.24800491, + 24.2486496 , 24.24947357], + [ 23.2868309 , 23.27933884, 23.27607918, ..., 23.25231361, + 23.2530098 , 23.25384521], + [ nan, nan, nan, ..., nan, + nan, nan]], dtype=float32) + Coordinates: + Time datetime64[ns] 2016-10-07 + xy_loc (idx) object CoordPair(x=0.0, y=529.0, lat=34.5279502869, lon=-127.398925781) ... + * vertical (vertical) float32 0.0 261.828 523.656 785.484 1047.31 1309.14 ... + * idx (idx) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... + Attributes: + FieldType: 104 + description: pressure + units: hPa + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + orientation: (0.0, 529.0) to (1797.0, 529.0) + missing_value: 9.96920996839e+36 + _FillValue: 9.96920996839e+36 + + +Example Using Specified Vertical Levels +***************************************** + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, vertcross, CoordPair + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + # Get the geopotential height (m) and pressure (hPa). + z = getvar(ncfile, "z") + p = getvar(ncfile, "pressure") + lats = getvar(ncfile, "lat") + lons = getvar(ncfile, "lon") + + # Making the same horizontal line, but with lats/lons + start_lat = lats[(lats.shape[-2]-1)//2, 0] + end_lat = lats[(lats.shape[-2]-1)//2, -1] + start_lon = lons[(lats.shape[-2]-1)//2, 0] + end_lon = lons[(lats.shape[-2]-1)//2, -1] + + # Pressure using start_point and end_point. These were obtained using + start_point = CoordPair(lat=start_lat, lon=start_lon) + end_point = CoordPair(lat=end_lat, lon=end_lon) + + # Specify vertical levels + levels = [1000., 2000., 3000.] + + # Calculate the cross section + p_vert = vertcross(p, z, wrfin=ncfile, levels=levels, start_point=start_point, end_point=end_point, latlon=True) + + print(p_vert) + +Result: + +.. code-block:: none + + + array([[ 906.375 , 906.38043213, 906.39367676, ..., 907.6661377 , + 907.63006592, 907.59191895], + [ 804.24737549, 804.26885986, 804.28076172, ..., 806.98632812, + 806.95556641, 806.92608643], + [ 713.24578857, 713.2722168 , 713.27886963, ..., 716.09594727, + 716.06610107, 716.03503418]], dtype=float32) + Coordinates: + Time datetime64[ns] 2016-10-07 + xy_loc (idx) object CoordPair(x=0.0, y=529.0, lat=34.5279502869, lon=-127.398925781) ... + * vertical (vertical) float32 1000.0 2000.0 3000.0 + * idx (idx) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... + Attributes: + FieldType: 104 + description: pressure + units: hPa + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + orientation: (0.0, 529.0) to (1797.0, 529.0) + missing_value: 9.96920996839e+36 + _FillValue: 9.96920996839e+36 + + +Interpolating Two-Dimensional Fields to a Line +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Two-dimensional fields can be interpolated along a line, in a manner similar to +the vertical cross section (see :ref:`vert_cross_interp`), using the +:meth:`wrf.interpline` function. To define the line +to interpolate along, a start point and an end point needs to be specified. +Alternatively, a pivot point and an angle may be used. The start point, +end point, and pivot point are specified using a :class:`wrf.CoordPair` object, +and coordinates can either be in grid (x,y) coordinates or (latitude,longitude) +coordinates. When using (latitude,longitude) coordinates, a NetCDF file object or +a :class:`wrf.WrfProj` object must also be provided. + +Example Using Start Point and End Point +***************************************** + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, interpline, CoordPair + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + # Get the 2m temperature + t2 = getvar(ncfile, "T2") + + # Create a south-north line in the center of the domain using + # start point and end point + start_point = CoordPair(x=(t2.shape[-1]-1)//2, y=0) + end_point = CoordPair(x=(t2.shape[-1]-1)//2, y=-1) + + # Calculate the vertical cross section. By setting latlon to True, this + # also calculates the latitude and longitude coordinates along the line + # and adds them to the metadata to help with plotting labels. + t2_line = interpline(t2, start_point=start_point, end_point=end_point, latlon=True) + + print(t2_line, "\n") + +Result: + +.. code-block:: none + + + array([ 302.07214355, 302.08505249, 302.08688354, ..., 279.18557739, + 279.1998291 , 279.23132324], dtype=float32) + Coordinates: + Time datetime64[ns] 2016-10-07 + xy_loc (line_idx) object CoordPair(x=899.0, y=0.0, lat=24.3645858765, lon=-97.5) ... + * line_idx (line_idx) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... + Attributes: + FieldType: 104 + description: TEMP at 2 M + units: K + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + orientation: (899.0, 0.0) to (899.0, 1057.0) + + +Example Using Pivot Point and Angle +***************************************** + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, interpline, CoordPair + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + # Get the 2m temperature + t2 = getvar(ncfile, "T2") + + # Create a south-north line using pivot point and angle + pivot_point = CoordPair((t2.shape[-1]-1)//2, (t2.shape[-2]-1)//2) + angle = 0.0 + + # Calculate the vertical cross section. By setting latlon to True, this + # also calculates the latitude and longitude coordinates along the line + # and adds them to the metadata to help with plotting labels. + t2_line = interpline(t2, start_point=start_point, end_point=end_point, latlon=True) + + print(t2_line, "\n") + +Result: + +.. code-block:: none + + + array([ 302.07214355, 302.08505249, 302.08688354, ..., 279.18557739, + 279.1998291 , 279.23132324], dtype=float32) + Coordinates: + Time datetime64[ns] 2016-10-07 + xy_loc (line_idx) object CoordPair(x=899.0, y=0.0, lat=24.3645858765, lon=-97.5) ... + * line_idx (line_idx) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... + Attributes: + FieldType: 104 + description: TEMP at 2 M + units: K + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + orientation: (899.0, 0.0) to (899.0, 1057.0) ; center=CoordPair(x=899, y=529) ; angle=0.0 + + +Example Using Lat/Lon Coordinates +************************************* + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, interpline, CoordPair + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + t2 = getvar(ncfile, "T2") + lats = getvar(ncfile, "lat") + lons = getvar(ncfile, "lon") + + # Select the latitude,longitude points for a vertical line through + # the center of the domain. + start_lat = lats[0, (lats.shape[-1]-1)//2] + end_lat = lats[-1, (lats.shape[-1]-1)//2] + start_lon = lons[0, (lons.shape[-1]-1)//2] + end_lon = lons[-1, (lons.shape[-1]-1)//2] + + # Create the CoordPairs + start_point = CoordPair(lat=start_lat, lon=start_lon) + end_point = CoordPair(lat=end_lat, lon=end_lon) + + # Calculate the vertical cross section. By setting latlon to True, this + # also calculates the latitude and longitude coordinates along the line + # and adds them to the metadata to help with plotting labels. + t2_line = interpline(t2, wrfin=ncfile, start_point=start_point, end_point=end_point, latlon=True) + + print (t2_line) + +Result: + +.. code-block:: none + + + array([ 302.07214355, 302.08505249, 302.08688354, ..., 279.18557739, + 279.1998291 , 279.23132324], dtype=float32) + Coordinates: + Time datetime64[ns] 2016-10-07 + xy_loc (line_idx) object CoordPair(x=899.0, y=0.0, lat=24.3645858765, lon=-97.5) ... + * line_idx (line_idx) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ... + Attributes: + FieldType: 104 + description: TEMP at 2 M + units: K + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + orientation: (899.0, 0.0) to (899.0, 1057.0) + + +Interpolating a 3D Field to a Surface Type +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The :meth:`wrf.vinterp` is used to interpolate a field to a type of surface. +The available surfaces are pressure, geopotential height, theta, and theta-e. +The surface levels to interpolate also need to be specified. + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, interpline, CoordPair + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + # Interpolate tk to theta-e levels + interp_levels = [200, 300, 500, 1000] + + interp_field = vinterp(ncfile, + field=tk, + vert_coord="eth", + interp_levels=interp_levels, + extrapolate=True, + field_type="tk", + log_p=True) + + print(interp_field) + +Result: + +.. code-block:: none + + + array([[[ 296.12872314, 296.1166687 , 296.08905029, ..., 301.71026611, + 301.67956543, 301.67791748], + [ 296.11352539, 295.95581055, 295.91555786, ..., 301.63052368, + 301.62905884, 301.65887451], + [ 296.07556152, 295.91577148, 295.88214111, ..., 301.61499023, + 301.60287476, 301.63961792], + ..., + [ 219.11134338, 219.08581543, 219.08602905, ..., 218.29879761, + 218.30923462, 218.3787384 ], + [ 219.09260559, 219.07765198, 219.08340454, ..., 218.2855072 , + 218.30444336, 218.37931824], + [ 219.07936096, 219.08181763, 219.10089111, ..., 218.31173706, + 218.34288025, 218.3687439 ]]], dtype=float32) + Coordinates: + XLONG (south_north, west_east) float32 -122.72 -122.693 -122.666 ... + XLAT (south_north, west_east) float32 21.1381 21.1451 21.1521 ... + Time datetime64[ns] 2016-10-07 + * south_north (south_north) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... + * west_east (west_east) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... + * interp_level (interp_level) int64 200 300 500 1000 + Attributes: + FieldType: 104 + MemoryOrder: XYZ + description: temperature + units: K + stagger: + coordinates: XLONG XLAT + projection: LambertConformal(bottom_left=(21.138123, -122.71953), + top_right=(47.843636, -60.901367), stand_lon=-97.5, + moad_cen_lat=38.5000038147, truelat1=38.5, truelat2=38.5, + pole_lat=90.0, pole_lon=0.0) + vert_interp_type: eth + + +Lat/Lon <-> XY Routines +-------------------------- + +wrf-python includes a set of routines for converting back and forth between +latitude,longitude space and x,y space. The methods are :meth:`wrf.xy_to_ll`, +:meth:`wrf.xy_to_ll_proj`, :meth:`wrf.ll_to_xy`, :meth:`wrf.ll_to_xy_proj`. +The *latitude*, *longitude*, *x*, and *y* parameters to these methods +can contain sequences if multiple points are desired to be converted. + +Example With Single Coordinates +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + from wrf import getvar, interpline, CoordPair, xy_to_ll, ll_to_xy + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + lat_lon = xy_to_ll(ncfile, 400, 200) + + print(lat_lon) + + x_y = ll_to_xy(ncfile, lat_lon[0], lat_lon[1]) + + print (x_y) + +Result: + +.. code-block:: none + + + array([ 28.55816408, -112.67827617]) + Coordinates: + * lat_lon (lat_lon) + array([400, 200]) + Coordinates: + latlon_coord object CoordPair(lat=28.5581640822, lon=-112.678276173) + * x_y (x_y) + array([[ 28.55816408, 27.03835783], + [-112.67827617, -121.36392174]]) + Coordinates: + * lat_lon (lat_lon) + array([[400, 105], + [200, 205]]) + Coordinates: + latlon_coord (idx) object CoordPair(lat=28.5581640822, lon=-112.678276173) ... + * x_y (x_y) `_:: + + $ conda install -c bladwig wrf-python + + +Installing via Source Code +-------------------------- + +Installation via source code will require a Fortran and C compiler in order +to run f2py. You can get them +`here `_. + +The source code is available via github: + +https://github.com/NCAR/wrf-python + +To install, change to the wrf-python directory and run:: + + $ pip install . + + diff --git a/doc/source/internal_api/index.rst b/doc/source/internal_api/index.rst index 9bbba0f..11fa312 100644 --- a/doc/source/internal_api/index.rst +++ b/doc/source/internal_api/index.rst @@ -1,8 +1,6 @@ Internal API ============= -------------- - Routines ------------- diff --git a/doc/source/new.rst b/doc/source/new.rst new file mode 100644 index 0000000..9ae2363 --- /dev/null +++ b/doc/source/new.rst @@ -0,0 +1,10 @@ +What's New +=========== + +v1.0a3 +----------- + +- Alpha release 3 +- Added docstrings +- Now uses CoordPair for cross sections so that lat/lon can be used +- Renamed some functions and or arguments diff --git a/doc/source/plot.rst b/doc/source/plot.rst new file mode 100644 index 0000000..50452d4 --- /dev/null +++ b/doc/source/plot.rst @@ -0,0 +1,91 @@ +Plotting Examples +================= + +The examples below show how wrf-python can be used to make plots with +matplotlib (with basemap and cartopy) and PyNGL. None of these examples +make use of xarray's builtin plotting functions, since additional work is most +likely needed to extend xarray in order to work correctly. This is planned +for a future release. + +Matplotlib With Cartopy +------------------------- + +Cartopy is becoming the main tool for base mapping with matplotlib, but you should +be aware of a few shortcomings when working with WRF data. + +- The builtin tranformations of coordinates when calling the contouring functions + do not work correctly with the rotated pole projection. The + transform_points method needs to be called manually on the latitude and + longitude arrays. + +- The rotated pole projection requires the x and y limits to be set manually + using set_xlim and set_ylim. + +- You can't place latitude and longitude labels on the axes when using + any projection other than Mercator or LatLon. + + +Plotting a Two-dimensional Field +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. image:: _static/images/cartopy_slp.png + :scale: 100% + :align: center + +.. code-block:: python + + from __future__ import (absolute_import, division, print_function, unicode_literals) + + from netCDF4 import Dataset + import matplotlib.pyplot as plt + from matplotlib.cm import get_cmap + import cartopy.crs as crs + from cartopy.feature import NaturalEarthFeature + + from wrf import npvalues, getvar, smooth2d + + ncfile = Dataset("wrfout_d01_2016-10-07_00_00_00") + + # Get the sea level pressure + slp = getvar(ncfile, "slp") + + # Smooth the sea level pressure since it tends to be noisy near the mountains + smooth_slp = smooth2d(slp, 3) + + # Get the numpy array from the XLAT and XLONG coordinates + lats = npvalues(slp.coords["XLAT"]) + lons = npvalues(slp.coords["XLONG"]) + + # Get the wrf.WrfProj object + wrf_proj = slp.attrs["projection"] + + # The WrfProj.cartopy() method returns a cartopy.crs projection object + cart_proj = wrf_proj.cartopy() + + # Create a figure that's 10x10 + fig = plt.figure(figsize=(10,10)) + + # Get the GeoAxes set 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', + 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. + # The transform keyword indicates that the lats and lons arrays are lat/lon coordinates and tells + # cartopy to transform the points in to the WRF projection set for the GeoAxes. + plt.contour(lons, lats, npvalues(smooth_slp), 10, colors="black", transform=crs.PlateCarree()) + plt.contourf(lons, lats, npvalues(smooth_slp), 10, transform=crs.PlateCarree()) + + # Add a color bar + plt.colorbar(ax=ax, shrink=.47) + + # Set the map limits + ax.set_xlim(wrf_proj.cartopy_xlim()) + ax.set_ylim(wrf_proj.cartopy_ylim()) + + # Add the gridlines + ax.gridlines() diff --git a/doc/source/user_api/index.rst b/doc/source/user_api/index.rst index d5a1ea3..7e30cbe 100644 --- a/doc/source/user_api/index.rst +++ b/doc/source/user_api/index.rst @@ -1,8 +1,6 @@ User API ============= ------------------ - Routines ------------------ diff --git a/src/wrf/api.py b/src/wrf/api.py index 3ab32b4..6ef5ec9 100644 --- a/src/wrf/api.py +++ b/src/wrf/api.py @@ -29,6 +29,7 @@ from .projection import (WrfProj, NullProjection, LambertConformal, Mercator, PolarStereographic, LatLon, RotatedLatLon, getproj) from .coordpair import CoordPair +from .interputils import to_xy_coords from cache import cache_item, get_cached_item from .version import __version__ @@ -63,6 +64,7 @@ __all__ += ["npvalues", "extract_global_attrs", "is_standard_wrf_var", __all__ += ["WrfProj", "NullProjection", "LambertConformal", "Mercator", "PolarStereographic", "LatLon", "RotatedLatLon", "getproj"] __all__ += ["CoordPair"] +__all__ += ["to_xy_coords"] __all__ += ["cache_item", "get_cached_item"] __all__ += ["__version__"] diff --git a/src/wrf/interputils.py b/src/wrf/interputils.py index 0faa989..0da2c66 100644 --- a/src/wrf/interputils.py +++ b/src/wrf/interputils.py @@ -408,24 +408,26 @@ def to_xy_coords(pairs, wrfin=None, timeidx=0, stagger=None, projection=None): latinc = 0.0 loninc = 0.0 - xy_vals = _ll_to_xy(lat, lon, meta=False, squeeze=True, - as_int=True, - map_proj=projection.map_proj, - truelat1=projection.truelat1, - truelat2=projection.truelat2, - stand_lon=projection.stand_lon, - ref_lat=projection.ll_lat, - ref_lon=projection.ll_lon, - pole_lat=pole_lat, - pole_lon=pole_lon, - known_x=0, - known_y=0, - dx=projection.dx, - dy=projection.dy, - latinc=latinc, - loninc=loninc) - + as_int=True, + map_proj=projection.map_proj, + truelat1=projection.truelat1, + truelat2=projection.truelat2, + stand_lon=projection.stand_lon, + ref_lat=projection.ll_lat, + ref_lon=projection.ll_lon, + pole_lat=pole_lat, + pole_lon=pole_lon, + known_x=0, + known_y=0, + dx=projection.dx, + dy=projection.dy, + latinc=latinc, + loninc=loninc) + + xy_vals = xy_vals.squeeze() + + if xy_vals.ndim == 1: return CoordPair(x=xy_vals[0], y=xy_vals[1]) else: diff --git a/src/wrf/latlonutils.py b/src/wrf/latlonutils.py index 00aee6b..b21bbd6 100644 --- a/src/wrf/latlonutils.py +++ b/src/wrf/latlonutils.py @@ -9,7 +9,8 @@ from .constants import Constants, ProjectionTypes from .extension import _lltoxy, _xytoll from .util import (extract_vars, extract_global_attrs, either, is_moving_domain, is_multi_time_req, - iter_left_indexes, is_mapping, is_multi_file) + iter_left_indexes, is_mapping, is_multi_file, + npvalues) from .py3compat import viewkeys, viewitems from .projutils import dict_keys_to_upper @@ -372,11 +373,10 @@ def _ll_to_xy(latitude, longitude, wrfin=None, timeidx=0, lats = np.asarray(latitude) lons = np.asarray(longitude) - if lats.ndim > 1: - lats = lats.ravel() + # Note: For scalars, this will make a single element array + lats = lats.ravel() - if lons.ndim > 1: - lons = lons.ravel() + lons = lons.ravel() if (lats.size != lons.size): raise ValueError("'latitude' and 'longitude' " @@ -541,11 +541,9 @@ def _xy_to_ll(x, y, wrfin=None, timeidx=0, stagger=None, x_arr = x_arr + 1 y_arr = y_arr + 1 - if x_arr.ndim > 1: - x_arr = x_arr.ravel() + x_arr = x_arr.ravel() - if y_arr.ndim > 1: - y_arr = y_arr.ravel() + y_arr = y_arr.ravel() if (x_arr.size != y_arr.size): raise ValueError("'x' and 'y' must be the same length") diff --git a/src/wrf/metadecorators.py b/src/wrf/metadecorators.py index 0eb8e3a..3e8cce1 100644 --- a/src/wrf/metadecorators.py +++ b/src/wrf/metadecorators.py @@ -783,7 +783,7 @@ def _set_horiz_meta(wrapped, instance, args, kwargs): outname = "field3d_{0}".format(name_levelstr) outattrs = OrderedDict() - outattrs["PlotLevelID"] = levelstr + outattrs["level"] = levelstr outattrs["missing_value"] = missingval outattrs["_FillValue"] = missingval diff --git a/src/wrf/projection.py b/src/wrf/projection.py index d706181..99b6e02 100644 --- a/src/wrf/projection.py +++ b/src/wrf/projection.py @@ -47,7 +47,7 @@ if cartopy_enabled(): extent of the projection. Default is -80.0. max_latitude (:obj:`float`, optional): The maximum northerly - extent of the projection. Default is 84.0.. + extent of the projection. Default is 84.0. globe (:class:`cartopy.crs.Globe`, optional): A globe object. If omitted, a default globe is created. @@ -280,10 +280,13 @@ class WrfProj(object): def __repr__(self): args = ("bottom_left={}, top_right={}, " "stand_lon={}, moad_cen_lat={}, " + "truelat1={}, truelat2={}, " "pole_lat={}, pole_lon={}".format((self.ll_lat, self.ll_lon), (self.ur_lat, self.ur_lon), self.stand_lon, self.moad_cen_lat, + self.truelat1, + self.truelat2, self.pole_lat, self.pole_lon)) return "{}({})".format(self.__class__.__name__, args) diff --git a/src/wrf/util.py b/src/wrf/util.py index b4a1333..061a76a 100644 --- a/src/wrf/util.py +++ b/src/wrf/util.py @@ -920,14 +920,11 @@ def _combine_dict(wrfdict, varname, timeidx, method, meta, _key): is_moving = is_moving_domain(wrfdict, varname, _key=_key) - # Not quite sure how to handle coord caching with dictionaries, so - # disabling it for now by setting _key to None. first_array = _extract_var(wrfdict[first_key], varname, timeidx, is_moving=is_moving, method=method, squeeze=False, cache=None, meta=meta, _key=_key[first_key]) - # Create the output data numpy array based on the first array outdims = [numkeys] outdims += first_array.shape @@ -1587,7 +1584,6 @@ def _cat_files(wrfseq, varname, timeidx, is_moving, squeeze, meta, _key): outdata[startidx:endidx, :] = vardata[:] if xarray_enabled() and meta: - # XTIME new in 3.7 if timename is not None and not timecached: xtimedata = wrfnc.variables[timename][:] outxtimes[startidx:endidx] = xtimedata[:] @@ -2414,7 +2410,7 @@ def extract_times(wrfin, timeidx, method="cat", squeeze=True, cache=None, dims=outdimnames, attrs=outattrs) else: - outarr = np.asarray(time_list) + outarr = np.asarray(time_list, dtype="datetime64[ns]") if not multitime: return outarr[timeidx] diff --git a/src/wrf/uvmet.py b/src/wrf/uvmet.py index 3783bc4..5ac3001 100755 --- a/src/wrf/uvmet.py +++ b/src/wrf/uvmet.py @@ -18,7 +18,7 @@ from .util import extract_vars, extract_global_attrs, either @convert_units("wind", "m s-1") def _get_uvmet(wrfin, timeidx=0, method="cat", squeeze=True, cache=None, meta=True, _key=None, - ten_m=False, units ="m s-1"): + ten_m=False, units="m s-1"): """Return the u,v wind components rotated to earth coordinates. The leftmost dimension of the returned array represents two different @@ -426,7 +426,7 @@ def get_uvmet_wspd_wdir(wrfin, timeidx=0, method="cat", squeeze=True, """ uvmet = _get_uvmet(wrfin, timeidx, method, squeeze, - cache, meta, _key, False, units) + cache, meta, _key, False, units="m s-1") return _calc_wspd_wdir(uvmet[0,...,:,:,:], uvmet[1,...,:,:,:], False, units) @@ -509,7 +509,7 @@ def get_uvmet10_wspd_wdir(wrfin, timeidx=0, method="cat", squeeze=True, """ uvmet10 = _get_uvmet(wrfin, timeidx, method, squeeze, cache, meta, _key, - True, units) + True, units="m s-1") return _calc_wspd_wdir(uvmet10[0,...,:,:], uvmet10[1,...,:,:], True, units) diff --git a/test/ipynb/Doc_Examples.ipynb b/test/ipynb/Doc_Examples.ipynb new file mode 100644 index 0000000..1db43ca --- /dev/null +++ b/test/ipynb/Doc_Examples.ipynb @@ -0,0 +1,415 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from __future__ import (absolute_import, division, print_function, unicode_literals)\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.cm import get_cmap\n", + "import cartopy.crs as crs\n", + "import cartopy.feature as cfeature\n", + "from netCDF4 import Dataset as nc\n", + "\n", + "from wrf import npvalues, getvar, smooth2d\n", + "\n", + "# Open the output NetCDF with netcdf-python\n", + "filename = \"/Users/ladwig/Documents/wrf_files/wrfout_d01_2016-10-07_00_00_00\"\n", + "ncfile = nc(filename)\n", + "\n", + "# Get sea level pressure and cloud top temperature\n", + "slp = getvar(ncfile, \"slp\")\n", + "ctt = getvar(ncfile, \"ctt\")\n", + "\n", + "# Smooth the SLP\n", + "smooth_slp = smooth2d(slp, 3)\n", + "\n", + "# Extract the latitude and longitude coordinate arrays as regular numpy array instead of xarray.DataArray\n", + "lons = npvalues(slp.coords[\"XLONG\"])\n", + "lats = npvalues(slp.coords[\"XLAT\"])\n", + "\n", + "# Get the cartopy projection class\n", + "wrf_proj = slp.attrs[\"projection\"]\n", + "cart_proj = wrf_proj.cartopy()\n", + "\n", + "# Create the figure\n", + "fig = plt.figure(figsize=(4,4))\n", + "ax = plt.axes([0.1,0.1,0.8,0.8], projection=cart_proj)\n", + "\n", + "# Download and create the states, land, and oceans using cartopy features\n", + "states = cfeature.NaturalEarthFeature(category='cultural', scale='50m', facecolor='none',\n", + " name='admin_1_states_provinces_shp')\n", + "land = cfeature.NaturalEarthFeature(category='physical', name='land', scale='50m', \n", + " facecolor=cfeature.COLORS['land'])\n", + "ocean = cfeature.NaturalEarthFeature(category='physical', name='ocean', scale='50m', \n", + " facecolor=cfeature.COLORS['water'])\n", + "\n", + "# Make the pressure contours.\n", + "contour_levels = [960, 965, 970, 975, 980, 990]\n", + "c1 = plt.contour(lons, lats, npvalues(smooth_slp), levels=contour_levels, colors=\"white\", \n", + " transform=crs.PlateCarree(), zorder=3, linewidths=1.0)\n", + "\n", + "# Add pressure contour labels\n", + "#plt.clabel(c1, contour_levels, inline=True, fmt='%.0f', fontsize=7)\n", + "\n", + "# Create the filled cloud top temperature contours\n", + "contour_levels = [-80, -70, -60, -50, -40, -30, -20, -10, 0, 10]\n", + "plt.contourf(lons, lats, npvalues(ctt), contour_levels, cmap=get_cmap(\"Greys\"),\n", + " transform=crs.PlateCarree(), zorder=2)\n", + "\n", + "plt.plot([-80,-77.8], [26.75,26.75], color=\"yellow\", marker=\"o\", transform=crs.PlateCarree(), zorder=3)\n", + "\n", + "# Create the label bar for cloud top temperature\n", + "#cb2 = plt.colorbar(ax=ax, fraction=0.046, pad=0.04)\n", + "cb2 = plt.colorbar(ax=ax)\n", + "\n", + "# Draw the oceans, land, and states\n", + "ax.add_feature(ocean)\n", + "ax.add_feature(land)\n", + "ax.add_feature(states, linewidth=.5, edgecolor=\"black\")\n", + "\n", + "# Crop the domain to the region around the hurricane\n", + "ax.set_extent([-85., -75.0, np.amin(lats), 30.0], crs=crs.PlateCarree())\n", + "ax.gridlines(crs=crs.PlateCarree(), draw_labels=False)\n", + "\n", + "# Add the title and show the image\n", + "#plt.title(\"Hurricane Matthew Cloud Top Temperature (degC) \")\n", + "plt.savefig(\"/Users/ladwig/Documents/workspace/wrf_python/doc/source/_static/images/matthew.png\",\n", + " transparent=True, bbox_inches=\"tight\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "from __future__ import (absolute_import, division, print_function, unicode_literals)\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.cm import get_cmap\n", + "import cartopy.crs as crs\n", + "from cartopy.feature import NaturalEarthFeature\n", + "from Nio import open_file\n", + "\n", + "from wrf import npvalues, getvar, smooth2d, ll_to_xy, CoordPair, vertcross, getproj, get_proj_params, to_xy_coords\n", + "\n", + "# Open the output NetCDF file with PyNIO\n", + "filename = \"/Users/ladwig/Documents/wrf_files/wrfout_d01_2016-10-07_00_00_00\"\n", + "pynio_filename = filename + \".nc\"\n", + "ncfile = open_file(pynio_filename)\n", + "\n", + "# Extract pressure and model height\n", + "z = getvar(ncfile, \"z\", timeidx=0)\n", + "dbz = getvar(ncfile, \"dbz\", timeidx=0)\n", + "\n", + "wspd = getvar(ncfile, \"uvmet_wspd_wdir\", units=\"kt\")[0,:]\n", + "Z = 10**(dbz/10.)\n", + "\n", + "start_point = CoordPair(lat=26.75, lon=-80.0)\n", + "end_point = CoordPair(lat=26.75, lon=-77.8)\n", + "\n", + "# Compute the vertical cross-section interpolation. Also, include the lat/lon points along the cross-section.\n", + "z_cross = vertcross(Z, z, wrfin=ncfile, start_point=start_point, end_point=end_point, latlon=True, meta=True)\n", + "wspd_cross = vertcross(wspd, z, wrfin=ncfile, start_point=start_point, end_point=end_point, latlon=True, meta=True)\n", + "dbz_cross = 10.0 * np.log10(z_cross)\n", + "\n", + "# Create the figure\n", + "fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(4,4))\n", + "#ax = plt.axes([0.1,0.1,0.8,0.8])\n", + "\n", + "# Define the contour levels [0, 50, 100, 150, ....]\n", + "levels = [5 + 5*n for n in range(15)]\n", + "\n", + "# Make the contour plot\n", + "a = axes[0].contourf(npvalues(wspd_cross))\n", + "# Add the color bar\n", + "fig.colorbar(a, ax=axes[0])\n", + "\n", + "b = axes[1].contourf(npvalues(dbz_cross), levels=levels)\n", + "fig.colorbar(b, ax=axes[1])\n", + "\n", + "# Set the x-ticks to use latitude and longitude labels.\n", + "coord_pairs = npvalues(dbz_cross.coords[\"xy_loc\"])\n", + "x_ticks = np.arange(coord_pairs.shape[0])\n", + "x_labels = [pair.latlon_str() for pair in npvalues(coord_pairs)]\n", + "axes[0].set_xticks(x_ticks[::20])\n", + "axes[0].set_xticklabels([], rotation=45)\n", + "axes[1].set_xticks(x_ticks[::20])\n", + "axes[1].set_xticklabels(x_labels[::20], rotation=45, fontsize=6) \n", + "\n", + "\n", + "# Set the y-ticks to be height.\n", + "vert_vals = npvalues(dbz_cross.coords[\"vertical\"])\n", + "v_ticks = np.arange(vert_vals.shape[0])\n", + "axes[0].set_yticks(v_ticks[::20])\n", + "axes[0].set_yticklabels(vert_vals[::20], fontsize=6) \n", + "axes[1].set_yticks(v_ticks[::20])\n", + "axes[1].set_yticklabels(vert_vals[::20], fontsize=6) \n", + "\n", + "# Set the x-axis and y-axis labels\n", + "axes[1].set_xlabel(\"Latitude, Longitude\", fontsize=7)\n", + "axes[0].set_ylabel(\"Height (m)\", fontsize=7)\n", + "axes[1].set_ylabel(\"Height (m)\", fontsize=7)\n", + "\n", + "# Add a title\n", + "axes[0].set_title(\"Cross-Section of Wind Speed (kt)\", {\"fontsize\" : 10})\n", + "axes[1].set_title(\"Cross-Section of Reflectivity (dBZ)\", {\"fontsize\" : 10})\n", + "\n", + "plt.savefig(\"/Users/ladwig/Documents/workspace/wrf_python/doc/source/_static/images/matthew_cross.png\",\n", + " transparent=True, bbox_inches=\"tight\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "from __future__ import (absolute_import, division, print_function, unicode_literals)\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.cm import get_cmap\n", + "import cartopy.crs as crs\n", + "import cartopy.feature as cfeature\n", + "from Nio import open_file\n", + "\n", + "from wrf import getvar, npvalues, vertcross, smooth2d, CoordPair\n", + "\n", + "# Open the output NetCDF file with PyNIO\n", + "filename = \"/Users/ladwig/Documents/wrf_files/wrfout_d01_2016-10-07_00_00_00\"\n", + "pynio_filename = filename + \".nc\"\n", + "ncfile = open_file(pynio_filename)\n", + "\n", + "# Get the WRF variables\n", + "slp = getvar(ncfile, \"slp\")\n", + "smooth_slp = smooth2d(slp, 3)\n", + "ctt = getvar(ncfile, \"ctt\")\n", + "z = getvar(ncfile, \"z\", timeidx=0)\n", + "dbz = getvar(ncfile, \"dbz\", timeidx=0)\n", + "Z = 10**(dbz/10.)\n", + "wspd = getvar(ncfile, \"uvmet_wspd_wdir\", units=\"kt\")[0,:]\n", + "\n", + "# Set the start point and end point for the cross section\n", + "start_point = CoordPair(lat=26.75, lon=-80.0)\n", + "end_point = CoordPair(lat=26.75, lon=-77.8)\n", + "\n", + "# Compute the vertical cross-section interpolation. Also, include the lat/lon points along the cross-section.\n", + "z_cross = vertcross(Z, z, wrfin=ncfile, start_point=start_point, end_point=end_point, latlon=True, meta=True)\n", + "wspd_cross = vertcross(wspd, z, wrfin=ncfile, start_point=start_point, end_point=end_point, latlon=True, meta=True)\n", + "dbz_cross = 10.0 * np.log10(z_cross)\n", + "\n", + "# Extract the latitude and longitude coordinate arrays as regular numpy array instead of xarray.DataArray\n", + "lons = npvalues(slp.coords[\"XLONG\"])\n", + "lats = npvalues(slp.coords[\"XLAT\"])\n", + "\n", + "# Get the cartopy projection class\n", + "wrf_proj = slp.attrs[\"projection\"]\n", + "cart_proj = wrf_proj.cartopy()\n", + "\n", + "# Create the figure which will have 3 subplots\n", + "fig = plt.figure(figsize=(7,5))\n", + "ax_ctt = fig.add_subplot(1,2,1,projection=cart_proj)\n", + "ax_wspd = fig.add_subplot(2,2,2)\n", + "ax_dbz = fig.add_subplot(2,2,4)\n", + "\n", + "## Plot the cloud top temperature\n", + "\n", + "# Download and create the states, land, and oceans using cartopy features\n", + "states = cfeature.NaturalEarthFeature(category='cultural', scale='50m', facecolor='none',\n", + " name='admin_1_states_provinces_shp')\n", + "land = cfeature.NaturalEarthFeature(category='physical', name='land', scale='50m', \n", + " facecolor=cfeature.COLORS['land'])\n", + "ocean = cfeature.NaturalEarthFeature(category='physical', name='ocean', scale='50m', \n", + " facecolor=cfeature.COLORS['water'])\n", + "\n", + "# Make the pressure contours.\n", + "contour_levels = [960, 965, 970, 975, 980, 990]\n", + "c1 = ax_ctt.contour(lons, lats, npvalues(smooth_slp), levels=contour_levels, colors=\"white\", \n", + " transform=crs.PlateCarree(), zorder=3, linewidths=1.0)\n", + "\n", + "# Create the filled cloud top temperature contours\n", + "contour_levels = [-80.0, -70.0, -60, -50, -40, -30, -20, -10, 0, 10]\n", + "ctt_contours = ax_ctt.contourf(lons, lats, npvalues(ctt), contour_levels, cmap=get_cmap(\"Greys\"),\n", + " transform=crs.PlateCarree(), zorder=2)\n", + "\n", + "ax_ctt.plot([start_point.lon, end_point.lon], [start_point.lat, end_point.lat], color=\"yellow\", \n", + " marker=\"o\", transform=crs.PlateCarree(), zorder=3)\n", + "\n", + "# Create the label bar for cloud top temperature\n", + "cb_ctt = fig.colorbar(ctt_contours, ax=ax_ctt, shrink=.5)\n", + "cb_ctt.ax.tick_params(labelsize=5)\n", + "\n", + "# Draw the oceans, land, and states\n", + "ax_ctt.add_feature(ocean)\n", + "ax_ctt.add_feature(land)\n", + "ax_ctt.add_feature(states, linewidth=.5, edgecolor=\"black\")\n", + "\n", + "# Crop the domain to the region around the hurricane\n", + "ax_ctt.set_extent([-85., -75.0, np.amin(lats), 30.0], crs=crs.PlateCarree())\n", + "ax_ctt.gridlines(crs=crs.PlateCarree(), draw_labels=False)\n", + "\n", + "## Plot the cross sections\n", + "\n", + "# Make the contour plot for wspd\n", + "wspd_contours = ax_wspd.contourf(npvalues(wspd_cross))\n", + "# Add the color bar\n", + "cb_wspd = fig.colorbar(wspd_contours, ax=ax_wspd)\n", + "cb_wspd.ax.tick_params(labelsize=5)\n", + "\n", + "# Make the contour plot for dbz\n", + "levels = [5 + 5*n for n in range(15)]\n", + "dbz_contours = ax_dbz.contourf(npvalues(dbz_cross), levels=levels)\n", + "cb_dbz = fig.colorbar(dbz_contours, ax=ax_dbz)\n", + "cb_dbz.ax.tick_params(labelsize=5)\n", + "\n", + "# Set the x-ticks to use latitude and longitude labels.\n", + "coord_pairs = npvalues(dbz_cross.coords[\"xy_loc\"])\n", + "x_ticks = np.arange(coord_pairs.shape[0])\n", + "x_labels = [pair.latlon_str() for pair in npvalues(coord_pairs)]\n", + "ax_wspd.set_xticks(x_ticks[::20])\n", + "ax_wspd.set_xticklabels([], rotation=45)\n", + "ax_dbz.set_xticks(x_ticks[::20])\n", + "ax_dbz.set_xticklabels(x_labels[::20], rotation=45, fontsize=4) \n", + "\n", + "\n", + "# Set the y-ticks to be height.\n", + "vert_vals = npvalues(dbz_cross.coords[\"vertical\"])\n", + "v_ticks = np.arange(vert_vals.shape[0])\n", + "ax_wspd.set_yticks(v_ticks[::20])\n", + "ax_wspd.set_yticklabels(vert_vals[::20], fontsize=4) \n", + "ax_dbz.set_yticks(v_ticks[::20])\n", + "ax_dbz.set_yticklabels(vert_vals[::20], fontsize=4) \n", + "\n", + "# Set the x-axis and y-axis labels\n", + "ax_dbz.set_xlabel(\"Latitude, Longitude\", fontsize=5)\n", + "ax_wspd.set_ylabel(\"Height (m)\", fontsize=5)\n", + "ax_dbz.set_ylabel(\"Height (m)\", fontsize=5)\n", + "\n", + "# Add a title\n", + "ax_ctt.set_title(\"Cloud Top Temperature (degC)\", {\"fontsize\" : 7})\n", + "ax_wspd.set_title(\"Cross-Section of Wind Speed (kt)\", {\"fontsize\" : 7})\n", + "ax_dbz.set_title(\"Cross-Section of Reflectivity (dBZ)\", {\"fontsize\" : 7})\n", + "\n", + "plt.savefig(\"/Users/ladwig/Documents/workspace/wrf_python/doc/source/_static/images/matthew.png\",\n", + " transparent=True, bbox_inches=\"tight\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# SLP\n", + "from __future__ import (absolute_import, division, print_function, unicode_literals)\n", + " \n", + "from netCDF4 import Dataset \n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.cm import get_cmap\n", + "import cartopy.crs as crs\n", + "from cartopy.feature import NaturalEarthFeature\n", + "\n", + "from wrf import npvalues, getvar, smooth2d\n", + "\n", + "ncfile = Dataset(\"/Users/ladwig/Documents/wrf_files/wrfout_d01_2016-10-07_00_00_00\")\n", + "\n", + "# Get the sea level pressure\n", + "slp = getvar(ncfile, \"slp\")\n", + "\n", + "# Smooth the sea level pressure since it tends to be noisey near the mountains\n", + "smooth_slp = smooth2d(slp, 3)\n", + "\n", + "# Get the numpy array from the XLAT and XLONG coordinates\n", + "lats = npvalues(slp.coords[\"XLAT\"])\n", + "lons = npvalues(slp.coords[\"XLONG\"])\n", + "\n", + "# Get the wrf.WrfProj object\n", + "wrf_proj = slp.attrs[\"projection\"]\n", + "\n", + "# The cartopy() method returns a cartopy.crs projection object\n", + "cart_proj = wrf_proj.cartopy()\n", + "\n", + "# Create a figure that's 10x10\n", + "fig = plt.figure(figsize=(10,10))\n", + "# Get the GeoAxes set to the projection used by WRF\n", + "ax = plt.axes(projection=cart_proj)\n", + "\n", + "# Download and add the states and coastlines\n", + "states = NaturalEarthFeature(category='cultural', scale='50m', facecolor='none',\n", + " name='admin_1_states_provinces_shp')\n", + "ax.add_feature(states, linewidth=.5)\n", + "ax.coastlines('50m', linewidth=0.8)\n", + "\n", + "# Make the contour outlines and filled contours for the smoothed sea level pressure.\n", + "# The transform keyword indicates that the lats and lons arrays are lat/lon coordinates and tells \n", + "# cartopy to transform the points in to grid space.\n", + "plt.contour(lons, lats, npvalues(smooth_slp), 10, colors=\"black\", transform=crs.PlateCarree())\n", + "plt.contourf(lons, lats, npvalues(smooth_slp), 10, transform=crs.PlateCarree())\n", + "\n", + "# Add a color bar\n", + "plt.colorbar(ax=ax, shrink=.47)\n", + "\n", + "# Set the map limits\n", + "ax.set_xlim(wrf_proj.cartopy_xlim())\n", + "ax.set_ylim(wrf_proj.cartopy_ylim())\n", + "\n", + "# Add the gridlines\n", + "ax.gridlines()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/test/ipynb/WRF_Workshop_Demo.ipynb b/test/ipynb/WRF_Workshop_Demo.ipynb index a2f0a3e..601b1c6 100644 --- a/test/ipynb/WRF_Workshop_Demo.ipynb +++ b/test/ipynb/WRF_Workshop_Demo.ipynb @@ -69,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "collapsed": true }, @@ -81,11 +81,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "ename": "NIOError", + "evalue": "Unable to open file", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNIOError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mfilename\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"wrfout_d01_2010-06-13_21-00-00\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mpynio_filename\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfilename\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\".nc\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0mncfile\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopen_file\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpynio_filename\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;31m# Alternative using netCDF4-python (for reference)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Users/ladwig/miniconda2/lib/python2.7/site-packages/PyNIO/Nio.pyc\u001b[0m in \u001b[0;36mopen_file\u001b[0;34m(filename, mode, options, history, format)\u001b[0m\n\u001b[1;32m 733\u001b[0m \u001b[0mmask_above_value\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_get_option_value\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0m_Nio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moption_defaults\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m'MaskAboveValue'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 734\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 735\u001b[0;31m \u001b[0mfile\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_Nio\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen_file\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mhistory\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 736\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 737\u001b[0m \u001b[0mfile_proxy\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_proxy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'str'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m__del__\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0m__del__\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mcreate_variable\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcreate_variable\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mcreate_group\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcreate_group\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNIOError\u001b[0m: Unable to open file" + ] + } + ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", @@ -424,21 +437,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 2", "language": "python", - "name": "python3" + "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 3 + "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" + "pygments_lexer": "ipython2", + "version": "2.7.12" } }, "nbformat": 4, diff --git a/test/ipynb/WRF_python_demo.ipynb b/test/ipynb/WRF_python_demo.ipynb index b647315..520ea13 100644 --- a/test/ipynb/WRF_python_demo.ipynb +++ b/test/ipynb/WRF_python_demo.ipynb @@ -19,14 +19,16 @@ "\n", "from wrf import getvar\n", "from netCDF4 import Dataset as nc\n", - "ncfile = nc(\"/Users/ladwig/Documents/wrf_files/wrfout_d01_2016-02-25_18_00_00\")\n" + "#ncfile = nc(\"/Users/ladwig/Documents/wrf_files/wrfout_d01_2016-02-25_18_00_00\")\n", + "ncfile = nc(\"/Users/ladwig/Documents/wrf_files/wrfout_d01_2016-10-07_00_00_00\")\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false + "collapsed": false, + "scrolled": false }, "outputs": [], "source": [ @@ -148,8 +150,9 @@ }, "outputs": [], "source": [ + "from wrf import ALL_TIMES\n", "wrflist = [ncfile, ncfile, ncfile]\n", - "p_cat = getvar(wrflist, \"P\", method=\"cat\")\n", + "p_cat = getvar(wrflist, \"P\", timeidx=ALL_TIMES, method=\"cat\")\n", "print(p_cat)\n", "del p_cat" ] @@ -169,7 +172,7 @@ }, "outputs": [], "source": [ - "p_join = getvar(wrflist, \"P\", method=\"join\")\n", + "p_join = getvar(wrflist, \"P\", timeidx=ALL_TIMES, method=\"join\")\n", "print(p_join)" ] }, @@ -191,7 +194,8 @@ }, "outputs": [], "source": [ - "p_join = getvar(wrflist, \"P\", timeidx=0, method=\"join\", squeeze=False)\n", + "from wrf import ALL_TIMES\n", + "p_join = getvar(wrflist, \"P\", timeidx=ALL_TIMES, method=\"join\", squeeze=False)\n", "print(p_join)\n", "del p_join" ] @@ -213,7 +217,7 @@ "source": [ "wrf_dict = {\"label1\" : [ncfile, ncfile],\n", " \"label2\" : [ncfile, ncfile]}\n", - "p_dict = getvar(wrf_dict, \"P\")\n", + "p_dict = getvar(wrf_dict, \"P\", timeidx=ALL_TIMES)\n", "print(p_dict)\n", "del p_dict" ] @@ -308,8 +312,9 @@ " \"pvo\", \"pw\", \"rh2\", \"rh\", \"slp\", \"ter\", \"td2\", \"td\", \"tc\",\n", " \"theta\", \"tk\", \"tv\", \"twb\", \"updraft_helicity\", \"ua\", \"va\", \n", " \"wa\", \"uvmet10\", \"uvmet\", \"z\", \"ctt\"]\n", + "wrf_vars = [\"slp\"]\n", "\n", - "vard = {varname: getvar(ncfile, varname, method=\"join\", squeeze=False) for varname in wrf_vars}\n", + "vard = {varname: getvar(ncfile, varname, method=\"cat\", squeeze=True) for varname in wrf_vars}\n", "for varname in wrf_vars:\n", " print(vard[varname])\n", " print (\"\\n\")\n" @@ -331,8 +336,8 @@ "outputs": [], "source": [ "from wrf import npvalues\n", - "masked_ndarray = npvalues(vard[\"cape_2d\"])\n", - "print(masked_ndarray)\n", + "masked_ndarray = npvalues(vard[\"slp\"])\n", + "print(type(masked_ndarray))\n", "del masked_ndarray" ] }, @@ -398,11 +403,11 @@ "outputs": [], "source": [ "# Pressure using pivot and angle\n", - "from wrf import getvar, vertcross\n", + "from wrf import getvar, vertcross, CoordPair\n", "\n", "z = getvar(ncfile, \"z\")\n", "p = getvar(ncfile, \"pressure\")\n", - "pivot_point = (z.shape[-1] / 2, z.shape[-2] / 2) \n", + "pivot_point = CoordPair((z.shape[-1]-1) // 2, (z.shape[-2] - 1) // 2) \n", "angle = 90.0\n", "\n", "p_vert = vertcross(p, z, pivot_point=pivot_point, angle=angle, latlon=True)\n", @@ -411,14 +416,122 @@ "del p_vert\n", "\n", "# Pressure using start_point and end_point\n", - "start_point = (0, z.shape[-2]/2)\n", - "end_point = (-1, z.shape[-2]/2)\n", + "start_point = CoordPair(0, (z.shape[-2]-1) // 2)\n", + "end_point = CoordPair(-1, (z.shape[-2]-1) // 2)\n", "\n", "p_vert = vertcross(p, z, start_point=start_point, end_point=end_point, latlon=True)\n", "print(p_vert)\n", "del p_vert, p, z" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Pressure using pivot and angle\n", + "from wrf import getvar, vertcross, CoordPair, xy_to_ll\n", + "\n", + "z = getvar(ncfile, \"z\")\n", + "p = getvar(ncfile, \"pressure\")\n", + "lats = getvar(ncfile, \"lat\")\n", + "lons = getvar(ncfile, \"lon\")\n", + "\n", + "#print ((lats.shape[-2]-1) / 2)\n", + "#print ((lats.shape[-1]-1) / 2)\n", + "\n", + "#print (npvalues(lats[529, 899]))\n", + "#print (npvalues(lons[529, 899]))\n", + "\n", + "#print (npvalues(lats[529, 0]))\n", + "#print (npvalues(lons[529, 0]))\n", + "\n", + "#print (npvalues(lats[529, -1]))\n", + "#print (npvalues(lons[529, -1]))\n", + "\n", + "pivot_point = CoordPair(lat=38.5, lon=-97.5) \n", + "angle = 90.0\n", + "\n", + "p_vert = vertcross(p, z, wrfin=ncfile, pivot_point=pivot_point, angle=angle, latlon=True)\n", + "print (p_vert)\n", + "print (\"\\n\")\n", + "\n", + "start_lat = lats[(lats.shape[-2]-1)//2, 0]\n", + "end_lat = lats[(lats.shape[-2]-1)//2, -1]\n", + "start_lon = lons[(lats.shape[-2]-1)//2, 0]\n", + "end_lon = lons[(lats.shape[-2]-1)//2, -1]\n", + "\n", + "print (start_lat)\n", + "print (end_lat)\n", + "print (start_lon)\n", + "print (end_lon)\n", + "\n", + "# Pressure using start_point and end_point\n", + "start_point = CoordPair(lat=start_lat, lon=start_lon)\n", + "end_point = CoordPair(lat=end_lat, lon=end_lon)\n", + "\n", + "p_vert = vertcross(p, z, wrfin=ncfile, start_point=start_point, end_point=end_point, latlon=True)\n", + "print(p_vert)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Pressure using pivot and angle\n", + "from wrf import getvar, vertcross, CoordPair, xy_to_ll\n", + "\n", + "z = getvar(ncfile, \"z\")\n", + "p = getvar(ncfile, \"pressure\")\n", + "lats = getvar(ncfile, \"lat\")\n", + "lons = getvar(ncfile, \"lon\")\n", + "\n", + "#print ((lats.shape[-2]-1) / 2)\n", + "#print ((lats.shape[-1]-1) / 2)\n", + "\n", + "#print (npvalues(lats[529, 899]))\n", + "#print (npvalues(lons[529, 899]))\n", + "\n", + "#print (npvalues(lats[529, 0]))\n", + "#print (npvalues(lons[529, 0]))\n", + "\n", + "#print (npvalues(lats[529, -1]))\n", + "#print (npvalues(lons[529, -1]))\n", + "\n", + "pivot_point = CoordPair(lat=38.5, lon=-97.5) \n", + "angle = 90.0\n", + "\n", + "p_vert = vertcross(p, z, wrfin=ncfile, pivot_point=pivot_point, angle=angle, latlon=True)\n", + "print (p_vert)\n", + "print (\"\\n\")\n", + "\n", + "start_lat = lats[(lats.shape[-2]-1)//2, 0]\n", + "end_lat = lats[(lats.shape[-2]-1)//2, -1]\n", + "start_lon = lons[(lats.shape[-2]-1)//2, 0]\n", + "end_lon = lons[(lats.shape[-2]-1)//2, -1]\n", + "\n", + "print (start_lat)\n", + "print (end_lat)\n", + "print (start_lon)\n", + "print (end_lon)\n", + "\n", + "# Pressure using start_point and end_point\n", + "start_point = CoordPair(lat=start_lat, lon=start_lon)\n", + "end_point = CoordPair(lat=end_lat, lon=end_lon)\n", + "\n", + "levels = [1000., 2000., 3000.]\n", + "\n", + "p_vert = vertcross(p, z, wrfin=ncfile, levels=levels, start_point=start_point, end_point=end_point, latlon=True)\n", + "print(p_vert)" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -435,11 +548,11 @@ "outputs": [], "source": [ "# T2 using pivot and angle\n", - "from wrf import interpline, getvar\n", + "from wrf import interpline, getvar, CoordPair\n", "\n", "t2 = getvar(ncfile, \"T2\")\n", - "pivot_point = (t2.shape[-2] / 2, t2.shape[-1] / 2) \n", - "angle = 90.0\n", + "pivot_point = CoordPair((t2.shape[-1]-1)//2, (t2.shape[-2]-1)//2) \n", + "angle = 0.0\n", "\n", "t2_line = interpline(t2, pivot_point=pivot_point, angle=angle, latlon=True)\n", "print(t2_line, \"\\n\")\n", @@ -447,13 +560,30 @@ "del t2_line\n", "\n", "# T2 using start_point and end_point\n", - "start_point = (t2.shape[-2]/2, 0)\n", - "end_point = (t2.shape[-2]/2, -1)\n", + "start_point = CoordPair((t2.shape[-1]-1)//2, 0)\n", + "end_point = CoordPair((t2.shape[-1]-1)//2, -1)\n", "\n", "t2_line = interpline(t2, start_point=start_point, end_point=end_point, latlon=True)\n", "print(t2_line, \"\\n\")\n", "\n", - "del t2_line, t2" + "del t2_line\n", + "\n", + "t2 = getvar(ncfile, \"T2\")\n", + "lats = getvar(ncfile, \"lat\")\n", + "lons = getvar(ncfile, \"lon\")\n", + "\n", + "start_lat = lats[0, (lats.shape[-1]-1)//2]\n", + "end_lat = lats[-1, (lats.shape[-1]-1)//2]\n", + "start_lon = lons[0, (lons.shape[-1]-1)//2]\n", + "end_lon = lons[-1, (lons.shape[-1]-1)//2]\n", + "\n", + "start_point = CoordPair(lat=start_lat, lon=start_lon)\n", + "end_point = CoordPair(lat=end_lat, lon=end_lon)\n", + "\n", + "t2_line = interpline(t2, wrfin=ncfile, start_point=start_point, end_point=end_point, latlon=True)\n", + "print (t2_line)\n", + "\n", + "del t2_line, t2\n" ] }, { @@ -566,7 +696,16 @@ "from wrf.latlon import xy_to_ll, ll_to_xy \n", "\n", "a = xy_to_ll(ncfile, 400, 200)\n", + "a1 = ll_to_xy(ncfile, a[0], a[1])\n", + "\n", + "#print(a)\n", + "#print(\"\\n\")\n", + "#print(a1)\n", + "#print(\"\\n\")\n", + "\n", "a = xy_to_ll(ncfile, [400,105], [200,205])\n", + "a1 = ll_to_xy(ncfile, a[0,:], a[1,:])\n", + "\n", "b = ll_to_xy(ncfile, 45.5, -110.8, as_int=True)\n", "\n", "# Note: Lists/Dictionaries of files will add a new dimension ('domain') only if the domain is moving\n", @@ -577,6 +716,8 @@ "\n", "print(a)\n", "print(\"\\n\")\n", + "print(a1)\n", + "print(\"\\n\")\n", "print(b)\n", "print(\"\\n\")\n", "print(c)\n", @@ -618,17 +759,18 @@ "import cartopy.crs as crs\n", "from cartopy.feature import NaturalEarthFeature\n", "\n", - "from wrf import npvalues, getvar\n", + "from wrf import npvalues, getvar, smooth2d\n", "\n", "slp = getvar(ncfile, \"slp\")\n", + "smooth_slp = smooth2d(slp, 3)\n", "lons = npvalues(slp.coords[\"XLONG\"])\n", "lats = npvalues(slp.coords[\"XLAT\"])\n", "\n", "wrf_proj = slp.attrs[\"projection\"]\n", "cart_proj = wrf_proj.cartopy()\n", "\n", - "fig = plt.figure(figsize=(20,20))\n", - "ax = plt.axes([0.1,0.1,0.8,0.8], projection=cart_proj)\n", + "fig = plt.figure(figsize=(10,10))\n", + "ax = plt.axes(projection=cart_proj)\n", "\n", "states = NaturalEarthFeature(category='cultural', scale='50m', facecolor='none',\n", " name='admin_1_states_provinces_shp')\n", @@ -640,14 +782,80 @@ "x = xform_coords[:,:,0]\n", "y = xform_coords[:,:,1]\n", "\n", - "plt.contour(x, y, npvalues(slp), 20, cmap=get_cmap(\"gist_ncar\"))\n", - "plt.colorbar(ax=ax, shrink=.7)\n", + "plt.contour(x, y, npvalues(smooth_slp), 10, colors=\"black\")\n", + "plt.contourf(x, y, npvalues(smooth_slp), 10)\n", + "plt.colorbar(ax=ax, shrink=.47)\n", "\n", "ax.set_xlim(wrf_proj.cartopy_xlim())\n", "ax.set_ylim(wrf_proj.cartopy_ylim())\n", "ax.gridlines()\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# SLP\n", + "from __future__ import (absolute_import, division, print_function, unicode_literals)\n", + " \n", + "from netCDF4 import Dataset \n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.cm import get_cmap\n", + "import cartopy.crs as crs\n", + "from cartopy.feature import NaturalEarthFeature\n", + "\n", + "from wrf import npvalues, getvar, smooth2d\n", + "\n", + "ncfile = Dataset(\"/Users/ladwig/Documents/wrf_files/wrfout_d01_2016-10-07_00_00_00\")\n", + "\n", + "# Get the sea level pressure\n", + "slp = getvar(ncfile, \"slp\")\n", + "\n", + "# Smooth the sea level pressure since it tends to be noisey near the mountains\n", + "smooth_slp = smooth2d(slp, 3)\n", + "\n", + "# Get the numpy array from the XLAT and XLONG coordinates\n", + "lats = npvalues(slp.coords[\"XLAT\"])\n", + "lons = npvalues(slp.coords[\"XLONG\"])\n", + "\n", + "# Get the wrf.WrfProj object\n", + "wrf_proj = slp.attrs[\"projection\"]\n", + "\n", + "# The cartopy() method returns a cartopy.crs projection object\n", + "cart_proj = wrf_proj.cartopy()\n", + "\n", + "# Create a figure that's 10x10\n", + "fig = plt.figure(figsize=(10,10))\n", + "# Get the GeoAxes set to the projection used by WRF\n", + "ax = plt.axes(projection=cart_proj)\n", + "\n", + "# Download and add the states and coastlines\n", + "states = NaturalEarthFeature(category='cultural', scale='50m', facecolor='none',\n", + " name='admin_1_states_provinces_shp')\n", + "ax.add_feature(states, linewidth=.5)\n", + "ax.coastlines('50m', linewidth=0.8)\n", + "\n", + "# Make the contour outlines and filled contours for the smoothed sea level pressure.\n", + "# The transform keyword indicates that the lats and lons arrays are lat/lon coordinates and tells \n", + "# cartopy to transform the points in to grid space.\n", + "plt.contour(lons, lats, npvalues(smooth_slp), 10, colors=\"black\", transform=crs.PlateCarree())\n", + "plt.contourf(lons, lats, npvalues(smooth_slp), 10, transform=crs.PlateCarree())\n", + "\n", + "# Add a color bar\n", + "plt.colorbar(ax=ax, shrink=.47)\n", + "\n", + "# Set the map limits\n", + "ax.set_xlim(wrf_proj.cartopy_xlim())\n", + "ax.set_ylim(wrf_proj.cartopy_ylim())\n", + "\n", + "# Add the gridlines\n", + "ax.gridlines()" + ] + }, { "cell_type": "code", "execution_count": null, @@ -708,7 +916,8 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": false + "collapsed": false, + "scrolled": false }, "outputs": [], "source": [ @@ -717,15 +926,15 @@ "import matplotlib.pyplot as plt\n", "from matplotlib.cm import get_cmap\n", "\n", - "from wrf import getvar, vertcross, npvalues\n", + "from wrf import getvar, vertcross, npvalues, CoordPair\n", "\n", "p = getvar(ncfile, \"pressure\")\n", "z = getvar(ncfile, \"z\", units=\"dm\")\n", "\n", - "pivot_point = (z.shape[-1] / 2, z.shape[-2] / 2) \n", + "pivot_point = CoordPair(z.shape[-1] / 2, z.shape[-2] / 2) \n", "angle = 90.0\n", "\n", - "p_vert = vertcross(p, z, pivot_point=pivot_point, angle=angle)\n", + "p_vert = vertcross(p, z, pivot_point=pivot_point, angle=angle, levels=[1000,850,500])\n", "\n", "fig = plt.figure(figsize=(20,8))\n", "ax = plt.axes([0.1,0.1,0.8,0.8])\n", @@ -1038,21 +1247,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 2", "language": "python", - "name": "python3" + "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 3 + "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" + "pygments_lexer": "ipython2", + "version": "2.7.12" } }, "nbformat": 4, diff --git a/test/utests.py b/test/utests.py index a78940e..ce502bf 100644 --- a/test/utests.py +++ b/test/utests.py @@ -8,7 +8,7 @@ import subprocess from wrf import (getvar, interplevel, interpline, vertcross, vinterp, disable_xarray, xarray_enabled, npvalues, xy_to_ll, ll_to_xy, xy_to_ll_proj, ll_to_xy_proj, - extract_global_attrs, viewitems) + extract_global_attrs, viewitems, CoordPair) from wrf.util import is_multi_file NCL_EXE = "/Users/ladwig/nclbuild/6.3.0/bin/ncl" @@ -258,7 +258,7 @@ def make_interp_test(varname, wrf_in, referent, multi=False, hts = getvar(in_wrfnc, "z", timeidx=timeidx) p = getvar(in_wrfnc, "pressure", timeidx=timeidx) - pivot_point = (hts.shape[-1] / 2, hts.shape[-2] / 2) + pivot_point = CoordPair(hts.shape[-1] / 2, hts.shape[-2] / 2) ht_cross = vertcross(hts, p, pivot_point=pivot_point, angle=90.) nt.assert_allclose(npvalues(ht_cross), ref_ht_cross, rtol=.01) @@ -270,8 +270,8 @@ def make_interp_test(varname, wrf_in, referent, multi=False, ref_p_cross, rtol=.01) # Test point to point - start_point = (0,hts.shape[-2]/2) - end_point = (-1,hts.shape[-2]/2) + start_point = CoordPair(0, hts.shape[-2]/2) + end_point = CoordPair(-1,hts.shape[-2]/2) p_cross2 = vertcross(p,hts,start_point=start_point, end_point=end_point) @@ -284,15 +284,15 @@ def make_interp_test(varname, wrf_in, referent, multi=False, ref_t2_line = _get_refvals(referent, "t2_line", repeat, multi) t2 = getvar(in_wrfnc, "T2", timeidx=timeidx) - pivot_point = (t2.shape[-1] / 2, t2.shape[-2] / 2) + pivot_point = CoordPair(t2.shape[-1] / 2, t2.shape[-2] / 2) t2_line1 = interpline(t2, pivot_point=pivot_point, angle=90.0) nt.assert_allclose(npvalues(t2_line1), ref_t2_line) # Test point to point - start_point = (0, t2.shape[-2]/2) - end_point = (-1, t2.shape[-2]/2) + start_point = CoordPair(0, t2.shape[-2]/2) + end_point = CoordPair(-1, t2.shape[-2]/2) t2_line2 = interpline(t2, start_point=start_point, end_point=end_point)