mirror of
https://github.com/meteoinfo/MeteoInfo.git
synced 2025-12-08 20:36:05 +00:00
add wrf sub-package
This commit is contained in:
parent
e26a83feff
commit
2438d06065
@ -1,32 +1,32 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<MeteoInfo File="milconfig.xml" Type="configurefile">
|
<MeteoInfo File="milconfig.xml" Type="configurefile">
|
||||||
<Path OpenPath="D:\Working\MIScript\Jython\mis\meteo\interpolation">
|
<Path OpenPath="D:\Working\MIScript\Jython\mis\traj\TrajStat">
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\LaSW"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\wrf"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\chart"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\chart\axis"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math\stats"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\common_math"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\array"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\taylor"/>
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\taylor"/>
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl"/>
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl"/>
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\text"/>
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\text"/>
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume"/>
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume"/>
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo"/>
|
|
||||||
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\interpolation"/>
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\interpolation"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\satellite"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\grads"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\satellite\himawari"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\LaSW"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\wrf"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\meteo\calc"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\traj"/>
|
||||||
|
<RecentFolder Folder="D:\Working\MIScript\Jython\mis\traj\TrajStat"/>
|
||||||
</Path>
|
</Path>
|
||||||
<File>
|
<File>
|
||||||
<OpenedFiles>
|
<OpenedFiles>
|
||||||
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume\volumeplot_perspective.py"/>
|
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume\volumeplot_perspective.py"/>
|
||||||
<OpenedFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume\volumeplot_perspective_2.py"/>
|
<OpenedFile File="D:\Working\MIScript\Jython\mis\LaSW\typhoon_map_slice.py"/>
|
||||||
<OpenedFile File="D:\Working\MIScript\Jython\mis\meteo\interpolation\log_interpolate_1d_1.py"/>
|
<OpenedFile File="D:\Working\MIScript\Jython\mis\traj\TrajStat\plot_pscf_3d.py"/>
|
||||||
</OpenedFiles>
|
</OpenedFiles>
|
||||||
<RecentFiles>
|
<RecentFiles>
|
||||||
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume\volumeplot_perspective.py"/>
|
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume\volumeplot_perspective.py"/>
|
||||||
<RecentFile File="D:\Working\MIScript\Jython\mis\plot_types\3d\jogl\volume\volumeplot_perspective_2.py"/>
|
<RecentFile File="D:\Working\MIScript\Jython\mis\LaSW\typhoon_map_slice.py"/>
|
||||||
<RecentFile File="D:\Working\MIScript\Jython\mis\meteo\interpolation\log_interpolate_1d_1.py"/>
|
<RecentFile File="D:\Working\MIScript\Jython\mis\traj\TrajStat\plot_pscf_3d.py"/>
|
||||||
</RecentFiles>
|
</RecentFiles>
|
||||||
</File>
|
</File>
|
||||||
<Font>
|
<Font>
|
||||||
@ -34,5 +34,5 @@
|
|||||||
</Font>
|
</Font>
|
||||||
<LookFeel DockWindowDecorated="true" LafDecorated="true" Name="FlatDarkLaf"/>
|
<LookFeel DockWindowDecorated="true" LafDecorated="true" Name="FlatDarkLaf"/>
|
||||||
<Figure DoubleBuffering="true"/>
|
<Figure DoubleBuffering="true"/>
|
||||||
<Startup MainFormLocation="-7,0" MainFormSize="1417,799"/>
|
<Startup MainFormLocation="-7,0" MainFormSize="1344,736"/>
|
||||||
</MeteoInfo>
|
</MeteoInfo>
|
||||||
|
|||||||
0
meteoinfo-lab/pylib/__init__.py
Normal file
0
meteoinfo-lab/pylib/__init__.py
Normal file
Binary file not shown.
@ -119,13 +119,15 @@ class DimDataFile(object):
|
|||||||
return None
|
return None
|
||||||
v = np.array(attr.getValues())
|
v = np.array(attr.getValues())
|
||||||
return v
|
return v
|
||||||
|
|
||||||
|
@property
|
||||||
def variables(self):
|
def variables(self):
|
||||||
"""
|
"""
|
||||||
Get all variables.
|
Get all variables.
|
||||||
"""
|
"""
|
||||||
return self._variables
|
return self._variables
|
||||||
|
|
||||||
|
@property
|
||||||
def varnames(self):
|
def varnames(self):
|
||||||
"""
|
"""
|
||||||
Get all variable names.
|
Get all variable names.
|
||||||
|
|||||||
Binary file not shown.
@ -30,7 +30,7 @@ def __getimage(src):
|
|||||||
elif isinstance(src, Graphic):
|
elif isinstance(src, Graphic):
|
||||||
return src.getShape().getImage()
|
return src.getShape().getImage()
|
||||||
elif isinstance(src, MILayer):
|
elif isinstance(src, MILayer):
|
||||||
return src.layer.getImage()
|
return src._layer.getImage()
|
||||||
elif isinstance(src, NDArray):
|
elif isinstance(src, NDArray):
|
||||||
return ImageUtil.createImage(src.asarray())
|
return ImageUtil.createImage(src.asarray())
|
||||||
return None
|
return None
|
||||||
@ -40,7 +40,7 @@ def __getreturn(src, dst):
|
|||||||
src.getShape().setImage(dst)
|
src.getShape().setImage(dst)
|
||||||
return src
|
return src
|
||||||
elif isinstance(src, MILayer):
|
elif isinstance(src, MILayer):
|
||||||
src.layer.setImage(dst)
|
src._layer.setImage(dst)
|
||||||
return src
|
return src
|
||||||
elif isinstance(src, NDArray):
|
elif isinstance(src, NDArray):
|
||||||
r = ImageUtil.imageRead(dst)
|
r = ImageUtil.imageRead(dst)
|
||||||
|
|||||||
Binary file not shown.
@ -1,5 +1,5 @@
|
|||||||
from .meteo import *
|
from .meteo import *
|
||||||
from . import wrf
|
from .wrf import *
|
||||||
from . import constants
|
from . import constants
|
||||||
from .calc import *
|
from .calc import *
|
||||||
from .interpolate import *
|
from .interpolate import *
|
||||||
|
|||||||
11
meteoinfo-lab/pylib/mipylib/meteolib/wrf/__init__.py
Normal file
11
meteoinfo-lab/pylib/mipylib/meteolib/wrf/__init__.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from destag import *
|
||||||
|
from g_slp import *
|
||||||
|
from g_rh import *
|
||||||
|
from g_pressure import *
|
||||||
|
from g_geoht import *
|
||||||
|
|
||||||
|
__all__ = destag.__all__
|
||||||
|
__all__ += g_slp.__all__
|
||||||
|
__all__ += g_rh.__all__
|
||||||
|
__all__ += g_pressure.__all__
|
||||||
|
__all__ += g_geoht.__all__
|
||||||
42
meteoinfo-lab/pylib/mipylib/meteolib/wrf/destag.py
Normal file
42
meteoinfo-lab/pylib/mipylib/meteolib/wrf/destag.py
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
|
||||||
|
__all__ = ['destagger']
|
||||||
|
|
||||||
|
def destagger(var, stagger_dim):
|
||||||
|
"""
|
||||||
|
Return the variable data array on the unstaggered grid.
|
||||||
|
|
||||||
|
This function destaggers the variable by taking the average of the
|
||||||
|
values located on either side of the grid box.
|
||||||
|
|
||||||
|
:param var: (*array*) A variable on a staggered grid.
|
||||||
|
:param stagger_dim: (*int*) The dimension index to destagger.
|
||||||
|
Negative values can be used to choose dimensions referenced
|
||||||
|
from the right hand side (-1 is the rightmost dimension).
|
||||||
|
|
||||||
|
:returns: (*array*) The destaggered variable data array.
|
||||||
|
"""
|
||||||
|
var_shape = var.shape
|
||||||
|
num_dims = var.ndim
|
||||||
|
stagger_dim_size = var_shape[stagger_dim]
|
||||||
|
# Dynamically building the range slices to create the appropriate
|
||||||
|
# number of ':'s in the array accessor lists.
|
||||||
|
# For example, for a 3D array, the calculation would be
|
||||||
|
# result = .5 * (var[:,:,0:stagger_dim_size-2]
|
||||||
|
# + var[:,:,1:stagger_dim_size-1])
|
||||||
|
# for stagger_dim=2. So, full slices would be used for dims 0 and 1, but
|
||||||
|
# dim 2 needs the special slice.
|
||||||
|
full_slice = slice(None)
|
||||||
|
slice1 = slice(0, stagger_dim_size - 1, 1)
|
||||||
|
slice2 = slice(1, stagger_dim_size, 1)
|
||||||
|
|
||||||
|
# default to full slices
|
||||||
|
dim_ranges_1 = [full_slice] * num_dims
|
||||||
|
dim_ranges_2 = [full_slice] * num_dims
|
||||||
|
|
||||||
|
# for the stagger dim, insert the appropriate slice range
|
||||||
|
dim_ranges_1[stagger_dim] = slice1
|
||||||
|
dim_ranges_2[stagger_dim] = slice2
|
||||||
|
|
||||||
|
result = .5*(var[tuple(dim_ranges_1)] + var[tuple(dim_ranges_2)])
|
||||||
|
|
||||||
|
return result
|
||||||
209
meteoinfo-lab/pylib/mipylib/meteolib/wrf/g_geoht.py
Normal file
209
meteoinfo-lab/pylib/mipylib/meteolib/wrf/g_geoht.py
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
from util import either
|
||||||
|
from destag import destagger
|
||||||
|
from .. import constants
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
__all__ = ['get_geopt', 'get_stag_geopt', 'get_height', 'get_stag_height', 'get_height_agl']
|
||||||
|
|
||||||
|
def _get_geoht(wrfin, timeidx, height=True, msl=True, stag=False):
|
||||||
|
"""Return the geopotential or geopotential height.
|
||||||
|
|
||||||
|
If *height* is False, then geopotential is returned in units of
|
||||||
|
[m2 s-2]. If *height* is True, then geopotential height is
|
||||||
|
returned in units of [m]. If *msl* is True, then geopotential height
|
||||||
|
is return as Mean Sea Level (MSL). If *msl* is False, then geopotential
|
||||||
|
height is returned as Above Ground Level (AGL).
|
||||||
|
This functions extracts the necessary variables from the NetCDF file
|
||||||
|
object in order to perform the calculation.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
wrfin (:class:`netCDF4.Dataset`, :class:`Nio.NioFile`, or an \
|
||||||
|
iterable): WRF-ARW NetCDF
|
||||||
|
data as a :class:`netCDF4.Dataset`, :class:`Nio.NioFile`
|
||||||
|
or an iterable sequence of the aforementioned types.
|
||||||
|
timeidx (:obj:`int` or :data:`wrf.ALL_TIMES`, optional): The
|
||||||
|
desired time index. This value can be a positive integer,
|
||||||
|
negative integer, or
|
||||||
|
:data:`wrf.ALL_TIMES` (an alias for None) to return
|
||||||
|
all times in the file or sequence. The default is 0.
|
||||||
|
height (:obj:`bool`, optional): Set to True to return geopotential
|
||||||
|
height instead of geopotential. Default is True.
|
||||||
|
msl (:obj:`bool`, optional): Set to True to return geopotential height
|
||||||
|
as Mean Sea Level (MSL). Set to False to return the
|
||||||
|
geopotential height as Above Ground Level (AGL) by subtracting
|
||||||
|
the terrain height. Default is True.
|
||||||
|
stag (:obj:`bool`, optional): Set to True to use the vertical
|
||||||
|
staggered grid, rather than the mass grid. Default is False.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:class:`DimArray`
|
||||||
|
"""
|
||||||
|
|
||||||
|
varname = either("PH", "GHT")(wrfin)
|
||||||
|
if varname == "PH":
|
||||||
|
ph = wrfin["PH"][timeidx]
|
||||||
|
phb = wrfin["PHB"][timeidx]
|
||||||
|
hgt = wrfin["HGT"][timeidx]
|
||||||
|
geopt = ph + phb
|
||||||
|
if not stag:
|
||||||
|
geopt_unstag = destagger(geopt, -3)
|
||||||
|
else:
|
||||||
|
geopt_unstag = geopt
|
||||||
|
else:
|
||||||
|
geopt_unstag = wrfin["GHT"][timeidx] * constants.g
|
||||||
|
hgt = wrfin["HGT_M"][timeidx]
|
||||||
|
|
||||||
|
if stag:
|
||||||
|
warnings.warn("file contains no vertically staggered geopotential "
|
||||||
|
"height variable, returning unstaggered result "
|
||||||
|
"instead")
|
||||||
|
if height:
|
||||||
|
if msl:
|
||||||
|
return geopt_unstag / constants.g
|
||||||
|
else:
|
||||||
|
# Due to broadcasting with multifile/multitime, the 2D terrain
|
||||||
|
# array needs to be reshaped to a 3D array so the right dims
|
||||||
|
# line up
|
||||||
|
new_dims = list(hgt.shape)
|
||||||
|
new_dims.insert(-2, 1)
|
||||||
|
hgt = hgt.reshape(new_dims)
|
||||||
|
|
||||||
|
return (geopt_unstag / constants.g) - hgt
|
||||||
|
else:
|
||||||
|
return geopt_unstag
|
||||||
|
|
||||||
|
def get_geopt(wrfin, timeidx=0):
|
||||||
|
"""Return the geopotential.
|
||||||
|
|
||||||
|
The geopotential is returned in units of [m2 s-2].
|
||||||
|
This functions extracts the necessary variables from the NetCDF file
|
||||||
|
object in order to perform the calculation.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
wrfin (:class:`netCDF4.Dataset`, :class:`Nio.NioFile`, or an \
|
||||||
|
iterable): WRF-ARW NetCDF
|
||||||
|
data as a :class:`netCDF4.Dataset`, :class:`Nio.NioFile`
|
||||||
|
or an iterable sequence of the aforementioned types.
|
||||||
|
timeidx (:obj:`int` or :data:`wrf.ALL_TIMES`, optional): The
|
||||||
|
desired time index. This value can be a positive integer,
|
||||||
|
negative integer, or
|
||||||
|
:data:`wrf.ALL_TIMES` (an alias for None) to return
|
||||||
|
all times in the file or sequence. The default is 0.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:class:`DimArray`
|
||||||
|
"""
|
||||||
|
return _get_geoht(wrfin, timeidx, False, True)
|
||||||
|
|
||||||
|
def get_height(wrfin, timeidx=0, msl=True):
|
||||||
|
"""Return the geopotential height.
|
||||||
|
|
||||||
|
If *msl* is True, then geopotential height is returned as Mean Sea Level
|
||||||
|
(MSL). If *msl* is False, then geopotential height is returned as
|
||||||
|
Above Ground Level (AGL) by subtracting the terrain height.
|
||||||
|
This functions extracts the necessary variables from the NetCDF file
|
||||||
|
object in order to perform the calculation.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
wrfin (:class:`netCDF4.Dataset`, :class:`Nio.NioFile`, or an \
|
||||||
|
iterable): WRF-ARW NetCDF
|
||||||
|
data as a :class:`netCDF4.Dataset`, :class:`Nio.NioFile`
|
||||||
|
or an iterable sequence of the aforementioned types.
|
||||||
|
timeidx (:obj:`int` or :data:`wrf.ALL_TIMES`, optional): The
|
||||||
|
desired time index. This value can be a positive integer,
|
||||||
|
negative integer, or
|
||||||
|
:data:`wrf.ALL_TIMES` (an alias for None) to return
|
||||||
|
all times in the file or sequence. The default is 0.
|
||||||
|
msl (:obj:`bool`, optional): Set to True to return geopotential height
|
||||||
|
as Mean Sea Level (MSL). Set to False to return the
|
||||||
|
geopotential height as Above Ground Level (AGL) by subtracting
|
||||||
|
the terrain height. Default is True.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:class:`DimArray` or :class:`numpy.ndarray`: The
|
||||||
|
geopotential height (m).
|
||||||
|
"""
|
||||||
|
return _get_geoht(wrfin, timeidx, True, msl)
|
||||||
|
|
||||||
|
def get_stag_geopt(wrfin, timeidx=0):
|
||||||
|
"""Return the geopotential for the vertically staggered grid.
|
||||||
|
|
||||||
|
The geopotential is returned in units of [m2 s-2].
|
||||||
|
This functions extracts the necessary variables from the NetCDF file
|
||||||
|
object in order to perform the calculation.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
wrfin (:class:`netCDF4.Dataset`, :class:`Nio.NioFile`, or an \
|
||||||
|
iterable): WRF-ARW NetCDF
|
||||||
|
data as a :class:`netCDF4.Dataset`, :class:`Nio.NioFile`
|
||||||
|
or an iterable sequence of the aforementioned types.
|
||||||
|
timeidx (:obj:`int` or :data:`wrf.ALL_TIMES`, optional): The
|
||||||
|
desired time index. This value can be a positive integer,
|
||||||
|
negative integer, or
|
||||||
|
:data:`wrf.ALL_TIMES` (an alias for None) to return
|
||||||
|
all times in the file or sequence. The default is 0.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:class:`DimArray` or :class:`numpy.ndarray`: The
|
||||||
|
geopotential (m).
|
||||||
|
"""
|
||||||
|
return _get_geoht(wrfin, timeidx, False, True, stag=True)
|
||||||
|
|
||||||
|
|
||||||
|
def get_stag_height(wrfin, timeidx=0, msl=True):
|
||||||
|
"""Return the geopotential height for the vertically staggered grid.
|
||||||
|
|
||||||
|
If *msl* is True, then geopotential height is returned as Mean Sea Level
|
||||||
|
(MSL). If *msl* is False, then geopotential height is returned as
|
||||||
|
Above Ground Level (AGL) by subtracting the terrain height.
|
||||||
|
This functions extracts the necessary variables from the NetCDF file
|
||||||
|
object in order to perform the calculation.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
wrfin (:class:`netCDF4.Dataset`, :class:`Nio.NioFile`, or an \
|
||||||
|
iterable): WRF-ARW NetCDF
|
||||||
|
data as a :class:`netCDF4.Dataset`, :class:`Nio.NioFile`
|
||||||
|
or an iterable sequence of the aforementioned types.
|
||||||
|
timeidx (:obj:`int` or :data:`wrf.ALL_TIMES`, optional): The
|
||||||
|
desired time index. This value can be a positive integer,
|
||||||
|
negative integer, or
|
||||||
|
:data:`wrf.ALL_TIMES` (an alias for None) to return
|
||||||
|
all times in the file or sequence. The default is 0.
|
||||||
|
msl (:obj:`bool`, optional): Set to True to return geopotential height
|
||||||
|
as Mean Sea Level (MSL). Set to False to return the
|
||||||
|
geopotential height as Above Ground Level (AGL) by subtracting
|
||||||
|
the terrain height. Default is True.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:class:`DimArray` or :class:`numpy.ndarray`: The
|
||||||
|
geopotential height (m).
|
||||||
|
"""
|
||||||
|
|
||||||
|
return _get_geoht(wrfin, timeidx, True, msl, stag=True)
|
||||||
|
|
||||||
|
|
||||||
|
def get_height_agl(wrfin, timeidx=0):
|
||||||
|
"""Return the geopotential height (AGL).
|
||||||
|
|
||||||
|
The geopotential height is returned as Above Ground Level (AGL) by
|
||||||
|
subtracting the terrain height.
|
||||||
|
This functions extracts the necessary variables from the NetCDF file
|
||||||
|
object in order to perform the calculation.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
wrfin (:class:`netCDF4.Dataset`, :class:`Nio.NioFile`, or an \
|
||||||
|
iterable): WRF-ARW NetCDF
|
||||||
|
data as a :class:`netCDF4.Dataset`, :class:`Nio.NioFile`
|
||||||
|
or an iterable sequence of the aforementioned types.
|
||||||
|
timeidx (:obj:`int` or :data:`wrf.ALL_TIMES`, optional): The
|
||||||
|
desired time index. This value can be a positive integer,
|
||||||
|
negative integer, or
|
||||||
|
:data:`wrf.ALL_TIMES` (an alias for None) to return
|
||||||
|
all times in the file or sequence. The default is 0.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
:class:`DimArray` or :class:`numpy.ndarray`: The
|
||||||
|
geopotential height (m).
|
||||||
|
"""
|
||||||
|
|
||||||
|
return _get_geoht(wrfin, timeidx, True, False)
|
||||||
19
meteoinfo-lab/pylib/mipylib/meteolib/wrf/g_pressure.py
Normal file
19
meteoinfo-lab/pylib/mipylib/meteolib/wrf/g_pressure.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
__all__ = ['get_pressure']
|
||||||
|
|
||||||
|
def get_pressure(wrfin, timeidx=0):
|
||||||
|
"""
|
||||||
|
Return the pressure in the specified units.
|
||||||
|
|
||||||
|
This function extracts the necessary variables from the NetCDF file
|
||||||
|
object in order to perform the calculation.
|
||||||
|
|
||||||
|
:param wrfin: (*DimDataFile*) Data file.
|
||||||
|
:param timeidx: (*int*) Time index.
|
||||||
|
|
||||||
|
:returns: (*array*) Pressure (hPa).
|
||||||
|
"""
|
||||||
|
p = wrfin['P'][timeidx]
|
||||||
|
pb = wrfin['PB'][timeidx]
|
||||||
|
pres = (p + pb) * 0.01
|
||||||
|
|
||||||
|
return pres
|
||||||
48
meteoinfo-lab/pylib/mipylib/meteolib/wrf/g_rh.py
Normal file
48
meteoinfo-lab/pylib/mipylib/meteolib/wrf/g_rh.py
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
from .. import constants
|
||||||
|
from ..calc.thermo import relative_humidity_from_specific_humidity, temperature_from_potential_temperature
|
||||||
|
|
||||||
|
__all__ = ['get_rh', 'get_rh2m']
|
||||||
|
|
||||||
|
def get_rh(wrfin, timeidx=0):
|
||||||
|
"""
|
||||||
|
Return the relative humidity.
|
||||||
|
|
||||||
|
This functions extracts the necessary variables from the NetCDF file
|
||||||
|
object in order to perform the calculation.
|
||||||
|
|
||||||
|
:param wrfin: (*DimDataFile*) Data file.
|
||||||
|
:param timeidx: (*int*) Time index.
|
||||||
|
|
||||||
|
:returns: (*array*) Relative humidity.
|
||||||
|
"""
|
||||||
|
t = wrfin['T'][timeidx,:,:,:]
|
||||||
|
p = wrfin['P'][timeidx,:,:,:]
|
||||||
|
pb = wrfin['PB'][timeidx,:,:,:]
|
||||||
|
qvapor = wrfin['QVAPOR'][timeidx,:,:,:]
|
||||||
|
full_t = t + constants.T_BASE
|
||||||
|
full_p = p + pb
|
||||||
|
qvapor[qvapor < 0] = 0.
|
||||||
|
tk = temperature_from_potential_temperature(full_p * 0.01, full_t)
|
||||||
|
rh = relative_humidity_from_specific_humidity(full_p * 0.01, tk, qvapor)
|
||||||
|
|
||||||
|
return rh
|
||||||
|
|
||||||
|
def get_rh2m(wrfin, timeidx=0):
|
||||||
|
"""
|
||||||
|
Return the 2m relative humidity.
|
||||||
|
|
||||||
|
This functions extracts the necessary variables from the NetCDF file
|
||||||
|
object in order to perform the calculation.
|
||||||
|
|
||||||
|
:param wrfin: (*DimDataFile*) Data file.
|
||||||
|
:param timeidx: (*int*) Time index.
|
||||||
|
|
||||||
|
:returns: (*array*) Relative humidity.
|
||||||
|
"""
|
||||||
|
t2 = wrfin['T2'][timeidx,:,:]
|
||||||
|
psfc = wrfin['PSFC'][timeidx,:,:]
|
||||||
|
q2 = wrfin['Q2'][timeidx,:,:]
|
||||||
|
q2[q2 < 0] = 0.
|
||||||
|
rh = relative_humidity_from_specific_humidity(psfc * 0.01, t2, q2)
|
||||||
|
|
||||||
|
return rh
|
||||||
37
meteoinfo-lab/pylib/mipylib/meteolib/wrf/g_slp.py
Normal file
37
meteoinfo-lab/pylib/mipylib/meteolib/wrf/g_slp.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
from org.meteoinfo.math.meteo import MeteoMath
|
||||||
|
from mipylib.numeric.core import DimArray
|
||||||
|
from .. import constants
|
||||||
|
from ..calc.thermo import temperature_from_potential_temperature
|
||||||
|
from destag import destagger
|
||||||
|
|
||||||
|
__all__ = ['get_slp']
|
||||||
|
|
||||||
|
def get_slp(wrfin, timeidx=0, units='hPa'):
|
||||||
|
"""
|
||||||
|
Return the sea level pressure in the specified units.
|
||||||
|
|
||||||
|
This function extracts the necessary variables from the NetCDF file
|
||||||
|
object in order to perform the calculation.
|
||||||
|
|
||||||
|
:param wrfin: (*DimDataFile*) Data file.
|
||||||
|
:param timeidx: (*int*) Time index.
|
||||||
|
:param units: (*string*) The desired units.
|
||||||
|
|
||||||
|
:returns: (*array*) Sea level pressure.
|
||||||
|
"""
|
||||||
|
t = wrfin['T'][timeidx,:,:,:]
|
||||||
|
p = wrfin['P'][timeidx,:,:,:]
|
||||||
|
pb = wrfin['PB'][timeidx,:,:,:]
|
||||||
|
qvapor = wrfin['QVAPOR'][timeidx,:,:,:]
|
||||||
|
ph = wrfin['PH'][timeidx,:,:,:]
|
||||||
|
phb = wrfin['PHB'][timeidx,:,:,:]
|
||||||
|
full_t = t + constants.T_BASE
|
||||||
|
full_p = p + pb
|
||||||
|
qvapor[qvapor < 0] = 0.
|
||||||
|
|
||||||
|
full_ph = (ph + phb) / constants.g
|
||||||
|
destag_ph = destagger(full_ph, -3)
|
||||||
|
tk = temperature_from_potential_temperature(full_p * 0.01, full_t)
|
||||||
|
slp = MeteoMath.calSeaPrs(destag_ph._array, tk._array, full_p._array, qvapor._array)
|
||||||
|
|
||||||
|
return DimArray(slp, dims=t.dims[1:])
|
||||||
39
meteoinfo-lab/pylib/mipylib/meteolib/wrf/util.py
Normal file
39
meteoinfo-lab/pylib/mipylib/meteolib/wrf/util.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
|
||||||
|
# Helper utilities for metadata
|
||||||
|
class either(object):
|
||||||
|
"""A callable class that determines which variable is present in the
|
||||||
|
file.
|
||||||
|
|
||||||
|
This is used in situations where the same variable type has different names
|
||||||
|
depending on the type of file used. For example, in a WRF output file,
|
||||||
|
'P' is used for pressure, whereas in a met_em file, pressure is named
|
||||||
|
'PRES'.
|
||||||
|
|
||||||
|
Methods:
|
||||||
|
__call__(wrfin): Return the variable that is present in the file.
|
||||||
|
Args:
|
||||||
|
wrfin (:class:`netCDF4.Dataset`, :class:`Nio.NioFile`, or an \
|
||||||
|
iterable): WRF-ARW NetCDF
|
||||||
|
data as a :class:`netCDF4.Dataset`, :class:`Nio.NioFile`
|
||||||
|
or an iterable sequence of the aforementioned types.
|
||||||
|
Returns:
|
||||||
|
:obj:`str`: The variable name that is present in the file.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
varnames (sequence): A sequence of possible variable names.
|
||||||
|
"""
|
||||||
|
def __init__(self, *varnames):
|
||||||
|
"""Initialize an :class:`either` object.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*varnames (sequence): A sequence of possible variable names.
|
||||||
|
"""
|
||||||
|
self.varnames = varnames
|
||||||
|
|
||||||
|
def __call__(self, wrfin):
|
||||||
|
for varname in self.varnames:
|
||||||
|
if varname in wrfin.varnames:
|
||||||
|
return varname
|
||||||
|
|
||||||
|
raise ValueError("{} are not valid variable names".format(
|
||||||
|
self.varnames))
|
||||||
@ -8,7 +8,7 @@
|
|||||||
from org.meteoinfo.math.meteo import MeteoMath
|
from org.meteoinfo.math.meteo import MeteoMath
|
||||||
from mipylib.numeric.core import NDArray, DimArray
|
from mipylib.numeric.core import NDArray, DimArray
|
||||||
import constants as constants
|
import constants as constants
|
||||||
from .calc.thermo import relative_humidity_from_specific_humidity, temperature_from_potential_temperature
|
from pylib.mipylib.meteolib.calc.thermo import relative_humidity_from_specific_humidity, temperature_from_potential_temperature
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
'destagger','get_slp','get_rh','get_rh2m'
|
'destagger','get_slp','get_rh','get_rh2m'
|
||||||
Loading…
x
Reference in New Issue
Block a user