Completed
Pull Request — master (#515)
by
unknown
01:04
created

mean_pressure_weighted()   A

Complexity

Conditions 2

Size

Total Lines 48

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
c 1
b 0
f 0
dl 0
loc 48
rs 9.125
1
# Copyright (c) 2008-2017 MetPy Developers.
2
# Distributed under the terms of the BSD 3-Clause License.
3
# SPDX-License-Identifier: BSD-3-Clause
4
"""Contains calculation of various derived indices."""
5
import numpy as np
6
7
from .thermo import mixing_ratio, saturation_vapor_pressure
8
from .tools import get_layer
9
from ..constants import g, rho_l
10
from ..package_tools import Exporter
11
from ..units import check_units, units
12
13
exporter = Exporter(globals())
14
15
16
@exporter.export
17
@check_units('[temperature]', '[pressure]', '[pressure]')
18
def precipitable_water(dewpt, pressure, top=400 * units('hPa')):
19
    r"""Calculate precipitable water through the depth of a sounding.
20
21
    Default layer depth is sfc-400 hPa. Formula used is:
22
23
    .. math:: \frac{1}{pg} \int\limits_0^d x \,dp
24
25
    from [Tsonis2008]_, p. 170.
26
27
    Parameters
28
    ----------
29
    dewpt : `pint.Quantity`
30
        Atmospheric dewpoint profile
31
    pressure : `pint.Quantity`
32
        Atmospheric pressure profile
33
    top: `pint.Quantity`, optional
34
        The top of the layer, specified in pressure. Defaults to 400 hPa.
35
36
    Returns
37
    -------
38
    `pint.Quantity`
39
        The precipitable water in the layer
40
41
    """
42
    sort_inds = np.argsort(pressure[::-1])
43
    pressure = pressure[sort_inds]
44
    dewpt = dewpt[sort_inds]
45
46
    pres_layer, dewpt_layer = get_layer(pressure, dewpt, depth=pressure[0] - top)
47
48
    w = mixing_ratio(saturation_vapor_pressure(dewpt_layer), pres_layer)
49
    # Since pressure is in decreasing order, pw will be the negative of what we want.
50
    # Thus the *-1
51
    pw = -1. * (np.trapz(w.magnitude, pres_layer.magnitude) * (w.units * pres_layer.units) /
52
                (g * rho_l))
53
    return pw.to('millimeters')
54
55
56
@exporter.export
57
@check_units('[pressure]')
58
def mean_pressure_weighted(pressure, *args, **kwargs):
59
    r"""Calculate pressure-weighted mean of an arbitrary variable through a layer.
60
61
    Layer top and bottom specified in height or pressure.
62
63
    Parameters
64
    ----------
65
    pressure : `pint.Quantity`
66
        Atmospheric pressure profile
67
    *args : `pint.Quantity`
68
        Parameters for which the pressure-weighted mean is to be calculated.
69
    heights : `pint.Quantity`, optional
70
        Heights from sounding. Standard atmosphere heights assumed (if needed)
71
        if no heights are given.
72
    bottom: `pint.Quantity`, optional
73
        The bottom of the layer in either the provided height coordinate
74
        or in pressure. Don't provide in meters AGL unless the provided
75
        height coordinate is meters AGL. Default is the first observation,
76
        assumed to be the surface.
77
    depth: `pint.Quantity`, optional
78
        The depth of the layer in meters or hPa.
79
80
    Returns
81
    -------
82
    `pint.Quantity`
83
        u_mean: u-component of layer mean wind.
84
    `pint.Quantity`
85
        v_mean: v-component of layer mean wind.
86
87
    """
88
    heights = kwargs.pop('heights', None)
89
    bottom = kwargs.pop('bottom', None)
90
    depth = kwargs.pop('depth', None)
91
    ret = []  # Returned variable means in layer
92
    layer_arg = get_layer(pressure, *args, heights=heights,
93
                          bottom=bottom, depth=depth)
94
    layer_p = layer_arg[0]
95
    layer_arg = layer_arg[1:]
96
    # Taking the integral of the weights (pressure) to feed into the weighting
97
    # function. Said integral works out to this function:
98
    pres_int = 0.5 * (layer_p[-1].magnitude**2 - layer_p[0].magnitude**2)
99
    for i, datavar in enumerate(args):
100
        arg_mean = np.trapz(layer_arg[i] * layer_p, x=layer_p) / pres_int
101
        ret.append(arg_mean * datavar.units)
102
103
    return ret
104